Exemplo n.º 1
0
        public void ResendActivationCode(string username)
        {
            var user = _userReadRepository.Get(username, false);

            if (user == null)
            {
                throw new CustomException("Unknown username", UserErrorCodes.UnknownUserError);
            }

            user.AssertState("Resend activate code", UserStatuses.PendingActivation);

            var candidate = _candidateReadRepository.Get(user.EntityId);

            var currentDateTime = DateTime.Now;
            var expiry          = currentDateTime.AddDays(_activationCodeExpiryDays);

            if (!string.IsNullOrEmpty(user.ActivationCode) && (user.ActivateCodeExpiry > currentDateTime))
            {
                // Reuse existing token and set new expiry date
                user.PasswordResetCodeExpiry = expiry;
            }
            else
            {
                // generate new code and set expiry date
                var activationCode = _codeGenerator.GenerateAlphaNumeric();
                user.SetStatePendingActivation(activationCode, expiry);
            }

            _userWriteRepository.Save(user);

            SendActivationCode(candidate, user.ActivationCode);
        }
Exemplo n.º 2
0
        public void SendPasswordResetCode(string username)
        {
            var user = _userReadRepository.Get(username, false);

            if (user == null)
            {
                _logger.Info(string.Format("Cannot send password reset code, username not found: \"{0}\".", username));
                return;
            }

            var candidate = _candidateReadRepository.Get(user.EntityId);

            var currentDateTime = DateTime.Now;
            var expiry          = currentDateTime.AddDays(_passwordResetCodeExpiryDays);

            string passwordResetCode;

            if (!string.IsNullOrEmpty(user.PasswordResetCode) && (user.PasswordResetCodeExpiry > currentDateTime))
            {
                // Reuse existing token and set new expiry date
                passwordResetCode = user.PasswordResetCode;
            }
            else
            {
                // generate new code and send
                passwordResetCode = _codeGenerator.GenerateAlphaNumeric();
            }

            user.SetStatePasswordResetCode(passwordResetCode, expiry);
            _userWriteRepository.Save(user);

            // Send Password Reset Code
            SendPasswordResetCodeViaCommunicationService(candidate, user.PasswordResetCode);
        }
Exemplo n.º 3
0
        public Candidate RegisterCandidate(Candidate newCandidate, string password)
        {
            var username       = newCandidate.RegistrationDetails.EmailAddress;
            var activationCode = _codeGenerator.GenerateAlphaNumeric();

            var user = _userReadRepository.Get(username, false);

            if (user == null)
            {
                // Process registration for brand new username
                var newCandidateId = Guid.NewGuid();

                _authenticationService.CreateUser(newCandidateId, password);
                _userAccountService.Register(username, newCandidateId, activationCode, UserRoles.Candidate);

                return(SaveAndNotifyCandidate(newCandidateId, newCandidate, activationCode));
            }

            user.AssertState("Register candidate", UserStatuses.PendingActivation);

            if (user.ActivateCodeExpiry != null && user.ActivateCodeExpiry > DateTime.Now)
            {
                // Process existing username in unexpired pending activation status
                return(SaveAndNotifyCandidate(user.EntityId, newCandidate, user.ActivationCode));
            }

            // Process existing username in an expired pending activation status
            _authenticationService.ResetUserPassword(user.EntityId, password);
            _userAccountService.Register(username, user.EntityId, activationCode, UserRoles.Candidate);

            return(SaveAndNotifyCandidate(user.EntityId, newCandidate, activationCode));
        }
        public void UpdateUsername(Guid userId, string newUsername)
        {
            var user = _userReadRepository.Get(userId);

            user.PendingUsername     = newUsername;
            user.PendingUsernameCode = _codeGenerator.GenerateAlphaNumeric();
            _userWriteRepository.Save(user);
        }
Exemplo n.º 5
0
        public void LockUser(User user)
        {
            // Create and set an unlock code, set code expiry, save user, send email containing unlock code.
            var unlockCodeExpiryDays = _userAccountConfiguration.UnlockCodeExpiryDays;

            var accountUnlockCode = _codeGenerator.GenerateAlphaNumeric();
            var expiry            = DateTime.UtcNow.AddDays(unlockCodeExpiryDays);

            user.SetStateLocked(accountUnlockCode, expiry);
            _userWriteRepository.Save(user);
        }
        private void SendPendingUsernameCodeViaCommunicationService(User user, Candidate candidate)
        {
            // Pending username code never expires: if user has one, use it.
            var pendingUsernameCode = string.IsNullOrEmpty(user.PendingUsernameCode)
                ? _codeGenerator.GenerateAlphaNumeric()
                : user.PendingUsernameCode;

            _communicationService.SendMessageToCandidate(candidate.EntityId, MessageTypes.SendPendingUsernameCode,
                                                         new[]
            {
                new CommunicationToken(CommunicationTokens.CandidateFirstName, candidate.RegistrationDetails.FirstName),
                new CommunicationToken(CommunicationTokens.UserPendingUsername, user.PendingUsername),
                new CommunicationToken(CommunicationTokens.UserPendingUsernameCode, pendingUsernameCode)
            });
        }
