3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // NamedPermissionSet.cs
8 // <OWNER>Microsoft</OWNER>
10 // Extends PermissionSet to allow an associated name and description
13 namespace System.Security {
16 using System.Security.Util;
17 using System.Security.Permissions;
18 using System.Runtime.Serialization;
19 using System.Diagnostics.Contracts;
21 #if !FEATURE_CAS_POLICY
22 using Microsoft.Win32;
23 using System.Collections;
24 using System.Globalization;
26 using System.Reflection;
27 using System.Runtime.InteropServices;
28 using System.Runtime.Remoting;
29 using System.Runtime.Versioning;
32 #else // FEATURE_CAS_POLICY
34 using System.Threading;
36 #endif // FEATURE_CAS_POLICY
39 [System.Runtime.InteropServices.ComVisible(true)]
40 public sealed class NamedPermissionSet : PermissionSet
42 #if FEATURE_CAS_POLICY
43 // The name of this PermissionSet
44 private String m_name;
46 // The description of this PermissionSet
47 private String m_description;
48 [OptionalField(VersionAdded = 2)]
49 internal String m_descrResource;
51 internal NamedPermissionSet()
56 public NamedPermissionSet( String name )
63 public NamedPermissionSet( String name, PermissionState state)
71 public NamedPermissionSet( String name, PermissionSet permSet )
78 public NamedPermissionSet( NamedPermissionSet permSet )
81 m_name = permSet.m_name;
82 m_description = permSet.Description;
85 internal NamedPermissionSet(SecurityElement permissionSetXml)
86 : base(PermissionState.None)
88 Contract.Assert(permissionSetXml != null);
89 FromXml(permissionSetXml);
93 get { return m_name; }
94 set { CheckName( value ); m_name = value; }
97 private static void CheckName( String name )
99 if (name == null || name.Equals( "" ))
100 throw new ArgumentException( Environment.GetResourceString( "Argument_NPMSInvalidName" ));
101 Contract.EndContractBlock();
104 public String Description {
107 if(m_descrResource != null)
109 m_description = Environment.GetResourceString(m_descrResource);
110 m_descrResource = null;
112 return m_description;
117 m_description = value;
118 m_descrResource = null;
122 public override PermissionSet Copy()
124 return new NamedPermissionSet( this );
127 public NamedPermissionSet Copy( String name )
129 NamedPermissionSet set = new NamedPermissionSet( this );
134 public override SecurityElement ToXml()
136 SecurityElement elem = base.ToXml("System.Security.NamedPermissionSet");
137 // If you hit this assert then most likely you are trying to change the name of this class.
138 // This is ok as long as you change the hard coded string above and change the assert below.
139 Contract.Assert( this.GetType().FullName.Equals( "System.Security.NamedPermissionSet" ), "Class name changed!" );
141 if (m_name != null && !m_name.Equals( "" ))
143 elem.AddAttribute( "Name", SecurityElement.Escape( m_name ) );
146 if (Description != null && !Description.Equals( "" ))
148 elem.AddAttribute( "Description", SecurityElement.Escape( Description ) );
154 public override void FromXml( SecurityElement et )
156 FromXml( et, false, false );
159 internal override void FromXml( SecurityElement et, bool allowInternalOnly, bool ignoreTypeLoadFailures )
162 throw new ArgumentNullException( "et" );
163 Contract.EndContractBlock();
167 elem = et.Attribute( "Name" );
168 m_name = elem == null ? null : elem;
170 elem = et.Attribute( "Description" );
171 m_description = (elem == null ? "" : elem);
172 m_descrResource = null;
174 base.FromXml( et, allowInternalOnly, ignoreTypeLoadFailures );
177 internal void FromXmlNameOnly( SecurityElement et )
179 // This function gets only the name for the permission set, ignoring all other info.
183 elem = et.Attribute( "Name" );
184 m_name = (elem == null ? null : elem);
187 // NamedPermissionSet Equals should have the exact semantic as PermissionSet.
188 // We explicitly override them here to make sure that no one accidently
191 [System.Runtime.InteropServices.ComVisible(false)]
192 public override bool Equals( Object obj )
194 return base.Equals( obj );
197 [System.Runtime.InteropServices.ComVisible(false)]
198 public override int GetHashCode()
200 return base.GetHashCode();
203 private static Object s_InternalSyncObject;
204 private static Object InternalSyncObject {
206 if (s_InternalSyncObject == null) {
207 Object o = new Object();
208 Interlocked.CompareExchange(ref s_InternalSyncObject, o, null);
210 return s_InternalSyncObject;
213 #else // FEATURE_CAS_POLICY
215 internal static PermissionSet GetBuiltInSet(string name) {
216 // Used by PermissionSetAttribute to create one of the built-in,
217 // immutable permission sets.
221 else if (name.Equals("FullTrust"))
222 return CreateFullTrustSet();
223 else if (name.Equals("Nothing"))
224 return CreateNothingSet();
225 else if (name.Equals("Execution"))
226 return CreateExecutionSet();
227 else if (name.Equals("SkipVerification"))
228 return CreateSkipVerificationSet();
229 else if (name.Equals("Internet"))
230 return CreateInternetSet();
235 private static PermissionSet CreateFullTrustSet() {
236 return new PermissionSet(PermissionState.Unrestricted);
239 private static PermissionSet CreateNothingSet() {
240 return new PermissionSet(PermissionState.None);
243 private static PermissionSet CreateExecutionSet() {
244 PermissionSet permSet = new PermissionSet(PermissionState.None);
245 #pragma warning disable 618
246 permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
247 #pragma warning restore 618
251 private static PermissionSet CreateSkipVerificationSet() {
252 PermissionSet permSet = new PermissionSet(PermissionState.None);
253 #pragma warning disable 618
254 permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.SkipVerification));
255 #pragma warning restore 618
259 private static PermissionSet CreateInternetSet() {
260 PermissionSet permSet = new PermissionSet(PermissionState.None);
261 permSet.AddPermission(new FileDialogPermission(FileDialogPermissionAccess.Open));
262 #pragma warning disable 618
263 permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
264 #pragma warning restore 618
265 permSet.AddPermission(new UIPermission(UIPermissionWindow.SafeTopLevelWindows, UIPermissionClipboard.OwnClipboard));
270 #endif // !FEATURE_CAS_POLICY