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));
        }
Example #2
0
        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));
        }