From 80b83ab64b368a49d7065f4ba8aad11674db7c25 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Jan 2014 13:03:33 +1100 Subject: [PATCH] Fixes up password changer on postback, fixes up more of the edit user and edit member pages. --- .../umbraco/controls/PasswordChanger.ascx.cs | 3 +- .../umbraco/dashboard/ChangePassword.ascx.cs | 1 + .../umbraco/members/EditMember.aspx.cs | 188 ++++++++---------- .../umbraco/users/EditUser.aspx.cs | 4 +- 4 files changed, 93 insertions(+), 103 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/controls/PasswordChanger.ascx.cs b/src/Umbraco.Web.UI/umbraco/controls/PasswordChanger.ascx.cs index a42e5b3ca1..0512f29857 100644 --- a/src/Umbraco.Web.UI/umbraco/controls/PasswordChanger.ascx.cs +++ b/src/Umbraco.Web.UI/umbraco/controls/PasswordChanger.ascx.cs @@ -18,7 +18,8 @@ namespace Umbraco.Web.UI.Umbraco.Controls umbPasswordChanger_passwordCurrent.Text = null; umbPasswordChanger_passwordNew.Text = null; umbPasswordChanger_passwordNewConfirm.Text = null; - + //reset the flag always + IsChangingPasswordField.Value = "false"; this.DataBind(); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/ChangePassword.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/ChangePassword.ascx.cs index f288762cfb..82cb31733f 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/ChangePassword.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/ChangePassword.ascx.cs @@ -25,6 +25,7 @@ namespace umbraco.presentation.umbraco.dashboard protected void changePassword_Click(object sender, EventArgs e) { + Page.Validate(); if (Page.IsValid == false) return; var u = User.GetCurrent(); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index bfc60b2ef8..096958e901 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -6,6 +6,7 @@ using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using Umbraco.Core.IO; using Umbraco.Web; +using Umbraco.Web.Security; using umbraco.cms.businesslogic.member; using System.Web.Security; using umbraco.controls; @@ -25,37 +26,24 @@ namespace umbraco.cms.presentation.members protected TextBox documentName; private Member _document; private MembershipUser _member; - controls.ContentControl _contentControl; + ContentControl _contentControl; protected uicontrols.UmbracoPanel m_MemberShipPanel = new uicontrols.UmbracoPanel(); protected TextBox MemberLoginNameTxt = new TextBox(); protected RequiredFieldValidator MemberLoginNameVal = new RequiredFieldValidator(); - protected CustomValidator MemberLoginNameExistCheck = new CustomValidator(); + protected CustomValidator MemberLoginNameExistCheck = new CustomValidator(); protected PlaceHolder MemberPasswordTxt = new PlaceHolder(); protected TextBox MemberEmail = new TextBox(); protected CustomValidator MemberEmailExistCheck = new CustomValidator(); - protected controls.DualSelectbox _memberGroups = new controls.DualSelectbox(); + protected DualSelectbox _memberGroups = new DualSelectbox(); - private MembershipProvider MemberProvider + protected void Page_Load(object sender, EventArgs e) { - get - { - var provider = Membership.Providers[Member.UmbracoMemberProviderName]; - if (provider == null) - { - throw new ProviderException("The membership provider " + UmbracoSettings.DefaultBackofficeProvider + " was not found"); - } - return provider; - } - } - - protected void Page_Load(object sender, EventArgs e) - { // Add password changer - var passwordChanger = (passwordChanger) LoadControl(SystemDirectories.Umbraco + "/controls/passwordChanger.ascx"); - passwordChanger.MembershipProviderName = Membership.Provider.Name; + var passwordChanger = (passwordChanger)LoadControl(SystemDirectories.Umbraco + "/controls/passwordChanger.ascx"); + passwordChanger.MembershipProviderName = Membership.Provider.Name; //Add a custom validation message for the password changer var passwordValidation = new CustomValidator { @@ -78,8 +66,8 @@ namespace umbraco.cms.presentation.members if (Member.InUmbracoMemberMode()) { _document = new Member(int.Parse(Request.QueryString["id"])); - _member = Membership.GetUser(_document.Id); - _contentControl = new controls.ContentControl(_document, controls.ContentControl.publishModes.NoPublish, "TabView1"); + _member = Membership.GetUser(_document.LoginName, false); + _contentControl = new ContentControl(_document, controls.ContentControl.publishModes.NoPublish, "TabView1"); _contentControl.Width = Unit.Pixel(666); _contentControl.Height = Unit.Pixel(666); @@ -130,7 +118,7 @@ namespace umbraco.cms.presentation.members menuSave.Click += new ImageClickEventHandler(MenuSaveClick); menuSave.AltText = ui.Text("buttons", "save", null); - _member = Membership.GetUser(Request.QueryString["id"]); + _member = Membership.GetUser(Request.QueryString["id"], false); MemberLoginNameTxt.Text = _member.UserName; if (IsPostBack == false) { @@ -141,15 +129,7 @@ namespace umbraco.cms.presentation.members m_MemberShipPanel.Text = ui.Text("edit") + " " + _member.UserName; var props = new uicontrols.Pane(); MemberLoginNameTxt.Enabled = false; - - // check for pw support - if (Membership.Provider.EnablePasswordRetrieval == false) - { - MemberPasswordTxt.Controls.Clear(); - MemberPasswordTxt.Controls.Add( - new LiteralControl("" + ui.Text("errorHandling", "errorChangingProviderPassword") + "")); - } - + props.Controls.Add(AddProperty(ui.Text("login"), MemberLoginNameTxt)); props.Controls.Add(AddProperty(ui.Text("password"), MemberPasswordTxt)); props.Controls.Add(AddProperty("Email", MemberEmail)); @@ -197,21 +177,21 @@ namespace umbraco.cms.presentation.members void MemberLoginNameExistCheck_ServerValidate(object source, ServerValidateEventArgs args) { - var oldLoginName = _document.LoginName.Replace(" ", "").ToLower(); - var newLoginName = MemberLoginNameTxt.Text.Replace(" ", "").ToLower(); + var oldLoginName = _document.LoginName.Replace(" ", "").ToLower(); + var newLoginName = MemberLoginNameTxt.Text.Replace(" ", "").ToLower(); - if (oldLoginName != newLoginName && newLoginName != "" && Member.GetMemberFromLoginName(newLoginName) != null) - args.IsValid = false; - else - args.IsValid = true; + if (oldLoginName != newLoginName && newLoginName != "" && Member.GetMemberFromLoginName(newLoginName) != null) + args.IsValid = false; + else + args.IsValid = true; } - void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) + void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) { var oldEmail = _document.Email.ToLower(); var newEmail = MemberEmail.Text.ToLower(); - var requireUniqueEmail = MemberProvider.RequiresUniqueEmail; + var requireUniqueEmail = Membership.Provider.RequiresUniqueEmail; var howManyMembersWithEmail = 0; var membersWithEmail = Member.GetMembersFromEmail(newEmail); @@ -235,10 +215,59 @@ namespace umbraco.cms.presentation.members } + private void ChangePassword(passwordChanger passwordChangerControl, MembershipUser membershipUser, CustomValidator passwordChangerValidator) + { + //Change the password + + if (passwordChangerControl.IsChangingPassword) + { + var changePassResult = UmbracoContext.Current.Security.ChangePassword( + membershipUser.UserName, passwordChangerControl.ChangingPasswordModel, Membership.Provider); + + if (changePassResult.Success) + { + //if it is successful, we need to show the generated password if there was one, so set + //that back on the control + passwordChangerControl.ChangingPasswordModel.GeneratedPassword = changePassResult.Result.ResetPassword; + } + else + { + passwordChangerValidator.IsValid = false; + passwordChangerValidator.ErrorMessage = changePassResult.Result.ChangeError.ErrorMessage; + MemberPasswordTxt.Controls[1].Visible = true; + } + } + } + + private void UpdateMembershipProvider(MembershipUser membershipUser) + { + var membershipHelper = new MembershipHelper(); + //set the writable properties that we are editing + membershipHelper.UpdateMember(membershipUser, Membership.Provider, + MemberEmail.Text.Trim()); + } + + private void UpdateRoles(MembershipUser membershipUser) + { + // Groups + foreach (ListItem li in _memberGroups.Items) + { + if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",", StringComparison.Ordinal) > -1) + { + if (Roles.IsUserInRole(membershipUser.UserName, li.Value) == false) + Roles.AddUserToRole(membershipUser.UserName, li.Value); + } + else if (Roles.IsUserInRole(membershipUser.UserName, li.Value)) + { + Roles.RemoveUserFromRole(membershipUser.UserName, li.Value); + } + } + } + protected void tmp_save(object sender, EventArgs e) { Page.Validate(); - if (!Page.IsValid) + if (Page.IsValid == false) { foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) { @@ -249,10 +278,9 @@ namespace umbraco.cms.presentation.members } else { - - if (Page.IsPostBack) - { - // hide validation summaries + // hide validation summaries + if (Member.InUmbracoMemberMode()) + { foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) { tp.ErrorControl.Visible = false; @@ -262,53 +290,27 @@ namespace umbraco.cms.presentation.members //Change the password var passwordChangerControl = (passwordChanger)MemberPasswordTxt.Controls[0]; var passwordChangerValidator = (CustomValidator)MemberPasswordTxt.Controls[1].Controls[0].Controls[0]; - if (passwordChangerControl.IsChangingPassword) - { - var changePassResult = UmbracoContext.Current.Security.ChangePassword( - _member.UserName, passwordChangerControl.ChangingPasswordModel, MemberProvider); + ChangePassword(passwordChangerControl, _member, passwordChangerValidator); - if (changePassResult.Success) - { - //if it is successful, we need to show the generated password if there was one, so set - //that back on the control - passwordChangerControl.ChangingPasswordModel.GeneratedPassword = changePassResult.Result.ResetPassword; - } - else - { - passwordChangerValidator.IsValid = false; - passwordChangerValidator.ErrorMessage = changePassResult.Result.ChangeError.ErrorMessage; - MemberPasswordTxt.Controls[1].Visible = true; - } - } + //update the membership provider + UpdateMembershipProvider(_member); if (Member.InUmbracoMemberMode()) { - //TODO: This should really be done with the member provider too... + //Hrm, with the membership provider you cannot change the login name - I guess this will do that + // in the underlying data layer _document.LoginName = MemberLoginNameTxt.Text; - _document.Email = MemberEmail.Text; - // Groups - foreach (ListItem li in _memberGroups.Items) - { - if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",", StringComparison.Ordinal) > -1) - { - if (Roles.IsUserInRole(_document.LoginName, li.Value) == false) - Roles.AddUserToRole(_document.LoginName, li.Value); - } - else if (Roles.IsUserInRole(_document.LoginName, li.Value)) - { - Roles.RemoveUserFromRole(_document.LoginName, li.Value); - } - } + UpdateRoles(_member); - //The value of the properties has been set on IData through IDataEditor in the ContentControl - //so we need to 'retrieve' that value and set it on the property of the new IContent object. - //NOTE This is a workaround for the legacy approach to saving values through the DataType instead of the Property - //- (The DataType shouldn't be responsible for saving the value - especically directly to the db). - foreach (var item in _contentControl.DataTypes) - { - _document.getProperty(item.Key).Value = item.Value.Data.Value; - } + //The value of the properties has been set on IData through IDataEditor in the ContentControl + //so we need to 'retrieve' that value and set it on the property of the new IContent object. + //NOTE This is a workaround for the legacy approach to saving values through the DataType instead of the Property + //- (The DataType shouldn't be responsible for saving the value - especically directly to the db). + foreach (var item in _contentControl.DataTypes) + { + _document.getProperty(item.Key).Value = item.Value.Data.Value; + } // refresh cache _document.XmlGenerate(new System.Xml.XmlDocument()); @@ -316,24 +318,10 @@ namespace umbraco.cms.presentation.members } else { - _member.Email = MemberEmail.Text; - Membership.UpdateUser(_member); - // Groups - foreach (ListItem li in _memberGroups.Items) - { - if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",", StringComparison.Ordinal) > -1) - { - if (Roles.IsUserInRole(_member.UserName, li.Value) == false) - Roles.AddUserToRole(_member.UserName, li.Value); - } - else if (Roles.IsUserInRole(_member.UserName, li.Value)) - { - Roles.RemoveUserFromRole(_member.UserName, li.Value); - } - } + UpdateRoles(_member); } - ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editMemberSaved", base.getUser()), ""); + ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editMemberSaved", UmbracoUser), ""); } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/users/EditUser.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/users/EditUser.aspx.cs index 07674bca96..95b2e891e7 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/users/EditUser.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/users/EditUser.aspx.cs @@ -360,7 +360,7 @@ namespace umbraco.cms.presentation.user if (!IsPostBack) { - MembershipUser user = BackOfficeProvider.GetUser(u.LoginName, true); + MembershipUser user = BackOfficeProvider.GetUser(u.LoginName, false); uname.Text = u.Name; lname.Text = (user == null) ? u.LoginName : user.UserName; email.Text = (user == null) ? u.Email : user.Email; @@ -480,7 +480,7 @@ namespace umbraco.cms.presentation.user { try { - var membershipUser = BackOfficeProvider.GetUser(u.LoginName, true); + var membershipUser = BackOfficeProvider.GetUser(u.LoginName, false); if (membershipUser == null) { throw new ProviderException("Could not find user in the membership provider with login name " + u.LoginName);