Fixes a lot -

U4-3208 Ensure all membership provider properties exist on the default Member type shipped with Umbraco
U4-3158 user back office password policies doesn't adhere to membership provider rules
and even more fixes to the membership provider like actually integrating the last locked out date and last pword change date. Fixes member creation to actually use the membership provider - this means that the password is created properly based on the provider config. Fixes the provider to have default fields specified so people don't actually have to specify in config.
This commit is contained in:
Shannon
2013-10-22 13:41:04 +11:00
parent ff61812e65
commit 680a4b9570
9 changed files with 178 additions and 77 deletions

View File

@@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms
internal class PropertyTypeDto
{
[Column("id")]
[PrimaryKeyColumn(IdentitySeed = 28)]
[PrimaryKeyColumn(IdentitySeed = 50)]
public int Id { get; set; }
[Column("dataTypeId")]

View File

@@ -189,6 +189,8 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1 });
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 });
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 });
//membership property group
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 11, ContentTypeNodeId = 1044, Text = "Membership", SortOrder = 1 });
}
private void CreateCmsPropertyTypeData()
@@ -202,6 +204,19 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
//membership property types
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 28, DataTypeId = -89, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.Comments, Name = Constants.Conventions.Member.CommentsLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 29, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.FailedPasswordAttempts, Name = Constants.Conventions.Member.FailedPasswordAttemptsLabel, HelpText = null, SortOrder = 1, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 30, DataTypeId = -49, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.IsApproved, Name = Constants.Conventions.Member.IsApprovedLabel, HelpText = null, SortOrder = 2, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 31, DataTypeId = -49, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.IsLockedOut, Name = Constants.Conventions.Member.IsLockedOutLabel, HelpText = null, SortOrder = 3, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 32, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastLockoutDate, Name = Constants.Conventions.Member.LastLockoutDateLabel, HelpText = null, SortOrder = 4, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 33, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastLoginDate, Name = Constants.Conventions.Member.LastLoginDateLabel, HelpText = null, SortOrder = 5, Mandatory = false, ValidationRegExp = null, Description = null });
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 34, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastPasswordChangeDate, Name = Constants.Conventions.Member.LastPasswordChangeDateLabel, HelpText = null, SortOrder = 6, Mandatory = false, ValidationRegExp = null, Description = null });
//TODO: The member editor doesn't currently support providers that have question/answer so we'll leave these out for now.
// Also, it's worth noting that the built in ASP.Net providers encrypt the answer so that admins cannot see it for added security which is something we should actually do!
//_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 35, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.PasswordAnswer, Name = Constants.Conventions.Member.PasswordAnswerLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
//_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 36, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.PasswordQuestion, Name = Constants.Conventions.Member.PasswordQuestionLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
}
private void CreateUmbracoLanguageData()

View File

@@ -10,7 +10,7 @@ NOTES:
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
* A new version will invalidate both client and server cache and create new persisted files
-->
<clientDependency version="9" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<clientDependency version="11" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<!--
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.

View File

