2003-08-03 Sebastien Pouliot <spouliot@videotron.ca>
[mono.git] / mcs / class / corlib / System.Security.Permissions / EnvironmentPermission.cs
1 //
2 // System.Security.Permissions.EnvironmentPermission.cs
3 //
4 // Authors:
5 //      Tim Coleman <tim@timcoleman.com>
6 //      Sebastien Pouliot <spouliot@motus.com>
7 //
8 // Copyright (C) 2002, Tim Coleman
9 // Portions Copyright (C) 2003 Motus Technologies (http://www.motus.com)
10 //
11
12 using System;
13 using System.Collections;
14 using System.Security.Permissions;
15 using System.Text;
16
17 namespace System.Security.Permissions {
18
19         [Serializable]
20         public sealed class EnvironmentPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
21
22                 #region Fields
23
24                 EnvironmentPermissionAccess flags;
25                 PermissionState _state;
26                 ArrayList readList;
27                 ArrayList writeList;
28
29                 #endregion // Fields
30
31                 #region Constructors
32
33                 public EnvironmentPermission (PermissionState state) : base ()
34                 {
35                         switch (state) {
36                                 case PermissionState.None:
37                                 case PermissionState.Unrestricted:
38                                         _state = state;
39                                         readList = new ArrayList ();
40                                         writeList = new ArrayList ();
41                                         break;
42                                 default:
43                                         throw new ArgumentException ("Invalid PermissionState", "state");
44                         }
45                 }
46
47                 public EnvironmentPermission (EnvironmentPermissionAccess flag, string pathList) : base ()
48                 {
49                         readList = new ArrayList ();
50                         writeList = new ArrayList ();
51                         SetPathList (flag, pathList);
52                 }
53
54                 #endregion // Constructors
55
56                 #region Methods
57
58                 public void AddPathList (EnvironmentPermissionAccess flag, string pathList)
59                 {
60                         if (pathList == null)
61                                 throw new ArgumentNullException ("pathList");
62                         string[] paths;
63                         switch (flag) {
64                                 case EnvironmentPermissionAccess.AllAccess:
65                                         paths = pathList.Split (';');
66                                         foreach (string path in paths) {
67                                                 if (!readList.Contains (path))
68                                                         readList.Add (path);
69                                                 if (!writeList.Contains (path))
70                                                         writeList.Add (path);
71                                         }
72                                         break;
73                                 case EnvironmentPermissionAccess.NoAccess:
74                                         // ??? unit tests doesn't show removal using NoAccess ???
75                                         break;
76                                 case EnvironmentPermissionAccess.Read:
77                                         paths = pathList.Split (';');
78                                         foreach (string path in paths) {
79                                                 if (!readList.Contains (path))
80                                                         readList.Add (path);
81                                         }
82                                         break;
83                                 case EnvironmentPermissionAccess.Write:
84                                         paths = pathList.Split (';');
85                                         foreach (string path in paths) {
86                                                 if (!writeList.Contains (path))
87                                                         writeList.Add (path);
88                                         }
89                                         break;
90                                 default:
91                                         throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
92                         }
93                 }
94
95                 public override IPermission Copy ()
96                 {
97                         EnvironmentPermission ep = new EnvironmentPermission (_state);
98                         string path = GetPathList (EnvironmentPermissionAccess.Read);
99                         if (path != null)
100                                 ep.SetPathList (EnvironmentPermissionAccess.Read, path);
101                         path = GetPathList (EnvironmentPermissionAccess.Write);
102                         if (path != null)
103                                 ep.SetPathList (EnvironmentPermissionAccess.Write, path);
104                         return ep;
105                 }
106
107                 public override void FromXml (SecurityElement esd)
108                 {
109                         if (esd == null)
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");
117
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);
124
125                         // Unrestricted ???
126                 }
127
128                 public string GetPathList (EnvironmentPermissionAccess flag)
129                 {
130                         StringBuilder sb = new StringBuilder ();
131                         switch (flag) {
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) {
137                                                 sb.Append (path);
138                                                 sb.Append (";");
139                                         }
140                                         break;
141                                 case EnvironmentPermissionAccess.Write:
142                                         foreach (string path in writeList) {
143                                                 sb.Append (path);
144                                                 sb.Append (";");
145                                         }
146                                         break;
147                                 default:
148                                         throw new ArgumentException ("Unknown EnvironmentPermissionAccess", "flag");
149                         }
150                         string result = sb.ToString ();
151                         // remove last ';'
152                         int n = result.Length;
153                         if (n > 0)
154                                 return result.Substring (0, n - 1);
155                         return null;
156                 }
157
158                 public override IPermission Intersect (IPermission target)
159                 {
160                         if (target == null)
161                                 return null;
162                         if (! (target is EnvironmentPermission))
163                                 throw new ArgumentException ("wrong type");
164
165                         EnvironmentPermission o = (EnvironmentPermission) target;
166                         int n = 0;
167                         if (IsUnrestricted ())
168                                 return o.Copy ();
169                         if (o.IsUnrestricted ())
170                                 return Copy ();
171
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);
179                                                 n++;
180                                         }
181                                 }
182                         }
183
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);
190                                                 n++;
191                                         }
192                                 }
193                         }
194                         return ((n > 0) ? ep : null);
195                 }
196
197                 public override bool IsSubsetOf (IPermission target)
198                 {
199                         if (target == null)
200                                 return false;
201
202                         if (! (target is EnvironmentPermission))
203                                 throw new ArgumentException ("wrong type");
204
205                         EnvironmentPermission o = (EnvironmentPermission) target;
206                         if (IsUnrestricted ())
207                                 return o.IsUnrestricted ();
208                         else if (o.IsUnrestricted ())
209                                 return true;
210
211                         foreach (string s in readList) {
212                                 if (!o.readList.Contains (s))
213                                         return false;
214                         }
215
216                         foreach (string s in writeList) {
217                                 if (!o.writeList.Contains (s))
218                                         return false;
219                         }
220
221                         return true;
222                 }
223
224                 public bool IsUnrestricted ()
225                 {
226                         return (_state == PermissionState.Unrestricted);
227                 }
228
229                 public void SetPathList (EnvironmentPermissionAccess flag, string pathList)
230                 {
231                         if (pathList == null)
232                                 throw new ArgumentNullException ("pathList");
233                         string[] paths;
234                         switch (flag) {
235                                 case EnvironmentPermissionAccess.AllAccess:
236                                         readList.Clear ();
237                                         writeList.Clear ();
238                                         paths = pathList.Split (';');
239                                         foreach (string path in paths) {
240                                                 readList.Add (path);
241                                                 writeList.Add (path);
242                                         }
243                                         break;
244                                 case EnvironmentPermissionAccess.NoAccess:
245                                         // ??? unit tests doesn't show removal using NoAccess ???
246                                         break;
247                                 case EnvironmentPermissionAccess.Read:
248                                         readList.Clear ();
249                                         paths = pathList.Split (';');
250                                         foreach (string path in paths) {
251                                                 readList.Add (path);
252                                         }
253                                         break;
254                                 case EnvironmentPermissionAccess.Write:
255                                         writeList.Clear ();
256                                         paths = pathList.Split (';');
257                                         foreach (string path in paths) {
258                                                 writeList.Add (path);
259                                         }
260                                         break;
261                                 default:
262                                         throw new ArgumentException ("Invalid EnvironmentPermissionAccess", "flag");
263                         }
264                 }
265
266                 public override SecurityElement ToXml ()
267                 {
268                         SecurityElement se = Element (this, 1);
269                         if (_state == PermissionState.Unrestricted) {
270                                 se.AddAttribute ("Unrestricted", "true");
271                         }
272                         else {
273                                 string path = GetPathList (EnvironmentPermissionAccess.Read);
274                                 if (path != null)
275                                         se.AddAttribute ("Read", path);
276                                 path = GetPathList (EnvironmentPermissionAccess.Write);
277                                 if (path != null)
278                                         se.AddAttribute ("Write", path);
279                         }
280                         return se;
281                 }
282
283                 public override IPermission Union (IPermission other)
284                 {
285                         if (other == null)
286                                 return Copy ();
287                         if (! (other is EnvironmentPermission))
288                                 throw new ArgumentException ("wrong type");
289
290                         EnvironmentPermission o = (EnvironmentPermission) other;
291                         if (IsUnrestricted () || o.IsUnrestricted ())
292                                 return new EnvironmentPermission (PermissionState.Unrestricted);
293
294                         EnvironmentPermission ep = (EnvironmentPermission) Copy ();
295                         string path = o.GetPathList (EnvironmentPermissionAccess.Read);
296                         if (path != null) 
297                                 ep.AddPathList (EnvironmentPermissionAccess.Read, path);
298                         path = o.GetPathList (EnvironmentPermissionAccess.Write);
299                         if (path != null)
300                                 ep.AddPathList (EnvironmentPermissionAccess.Write, path);
301                         return ep;
302                 }
303
304                 // IBuiltInPermission
305                 int IBuiltInPermission.GetTokenIndex ()
306                 {
307                         return 0;
308                 }
309
310                 #endregion // Methods
311         }
312 }