mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
coderd: treat email case insensitively (#4215)
This commit is contained in:
@ -311,7 +311,7 @@ func (q *fakeQuerier) GetUserByEmailOrUsername(_ context.Context, arg database.G
|
|||||||
defer q.mutex.RUnlock()
|
defer q.mutex.RUnlock()
|
||||||
|
|
||||||
for _, user := range q.users {
|
for _, user := range q.users {
|
||||||
if (user.Email == arg.Email || user.Username == arg.Username) && user.Deleted == arg.Deleted {
|
if (strings.EqualFold(user.Email, arg.Email) || strings.EqualFold(user.Username, arg.Username)) && user.Deleted == arg.Deleted {
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
coderd/database/dump.sql
generated
2
coderd/database/dump.sql
generated
@ -532,6 +532,8 @@ CREATE UNIQUE INDEX idx_users_username ON users USING btree (username) WHERE (de
|
|||||||
|
|
||||||
CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree (organization_id, lower((name)::text)) WHERE (deleted = false);
|
CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree (organization_id, lower((name)::text)) WHERE (deleted = false);
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX users_email_lower_idx ON users USING btree (lower(email)) WHERE (deleted = false);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false);
|
CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX workspaces_owner_id_lower_idx ON workspaces USING btree (owner_id, lower((name)::text)) WHERE (deleted = false);
|
CREATE UNIQUE INDEX workspaces_owner_id_lower_idx ON workspaces USING btree (owner_id, lower((name)::text)) WHERE (deleted = false);
|
||||||
|
1
coderd/database/migrations/000054_email_case.up.sql
Normal file
1
coderd/database/migrations/000054_email_case.up.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS users_email_lower_idx ON users USING btree (lower(email)) WHERE (deleted = false);
|
@ -3071,7 +3071,7 @@ SELECT
|
|||||||
FROM
|
FROM
|
||||||
users
|
users
|
||||||
WHERE
|
WHERE
|
||||||
(LOWER(username) = LOWER($1) OR email = $2)
|
(LOWER(username) = LOWER($1) OR LOWER(email) = LOWER($2))
|
||||||
AND deleted = $3
|
AND deleted = $3
|
||||||
LIMIT
|
LIMIT
|
||||||
1
|
1
|
||||||
|
@ -17,7 +17,7 @@ SELECT
|
|||||||
FROM
|
FROM
|
||||||
users
|
users
|
||||||
WHERE
|
WHERE
|
||||||
(LOWER(username) = LOWER(@username) OR email = @email)
|
(LOWER(username) = LOWER(@username) OR LOWER(email) = LOWER(@email))
|
||||||
AND deleted = @deleted
|
AND deleted = @deleted
|
||||||
LIMIT
|
LIMIT
|
||||||
1;
|
1;
|
||||||
|
@ -20,6 +20,7 @@ const (
|
|||||||
UniqueIndexUsersEmail UniqueConstraint = "idx_users_email" // CREATE UNIQUE INDEX idx_users_email ON users USING btree (email) WHERE (deleted = false);
|
UniqueIndexUsersEmail UniqueConstraint = "idx_users_email" // CREATE UNIQUE INDEX idx_users_email ON users USING btree (email) WHERE (deleted = false);
|
||||||
UniqueIndexUsersUsername UniqueConstraint = "idx_users_username" // CREATE UNIQUE INDEX idx_users_username ON users USING btree (username) WHERE (deleted = false);
|
UniqueIndexUsersUsername UniqueConstraint = "idx_users_username" // CREATE UNIQUE INDEX idx_users_username ON users USING btree (username) WHERE (deleted = false);
|
||||||
UniqueTemplatesOrganizationIDNameIndex UniqueConstraint = "templates_organization_id_name_idx" // CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree (organization_id, lower((name)::text)) WHERE (deleted = false);
|
UniqueTemplatesOrganizationIDNameIndex UniqueConstraint = "templates_organization_id_name_idx" // CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree (organization_id, lower((name)::text)) WHERE (deleted = false);
|
||||||
|
UniqueUsersEmailLowerIndex UniqueConstraint = "users_email_lower_idx" // CREATE UNIQUE INDEX users_email_lower_idx ON users USING btree (lower(email)) WHERE (deleted = false);
|
||||||
UniqueUsersUsernameLowerIndex UniqueConstraint = "users_username_lower_idx" // CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false);
|
UniqueUsersUsernameLowerIndex UniqueConstraint = "users_username_lower_idx" // CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false);
|
||||||
UniqueWorkspacesOwnerIDLowerIndex UniqueConstraint = "workspaces_owner_id_lower_idx" // CREATE UNIQUE INDEX workspaces_owner_id_lower_idx ON workspaces USING btree (owner_id, lower((name)::text)) WHERE (deleted = false);
|
UniqueWorkspacesOwnerIDLowerIndex UniqueConstraint = "workspaces_owner_id_lower_idx" // CREATE UNIQUE INDEX workspaces_owner_id_lower_idx ON workspaces USING btree (owner_id, lower((name)::text)) WHERE (deleted = false);
|
||||||
)
|
)
|
||||||
|
@ -256,11 +256,19 @@ func TestPostLogin(t *testing.T) {
|
|||||||
}
|
}
|
||||||
_, err := client.CreateFirstUser(ctx, req)
|
_, err := client.CreateFirstUser(ctx, req)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{
|
_, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{
|
||||||
Email: req.Email,
|
Email: req.Email,
|
||||||
Password: req.Password,
|
Password: req.Password,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Login should be case insensitive
|
||||||
|
_, err = client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{
|
||||||
|
Email: strings.ToUpper(req.Email),
|
||||||
|
Password: req.Password,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Lifetime&Expire", func(t *testing.T) {
|
t.Run("Lifetime&Expire", func(t *testing.T) {
|
||||||
|
Reference in New Issue
Block a user