21
21
OrganizationStatus ,
22
22
UserEmail ,
23
23
)
24
+ from sentry .models .authidentity import AuthIdentity
24
25
from sentry .models .user import User
25
26
from sentry .services .hybrid_cloud .auth import AuthenticationContext
26
27
from sentry .services .hybrid_cloud .filter_query import (
37
38
)
38
39
from sentry .services .hybrid_cloud .user .serial import serialize_rpc_user
39
40
from sentry .services .hybrid_cloud .user .service import UserService
41
+ from sentry .signals import user_signup
40
42
41
43
logger = logging .getLogger ("user:provisioning" )
42
44
@@ -172,7 +174,9 @@ def get_first_superuser(self) -> Optional[RpcUser]:
172
174
return None
173
175
return serialize_rpc_user (user )
174
176
175
- def get_or_create_user_by_email (self , * , email : str ) -> RpcUser :
177
+ def get_or_create_user_by_email (
178
+ self , * , email : str , ident : Optional [str ] = None , referrer : Optional [str ] = None
179
+ ) -> RpcUser :
176
180
with transaction .atomic (router .db_for_write (User )):
177
181
user_query = User .objects .filter (email__iexact = email , is_active = True )
178
182
# Create User if it doesn't exist
@@ -182,12 +186,25 @@ def get_or_create_user_by_email(self, *, email: str) -> RpcUser:
182
186
email = email ,
183
187
name = email ,
184
188
)
189
+ user_signup .send_robust (
190
+ sender = self , user = user , source = "api" , referrer = referrer or "unknown"
191
+ )
185
192
else :
186
193
# Users are not supposed to have the same email but right now our auth pipeline let this happen
187
- # So let's not break the user experience
194
+ # So let's not break the user experience. Instead return the user with auth identity of ident or
195
+ # the first user if ident is None
196
+ user = user_query [0 ]
188
197
if user_query .count () > 1 :
189
198
logger .warning ("Email has multiple users" , extra = {"email" : email })
190
- user = user_query [0 ]
199
+ if ident :
200
+ for candid_user in user_query :
201
+ identity_query = AuthIdentity .objects .filter (
202
+ user = candid_user , ident = ident
203
+ )
204
+ if identity_query .exists ():
205
+ user = candid_user
206
+ break
207
+
191
208
return serialize_rpc_user (user )
192
209
193
210
def verify_any_email (self , * , email : str ) -> bool :
0 commit comments