From: rburnett Date: July 21 2008 9:48pm Subject: Connector/NET commit: r1346 - in branches/5.2: . MySql.Web/Providers/Properties MySql.Web/Providers/Source MySql.Web/Tests List-Archive: http://lists.mysql.com/commits/50148 X-Bug: 38243 Message-Id: <200807212148.m6LLmNpg030241@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.2/CHANGES branches/5.2/MySql.Web/Providers/Properties/Resources.resx branches/5.2/MySql.Web/Providers/Source/RoleProvider.cs branches/5.2/MySql.Web/Tests/BaseTest.cs branches/5.2/MySql.Web/Tests/RoleManagement.cs Log: - fixed problem where adding a non-existent user to a role would not auto-create the user record (bug #38243) Modified: branches/5.2/CHANGES =================================================================== --- branches/5.2/CHANGES 2008-07-18 20:51:08 UTC (rev 1345) +++ branches/5.2/CHANGES 2008-07-21 21:48:23 UTC (rev 1346) @@ -19,7 +19,9 @@ to date (bug #37469) - Improved error reporting when a timeout occurs. It no longer uses a message like 'reading from stream failed'. (bug #38119) - +- fixed problem where adding a non-existent user to a role would not auto-create the + user record (bug #38243) + Version 5.2.2 - - Fixed profile provider that would throw an exception if you were updating a profile that already existed. Modified: branches/5.2/MySql.Web/Providers/Properties/Resources.resx =================================================================== --- branches/5.2/MySql.Web/Providers/Properties/Resources.resx 2008-07-18 20:51:08 UTC (rev 1345) +++ branches/5.2/MySql.Web/Providers/Properties/Resources.resx 2008-07-21 21:48:23 UTC (rev 1346) @@ -232,4 +232,10 @@ schema4.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + Role names must not be null or empty. + + + User names must not be null or empty. + \ No newline at end of file Modified: branches/5.2/MySql.Web/Providers/Source/RoleProvider.cs =================================================================== --- branches/5.2/MySql.Web/Providers/Source/RoleProvider.cs 2008-07-18 20:51:08 UTC (rev 1345) +++ branches/5.2/MySql.Web/Providers/Source/RoleProvider.cs 2008-07-21 21:48:23 UTC (rev 1346) @@ -34,6 +34,7 @@ using System.Collections.Generic; using MySql.Web.Common; using MySql.Web.Properties; +using System.Web; namespace MySql.Web.Security { @@ -161,12 +162,16 @@ { foreach (string rolename in rolenames) { - if (!(RoleExists(rolename))) + if (String.IsNullOrEmpty(rolename)) + throw new ArgumentException(Resources.IllegalRoleName, "rolenames"); + if (!RoleExists(rolename)) throw new ProviderException(Resources.RoleNameNotFound); } foreach (string username in usernames) { + if (String.IsNullOrEmpty(username)) + throw new ArgumentException(Resources.IllegalUserName, "usernames"); if (username.IndexOf(',') != -1) throw new ArgumentException(Resources.InvalidCharactersInUserName); @@ -190,7 +195,9 @@ cmd.Parameters.Add("@roleId", MySqlDbType.Int32); foreach (string username in usernames) { - int userId = GetUserId(connection, username); + // either create a new user or fetch the existing user id + int userId = SchemaManager.CreateOrFetchUserId(connection, + username, applicationId, true); foreach (string rolename in rolenames) { int roleId = GetRoleId(connection, rolename); @@ -200,6 +207,7 @@ } } } + ts.Complete(); } } catch (Exception ex) Modified: branches/5.2/MySql.Web/Tests/BaseTest.cs =================================================================== --- branches/5.2/MySql.Web/Tests/BaseTest.cs 2008-07-18 20:51:08 UTC (rev 1345) +++ branches/5.2/MySql.Web/Tests/BaseTest.cs 2008-07-21 21:48:23 UTC (rev 1346) @@ -72,10 +72,22 @@ ps.Parameters.Add("passwordStrengthRegularExpression", ""); ms.Providers.Add(ps); + RoleManagerSection rs = (RoleManagerSection)config.SectionGroups["system.web"].Sections["roleManager"]; + rs.DefaultProvider = "MySQLRoleProvider"; + rs.Enabled = true; + ps = new ProviderSettings(); + ps.Name = "MySQLRoleProvider"; + a = Assembly.GetAssembly(typeof(MySQLRoleProvider)); + ps.Type = "MySql.Web.Security.MySQLRoleProvider, " + a.FullName; + ps.Parameters.Add("connectionStringName", "LocalMySqlServer"); + ps.Parameters.Add("applicationName", "/"); + rs.Providers.Add(ps); + config.Save(); ConfigurationManager.RefreshSection("connectionStrings"); ConfigurationManager.RefreshSection("system.web/membership"); - } + ConfigurationManager.RefreshSection("system.web/roleManager"); + } public override void Setup() { Modified: branches/5.2/MySql.Web/Tests/RoleManagement.cs =================================================================== --- branches/5.2/MySql.Web/Tests/RoleManagement.cs 2008-07-18 20:51:08 UTC (rev 1345) +++ branches/5.2/MySql.Web/Tests/RoleManagement.cs 2008-07-21 21:48:23 UTC (rev 1346) @@ -98,5 +98,64 @@ new string[] { "Administrator" }); Assert.IsTrue(roleProvider.IsUserInRole("eve", "Administrator")); } + + /// + /// Bug #38243 Not Handling non existing user when calling AddUsersToRoles method + /// + [Test] + public void AddNonExistingUserToRole() + { + roleProvider = new MySQLRoleProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + roleProvider.Initialize(null, config); + + roleProvider.CreateRole("Administrator"); + roleProvider.AddUsersToRoles(new string[] { "eve" }, + new string[] { "Administrator" }); + Assert.IsTrue(roleProvider.IsUserInRole("eve", "Administrator")); + } + + private void AttemptToAddUserToRole(string username, string role) + { + try + { + roleProvider.AddUsersToRoles(new string[] { username }, + new string[] { role }); + } + catch (ArgumentException) + { + } + } + + [Test] + public void IllegalRoleAndUserNames() + { + roleProvider = new MySQLRoleProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + roleProvider.Initialize(null, config); + + AttemptToAddUserToRole("test", null); + AttemptToAddUserToRole("test", ""); + roleProvider.CreateRole("Administrator"); + AttemptToAddUserToRole(null, "Administrator"); + AttemptToAddUserToRole("", "Administrator"); + } + + [Test] + public void AddUserToRoleWithRoleClass() + { + Roles.CreateRole("Administrator"); + MembershipCreateStatus status; + Membership.CreateUser("eve", "eve1@eve", "eve@stripped", + "question", "answer", true, null, out status); + Assert.AreEqual(MembershipCreateStatus.Success, status); + + Roles.AddUserToRole("eve", "Administrator"); + Assert.IsTrue(Roles.IsUserInRole("eve", "Administrator")); + } } }