diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs index 8d2e3f3ad..21c17d087 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs @@ -126,6 +126,10 @@ namespace Orchard.Users.Controllers { } ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); var shape = _orchardServices.New.Register(); @@ -143,6 +147,10 @@ namespace Orchard.Users.Controllers { } ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); if (ValidateRegistration(userName, email, password, confirmPassword)) { // Attempt to register the user @@ -224,6 +232,10 @@ namespace Orchard.Users.Controllers { public ActionResult ChangePassword() { var membershipSettings = _membershipService.GetSettings(); ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); ViewData["InvalidateOnPasswordChange"] = _orchardServices.WorkContext .CurrentSite.As() @@ -241,6 +253,10 @@ namespace Orchard.Users.Controllers { public ActionResult ChangePassword(string currentPassword, string newPassword, string confirmPassword) { var membershipSettings = _membershipService.GetSettings(); ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); ViewData["InvalidateOnPasswordChange"] = _orchardServices.WorkContext .CurrentSite.As() .ShouldInvalidateAuthOnPasswordChanged; @@ -268,7 +284,11 @@ namespace Orchard.Users.Controllers { var viewModel = _orchardServices.New.ViewModel( Username: username, - PasswordLength: membershipSettings.GetMinimumPasswordLength()); + PasswordLength: membershipSettings.GetMinimumPasswordLength(), + LowercaseRequirement: membershipSettings.GetPasswordLowercaseRequirement(), + UppercaseRequirement: membershipSettings.GetPasswordUppercaseRequirement(), + SpecialCharacterRequirement: membershipSettings.GetPasswordSpecialRequirement(), + NumberRequirement: membershipSettings.GetPasswordNumberRequirement()); return View(viewModel); } @@ -278,7 +298,11 @@ namespace Orchard.Users.Controllers { var membershipSettings = _membershipService.GetSettings(); var viewModel = _orchardServices.New.ViewModel( Username: username, - PasswordLength: membershipSettings.GetMinimumPasswordLength()); + PasswordLength: membershipSettings.GetMinimumPasswordLength(), + LowercaseRequirement: membershipSettings.GetPasswordLowercaseRequirement(), + UppercaseRequirement: membershipSettings.GetPasswordUppercaseRequirement(), + SpecialCharacterRequirement: membershipSettings.GetPasswordSpecialRequirement(), + NumberRequirement: membershipSettings.GetPasswordNumberRequirement()); if (!ValidateChangePassword(currentPassword, newPassword, confirmPassword)) { return View(viewModel); @@ -326,7 +350,10 @@ namespace Orchard.Users.Controllers { var membershipSettings = _membershipService.GetSettings(); ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); - + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); return View(); } @@ -341,6 +368,10 @@ namespace Orchard.Users.Controllers { var membershipSettings = _membershipService.GetSettings(); ViewData["PasswordLength"] = membershipSettings.GetMinimumPasswordLength(); + ViewData["LowercaseRequirement"] = membershipSettings.GetPasswordLowercaseRequirement(); + ViewData["UppercaseRequirement"] = membershipSettings.GetPasswordUppercaseRequirement(); + ViewData["SpecialCharacterRequirement"] = membershipSettings.GetPasswordSpecialRequirement(); + ViewData["NumberRequirement"] = membershipSettings.GetPasswordNumberRequirement(); ValidatePassword(newPassword); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Extensions/MembershipSettingsExtensions.cs b/src/Orchard.Web/Modules/Orchard.Users/Extensions/MembershipSettingsExtensions.cs index 3b95cdaca..a8cb23034 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Extensions/MembershipSettingsExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Extensions/MembershipSettingsExtensions.cs @@ -3,5 +3,17 @@ public static int GetMinimumPasswordLength(this IMembershipSettings membershipSettings) { return membershipSettings.EnableCustomPasswordPolicy ? membershipSettings.MinimumPasswordLength : 7; } + public static bool GetPasswordLowercaseRequirement(this IMembershipSettings membershipSettings) { + return membershipSettings.EnableCustomPasswordPolicy ? membershipSettings.EnablePasswordLowercaseRequirement : false; + } + public static bool GetPasswordUppercaseRequirement(this IMembershipSettings membershipSettings) { + return membershipSettings.EnableCustomPasswordPolicy ? membershipSettings.EnablePasswordUppercaseRequirement : false; + } + public static bool GetPasswordNumberRequirement(this IMembershipSettings membershipSettings) { + return membershipSettings.EnableCustomPasswordPolicy ? membershipSettings.EnablePasswordNumberRequirement : false; + } + public static bool GetPasswordSpecialRequirement(this IMembershipSettings membershipSettings) { + return membershipSettings.EnableCustomPasswordPolicy ? membershipSettings.EnablePasswordSpecialRequirement : false; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangeExpiredPassword.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangeExpiredPassword.cshtml index dee4a0aca..d606cfd68 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangeExpiredPassword.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangeExpiredPassword.cshtml @@ -1,7 +1,28 @@ @model dynamic +@{ + var requirementsMessage = T.Plural("The password can't be empty", "Passwords are required to be a minimum of {0} characters in length", (int)Model.PasswordLength).Text; + var additionalRequirementsMessage = new List(); + if ((bool)Model.LowercaseRequirement) { + additionalRequirementsMessage.Add(T("one lowercase letter").Text); + } + if ((bool)Model.UppercaseRequirement) { + additionalRequirementsMessage.Add(T("one uppercase letter").Text); + } + if ((bool)Model.NumberRequirement) { + additionalRequirementsMessage.Add(T("one number").Text); + } + if ((bool)Model.SpecialCharacterRequirement) { + additionalRequirementsMessage.Add(T("one special character").Text); + } + if (additionalRequirementsMessage.Count() > 0) { + requirementsMessage = T("{0} and must contain at least {1}", requirementsMessage, string.Join(", ", additionalRequirementsMessage)).Text; + } + requirementsMessage += "."; +} +

@Html.TitleForPage(T("Change Expired Password"))

@T("Your password has expired. Use the form below to change your password.")

-

@T.Plural("The password can't be empty.", "Passwords are required to be a minimum of {0} characters in length.", (int)Model.PasswordLength)

+

@requirementsMessage

@Html.ValidationSummary(T("Password change was unsuccessful. Please correct the errors and try again.").Text) @using (Html.BeginFormAntiForgeryPost()) {
diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangePassword.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangePassword.cshtml index adb305d9e..184ff226f 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangePassword.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/ChangePassword.cshtml @@ -1,31 +1,51 @@ @model dynamic +@{ + var requirementsMessage = T.Plural("The password can't be empty", "Passwords are required to be a minimum of {0} characters in length", (int)ViewData["PasswordLength"]).Text; + var additionalRequirementsMessage = new List(); + if ((bool)ViewData["LowercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one lowercase letter").Text); + } + if ((bool)ViewData["UppercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one uppercase letter").Text); + } + if ((bool)ViewData["NumberRequirement"]) { + additionalRequirementsMessage.Add(T("one number").Text); + } + if ((bool)ViewData["SpecialCharacterRequirement"]) { + additionalRequirementsMessage.Add(T("one special character").Text); + } + if (additionalRequirementsMessage.Count() > 0) { + requirementsMessage = T("{0} and must contain at least {1}", requirementsMessage, string.Join(", ", additionalRequirementsMessage)).Text; + } + requirementsMessage += "."; +}

