diff --git a/app/authentication.go b/app/authentication.go index c16e08615f..c5c4ebf907 100644 --- a/app/authentication.go +++ b/app/authentication.go @@ -51,8 +51,8 @@ func (a *App) CheckPasswordAndAllCriteria(user *model.User, password string, mfa } if err := a.checkUserPassword(user, password); err != nil { - if result := <-a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); result.Err != nil { - return result.Err + if passErr := a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { + return passErr } return err } @@ -61,15 +61,15 @@ func (a *App) CheckPasswordAndAllCriteria(user *model.User, password string, mfa // If the mfaToken is not set, we assume the client used this as a pre-flight request to query the server // about the MFA state of the user in question if mfaToken != "" { - if result := <-a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); result.Err != nil { - return result.Err + if passErr := a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { + return passErr } } return err } - if result := <-a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, 0); result.Err != nil { - return result.Err + if passErr := a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, 0); passErr != nil { + return passErr } if err := a.CheckUserPostflightAuthenticationCriteria(user); err != nil { @@ -86,14 +86,14 @@ func (a *App) DoubleCheckPassword(user *model.User, password string) *model.AppE } if err := a.checkUserPassword(user, password); err != nil { - if result := <-a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); result.Err != nil { - return result.Err + if passErr := a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { + return passErr } return err } - if result := <-a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, 0); result.Err != nil { - return result.Err + if passErr := a.Srv.Store.User().UpdateFailedPasswordAttempts(user.Id, 0); passErr != nil { + return passErr } return nil diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index d53955afae..abd5ec62b0 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -255,14 +255,12 @@ func (us SqlUserStore) UpdatePassword(userId, hashedPassword string) store.Store }) } -func (us SqlUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - if _, err := us.GetMaster().Exec("UPDATE Users SET FailedAttempts = :FailedAttempts WHERE Id = :UserId", map[string]interface{}{"FailedAttempts": attempts, "UserId": userId}); err != nil { - result.Err = model.NewAppError("SqlUserStore.UpdateFailedPasswordAttempts", "store.sql_user.update_failed_pwd_attempts.app_error", nil, "user_id="+userId, http.StatusInternalServerError) - } else { - result.Data = userId - } - }) +func (us SqlUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { + if _, err := us.GetMaster().Exec("UPDATE Users SET FailedAttempts = :FailedAttempts WHERE Id = :UserId", map[string]interface{}{"FailedAttempts": attempts, "UserId": userId}); err != nil { + return model.NewAppError("SqlUserStore.UpdateFailedPasswordAttempts", "store.sql_user.update_failed_pwd_attempts.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + } + + return nil } func (us SqlUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { diff --git a/store/store.go b/store/store.go index 8f50e71c79..2d4bf4873c 100644 --- a/store/store.go +++ b/store/store.go @@ -282,7 +282,7 @@ type UserStore interface { VerifyEmail(userId, email string) (string, *model.AppError) GetEtagForAllProfiles() string GetEtagForProfiles(teamId string) string - UpdateFailedPasswordAttempts(userId string, attempts int) StoreChannel + UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) PermanentDelete(userId string) *model.AppError AnalyticsActiveCount(time int64) (int64, *model.AppError) diff --git a/store/storetest/mocks/UserStore.go b/store/storetest/mocks/UserStore.go index ea399aec69..10dd6e41a7 100644 --- a/store/storetest/mocks/UserStore.go +++ b/store/storetest/mocks/UserStore.go @@ -1072,15 +1072,15 @@ func (_m *UserStore) UpdateAuthData(userId string, service string, authData *str } // UpdateFailedPasswordAttempts provides a mock function with given fields: userId, attempts -func (_m *UserStore) UpdateFailedPasswordAttempts(userId string, attempts int) store.StoreChannel { +func (_m *UserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { ret := _m.Called(userId, attempts) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string, int) store.StoreChannel); ok { + var r0 *model.AppError + if rf, ok := ret.Get(0).(func(string, int) *model.AppError); ok { r0 = rf(userId, attempts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(*model.AppError) } } diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index 0dec6d2555..cf1a0a6f43 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -235,7 +235,7 @@ func testUserStoreUpdateFailedPasswordAttempts(t *testing.T, ss store.Store) { defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) - if err := (<-ss.User().UpdateFailedPasswordAttempts(u1.Id, 3)).Err; err != nil { + if err := ss.User().UpdateFailedPasswordAttempts(u1.Id, 3); err != nil { t.Fatal(err) }