diff --git a/pkg/services/user/model.go b/pkg/services/user/model.go index 5a51644c9fb..71c9f57d602 100644 --- a/pkg/services/user/model.go +++ b/pkg/services/user/model.go @@ -1,8 +1,6 @@ package user import ( - "fmt" - "strings" "time" "github.com/grafana/grafana/pkg/services/auth/identity" @@ -231,10 +229,6 @@ type CompleteEmailVerifyCommand struct { Code string } -type ErrCaseInsensitiveLoginConflict struct { - Users []User -} - type UserDisplayDTO struct { ID int64 `json:"id,omitempty"` UID string `json:"uid,omitempty"` @@ -243,23 +237,6 @@ type UserDisplayDTO struct { AvatarURL string `json:"avatarUrl"` } -func (e *ErrCaseInsensitiveLoginConflict) Unwrap() error { - return ErrCaseInsensitive -} - -func (e *ErrCaseInsensitiveLoginConflict) Error() string { - n := len(e.Users) - - userStrings := make([]string, 0, n) - for _, v := range e.Users { - userStrings = append(userStrings, fmt.Sprintf("%s (email:%s, id:%d)", v.Login, v.Email, v.ID)) - } - - return fmt.Sprintf( - "Found a conflict in user login information. %d users already exist with either the same login or email: [%s].", - n, strings.Join(userStrings, ", ")) -} - type Filter interface { WhereCondition() *WhereCondition InCondition() *InCondition diff --git a/pkg/services/user/userimpl/store.go b/pkg/services/user/userimpl/store.go index 906caa81e51..b68908baeb3 100644 --- a/pkg/services/user/userimpl/store.go +++ b/pkg/services/user/userimpl/store.go @@ -24,7 +24,6 @@ type store interface { GetNotServiceAccount(context.Context, int64) (*user.User, error) Delete(context.Context, int64) error LoginConflict(ctx context.Context, login, email string) error - CaseInsensitiveLoginConflict(context.Context, string, string) error GetByLogin(context.Context, *user.GetUserByLoginQuery) (*user.User, error) GetByEmail(context.Context, *user.GetUserByEmailQuery) (*user.User, error) Update(context.Context, *user.UpdateUserCommand) error @@ -161,22 +160,6 @@ func (ss *sqlStore) notServiceAccountFilter() string { ss.dialect.BooleanStr(false)) } -func (ss *sqlStore) CaseInsensitiveLoginConflict(ctx context.Context, login, email string) error { - users := make([]user.User, 0) - err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { - if err := sess.Where("LOWER(email)=LOWER(?) OR LOWER(login)=LOWER(?)", - email, login).Find(&users); err != nil { - return err - } - - if len(users) > 1 { - return &user.ErrCaseInsensitiveLoginConflict{Users: users} - } - return nil - }) - return err -} - func (ss *sqlStore) GetByLogin(ctx context.Context, query *user.GetUserByLoginQuery) (*user.User, error) { // enforcement of lowercase due to forcement of caseinsensitive login query.LoginOrEmail = strings.ToLower(query.LoginOrEmail) @@ -249,37 +232,26 @@ func (ss *sqlStore) GetByEmail(ctx context.Context, query *user.GetUserByEmailQu } // LoginConflict returns an error if the provided email or login are already -// associated with a user. If caseInsensitive is true the search is not case -// sensitive. +// associated with a user. func (ss *sqlStore) LoginConflict(ctx context.Context, login, email string) error { - err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { - return ss.loginConflict(ctx, sess, login, email) - }) - return err -} - -func (ss *sqlStore) loginConflict(ctx context.Context, sess *db.Session, login, email string) error { - users := make([]user.User, 0) - where := "LOWER(email)=LOWER(?) OR LOWER(login)=LOWER(?)" + // enforcement of lowercase due to forcement of caseinsensitive login login = strings.ToLower(login) email = strings.ToLower(email) - exists, err := sess.Where(where, email, login).Get(&user.User{}) - if err != nil { - return err - } - if exists { - return user.ErrUserAlreadyExists - } - if err := sess.Where("LOWER(email)=LOWER(?) OR LOWER(login)=LOWER(?)", - email, login).Find(&users); err != nil { - return err - } + err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { + where := "email=? OR login=?" - if len(users) > 1 { - return &user.ErrCaseInsensitiveLoginConflict{Users: users} - } - return nil + exists, err := sess.Where(where, email, login).Get(&user.User{}) + if err != nil { + return err + } + if exists { + return user.ErrUserAlreadyExists + } + + return nil + }) + return err } func (ss *sqlStore) Update(ctx context.Context, cmd *user.UpdateUserCommand) error {