File: Shared\MS\Internal\SecurityCriticalDataForSet.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//---------------------------------------------------------------------------
//
// <copyright file="SecurityCriticalDataForSet.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
// 
// Description:
//              This is a helper class to facilate the storage of data that's Critical for set.
//              The data itself is not information disclosure but the value controls a critical
//              operation.
//
//              For example a filepath variable might control what part of the file system the
//              code gets access to.
//
// History:
//  01/30/05 : Microsoft Created. 
//
//---------------------------------------------------------------------------
using System ; 
using System.Security ;
 
#if WINDOWS_BASE
    using MS.Internal.WindowsBase;
#elif PRESENTATION_CORE
    using MS.Internal.PresentationCore;
#elif PRESENTATIONFRAMEWORK
    using MS.Internal.PresentationFramework;
#elif PRESENTATIONUI
    using MS.Internal.PresentationUI;
#elif UIAUTOMATIONTYPES
    using MS.Internal.UIAutomationTypes;
#elif DRT
    using MS.Internal.Drt;
#elif SYSTEM_XAML
    using MS.Internal.WindowsBase;
#else
#error Attempt to use FriendAccessAllowedAttribute from an unknown assembly.
using MS.Internal.YourAssemblyName;
#endif
 
#if SYSTEM_XAML
namespace MS.Internal.Xaml
#else
namespace MS.Internal
#endif
{
    [FriendAccessAllowed] // Built into Base, also used by Core and Framework.
    [Serializable]
    internal struct SecurityCriticalDataForSet<T>
    {
        /// <SecurityNote>
        ///    Critical - "by definition" - this class is intended only for data that's
        ///               Critical for setting.
        /// </SecurityNote>
        [SecurityCritical]
        internal SecurityCriticalDataForSet(T value)
        { 
            _value = value; 
        }
 
        /// <SecurityNote>
        ///    Critical - Setter is Critical "by definition" - this class is intended only
        ///               for data that's Critical for setting.
        ///     Safe - get is safe by definition.
        ///     Not Safe - set is not safe by definition.
        /// </SecurityNote>
        internal T Value 
        {
        #if DEBUG
            [System.Diagnostics.DebuggerStepThrough]
        #endif
            [SecurityCritical, SecurityTreatAsSafe]
            get
            {
                return _value;
            }
 
        #if DEBUG
            [System.Diagnostics.DebuggerStepThrough]
        #endif
            [SecurityCritical]
            set
            {
                _value = value;
            }
        }
 
        /// <SecurityNote>
        /// Critical - by definition as this data is Critical for set.
        /// </SecurityNote>>
        [SecurityCritical]
        private T _value;
    }
}