From ac4d5cf7d59d4cf9df513df6aa0ac09492ff52bc Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 27 Nov 2019 13:03:28 +0100 Subject: [PATCH 1/2] Patch CAS redirect parameter in logout view --- gestioncof/views.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gestioncof/views.py b/gestioncof/views.py index 6c7bf337..87ee9d2e 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -2,6 +2,7 @@ import csv import uuid from datetime import timedelta from smtplib import SMTPRecipientsRefused +from urllib.parse import parse_qs, urlencode, urlparse, urlunparse from custommail.shortcuts import send_custom_mail from django.contrib import messages @@ -98,6 +99,30 @@ class LoginExtView(DjangoLoginView): return super().form_invalid(form) +class CustomCasLogoutView(CasLogoutView): + """ + Actuellement, le CAS de l'ENS est pété et n'a pas le bon paramètre GET + pour rediriger après déconnexion. On change la redirection à la main + dans la vue de logout. + """ + + def get(self, request): + # CasLogoutView.get() retourne un HttpResponseRedirect + response = super().get(request) + parse_result = urlparse(response.url) + qd = parse_qs(parse_result.query) + + if "url" in qd.keys(): + # je ne vois pas bien pourquoi il faut un 2e "pop"... + qd["service"] = qd.pop("url").pop() + + # La méthode _replace est documentée ! + new_url = parse_result._replace(query=urlencode(qd)) + print(qd) + print(urlunparse(new_url)) + return redirect(urlunparse(new_url)) + + @login_required def logout(request, next_page=None): if next_page is None: @@ -107,7 +132,7 @@ def logout(request, next_page=None): if profile and profile.login_clipper: msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") - logout_view = CasLogoutView.as_view() + logout_view = CustomCasLogoutView.as_view() else: msg = _("Déconnexion de GestioCOF réussie. À bientôt {}.") logout_view = DjangoLogoutView.as_view( From 5c581d898438de1141a6e7d11f449ec27975d0b4 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 27 Nov 2019 13:14:20 +0100 Subject: [PATCH 2/2] Cleanup + no msg on CAS logout --- gestioncof/views.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/gestioncof/views.py b/gestioncof/views.py index 87ee9d2e..ced35cfc 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -113,13 +113,13 @@ class CustomCasLogoutView(CasLogoutView): qd = parse_qs(parse_result.query) if "url" in qd.keys(): - # je ne vois pas bien pourquoi il faut un 2e "pop"... + # Le 2e pop est nécessaire car CAS n'aime pas + # les paramètres sous forme de liste qd["service"] = qd.pop("url").pop() # La méthode _replace est documentée ! new_url = parse_result._replace(query=urlencode(qd)) - print(qd) - print(urlunparse(new_url)) + return redirect(urlunparse(new_url)) @@ -131,7 +131,11 @@ def logout(request, next_page=None): profile = getattr(request.user, "profile", None) if profile and profile.login_clipper: - msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") + if next_page is None: + # On ne voit pas les messages quand on se déconnecte de CAS + msg = None + else: + msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") logout_view = CustomCasLogoutView.as_view() else: msg = _("Déconnexion de GestioCOF réussie. À bientôt {}.") @@ -139,7 +143,8 @@ def logout(request, next_page=None): next_page=next_page, template_name="logout.html" ) - messages.success(request, msg.format(request.user.get_short_name())) + if msg is not None: + messages.success(request, msg.format(request.user.get_short_name())) return logout_view(request)