Пример #1
0
        public async Task <Status> ChangePassword(ChangePasswordModel changePasswordModel, CancellationToken cancellationToken)
        {
            var user = await _passwordWalletContext.Users.FirstOrDefaultAsync(u => u.Login == changePasswordModel.Login, cancellationToken);

            if (user == null)
            {
                return(CreateStatus(false, string.Format("User with login {0} not exist", changePasswordModel.Login)));
            }

            var function = await _passwordWalletContext.Functions.FirstOrDefaultAsync(x => x.Name == FunctionName.Auth.ChangeMasterPassword, cancellationToken);

            await LogFunction(function.Id, user.Id, cancellationToken);

            var passwordHash = PreapreHashPassword(changePasswordModel.OldPassword, user.Salt, user.IsPasswordKeptAsHash);

            if (passwordHash != user.PasswordHash)
            {
                return(CreateStatus(false, "Wrong old password"));
            }

            try
            {
                var actionList = await _passwordWalletContext.DataChanges
                                 .Where(x => x.UserId == user.Id).ToListAsync();

                if (actionList.Any())
                {
                    _passwordWalletContext.RemoveRange(actionList);
                }

                var memoryCacheKey  = string.Format("Password for {0}", user.Login);
                var newPasswordHash = UpdateUserPassword(changePasswordModel.NewPassword, changePasswordModel.IsPasswordKeptAsHash, user);
                UpdateUserWallet(memoryCacheKey, user.Id, newPasswordHash);

                await _passwordWalletContext.SaveChangesAsync(cancellationToken);

                _memoryCache.Set(memoryCacheKey, newPasswordHash, DateTime.Now.AddMinutes(60));

                return(CreateStatus(true, "Succesfully password change"));
            }
            catch
            {
                return(CreateStatus(false, "Somenthing went wrong"));
            }
        }