diff --git a/internal/store/database/migrate/postgres/0001_create_table_principals.up.sql b/internal/store/database/migrate/postgres/0001_create_table_principals.up.sql index 47ef13e56..1cad6c002 100644 --- a/internal/store/database/migrate/postgres/0001_create_table_principals.up.sql +++ b/internal/store/database/migrate/postgres/0001_create_table_principals.up.sql @@ -17,6 +17,4 @@ principal_id SERIAL PRIMARY KEY ,principal_sa_parent_id INTEGER ,UNIQUE(principal_uid_unique) -,UNIQUE(principal_email) -,UNIQUE(principal_salt) ); diff --git a/internal/store/database/migrate/postgres/0002_create_index_principals_lower_email.up.sql b/internal/store/database/migrate/postgres/0002_create_index_principals_lower_email.up.sql new file mode 100644 index 000000000..14ab405c3 --- /dev/null +++ b/internal/store/database/migrate/postgres/0002_create_index_principals_lower_email.up.sql @@ -0,0 +1,2 @@ +CREATE UNIQUE INDEX index_principals_lower_email +ON principals(LOWER(principal_email)); diff --git a/internal/store/database/migrate/sqlite/0001_create_table_principals.up.sql b/internal/store/database/migrate/sqlite/0001_create_table_principals.up.sql index af55ed54d..31e20deda 100644 --- a/internal/store/database/migrate/sqlite/0001_create_table_principals.up.sql +++ b/internal/store/database/migrate/sqlite/0001_create_table_principals.up.sql @@ -2,8 +2,8 @@ CREATE TABLE principals ( principal_id INTEGER PRIMARY KEY AUTOINCREMENT ,principal_uid TEXT ,principal_uid_unique TEXT -,principal_email TEXT COLLATE NOCASE -,principal_type TEXT COLLATE NOCASE +,principal_email TEXT +,principal_type TEXT ,principal_display_name TEXT ,principal_admin BOOLEAN ,principal_blocked BOOLEAN @@ -13,10 +13,8 @@ principal_id INTEGER PRIMARY KEY AUTOINCREMENT ,principal_user_password TEXT -,principal_sa_parent_type TEXT COLLATE NOCASE -,principal_sa_parent_id INTEGER +,principal_sa_parent_type TEXT +,principal_sa_parent_id INTEGER ,UNIQUE(principal_uid_unique) -,UNIQUE(principal_email COLLATE NOCASE) -,UNIQUE(principal_salt) ); diff --git a/internal/store/database/migrate/sqlite/0002_create_index_principals_lower_email.up.sql b/internal/store/database/migrate/sqlite/0002_create_index_principals_lower_email.up.sql new file mode 100644 index 000000000..14ab405c3 --- /dev/null +++ b/internal/store/database/migrate/sqlite/0002_create_index_principals_lower_email.up.sql @@ -0,0 +1,2 @@ +CREATE UNIQUE INDEX index_principals_lower_email +ON principals(LOWER(principal_email)); diff --git a/internal/store/database/user.go b/internal/store/database/user.go index 3312c1bed..4ccde5768 100644 --- a/internal/store/database/user.go +++ b/internal/store/database/user.go @@ -7,6 +7,7 @@ package database import ( "context" "fmt" + "strings" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/store/database/dbtx" @@ -77,8 +78,11 @@ func (s *UserStore) FindUID(ctx context.Context, uid string) (*types.User, error func (s *UserStore) FindEmail(ctx context.Context, email string) (*types.User, error) { db := dbtx.GetAccessor(ctx, s.db) + const sqlQuery = userBase + ` + WHERE principal_type = 'user' AND LOWER(principal_email) = $1` + dst := new(user) - if err := db.GetContext(ctx, dst, userSelectEmail, email); err != nil { + if err := db.GetContext(ctx, dst, sqlQuery, strings.ToLower(email)); err != nil { return nil, processSQLErrorf(err, "Select by email query failed") } @@ -170,7 +174,7 @@ func (s *UserStore) List(ctx context.Context, opts *types.UserFilter) ([]*types. case enum.UserAttrUpdated: stmt = stmt.OrderBy("principal_updated " + opts.Order.String()) case enum.UserAttrEmail: - stmt = stmt.OrderBy("principal_email " + opts.Order.String()) + stmt = stmt.OrderBy("LOWER(principal_email) " + opts.Order.String()) case enum.UserAttrUID: stmt = stmt.OrderBy("principal_uid " + opts.Order.String()) case enum.UserAttrAdmin: @@ -268,10 +272,6 @@ const userSelectUIDUnique = userBase + ` WHERE principal_type = 'user' AND principal_uid_unique = $1 ` -const userSelectEmail = userBase + ` -WHERE principal_type = 'user' AND principal_email = $1 -` - const userDelete = ` DELETE FROM principals WHERE principal_type = 'user' AND principal_id = $1