340 |
340 |
|
341 |
341 |
|
342 |
342 |
class LoginOrLinkView(PopupViewMixin, FcOAuthSessionViewMixin, View):
|
343 |
343 |
'''Login with FC, if the FC account is already linked, connect this user,
|
344 |
344 |
if a user is logged link the user to this account, otherwise display an
|
345 |
345 |
error message.
|
346 |
346 |
'''
|
347 |
347 |
|
|
348 |
def email_is_unique(self):
|
|
349 |
default_ou = get_default_ou()
|
|
350 |
return a2_app_settings.A2_EMAIL_IS_UNIQUE or default_ou.email_is_unique
|
|
351 |
|
|
352 |
def users_having_email(self, email):
|
|
353 |
default_ou = get_default_ou()
|
|
354 |
User = get_user_model()
|
|
355 |
qs = User.objects.filter(email__iexact=email)
|
|
356 |
if not a2_app_settings.A2_EMAIL_IS_UNIQUE and default_ou.email_is_unique:
|
|
357 |
qs = qs.filter(ou=default_ou)
|
|
358 |
return qs
|
|
359 |
|
348 |
360 |
def update_user_info(self):
|
349 |
361 |
self.fc_account.token = json.dumps(self.token)
|
350 |
362 |
self.fc_account.user_info = json.dumps(self.user_info)
|
351 |
363 |
self.fc_account.save(update_fields=['token', 'user_info'])
|
352 |
364 |
utils.apply_user_info_mappings(self.fc_account.user, self.user_info)
|
353 |
365 |
self.logger.debug('updating user_info %s', self.fc_account.user_info)
|
354 |
366 |
|
355 |
367 |
def uniqueness_check_failed(self, request):
|
... | ... | |
388 |
400 |
messages.info(request,
|
389 |
401 |
_('Your FranceConnect account {} has been linked.').format(self.fc_display_name))
|
390 |
402 |
hooks.call_hooks('event', name='fc-link', user=request.user, sub=self.sub, request=request)
|
391 |
403 |
else:
|
392 |
404 |
messages.info(request, _('Your local account has been updated.'))
|
393 |
405 |
self.update_user_info()
|
394 |
406 |
return self.redirect(request)
|
395 |
407 |
|
396 |
|
default_ou = get_default_ou()
|
397 |
|
email_is_unique = a2_app_settings.A2_EMAIL_IS_UNIQUE or default_ou.email_is_unique
|
398 |
408 |
user = a2_utils.authenticate(
|
399 |
409 |
request,
|
400 |
410 |
sub=self.sub,
|
401 |
411 |
user_info=self.user_info,
|
402 |
412 |
token=self.token)
|
403 |
413 |
if user:
|
404 |
414 |
self.fc_account = user.fc_accounts.get(order=0)
|
405 |
|
if not user and self.user_info.get('email') and email_is_unique:
|
|
415 |
if not user and self.user_info.get('email') and self.email_is_unique():
|
406 |
416 |
email = self.user_info['email']
|
407 |
|
User = get_user_model()
|
408 |
|
qs = User.objects.filter(email__iexact=email)
|
409 |
|
if not a2_app_settings.A2_EMAIL_IS_UNIQUE and default_ou.email_is_unique:
|
410 |
|
qs = qs.filter(ou=default_ou)
|
411 |
|
|
|
417 |
qs = self.users_having_email(email)
|
412 |
418 |
if qs.exists():
|
413 |
419 |
# there should not be multiple accounts with the same mail
|
414 |
420 |
if len(qs) > 1:
|
415 |
421 |
self.logger.error(u'multiple accounts with the same mail %s, %s', email,
|
416 |
422 |
list(qs))
|
417 |
423 |
# ok we have one account
|
418 |
424 |
elif len(qs) == 1:
|
419 |
425 |
user = qs[0]
|
420 |
|
-
|