Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / TrustUi / MS / Internal / documents / Application / DocumentProperties.cs / 1 / DocumentProperties.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: This is a wrapper for DocumentPropertiesDialog, which caches the values which // are displayed in the Dialog, and controls security access. // // History: // 08/31/2005 - [....] created. // //--------------------------------------------------------------------------- using MS.Internal.PresentationUI; // For CriticalDataForSet using System; using System.Drawing; using System.Globalization; using System.IO; using System.IO.Packaging; // For Package using System.Security; // For CriticalData using System.Security.Permissions; // For asserts using System.Windows.TrustUI; // For string resources using System.Windows.Xps.Packaging; // For XpsDocument namespace MS.Internal.Documents.Application { ////// Singleton wrapper class for the DocumentPropertiesDialog. /// [FriendAccessAllowed] internal sealed class DocumentProperties { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Constructs the DocumentProperties class. /// /// ////// Critical /// 1) Sets the _uri which is critical. /// [SecurityCritical] private DocumentProperties(Uri uri) { if (uri == null) { throw new ArgumentNullException("uri"); } _uri = new SecurityCriticalData(uri); } #endregion Constructors //------------------------------------------------------ // // Internal Properties // //----------------------------------------------------- #region Internal Properties /// /// Current package CoreProperties /// internal PackageProperties CoreProperties { get { // multiple returns are bad, however allocating another local // simply to return is worse // also we can not cache this decision because the values // may change when RM is on / off if (_rmProperties != null) { return _rmProperties; } else { return _xpsProperties; } } } ////// Gets the current singleton instance of DocumentProperties. /// internal static DocumentProperties Current { get { return _current; } } ////// Image representing an XPS Document /// internal Image Image { get { return _image; } set { _image = value; } } ////// Filename of the package. /// ////// Critical /// 1) Determined from the URI which is considered critical. /// internal string Filename { [SecurityCritical] get { if (_filename == null && _uri.Value != null) { _filename = Path.GetFileName(_uri.Value.LocalPath); } return _filename; } } ////// Size of the package. /// ////// Critical /// 1) Requires FileIO to be performed on the package to determine /// this value. /// internal long FileSize { [SecurityCritical] get { long fileSize = 0; if (IsFileInfoValid) { fileSize = _fileInfo.Length; } return fileSize; } } ////// Date package was created. /// ////// Critical /// 1) Requires FileIO to be performed on the package to determine /// this value. /// internal DateTime? FileCreated { [SecurityCritical] get { DateTime? fileCreated = null; if (IsFileInfoValid) { fileCreated = _fileInfo.CreationTime; } return fileCreated; } } ////// Date package was last modified. /// ////// Critical /// 1) Requires FileIO to be performed on the package to determine /// this value. /// internal DateTime? FileModified { [SecurityCritical] get { DateTime? fileModified = null; if (IsFileInfoValid) { fileModified = _fileInfo.LastWriteTime; } return fileModified; } } ////// Date package was last accessed. /// ////// Critical /// 1) Requires FileIO to be performed on the package to determine /// this value. /// internal DateTime? FileAccessed { [SecurityCritical] get { DateTime? fileAccessed = null; if (IsFileInfoValid) { fileAccessed = _fileInfo.LastAccessTime; } return fileAccessed; } } #endregion Internal Properties //------------------------------------------------------ // // Internal Methods // //------------------------------------------------------ #region Internal Methods ////// This method copies members from one PackageProperties object to another. /// ////// This design is very fragile as if new properties are added by PackageProperties /// we will quietly lose data. An improved implementation would be to have /// PackageProperties implement this behavior or have a KeyValue pair exposed /// that we would iterate through and copy. /// ////// Critical /// 1) source or target may be UmcSuppressedProperties with all /// critical members /// [SecurityCritical] internal static void Copy(PackageProperties source, PackageProperties target) { target.Category = source.Category; target.ContentStatus = source.ContentStatus; target.ContentType = source.ContentType; target.Created = source.Created; target.Creator = source.Creator; target.Description = source.Description; target.Identifier = source.Identifier; target.Keywords = source.Keywords; target.Language = source.Language; target.LastModifiedBy = source.LastModifiedBy; target.LastPrinted = source.LastPrinted; target.Modified = source.Modified; target.Revision = source.Revision; target.Subject = source.Subject; target.Title = source.Title; target.Version = source.Version; } ////// Constructs and Initializes the static 'Current' DocumentProperties object which /// is the singleton instance. /// /// The URI for the package. ////// Critical /// 1) Constructs a new DocumentProperties object using the URI passed in. /// [SecurityCritical] internal static void InitializeCurrentDocumentProperties(Uri uri) { // Ensure that DocumentProperties has not been constructed yet, and initialize a // new instance. System.Diagnostics.Debug.Assert( Current == null, "DocumentProperties initialized twice."); if (Current == null) { _current = new DocumentProperties(uri); } } internal void SetXpsProperties(PackageProperties properties) { _xpsProperties = properties; } internal void SetRightsManagedProperties(PackageProperties properties) { _rmProperties = properties; } ////// Confirms whether the XPS properties exactly match the RM properties /// for purposes of determining whether the OPC properties have been changed /// in violation of signing policy. /// ////// This will return true if the properties match /// or there are no RM properties in the package, /// otherwise it will return false. /// [SecurityCritical, SecurityTreatAsSafe] internal bool VerifyPropertiesUnchanged() { if (_xpsProperties == null ) { return false; } if (_rmProperties == null) { return true; } return (String.Equals(_xpsProperties.Category, _rmProperties.Category, StringComparison.Ordinal) && String.Equals(_xpsProperties.ContentStatus, _rmProperties.ContentStatus, StringComparison.Ordinal) && String.Equals(_xpsProperties.ContentType, _rmProperties.ContentType, StringComparison.Ordinal) && String.Equals(_xpsProperties.Creator, _rmProperties.Creator, StringComparison.Ordinal) && String.Equals(_xpsProperties.Description, _rmProperties.Description, StringComparison.Ordinal) && String.Equals(_xpsProperties.Identifier, _rmProperties.Identifier, StringComparison.Ordinal) && String.Equals(_xpsProperties.Keywords, _rmProperties.Keywords, StringComparison.Ordinal) && String.Equals(_xpsProperties.Language, _rmProperties.Language, StringComparison.Ordinal) && String.Equals(_xpsProperties.LastModifiedBy, _rmProperties.LastModifiedBy, StringComparison.Ordinal) && String.Equals(_xpsProperties.Revision, _rmProperties.Revision, StringComparison.Ordinal) && String.Equals(_xpsProperties.Subject, _rmProperties.Subject, StringComparison.Ordinal) && String.Equals(_xpsProperties.Title, _rmProperties.Title, StringComparison.Ordinal) && String.Equals(_xpsProperties.Version, _rmProperties.Version, StringComparison.Ordinal) && _xpsProperties.Created == _rmProperties.Created && _xpsProperties.LastPrinted == _rmProperties.LastPrinted && _xpsProperties.Modified == _rmProperties.Modified); } ////// Critical /// 1) This method is critical for change tracking purposes (per PT review) /// since it is used to determine validity of signatures, which is a /// critical operation. /// TreatAsSafe /// 1) We are marking this critical only for change tracking purposes. /// ////// ShowDialog: Displays the DocumentProperties dialog. /// ////// Critical /// 1) Checks critical member _fileInfo for null and calls the Refresh /// method on it. /// 2) Elevation to show a top level window. /// TreatAsSafe /// 1) None of the data from the _fileInfo is read or leaked. /// 2) The window is a blessed internal window that uses purely Windows Forms rather than Avalon. /// [SecurityCritical, SecurityTreatAsSafe] internal void ShowDialog() { // Setup the dialog data once and cache it for future calls. if (!_isDataAcquired) { AcquireData(); _isDataAcquired = true; } // Refresh file information before showing the dialog. if (_fileInfo != null) { // We intentionally `swallow exceptions here, since any failure // will make _fileInfo invalid as determined by the property // IsFileInfoValid. We also don't set _fileInfo to null so that // we can call Refresh again. This is useful since the file may // be inaccessible now but come back later. try { _fileInfo.Refresh(); } catch (ArgumentException) { } catch (IOException) { } } DocumentPropertiesDialog dialog = null; // Assert for UIPermission to spawn dialog (new UIPermission(UIPermissionWindow.AllWindows)).Assert(); //BlessedAssert try { dialog = new DocumentPropertiesDialog(); dialog.ShowDialog(); } finally { UIPermission.RevertAssert(); if (dialog != null) { dialog.Dispose(); } } } #endregion Internal Methods //----------------------------------------------------- // // Private Methods // //------------------------------------------------------ #region Private Methods ////// AcquireData: Setup the URI related data for the dialog. /// ////// Critical /// 1) Elevation to acquire local file information (FileInfo). /// 2) Accesses _uri. /// 3) Sets critical _fileInfo member. /// TreatAsSafe /// 1) The assert is only done for local files, using the URI which is /// marked critical. /// 2) Does not leak _uri. /// 3) Data for critical members is derived from critical data using /// trusted classes. /// [SecurityCritical, SecurityTreatAsSafe] private void AcquireData() { // Ensure URI exists. if (_uri.Value == null) { return; } // Determine if the URI represents a file if (_uri.Value.IsFile) { // Determine the full path and assert for file permission string filePath = _uri.Value.LocalPath; FileInfo fileInfo = null; (new FileIOPermission( FileIOPermissionAccess.Read, filePath)).Assert(); //BlessedAssert try { // Get the FileInfo for the current file fileInfo = new FileInfo(filePath); } finally { FileIOPermission.RevertAssert(); } // Check that FileInfo is valid, and save it. if (fileInfo.Exists) { _fileInfo = fileInfo; } } } #endregion Private Methods //----------------------------------------------------- // // Private Properties // //----------------------------------------------------- #region Private Properties ////// True if the stored FileInfo is valid and can be used to determine /// file properties. /// ////// If the file has become completely inaccessible (i.e. the drive has /// been disconnected, the UNC path is unreachable, etc.), according to /// MSDN the Refresh call should throw an ArgumentException or /// IOException. In reality it doesn't appear to ever throw. Instead, /// if Refresh fails, any future calls to _fileInfo.Exists return /// false. Accessing any of the file information properties at that /// point throws an exception. As a result, if _fileInfo.Refresh() /// fails, we can leave _fileInfo as is and simply check /// _fileInfo.Exists before accessing it. /// ////// Critical /// 1) Accesses critical member _fileInfo /// TreatAsSafe /// 1) No critical data is leaked. /// private bool IsFileInfoValid { [SecurityCritical, SecurityTreatAsSafe] get { return ((_fileInfo != null) && (_fileInfo.Exists)); } } #endregion Private Properties //----------------------------------------------------- // // Private Fields // // These must be checked for null prior to use. If available, use the CLR properties // above before these. // //------------------------------------------------------ #region Private Fields private static DocumentProperties _current = null; ////// Critical /// 1) This is critical for set since it is used to determine the filename /// which is opened to acquire the FileInfo object. /// 2) This is critical for get since it can leak file system info. /// private SecurityCriticalData_uri; /// /// The properties in the XpsPackage (OPC). /// private PackageProperties _xpsProperties = null; ////// The properties for RightsManaged encrypted packages (OLE). /// private PackageProperties _rmProperties = null; private bool _isDataAcquired; private Image _image = null; ////// Critical /// 1) Determined from the critical URI. /// [SecurityCritical] private string _filename = null; ////// Critical /// 1) Requires FileIO to be performed on the package to determine /// this value. /// [SecurityCritical] private FileInfo _fileInfo; #endregion Private Fields } } // 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
- SqlNotificationRequest.cs
- XmlAttributeCollection.cs
- HtmlSelect.cs
- MetadataSerializer.cs
- WebPartCloseVerb.cs
- HtmlTable.cs
- DesignerDataConnection.cs
- Stopwatch.cs
- querybuilder.cs
- ApplicationFileParser.cs
- TypeConverters.cs
- MenuItemCollection.cs
- QuaternionAnimationBase.cs
- AssemblyName.cs
- Rotation3DAnimationUsingKeyFrames.cs
- DateTimeValueSerializer.cs
- FunctionQuery.cs
- ECDiffieHellmanCngPublicKey.cs
- ToolStripPanelRow.cs
- PartitionerStatic.cs
- FormsAuthenticationConfiguration.cs
- WebPartDisplayModeCancelEventArgs.cs
- WebReferenceOptions.cs
- TextFormatter.cs
- FileResponseElement.cs
- BoundPropertyEntry.cs
- PrefixQName.cs
- ObjectStateFormatter.cs
- ItemAutomationPeer.cs
- ComboBoxRenderer.cs
- SqlCacheDependencyDatabaseCollection.cs
- ADMembershipProvider.cs
- BitmapCodecInfo.cs
- ActivityWithResultWrapper.cs
- HttpPostedFileBase.cs
- NegatedConstant.cs
- BitmapEffectDrawing.cs
- HostingEnvironmentWrapper.cs
- CanonicalFontFamilyReference.cs
- TextRangeSerialization.cs
- JumpList.cs
- JapaneseLunisolarCalendar.cs
- BlockCollection.cs
- FormViewDeleteEventArgs.cs
- WindowsAltTab.cs
- TextFormatterImp.cs
- ClearCollection.cs
- MessageQueueCriteria.cs
- CompModSwitches.cs
- IgnoreFileBuildProvider.cs
- HttpHandlersSection.cs
- Effect.cs
- CompModSwitches.cs
- SqlDataSourceAdvancedOptionsForm.cs
- PointIndependentAnimationStorage.cs
- NullableIntMinMaxAggregationOperator.cs
- DataGridViewCellStateChangedEventArgs.cs
- ErrorTableItemStyle.cs
- AsmxEndpointPickerExtension.cs
- SelectorItemAutomationPeer.cs
- TextDecoration.cs
- ContainerSelectorActiveEvent.cs
- ActivityExecutor.cs
- DynamicResourceExtension.cs
- BitmapImage.cs
- DetailsViewActionList.cs
- SkipQueryOptionExpression.cs
- ConstNode.cs
- WaitHandle.cs
- CapiSafeHandles.cs
- ShaderEffect.cs
- DataGridViewCellMouseEventArgs.cs
- TextDpi.cs
- ItemCollection.cs
- SoapAttributes.cs
- WinFormsUtils.cs
- ColorIndependentAnimationStorage.cs
- BamlMapTable.cs
- WebGetAttribute.cs
- PerformanceCounterPermissionEntry.cs
- WebPartAuthorizationEventArgs.cs
- Token.cs
- configsystem.cs
- ShapingEngine.cs
- NativeWrapper.cs
- ExpressionLexer.cs
- PKCS1MaskGenerationMethod.cs
- GraphicsContext.cs
- XPathItem.cs
- HostProtectionException.cs
- IndexedGlyphRun.cs
- DbgCompiler.cs
- Parameter.cs
- Compilation.cs
- CodeThrowExceptionStatement.cs
- OciHandle.cs
- SelfIssuedAuthRSACryptoProvider.cs
- ToolStripItemRenderEventArgs.cs
- ClientTargetSection.cs
- EncodingStreamWrapper.cs