From 5f5b6ba144122a30ce180b661500498f6b945a01 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 3 Oct 2022 11:42:21 +0200 Subject: [PATCH 06/10] views: refactor the logout view (#69720) --- src/authentic2/views.py | 62 +++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/src/authentic2/views.py b/src/authentic2/views.py index 2596b39c..fc160474 100644 --- a/src/authentic2/views.py +++ b/src/authentic2/views.py @@ -605,52 +605,48 @@ def logout(request, next_url=None, do_local=True, check_referer=True): """ next_url = next_url or utils_misc.select_next_url(request, settings.LOGIN_REDIRECT_URL) - ctx = {} - ctx['next_url'] = next_url - ctx['redir_timeout'] = 60 - local_logout_done = False - if request.user.is_authenticated: if check_referer and not utils_misc.check_referer(request): - return render(request, 'authentic2/logout_confirm.html', ctx) + return render(request, 'authentic2/logout_confirm.html', {'next_url': next_url}) + fragments = logout_list(request) do_local = do_local and 'local' in request.GET - if not do_local: - fragments = logout_list(request) - if fragments: - # Full logout with iframes - next_url = utils_misc.make_url( - 'auth_logout', params={'local': 'ok'}, next_url=next_url, sign_next_url=True - ) - ctx['next_url'] = next_url - ctx['logout_list'] = fragments - ctx['message'] = _('Logging out from all your services') - return render(request, 'authentic2/logout.html', ctx) + if not do_local and fragments: + # Full logout with iframes + local_logout_next_url = utils_misc.make_url( + 'auth_logout', params={'local': 'ok'}, next_url=next_url, sign_next_url=True + ) + ctx = {} + ctx['next_url'] = local_logout_next_url + ctx['redir_timeout'] = 60 + ctx['logout_list'] = fragments + ctx['message'] = _('Logging out from all your services') + return render(request, 'authentic2/logout.html', ctx) # Get redirection targets for full logout with redirections # (needed before local logout) targets = redirect_logout_list(request) - logger.debug('Accumulated redirections : %s', targets) + targets.append(next_url) # Local logout request.journal.record('user.logout') auth_logout(request) - logger.info('Logged out') - local_logout_done = True # Last redirection will be the current next_url - targets.append(next_url) # Put redirection targets in session (after local logout) request.session['logout_redirections'] = targets - logger.debug('All planned redirections : %s', targets) - # Full logout by redirections if any - targets = request.session.pop('logout_redirections', None) - if targets: - # Full logout with redirections - logger.debug('Redirections queue: %s', targets) - next_url = targets.pop(0) - request.session['logout_redirections'] = targets - logger.debug('Next redirection : %s', next_url) - response = shortcuts.redirect(next_url) - if local_logout_done: + targets = request.session.pop('logout_redirections', None) + if targets: + # Full logout with redirections + next_url = targets.pop(0) + request.session['logout_redirections'] = targets + response = shortcuts.redirect(next_url) response.set_cookie('a2_just_logged_out', 1, max_age=60, samesite='Lax') - return response + return response + else: + # continue redirections after logout + targets = request.session.pop('logout_redirections', None) + if targets: + # Full logout with redirections + next_url = targets.pop(0) + request.session['logout_redirections'] = targets + return shortcuts.redirect(next_url) def login_password_login(request, authenticator, *args, **kwargs): -- 2.37.2