From afb9f1800e256d6668a2a5766c3de9d5017bddd4 Mon Sep 17 00:00:00 2001 From: Suha Can Date: Tue, 2 Mar 2010 17:23:45 -0800 Subject: [PATCH] - Fixing 15873: Username is case sensitive. --HG-- branch : dev --- .../Users/Controllers/AdminControllerTests.cs | 1 + .../Controllers/AccountController.cs | 10 +++- .../Controllers/AdminController.cs | 48 ++++------------- .../Modules/Orchard.Users/Models/User.cs | 5 ++ .../Orchard.Users/Models/UserRecord.cs | 1 + .../Orchard.Users/Orchard.Users.csproj | 1 + .../Services/MembershipService.cs | 5 +- .../Orchard.Users/Services/UserService.cs | 53 +++++++++++++++++++ 8 files changed, 82 insertions(+), 42 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Services/UserService.cs diff --git a/src/Orchard.Tests.Modules/Users/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Modules/Users/Controllers/AdminControllerTests.cs index a117c95fa..f7d4b745d 100644 --- a/src/Orchard.Tests.Modules/Users/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Tests.Modules/Users/Controllers/AdminControllerTests.cs @@ -33,6 +33,7 @@ namespace Orchard.Tests.Modules.Users.Controllers { builder.Register().As(); builder.Register().As().FactoryScoped(); builder.Register().As(); + builder.Register().As(); builder.Register().As(); builder.Register().As(); builder.Register().As(); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs index b2c922b22..f3500dd86 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs @@ -7,6 +7,7 @@ using System.Web.Security; using Orchard.Logging; using Orchard.Mvc.ViewModels; using Orchard.Security; +using Orchard.Users.Services; using Orchard.Users.ViewModels; namespace Orchard.Users.Controllers { @@ -14,13 +15,16 @@ namespace Orchard.Users.Controllers { public class AccountController : Controller { private readonly IAuthenticationService _authenticationService; private readonly IMembershipService _membershipService; + private readonly IUserService _userService; public AccountController( IAuthenticationService authenticationService, - IMembershipService membershipService) { + IMembershipService membershipService, + IUserService userService) { _authenticationService = authenticationService; _membershipService = membershipService; + _userService = userService; Logger = NullLogger.Instance; } @@ -189,6 +193,10 @@ namespace Orchard.Users.Controllers { if (String.IsNullOrEmpty(email)) { ModelState.AddModelError("email", "You must specify an email address."); } + string userUnicityMessage = _userService.VerifyUserUnicity(userName, email); + if (userUnicityMessage != null) { + ModelState.AddModelError("userExists", userUnicityMessage); + } if (password == null || password.Length < MinPasswordLength) { ModelState.AddModelError("password", String.Format(CultureInfo.CurrentCulture, diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs index 437b4f91b..24c08238f 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs @@ -1,5 +1,3 @@ -using System; -using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Orchard.Localization; @@ -7,18 +5,22 @@ using Orchard.ContentManagement; using Orchard.Security; using Orchard.UI.Notify; using Orchard.Users.Models; +using Orchard.Users.Services; using Orchard.Users.ViewModels; namespace Orchard.Users.Controllers { public class AdminController : Controller, IUpdateModel { private readonly IMembershipService _membershipService; + private readonly IUserService _userService; public AdminController( IOrchardServices services, - IMembershipService membershipService) { + IMembershipService membershipService, + IUserService userService) { Services = services; _membershipService = membershipService; + _userService = userService; T = NullLocalizer.Instance; } @@ -63,7 +65,7 @@ namespace Orchard.Users.Controllers { var model = new UserCreateViewModel(); UpdateModel(model); - string userExistsMessage = VerifyUserUnicity(model.UserName, model.Email); + string userExistsMessage = _userService.VerifyUserUnicity(model.UserName, model.Email); if (userExistsMessage != null) { AddModelError("NotUniqueUserName", T(userExistsMessage)); } @@ -109,7 +111,9 @@ namespace Orchard.Users.Controllers { // apply additional model properties that were posted on form UpdateModel(model); - string userExistsMessage = VerifyUserUnicity(id, model.UserName, model.Email); + model.User.Item.NormalizedUserName = model.UserName.ToLower(); + + string userExistsMessage = _userService.VerifyUserUnicity(id, model.UserName, model.Email); if (userExistsMessage != null) { AddModelError("NotUniqueUserName", T(userExistsMessage)); } @@ -133,40 +137,6 @@ namespace Orchard.Users.Controllers { return RedirectToAction("Index"); } - #region private - - private string VerifyUserUnicity(string userName, string email) { - IEnumerable allUsers = Services.ContentManager.Query().List(); - - foreach (var user in allUsers) { - if (String.Equals(userName, user.UserName, StringComparison.OrdinalIgnoreCase)) { - return "A user with that name already exists"; - } - if (String.Equals(email, user.Email, StringComparison.OrdinalIgnoreCase)) { - return "A user with that email already exists"; - } - } - - return null; - } - - private string VerifyUserUnicity(int id, string userName, string email) { - IEnumerable allUsers = Services.ContentManager.Query().List(); - foreach (var user in allUsers) { - if (user.Id == id) - continue; - if (String.Equals(userName, user.UserName, StringComparison.OrdinalIgnoreCase)) { - return "A user with that name already exists"; - } - if (String.Equals(email, user.Email, StringComparison.OrdinalIgnoreCase)) { - return "A user with that email already exists"; - } - } - return null; - } - - #endregion - bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { return TryUpdateModel(model, prefix, includeProperties, excludeProperties); } diff --git a/src/Orchard.Web/Modules/Orchard.Users/Models/User.cs b/src/Orchard.Web/Modules/Orchard.Users/Models/User.cs index 1f19cb9f0..0dea0b8e4 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Models/User.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Models/User.cs @@ -16,5 +16,10 @@ namespace Orchard.Users.Models { get { return Record.Email; } set { Record.Email = value; } } + + public string NormalizedUserName { + get { return Record.NormalizedUserName; } + set { Record.NormalizedUserName = value; } + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Users/Models/UserRecord.cs b/src/Orchard.Web/Modules/Orchard.Users/Models/UserRecord.cs index db7957053..dbb9a6039 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Models/UserRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Models/UserRecord.cs @@ -5,6 +5,7 @@ namespace Orchard.Users.Models { public class UserRecord : ContentPartRecord { public virtual string UserName { get; set; } public virtual string Email { get; set; } + public virtual string NormalizedUserName { get; set; } public virtual string Password { get; set; } public virtual MembershipPasswordFormat PasswordFormat { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj index c3558b769..58939e8c0 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj +++ b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj @@ -71,6 +71,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs index c6a8924c9..bf31a4602 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs @@ -36,12 +36,13 @@ namespace Orchard.Users.Services { { init.Record.UserName = createUserParams.Username; init.Record.Email = createUserParams.Email; + init.Record.NormalizedUserName = createUserParams.Username.ToLower(); SetPassword(init.Record, createUserParams.Password); }); } public IUser GetUser(string username) { - var userRecord = _userRepository.Get(x => x.UserName == username); + var userRecord = _userRepository.Get(x => x.NormalizedUserName == username.ToLower()); if (userRecord == null) { return null; } @@ -49,7 +50,7 @@ namespace Orchard.Users.Services { } public IUser ValidateUser(string username, string password) { - var userRecord = _userRepository.Get(x => x.UserName == username); + var userRecord = _userRepository.Get(x => x.NormalizedUserName == username.ToLower()); if (userRecord == null || ValidatePassword(userRecord, password) == false) return null; diff --git a/src/Orchard.Web/Modules/Orchard.Users/Services/UserService.cs b/src/Orchard.Web/Modules/Orchard.Users/Services/UserService.cs new file mode 100644 index 000000000..58989aa22 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Services/UserService.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using Orchard.Logging; +using Orchard.ContentManagement; +using Orchard.Users.Models; + +namespace Orchard.Users.Services { + public class UserService : IUserService { + private readonly IContentManager _contentManager; + + public UserService(IContentManager contentManager) { + _contentManager = contentManager; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + + public string VerifyUserUnicity(string userName, string email) { + IEnumerable allUsers = _contentManager.Query().List(); + + foreach (var user in allUsers) { + if (String.Equals(userName.ToLower(), user.NormalizedUserName, StringComparison.OrdinalIgnoreCase)) { + return "A user with that name already exists"; + } + if (String.Equals(email, user.Email, StringComparison.OrdinalIgnoreCase)) { + return "A user with that email already exists"; + } + } + + return null; + } + + public string VerifyUserUnicity(int id, string userName, string email) { + IEnumerable allUsers = _contentManager.Query().List(); + foreach (var user in allUsers) { + if (user.Id == id) + continue; + if (String.Equals(userName.ToLower(), user.NormalizedUserName, StringComparison.OrdinalIgnoreCase)) { + return "A user with that name already exists"; + } + if (String.Equals(email, user.Email, StringComparison.OrdinalIgnoreCase)) { + return "A user with that email already exists"; + } + } + return null; + } + } + + public interface IUserService : IDependency { + string VerifyUserUnicity(string userName, string email); + string VerifyUserUnicity(int id, string userName, string email); + } +}