Fixes up password changer on postback, fixes up more of the edit user and edit member pages.

This commit is contained in:
Shannon
2014-01-08 13:03:33 +11:00
parent 0245efe3cb
commit 80b83ab64b
4 changed files with 93 additions and 103 deletions

View File

@@ -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();

View File

@@ -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("<em>" + ui.Text("errorHandling", "errorChangingProviderPassword") + "</em>"));
}
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), "");
}
}

View File

@@ -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);