[MM-59069] Make sure OTP are actual One Time Password (#28074)
Automatic Merge
Этот коммит содержится в:
@@ -861,6 +861,36 @@ func (_m *UserStore) GetMany(ctx context.Context, ids []string) ([]*model.User,
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMfaUsedTimestamps provides a mock function with given fields: userID
|
||||
func (_m *UserStore) GetMfaUsedTimestamps(userID string) ([]int, error) {
|
||||
ret := _m.Called(userID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for GetMfaUsedTimestamps")
|
||||
}
|
||||
|
||||
var r0 []int
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string) ([]int, error)); ok {
|
||||
return rf(userID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string) []int); ok {
|
||||
r0 = rf(userID)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]int)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
||||
r1 = rf(userID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetNewUsersForTeam provides a mock function with given fields: teamID, offset, limit, viewRestrictions
|
||||
func (_m *UserStore) GetNewUsersForTeam(teamID string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
|
||||
ret := _m.Called(teamID, offset, limit, viewRestrictions)
|
||||
@@ -1884,6 +1914,24 @@ func (_m *UserStore) SearchWithoutTeam(term string, options *model.UserSearchOpt
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// StoreMfaUsedTimestamps provides a mock function with given fields: userID, ts
|
||||
func (_m *UserStore) StoreMfaUsedTimestamps(userID string, ts []int) error {
|
||||
ret := _m.Called(userID, ts)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for StoreMfaUsedTimestamps")
|
||||
}
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func(string, []int) error); ok {
|
||||
r0 = rf(userID, ts)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// Update provides a mock function with given fields: rctx, user, allowRoleUpdate
|
||||
func (_m *UserStore) Update(rctx request.CTX, user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) {
|
||||
ret := _m.Called(rctx, user, allowRoleUpdate)
|
||||
|
||||
@@ -101,6 +101,7 @@ func TestUserStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
||||
t.Run("GetUsersWithInvalidEmails", func(t *testing.T) { testGetUsersWithInvalidEmails(t, rctx, ss) })
|
||||
t.Run("UpdateLastLogin", func(t *testing.T) { testUpdateLastLogin(t, rctx, ss) })
|
||||
t.Run("GetUserReport", func(t *testing.T) { testGetUserReport(t, rctx, ss, s) })
|
||||
t.Run("MfaUsedTimestamps", func(t *testing.T) { testMfaUsedTimestamps(t, rctx, ss) })
|
||||
}
|
||||
|
||||
func testUserStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
@@ -6613,3 +6614,24 @@ func testGetUserReport(t *testing.T, rctx request.CTX, ss store.Store, s SqlStor
|
||||
require.Len(t, userReport, 11)
|
||||
})
|
||||
}
|
||||
|
||||
func testMfaUsedTimestamps(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
u1, err := ss.User().Save(rctx, &model.User{
|
||||
Email: "ben@invalid.mattermost.com",
|
||||
Username: "u1" + model.NewId(),
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
defer func() { require.NoError(t, ss.User().PermanentDelete(rctx, u1.Id)) }()
|
||||
|
||||
tss, err := ss.User().GetMfaUsedTimestamps(u1.Id)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, tss)
|
||||
|
||||
err = ss.User().StoreMfaUsedTimestamps(u1.Id, []int{1, 2, 3})
|
||||
require.NoError(t, err)
|
||||
|
||||
tss, err = ss.User().GetMfaUsedTimestamps(u1.Id)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []int{1, 2, 3}, tss)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user