public async Task Given_ValidSubmissionData_When_ChangeEmailAddressPost_Then_SavesEmailsAndPendingViewReturned() { // Arrange var model = new ChangeEmailAddressViewModel(TestUserName, null, null) { NewEmailAddress = "*****@*****.**" }; UserIdentity.Expect(e => e.GetUserId(Arg <Controller> .Is.Anything)).Return(TestUserId); _userManager.Expect(a => a.TryLogOnAsync(Arg <string> .Is.Anything, Arg <string> .Is.Anything)).Return(Task.FromResult(new LogonResult { Success = true })); // Act var result = await _sut.ChangeEmailAddressAsync(model); // Assert AssertViewResultReturned(result, "ChangeEmailAddressPending"); _services.AssertWasCalled(a => a.SendEmail(Arg <string> .Is.Anything, Arg <List <string> > .Is.Anything, Arg <List <string> > .Is.Anything, Arg <List <string> > .Is.Anything, Arg <string> .Is.Anything, Arg <string> .Is.Anything, Arg <bool> .Is.Anything)); Context.AssertWasCalled(a => a.SaveChanges()); var user = Context.User.Include("UserLogs").First(a => a.Id == TestUserId); Assert.IsFalse(string.IsNullOrEmpty(user.NewEmailAddressToken)); Assert.IsNotNull(user.NewEmailAddressRequestExpiryDateUtc); Assert.IsFalse(string.IsNullOrEmpty(user.NewEmailAddress)); }
public async Task <ActionResult> ChangeEmailAddressAsync(ChangeEmailAddressViewModel model) { var userId = UserIdentity.GetUserId(this); var user = _context.User.FirstOrDefault(u => u.Id == userId && u.Enabled && u.EmailVerified && u.Approved); AppSensor.ValidateFormData(this, new List <string> { "NewEmailAddress", "Password" }); if (user == null) { return(HttpNotFound()); } if (ModelState.IsValid) { if (_context.User.Any(a => a.Id != user.Id && model.NewEmailAddress == a.UserName)) { ModelState.AddModelError("NewEmailAddress", "This email address is already in use"); Logger.Information("Failed Account ChangeEmailAddress Post, Username already exists"); } else { var logonResult = await _userManager.TryLogOnAsync(UserIdentity.GetUserName(this), model.Password); if (logonResult.Success) { user.NewEmailAddressToken = Guid.NewGuid().ToString().Replace("-", ""); user.NewEmailAddressRequestExpiryDateUtc = DateTime.UtcNow.AddMinutes(15); user.NewEmailAddress = model.NewEmailAddress; // Send change username with link to recover password form string emailBody = EmailTemplates.ChangeEmailAddressPendingBodyText(user.FirstName, user.LastName, _configuration.ApplicationName, _configuration.WebsiteBaseUrl, user.NewEmailAddressToken); string emailSubject = $"{_configuration.ApplicationName} - Complete the change email address process"; _services.SendEmail(_configuration.DefaultFromEmailAddress, new List <string>() { user.UserName }, null, null, emailSubject, emailBody, true); user.UserLogs.Add(new UserLog { Description = $"Change email address request started to change from {user.UserName} to {user.NewEmailAddress}" }); await _context.SaveChangesAsync(); return(View("ChangeEmailAddressPending")); } else { Logger.Information("Failed Account ChangeEmailAddress Post, Password incorrect by requester {@requester}", UserIdentity.GetRequester(this, AppSensorDetectionPointKind.Ae1)); ModelState.AddModelError("Password", "The password is not correct"); } } } else { AppSensor.InspectModelStateErrors(this); } return(View("ChangeEmailAddress", new ChangeEmailAddressViewModel(user.UserName, user.NewEmailAddress, user.NewEmailAddressRequestExpiryDateUtc))); }
public async Task <ActionResult> ChangeEmailAddress(ChangeEmailAddressViewModel model) { var userId = _userIdentity.GetUserId(this); var user = _context.User.Where(u => u.Id == userId && u.Enabled && u.EmailVerified && u.Approved).FirstOrDefault(); _appSensor.ValidateFormData(this, new List <string>() { "NewEmailAddress", "Password" }); if (ModelState.IsValid) { var logonResult = await _userManager.TryLogOnAsync(_userIdentity.GetUserName(this), model.Password); if (logonResult.Success) { if (user != null) { user.NewEmailAddressToken = Guid.NewGuid().ToString().Replace("-", ""); user.NewEmailAddressRequestExpiryDate = DateTime.UtcNow.AddMinutes(15); user.NewEmailAddress = model.NewEmailAddress; // Send change username with link to recover password form string emailBody = EmailTemplates.ChangeEmailAddressPendingBodyText(user.FirstName, user.LastName, _configuration.ApplicationName, _configuration.WebsiteBaseUrl, user.NewEmailAddressToken); string emailSubject = string.Format("{0} - Complete the change email address process", _configuration.ApplicationName); _services.SendEmail(_configuration.DefaultFromEmailAddress, new List <string>() { user.UserName }, null, null, emailSubject, emailBody, true); user.UserLogs.Add(new UserLog() { Description = string.Format("Change email address request started to change from {0} to {1}", user.UserName, user.NewEmailAddress) }); _context.SaveChanges(); return(View("ChangeEmailAddressPending")); } } else { Logger.Information("Failed Account ChangeEmailAddress Post, Password incorrect by requester {@requester}", _userIdentity.GetRequester(this, Core.Constants.AppSensorDetectionPointKind.AE1)); ModelState.AddModelError("Password", "The password is not correct"); } } else { _appSensor.InspectModelStateErrors(this); } return(View(new ChangeEmailAddressViewModel(user.UserName, user.NewEmailAddress, user.NewEmailAddressRequestExpiryDate))); }
public async Task <ActionResult> ChangeEmailAddress(ChangeEmailAddressViewModel model) { if (!ModelState.IsValid) { return(View(model)); } var result = await UserManager.SetEmailAsync(Guid.Parse(User.Identity.GetUserId()), model.EmailAddress); if (result.Succeeded) { var user = await UserManager.FindByIdAsync(Guid.Parse(User.Identity.GetUserId())); if (user != null) { await SignInManager.SignInAsync(user, isPersistent : false, rememberBrowser : false); } return(RedirectToAction("ProfileInfo")); } AddErrors(result); return(View(model)); }
public async Task Given_EmailAddressInUse_When_ChangeEmailAddressPost_Then_SavesEmailsAndPendingViewReturned() { // Arrange Context.User.Add(new User { UserName = "******" }); var model = new ChangeEmailAddressViewModel(TestUserName, null, null) { NewEmailAddress = "*****@*****.**" }; UserIdentity.Expect(e => e.GetUserId(Arg <Controller> .Is.Anything)).Return(TestUserId); // Act var result = await _sut.ChangeEmailAddressAsync(model); // Assert AssertViewResultReturned(result, "ChangeEmailAddress"); AssertViewResultWithError(result, "This email address is already in use"); Context.AssertWasNotCalled(a => a.SaveChanges()); var user = Context.User.First(a => a.Id == TestUserId); Assert.IsTrue(string.IsNullOrEmpty(user.NewEmailAddress)); }