@Html.TitleForPage(T("Change Password").ToString())

@T("Use the form below to change your password.")

-

@T.Plural("The password can't be empty.", "New passwords are required to be a minimum of {0} characters in length.", (int)ViewData["PasswordLength"])

+

@requirementsMessage

@if ((bool)ViewData["InvalidateOnPasswordChange"]) {

@T("After changing the password you will be required to login anew.")

} @Html.ValidationSummary(T("Password change was unsuccessful. Please correct the errors and try again.").ToString()) -@using (Html.BeginFormAntiForgeryPost()) { +@using (Html.BeginFormAntiForgeryPost()) {
@T("Account Information") -
+
- @Html.Password("currentPassword") - @Html.ValidationMessage("currentPassword") -
+ @Html.Password("currentPassword") + @Html.ValidationMessage("currentPassword") +
- @Html.Password("newPassword") - @Html.ValidationMessage("newPassword") + @Html.Password("newPassword") + @Html.ValidationMessage("newPassword")
- @Html.Password("confirmPassword") - @Html.ValidationMessage("confirmPassword") + @Html.Password("confirmPassword") + @Html.ValidationMessage("confirmPassword")
- } \ No newline at end of file +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/LostPassword.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/LostPassword.cshtml index f48b76de8..9d3f1a045 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/Account/LostPassword.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/Account/LostPassword.cshtml @@ -1,23 +1,43 @@ @model dynamic +@{ + var requirementsMessage = T.Plural("The password can't be empty", "Passwords are required to be a minimum of {0} characters in length", (int)ViewData["PasswordLength"]).Text; + var additionalRequirementsMessage = new List(); + if ((bool)ViewData["LowercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one lowercase letter").Text); + } + if ((bool)ViewData["UppercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one uppercase letter").Text); + } + if ((bool)ViewData["NumberRequirement"]) { + additionalRequirementsMessage.Add(T("one number").Text); + } + if ((bool)ViewData["SpecialCharacterRequirement"]) { + additionalRequirementsMessage.Add(T("one special character").Text); + } + if (additionalRequirementsMessage.Count() > 0) { + requirementsMessage = T("{0} and must contain at least {1}", requirementsMessage, string.Join(", ", additionalRequirementsMessage)).Text; + } + requirementsMessage += "."; +}

@Html.TitleForPage(T("Change Password").ToString())

@T("Use the form below to change your password.")

-

@T.Plural("The password can't be empty.", "New passwords are required to be a minimum of {0} characters in length.", (int)ViewData["PasswordLength"])

+

@requirementsMessage

@Html.ValidationSummary(T("Password change was unsuccessful. Please correct the errors and try again.").ToString()) -@using (Html.BeginFormAntiForgeryPost()) { +@using (Html.BeginFormAntiForgeryPost()) {
@T("Account Information")
- @Html.Password("newPassword") - @Html.ValidationMessage("newPassword") + @Html.Password("newPassword") + @Html.ValidationMessage("newPassword")
- @Html.Password("confirmPassword") - @Html.ValidationMessage("confirmPassword") + @Html.Password("confirmPassword") + @Html.ValidationMessage("confirmPassword")
- } \ No newline at end of file +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Views/Register.cshtml b/src/Orchard.Web/Modules/Orchard.Users/Views/Register.cshtml index c3a2a9978..fbb182914 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Views/Register.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Users/Views/Register.cshtml @@ -1,32 +1,52 @@ -

@Html.TitleForPage(T("Create a New Account").ToString())

+@{ + var requirementsMessage = T.Plural("The password can't be empty", "Passwords are required to be a minimum of {0} characters in length", (int)ViewData["PasswordLength"]).Text; + var additionalRequirementsMessage = new List(); + if ((bool)ViewData["LowercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one lowercase letter").Text); + } + if ((bool)ViewData["UppercaseRequirement"]) { + additionalRequirementsMessage.Add(T("one uppercase letter").Text); + } + if ((bool)ViewData["NumberRequirement"]) { + additionalRequirementsMessage.Add(T("one number").Text); + } + if ((bool)ViewData["SpecialCharacterRequirement"]) { + additionalRequirementsMessage.Add(T("one special character").Text); + } + if (additionalRequirementsMessage.Count() > 0) { + requirementsMessage = T("{0} and must contain at least {1}", requirementsMessage, string.Join(", ", additionalRequirementsMessage)).Text; + } + requirementsMessage += "."; +} +

@Html.TitleForPage(T("Create a New Account").ToString())

@T("Use the form below to create a new account.")

-

@T.Plural("The password can't be empty.", "Passwords are required to be a minimum of {0} characters in length.", (int)ViewData["PasswordLength"])

-@Html.ValidationSummary(T("Account creation was unsuccessful. Please correct the errors and try again.").ToString()) -@using (Html.BeginFormAntiForgeryPost(Url.Action("Register", new { ReturnUrl = Request.QueryString["ReturnUrl"] }))) { +

@requirementsMessage

+@Html.ValidationSummary(T("Account creation was unsuccessful. Please correct the errors and try again.").ToString()) +@using (Html.BeginFormAntiForgeryPost(Url.Action("Register", new { ReturnUrl = Request.QueryString["ReturnUrl"] }))) {
@T("Account Information")
- @Html.TextBox("username") - @Html.ValidationMessage("username") + @Html.TextBox("username") + @Html.ValidationMessage("username")
- @Html.TextBox("email") + @Html.TextBox("email") @Html.ValidationMessage("email")
- @Html.Password("password") - @Html.ValidationMessage("password") + @Html.Password("password") + @Html.ValidationMessage("password")
- @Html.Password("confirmPassword") - @Html.ValidationMessage("confirmPassword") + @Html.Password("confirmPassword") + @Html.ValidationMessage("confirmPassword")
- } \ No newline at end of file +} \ No newline at end of file