3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // EnvironmentPermission.cs
8 // <OWNER>[....]</OWNER>
11 namespace System.Security.Permissions {
12 using System.Security;
14 using SecurityElement = System.Security.SecurityElement;
15 using System.Security.Util;
17 using System.Globalization;
18 using System.Diagnostics.Contracts;
22 [System.Runtime.InteropServices.ComVisible(true)]
23 public enum EnvironmentPermissionAccess
32 internal class EnvironmentStringExpressionSet : StringExpressionSet
34 public EnvironmentStringExpressionSet()
35 : base( true, null, false )
39 public EnvironmentStringExpressionSet( String str )
40 : base( true, str, false )
44 protected override StringExpressionSet CreateNewEmpty()
46 return new EnvironmentStringExpressionSet();
49 protected override bool StringSubsetString( String left, String right, bool ignoreCase )
51 return (ignoreCase?(String.Compare( left, right, StringComparison.OrdinalIgnoreCase) == 0):
52 (String.Compare( left, right, StringComparison.Ordinal) == 0));
55 protected override String ProcessWholeString( String str )
60 protected override String ProcessSingleString( String str )
65 [SecuritySafeCritical]
66 public override string ToString()
68 // SafeCritical: we're not storing path information in the strings, so exposing them out is fine ...
69 // they're just the same strings that came in to the .ctor.
70 return base.UnsafeToString();
74 [System.Runtime.InteropServices.ComVisible(true)]
76 sealed public class EnvironmentPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission
78 private StringExpressionSet m_read;
79 private StringExpressionSet m_write;
80 private bool m_unrestricted;
82 public EnvironmentPermission(PermissionState state)
84 if (state == PermissionState.Unrestricted)
85 m_unrestricted = true;
86 else if (state == PermissionState.None)
87 m_unrestricted = false;
89 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
92 public EnvironmentPermission( EnvironmentPermissionAccess flag, String pathList )
94 SetPathList( flag, pathList );
97 public void SetPathList( EnvironmentPermissionAccess flag, String pathList )
101 m_unrestricted = false;
103 if ((flag & EnvironmentPermissionAccess.Read) != 0)
106 if ((flag & EnvironmentPermissionAccess.Write) != 0)
109 AddPathList( flag, pathList );
112 [System.Security.SecuritySafeCritical] // auto-generated
113 public void AddPathList( EnvironmentPermissionAccess flag, String pathList )
117 if (FlagIsSet( flag, EnvironmentPermissionAccess.Read ))
120 m_read = new EnvironmentStringExpressionSet();
121 m_read.AddExpressions( pathList );
124 if (FlagIsSet( flag, EnvironmentPermissionAccess.Write ))
127 m_write = new EnvironmentStringExpressionSet();
128 m_write.AddExpressions( pathList );
133 public String GetPathList( EnvironmentPermissionAccess flag )
136 ExclusiveFlag( flag );
138 if (FlagIsSet( flag, EnvironmentPermissionAccess.Read ))
144 return m_read.ToString();
147 if (FlagIsSet( flag, EnvironmentPermissionAccess.Write ))
153 return m_write.ToString();
162 private void VerifyFlag( EnvironmentPermissionAccess flag )
164 if ((flag & ~EnvironmentPermissionAccess.AllAccess) != 0)
165 throw new ArgumentException(Environment.GetResourceString("Arg_EnumIllegalVal", (int)flag));
166 Contract.EndContractBlock();
169 private void ExclusiveFlag( EnvironmentPermissionAccess flag )
171 if (flag == EnvironmentPermissionAccess.NoAccess)
173 throw new ArgumentException( Environment.GetResourceString("Arg_EnumNotSingleFlag") );
176 if (((int)flag & ((int)flag-1)) != 0)
178 throw new ArgumentException( Environment.GetResourceString("Arg_EnumNotSingleFlag") );
180 Contract.EndContractBlock();
184 private bool FlagIsSet( EnvironmentPermissionAccess flag, EnvironmentPermissionAccess question )
186 return (flag & question) != 0;
189 private bool IsEmpty()
191 return (!m_unrestricted &&
192 (this.m_read == null || this.m_read.IsEmpty()) &&
193 (this.m_write == null || this.m_write.IsEmpty()));
196 //------------------------------------------------------
198 // CODEACCESSPERMISSION IMPLEMENTATION
200 //------------------------------------------------------
202 public bool IsUnrestricted()
204 return m_unrestricted;
207 //------------------------------------------------------
209 // IPERMISSION IMPLEMENTATION
211 //------------------------------------------------------
213 [System.Security.SecuritySafeCritical] // auto-generated
214 public override bool IsSubsetOf(IPermission target)
218 return this.IsEmpty();
223 EnvironmentPermission operand = (EnvironmentPermission)target;
224 if (operand.IsUnrestricted())
226 else if (this.IsUnrestricted())
229 return ((this.m_read == null || this.m_read.IsSubsetOf( operand.m_read )) &&
230 (this.m_write == null || this.m_write.IsSubsetOf( operand.m_write )));
232 catch (InvalidCastException)
236 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
241 [System.Security.SecuritySafeCritical] // auto-generated
242 public override IPermission Intersect(IPermission target)
248 else if (!VerifyType(target))
252 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
255 else if (this.IsUnrestricted())
257 return target.Copy();
260 EnvironmentPermission operand = (EnvironmentPermission)target;
262 if (operand.IsUnrestricted())
267 StringExpressionSet intersectRead = this.m_read == null ? null : this.m_read.Intersect( operand.m_read );
268 StringExpressionSet intersectWrite = this.m_write == null ? null : this.m_write.Intersect( operand.m_write );
270 if ((intersectRead == null || intersectRead.IsEmpty()) &&
271 (intersectWrite == null || intersectWrite.IsEmpty()))
276 EnvironmentPermission intersectPermission = new EnvironmentPermission(PermissionState.None);
277 intersectPermission.m_unrestricted = false;
278 intersectPermission.m_read = intersectRead;
279 intersectPermission.m_write = intersectWrite;
281 return intersectPermission;
284 [System.Security.SecuritySafeCritical] // auto-generated
285 public override IPermission Union(IPermission other)
291 else if (!VerifyType(other))
295 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
299 EnvironmentPermission operand = (EnvironmentPermission)other;
301 if (this.IsUnrestricted() || operand.IsUnrestricted())
303 return new EnvironmentPermission( PermissionState.Unrestricted );
306 StringExpressionSet unionRead = this.m_read == null ? operand.m_read : this.m_read.Union( operand.m_read );
307 StringExpressionSet unionWrite = this.m_write == null ? operand.m_write : this.m_write.Union( operand.m_write );
309 if ((unionRead == null || unionRead.IsEmpty()) &&
310 (unionWrite == null || unionWrite.IsEmpty()))
315 EnvironmentPermission unionPermission = new EnvironmentPermission(PermissionState.None);
316 unionPermission.m_unrestricted = false;
317 unionPermission.m_read = unionRead;
318 unionPermission.m_write = unionWrite;
320 return unionPermission;
323 public override IPermission Copy()
325 EnvironmentPermission copy = new EnvironmentPermission(PermissionState.None);
326 if (this.m_unrestricted)
328 copy.m_unrestricted = true;
332 copy.m_unrestricted = false;
333 if (this.m_read != null)
335 copy.m_read = this.m_read.Copy();
337 if (this.m_write != null)
339 copy.m_write = this.m_write.Copy();
346 #if FEATURE_CAS_POLICY
347 public override SecurityElement ToXml()
349 SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.EnvironmentPermission" );
350 if (!IsUnrestricted())
352 if (this.m_read != null && !this.m_read.IsEmpty())
354 esd.AddAttribute( "Read", SecurityElement.Escape( m_read.ToString() ) );
356 if (this.m_write != null && !this.m_write.IsEmpty())
358 esd.AddAttribute( "Write", SecurityElement.Escape( m_write.ToString() ) );
363 esd.AddAttribute( "Unrestricted", "true" );
368 public override void FromXml(SecurityElement esd)
370 CodeAccessPermission.ValidateElement( esd, this );
374 if (XMLUtil.IsUnrestricted(esd))
376 m_unrestricted = true;
380 m_unrestricted = false;
384 et = esd.Attribute( "Read" );
387 m_read = new EnvironmentStringExpressionSet( et );
390 et = esd.Attribute( "Write" );
393 m_write = new EnvironmentStringExpressionSet( et );
397 #endif // FEATURE_CAS_POLICY
400 int IBuiltInPermission.GetTokenIndex()
402 return EnvironmentPermission.GetTokenIndex();
405 internal static int GetTokenIndex()
407 return BuiltInPermissionIndex.EnvironmentPermissionIndex;