diff options
Diffstat (limited to 'src/mscorlib/src/System/Security/Permissions/FileDialogPermission.cs')
-rw-r--r-- | src/mscorlib/src/System/Security/Permissions/FileDialogPermission.cs | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Security/Permissions/FileDialogPermission.cs b/src/mscorlib/src/System/Security/Permissions/FileDialogPermission.cs new file mode 100644 index 0000000000..6d6c221cc9 --- /dev/null +++ b/src/mscorlib/src/System/Security/Permissions/FileDialogPermission.cs @@ -0,0 +1,189 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Security.Permissions { + using System; + using System.Text; + using System.Security; + using System.Security.Util; + using System.IO; + using System.Runtime.Serialization; + using System.Reflection; + using System.Collections; + using System.Globalization; + using System.Diagnostics.Contracts; + +[Serializable] +[Flags] +[System.Runtime.InteropServices.ComVisible(true)] + public enum FileDialogPermissionAccess { + None = 0x00, + + Open = 0x01, + + Save = 0x02, + + OpenSave = Open | Save + + } + + [Serializable] +[System.Runtime.InteropServices.ComVisible(true)] + public sealed class FileDialogPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission { + FileDialogPermissionAccess access; + + public FileDialogPermission(PermissionState state) { + if (state == PermissionState.Unrestricted) { + SetUnrestricted(true); + } + else if (state == PermissionState.None) { + SetUnrestricted(false); + Reset(); + } + else { + throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState")); + } + } + + public FileDialogPermission(FileDialogPermissionAccess access) { + VerifyAccess(access); + this.access = access; + } + + public FileDialogPermissionAccess Access { + get { + return access; + } + + set { + VerifyAccess(value); + access = value; + } + } + + public override IPermission Copy() { + return new FileDialogPermission(this.access); + } + +#if FEATURE_CAS_POLICY + public override void FromXml(SecurityElement esd) { + CodeAccessPermission.ValidateElement(esd, this); + if (XMLUtil.IsUnrestricted(esd)) { + SetUnrestricted(true); + return; + } + + access = FileDialogPermissionAccess.None; + + string accessXml = esd.Attribute("Access"); + if (accessXml != null) + access = (FileDialogPermissionAccess)Enum.Parse(typeof(FileDialogPermissionAccess), accessXml); + } +#endif // FEATURE_CAS_POLICY + + /// <internalonly/> + int IBuiltInPermission.GetTokenIndex() { + return FileDialogPermission.GetTokenIndex(); + } + + internal static int GetTokenIndex() { + return BuiltInPermissionIndex.FileDialogPermissionIndex; + } + + public override IPermission Intersect(IPermission target) { + if (target == null) { + return null; + } + else if (!VerifyType(target)) { + throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)); + } + + FileDialogPermission operand = (FileDialogPermission)target; + + FileDialogPermissionAccess intersectAccess = access & operand.Access; + + if (intersectAccess == FileDialogPermissionAccess.None) + return null; + else + return new FileDialogPermission(intersectAccess); + } + + public override bool IsSubsetOf(IPermission target) { + if (target == null) { + // Only safe subset if this is empty + return access == FileDialogPermissionAccess.None; + } + + try { + FileDialogPermission operand = (FileDialogPermission)target; + if (operand.IsUnrestricted()) { + return true; + } + else if (this.IsUnrestricted()) { + return false; + } + else { + int open = (int)(access & FileDialogPermissionAccess.Open); + int save = (int)(access & FileDialogPermissionAccess.Save); + int openTarget = (int)(operand.Access & FileDialogPermissionAccess.Open); + int saveTarget = (int)(operand.Access & FileDialogPermissionAccess.Save); + + return open <= openTarget && save <= saveTarget; + } + } + catch (InvalidCastException) { + throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)); + } + + } + + public bool IsUnrestricted() { + return access == FileDialogPermissionAccess.OpenSave; + } + + void Reset() { + access = FileDialogPermissionAccess.None; + } + + void SetUnrestricted( bool unrestricted ) { + if (unrestricted) { + access = FileDialogPermissionAccess.OpenSave; + } + } + +#if FEATURE_CAS_POLICY + public override SecurityElement ToXml() { + SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.FileDialogPermission" ); + if (!IsUnrestricted()) { + if (access != FileDialogPermissionAccess.None) { + esd.AddAttribute("Access", Enum.GetName(typeof(FileDialogPermissionAccess), access)); + } + } + else { + esd.AddAttribute("Unrestricted", "true"); + } + return esd; + } +#endif // FEATURE_CAS_POLICY + + public override IPermission Union(IPermission target) { + if (target == null) { + return this.Copy(); + } + else if (!VerifyType(target)) { + throw new ArgumentException(Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)); + } + + FileDialogPermission operand = (FileDialogPermission)target; + return new FileDialogPermission(access | operand.Access); + } + + static void VerifyAccess(FileDialogPermissionAccess access) { + if ((access & ~FileDialogPermissionAccess.OpenSave) != 0 ) { + throw new ArgumentException(Environment.GetResourceString("Arg_EnumIllegalVal", (int)access)); + } + Contract.EndContractBlock(); + } + } +} |