@@ -15,6 +15,19 @@ namespace Umbraco.Web.UI.Install.Steps
public partial class DefaultUser : StepUserControl
{
protected MembershipProvider CurrentProvider
{
get
{
var provider = Membership.Providers[UmbracoSettings.DefaultBackofficeProvider];
if (provider == null)
{
throw new InvalidOperationException("No MembershipProvider found with name " + UmbracoSettings.DefaultBackofficeProvider);
}
return provider;
}
}
protected void ChangePasswordClick(object sender, System.EventArgs e)
{
Page.Validate();
@@ -22,16 +35,37 @@ namespace Umbraco.Web.UI.Install.Steps
if (Page.IsValid)
{
var u = User.GetUser(0);
var user = Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].GetUser(0, true);
user.ChangePassword(u.GetPassword(), tb_password.Text.Trim());
var user = CurrentProvider.GetUser(0, true);
if (user == null)
{
throw new InvalidOperationException("No user found in membership provider with id of 0");
}
//NOTE: This will throw an exception if the membership provider
try
{
var success = user.ChangePassword(u.GetPassword(), tb_password.Text.Trim());
if (!success)
{
PasswordValidator.IsValid = false;
PasswordValidator.ErrorMessage = "Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols";
return;
}
}
catch (Exception ex)
{
PasswordValidator.IsValid = false;
PasswordValidator.ErrorMessage = "Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols";
return;
}
// Is it using the default membership provider
if (Membership.Providers[UmbracoSettings.DefaultBackofficeProvider] is UsersMembershipProvider)
if (CurrentProvider is UsersMembershipProvider)
{
// Save user in membership provider
var umbracoUser = user as UsersMembershipUser;
umbracoUser.FullName = tb_name.Text.Trim();
Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].UpdateUser(umbracoUser);
CurrentProvider.UpdateUser(umbracoUser);
// Save user details
u.Email = tb_email.Text.Trim();
@@ -39,7 +73,10 @@ namespace Umbraco.Web.UI.Install.Steps
else
{
u.Name = tb_name.Text.Trim();
if (!(Membership.Providers[UmbracoSettings.DefaultBackofficeProvider] is ActiveDirectoryMembershipProvider)) Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].UpdateUser(user);
if ((CurrentProvider is ActiveDirectoryMembershipProvider) == false)
{
CurrentProvider.UpdateUser(user);
}
}
// we need to update the login name here as it's set to the old name when saving the user via the membership provider!

View File

@@ -57,6 +57,15 @@ namespace Umbraco.Web.UI.Install.Steps {
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox tb_password;
/// <summary>
/// PasswordValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CustomValidator PasswordValidator;
/// <summary>
/// tb_password_confirm control.
/// </summary>

View File

@@ -47,6 +47,7 @@
<asp:label AssociatedControlID="tb_password" runat="server">Password:</asp:label>
<span><asp:TextBox ID="tb_password" CssClass="text" TextMode="Password" type="text" Text="" runat="server" /></span>
<asp:RequiredFieldValidator Display="Dynamic" CssClass="invalidaing" ControlToValidate="tb_password" runat="server" ErrorMessage="Password is a mandatory field" />
<asp:CustomValidator ID="PasswordValidator" Display="Dynamic" CssClass="invalidaing" runat="server" />
</div>
<div class="row">
@@ -79,7 +80,8 @@
badPass: "invalidaing",
goodPass: "validaing",
strongPass: "validaing",
baseStyle: "basevalidaing",
baseStyle: "basevalidaing",
minLength: <%=CurrentProvider.MinRequiredPasswordLength %>,
userid: jQuery("#<%= tb_login.ClientID %>").val(),
messageloc: 1
});

View File

