diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs index 55f3099640..ed98d81551 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs @@ -12,5 +12,12 @@ namespace Umbraco.Core.Persistence.Repositories /// IEnumerable GetByMemberGroup(string groupName); + /// + /// Checks if a member with the username exists + /// + /// + /// + bool Exists(string username); + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index d52526aa5b..eafaf74a4f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -413,6 +413,16 @@ namespace Umbraco.Core.Persistence.Repositories return BuildFromDtos(dtos); } + public bool Exists(string username) + { + var sql = new Sql(); + sql.Select("COUNT(*)") + .From() + .Where(x => x.LoginName == username); + + return Database.ExecuteScalar(sql) > 0; + } + private IMember BuildFromDto(List dtos) { if (dtos == null || dtos.Any() == false) diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs index cc8e665eb0..feefb659fc 100644 --- a/src/Umbraco.Core/Services/IMemberService.cs +++ b/src/Umbraco.Core/Services/IMemberService.cs @@ -31,6 +31,13 @@ namespace Umbraco.Core.Services /// internal interface IMembershipMemberService : IService { + /// + /// Checks if a member with the username exists + /// + /// + /// + bool Exists(string username); + IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0); IMember GetById(object id); diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 5c9f77a3fd..61c0725ba8 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -35,6 +35,19 @@ namespace Umbraco.Core.Services #region IMemberService Implementation + /// + /// Checks if a member with the username exists + /// + /// + /// + public bool Exists(string username) + { + using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) + { + return repository.Exists(username); + } + } + /// /// Checks if a member with the id exists /// diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index 337eb6fb48..cf1f912bb1 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -9,7 +9,6 @@ using System.Xml; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using umbraco.cms.businesslogic.cache; using umbraco.BusinessLogic; @@ -58,7 +57,6 @@ namespace umbraco.cms.businesslogic.member private string _password; private string _loginName; private Hashtable _groups = null; - protected internal IMember Content; #endregion #region Constructors @@ -214,16 +212,16 @@ namespace umbraco.cms.businesslogic.member { if (mbt == null) throw new ArgumentNullException("mbt"); - var loginName = (!string.IsNullOrEmpty(LoginName)) ? LoginName : Name; + var loginName = (!String.IsNullOrEmpty(LoginName)) ? LoginName : Name; - if (string.IsNullOrEmpty(loginName)) + if (String.IsNullOrEmpty(loginName)) throw new ArgumentException("The loginname must be different from an empty string", "loginName"); // Test for e-mail if (Email != "" && GetMemberFromEmail(Email) != null && Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail) - throw new Exception(string.Format("Duplicate Email! A member with the e-mail {0} already exists", Email)); + throw new Exception(String.Format("Duplicate Email! A member with the e-mail {0} already exists", Email)); else if (GetMemberFromLoginName(loginName) != null) - throw new Exception(string.Format("Duplicate User name! A member with the user name {0} already exists", loginName)); + throw new Exception(String.Format("Duplicate User name! A member with the user name {0} already exists", loginName)); // Lowercased to prevent duplicates Email = Email.ToLower(); @@ -267,7 +265,7 @@ namespace umbraco.cms.businesslogic.member /// The member with the specified loginname - null if no Member with the login exists public static Member GetMemberFromLoginName(string loginName) { - if (string.IsNullOrEmpty(loginName)) + if (String.IsNullOrEmpty(loginName)) throw new ArgumentException("The username of a Member must be different from an emptry string", "loginName"); if (IsMember(loginName)) { @@ -365,13 +363,14 @@ namespace umbraco.cms.businesslogic.member } else { - LogHelper.Debug("Incorrect login/password attempt or member is locked out or not approved (" + loginName + ")", true); + HttpContext.Current.Trace.Warn("Incorrect login/password"); return null; } } else { - LogHelper.Debug("No member with loginname: " + loginName + " Exists", true); + HttpContext.Current.Trace.Warn("No member with loginname: " + loginName + " Exists"); + // throw new ArgumentException("No member with Loginname: " + LoginName + " exists"); return null; } } @@ -412,7 +411,7 @@ namespace umbraco.cms.businesslogic.member public static bool IsMember(string loginName) { Mandate.ParameterNotNullOrEmpty(loginName, "loginName"); - return ApplicationContext.Current.Services.MemberService.GetByUsername(loginName) != null; + return ApplicationContext.Current.Services.MemberService.Exists(loginName); } /// @@ -506,7 +505,7 @@ namespace umbraco.cms.businesslogic.member } set { - if (string.IsNullOrEmpty(value)) + if (String.IsNullOrEmpty(value)) throw new ArgumentException("The loginname must be different from an empty string", "LoginName"); if (value.Contains(",")) throw new ArgumentException("The parameter 'LoginName' must not contain commas."); @@ -538,7 +537,7 @@ namespace umbraco.cms.businesslogic.member { get { - if (string.IsNullOrEmpty(_email)) + if (String.IsNullOrEmpty(_email)) { _email = SqlHelper.ExecuteScalar( "select Email from cmsMember where nodeId = @id", @@ -564,7 +563,7 @@ namespace umbraco.cms.businesslogic.member { // If the value hasn't changed and there are more than 1 member with that email, then throw // If the value has changed and there are any member with that new email, then throw - throw new Exception(string.Format("Duplicate Email! A member with the e-mail {0} already exists", newEmail)); + throw new Exception(String.Format("Duplicate Email! A member with the e-mail {0} already exists", newEmail)); } SqlHelper.ExecuteNonQuery( "update cmsMember set Email = @email where nodeId = @id", @@ -577,43 +576,28 @@ namespace umbraco.cms.businesslogic.member #region Public Methods - [Obsolete("Obsolete", false)] protected override void setupNode() { - if (Id == -1) + base.setupNode(); + + using (var dr = SqlHelper.ExecuteReader( + @"SELECT Email, LoginName, Password FROM cmsMember WHERE nodeId=@nodeId", + SqlHelper.CreateParameter("@nodeId", this.Id))) { - base.setupNode(); - return; + if (dr.Read()) + { + if (!dr.IsNull("Email")) + _email = dr.GetString("Email"); + _loginName = dr.GetString("LoginName"); + _password = dr.GetString("Password"); + } + else + { + throw new ArgumentException(string.Format("No Member exists with Id '{0}'", this.Id)); + } } - - var content = ApplicationContext.Current.Services.MemberService.GetById(Id); - - if (content == null) - throw new ArgumentException(string.Format("No Member exists with id '{0}'", Id)); - - SetupNode(content); } - private void SetupNode(IMember content) - { - Content = content; - //Also need to set the ContentBase item to this one so all the propery values load from it - ContentBase = Content; - - //Setting private properties from IContentBase replacing CMSNode.setupNode() / CMSNode.PopulateCMSNodeFromReader() - base.PopulateCMSNodeFromUmbracoEntity(Content, _objectType); - - //If the version is empty we update with the latest version from the current IContent. - if (Version == Guid.Empty) - Version = Content.Version; - - _email = Content.Email; - _loginName = Content.Username; - _password = Content.Password; - - } - - /// /// Used to persist object changes to the database. In Version3.0 it's just a stub for future compatibility ///