GH-11465 Migrate User.UpdateMfaSecret to Sync by default (#11496)
* GH-11465 Migrate User.UpdateMfaSecret to Sync by default * GH-11465 make mfa call async * GH-11465 return *model.AppError directly
Этот коммит содержится в:
коммит произвёл
Joram Wilander
родитель
eea8df75b0
Коммит
b55b9a3d97
@@ -2118,8 +2118,8 @@ func TestUserLoginMFAFlow(t *testing.T) {
|
|||||||
t.Fatal(result.Err)
|
t.Fatal(result.Err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if result := <-th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret); result.Err != nil {
|
if err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret); err != nil {
|
||||||
t.Fatal(result.Err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password)
|
user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password)
|
||||||
@@ -2150,8 +2150,8 @@ func TestUserLoginMFAFlow(t *testing.T) {
|
|||||||
t.Fatal(result.Err)
|
t.Fatal(result.Err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if result := <-th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret); result.Err != nil {
|
if err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret); err != nil {
|
||||||
t.Fatal(result.Err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
code := dgoogauth.ComputeCode(secret.Secret, time.Now().UTC().Unix()/30)
|
code := dgoogauth.ComputeCode(secret.Secret, time.Now().UTC().Unix()/30)
|
||||||
|
|||||||
@@ -70,8 +70,8 @@ func (m *Mfa) GenerateSecret(user *model.User) (string, []byte, *model.AppError)
|
|||||||
|
|
||||||
img := code.PNG()
|
img := code.PNG()
|
||||||
|
|
||||||
if result := <-m.Store.User().UpdateMfaSecret(user.Id, secret); result.Err != nil {
|
if err := m.Store.User().UpdateMfaSecret(user.Id, secret); err != nil {
|
||||||
return "", nil, model.NewAppError("GenerateQrCode", "mfa.generate_qr_code.save_secret.app_error", nil, result.Err.Error(), http.StatusInternalServerError)
|
return "", nil, model.NewAppError("GenerateQrCode", "mfa.generate_qr_code.save_secret.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
return secret, img, nil
|
return secret, img, nil
|
||||||
@@ -112,14 +112,18 @@ func (m *Mfa) Deactivate(userId string) *model.AppError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
achan := m.Store.User().UpdateMfaActive(userId, false)
|
achan := m.Store.User().UpdateMfaActive(userId, false)
|
||||||
schan := m.Store.User().UpdateMfaSecret(userId, "")
|
schan := make(chan *model.AppError, 1)
|
||||||
|
go func() {
|
||||||
|
schan <- m.Store.User().UpdateMfaSecret(userId, "")
|
||||||
|
close(schan)
|
||||||
|
}()
|
||||||
|
|
||||||
if result := <-achan; result.Err != nil {
|
if result := <-achan; result.Err != nil {
|
||||||
return model.NewAppError("Deactivate", "mfa.deactivate.save_active.app_error", nil, result.Err.Error(), http.StatusInternalServerError)
|
return model.NewAppError("Deactivate", "mfa.deactivate.save_active.app_error", nil, result.Err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
if result := <-schan; result.Err != nil {
|
if err := <-schan; err != nil {
|
||||||
return model.NewAppError("Deactivate", "mfa.deactivate.save_secret.app_error", nil, result.Err.Error(), http.StatusInternalServerError)
|
return model.NewAppError("Deactivate", "mfa.deactivate.save_secret.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
|
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
"github.com/mattermost/mattermost-server/plugin/plugintest/mock"
|
"github.com/mattermost/mattermost-server/plugin/plugintest/mock"
|
||||||
"github.com/mattermost/mattermost-server/store"
|
|
||||||
"github.com/mattermost/mattermost-server/store/storetest/mocks"
|
"github.com/mattermost/mattermost-server/store/storetest/mocks"
|
||||||
"github.com/mattermost/mattermost-server/utils/testutils"
|
"github.com/mattermost/mattermost-server/utils/testutils"
|
||||||
|
|
||||||
@@ -26,11 +25,8 @@ func TestGenerateSecret(t *testing.T) {
|
|||||||
configService := testutils.StaticConfigService{Cfg: &config}
|
configService := testutils.StaticConfigService{Cfg: &config}
|
||||||
storeMock := mocks.Store{}
|
storeMock := mocks.Store{}
|
||||||
userStoreMock := mocks.UserStore{}
|
userStoreMock := mocks.UserStore{}
|
||||||
userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) store.StoreChannel {
|
userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) *model.AppError {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
return nil
|
||||||
result.Data = nil
|
|
||||||
result.Err = nil
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
storeMock.On("User").Return(&userStoreMock)
|
storeMock.On("User").Return(&userStoreMock)
|
||||||
|
|
||||||
|
|||||||
@@ -302,16 +302,14 @@ func (us SqlUserStore) UpdateAuthData(userId string, service string, authData *s
|
|||||||
return userId, nil
|
return userId, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (us SqlUserStore) UpdateMfaSecret(userId, secret string) store.StoreChannel {
|
func (us SqlUserStore) UpdateMfaSecret(userId, secret string) *model.AppError {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
updateAt := model.GetMillis()
|
||||||
updateAt := model.GetMillis()
|
|
||||||
|
|
||||||
if _, err := us.GetMaster().Exec("UPDATE Users SET MfaSecret = :Secret, UpdateAt = :UpdateAt WHERE Id = :UserId", map[string]interface{}{"Secret": secret, "UpdateAt": updateAt, "UserId": userId}); err != nil {
|
if _, err := us.GetMaster().Exec("UPDATE Users SET MfaSecret = :Secret, UpdateAt = :UpdateAt WHERE Id = :UserId", map[string]interface{}{"Secret": secret, "UpdateAt": updateAt, "UserId": userId}); err != nil {
|
||||||
result.Err = model.NewAppError("SqlUserStore.UpdateMfaSecret", "store.sql_user.update_mfa_secret.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError)
|
return model.NewAppError("SqlUserStore.UpdateMfaSecret", "store.sql_user.update_mfa_secret.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError)
|
||||||
} else {
|
}
|
||||||
result.Data = userId
|
|
||||||
}
|
return nil
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (us SqlUserStore) UpdateMfaActive(userId string, active bool) store.StoreChannel {
|
func (us SqlUserStore) UpdateMfaActive(userId string, active bool) store.StoreChannel {
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ type UserStore interface {
|
|||||||
UpdateUpdateAt(userId string) StoreChannel
|
UpdateUpdateAt(userId string) StoreChannel
|
||||||
UpdatePassword(userId, newPassword string) StoreChannel
|
UpdatePassword(userId, newPassword string) StoreChannel
|
||||||
UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError)
|
UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError)
|
||||||
UpdateMfaSecret(userId, secret string) StoreChannel
|
UpdateMfaSecret(userId, secret string) *model.AppError
|
||||||
UpdateMfaActive(userId string, active bool) StoreChannel
|
UpdateMfaActive(userId string, active bool) StoreChannel
|
||||||
Get(id string) (*model.User, *model.AppError)
|
Get(id string) (*model.User, *model.AppError)
|
||||||
GetAll() StoreChannel
|
GetAll() StoreChannel
|
||||||
|
|||||||
@@ -1036,15 +1036,15 @@ func (_m *UserStore) UpdateMfaActive(userId string, active bool) store.StoreChan
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UpdateMfaSecret provides a mock function with given fields: userId, secret
|
// UpdateMfaSecret provides a mock function with given fields: userId, secret
|
||||||
func (_m *UserStore) UpdateMfaSecret(userId string, secret string) store.StoreChannel {
|
func (_m *UserStore) UpdateMfaSecret(userId string, secret string) *model.AppError {
|
||||||
ret := _m.Called(userId, secret)
|
ret := _m.Called(userId, secret)
|
||||||
|
|
||||||
var r0 store.StoreChannel
|
var r0 *model.AppError
|
||||||
if rf, ok := ret.Get(0).(func(string, string) store.StoreChannel); ok {
|
if rf, ok := ret.Get(0).(func(string, string) *model.AppError); ok {
|
||||||
r0 = rf(userId, secret)
|
r0 = rf(userId, secret)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(store.StoreChannel)
|
r0 = ret.Get(0).(*model.AppError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1916,12 +1916,12 @@ func testUserStoreUpdateMfaSecret(t *testing.T, ss store.Store) {
|
|||||||
|
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
if err := (<-ss.User().UpdateMfaSecret(u1.Id, "12345")).Err; err != nil {
|
if err := ss.User().UpdateMfaSecret(u1.Id, "12345"); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// should pass, no update will occur though
|
// should pass, no update will occur though
|
||||||
if err := (<-ss.User().UpdateMfaSecret("junk", "12345")).Err; err != nil {
|
if err := ss.User().UpdateMfaSecret("junk", "12345"); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user