2003-08-04 Duncan Mak <duncan@ximian.com>
[mono.git] / mcs / class / corlib / System.Security.Policy / PolicyLevel.cs
1 //
2 // System.Security.Policy.PolicyLevel.cs
3 //
4 // Authors:
5 //      Nick Drochak (ndrochak@gol.com)
6 //      Duncan Mak (duncan@ximian.com)
7 //
8 // (C) 2001 Nick Drochak
9 // (C) 2003 Duncan Mak, Ximian Inc.
10 //
11
12 using System.Collections; // for IList
13 using System.Globalization;
14 using System.Security.Policy;
15
16 namespace System.Security.Policy
17 {
18         [MonoTODO][Serializable]
19         public sealed class PolicyLevel
20         {
21                 string label;
22                 StrongNameMembershipCondition [] full_trust_assemblies;
23                 CodeGroup root_code_group;
24                 NamedPermissionSet [] named_permission_sets;
25
26                 internal PolicyLevel (string label)
27                 {
28                         this.label = label;
29
30                         // What's a good default size?                        
31                         full_trust_assemblies = new StrongNameMembershipCondition [10];
32                         named_permission_sets = new NamedPermissionSet [10];
33                 }
34
35                 [MonoTODO]
36                 public IList FullTrustAssemblies
37                 {
38                         get {
39                                 if (full_trust_assemblies != null)
40                                         return (IList) full_trust_assemblies;
41                                 
42                                 return (IList) null;
43                         }
44                 }
45
46                 public string Label {
47
48                         get { return label; }
49                 }
50
51                 public IList NamedPermissionSets {
52
53                         get {
54                                 return (IList) named_permission_sets;
55                         }
56                 }
57
58                 public CodeGroup RootCodeGroup {
59                         
60                         get { return root_code_group; }
61                         
62                         set { root_code_group = value; }
63                 }
64
65                 [MonoTODO]
66                 public string StoreLocation {
67                         get {
68                                 throw new NotImplementedException ();
69                         }
70                 }
71
72                 public void AddFullTrustAssembly (StrongName sn)
73                 {
74                         StrongNameMembershipCondition snMC = new StrongNameMembershipCondition(
75                                 sn.PublicKey, sn.Name, sn.Version);
76
77                         AddFullTrustAssembly (snMC);
78                 }
79
80                 public void AddFullTrustAssembly (StrongNameMembershipCondition snMC)
81                 {
82                         if (snMC == null)
83                                 throw new ArgumentNullException (
84                                         Locale.GetText ("The argument is null."));
85                         
86                         if (((IList) full_trust_assemblies).Contains (snMC))
87                                 throw new ArgumentException (
88                                         Locale.GetText ("sn already has full trust."));
89                                         
90                         ((IList) full_trust_assemblies).Add (snMC);
91                 }
92
93                 public void AddNamedPermissionSet (NamedPermissionSet permSet)
94                 {
95                         if (permSet == null)
96                                 throw new ArgumentNullException (
97                                         Locale.GetText ("The argument is null."));
98
99                         foreach (NamedPermissionSet n in named_permission_sets)
100                                 if (permSet.Name == n.Name)
101                                         throw new ArgumentException (
102                                                 Locale.GetText ("This NamedPermissionSet is the same an existing NamedPermissionSet."));
103
104                         ((IList) named_permission_sets).Add (permSet);
105                 }
106
107                 [MonoTODO ("Set NamedPermissionSet to the one from default policy and grant a FullTrust RootCodeGroup")]
108                 public static PolicyLevel CreateAppDomainLevel ()
109                 {
110                         PolicyLevel p = new PolicyLevel ("AppDomain");
111
112                         return p;
113                 }
114
115                 [MonoTODO ("Check for the element's validity")]
116                 public void FromXml (SecurityElement e)
117                 {
118                         if (e == null)
119                                 throw new ArgumentNullException (
120                                         Locale.GetText ("The Argument is null."));
121                 }
122
123                 public NamedPermissionSet GetNamedPermissionSet (string name)
124                 {
125                         if (name == null)
126                                 throw new ArgumentNullException (
127                                         Locale.GetText ("The Argument is null."));
128
129                         foreach (NamedPermissionSet n in named_permission_sets)
130                                 if (n.Name == name)
131                                         return n;
132
133                         return null;
134                 }
135
136                 [MonoTODO]
137                 public void Recover ()
138                 {
139                         throw new NotImplementedException ();
140                 }
141
142                 public void RemoveFullTrustAssembly (StrongName sn)
143                 {
144                         StrongNameMembershipCondition s = new StrongNameMembershipCondition (sn.PublicKey, sn.Name, sn.Version);
145
146                         RemoveFullTrustAssembly (s);
147                 }
148
149                 public void RemoveFullTrustAssembly (StrongNameMembershipCondition snMC)
150                 {
151                         if (snMC == null)
152                                 throw new ArgumentNullException (
153                                         Locale.GetText ("The Argument is null."));
154
155                         if (((IList) full_trust_assemblies).Contains (snMC))
156                                 ((IList) full_trust_assemblies).Remove (snMC);
157
158                         else
159                                 throw new ArgumentException (
160                                         Locale.GetText ("sn does not have full trust."));
161                 }
162
163                 public NamedPermissionSet RemoveNamedPermissionSet (NamedPermissionSet permSet)
164                 {
165                         if (permSet == null)
166                                 throw new ArgumentNullException (
167                                         Locale.GetText ("The Argument is null."));
168
169                         if (! ((IList )named_permission_sets).Contains (permSet))
170                                 throw new ArgumentException (
171                                         Locale.GetText ("permSet cannot be found."));
172
173                         ((IList) named_permission_sets).Remove (permSet);
174
175                         return permSet;
176                 }
177
178                 [MonoTODO ("Check for reserver names")]
179                 public NamedPermissionSet RemoveNamedPermissionSet (string name)
180                 {
181                         if (name == null)
182                                 throw new ArgumentNullException (
183                                         Locale.GetText ("The Argument is null."));
184
185                         int idx = -1;
186                         for (int i = 0; i < named_permission_sets.Length; i++) {
187                                 NamedPermissionSet current = named_permission_sets [i];
188
189                                 if (current.Name == name)
190                                         idx = i;
191                                 i ++;
192                         }                       
193
194                         if (idx == -1)
195                                 throw new ArgumentException (
196                                         Locale.GetText ("Name cannot be found."));
197
198                         NamedPermissionSet retval = named_permission_sets [idx];
199                         ((IList) named_permission_sets).RemoveAt (idx);
200
201                         return retval;
202                 }
203
204                 [MonoTODO ("Find out what the default state is")]
205                 public void Reset ()
206                 {
207                         throw new NotImplementedException ();
208                 }
209
210                 [MonoTODO]
211                 public PolicyStatement Resolve (Evidence evidence)
212                 {
213                         if (evidence == null)
214                                 throw new ArgumentNullException (
215                                         Locale.GetText ("The Argument is null."));
216
217                         throw new NotImplementedException ();
218                 }
219
220                 [MonoTODO]
221                 public CodeGroup ResolveMatchingCodeGroups (Evidence evidence)
222                 {
223                         if (evidence == null)
224                                 throw new ArgumentNullException (
225                                         Locale.GetText ("The Argument is null."));
226
227                         throw new NotImplementedException ();
228                 }
229
230                 [MonoTODO ("Populate security_classes")]
231                 public SecurityElement ToXml ()
232                 {
233                         SecurityElement element = new SecurityElement (
234                                 typeof (System.Security.Policy.PolicyLevel).Name);
235                         
236                         element.AddAttribute ("version", "1");
237
238                         SecurityElement security_classes = new SecurityElement ("SecurityClasses");
239                         element.AddChild (security_classes);
240                         
241                         SecurityElement namedPSs = new SecurityElement ("NamedPermissionSets");
242                         element.AddChild (namedPSs);
243
244                         foreach (NamedPermissionSet nps in named_permission_sets)
245                                 namedPSs.AddChild (nps.ToXml ());
246
247                         element.AddChild (root_code_group.ToXml ());
248
249                         SecurityElement fta = new SecurityElement ("FullTrustAssemblies");
250                         element.AddChild (fta);
251                         
252                         foreach (StrongNameMembershipCondition s in full_trust_assemblies)
253                                 element.AddChild (s.ToXml (this));
254                         
255                         return element;
256                 }
257         }
258 }