2 // System.Security.Permissions.EnvironmentPermission.cs
5 // Tim Coleman <tim@timcoleman.com>
6 // Sebastien Pouliot <spouliot@motus.com>
8 // Copyright (C) 2002, Tim Coleman
9 // Portions Copyright (C) 2003 Motus Technologies (http://www.motus.com)
13 using System.Collections;
14 using System.Security.Permissions;
17 namespace System.Security.Permissions {
20 public sealed class EnvironmentPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
24 EnvironmentPermissionAccess flags;
25 PermissionState _state;
33 public EnvironmentPermission (PermissionState state) : base ()
36 case PermissionState.None:
37 case PermissionState.Unrestricted:
39 readList = new ArrayList ();
40 writeList = new ArrayList ();
43 throw new ArgumentException ("Invalid PermissionState", "state");
47 public EnvironmentPermission (EnvironmentPermissionAccess flag, string pathList) : base ()
49 readList = new ArrayList ();
50 writeList = new ArrayList ();
51 SetPathList (flag, pathList);
54 #endregion // Constructors
58 public void AddPathList (EnvironmentPermissionAccess flag, string pathList)
61 throw new ArgumentNullException ("pathList");
64 case EnvironmentPermissionAccess.AllAccess:
65 paths = pathList.Split (';');
66 foreach (string path in paths) {
67 if (!readList.Contains (path))
69 if (!writeList.Contains (path))
73 case EnvironmentPermissionAccess.NoAccess:
74 // ??? unit tests doesn't show removal using NoAccess ???
76 case EnvironmentPermissionAccess.Read:
77 paths = pathList.Split (';');
78 foreach (string path in paths) {
79 if (!readList.Contains (path))
83 case EnvironmentPermissionAccess.Write:
84 paths = pathList.Split (';');
85 foreach (string path in paths) {
86 if (!writeList.Contains (path))
91 throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
95 public override IPermission Copy ()
97 EnvironmentPermission ep = new EnvironmentPermission (_state);
98 string path = GetPathList (EnvironmentPermissionAccess.Read);
100 ep.SetPathList (EnvironmentPermissionAccess.Read, path);
101 path = GetPathList (EnvironmentPermissionAccess.Write);
103 ep.SetPathList (EnvironmentPermissionAccess.Write, path);
107 public override void FromXml (SecurityElement esd)
110 throw new ArgumentNullException ("esd");
111 if (esd.Tag != "IPermission")
112 throw new ArgumentException ("not IPermission");
113 if (!(esd.Attributes ["class"] as string).StartsWith ("System.Security.Permissions.EnvironmentPermission"))
114 throw new ArgumentException ("not EnvironmentPermission");
115 if ((esd.Attributes ["version"] as string) != "1")
116 throw new ArgumentException ("wrong version");
118 string read = (esd.Attributes ["Read"] as string);
119 if ((read != null) && (read.Length > 0))
120 SetPathList (EnvironmentPermissionAccess.Read, read);
121 string write = (esd.Attributes ["Write"] as string);
122 if ((write != null) && (write.Length > 0))
123 SetPathList (EnvironmentPermissionAccess.Write, write);
128 public string GetPathList (EnvironmentPermissionAccess flag)
130 StringBuilder sb = new StringBuilder ();
132 case EnvironmentPermissionAccess.AllAccess:
133 case EnvironmentPermissionAccess.NoAccess:
134 throw new ArgumentException ("Invalid EnvironmentPermissionAccess in context", "flag");
135 case EnvironmentPermissionAccess.Read:
136 foreach (string path in readList) {
141 case EnvironmentPermissionAccess.Write:
142 foreach (string path in writeList) {
148 throw new ArgumentException ("Unknown EnvironmentPermissionAccess", "flag");
150 string result = sb.ToString ();
152 int n = result.Length;
154 return result.Substring (0, n - 1);
158 public override IPermission Intersect (IPermission target)
162 if (! (target is EnvironmentPermission))
163 throw new ArgumentException ("wrong type");
165 EnvironmentPermission o = (EnvironmentPermission) target;
167 if (IsUnrestricted ())
169 if (o.IsUnrestricted ())
172 EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None);
173 string readTarget = o.GetPathList (EnvironmentPermissionAccess.Read);
174 if (readTarget != null) {
175 string[] targets = readTarget.Split (';');
176 foreach (string t in targets) {
177 if (readList.Contains (t)) {
178 ep.AddPathList (EnvironmentPermissionAccess.Read, t);
184 string writeTarget = o.GetPathList (EnvironmentPermissionAccess.Write);
185 if (writeTarget != null) {
186 string[] targets = writeTarget.Split (';');
187 foreach (string t in targets) {
188 if (writeList.Contains (t)) {
189 ep.AddPathList (EnvironmentPermissionAccess.Write, t);
194 return ((n > 0) ? ep : null);
197 public override bool IsSubsetOf (IPermission target)
202 if (! (target is EnvironmentPermission))
203 throw new ArgumentException ("wrong type");
205 EnvironmentPermission o = (EnvironmentPermission) target;
206 if (IsUnrestricted ())
207 return o.IsUnrestricted ();
208 else if (o.IsUnrestricted ())
211 foreach (string s in readList) {
212 if (!o.readList.Contains (s))
216 foreach (string s in writeList) {
217 if (!o.writeList.Contains (s))
224 public bool IsUnrestricted ()
226 return (_state == PermissionState.Unrestricted);
229 public void SetPathList (EnvironmentPermissionAccess flag, string pathList)
231 if (pathList == null)
232 throw new ArgumentNullException ("pathList");
235 case EnvironmentPermissionAccess.AllAccess:
238 paths = pathList.Split (';');
239 foreach (string path in paths) {
241 writeList.Add (path);
244 case EnvironmentPermissionAccess.NoAccess:
245 // ??? unit tests doesn't show removal using NoAccess ???
247 case EnvironmentPermissionAccess.Read:
249 paths = pathList.Split (';');
250 foreach (string path in paths) {
254 case EnvironmentPermissionAccess.Write:
256 paths = pathList.Split (';');
257 foreach (string path in paths) {
258 writeList.Add (path);
262 throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
266 public override SecurityElement ToXml ()
268 SecurityElement se = Element (this, 1);
269 if (_state == PermissionState.Unrestricted) {
270 se.AddAttribute ("Unrestricted", "true");
273 string path = GetPathList (EnvironmentPermissionAccess.Read);
275 se.AddAttribute ("Read", path);
276 path = GetPathList (EnvironmentPermissionAccess.Write);
278 se.AddAttribute ("Write", path);
283 public override IPermission Union (IPermission other)
287 if (! (other is EnvironmentPermission))
288 throw new ArgumentException ("wrong type");
290 EnvironmentPermission o = (EnvironmentPermission) other;
291 if (IsUnrestricted () || o.IsUnrestricted ())
292 return new EnvironmentPermission (PermissionState.Unrestricted);
294 EnvironmentPermission ep = (EnvironmentPermission) Copy ();
295 string path = o.GetPathList (EnvironmentPermissionAccess.Read);
297 ep.AddPathList (EnvironmentPermissionAccess.Read, path);
298 path = o.GetPathList (EnvironmentPermissionAccess.Write);
300 ep.AddPathList (EnvironmentPermissionAccess.Write, path);
304 // IBuiltInPermission
305 int IBuiltInPermission.GetTokenIndex ()
310 #endregion // Methods