2 // Mainsoft.Web.Security.DerbyRoleProvider
\r
5 // Ben Maurer (bmaurer@users.sourceforge.net)
\r
6 // Chris Toshok (toshok@ximian.com)
\r
7 // Vladimir Krasnov (vladimirk@mainsoft.com)
\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
18 // The above copyright notice and this permission notice shall be
\r
19 // included in all copies or substantial portions of the Software.
\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
33 using System.Collections;
\r
34 using System.Collections.Specialized;
\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
43 namespace Mainsoft.Web.Security
\r
46 public class DerbyRoleProvider : RoleProvider
\r
48 ConnectionStringSettings connectionString;
\r
49 string applicationName;
\r
50 bool schemaChecked = false;
\r
51 DerbyUnloadManager.DerbyShutDownPolicy shutDownPolicy = DerbyUnloadManager.DerbyShutDownPolicy.Default;
\r
53 DbConnection CreateConnection ()
\r
55 if (!schemaChecked) {
\r
56 DerbyDBSchema.CheckSchema (connectionString.ConnectionString);
\r
57 schemaChecked = true;
\r
59 DerbyUnloadManager.RegisterUnloadHandler (connectionString.ConnectionString, shutDownPolicy);
\r
62 OleDbConnection connection = new OleDbConnection (connectionString.ConnectionString);
\r
67 public override void AddUsersToRoles (string [] usernames, string [] rolenames)
\r
69 Hashtable h = new Hashtable ();
\r
71 foreach (string u in usernames) {
\r
73 throw new ArgumentNullException ("null element in usernames array");
\r
74 if (h.ContainsKey (u))
\r
75 throw new ArgumentException ("duplicate element in usernames array");
\r
76 if (u.Length == 0 || u.Length > 256 || u.IndexOf (",") != -1)
\r
77 throw new ArgumentException ("element in usernames array in illegal format");
\r
81 h = new Hashtable ();
\r
82 foreach (string r in rolenames) {
\r
84 throw new ArgumentNullException ("null element in rolenames array");
\r
85 if (h.ContainsKey (r))
\r
86 throw new ArgumentException ("duplicate element in rolenames array");
\r
87 if (r.Length == 0 || r.Length > 256 || r.IndexOf (",") != -1)
\r
88 throw new ArgumentException ("element in rolenames array in illegal format");
\r
92 using (DbConnection connection = CreateConnection ()) {
\r
93 int returnValue = DerbyRolesHelper.UsersInRoles_AddUsersToRoles (connection, ApplicationName, usernames, rolenames, DateTime.UtcNow);
\r
95 if (returnValue == 0)
\r
97 else if (returnValue == 2)
\r
98 throw new ProviderException ("One or more of the specified role names was not found.");
\r
99 else if (returnValue == 3)
\r
100 throw new ProviderException ("One or more of the specified user names is already associated with one or more of the specified role names.");
\r
102 throw new ProviderException ("Failed to create new user/role association.");
\r
106 public override void CreateRole (string rolename)
\r
108 if (rolename == null)
\r
109 throw new ArgumentNullException ("rolename");
\r
111 if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)
\r
112 throw new ArgumentException ("rolename is in invalid format");
\r
114 using (DbConnection connection = CreateConnection ()) {
\r
115 int returnValue = DerbyRolesHelper.Roles_CreateRole (connection, ApplicationName, rolename);
\r
117 if (returnValue == 2)
\r
118 throw new ProviderException (rolename + " already exists in the database");
\r
124 public override bool DeleteRole (string rolename, bool throwOnPopulatedRole)
\r
126 if (rolename == null)
\r
127 throw new ArgumentNullException ("rolename");
\r
129 if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)
\r
130 throw new ArgumentException ("rolename is in invalid format");
\r
132 using (DbConnection connection = CreateConnection ()) {
\r
133 int returnValue = DerbyRolesHelper.Roles_DeleteRole (connection, ApplicationName, rolename, throwOnPopulatedRole);
\r
135 if (returnValue == 0)
\r
137 if (returnValue == 2)
\r
138 return false; //role does not exists
\r
139 else if (returnValue == 3 && throwOnPopulatedRole)
\r
140 throw new ProviderException (rolename + " is not empty");
\r
146 public override string [] FindUsersInRole (string roleName, string usernameToMatch)
\r
148 if (roleName == null)
\r
149 throw new ArgumentNullException ("roleName");
\r
150 if (usernameToMatch == null)
\r
151 throw new ArgumentNullException ("usernameToMatch");
\r
152 if (roleName.Length == 0 || roleName.Length > 256 || roleName.IndexOf (",") != -1)
\r
153 throw new ArgumentException ("roleName is in invalid format");
\r
154 if (usernameToMatch.Length == 0 || usernameToMatch.Length > 256)
\r
155 throw new ArgumentException ("usernameToMatch is in invalid format");
\r
157 using (DbConnection connection = CreateConnection ()) {
\r
158 DbDataReader reader;
\r
159 ArrayList userList = new ArrayList ();
\r
160 int returnValue = DerbyRolesHelper.UsersInRoles_FindUsersInRole (connection, applicationName, roleName, usernameToMatch, out reader);
\r
162 if (returnValue == 2)
\r
163 throw new ProviderException ("roleName was not found in the database");
\r
166 if (reader == null)
\r
167 return new string [] { };
\r
169 while (reader.Read ())
\r
170 userList.Add (reader.GetString (0));
\r
172 return (string []) userList.ToArray (typeof (string));
\r
176 public override string [] GetAllRoles ()
\r
178 using (DbConnection connection = CreateConnection ()) {
\r
179 DbDataReader reader;
\r
180 ArrayList roleList = new ArrayList ();
\r
181 DerbyRolesHelper.Roles_GetAllRoles (connection, applicationName, out reader);
\r
183 if (reader == null)
\r
184 return new string [] { };
\r
186 while (reader.Read ())
\r
187 roleList.Add (reader.GetString (0));
\r
189 return (string []) roleList.ToArray (typeof (string));
\r
193 public override string [] GetRolesForUser (string username)
\r
195 if (username == null)
\r
196 throw new ArgumentNullException ("rolename");
\r
198 if (username.Length == 0 || username.Length > 256 || username.IndexOf (",") != -1)
\r
199 throw new ArgumentException ("username is in invalid format");
\r
201 using (DbConnection connection = CreateConnection ()) {
\r
202 DbDataReader reader;
\r
203 ArrayList roleList = new ArrayList ();
\r
204 int returnValue = DerbyRolesHelper.UsersInRoles_GetRolesForUser (connection, applicationName, username, out reader);
\r
206 if (returnValue == 2)
\r
207 throw new ProviderException ("username was not found in the database");
\r
210 if (reader == null)
\r
211 return new string [] { };
\r
213 while (reader.Read ())
\r
214 roleList.Add (reader.GetString (0));
\r
216 return (string []) roleList.ToArray (typeof (string));
\r
220 public override string [] GetUsersInRole (string rolename)
\r
222 if (rolename == null)
\r
223 throw new ArgumentNullException ("rolename");
\r
225 if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)
\r
226 throw new ArgumentException ("rolename is in invalid format");
\r
228 using (DbConnection connection = CreateConnection ()) {
\r
229 DbDataReader reader;
\r
230 ArrayList roleList = new ArrayList ();
\r
231 int returnValue = DerbyRolesHelper.UsersInRoles_GetUsersInRoles (connection, applicationName, rolename, out reader);
\r
233 if (returnValue == 2)
\r
234 throw new ProviderException ("rolename was not found in the database");
\r
237 if (reader == null)
\r
238 return new string [] { };
\r
240 while (reader.Read ())
\r
241 roleList.Add (reader.GetString (0));
\r
243 return (string []) roleList.ToArray (typeof (string));
\r
247 string GetStringConfigValue (NameValueCollection config, string name, string def)
\r
250 string val = config [name];
\r
256 public override void Initialize (string name, NameValueCollection config)
\r
258 if (config == null)
\r
259 throw new ArgumentNullException ("config");
\r
261 base.Initialize (name, config);
\r
263 applicationName = config ["applicationName"];
\r
264 string connectionStringName = config ["connectionStringName"];
\r
266 if (applicationName.Length > 256)
\r
267 throw new ProviderException ("The ApplicationName attribute must be 256 characters long or less.");
\r
268 if (connectionStringName == null || connectionStringName.Length == 0)
\r
269 throw new ProviderException ("The ConnectionStringName attribute must be present and non-zero length.");
\r
271 // XXX check connectionStringName and commandTimeout
\r
273 connectionString = WebConfigurationManager.ConnectionStrings [connectionStringName];
\r
274 if (connectionString == null)
\r
275 throw new ProviderException (String.Format("The connection name '{0}' was not found in the applications configuration or the connection string is empty.", connectionStringName));
\r
277 string shutdown = config ["shutdown"];
\r
278 if (!String.IsNullOrEmpty (shutdown))
\r
279 shutDownPolicy = (DerbyUnloadManager.DerbyShutDownPolicy) Enum.Parse (typeof (DerbyUnloadManager.DerbyShutDownPolicy), shutdown, true);
\r
282 public override bool IsUserInRole (string username, string rolename)
\r
284 if (username == null)
\r
285 throw new ArgumentNullException ("rolename");
\r
286 if (username.Length == 0 || username.Length > 256 || username.IndexOf (",") != -1)
\r
287 throw new ArgumentException ("username is in invalid format");
\r
288 if (rolename == null)
\r
289 throw new ArgumentNullException ("rolename");
\r
290 if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)
\r
291 throw new ArgumentException ("rolename is in invalid format");
\r
293 using (DbConnection connection = CreateConnection ()) {
\r
294 int returnValue = DerbyRolesHelper.UsersInRoles_IsUserInRole (connection, ApplicationName, username, rolename);
\r
296 if (returnValue == 4)
\r
303 public override void RemoveUsersFromRoles (string [] usernames, string [] rolenames)
\r
305 Hashtable h = new Hashtable ();
\r
307 foreach (string u in usernames) {
\r
309 throw new ArgumentNullException ("null element in usernames array");
\r
310 if (h.ContainsKey (u))
\r
311 throw new ArgumentException ("duplicate element in usernames array");
\r
312 if (u.Length == 0 || u.Length > 256 || u.IndexOf (",") != -1)
\r
313 throw new ArgumentException ("element in usernames array in illegal format");
\r
317 h = new Hashtable ();
\r
318 foreach (string r in rolenames) {
\r
320 throw new ArgumentNullException ("null element in rolenames array");
\r
321 if (h.ContainsKey (r))
\r
322 throw new ArgumentException ("duplicate element in rolenames array");
\r
323 if (r.Length == 0 || r.Length > 256 || r.IndexOf (",") != -1)
\r
324 throw new ArgumentException ("element in rolenames array in illegal format");
\r
328 using (DbConnection connection = CreateConnection ()) {
\r
329 int returnValue = DerbyRolesHelper.UsersInRoles_RemoveUsersFromRoles (connection, ApplicationName, usernames, rolenames);
\r
331 if (returnValue == 0)
\r
333 else if (returnValue == 2)
\r
334 throw new ProviderException ("One or more of the specified user names was not found.");
\r
335 else if (returnValue == 3)
\r
336 throw new ProviderException ("One or more of the specified role names was not found.");
\r
337 else if (returnValue == 4)
\r
338 throw new ProviderException ("One or more of the specified user names is not associated with one or more of the specified role names.");
\r
340 throw new ProviderException ("Failed to remove users from roles");
\r
344 public override bool RoleExists (string rolename)
\r
346 if (rolename == null)
\r
347 throw new ArgumentNullException ("rolename");
\r
349 if (rolename.Length == 0 || rolename.Length > 256 || rolename.IndexOf (",") != -1)
\r
350 throw new ArgumentException ("rolename is in invalid format");
\r
352 using (DbConnection connection = CreateConnection ()) {
\r
353 int returnValue = DerbyRolesHelper.Roles_RoleExists (connection, ApplicationName, rolename);
\r
355 if (returnValue == 2)
\r
362 public override string ApplicationName
\r
364 get { return applicationName; }
\r
367 applicationName = value;
\r