[MM-59069] Make sure OTP are actual One Time Password (#28074)
Automatic Merge
Этот коммит содержится в:
@@ -15,6 +15,7 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/mattermost/mattermost/server/public/plugin/plugintest/mock"
|
||||
"github.com/mattermost/mattermost/server/v8/channels/store/storetest/mocks"
|
||||
)
|
||||
@@ -156,12 +157,49 @@ func TestDeactivate(t *testing.T) {
|
||||
|
||||
func TestValidateToken(t *testing.T) {
|
||||
t.Run("fail on wrongly formatted token", func(t *testing.T) {
|
||||
id := model.NewId()
|
||||
secret := newRandomBase32String(mfaSecretSize)
|
||||
ok, err := New(nil).ValidateToken(secret, "invalid-token")
|
||||
u := &model.User{Id: id, MfaSecret: secret}
|
||||
|
||||
usMock := mocks.UserStore{}
|
||||
usMock.On("GetMfaUsedTimestamps", u.Id).Return([]int{}, nil).Once()
|
||||
ok, err := New(&usMock).ValidateToken(u, "invalid-token")
|
||||
require.Error(t, err)
|
||||
require.False(t, ok)
|
||||
require.Contains(t, err.Error(), "unable to parse the token")
|
||||
})
|
||||
|
||||
t.Run("successful validation", func(t *testing.T) {
|
||||
id := model.NewId()
|
||||
secret := newRandomBase32String(mfaSecretSize)
|
||||
u := &model.User{Id: id, MfaSecret: secret}
|
||||
|
||||
code := fmt.Sprintf("%06d", dgoogauth.ComputeCode(secret, time.Now().UTC().Unix()/30))
|
||||
|
||||
usMock := mocks.UserStore{}
|
||||
usMock.On("GetMfaUsedTimestamps", u.Id).Return([]int{}, nil).Once()
|
||||
usMock.On("StoreMfaUsedTimestamps", u.Id, mock.AnythingOfType("[]int")).Return(nil).Once()
|
||||
|
||||
ok, err := New(&usMock).ValidateToken(u, code)
|
||||
require.NoError(t, err)
|
||||
require.True(t, ok)
|
||||
})
|
||||
|
||||
t.Run("disallow reuse of totp", func(t *testing.T) {
|
||||
id := model.NewId()
|
||||
secret := newRandomBase32String(mfaSecretSize)
|
||||
u := &model.User{Id: id, MfaSecret: secret}
|
||||
|
||||
t0 := time.Now().UTC().Unix() / 30
|
||||
code := fmt.Sprintf("%06d", dgoogauth.ComputeCode(secret, t0))
|
||||
|
||||
usMock := mocks.UserStore{}
|
||||
usMock.On("GetMfaUsedTimestamps", u.Id).Return([]int{int(t0)}, nil).Once()
|
||||
|
||||
ok, err := New(&usMock).ValidateToken(u, code)
|
||||
require.False(t, ok)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestRandomBase32String(t *testing.T) {
|
||||
|
||||
Ссылка в новой задаче
Block a user