[MM-39205] Check that emails match during sign-up (#18635)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e6f36f0649
Коммит
609fea0002
@@ -72,6 +72,11 @@ func (a *App) CreateUserWithToken(c *request.Context, user *model.User, token *m
|
|||||||
return nil, model.NewAppError("CreateUserWithToken", "app.channel.get_channels_by_ids.app_error", nil, nErr.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("CreateUserWithToken", "app.channel.get_channels_by_ids.app_error", nil, nErr.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emailFromToken := tokenData["email"]
|
||||||
|
if emailFromToken != user.Email {
|
||||||
|
return nil, model.NewAppError("CreateUserWithToken", "api.user.create_user.bad_token_email_data.app_error", nil, "", http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
|
||||||
user.Email = tokenData["email"]
|
user.Email = tokenData["email"]
|
||||||
user.EmailVerified = true
|
user.EmailVerified = true
|
||||||
|
|
||||||
|
|||||||
@@ -743,6 +743,18 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
require.NotNil(t, err, "Should fail on bad token type")
|
require.NotNil(t, err, "Should fail on bad token type")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("token extra email does not match provided user data email", func(t *testing.T) {
|
||||||
|
invitationEmail := "attacker@test.com"
|
||||||
|
token := model.NewToken(
|
||||||
|
TokenTypeTeamInvitation,
|
||||||
|
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail}),
|
||||||
|
)
|
||||||
|
|
||||||
|
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||||
|
_, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
||||||
|
require.NotNil(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("expired token", func(t *testing.T) {
|
t.Run("expired token", func(t *testing.T) {
|
||||||
token := model.NewToken(
|
token := model.NewToken(
|
||||||
TokenTypeTeamInvitation,
|
TokenTypeTeamInvitation,
|
||||||
@@ -767,13 +779,14 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("valid regular user request", func(t *testing.T) {
|
t.Run("valid regular user request", func(t *testing.T) {
|
||||||
invitationEmail := model.NewId() + "other-email@test.com"
|
invitationEmail := strings.ToLower(model.NewId()) + "other-email@test.com"
|
||||||
|
u := model.User{Email: invitationEmail, Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||||
token := model.NewToken(
|
token := model.NewToken(
|
||||||
TokenTypeTeamInvitation,
|
TokenTypeTeamInvitation,
|
||||||
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail}),
|
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail}),
|
||||||
)
|
)
|
||||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||||
newUser, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
newUser, err := th.App.CreateUserWithToken(th.Context, &u, token)
|
||||||
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
||||||
assert.False(t, newUser.IsGuest())
|
assert.False(t, newUser.IsGuest())
|
||||||
require.Equal(t, invitationEmail, newUser.Email, "The user email must be the invitation one")
|
require.Equal(t, invitationEmail, newUser.Email, "The user email must be the invitation one")
|
||||||
@@ -787,13 +800,14 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("valid guest request", func(t *testing.T) {
|
t.Run("valid guest request", func(t *testing.T) {
|
||||||
invitationEmail := model.NewId() + "other-email@test.com"
|
invitationEmail := strings.ToLower(model.NewId()) + "other-email@test.com"
|
||||||
token := model.NewToken(
|
token := model.NewToken(
|
||||||
TokenTypeGuestInvitation,
|
TokenTypeGuestInvitation,
|
||||||
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail, "channels": th.BasicChannel.Id}),
|
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail, "channels": th.BasicChannel.Id}),
|
||||||
)
|
)
|
||||||
|
|
||||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||||
guest := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
guest := model.User{Email: invitationEmail, Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||||
newGuest, err := th.App.CreateUserWithToken(th.Context, &guest, token)
|
newGuest, err := th.App.CreateUserWithToken(th.Context, &guest, token)
|
||||||
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
||||||
|
|
||||||
@@ -816,8 +830,8 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}()
|
}()
|
||||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.RestrictCreationToDomains = "restricted.com" })
|
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.RestrictCreationToDomains = "restricted.com" })
|
||||||
forbiddenInvitationEmail := model.NewId() + "other-email@test.com"
|
forbiddenInvitationEmail := strings.ToLower(model.NewId()) + "other-email@test.com"
|
||||||
grantedInvitationEmail := model.NewId() + "other-email@restricted.com"
|
grantedInvitationEmail := strings.ToLower(model.NewId()) + "other-email@restricted.com"
|
||||||
forbiddenDomainToken := model.NewToken(
|
forbiddenDomainToken := model.NewToken(
|
||||||
TokenTypeGuestInvitation,
|
TokenTypeGuestInvitation,
|
||||||
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": forbiddenInvitationEmail, "channels": th.BasicChannel.Id}),
|
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": forbiddenInvitationEmail, "channels": th.BasicChannel.Id}),
|
||||||
@@ -829,7 +843,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
require.NoError(t, th.App.Srv().Store.Token().Save(forbiddenDomainToken))
|
require.NoError(t, th.App.Srv().Store.Token().Save(forbiddenDomainToken))
|
||||||
require.NoError(t, th.App.Srv().Store.Token().Save(grantedDomainToken))
|
require.NoError(t, th.App.Srv().Store.Token().Save(grantedDomainToken))
|
||||||
guest := model.User{
|
guest := model.User{
|
||||||
Email: strings.ToLower(model.NewId()) + "+test@example.com",
|
Email: forbiddenInvitationEmail,
|
||||||
Nickname: "Darth Vader",
|
Nickname: "Darth Vader",
|
||||||
Username: "vader" + model.NewId(),
|
Username: "vader" + model.NewId(),
|
||||||
Password: "passwd1",
|
Password: "passwd1",
|
||||||
@@ -840,6 +854,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
require.Nil(t, newGuest)
|
require.Nil(t, newGuest)
|
||||||
assert.Equal(t, "api.user.create_user.accepted_domain.app_error", err.Id)
|
assert.Equal(t, "api.user.create_user.accepted_domain.app_error", err.Id)
|
||||||
|
|
||||||
|
guest.Email = grantedInvitationEmail
|
||||||
newGuest, err = th.App.CreateUserWithToken(th.Context, &guest, grantedDomainToken)
|
newGuest, err = th.App.CreateUserWithToken(th.Context, &guest, grantedDomainToken)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.True(t, newGuest.IsGuest())
|
assert.True(t, newGuest.IsGuest())
|
||||||
@@ -864,14 +879,14 @@ func TestCreateUserWithToken(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}()
|
}()
|
||||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictCreationToDomains = "restricted.com" })
|
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictCreationToDomains = "restricted.com" })
|
||||||
invitationEmail := model.NewId() + "other-email@test.com"
|
invitationEmail := strings.ToLower(model.NewId()) + "other-email@test.com"
|
||||||
token := model.NewToken(
|
token := model.NewToken(
|
||||||
TokenTypeGuestInvitation,
|
TokenTypeGuestInvitation,
|
||||||
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail, "channels": th.BasicChannel.Id}),
|
model.MapToJSON(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail, "channels": th.BasicChannel.Id}),
|
||||||
)
|
)
|
||||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||||
guest := model.User{
|
guest := model.User{
|
||||||
Email: strings.ToLower(model.NewId()) + "+test@example.com",
|
Email: invitationEmail,
|
||||||
Nickname: "Darth Vader",
|
Nickname: "Darth Vader",
|
||||||
Username: "vader" + model.NewId(),
|
Username: "vader" + model.NewId(),
|
||||||
Password: "passwd1",
|
Password: "passwd1",
|
||||||
|
|||||||
@@ -3871,6 +3871,10 @@
|
|||||||
"id": "api.user.create_user.accepted_domain.app_error",
|
"id": "api.user.create_user.accepted_domain.app_error",
|
||||||
"translation": "The email you provided does not belong to an accepted domain. Please contact your administrator or sign up with a different email."
|
"translation": "The email you provided does not belong to an accepted domain. Please contact your administrator or sign up with a different email."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "api.user.create_user.bad_token_email_data.app_error",
|
||||||
|
"translation": "The email address in the token does not match the one in the user data."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "api.user.create_user.disabled.app_error",
|
"id": "api.user.create_user.disabled.app_error",
|
||||||
"translation": "User creation is disabled."
|
"translation": "User creation is disabled."
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user