diff --git a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs index 62d644d1d..f7d78bee6 100644 --- a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs +++ b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs @@ -152,6 +152,39 @@ namespace Orchard.Tests.Modules.Users.Controllers { Assert.That(result, Is.TypeOf()); } + [Test] + public void UsersShouldNotBeAbleToRegisterIfInvalidEmail() { + + var registrationSettings = _container.Resolve().GetContext().CurrentSite.As(); + registrationSettings.UsersCanRegister = true; + registrationSettings.UsersAreModerated = false; + registrationSettings.UsersMustValidateEmail = false; + + _session.Flush(); + + _controller.ModelState.Clear(); + var result = _controller.Register("bar", "notanemailaddress", "66554321", "66554321"); + + Assert.That(((ViewResult)result).ViewData.ModelState.Count == 1,"Invalid email address."); + } + + [Test] + public void UsersShouldBeAbleToRegisterIfValidEmail() { + + var registrationSettings = _container.Resolve().GetContext().CurrentSite.As(); + registrationSettings.UsersCanRegister = true; + registrationSettings.UsersAreModerated = false; + registrationSettings.UsersMustValidateEmail = false; + + _session.Flush(); + + _controller.ModelState.Clear(); + var result = _controller.Register("bar", "t@t.com", "password", "password"); + + Assert.That(result, Is.TypeOf()); + Assert.That(((RedirectResult)result).Url, Is.EqualTo("~/")); + } + [Test] public void RegisteredUserShouldBeRedirectedToHomePage() { diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 8fe28191c..cbf8d0b68 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -110,7 +110,7 @@ namespace Orchard.Modules.Controllers { try { _reportsCoordinator.Register("Data Migration", "Upgrade " + id, "Orchard installation"); _dataMigrationManager.Update(id); - Services.Notifier.Information(T("The feature {0} was updated succesfuly", id)); + Services.Notifier.Information(T("The feature {0} was updated successfully", id)); } catch (Exception ex) { Services.Notifier.Error(T("An error occured while updating the feature {0}: {1}", id, ex.Message)); diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs index 7da36e3f0..b135cc68d 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs @@ -1,4 +1,5 @@ using System; +using System.Text.RegularExpressions; using System.Diagnostics.CodeAnalysis; using Orchard.Localization; using System.Security.Principal; @@ -317,6 +318,8 @@ namespace Orchard.Users.Controllers { private bool ValidateRegistration(string userName, string email, string password, string confirmPassword) { bool validate = true; + Regex isValidEmail = new Regex("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$"); + if (String.IsNullOrEmpty(userName)) { ModelState.AddModelError("username", T("You must specify a username.")); validate = false; @@ -326,6 +329,11 @@ namespace Orchard.Users.Controllers { validate = false; } + if (!isValidEmail.IsMatch(email)) { + ModelState.AddModelError("email", T("You must specify a valid email address.")); + validate = false; + } + if (!validate) return false; diff --git a/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserCreateViewModel.cs b/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserCreateViewModel.cs index 331f46b5c..b7bb6c00b 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserCreateViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserCreateViewModel.cs @@ -7,6 +7,7 @@ namespace Orchard.Users.ViewModels { public string UserName { get; set; } [Required, DataType(DataType.EmailAddress)] + [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$")] public string Email { get; set; } [Required, DataType(DataType.Password)] diff --git a/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserEditViewModel.cs b/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserEditViewModel.cs index 991ad0cee..5dd9aa8f4 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserEditViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/ViewModels/UserEditViewModel.cs @@ -11,6 +11,7 @@ namespace Orchard.Users.ViewModels { } [Required] + [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$")] public string Email { get { return User.As().Record.Email; } set { User.As().Record.Email = value; } diff --git a/src/Orchard/Mvc/Extensions/RouteExtension.cs b/src/Orchard/Mvc/Extensions/RouteExtension.cs new file mode 100644 index 000000000..cac69c3ce --- /dev/null +++ b/src/Orchard/Mvc/Extensions/RouteExtension.cs @@ -0,0 +1,29 @@ +using System.Web.Routing; +using System.Web.Mvc; + +namespace Orchard.Mvc.Extensions { + public static class RouteExtension{ + public static string GetAreaName(this RouteBase route){ + var routeWithArea = route as IRouteWithArea; + if (routeWithArea != null) { + return routeWithArea.Area; + } + + var castRoute = route as Route; + if (castRoute != null && castRoute.DataTokens != null) { + return castRoute.DataTokens["area"] as string; + } + + return null; + } + + public static string GetAreaName(this RouteData routeData){ + object area; + if (routeData.DataTokens.TryGetValue("area", out area)) { + return area as string; + } + + return GetAreaName(routeData.Route); + } + } +} diff --git a/src/Orchard/Mvc/OrchardControllerFactory.cs b/src/Orchard/Mvc/OrchardControllerFactory.cs index e0330a326..6bf9c2d78 100644 --- a/src/Orchard/Mvc/OrchardControllerFactory.cs +++ b/src/Orchard/Mvc/OrchardControllerFactory.cs @@ -4,6 +4,7 @@ using System.Web.Routing; using Autofac; using Autofac.Core; using Autofac.Features.Metadata; +using Orchard.Mvc.Extensions; namespace Orchard.Mvc { public interface IControllerType { @@ -30,7 +31,7 @@ namespace Orchard.Mvc { var routeData = requestContext.RouteData; // Determine the area name for the request, and fall back to stock orchard controllers - var areaName = GetAreaName(routeData); + var areaName = routeData.GetAreaName(); // Service name pattern matches the identification strategy var serviceKey = (areaName + "/" + controllerName).ToLowerInvariant(); @@ -57,27 +58,5 @@ namespace Orchard.Mvc { return null; } - public static string GetAreaName(RouteBase route) { - var routeWithArea = route as IRouteWithArea; - if (routeWithArea != null) { - return routeWithArea.Area; - } - - var castRoute = route as Route; - if (castRoute != null && castRoute.DataTokens != null) { - return castRoute.DataTokens["area"] as string; - } - - return null; - } - - public static string GetAreaName(RouteData routeData) { - object area; - if (routeData.DataTokens.TryGetValue("area", out area)) { - return area as string; - } - - return GetAreaName(routeData.Route); - } } } \ No newline at end of file diff --git a/src/Orchard/Mvc/Routes/ShellRoute.cs b/src/Orchard/Mvc/Routes/ShellRoute.cs index f8e5a540b..54882834e 100644 --- a/src/Orchard/Mvc/Routes/ShellRoute.cs +++ b/src/Orchard/Mvc/Routes/ShellRoute.cs @@ -7,6 +7,7 @@ using System.Web.SessionState; using Autofac; using Orchard.Environment; using Orchard.Environment.Configuration; +using Orchard.Mvc.Extensions; namespace Orchard.Mvc.Routes { @@ -25,15 +26,7 @@ namespace Orchard.Mvc.Routes { if (!string.IsNullOrEmpty(_shellSettings.RequestUrlPrefix)) _urlPrefix = new UrlPrefix(_shellSettings.RequestUrlPrefix); - var routeWithArea = route as IRouteWithArea; - if (routeWithArea != null) { - Area = routeWithArea.Area; - } - - var routeWithDataTokens = route as Route; - if ((routeWithDataTokens != null) && (routeWithDataTokens.DataTokens != null)) { - Area = (routeWithDataTokens.DataTokens["area"] as string); - } + Area = route.GetAreaName(); } public string ShellSettingsName { get { return _shellSettings.Name; } } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index d31c9d6e9..1ac7c12cc 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -186,6 +186,7 @@ +