Merge pull request #1156 from felfert/master
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / AuthorizationRule.cs
1 //
2 // System.Web.Configuration.AuthorizationRule
3 //
4 // Authors:
5 //      Chris Toshok (toshok@ximian.com)
6 //
7 // (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System;
32 using System.Collections.Specialized;
33 using System.Security.Principal;
34 using System.Configuration;
35 using System.ComponentModel;
36 using System.Xml;
37 using System.Globalization;
38 using System.Web.Util;
39
40
41 namespace System.Web.Configuration {
42
43         public sealed class AuthorizationRule : ConfigurationElement
44         {
45                 static ConfigurationProperty rolesProp;
46                 static ConfigurationProperty usersProp;
47                 static ConfigurationProperty verbsProp;
48                 static ConfigurationPropertyCollection properties;
49
50                 AuthorizationRuleAction action;
51                 ConfigurationSaveMode saveMode = ConfigurationSaveMode.Full;
52                         
53                 static AuthorizationRule ()
54                 {
55                         rolesProp = new ConfigurationProperty ("roles", typeof (StringCollection), null,
56                                                                PropertyHelper.CommaDelimitedStringCollectionConverter,
57                                                                PropertyHelper.DefaultValidator,
58                                                                ConfigurationPropertyOptions.None);
59                         usersProp = new ConfigurationProperty ("users", typeof (StringCollection), null,
60                                                                PropertyHelper.CommaDelimitedStringCollectionConverter,
61                                                                PropertyHelper.DefaultValidator,
62                                                                ConfigurationPropertyOptions.None);
63                         verbsProp = new ConfigurationProperty ("verbs", typeof (StringCollection), null,
64                                                                PropertyHelper.CommaDelimitedStringCollectionConverter,
65                                                                PropertyHelper.DefaultValidator,
66                                                                ConfigurationPropertyOptions.None);
67                         properties = new ConfigurationPropertyCollection ();
68
69                         properties.Add (rolesProp);
70                         properties.Add (usersProp);
71                         properties.Add (verbsProp);
72                 }
73
74                 public AuthorizationRule (AuthorizationRuleAction action)
75                 {
76                         this.action = action;
77                         base[rolesProp] = new CommaDelimitedStringCollection ();
78                         base[usersProp] = new CommaDelimitedStringCollection ();
79                         base[verbsProp] = new CommaDelimitedStringCollection ();
80                 }
81
82                 public override bool Equals (object obj)
83                 {
84                         AuthorizationRule auth = obj as AuthorizationRule;
85                         if (auth == null)
86                                 return false;
87
88                         if (action != auth.Action)
89                                 return false;
90
91                         if (Roles.Count != auth.Roles.Count
92                             || Users.Count != auth.Users.Count
93                             || Verbs.Count != auth.Verbs.Count)
94                                 return false;
95
96                         int i;
97
98                         for (i = 0; i < Roles.Count; i ++)
99                                 if (Roles[i] != auth.Roles[i])
100                                         return false;
101
102                         for (i = 0; i < Users.Count; i ++)
103                                 if (Users[i] != auth.Users[i])
104                                         return false;
105
106                         for (i = 0; i < Verbs.Count; i ++)
107                                 if (Verbs[i] != auth.Verbs[i])
108                                         return false;
109                                 
110                         return true;
111                 }
112
113                 public override int GetHashCode ()
114                 {
115                         int hashCode = (int)action;
116                         int i;
117
118                         for (i = 0; i < Roles.Count; i ++)
119                                 hashCode += Roles[i].GetHashCode();
120
121                         for (i = 0; i < Users.Count; i ++)
122                                 hashCode += Users[i].GetHashCode();
123
124                         for (i = 0; i < Verbs.Count; i ++)
125                                 hashCode += Verbs[i].GetHashCode();
126
127                         return hashCode;
128                 }
129
130                 [MonoTODO ("Not implemented")]
131                 protected internal override bool IsModified ()
132                 {
133                         if (((CommaDelimitedStringCollection)Roles).IsModified || ((CommaDelimitedStringCollection)Users).IsModified || ((CommaDelimitedStringCollection)Verbs).IsModified)
134                                 return true;
135
136                         return false;
137                 }
138
139                 void VerifyData ()
140                 {
141                         if (Roles.Count == 0 && Users.Count == 0)
142                                 throw new ConfigurationErrorsException ("You must supply either a list of users or roles when creating an AuthorizationRule");
143                 }
144
145                 protected override void PostDeserialize ()
146                 {
147                         base.PostDeserialize();
148
149                         VerifyData ();
150                 }
151
152                 protected override void PreSerialize (XmlWriter writer)
153                 {
154                         base.PreSerialize (writer);
155
156                         VerifyData ();
157                 }
158
159                 protected internal override void Reset (ConfigurationElement parentElement)
160                 {
161                         AuthorizationRule r = (AuthorizationRule)parentElement;
162                         Action = r.Action;
163
164                         base.Reset (parentElement);
165                 }
166
167                 protected internal override void ResetModified ()
168                 {
169                         base.ResetModified ();
170                 }
171
172                 protected internal override bool SerializeElement (XmlWriter writer, bool serializeCollectionKey)
173                 {
174                         if (saveMode != ConfigurationSaveMode.Full && !IsModified ())
175                                 return true;
176                         
177                         PreSerialize (writer);
178
179                         writer.WriteStartElement (action == AuthorizationRuleAction.Allow ? "allow" : "deny");
180                         if (Roles.Count > 0)
181                                 writer.WriteAttributeString ("roles", Roles.ToString());
182                         if (Users.Count > 0)
183                                 writer.WriteAttributeString ("users", Users.ToString());
184                         if (Verbs.Count > 0)
185                                 writer.WriteAttributeString ("verbs", Verbs.ToString());
186
187                         writer.WriteEndElement ();
188
189                         return true;
190                 }
191
192                 protected internal override void SetReadOnly ()
193                 {
194                         base.SetReadOnly();
195                 }
196
197                 protected internal override void Unmerge (ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
198                 {
199                         base.Unmerge (sourceElement, parentElement, saveMode);
200                         this.saveMode = saveMode;
201
202                         AuthorizationRule source = sourceElement as AuthorizationRule;
203                         if (source != null)
204                                 this.action = source.Action;
205                 }
206
207                 public AuthorizationRuleAction Action {
208                         get { return action; }
209                         set { action = value; }
210                 }
211
212                 [TypeConverter (typeof (CommaDelimitedStringCollectionConverter))]
213                 [ConfigurationProperty ("roles")]
214                 public StringCollection Roles {
215                         get { return (StringCollection) base [rolesProp];}
216                 }
217
218                 [TypeConverter (typeof (CommaDelimitedStringCollectionConverter))]
219                 [ConfigurationProperty ("users")]
220                 public StringCollection Users {
221                         get { return (StringCollection) base [usersProp];}
222                 }
223
224                 [TypeConverter (typeof (CommaDelimitedStringCollectionConverter))]
225                 [ConfigurationProperty ("verbs")]
226                 public StringCollection Verbs {
227                         get { return (StringCollection) base [verbsProp];}
228                 }
229
230                 protected internal override ConfigurationPropertyCollection Properties {
231                         get { return properties; }
232                 }
233
234
235                 internal bool CheckVerb (string verb)
236                 {
237                         foreach (string v in Verbs) {
238                                 if (String.Compare (v, verb, true, Helpers.InvariantCulture) == 0)
239                                         return true;
240                         }
241                         return false;
242                 }
243
244                 internal bool CheckUser (string user)
245                 {
246                         foreach (string u in Users) {
247                                 if (String.Compare (u, user, true, Helpers.InvariantCulture) == 0 ||
248                                     u == "*" ||
249                                     (u == "?" && user == ""))
250                                         return true;
251                         }
252                         return false;
253                 }
254
255                 internal bool CheckRole (IPrincipal user)
256                 {
257                         foreach (string r in Roles) {
258                                 if (user.IsInRole (r))
259                                         return true;
260                         }
261                         return false;
262                 }
263
264         }
265
266 }
267
268