@@ -47,7 +47,8 @@
strongPass: 'strongPass', //optional
baseStyle: 'testresult', //optional
userid: '', //required override
messageloc: 1 //before == 0 or after == 1
messageloc: 1, //before == 0 or after == 1
minLength: 7
};
var opts = $.extend(defaults, options);
@@ -75,8 +76,8 @@
$.fn.teststrength = function (password, username, option) {
var score = 0;
//password < 4
if (password.length < 4) { this.resultStyle = option.shortPass; return $(this).shortPass; }
//password < minLength
if (password.length < option.minLength) { this.resultStyle = option.shortPass; return $(this).shortPass; }
//password == user name
if (password.toLowerCase() == username.toLowerCase()) { this.resultStyle = option.badPass; return $(this).samePassword; }

View File

@@ -1,5 +1,6 @@
using System;
using System.Data;
using System.Globalization;
using System.Web.Security;
using umbraco.BusinessLogic;
using umbraco.DataLayer;
@@ -74,25 +75,30 @@ namespace umbraco
string email = nameAndMail.Length > 0 ? nameAndMail[1] : "";
string password = nameAndMail.Length > 1 ? nameAndMail[2] : "";
string loginName = nameAndMail.Length > 2 ? nameAndMail[3] : "";
if (cms.businesslogic.member.Member.InUmbracoMemberMode() && TypeID != -1)
if (Member.InUmbracoMemberMode() && TypeID != -1)
{
cms.businesslogic.member.MemberType dt = new cms.businesslogic.member.MemberType(TypeID);
cms.businesslogic.member.Member m = cms.businesslogic.member.Member.MakeNew(name, loginName, email, dt, BusinessLogic.User.GetUser(_userID));
m.Password = password;
m.LoginName = loginName.Replace(" ", "").ToLower();
var dt = new MemberType(TypeID);
var provider = (providers.members.UmbracoMembershipProvider) Membership.Provider;
MembershipCreateStatus status;
//TODO: We are not supporting q/a - passing in empty here
var created = provider.CreateUser(dt.Alias,
loginName.Replace(" ", "").ToLower(), //dunno why we're doing this but that's how it has been so i'll leave it i guess
password, email, "", "", true, Guid.NewGuid(), out status);
NewMemberUIEventArgs e = new NewMemberUIEventArgs();
this.OnNewMember(e, password, m);
var member = Member.GetMemberFromLoginName(created.UserName);
_returnUrl = "members/editMember.aspx?id=" + m.Id.ToString();
var e = new NewMemberUIEventArgs();
this.OnNewMember(e, password, member);
_returnUrl = "members/editMember.aspx?id=" + member.Id.ToString(CultureInfo.InvariantCulture);
}
else
{
MembershipCreateStatus mc = new MembershipCreateStatus();
var mc = new MembershipCreateStatus();
Membership.CreateUser(name, password, email, "empty", "empty", true, out mc);
if (mc != MembershipCreateStatus.Success)
{
throw new Exception("Error creating Member: " + mc.ToString());
throw new Exception("Error creating Member: " + mc);
}
_returnUrl = "members/editMember.aspx?id=" + System.Web.HttpContext.Current.Server.UrlEncode(name);
}
@@ -102,10 +108,8 @@ namespace umbraco
public bool Delete()
{
//cms.businesslogic.member.Member d = new cms.businesslogic.member.Member(ParentID);
//d.delete();
//return true;
MembershipUser u = Membership.GetUser(Alias);
var u = Membership.GetUser(Alias);
if (u == null) return false;
Membership.DeleteUser(u.UserName, true);
return true;

View File

@@ -31,16 +31,21 @@ namespace umbraco.providers.members
public class UmbracoMembershipProvider : MembershipProviderBase
{
#region Fields
//Set the defaults!
private string _defaultMemberTypeAlias = "Member";
private string _lockPropertyTypeAlias = Constants.Conventions.Member.IsLockedOut;
private string _lastLockedOutPropertyTypeAlias = Constants.Conventions.Member.LastLockoutDate;
private string _failedPasswordAttemptsPropertyTypeAlias = Constants.Conventions.Member.FailedPasswordAttempts;
private string _approvedPropertyTypeAlias = Constants.Conventions.Member.IsApproved;
private string _commentPropertyTypeAlias = Constants.Conventions.Member.Comments;
private string _lastLoginPropertyTypeAlias = Constants.Conventions.Member.LastLoginDate;
private string _lastPasswordChangedPropertyTypeAlias = Constants.Conventions.Member.LastPasswordChangeDate;
private string _passwordRetrievalQuestionPropertyTypeAlias = Constants.Conventions.Member.PasswordQuestion;
private string _passwordRetrievalAnswerPropertyTypeAlias = Constants.Conventions.Member.PasswordAnswer;
private string _defaultMemberTypeAlias;
private string _lockPropertyTypeAlias;
private string _failedPasswordAttemptsPropertyTypeAlias;
private string _approvedPropertyTypeAlias;
private string _commentPropertyTypeAlias;
private string _lastLoginPropertyTypeAlias;
private string _passwordRetrievalQuestionPropertyTypeAlias;
private string _passwordRetrievalAnswerPropertyTypeAlias;
private string _providerName = Member.UmbracoMemberProviderName;
#endregion
#region Initialization Method
@@ -83,6 +88,14 @@ namespace umbraco.providers.members
{
_lockPropertyTypeAlias = config["umbracoLockPropertyTypeAlias"];
}
if (config["umbracoLastLockedPropertyTypeAlias"] != null)
{
_lastLockedOutPropertyTypeAlias = config["umbracoLastLockedPropertyTypeAlias"];
}
if (config["umbracoLastPasswordChangedPropertyTypeAlias"] != null)
{
_lastPasswordChangedPropertyTypeAlias = config["umbracoLastPasswordChangedPropertyTypeAlias"];
}
if (config["umbracoFailedPasswordAttemptsPropertyTypeAlias"] != null)
{
_failedPasswordAttemptsPropertyTypeAlias = config["umbracoFailedPasswordAttemptsPropertyTypeAlias"];
@@ -140,7 +153,9 @@ namespace umbraco.providers.members
string salt;
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
m.ChangePassword(
FormatPasswordForStorage(encodedPassword, salt));
FormatPasswordForStorage(encodedPassword, salt));
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
return true;
}
@@ -246,7 +261,7 @@ namespace umbraco.providers.members
UpdateMemberProperty(m, _passwordRetrievalAnswerPropertyTypeAlias, passwordAnswer);
if (string.IsNullOrEmpty(_approvedPropertyTypeAlias) == false)
UpdateMemberProperty(m, _approvedPropertyTypeAlias, isApproved);
UpdateMemberProperty(m, _approvedPropertyTypeAlias, isApproved ? 1 : 0);
if (string.IsNullOrEmpty(_lastLoginPropertyTypeAlias) == false)
{
@@ -254,6 +269,11 @@ namespace umbraco.providers.members
UpdateMemberProperty(m, _lastLoginPropertyTypeAlias, mUser.LastActivityDate);
}
if (string.IsNullOrEmpty(_lastPasswordChangedPropertyTypeAlias) == false)
{
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
}
// save
m.Save();
@@ -294,13 +314,10 @@ namespace umbraco.providers.members
/// </returns>
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
Member m = Member.GetMemberFromLoginName(username);
var m = Member.GetMemberFromLoginName(username);
if (m == null) return false;
else
{
m.delete();
return true;
}
m.delete();
return true;
}
/// <summary>
@@ -339,14 +356,14 @@ namespace umbraco.providers.members
/// </returns>
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
int counter = 0;
int startIndex = pageSize * pageIndex;
int endIndex = startIndex + pageSize - 1;
MembershipUserCollection membersList = new MembershipUserCollection();
Member[] memberArray = Member.GetMemberByName(usernameToMatch, false);
var counter = 0;
var startIndex = pageSize * pageIndex;
var endIndex = startIndex + pageSize - 1;
var membersList = new MembershipUserCollection();
var memberArray = Member.GetMemberByName(usernameToMatch, false);
totalRecords = memberArray.Length;
foreach (Member m in memberArray)
foreach (var m in memberArray)
{
if (counter >= startIndex)
membersList.Add(ConvertToMembershipUser(m));
@@ -367,14 +384,14 @@ namespace umbraco.providers.members
/// </returns>
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
int counter = 0;
int startIndex = pageSize * pageIndex;
int endIndex = startIndex + pageSize - 1;
MembershipUserCollection membersList = new MembershipUserCollection();
Member[] memberArray = Member.GetAll;
var counter = 0;
var startIndex = pageSize * pageIndex;
var endIndex = startIndex + pageSize - 1;
var membersList = new MembershipUserCollection();
var memberArray = Member.GetAll;
totalRecords = memberArray.Length;
foreach (Member m in memberArray)
foreach (var m in memberArray)
{
if (counter >= startIndex)
membersList.Add(ConvertToMembershipUser(m));
@@ -406,24 +423,24 @@ namespace umbraco.providers.members
/// </returns>
public override string GetPassword(string username, string answer)
{
if (!EnablePasswordRetrieval)
if (EnablePasswordRetrieval == false)
throw new ProviderException("Password Retrieval Not Enabled.");
if (PasswordFormat == MembershipPasswordFormat.Hashed)
throw new ProviderException("Cannot retrieve Hashed passwords.");
Member m = Member.GetMemberFromLoginName(username);
var m = Member.GetMemberFromLoginName(username);
if (m != null)
{
if (RequiresQuestionAndAnswer)
{
// check if password answer property alias is set
if (!String.IsNullOrEmpty(_passwordRetrievalAnswerPropertyTypeAlias))
if (string.IsNullOrEmpty(_passwordRetrievalAnswerPropertyTypeAlias) == false)
{
// check if user is locked out
if (!String.IsNullOrEmpty(_lockPropertyTypeAlias))
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
{
bool isLockedOut = false;
var isLockedOut = false;
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLockedOut);
if (isLockedOut)
{
@@ -447,10 +464,7 @@ namespace umbraco.providers.members
{
throw new MembershipPasswordException("The supplied user is not found");
}
else
{
return m.Password;
}
return m.GetPassword();
}
/// <summary>
@@ -568,7 +582,12 @@ namespace umbraco.providers.members
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
//set the password on the member
m.ChangePassword(
FormatPasswordForStorage(encodedPassword, salt));
FormatPasswordForStorage(encodedPassword, salt));
if (string.IsNullOrEmpty(_lastPasswordChangedPropertyTypeAlias) == false)
{
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
}
return newPassword;
}
@@ -587,7 +606,7 @@ namespace umbraco.providers.members
var m = Member.GetMemberFromLoginName(userName);
if (m != null)
{
UpdateMemberProperty(m, _lockPropertyTypeAlias, false);
UpdateMemberProperty(m, _lockPropertyTypeAlias, 0);
return true;
}
throw new Exception(String.Format("No member with the username '{0}' found", userName));
@@ -597,8 +616,6 @@ namespace umbraco.providers.members
/// <summary>
/// Updates e-mail and potentially approved status, lock status and comment on a user.
/// Note: To automatically support lock, approve and comments you'll need to add references to the membertype properties in the
/// 'Member' element in web.config by adding their aliases to the 'umbracoApprovePropertyTypeAlias', 'umbracoLockPropertyTypeAlias' and 'umbracoCommentPropertyTypeAlias' attributes
/// </summary>
/// <param name="user">A <see cref="T:System.Web.Security.MembershipUser"></see> object that represents the user to update and the updated information for the user.</param>
public override void UpdateUser(MembershipUser user)
@@ -607,10 +624,14 @@ namespace umbraco.providers.members
m.Email = user.Email;
// if supported, update approve status
UpdateMemberProperty(m, _approvedPropertyTypeAlias, user.IsApproved);
UpdateMemberProperty(m, _approvedPropertyTypeAlias, user.IsApproved ? 1 : 0);
// if supported, update lock status
UpdateMemberProperty(m, _lockPropertyTypeAlias, user.IsLockedOut);
UpdateMemberProperty(m, _lockPropertyTypeAlias, user.IsLockedOut ? 1 : 0);
if (user.IsLockedOut)
{
UpdateMemberProperty(m, _lastLockedOutPropertyTypeAlias, DateTime.Now);
}
// if supported, update comment
UpdateMemberProperty(m, _commentPropertyTypeAlias, user.Comment);
@@ -624,8 +645,7 @@ namespace umbraco.providers.members
{
if (m.getProperty(propertyAlias) != null)
{
m.getProperty(propertyAlias).Value =
propertyValue;
m.getProperty(propertyAlias).Value = propertyValue;
}
}
}
@@ -734,7 +754,8 @@ namespace umbraco.providers.members
// lock user?
if (failedAttempts >= MaxInvalidPasswordAttempts)
{
UpdateMemberProperty(updateMemberDataObject, _lockPropertyTypeAlias, true);
UpdateMemberProperty(updateMemberDataObject, _lockPropertyTypeAlias, 1);
UpdateMemberProperty(updateMemberDataObject, _lastLockedOutPropertyTypeAlias, DateTime.Now);
}
updateMemberDataObject.Save();
}
@@ -824,7 +845,8 @@ namespace umbraco.providers.members
{
if (m == null) return null;
var lastLogin = DateTime.Now;
var lastLogin = DateTime.Now;
var lastLocked = DateTime.MinValue;
var isApproved = true;
var isLocked = false;
var comment = "";
@@ -844,6 +866,11 @@ namespace umbraco.providers.members
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
{
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
}
// last locked
if (string.IsNullOrEmpty(_lastLockedOutPropertyTypeAlias) == false)
{
DateTime.TryParse(GetMemberProperty(m, _lastLockedOutPropertyTypeAlias, false), out lastLocked);
}
// comment
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
@@ -856,8 +883,8 @@ namespace umbraco.providers.members
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
}
return new MembershipUser(_providerName, m.LoginName, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDateTime, lastLogin,
DateTime.Now, DateTime.Now, DateTime.Now);
return new MembershipUser(_providerName, m.LoginName, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDateTime, lastLogin,
DateTime.Now, DateTime.Now, lastLocked);
}
/// <summary>
@@ -869,7 +896,8 @@ namespace umbraco.providers.members
{
if (m == null) return null;
var lastLogin = DateTime.Now;
var lastLogin = DateTime.Now;
var lastLocked = DateTime.MinValue;
var isApproved = true;
var isLocked = false;
var comment = "";
@@ -889,6 +917,11 @@ namespace umbraco.providers.members
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
{
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
}
// last locked
if (string.IsNullOrEmpty(_lastLockedOutPropertyTypeAlias) == false)
{
DateTime.TryParse(GetMemberProperty(m, _lastLockedOutPropertyTypeAlias, false), out lastLocked);
}
// comment
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
@@ -901,8 +934,8 @@ namespace umbraco.providers.members
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
}
return new MembershipUser(_providerName, m.Username, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDate, lastLogin,
DateTime.Now, DateTime.Now, DateTime.Now);
return new MembershipUser(_providerName, m.Username, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDate, lastLogin,
DateTime.Now, DateTime.Now, lastLocked);
}
#endregion