Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
2626e8f2
Commit
2626e8f2
authored
Apr 21, 2026
by
IanShaw027
Browse files
fix legacy email identity backfill grants
parent
09351e94
Changes
2
Hide whitespace changes
Inline
Side-by-side
backend/internal/service/auth_service.go
View file @
2626e8f2
...
...
@@ -796,7 +796,7 @@ func (s *AuthService) backfillEmailIdentityOnSuccessfulLogin(ctx context.Context
if
s
==
nil
||
user
==
nil
||
user
.
ID
<=
0
{
return
}
identity
,
created
:=
s
.
ensureEmailAuthIdentity
(
ctx
,
user
)
identity
,
created
:=
s
.
ensureEmailAuthIdentity
(
ctx
,
user
,
"auth_service_login_backfill"
)
if
s
.
shouldApplyEmailFirstBindDefaults
(
ctx
,
user
.
ID
,
identity
,
created
)
{
if
err
:=
s
.
ApplyProviderDefaultSettingsOnFirstBind
(
ctx
,
user
.
ID
,
"email"
);
err
!=
nil
{
logger
.
LegacyPrintf
(
"service.auth"
,
"[Auth] Failed to apply email first bind defaults: user_id=%d err=%v"
,
user
.
ID
,
err
)
...
...
@@ -810,13 +810,17 @@ func (s *AuthService) shouldApplyEmailFirstBindDefaults(
identity
*
dbent
.
AuthIdentity
,
created
bool
,
)
bool
{
source
:=
emailAuthIdentitySource
(
identity
.
Metadata
)
if
source
==
"auth_service_login_backfill"
{
return
false
}
if
created
{
return
true
}
if
s
==
nil
||
s
.
entClient
==
nil
||
userID
<=
0
||
identity
==
nil
||
identity
.
UserID
!=
userID
{
return
false
}
if
emailAuthIdentitySource
(
identity
.
Metadata
)
!=
"auth_service_dual_write"
{
if
source
!=
"auth_service_dual_write"
{
return
false
}
...
...
@@ -863,7 +867,7 @@ func (s *AuthService) hasProviderGrantRecord(
return
rows
.
Next
(),
rows
.
Err
()
}
func
(
s
*
AuthService
)
ensureEmailAuthIdentity
(
ctx
context
.
Context
,
user
*
User
)
(
*
dbent
.
AuthIdentity
,
bool
)
{
func
(
s
*
AuthService
)
ensureEmailAuthIdentity
(
ctx
context
.
Context
,
user
*
User
,
source
string
)
(
*
dbent
.
AuthIdentity
,
bool
)
{
if
s
==
nil
||
s
.
entClient
==
nil
||
user
==
nil
||
user
.
ID
<=
0
{
return
nil
,
false
}
...
...
@@ -872,6 +876,9 @@ func (s *AuthService) ensureEmailAuthIdentity(ctx context.Context, user *User) (
if
email
==
""
||
isReservedEmail
(
email
)
{
return
nil
,
false
}
if
strings
.
TrimSpace
(
source
)
==
""
{
source
=
"auth_service_dual_write"
}
client
:=
s
.
entClient
if
tx
:=
dbent
.
TxFromContext
(
ctx
);
tx
!=
nil
{
...
...
@@ -900,7 +907,7 @@ func (s *AuthService) ensureEmailAuthIdentity(ctx context.Context, user *User) (
SetProviderSubject
(
email
)
.
SetVerifiedAt
(
time
.
Now
()
.
UTC
())
.
SetMetadata
(
map
[
string
]
any
{
"source"
:
"auth_service_dual_write"
,
"source"
:
strings
.
TrimSpace
(
source
)
,
})
.
OnConflictColumns
(
authidentity
.
FieldProviderType
,
...
...
backend/internal/service/auth_service_identity_sync_test.go
View file @
2626e8f2
...
...
@@ -259,7 +259,7 @@ func TestAuthServiceRecordSuccessfulLoginBackfillsEmailIdentity(t *testing.T) {
require
.
Equal
(
t
,
user
.
ID
,
identity
.
UserID
)
}
func
TestAuthServiceLogin_Appl
ies
EmailFirstBindDefaults
Only
WhenEmailIdentity
IsNew
(
t
*
testing
.
T
)
{
func
TestAuthServiceLogin_
DoesNot
Appl
y
EmailFirstBindDefaultsWhen
BackfillingLegacy
EmailIdentity
(
t
*
testing
.
T
)
{
assigner
:=
&
authIdentityDefaultSubAssignerStub
{}
svc
,
_
,
client
:=
newAuthServiceWithEnt
(
t
,
map
[
string
]
string
{
service
.
SettingKeyRegistrationEnabled
:
"true"
,
...
...
@@ -291,11 +291,9 @@ func TestAuthServiceLogin_AppliesEmailFirstBindDefaultsOnlyWhenEmailIdentityIsNe
storedUser
,
err
:=
client
.
User
.
Get
(
ctx
,
user
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
10.0
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
6
,
storedUser
.
Concurrency
)
require
.
Len
(
t
,
assigner
.
calls
,
1
)
require
.
Equal
(
t
,
int64
(
11
),
assigner
.
calls
[
0
]
.
GroupID
)
require
.
Equal
(
t
,
30
,
assigner
.
calls
[
0
]
.
ValidityDays
)
require
.
Equal
(
t
,
1.5
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
2
,
storedUser
.
Concurrency
)
require
.
Empty
(
t
,
assigner
.
calls
)
identityCount
,
err
:=
client
.
AuthIdentity
.
Query
()
.
Where
(
...
...
@@ -306,7 +304,7 @@ func TestAuthServiceLogin_AppliesEmailFirstBindDefaultsOnlyWhenEmailIdentityIsNe
Count
(
ctx
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
identityCount
)
require
.
Equal
(
t
,
1
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
token
,
gotUser
,
err
=
svc
.
Login
(
ctx
,
user
.
Email
,
"password"
)
require
.
NoError
(
t
,
err
)
...
...
@@ -315,13 +313,13 @@ func TestAuthServiceLogin_AppliesEmailFirstBindDefaultsOnlyWhenEmailIdentityIsNe
storedUser
,
err
=
client
.
User
.
Get
(
ctx
,
user
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
0.0
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
6
,
storedUser
.
Concurrency
)
require
.
Len
(
t
,
assigner
.
calls
,
1
)
require
.
Equal
(
t
,
1
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
require
.
Equal
(
t
,
1
.5
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
2
,
storedUser
.
Concurrency
)
require
.
Empty
(
t
,
assigner
.
calls
)
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
}
func
TestAuthServiceLogin_Merge
s
EmailFirstBind
SourceOverridesWithGlobalDefaults
(
t
*
testing
.
T
)
{
func
TestAuthServiceLogin_
DoesNotApply
Merge
d
EmailFirstBind
DefaultsWhenBackfillingLegacyEmailIdentity
(
t
*
testing
.
T
)
{
assigner
:=
&
authIdentityDefaultSubAssignerStub
{}
svc
,
_
,
client
:=
newAuthServiceWithEnt
(
t
,
map
[
string
]
string
{
service
.
SettingKeyRegistrationEnabled
:
"true"
,
...
...
@@ -354,12 +352,10 @@ func TestAuthServiceLogin_MergesEmailFirstBindSourceOverridesWithGlobalDefaults(
storedUser
,
err
:=
client
.
User
.
Get
(
ctx
,
user
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
10.0
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
4
,
storedUser
.
Concurrency
)
require
.
Len
(
t
,
assigner
.
calls
,
1
)
require
.
Equal
(
t
,
int64
(
21
),
assigner
.
calls
[
0
]
.
GroupID
)
require
.
Equal
(
t
,
14
,
assigner
.
calls
[
0
]
.
ValidityDays
)
require
.
Equal
(
t
,
1
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
require
.
Equal
(
t
,
1.5
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
2
,
storedUser
.
Concurrency
)
require
.
Empty
(
t
,
assigner
.
calls
)
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
}
func
TestAuthServiceLogin_DoesNotApplyEmailFirstBindDefaultsWhenIdentityAlreadyExists
(
t
*
testing
.
T
)
{
...
...
@@ -409,7 +405,7 @@ func TestAuthServiceLogin_DoesNotApplyEmailFirstBindDefaultsWhenIdentityAlreadyE
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
}
func
TestAuthServiceLogin_Retr
ies
EmailFirstBindDefaults
AfterPreviousFailure
(
t
*
testing
.
T
)
{
func
TestAuthServiceLogin_
DoesNot
Retr
y
EmailFirstBindDefaults
ForBackfilledEmailIdentity
(
t
*
testing
.
T
)
{
assigner
:=
&
flakyAuthIdentityDefaultSubAssignerStub
{
failuresRemaining
:
1
}
svc
,
_
,
client
:=
newAuthServiceWithEnt
(
t
,
map
[
string
]
string
{
service
.
SettingKeyRegistrationEnabled
:
"true"
,
...
...
@@ -443,7 +439,7 @@ func TestAuthServiceLogin_RetriesEmailFirstBindDefaultsAfterPreviousFailure(t *t
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1.5
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
2
,
storedUser
.
Concurrency
)
require
.
Len
(
t
,
assigner
.
calls
,
1
)
require
.
Empty
(
t
,
assigner
.
calls
)
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
token
,
gotUser
,
err
=
svc
.
Login
(
ctx
,
user
.
Email
,
"password"
)
...
...
@@ -454,10 +450,10 @@ func TestAuthServiceLogin_RetriesEmailFirstBindDefaultsAfterPreviousFailure(t *t
storedUser
,
err
=
client
.
User
.
Get
(
ctx
,
user
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
0.0
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
6
,
storedUser
.
Concurrency
)
require
.
Len
(
t
,
assigner
.
calls
,
2
)
require
.
Equal
(
t
,
1
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
require
.
Equal
(
t
,
1
.5
,
storedUser
.
Balance
)
require
.
Equal
(
t
,
2
,
storedUser
.
Concurrency
)
require
.
Empty
(
t
,
assigner
.
calls
)
require
.
Equal
(
t
,
0
,
countProviderGrantRecords
(
t
,
client
,
user
.
ID
,
"email"
,
"first_bind"
))
}
func
countProviderGrantRecords
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment