3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // SecurityPermission.cs
8 // <OWNER>Microsoft</OWNER>
11 namespace System.Security.Permissions
15 using System.Security.Util;
17 using System.Threading;
18 using System.Runtime.Remoting;
19 using System.Security;
20 using System.Runtime.Serialization;
21 using System.Reflection;
22 using System.Globalization;
23 using System.Diagnostics.Contracts;
27 [System.Runtime.InteropServices.ComVisible(true)]
28 #if !FEATURE_CAS_POLICY
29 // The csharp compiler requires these types to be public, but they are not used elsewhere.
30 [Obsolete("SecurityPermissionFlag is no longer accessible to application code.")]
32 public enum SecurityPermissionFlag
35 /* The following enum value is used in the EE (ASSERT_PERMISSION in security.cpp)
36 * Should this value change, make corresponding changes there
39 UnmanagedCode = 0x02, // Update vm\Security.h if you change this !
40 SkipVerification = 0x04, // Update vm\Security.h if you change this !
43 ControlEvidence = 0x20,
45 SerializationFormatter = 0x80,
46 ControlDomainPolicy = 0x100,
47 ControlPrincipal = 0x200,
48 ControlAppDomain = 0x400,
49 RemotingConfiguration = 0x800,
50 Infrastructure = 0x1000,
51 BindingRedirects = 0x2000,
55 [System.Runtime.InteropServices.ComVisible(true)]
57 sealed public class SecurityPermission
58 : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission
60 #pragma warning disable 618
61 private SecurityPermissionFlag m_flags;
62 #pragma warning restore 618
65 // Public Constructors
68 public SecurityPermission(PermissionState state)
70 if (state == PermissionState.Unrestricted)
72 SetUnrestricted( true );
74 else if (state == PermissionState.None)
76 SetUnrestricted( false );
81 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
88 #pragma warning disable 618
89 public SecurityPermission(SecurityPermissionFlag flag)
90 #pragma warning restore 618
94 SetUnrestricted(false);
99 //------------------------------------------------------
101 // PRIVATE AND PROTECTED MODIFIERS
103 //------------------------------------------------------
106 private void SetUnrestricted(bool unrestricted)
110 #pragma warning disable 618
111 m_flags = SecurityPermissionFlag.AllFlags;
112 #pragma warning restore 618
118 #pragma warning disable 618
119 m_flags = SecurityPermissionFlag.NoFlags;
120 #pragma warning restore 618
124 #pragma warning disable 618
125 public SecurityPermissionFlag Flags
126 #pragma warning restore 618
142 // CodeAccessPermission methods
146 * IPermission interface implementation
149 public override bool IsSubsetOf(IPermission target)
156 SecurityPermission operand = target as SecurityPermission;
159 return (((int)this.m_flags) & ~((int)operand.m_flags)) == 0;
165 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
171 public override IPermission Union(IPermission target) {
172 if (target == null) return(this.Copy());
173 if (!VerifyType(target)) {
176 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
179 SecurityPermission sp_target = (SecurityPermission) target;
180 if (sp_target.IsUnrestricted() || IsUnrestricted()) {
181 return(new SecurityPermission(PermissionState.Unrestricted));
183 #pragma warning disable 618
184 SecurityPermissionFlag flag_union = (SecurityPermissionFlag)(m_flags | sp_target.m_flags);
185 #pragma warning restore 618
186 return(new SecurityPermission(flag_union));
189 public override IPermission Intersect(IPermission target)
193 else if (!VerifyType(target))
197 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
201 SecurityPermission operand = (SecurityPermission)target;
202 #pragma warning disable 618
203 SecurityPermissionFlag isectFlags = SecurityPermissionFlag.NoFlags;
204 #pragma warning restore 618
206 if (operand.IsUnrestricted())
208 if (this.IsUnrestricted())
209 return new SecurityPermission(PermissionState.Unrestricted);
211 #pragma warning disable 618
212 isectFlags = (SecurityPermissionFlag)this.m_flags;
213 #pragma warning restore 618
215 else if (this.IsUnrestricted())
217 #pragma warning disable 618
218 isectFlags = (SecurityPermissionFlag)operand.m_flags;
219 #pragma warning restore 618
223 #pragma warning disable 618
224 isectFlags = (SecurityPermissionFlag)m_flags & (SecurityPermissionFlag)operand.m_flags;
225 #pragma warning restore 618
231 return new SecurityPermission(isectFlags);
234 public override IPermission Copy()
236 if (IsUnrestricted())
237 return new SecurityPermission(PermissionState.Unrestricted);
239 #pragma warning disable 618
240 return new SecurityPermission((SecurityPermissionFlag)m_flags);
241 #pragma warning restore 618
244 public bool IsUnrestricted()
246 #pragma warning disable 618
247 return m_flags == SecurityPermissionFlag.AllFlags;
248 #pragma warning restore 618
252 #pragma warning disable 618
253 void VerifyAccess(SecurityPermissionFlag type)
254 #pragma warning restore 618
256 #pragma warning disable 618
257 if ((type & ~SecurityPermissionFlag.AllFlags) != 0)
258 #pragma warning restore 618
259 throw new ArgumentException(Environment.GetResourceString("Arg_EnumIllegalVal", (int)type));
260 Contract.EndContractBlock();
263 #if FEATURE_CAS_POLICY
264 //------------------------------------------------------
266 // PUBLIC ENCODING METHODS
268 //------------------------------------------------------
270 private const String _strHeaderAssertion = "Assertion";
271 private const String _strHeaderUnmanagedCode = "UnmanagedCode";
272 private const String _strHeaderExecution = "Execution";
273 private const String _strHeaderSkipVerification = "SkipVerification";
274 private const String _strHeaderControlThread = "ControlThread";
275 private const String _strHeaderControlEvidence = "ControlEvidence";
276 private const String _strHeaderControlPolicy = "ControlPolicy";
277 private const String _strHeaderSerializationFormatter = "SerializationFormatter";
278 private const String _strHeaderControlDomainPolicy = "ControlDomainPolicy";
279 private const String _strHeaderControlPrincipal = "ControlPrincipal";
280 private const String _strHeaderControlAppDomain = "ControlAppDomain";
282 public override SecurityElement ToXml()
284 SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.SecurityPermission" );
285 if (!IsUnrestricted())
287 esd.AddAttribute( "Flags", XMLUtil.BitFieldEnumToString( typeof( SecurityPermissionFlag ), m_flags ) );
291 esd.AddAttribute( "Unrestricted", "true" );
296 public override void FromXml(SecurityElement esd)
298 CodeAccessPermission.ValidateElement( esd, this );
299 if (XMLUtil.IsUnrestricted( esd ))
301 m_flags = SecurityPermissionFlag.AllFlags;
306 SetUnrestricted (false) ;
308 String flags = esd.Attribute( "Flags" );
311 m_flags = (SecurityPermissionFlag)Enum.Parse( typeof( SecurityPermissionFlag ), flags );
313 #endif // FEATURE_CAS_POLICY
319 #if ZERO // Do not remove this code, usefull for debugging
320 public override String ToString()
322 StringBuilder sb = new StringBuilder();
323 sb.Append("SecurityPermission(");
324 if (IsUnrestricted())
326 sb.Append("Unrestricted");
330 if (GetFlag(SecurityPermissionFlag.Assertion))
331 sb.Append("Assertion; ");
332 if (GetFlag(SecurityPermissionFlag.UnmanagedCode))
333 sb.Append("UnmangedCode; ");
334 if (GetFlag(SecurityPermissionFlag.SkipVerification))
335 sb.Append("SkipVerification; ");
336 if (GetFlag(SecurityPermissionFlag.Execution))
337 sb.Append("Execution; ");
338 if (GetFlag(SecurityPermissionFlag.ControlThread))
339 sb.Append("ControlThread; ");
340 if (GetFlag(SecurityPermissionFlag.ControlEvidence))
341 sb.Append("ControlEvidence; ");
342 if (GetFlag(SecurityPermissionFlag.ControlPolicy))
343 sb.Append("ControlPolicy; ");
344 if (GetFlag(SecurityPermissionFlag.SerializationFormatter))
345 sb.Append("SerializationFormatter; ");
346 if (GetFlag(SecurityPermissionFlag.ControlDomainPolicy))
347 sb.Append("ControlDomainPolicy; ");
348 if (GetFlag(SecurityPermissionFlag.ControlPrincipal))
349 sb.Append("ControlPrincipal; ");
353 return sb.ToString();
358 int IBuiltInPermission.GetTokenIndex()
360 return SecurityPermission.GetTokenIndex();
363 internal static int GetTokenIndex()
365 return BuiltInPermissionIndex.SecurityPermissionIndex;