Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / TrustUi / MS / Internal / documents / Application / RightsManagementErrorHandler.cs / 1 / RightsManagementErrorHandler.cs
//------------------------------------------------------------------------------ // //// Copyright (c) Microsoft Corporation. All rights reserved. // // // Description: // This file contains a class that handles all Rights Management errors. // // History: // 11/14/2005: [....]: Initial implementation. // //----------------------------------------------------------------------------- using System; using System.Security.RightsManagement; using System.Windows.TrustUI; namespace MS.Internal.Documents.Application { ////// Enumeration that represents the possible RM operations in which an /// error could need to be handled. This is useful to display the proper UI /// for each situation. /// internal enum RightsManagementOperation : int { ////// Initializing the RM system /// Initialize, ////// Opening (decrypting) an RM-protected document /// Decrypt, ////// Activating a passport account for RM /// PassportActivation, ////// Loading or signing using a template /// TemplateAccess, ////// Other (non-critical) operation /// Other, } ////// Handles all Rights Management subsystem errors and displays correct /// error messages as necessary. /// internal static class RightsManagementErrorHandler { #region Internal Methods //----------------------------------------------------- // Internal Methods //----------------------------------------------------- ////// Handles the given exception if possible, showing the correct UI if /// necessary. If the operation is a critical one (i.e. the /// application cannot continue without performing the operation) and /// the exception cannot be handled cleanly, the method rethrows an /// appropriate exception. /// /// The operation being performed /// The exception to try to handle ///Whether or not the exception was handled internal static bool HandleOrRethrowException( RightsManagementOperation operation, Exception exception) { if (exception == null) { throw new ArgumentNullException("exception"); } Trace.SafeWrite( Trace.Rights, "ErrorHandler: Hit exception:\n{0}", exception); bool askUser = false; bool fatal = true; string message = ParseException( operation, exception, out askUser, out fatal); // If no message for a message box is provided if (string.IsNullOrEmpty(message)) { // If the exception won't be rethrown, show a generic error // message; otherwise it is something we don't know how to // handle, and we will let it kill the application if (!fatal || !IsCriticalOperation(operation)) { System.Windows.MessageBox.Show( SR.Get(SRID.RightsManagementWarnErrorGenericFailure), SR.Get(SRID.RightsManagementWarnErrorTitle), System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning); } } // If there is a message provided and the user gets to decide the // correct course of action else if (askUser) { // Show a message box to ask the user System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show( message, SR.Get(SRID.RightsManagementWarnErrorTitle), System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Warning); // Consider the error fatal if the user declined the mitigation // offered in the message box fatal = fatal && (result != System.Windows.MessageBoxResult.Yes); } // If there is a message provided, but the user has no choice else { // Display the error message box System.Windows.MessageBox.Show( message, SR.Get(SRID.RightsManagementWarnErrorTitle), System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning); } // If the exception is fatal and the operation is critical, we // should throw an XPS Viewer exception to be handled higher up // the stack if (fatal && IsCriticalOperation(operation)) { Trace.SafeWrite( Trace.Rights, "ErrorHandler: Could not handle exception. Rethrowing."); throw new XpsViewerException( SR.Get(SRID.XpsViewerRightsManagementException), exception); } Trace.SafeWrite( Trace.Rights, "ErrorHandler: Handled exception."); return !fatal; } #endregion Internal Methods #region Private Methods //------------------------------------------------------ // Private Methods //----------------------------------------------------- ////// Checks whether or not the given operation is a critical one. A /// critical operation is defined as an operation which should stop the /// application if it does not complete cleanly. /// /// The operation to check ///private static bool IsCriticalOperation( RightsManagementOperation operation) { // The only non-critical operation is the generic "other" operation return operation != RightsManagementOperation.Other; } /// /// Gets the appropriate error message corresponding to an exception /// and detects whether the failure is fatal to the current operation /// (i.e. the user cannot take any action to circumvent the failure). /// If the user should be given the option to take action to circumvent /// the failure, true will be returned as the askUser parameter. If the /// user declines to take action, the exception is fatal if the fatal /// parameter is true. This function basically dispatches exceptions to /// a more specific ParseException function. /// /// The current operation /// The exception to parse /// Whether or not the user should be given a /// choice to take action to prevent the failure /// Whether or not the failure represented is fatal /// ///A user-friendly message corresponding to the exception /// private static string ParseException( RightsManagementOperation operation, Exception exception, out bool askUser, out bool fatal) { askUser = false; fatal = true; // Filter out Template related errors, as they all should receive an // "Invalid Template" type of message. if (operation == RightsManagementOperation.TemplateAccess) { return ParseTemplateExceptions( exception, out askUser, out fatal); } // Each handled type of exception has a different handler function else if (exception is RightsManagementException) { return ParseRightsManagementException( operation, (RightsManagementException)exception, out askUser, out fatal); } // Any other exception is unknown, so there is no message string // and it is assumed to be fatal else { return null; } } ////// Determines the error that has happened, and the appropriate /// message to display. /// /// The current operation /// The exception to parse /// Whether or not the user should be given a /// choice to take action to prevent the failure /// Whether or not the failure represented is fatal /// ///A user-friendly message corresponding to the exception /// private static string ParseTemplateExceptions( Exception exception, out bool askUser, out bool fatal) { SRID result = SRID.Default; // Most errors with applying templates should be user prompts, so // set the default askUser and fatal this way. askUser = false; fatal = false; // Check the exception type to determine the appropriate message and action if ((exception is RightsManagementException) || // FileFormatException added to handle the case when the template // file loaded fine, but was empty. In this case we'd rather show // an invalid template message, since it's not file related, but // content related. (exception is System.IO.FileFormatException)) { result = SRID.RightsManagementWarnErrorInvalidTemplate; } // These remaining exception types are related to File I/O, all of which // should be handled with an error message and fail the signing process. // They should not crash the application. else if ((exception is ArgumentException) || (exception is ArgumentNullException) || (exception is System.Security.SecurityException) || (exception is NotSupportedException) || (exception is System.IO.PathTooLongException) || (exception is System.IO.IOException) || (exception is UnauthorizedAccessException) || (exception is System.IO.FileNotFoundException) || (exception is System.IO.DirectoryNotFoundException)) { result = SRID.RightsManagementWarnErrorFailedToLoadTemplate; } else { fatal = true; } if (result.Equals(SRID.Default)) { return null; } else { return SR.Get(result); } } ////// Gets the error message corresponding to a Rights Management /// exception and detects whether it is fatal and whether the user /// should be offered a mitigation. This is a specialized version of /// the ParseException function. /// /// The current operation /// The exception to parse /// Whether or not the user should be given a /// choice to take action to prevent the failure /// Whether or not the failure represented is fatal /// ///A user-friendly message corresponding to the exception /// private static string ParseRightsManagementException( RightsManagementOperation operation, RightsManagementException rmException, out bool askUser, out bool fatal) { askUser = false; fatal = true; RightsManagementFailureCode failureCode = rmException.FailureCode; SRID result = SRID.Default; switch (failureCode) { case RightsManagementFailureCode.InvalidLicense: if (operation == RightsManagementOperation.TemplateAccess) { result = SRID.RightsManagementWarnErrorInvalidTemplate; } else { result = SRID.RightsManagementWarnErrorConfigurationError; } break; case RightsManagementFailureCode.InvalidLicenseSignature: if (operation == RightsManagementOperation.Initialize) { result = SRID.RightsManagementWarnErrorConfigurationError; } else { result = SRID.RightsManagementWarnErrorInvalidContent; } break; case RightsManagementFailureCode.RightNotGranted: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.InvalidVersion: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.ClockRollbackDetected: result = SRID.RightsManagementWarnErrorClockModified; break; case RightsManagementFailureCode.BindValidityTimeViolated: result = SRID.RightsManagementWarnErrorExpiredPermission; break; case RightsManagementFailureCode.BrokenCertChain: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.BindPolicyViolation: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.ManifestPolicyViolation: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.BindRevokedLicense: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindRevokedIssuer: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindRevokedPrincipal: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindRevokedResource: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindRevokedModule: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.BindAccessUnsatisfied: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindMachineNotFoundInGroupIdentity: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.BindRevocationListStale: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.BindNoApplicableRevocationList: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.LicenseAcquisitionFailed: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.NoDistributionPointUrlFound: result = SRID.RightsManagementWarnErrorInvalidContent; break; case RightsManagementFailureCode.NoConnect: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.ActivationFailed: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.Aborted: fatal = (operation != RightsManagementOperation.PassportActivation); break; case RightsManagementFailureCode.OutOfQuota: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.AuthenticationFailed: fatal = false; break; case RightsManagementFailureCode.ServerError: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.HidCorrupted: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.InvalidServerResponse: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.ServiceNotFound: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.UseDefault: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.ServerNotFound: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.InvalidEmail: fatal = false; break; case RightsManagementFailureCode.ValidityTimeViolation: result = SRID.RightsManagementWarnErrorExpiredPermission; break; case RightsManagementFailureCode.OutdatedModule: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.ServiceMoved: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.ServiceGone: result = SRID.RightsManagementWarnErrorServerError; break; case RightsManagementFailureCode.AdEntryNotFound: fatal = false; break; case RightsManagementFailureCode.NotAChain: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.RequestDenied: result = SRID.RightsManagementWarnErrorTemporaryActivationNotSupported; fatal = false; break; case RightsManagementFailureCode.LicenseBindingToWindowsIdentityFailed: result = SRID.RightsManagementWarnErrorNoPermission; askUser = true; break; case RightsManagementFailureCode.InvalidIssuanceLicenseTemplate: result = SRID.RightsManagementWarnErrorInvalidTemplate; fatal = false; break; case RightsManagementFailureCode.ExpiredOfficialIssuanceLicenseTemplate: result = SRID.RightsManagementWarnErrorInvalidTemplate; fatal = false; break; case RightsManagementFailureCode.InvalidClientLicensorCertificate: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.HidInvalid: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.EmailNotVerified: fatal = false; break; case RightsManagementFailureCode.DebuggerDetected: result = SRID.RightsManagementWarnErrorDebuggerDetected; break; case RightsManagementFailureCode.InvalidLockboxType: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.InvalidLockboxPath: result = SRID.RightsManagementWarnErrorConfigurationError; break; case RightsManagementFailureCode.NoAesCryptoProvider: result = SRID.RightsManagementWarnErrorConfigurationError; break; default: return null; } if (result.Equals(SRID.Default)) { return null; } else { return SR.Get(result); } } #endregion Private Methods } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UnsafeNativeMethods.cs
- HtmlAnchor.cs
- WebPartTransformer.cs
- AttachmentService.cs
- SecurityHeaderTokenResolver.cs
- FieldTemplateUserControl.cs
- DataObject.cs
- SiteMapProvider.cs
- XmlNodeList.cs
- SortKey.cs
- ValidationRuleCollection.cs
- RootDesignerSerializerAttribute.cs
- UnsettableComboBox.cs
- _NegotiateClient.cs
- WebPartConnectVerb.cs
- ListBoxAutomationPeer.cs
- objectresult_tresulttype.cs
- ReflectionServiceProvider.cs
- MissingMethodException.cs
- ObjectSecurity.cs
- DisplayToken.cs
- ImageAnimator.cs
- DataControlCommands.cs
- StringFreezingAttribute.cs
- DataExchangeServiceBinder.cs
- DataServiceHostFactory.cs
- X509ServiceCertificateAuthentication.cs
- StylusEventArgs.cs
- QualificationDataAttribute.cs
- DataGridToolTip.cs
- PropertySegmentSerializer.cs
- PrimitiveXmlSerializers.cs
- FrameDimension.cs
- CLRBindingWorker.cs
- ElementUtil.cs
- ExpanderAutomationPeer.cs
- XmlSchemaCollection.cs
- SQLInt64Storage.cs
- NavigationHelper.cs
- SqlCrossApplyToCrossJoin.cs
- _SecureChannel.cs
- XmlSchemaInclude.cs
- VectorAnimationBase.cs
- TransformValueSerializer.cs
- WsatTransactionInfo.cs
- ObjectManager.cs
- TraceShell.cs
- CompiledRegexRunnerFactory.cs
- FilterQuery.cs
- SpeechSeg.cs
- HtmlTableCell.cs
- ProgressBar.cs
- HttpStaticObjectsCollectionWrapper.cs
- Configuration.cs
- TitleStyle.cs
- PictureBox.cs
- DependencyObjectType.cs
- COM2ComponentEditor.cs
- EmbossBitmapEffect.cs
- TargetControlTypeCache.cs
- GenericUriParser.cs
- Cursor.cs
- DefinitionProperties.cs
- DocumentStream.cs
- CanonicalFontFamilyReference.cs
- DbSetClause.cs
- AdPostCacheSubstitution.cs
- WorkflowMarkupSerializationException.cs
- TraceHandlerErrorFormatter.cs
- ResizeGrip.cs
- base64Transforms.cs
- References.cs
- ChannelAcceptor.cs
- WorkItem.cs
- WrappedReader.cs
- MemberDomainMap.cs
- InfoCardKeyedHashAlgorithm.cs
- MenuItemStyleCollection.cs
- SpecularMaterial.cs
- WinFormsUtils.cs
- CodeCatchClause.cs
- Helper.cs
- CheckBox.cs
- TemplateBindingExtensionConverter.cs
- XmlChildEnumerator.cs
- ValidatingReaderNodeData.cs
- CircleHotSpot.cs
- ServiceEndpointElement.cs
- TableLayoutPanel.cs
- TableCell.cs
- ChannelDispatcherCollection.cs
- DialogResultConverter.cs
- NativeMethods.cs
- TextTrailingCharacterEllipsis.cs
- DecimalStorage.cs
- EncryptedXml.cs
- IntPtr.cs
- Label.cs
- UntrustedRecipientException.cs
- DataFormat.cs