Projet

Général

Profil

0001-auth_fc-factorize-code-checking-email-unicity-45199.patch

Nicolas Roche, 29 juillet 2020 22:35

Télécharger (3,46 ko)

Voir les différences:

Subject: [PATCH 1/2] auth_fc: factorize code checking email unicity (#45199)

 src/authentic2_auth_fc/views.py | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)
src/authentic2_auth_fc/views.py
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
-