Skip to content

Commit 0cc2675

Browse files
johanvdwlunnyzeripath
authored
Fix ldap loginname (#18789)
* Use email_address table to check user's email when login with email adress * Update services/auth/signin.go * Fix test * Fix test * Fix logging in with ldap username != loginname * Fix if user does not exist yet * Make more clear this is loginName * Fix formatting Co-authored-by: Lunny Xiao <[email protected]> Co-authored-by: zeripath <[email protected]>
1 parent 1ab88da commit 0cc2675

File tree

4 files changed

+25
-8
lines changed

4 files changed

+25
-8
lines changed

integrations/signin_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ func TestSignin(t *testing.T) {
5151
{username: "wrongUsername", password: "password", message: i18n.Tr("en", "form.username_password_incorrect")},
5252
{username: "user15", password: "wrongPassword", message: i18n.Tr("en", "form.username_password_incorrect")},
5353
{username: "[email protected]", password: "wrongPassword", message: i18n.Tr("en", "form.username_password_incorrect")},
54-
// test for duplicate email
55-
{username: "[email protected]", password: "password", message: i18n.Tr("en", "form.email_been_used")},
5654
}
5755

5856
for _, s := range samples {

models/user/user_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,20 @@ func TestCreateUserInvalidEmail(t *testing.T) {
235235
assert.True(t, IsErrEmailInvalid(err))
236236
}
237237

238+
func TestCreateUserEmailAlreadyUsed(t *testing.T) {
239+
assert.NoError(t, unittest.PrepareTestDatabase())
240+
241+
user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
242+
243+
// add new user with user2's email
244+
user.Name = "testuser"
245+
user.LowerName = strings.ToLower(user.Name)
246+
user.ID = 0
247+
err := CreateUser(user)
248+
assert.Error(t, err)
249+
assert.True(t, IsErrEmailAlreadyUsed(err))
250+
}
251+
238252
func TestGetUserIDsByNames(t *testing.T) {
239253
assert.NoError(t, unittest.PrepareTestDatabase())
240254

services/auth/signin.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,18 @@ import (
2424
func UserSignIn(username, password string) (*user_model.User, *auth.Source, error) {
2525
var user *user_model.User
2626
if strings.Contains(username, "@") {
27-
user = &user_model.User{Email: strings.ToLower(strings.TrimSpace(username))}
27+
emailAddress := user_model.EmailAddress{LowerEmail: strings.ToLower(strings.TrimSpace(username))}
2828
// check same email
29-
cnt, err := db.Count(user)
29+
has, err := db.GetEngine(db.DefaultContext).Where("is_activated=?", true).Get(&emailAddress)
3030
if err != nil {
3131
return nil, nil, err
3232
}
33-
if cnt > 1 {
34-
return nil, nil, user_model.ErrEmailAlreadyUsed{
33+
if !has {
34+
return nil, nil, user_model.ErrEmailAddressNotExist{
3535
Email: user.Email,
3636
}
3737
}
38+
user = &user_model.User{ID: emailAddress.UID}
3839
} else {
3940
trimmedUsername := strings.TrimSpace(username)
4041
if len(trimmedUsername) == 0 {

services/auth/source/ldap/source_authenticate.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ import (
2020
// Authenticate queries if login/password is valid against the LDAP directory pool,
2121
// and create a local user if success when enabled.
2222
func (source *Source) Authenticate(user *user_model.User, userName, password string) (*user_model.User, error) {
23-
sr := source.SearchEntry(userName, password, source.authSource.Type == auth.DLDAP)
23+
loginName := userName
24+
if user != nil {
25+
loginName = user.LoginName
26+
}
27+
sr := source.SearchEntry(loginName, password, source.authSource.Type == auth.DLDAP)
2428
if sr == nil {
2529
// User not in LDAP, do nothing
26-
return nil, user_model.ErrUserNotExist{Name: userName}
30+
return nil, user_model.ErrUserNotExist{Name: loginName}
2731
}
2832

2933
isAttributeSSHPublicKeySet := len(strings.TrimSpace(source.AttributeSSHPublicKey)) > 0

0 commit comments

Comments
 (0)