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 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Collections;
37 using System.Security.Permissions;
40 namespace System.Security.Permissions {
43 public sealed class EnvironmentPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
47 EnvironmentPermissionAccess flags;
48 PermissionState _state;
56 public EnvironmentPermission (PermissionState state) : base ()
59 case PermissionState.None:
60 case PermissionState.Unrestricted:
62 readList = new ArrayList ();
63 writeList = new ArrayList ();
66 throw new ArgumentException ("Invalid PermissionState", "state");
70 public EnvironmentPermission (EnvironmentPermissionAccess flag, string pathList) : base ()
72 readList = new ArrayList ();
73 writeList = new ArrayList ();
74 SetPathList (flag, pathList);
77 #endregion // Constructors
81 public void AddPathList (EnvironmentPermissionAccess flag, string pathList)
84 throw new ArgumentNullException ("pathList");
87 case EnvironmentPermissionAccess.AllAccess:
88 paths = pathList.Split (';');
89 foreach (string path in paths) {
90 if (!readList.Contains (path))
92 if (!writeList.Contains (path))
96 case EnvironmentPermissionAccess.NoAccess:
97 // ??? unit tests doesn't show removal using NoAccess ???
99 case EnvironmentPermissionAccess.Read:
100 paths = pathList.Split (';');
101 foreach (string path in paths) {
102 if (!readList.Contains (path))
106 case EnvironmentPermissionAccess.Write:
107 paths = pathList.Split (';');
108 foreach (string path in paths) {
109 if (!writeList.Contains (path))
110 writeList.Add (path);
114 throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
118 public override IPermission Copy ()
120 EnvironmentPermission ep = new EnvironmentPermission (_state);
121 string path = GetPathList (EnvironmentPermissionAccess.Read);
123 ep.SetPathList (EnvironmentPermissionAccess.Read, path);
124 path = GetPathList (EnvironmentPermissionAccess.Write);
126 ep.SetPathList (EnvironmentPermissionAccess.Write, path);
130 public override void FromXml (SecurityElement esd)
133 throw new ArgumentNullException ("esd");
134 if (esd.Tag != "IPermission")
135 throw new ArgumentException ("not IPermission");
136 if (!(esd.Attributes ["class"] as string).StartsWith ("System.Security.Permissions.EnvironmentPermission"))
137 throw new ArgumentException ("not EnvironmentPermission");
138 if ((esd.Attributes ["version"] as string) != "1")
139 throw new ArgumentException ("wrong version");
141 string read = (esd.Attributes ["Read"] as string);
142 if ((read != null) && (read.Length > 0))
143 SetPathList (EnvironmentPermissionAccess.Read, read);
144 string write = (esd.Attributes ["Write"] as string);
145 if ((write != null) && (write.Length > 0))
146 SetPathList (EnvironmentPermissionAccess.Write, write);
151 public string GetPathList (EnvironmentPermissionAccess flag)
153 StringBuilder sb = new StringBuilder ();
155 case EnvironmentPermissionAccess.AllAccess:
156 case EnvironmentPermissionAccess.NoAccess:
157 throw new ArgumentException ("Invalid EnvironmentPermissionAccess in context", "flag");
158 case EnvironmentPermissionAccess.Read:
159 foreach (string path in readList) {
164 case EnvironmentPermissionAccess.Write:
165 foreach (string path in writeList) {
171 throw new ArgumentException ("Unknown EnvironmentPermissionAccess", "flag");
173 string result = sb.ToString ();
175 int n = result.Length;
177 return result.Substring (0, n - 1);
178 return ((_state == PermissionState.Unrestricted) ? String.Empty : null);
181 public override IPermission Intersect (IPermission target)
185 if (! (target is EnvironmentPermission))
186 throw new ArgumentException ("wrong type");
188 EnvironmentPermission o = (EnvironmentPermission) target;
190 if (IsUnrestricted ())
192 if (o.IsUnrestricted ())
195 EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None);
196 string readTarget = o.GetPathList (EnvironmentPermissionAccess.Read);
197 if (readTarget != null) {
198 string[] targets = readTarget.Split (';');
199 foreach (string t in targets) {
200 if (readList.Contains (t)) {
201 ep.AddPathList (EnvironmentPermissionAccess.Read, t);
207 string writeTarget = o.GetPathList (EnvironmentPermissionAccess.Write);
208 if (writeTarget != null) {
209 string[] targets = writeTarget.Split (';');
210 foreach (string t in targets) {
211 if (writeList.Contains (t)) {
212 ep.AddPathList (EnvironmentPermissionAccess.Write, t);
217 return ((n > 0) ? ep : null);
220 public override bool IsSubsetOf (IPermission target)
225 if (! (target is EnvironmentPermission))
226 throw new ArgumentException ("wrong type");
228 EnvironmentPermission o = (EnvironmentPermission) target;
229 if (IsUnrestricted ())
230 return o.IsUnrestricted ();
231 else if (o.IsUnrestricted ())
234 foreach (string s in readList) {
235 if (!o.readList.Contains (s))
239 foreach (string s in writeList) {
240 if (!o.writeList.Contains (s))
247 public bool IsUnrestricted ()
249 return (_state == PermissionState.Unrestricted);
252 public void SetPathList (EnvironmentPermissionAccess flag, string pathList)
254 if (pathList == null)
255 throw new ArgumentNullException ("pathList");
258 case EnvironmentPermissionAccess.AllAccess:
261 paths = pathList.Split (';');
262 foreach (string path in paths) {
264 writeList.Add (path);
267 case EnvironmentPermissionAccess.NoAccess:
268 // ??? unit tests doesn't show removal using NoAccess ???
270 case EnvironmentPermissionAccess.Read:
272 paths = pathList.Split (';');
273 foreach (string path in paths) {
277 case EnvironmentPermissionAccess.Write:
279 paths = pathList.Split (';');
280 foreach (string path in paths) {
281 writeList.Add (path);
285 throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
289 public override SecurityElement ToXml ()
291 SecurityElement se = Element (this, 1);
292 if (_state == PermissionState.Unrestricted) {
293 se.AddAttribute ("Unrestricted", "true");
296 string path = GetPathList (EnvironmentPermissionAccess.Read);
298 se.AddAttribute ("Read", path);
299 path = GetPathList (EnvironmentPermissionAccess.Write);
301 se.AddAttribute ("Write", path);
306 public override IPermission Union (IPermission other)
310 if (! (other is EnvironmentPermission))
311 throw new ArgumentException ("wrong type");
313 EnvironmentPermission o = (EnvironmentPermission) other;
314 if (IsUnrestricted () || o.IsUnrestricted ())
315 return new EnvironmentPermission (PermissionState.Unrestricted);
317 EnvironmentPermission ep = (EnvironmentPermission) Copy ();
318 string path = o.GetPathList (EnvironmentPermissionAccess.Read);
320 ep.AddPathList (EnvironmentPermissionAccess.Read, path);
321 path = o.GetPathList (EnvironmentPermissionAccess.Write);
323 ep.AddPathList (EnvironmentPermissionAccess.Write, path);
327 // IBuiltInPermission
328 int IBuiltInPermission.GetTokenIndex ()
333 #endregion // Methods