From e746cc80a437e49be8e48a568e9aa5f17254eb11 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 23 Aug 2025 04:08:21 +0200 Subject: [PATCH 1/2] fix: generate correct SQL query for `GetUserByEmail` xorm ignores any boolean values that are set in the struct given via `Get`: https://gitea.com/xorm/xorm/src/commit/7654b7b7491806b6d0ad90dbd9acfd39dac3fce4/internal/statements/statement.go#L384-L390 --- models/user/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 5f413ba136..8cdecc06e4 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -1202,8 +1202,8 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) { email = strings.ToLower(email) // Otherwise, check in alternative list for activated email addresses - emailAddress := &EmailAddress{LowerEmail: email, IsActivated: true} - has, err := db.GetEngine(ctx).Get(emailAddress) + emailAddress := &EmailAddress{} + has, err := db.GetEngine(ctx).Where("lower_email = ? AND is_activated = ?", email, true).Get(emailAddress) if err != nil { return nil, err } From 72874950640ccf2c37cf5807102d20f71c9ad694 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 23 Aug 2025 04:15:20 +0200 Subject: [PATCH 2/2] chore: add user by email unit tests --- models/user/user_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/models/user/user_test.go b/models/user/user_test.go index 5b0c9676de..e4a94cbc57 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -996,3 +996,25 @@ func TestPronounsPrivacy(t *testing.T) { assert.Equal(t, "any", user.GetPronouns(true)) }) } + +func TestGetUserByEmail(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Normal", func(t *testing.T) { + u, err := user_model.GetUserByEmail(t.Context(), "user2@example.com") + require.NoError(t, err) + assert.EqualValues(t, 2, u.ID) + }) + + t.Run("Not activated", func(t *testing.T) { + u, err := user_model.GetUserByEmail(t.Context(), "user11@example.com") + require.ErrorIs(t, err, user_model.ErrUserNotExist{Name: "user11@example.com"}) + assert.Nil(t, u) + }) + + t.Run("Not primary", func(t *testing.T) { + u, err := user_model.GetUserByEmail(t.Context(), "user1-3@example.com") + require.NoError(t, err) + assert.EqualValues(t, 1, u.ID) + }) +}