From 035c603f3d630ccd98d9e454cc8bc185e95e66f7 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sun, 11 Apr 2021 16:42:35 +0200 Subject: [PATCH] auth_fc: separate link from login use case (#52929) --- src/authentic2_auth_fc/views.py | 48 ++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/authentic2_auth_fc/views.py b/src/authentic2_auth_fc/views.py index 662396d59..f5a527ee6 100644 --- a/src/authentic2_auth_fc/views.py +++ b/src/authentic2_auth_fc/views.py @@ -391,30 +391,36 @@ class LoginOrLinkView(PopupViewMixin, FcOAuthSessionViewMixin, View): messages.error(request, _('Your account is disabled.')) return self.redirect(request) - def get(self, request, *args, **kwargs): + def link(self, request): '''Request an access grant code and associate it to the current user''' - self.service = get_service_from_request(request) + try: + self.fc_account, created = models.FcAccount.objects.get_or_create( + sub=self.sub, user=request.user, order=0, defaults={'token': json.dumps(self.token)} + ) + # Prevent adding a link with an FC account already linked with another user. + except IntegrityError: + # unique index check failed, find why. + return self.uniqueness_check_failed(request) + + if created: + self.logger.info('fc link created sub %s', self.sub) + messages.info( + request, _('Your FranceConnect account {} has been linked.').format(self.fc_display_name) + ) + hooks.call_hooks('event', name='fc-link', user=request.user, sub=self.sub, request=request) + else: + messages.info(request, _('Your local account has been updated.')) + self.update_user_info() + return self.redirect(request) + + def get(self, request, *args, **kwargs): if request.user.is_authenticated: - # Prevent to add a link with an FC account already linked with another user. - try: - self.fc_account, created = models.FcAccount.objects.get_or_create( - sub=self.sub, user=request.user, order=0, defaults={'token': json.dumps(self.token)} - ) - except IntegrityError: - # unique index check failed, find why. - return self.uniqueness_check_failed(request) - - if created: - self.logger.info('fc link created sub %s', self.sub) - messages.info( - request, _('Your FranceConnect account {} has been linked.').format(self.fc_display_name) - ) - hooks.call_hooks('event', name='fc-link', user=request.user, sub=self.sub, request=request) - else: - messages.info(request, _('Your local account has been updated.')) - self.update_user_info() - return self.redirect(request) + return self.link(request) + else: + return self.login(request) + def login(self, request): + self.service = get_service_from_request(request) default_ou = get_default_ou() email_is_unique = a2_app_settings.A2_EMAIL_IS_UNIQUE or default_ou.email_is_unique email_present_and_unique = self.user_info.get('email') and email_is_unique