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,28 @@ 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
+ identity_query = AuthIdentity .objects .filter (
201
+ user__in = user_query , ident = ident
202
+ )
203
+ if identity_query .exists ():
204
+ user = identity_query [0 ].user
205
+ if identity_query .count () > 1 :
206
+ logger .warning (
207
+ "Email has two auth identity for the same ident" ,
208
+ extra = {"email" : email },
209
+ )
210
+
191
211
return serialize_rpc_user (user )
192
212
193
213
def verify_any_email (self , * , email : str ) -> bool :
0 commit comments