New test.
[mono.git] / mcs / class / Mainsoft.Web / Mainsoft.Web.Security / DerbyRoleProvider.cs
1 //\r
2 // Mainsoft.Web.Security.DerbyRoleProvider\r
3 //\r
4 // Authors:\r
5 //      Ben Maurer (bmaurer@users.sourceforge.net)\r
6 //      Chris Toshok (toshok@ximian.com)\r
7 //      Vladimir Krasnov (vladimirk@mainsoft.com)\r
8 //\r
9 //\r
10 // Permission is hereby granted, free of charge, to any person obtaining\r
11 // a copy of this software and associated documentation files (the\r
12 // "Software"), to deal in the Software without restriction, including\r
13 // without limitation the rights to use, copy, modify, merge, publish,\r
14 // distribute, sublicense, and/or sell copies of the Software, and to\r
15 // permit persons to whom the Software is furnished to do so, subject to\r
16 // the following conditions:\r
17 // \r
18 // The above copyright notice and this permission notice shall be\r
19 // included in all copies or substantial portions of the Software.\r
20 // \r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
28 //\r
29 \r
30 #if NET_2_0\r
31 \r
32 using System;\r
33 using System.Collections;\r
34 using System.Collections.Specialized;\r
35 using System.Data;\r
36 using System.Data.OleDb;\r
37 using System.Data.Common;\r
38 using System.Configuration;\r
39 using System.Configuration.Provider;\r
40 using System.Web.Configuration;\r
41 using System.Web.Security;\r
42 \r
43 namespace Mainsoft.Web.Security\r
44 {\r
45 \r
46         public class DerbyRoleProvider : RoleProvider\r
47         {\r
48                 ConnectionStringSettings connectionString;\r
49                 string applicationName;\r
50 \r
51                 DbConnection CreateConnection ()\r
52                 {\r
53                         OleDbConnection connection = new OleDbConnection (connectionString.ConnectionString);\r
54                         connection.Open ();\r
55                         return connection;\r
56                 }\r
57 \r
58                 public override void AddUsersToRoles (string [] usernames, string [] rolenames)\r
59                 {\r
60                         Hashtable h = new Hashtable ();\r
61 \r
62                         foreach (string u in usernames) {\r
63                                 if (u == null)\r
64                                         throw new ArgumentNullException ("null element in usernames array");\r
65                                 if (h.ContainsKey (u))\r
66                                         throw new ArgumentException ("duplicate element in usernames array");\r
67                                 if (u.Length == 0 || u.Length > 256 || u.IndexOf (",") != -1)\r
68                                         throw new ArgumentException ("element in usernames array in illegal format");\r
69                                 h.Add (u, u);\r
70                         }\r
71 \r
72                         h = new Hashtable ();\r
73                         foreach (string r in rolenames) {\r
74                                 if (r == null)\r
75                                         throw new ArgumentNullException ("null element in rolenames array");\r
76                                 if (h.ContainsKey (r))\r
77                                         throw new ArgumentException ("duplicate element in rolenames array");\r
78                                 if (r.Length == 0 || r.Length > 256 || r.IndexOf (",") != -1)\r
79                                         throw new ArgumentException ("element in rolenames array in illegal format");\r
80                                 h.Add (r, r);\r
81                         } \r
82                         \r
83                         using (DbConnection connection = CreateConnection ()) {\r
84                                 int returnValue = DerbyRolesHelper.UsersInRoles_AddUsersToRoles (connection, ApplicationName, usernames, rolenames, DateTime.UtcNow);\r
85 \r
86                                 if (returnValue == 0)\r
87                                         return;\r
88                                 else if (returnValue == 2)\r
89                                         throw new ProviderException ("One or more of the specified role names was not found.");\r
90                                 else if (returnValue == 3)\r
91                                         throw new ProviderException ("One or more of the specified user names is already associated with one or more of the specified role names.");\r
92                                 else\r
93                                         throw new ProviderException ("Failed to create new user/role association.");\r
94                         }\r
95                 }\r
96 \r
97                 public override void CreateRole (string rolename)\r
98                 {\r
99                         if (rolename == null)\r
100                                 throw new ArgumentNullException ("rolename");\r
101 \r
102                         if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)\r
103                                 throw new ArgumentException ("rolename is in invalid format");\r
104 \r
105                         using (DbConnection connection = CreateConnection ()) {\r
106                                 int returnValue = DerbyRolesHelper.Roles_CreateRole (connection, ApplicationName, rolename);\r
107                                 \r
108                                 if (returnValue == 2)\r
109                                         throw new ProviderException (rolename + " already exists in the database");\r
110                                 else\r
111                                         return;\r
112                         }\r
113                 }\r
114 \r
115                 public override bool DeleteRole (string rolename, bool throwOnPopulatedRole)\r
116                 {\r
117                         if (rolename == null)\r
118                                 throw new ArgumentNullException ("rolename");\r
119 \r
120                         if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)\r
121                                 throw new ArgumentException ("rolename is in invalid format");\r
122 \r
123                         using (DbConnection connection = CreateConnection ()) {\r
124                                 int returnValue = DerbyRolesHelper.Roles_DeleteRole (connection, ApplicationName, rolename, throwOnPopulatedRole);\r
125 \r
126                                 if (returnValue == 0)\r
127                                         return true;\r
128                                 if (returnValue == 2)\r
129                                         return false; //role does not exists\r
130                                 else if (returnValue == 3 && throwOnPopulatedRole)\r
131                                         throw new ProviderException (rolename + " is not empty");\r
132                                 else\r
133                                         return false;\r
134                         }\r
135                 }\r
136 \r
137                 public override string [] FindUsersInRole (string roleName, string usernameToMatch)\r
138                 {\r
139                         if (roleName == null)\r
140                                 throw new ArgumentNullException ("roleName");\r
141                         if (usernameToMatch == null)\r
142                                 throw new ArgumentNullException ("usernameToMatch");\r
143                         if (roleName.Length == 0 || roleName.Length > 256 || roleName.IndexOf (",") != -1)\r
144                                 throw new ArgumentException ("roleName is in invalid format");\r
145                         if (usernameToMatch.Length == 0 || usernameToMatch.Length > 256)\r
146                                 throw new ArgumentException ("usernameToMatch is in invalid format");\r
147 \r
148                         using (DbConnection connection = CreateConnection ()) {\r
149                                 DbDataReader reader;\r
150                                 ArrayList userList = new ArrayList ();\r
151                                 int returnValue = DerbyRolesHelper.UsersInRoles_FindUsersInRole (connection, applicationName, roleName, usernameToMatch, out reader);\r
152 \r
153                                 if (returnValue == 2)\r
154                                         throw new ProviderException ("roleName was not found in the database");\r
155 \r
156                                 using (reader) {\r
157                                         if (reader == null)\r
158                                                 return new string [] { };\r
159 \r
160                                         while (reader.Read ())\r
161                                                 userList.Add (reader.GetString (0));\r
162                                 }\r
163                                 return (string []) userList.ToArray (typeof (string));\r
164                         }\r
165                 }\r
166 \r
167                 public override string [] GetAllRoles ()\r
168                 {\r
169                         using (DbConnection connection = CreateConnection ()) {\r
170                                 DbDataReader reader;\r
171                                 ArrayList roleList = new ArrayList ();\r
172                                 DerbyRolesHelper.Roles_GetAllRoles (connection, applicationName, out reader);\r
173                                 using (reader) {\r
174                                         if (reader == null)\r
175                                                 return new string [] { };\r
176 \r
177                                         while (reader.Read ())\r
178                                                 roleList.Add (reader.GetString (0));\r
179                                 }\r
180                                 return (string []) roleList.ToArray (typeof (string));\r
181                         }\r
182                 }\r
183 \r
184                 public override string [] GetRolesForUser (string username)\r
185                 {\r
186                         if (username == null)\r
187                                 throw new ArgumentNullException ("rolename");\r
188 \r
189                         if (username.Length == 0 || username.Length > 256 || username.IndexOf (",") != -1)\r
190                                 throw new ArgumentException ("username is in invalid format");\r
191 \r
192                         using (DbConnection connection = CreateConnection ()) {\r
193                                 DbDataReader reader;\r
194                                 ArrayList roleList = new ArrayList ();\r
195                                 int returnValue = DerbyRolesHelper.UsersInRoles_GetRolesForUser (connection, applicationName, username, out reader);\r
196 \r
197                                 if (returnValue == 2)\r
198                                         throw new ProviderException ("username was not found in the database");\r
199 \r
200                                 using (reader) {\r
201                                         if (reader == null)\r
202                                                 return new string [] { };\r
203 \r
204                                         while (reader.Read ())\r
205                                                 roleList.Add (reader.GetString (0));\r
206                                 }\r
207                                 return (string []) roleList.ToArray (typeof (string));\r
208                         }\r
209                 }\r
210 \r
211                 public override string [] GetUsersInRole (string rolename)\r
212                 {\r
213                         if (rolename == null)\r
214                                 throw new ArgumentNullException ("rolename");\r
215 \r
216                         if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)\r
217                                 throw new ArgumentException ("rolename is in invalid format");\r
218 \r
219                         using (DbConnection connection = CreateConnection ()) {\r
220                                 DbDataReader reader;\r
221                                 ArrayList roleList = new ArrayList ();\r
222                                 int returnValue = DerbyRolesHelper.UsersInRoles_GetUsersInRoles (connection, applicationName, rolename, out reader);\r
223 \r
224                                 if (returnValue == 2)\r
225                                         throw new ProviderException ("rolename was not found in the database");\r
226 \r
227                                 using (reader) {\r
228                                         if (reader == null)\r
229                                                 return new string [] { };\r
230 \r
231                                         while (reader.Read ())\r
232                                                 roleList.Add (reader.GetString (0));\r
233                                 }\r
234                                 return (string []) roleList.ToArray (typeof (string));\r
235                         }\r
236                 }\r
237 \r
238                 string GetStringConfigValue (NameValueCollection config, string name, string def)\r
239                 {\r
240                         string rv = def;\r
241                         string val = config [name];\r
242                         if (val != null)\r
243                                 rv = val;\r
244                         return rv;\r
245                 }\r
246 \r
247                 public override void Initialize (string name, NameValueCollection config)\r
248                 {\r
249                         if (config == null)\r
250                                 throw new ArgumentNullException ("config");\r
251 \r
252                         base.Initialize (name, config);\r
253 \r
254                         applicationName = config ["applicationName"];\r
255                         string connectionStringName = config ["connectionStringName"];\r
256 \r
257                         if (applicationName.Length > 256)\r
258                                 throw new ProviderException ("The ApplicationName attribute must be 256 characters long or less.");\r
259                         if (connectionStringName == null || connectionStringName.Length == 0)\r
260                                 throw new ProviderException ("The ConnectionStringName attribute must be present and non-zero length.");\r
261 \r
262                         // XXX check connectionStringName and commandTimeout\r
263 \r
264                         connectionString = WebConfigurationManager.ConnectionStrings [connectionStringName];\r
265                         if (connectionString == null)\r
266                                 throw new ProviderException (String.Format("The connection name '{0}' was not found in the applications configuration or the connection string is empty.", connectionStringName));\r
267 \r
268                         DerbyDBSchema.InitializeSchema (connectionString.ConnectionString);\r
269                 }\r
270 \r
271                 public override bool IsUserInRole (string username, string rolename)\r
272                 {\r
273                         if (username == null)\r
274                                 throw new ArgumentNullException ("rolename");\r
275                         if (username.Length == 0 || username.Length > 256 || username.IndexOf (",") != -1)\r
276                                 throw new ArgumentException ("username is in invalid format");\r
277                         if (rolename == null)\r
278                                 throw new ArgumentNullException ("rolename");\r
279                         if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)\r
280                                 throw new ArgumentException ("rolename is in invalid format");\r
281 \r
282                         using (DbConnection connection = CreateConnection ()) {\r
283                                 int returnValue = DerbyRolesHelper.UsersInRoles_IsUserInRole (connection, ApplicationName, username, rolename);\r
284 \r
285                                 if (returnValue == 4)\r
286                                         return true;\r
287 \r
288                                 return false;\r
289                         }\r
290                 }\r
291 \r
292                 public override void RemoveUsersFromRoles (string [] usernames, string [] rolenames)\r
293                 {\r
294                         Hashtable h = new Hashtable ();\r
295 \r
296                         foreach (string u in usernames) {\r
297                                 if (u == null)\r
298                                         throw new ArgumentNullException ("null element in usernames array");\r
299                                 if (h.ContainsKey (u))\r
300                                         throw new ArgumentException ("duplicate element in usernames array");\r
301                                 if (u.Length == 0 || u.Length > 256 || u.IndexOf (",") != -1)\r
302                                         throw new ArgumentException ("element in usernames array in illegal format");\r
303                                 h.Add (u, u);\r
304                         }\r
305 \r
306                         h = new Hashtable ();\r
307                         foreach (string r in rolenames) {\r
308                                 if (r == null)\r
309                                         throw new ArgumentNullException ("null element in rolenames array");\r
310                                 if (h.ContainsKey (r))\r
311                                         throw new ArgumentException ("duplicate element in rolenames array");\r
312                                 if (r.Length == 0 || r.Length > 256 || r.IndexOf (",") != -1)\r
313                                         throw new ArgumentException ("element in rolenames array in illegal format");\r
314                                 h.Add (r, r);\r
315                         } \r
316 \r
317                         using (DbConnection connection = CreateConnection ()) {\r
318                                 int returnValue = DerbyRolesHelper.UsersInRoles_RemoveUsersFromRoles (connection, ApplicationName, usernames, rolenames);\r
319 \r
320                                 if (returnValue == 0)\r
321                                         return;\r
322                                 else if (returnValue == 2)\r
323                                         throw new ProviderException ("One or more of the specified user names was not found.");\r
324                                 else if (returnValue == 3)\r
325                                         throw new ProviderException ("One or more of the specified role names was not found.");\r
326                                 else if (returnValue == 4)\r
327                                         throw new ProviderException ("One or more of the specified user names is not associated with one or more of the specified role names.");\r
328                                 else\r
329                                         throw new ProviderException ("Failed to remove users from roles");\r
330                         }\r
331                 }\r
332 \r
333                 public override bool RoleExists (string rolename)\r
334                 {\r
335                         if (rolename == null)\r
336                                 throw new ArgumentNullException ("rolename");\r
337 \r
338                         if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)\r
339                                 throw new ArgumentException ("rolename is in invalid format");\r
340 \r
341                         using (DbConnection connection = CreateConnection ()) {\r
342                                 int returnValue = DerbyRolesHelper.Roles_RoleExists (connection, ApplicationName, rolename);\r
343 \r
344                                 if (returnValue == 2)\r
345                                         return true;\r
346 \r
347                                 return false;\r
348                         }\r
349                 }\r
350 \r
351                 public override string ApplicationName\r
352                 {\r
353                         get { return applicationName; }\r
354                         set\r
355                         {\r
356                                 applicationName = value;\r
357                         }\r
358                 }\r
359         }\r
360 }\r
361 #endif\r
362 \r