[MM-59069] Make sure OTP are actual One Time Password (#28074)
Automatic Merge
Этот коммит содержится в:
@@ -75,40 +75,41 @@ const (
|
||||
// This struct's serializer methods are auto-generated. If a new field is added/removed,
|
||||
// please run make gen-serialized.
|
||||
type User struct {
|
||||
Id string `json:"id"`
|
||||
CreateAt int64 `json:"create_at,omitempty"`
|
||||
UpdateAt int64 `json:"update_at,omitempty"`
|
||||
DeleteAt int64 `json:"delete_at"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password,omitempty"`
|
||||
AuthData *string `json:"auth_data,omitempty"`
|
||||
AuthService string `json:"auth_service"`
|
||||
Email string `json:"email"`
|
||||
EmailVerified bool `json:"email_verified,omitempty"`
|
||||
Nickname string `json:"nickname"`
|
||||
FirstName string `json:"first_name"`
|
||||
LastName string `json:"last_name"`
|
||||
Position string `json:"position"`
|
||||
Roles string `json:"roles"`
|
||||
AllowMarketing bool `json:"allow_marketing,omitempty"`
|
||||
Props StringMap `json:"props,omitempty"`
|
||||
NotifyProps StringMap `json:"notify_props,omitempty"`
|
||||
LastPasswordUpdate int64 `json:"last_password_update,omitempty"`
|
||||
LastPictureUpdate int64 `json:"last_picture_update,omitempty"`
|
||||
FailedAttempts int `json:"failed_attempts,omitempty"`
|
||||
Locale string `json:"locale"`
|
||||
Timezone StringMap `json:"timezone"`
|
||||
MfaActive bool `json:"mfa_active,omitempty"`
|
||||
MfaSecret string `json:"mfa_secret,omitempty"`
|
||||
RemoteId *string `json:"remote_id,omitempty"`
|
||||
LastActivityAt int64 `json:"last_activity_at,omitempty"`
|
||||
IsBot bool `json:"is_bot,omitempty"`
|
||||
BotDescription string `json:"bot_description,omitempty"`
|
||||
BotLastIconUpdate int64 `json:"bot_last_icon_update,omitempty"`
|
||||
TermsOfServiceId string `json:"terms_of_service_id,omitempty"`
|
||||
TermsOfServiceCreateAt int64 `json:"terms_of_service_create_at,omitempty"`
|
||||
DisableWelcomeEmail bool `json:"disable_welcome_email"`
|
||||
LastLogin int64 `json:"last_login,omitempty"`
|
||||
Id string `json:"id"`
|
||||
CreateAt int64 `json:"create_at,omitempty"`
|
||||
UpdateAt int64 `json:"update_at,omitempty"`
|
||||
DeleteAt int64 `json:"delete_at"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password,omitempty"`
|
||||
AuthData *string `json:"auth_data,omitempty"`
|
||||
AuthService string `json:"auth_service"`
|
||||
Email string `json:"email"`
|
||||
EmailVerified bool `json:"email_verified,omitempty"`
|
||||
Nickname string `json:"nickname"`
|
||||
FirstName string `json:"first_name"`
|
||||
LastName string `json:"last_name"`
|
||||
Position string `json:"position"`
|
||||
Roles string `json:"roles"`
|
||||
AllowMarketing bool `json:"allow_marketing,omitempty"`
|
||||
Props StringMap `json:"props,omitempty"`
|
||||
NotifyProps StringMap `json:"notify_props,omitempty"`
|
||||
LastPasswordUpdate int64 `json:"last_password_update,omitempty"`
|
||||
LastPictureUpdate int64 `json:"last_picture_update,omitempty"`
|
||||
FailedAttempts int `json:"failed_attempts,omitempty"`
|
||||
Locale string `json:"locale"`
|
||||
Timezone StringMap `json:"timezone"`
|
||||
MfaActive bool `json:"mfa_active,omitempty"`
|
||||
MfaSecret string `json:"mfa_secret,omitempty"`
|
||||
RemoteId *string `json:"remote_id,omitempty"`
|
||||
LastActivityAt int64 `json:"last_activity_at,omitempty"`
|
||||
IsBot bool `json:"is_bot,omitempty"`
|
||||
BotDescription string `json:"bot_description,omitempty"`
|
||||
BotLastIconUpdate int64 `json:"bot_last_icon_update,omitempty"`
|
||||
TermsOfServiceId string `json:"terms_of_service_id,omitempty"`
|
||||
TermsOfServiceCreateAt int64 `json:"terms_of_service_create_at,omitempty"`
|
||||
DisableWelcomeEmail bool `json:"disable_welcome_email"`
|
||||
LastLogin int64 `json:"last_login,omitempty"`
|
||||
MfaUsedTimestamps StringArray `json:"mfa_used_timestamps,omitempty"`
|
||||
}
|
||||
|
||||
func (u *User) Auditable() map[string]interface{} {
|
||||
@@ -660,6 +661,7 @@ func (u *User) Sanitize(options map[string]bool) {
|
||||
u.Password = ""
|
||||
u.AuthData = NewPointer("")
|
||||
u.MfaSecret = ""
|
||||
u.MfaUsedTimestamps = nil
|
||||
u.LastLogin = 0
|
||||
|
||||
if len(options) != 0 && !options["email"] {
|
||||
@@ -694,6 +696,7 @@ func (u *User) SanitizeInput(isAdmin bool) {
|
||||
u.FailedAttempts = 0
|
||||
u.MfaActive = false
|
||||
u.MfaSecret = ""
|
||||
u.MfaUsedTimestamps = StringArray{}
|
||||
u.Email = strings.TrimSpace(u.Email)
|
||||
u.LastActivityAt = 0
|
||||
}
|
||||
@@ -702,6 +705,7 @@ func (u *User) ClearNonProfileFields(asAdmin bool) {
|
||||
u.Password = ""
|
||||
u.AuthData = NewPointer("")
|
||||
u.MfaSecret = ""
|
||||
u.MfaUsedTimestamps = nil
|
||||
u.EmailVerified = false
|
||||
u.AllowMarketing = false
|
||||
u.LastPasswordUpdate = 0
|
||||
|
||||
@@ -17,8 +17,8 @@ func (z *User) DecodeMsg(dc *msgp.Reader) (err error) {
|
||||
err = msgp.WrapError(err)
|
||||
return
|
||||
}
|
||||
if zb0001 != 34 {
|
||||
err = msgp.ArrayError{Wanted: 34, Got: zb0001}
|
||||
if zb0001 != 35 {
|
||||
err = msgp.ArrayError{Wanted: 35, Got: zb0001}
|
||||
return
|
||||
}
|
||||
z.Id, err = dc.ReadString()
|
||||
@@ -215,13 +215,18 @@ func (z *User) DecodeMsg(dc *msgp.Reader) (err error) {
|
||||
err = msgp.WrapError(err, "LastLogin")
|
||||
return
|
||||
}
|
||||
err = z.MfaUsedTimestamps.DecodeMsg(dc)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, "MfaUsedTimestamps")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// EncodeMsg implements msgp.Encodable
|
||||
func (z *User) EncodeMsg(en *msgp.Writer) (err error) {
|
||||
// array header, size 34
|
||||
err = en.Append(0xdc, 0x0, 0x22)
|
||||
// array header, size 35
|
||||
err = en.Append(0xdc, 0x0, 0x23)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -409,14 +414,19 @@ func (z *User) EncodeMsg(en *msgp.Writer) (err error) {
|
||||
err = msgp.WrapError(err, "LastLogin")
|
||||
return
|
||||
}
|
||||
err = z.MfaUsedTimestamps.EncodeMsg(en)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, "MfaUsedTimestamps")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MarshalMsg implements msgp.Marshaler
|
||||
func (z *User) MarshalMsg(b []byte) (o []byte, err error) {
|
||||
o = msgp.Require(b, z.Msgsize())
|
||||
// array header, size 34
|
||||
o = append(o, 0xdc, 0x0, 0x22)
|
||||
// array header, size 35
|
||||
o = append(o, 0xdc, 0x0, 0x23)
|
||||
o = msgp.AppendString(o, z.Id)
|
||||
o = msgp.AppendInt64(o, z.CreateAt)
|
||||
o = msgp.AppendInt64(o, z.UpdateAt)
|
||||
@@ -471,6 +481,11 @@ func (z *User) MarshalMsg(b []byte) (o []byte, err error) {
|
||||
o = msgp.AppendInt64(o, z.TermsOfServiceCreateAt)
|
||||
o = msgp.AppendBool(o, z.DisableWelcomeEmail)
|
||||
o = msgp.AppendInt64(o, z.LastLogin)
|
||||
o, err = z.MfaUsedTimestamps.MarshalMsg(o)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, "MfaUsedTimestamps")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -482,8 +497,8 @@ func (z *User) UnmarshalMsg(bts []byte) (o []byte, err error) {
|
||||
err = msgp.WrapError(err)
|
||||
return
|
||||
}
|
||||
if zb0001 != 34 {
|
||||
err = msgp.ArrayError{Wanted: 34, Got: zb0001}
|
||||
if zb0001 != 35 {
|
||||
err = msgp.ArrayError{Wanted: 35, Got: zb0001}
|
||||
return
|
||||
}
|
||||
z.Id, bts, err = msgp.ReadStringBytes(bts)
|
||||
@@ -678,6 +693,11 @@ func (z *User) UnmarshalMsg(bts []byte) (o []byte, err error) {
|
||||
err = msgp.WrapError(err, "LastLogin")
|
||||
return
|
||||
}
|
||||
bts, err = z.MfaUsedTimestamps.UnmarshalMsg(bts)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, "MfaUsedTimestamps")
|
||||
return
|
||||
}
|
||||
o = bts
|
||||
return
|
||||
}
|
||||
@@ -696,7 +716,7 @@ func (z *User) Msgsize() (s int) {
|
||||
} else {
|
||||
s += msgp.StringPrefixSize + len(*z.RemoteId)
|
||||
}
|
||||
s += msgp.Int64Size + msgp.BoolSize + msgp.StringPrefixSize + len(z.BotDescription) + msgp.Int64Size + msgp.StringPrefixSize + len(z.TermsOfServiceId) + msgp.Int64Size + msgp.BoolSize + msgp.Int64Size
|
||||
s += msgp.Int64Size + msgp.BoolSize + msgp.StringPrefixSize + len(z.BotDescription) + msgp.Int64Size + msgp.StringPrefixSize + len(z.TermsOfServiceId) + msgp.Int64Size + msgp.BoolSize + msgp.Int64Size + z.MfaUsedTimestamps.Msgsize()
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -332,6 +332,7 @@ func TestUserSanitizeInput(t *testing.T) {
|
||||
user.EmailVerified = true
|
||||
user.FailedAttempts = 10
|
||||
user.LastActivityAt = GetMillis()
|
||||
user.MfaUsedTimestamps = StringArray{"1234", "4566"}
|
||||
|
||||
user.SanitizeInput(false)
|
||||
|
||||
@@ -347,6 +348,7 @@ func TestUserSanitizeInput(t *testing.T) {
|
||||
require.Equal(t, int64(0), user.LastPictureUpdate)
|
||||
require.Equal(t, int64(0), user.LastActivityAt)
|
||||
require.Equal(t, 0, user.FailedAttempts)
|
||||
require.Equal(t, StringArray{}, user.MfaUsedTimestamps)
|
||||
|
||||
// these fields should remain intact
|
||||
require.Equal(t, "user@example.com", user.Email)
|
||||
|
||||
@@ -41,8 +41,11 @@ const (
|
||||
|
||||
var ErrMaxPropSizeExceeded = fmt.Errorf("max prop size of %d exceeded", maxPropSizeBytes)
|
||||
|
||||
//msgp:ignore StringInterface StringSet
|
||||
type StringInterface map[string]any
|
||||
type StringSet map[string]struct{}
|
||||
|
||||
//msgp:tuple StringArray
|
||||
type StringArray []string
|
||||
|
||||
func (ss StringSet) Has(val string) bool {
|
||||
@@ -228,6 +231,7 @@ func AppErrorInit(t i18n.TranslateFunc) {
|
||||
})
|
||||
}
|
||||
|
||||
//msgp:ignore AppError
|
||||
type AppError struct {
|
||||
Id string `json:"id"`
|
||||
Message string `json:"message"` // Message to be display to the end user without debugging information
|
||||
|
||||
93
server/public/model/utils_serial_gen.go
Обычный файл
93
server/public/model/utils_serial_gen.go
Обычный файл
@@ -0,0 +1,93 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package model
|
||||
|
||||
// Code generated by github.com/tinylib/msgp DO NOT EDIT.
|
||||
|
||||
import (
|
||||
"github.com/tinylib/msgp/msgp"
|
||||
)
|
||||
|
||||
// DecodeMsg implements msgp.Decodable
|
||||
func (z *StringArray) DecodeMsg(dc *msgp.Reader) (err error) {
|
||||
var zb0002 uint32
|
||||
zb0002, err = dc.ReadArrayHeader()
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err)
|
||||
return
|
||||
}
|
||||
if cap((*z)) >= int(zb0002) {
|
||||
(*z) = (*z)[:zb0002]
|
||||
} else {
|
||||
(*z) = make(StringArray, zb0002)
|
||||
}
|
||||
for zb0001 := range *z {
|
||||
(*z)[zb0001], err = dc.ReadString()
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, zb0001)
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// EncodeMsg implements msgp.Encodable
|
||||
func (z StringArray) EncodeMsg(en *msgp.Writer) (err error) {
|
||||
err = en.WriteArrayHeader(uint32(len(z)))
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err)
|
||||
return
|
||||
}
|
||||
for zb0003 := range z {
|
||||
err = en.WriteString(z[zb0003])
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, zb0003)
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MarshalMsg implements msgp.Marshaler
|
||||
func (z StringArray) MarshalMsg(b []byte) (o []byte, err error) {
|
||||
o = msgp.Require(b, z.Msgsize())
|
||||
o = msgp.AppendArrayHeader(o, uint32(len(z)))
|
||||
for zb0003 := range z {
|
||||
o = msgp.AppendString(o, z[zb0003])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// UnmarshalMsg implements msgp.Unmarshaler
|
||||
func (z *StringArray) UnmarshalMsg(bts []byte) (o []byte, err error) {
|
||||
var zb0002 uint32
|
||||
zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err)
|
||||
return
|
||||
}
|
||||
if cap((*z)) >= int(zb0002) {
|
||||
(*z) = (*z)[:zb0002]
|
||||
} else {
|
||||
(*z) = make(StringArray, zb0002)
|
||||
}
|
||||
for zb0001 := range *z {
|
||||
(*z)[zb0001], bts, err = msgp.ReadStringBytes(bts)
|
||||
if err != nil {
|
||||
err = msgp.WrapError(err, zb0001)
|
||||
return
|
||||
}
|
||||
}
|
||||
o = bts
|
||||
return
|
||||
}
|
||||
|
||||
// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message
|
||||
func (z StringArray) Msgsize() (s int) {
|
||||
s = msgp.ArrayHeaderSize
|
||||
for zb0003 := range z {
|
||||
s += msgp.StringPrefixSize + len(z[zb0003])
|
||||
}
|
||||
return
|
||||
}
|
||||
Ссылка в новой задаче
Block a user