Exemplo n.º 7
0
        public void SendEmailVerificationCode(string username)
        {
            var providerUser = _providerUserReadRepository.GetByUsername(username);

            if (providerUser == null)
            {
                throw new CustomException("Unknown username", ErrorCodes.UnknownUserError);
            }

            // ReSharper disable once RedundantArgumentDefaultValue
            providerUser.EmailVerificationCode = _codeGenerator.GenerateAlphaNumeric(EmailVerificationCodeLength);

            _providerUserWriteRepository.Update(providerUser);

            _communicationService.SendMessageToProviderUser(username, MessageTypes.SendProviderUserEmailVerificationCode,
                                                            new[]
            {
                new CommunicationToken(CommunicationTokens.ProviderUserUsername, providerUser.Username),
                new CommunicationToken(CommunicationTokens.ProviderUserEmailVerificationCode, providerUser.EmailVerificationCode)
            });
        }
Exemplo n.º 8
0
        protected override async Task HandleCore(ResendActivationCodeCommand message)
        {
            _logger.Debug($"Received ResendActivationCodeCommand for user '{message.UserId}'");

            var validationResult = await _commandValidator.ValidateAsync(message);

            if (!validationResult.IsValid())
            {
                throw new InvalidRequestException(validationResult.ValidationDictionary);
            }

            var user = await _userRepository.GetById(message.UserId);

            if (user == null)
            {
                throw new InvalidRequestException(new Dictionary <string, string> {
                    { "UserNotFound", "User not found" }
                });
            }

            if (!user.IsActive)
            {
                if (!user.SecurityCodes.Any(sc => sc.CodeType == Domain.SecurityCodeType.AccessCode && sc.ExpiryTime >= DateTime.Now))
                {
                    user.AddSecurityCode(new Domain.SecurityCode
                    {
                        Code       = _codeGenerator.GenerateAlphaNumeric(),
                        CodeType   = Domain.SecurityCodeType.AccessCode,
                        ExpiryTime = DateTime.Today.AddDays(8).AddSeconds(-1),
                        ReturnUrl  = user.SecurityCodes.OrderByDescending(sc => sc.ExpiryTime).FirstOrDefault(sc => sc.CodeType == Domain.SecurityCodeType.AccessCode)?.ReturnUrl
                    });
                    await _userRepository.Update(user);
                }

                await _auditService.WriteAudit(new ResendActivationCodeAuditMessage(user));

                await _communicationService.ResendActivationCodeMessage(user, Guid.NewGuid().ToString());
            }
        }
        public async Task <RequestChangeEmailCommandResponse> Handle(RequestChangeEmailCommand message)
        {
            var validationResult = await _validator.ValidateAsync(message);

            if (!validationResult.IsValid())
            {
                throw new InvalidRequestException(validationResult.ValidationDictionary);
            }

            var user = await _userRepository.GetById(message.UserId);

            if (user == null)
            {
                throw new InvalidRequestException(new Dictionary <string, string> {
                    { "", "Cannot find user" }
                });
            }

            var securityCode = new Domain.SecurityCode
            {
                Code         = _codeGenerator.GenerateAlphaNumeric(),
                CodeType     = Domain.SecurityCodeType.ConfirmEmailCode,
                ExpiryTime   = DateTime.UtcNow.AddDays(1),
                ReturnUrl    = message.ReturnUrl,
                PendingValue = message.NewEmailAddress
            };

            user.AddSecurityCode(securityCode);
            await _userRepository.Update(user);

            await _communicationService.SendConfirmEmailChangeMessage(user, Guid.NewGuid().ToString());

            await _auditService.WriteAudit(new RequestChangeEmailAuditMessage(user, securityCode));

            return(new RequestChangeEmailCommandResponse()
            {
                SecurityCode = securityCode.Code
            });
        }
        private User Create(RegisterUserCommand message, SecuredPassword securedPassword)
        {
            var user = new User
            {
                Id            = message.Id,
                Email         = message.Email,
                SecurityCodes = new[]
                {
                    new SecurityCode
                    {
                        Code       = _codeGenerator.GenerateAlphaNumeric(),
                        CodeType   = SecurityCodeType.AccessCode,
                        ExpiryTime = DateTime.Today.AddDays(8).AddSeconds(-1),
                        ReturnUrl  = message.ReturnUrl
                    }
                }
            };

            Update(user, message, securedPassword);

            return(user);
        }
        protected override async Task HandleCore(RequestPasswordResetCodeCommand message)
        {
            _logger.Debug($"Received RequestPasswordResetCodeCommand for user '{message.Email}'");

            var validationResult = await _validator.ValidateAsync(message);

            if (!validationResult.IsValid())
            {
                throw new InvalidRequestException(validationResult.ValidationDictionary);
            }

            var existingUser = await _userRepository.GetByEmailAddress(message.Email);

            if (existingUser == null)
            {
                _logger.Info($"Request to reset email for unknown email address : '{message.Email}'");
                return;
            }

            if (RequiresPasswordResetCode(existingUser))
            {
                existingUser.AddSecurityCode(new SecurityCode
                {
                    Code       = _codeGenerator.GenerateAlphaNumeric(),
                    CodeType   = SecurityCodeType.PasswordResetCode,
                    ExpiryTime = DateTimeProvider.Current.UtcNow.AddDays(1),
                    ReturnUrl  = message.ReturnUrl
                });

                await _userRepository.Update(existingUser);
            }

            await _auditService.WriteAudit(new PasswordResetCodeAuditMessage(existingUser));

            await _communicationService.SendPasswordResetCodeMessage(existingUser, Guid.NewGuid().ToString(), _linkBuilder.GetForgottenPasswordUrl(_hashingService.HashValue(Guid.Parse(existingUser.Id))));
        }
Exemplo n.º 12
0
        private async Task <string> GenerateCode()
        {
            var codeLength = (await GetConfig())?.UnlockCodeLength ?? 6;

            return(_codeGenerator.GenerateAlphaNumeric(codeLength));
        }