using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Logging; using Umbraco.Cms.Core.Models.Security; using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Web; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web.Common.Filters; using Umbraco.Web.Routing; namespace Umbraco.Web.Website.Controllers { public class UmbRegisterController : SurfaceController { private readonly IUmbracoWebsiteSecurityAccessor _websiteSecurityAccessor; public UmbRegisterController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, IProfilingLogger profilingLogger, IPublishedUrlProvider publishedUrlProvider, IUmbracoWebsiteSecurityAccessor websiteSecurityAccessor) : base(umbracoContextAccessor, databaseFactory, services, appCaches, profilingLogger, publishedUrlProvider) { _websiteSecurityAccessor = websiteSecurityAccessor; } [HttpPost] [ValidateAntiForgeryToken] [ValidateUmbracoFormRouteString] public async Task HandleRegisterMember([Bind(Prefix = "registerModel")]RegisterModel model) { if (ModelState.IsValid == false) { return CurrentUmbracoPage(); } // U4-10762 Server error with "Register Member" snippet (Cannot save member with empty name) // If name field is empty, add the email address instead. if (string.IsNullOrEmpty(model.Name) && string.IsNullOrEmpty(model.Email) == false) { model.Name = model.Email; } var result = await _websiteSecurityAccessor.WebsiteSecurity.RegisterMemberAsync(model, model.LoginOnSuccess); switch (result) { case RegisterMemberStatus.Success: TempData["FormSuccess"] = true; // If there is a specified path to redirect to then use it. if (model.RedirectUrl.IsNullOrWhiteSpace() == false) { return Redirect(model.RedirectUrl); } // Redirect to current page by default. return RedirectToCurrentUmbracoPage(); case RegisterMemberStatus.InvalidUserName: ModelState.AddModelError((model.UsernameIsEmail || model.Username == null) ? "registerModel.Email" : "registerModel.Username", "Username is not valid"); break; case RegisterMemberStatus.InvalidPassword: ModelState.AddModelError("registerModel.Password", "The password is not strong enough"); break; case RegisterMemberStatus.InvalidEmail: ModelState.AddModelError("registerModel.Email", "Email is invalid"); break; case RegisterMemberStatus.DuplicateUserName: ModelState.AddModelError((model.UsernameIsEmail || model.Username == null) ? "registerModel.Email" : "registerModel.Username", "A member with this username already exists."); break; case RegisterMemberStatus.DuplicateEmail: ModelState.AddModelError("registerModel.Email", "A member with this e-mail address already exists"); break; case RegisterMemberStatus.Error: // Don't add a field level error, just model level. ModelState.AddModelError("registerModel", $"An error occurred creating the member: {result}"); break; default: throw new ArgumentOutOfRangeException(); } return CurrentUmbracoPage(); } } }