Users: Enable case insensitive login by default (#66134)
* enable case insensitive by default * fix missing case-insensitive query * fix missing case insensitive query * fix missing case insensitive query in temp_user * skip integration testing in mysql * skip integration testing in mysql * use t.cleanup * lowercase only once * aligned to only using sql as that is what we do in other parts --------- Co-authored-by: Eric Leijonmarck <eric.leijonmarck@gmail.com>
This commit is contained in:
@@ -88,8 +88,16 @@ func (ss *sqlStore) Insert(ctx context.Context, cmd *user.User) (int64, error) {
|
||||
}
|
||||
|
||||
func (ss *sqlStore) Get(ctx context.Context, usr *user.User) (*user.User, error) {
|
||||
ret := &user.User{}
|
||||
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
|
||||
exists, err := sess.Where("email=? OR login=?", usr.Email, usr.Login).Get(usr)
|
||||
where := "email=? OR login=?"
|
||||
login := usr.Login
|
||||
email := usr.Email
|
||||
if ss.cfg.CaseInsensitiveLogin {
|
||||
where = "LOWER(email)=LOWER(?) OR LOWER(login)=LOWER(?)"
|
||||
}
|
||||
|
||||
exists, err := sess.Where(where, email, login).Get(ret)
|
||||
if !exists {
|
||||
return user.ErrUserNotFound
|
||||
}
|
||||
@@ -101,7 +109,8 @@ func (ss *sqlStore) Get(ctx context.Context, usr *user.User) (*user.User, error)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return usr, nil
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func (ss *sqlStore) Delete(ctx context.Context, userID int64) error {
|
||||
|
||||
@@ -21,6 +21,94 @@ import (
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
)
|
||||
|
||||
func TestIntegrationUserGet(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
wantErr error
|
||||
searchLogin string
|
||||
searchEmail string
|
||||
caseInsensitive bool
|
||||
}{
|
||||
{
|
||||
name: "user not found non exact - not case insensitive",
|
||||
wantErr: user.ErrUserNotFound,
|
||||
searchLogin: "Test",
|
||||
searchEmail: "Test@email.com",
|
||||
caseInsensitive: false,
|
||||
},
|
||||
{
|
||||
name: "user found exact - not case insensitive",
|
||||
wantErr: nil,
|
||||
searchLogin: "test",
|
||||
searchEmail: "test@email.com",
|
||||
caseInsensitive: false,
|
||||
},
|
||||
{
|
||||
name: "user found non exact - case insensitive",
|
||||
wantErr: nil,
|
||||
searchLogin: "Test",
|
||||
searchEmail: "Test@email.com",
|
||||
caseInsensitive: true,
|
||||
},
|
||||
{
|
||||
name: "user found exact - case insensitive",
|
||||
wantErr: nil,
|
||||
searchLogin: "Test",
|
||||
searchEmail: "Test@email.com",
|
||||
caseInsensitive: true,
|
||||
},
|
||||
{
|
||||
name: "user not found - case insensitive",
|
||||
wantErr: user.ErrUserNotFound,
|
||||
searchLogin: "Test_login",
|
||||
searchEmail: "Test*@email.com",
|
||||
caseInsensitive: true,
|
||||
},
|
||||
}
|
||||
|
||||
if testing.Short() {
|
||||
t.Skip("skipping integration test")
|
||||
}
|
||||
|
||||
ss := db.InitTestDB(t)
|
||||
cfg := ss.Cfg
|
||||
userStore := ProvideStore(ss, cfg)
|
||||
|
||||
_, errUser := userStore.Insert(context.Background(),
|
||||
&user.User{
|
||||
Email: "test@email.com",
|
||||
Name: "test",
|
||||
Login: "test",
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
},
|
||||
)
|
||||
require.NoError(t, errUser)
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
if !tc.caseInsensitive && db.IsTestDbMySQL() {
|
||||
t.Skip("mysql is always case insensitive")
|
||||
}
|
||||
cfg.CaseInsensitiveLogin = tc.caseInsensitive
|
||||
usr, err := userStore.Get(context.Background(),
|
||||
&user.User{
|
||||
Email: tc.searchEmail,
|
||||
Login: tc.searchLogin,
|
||||
},
|
||||
)
|
||||
|
||||
if tc.wantErr != nil {
|
||||
require.Error(t, err)
|
||||
require.Nil(t, usr)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, usr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegrationUserDataAccess(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping integration test")
|
||||
|
||||
Reference in New Issue
Block a user