Projet

Général

Profil

0002-misc-add-support-for-IDP-initiated-SOAP-SLO-41949.patch

Benjamin Dauvergne, 22 avril 2020 04:27

Télécharger (3,34 ko)

Voir les différences:

Subject: [PATCH 2/4] misc: add support for IDP-initiated SOAP SLO (#41949)

 mellon/templates/mellon/metadata.xml |  3 +++
 mellon/views.py                      | 18 ++++++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)
mellon/templates/mellon/metadata.xml
26 26
   <SingleLogoutService
27 27
     Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
28 28
     Location="{{ logout_url }}" />
29
   <SingleLogoutService
30
     Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
31
     Location="{{ logout_url }}" />
29 32
   {% for name_id_format in name_id_formats %}
30 33
       <NameIDFormat>{{ name_id_format }}</NameIDFormat>
31 34
   {% endfor %}
mellon/views.py
33 33
from django.urls import reverse
34 34
from django.utils.http import urlencode
35 35
from django.utils import six
36
from django.utils.encoding import force_text
36
from django.utils.encoding import force_text, force_str
37 37
from django.contrib.auth import REDIRECT_FIELD_NAME
38 38
from django.db import transaction
39 39
from django.utils.translation import ugettext as _
......
505 505
class LogoutView(ProfileMixin, LogMixin, View):
506 506
    def get(self, request, *args, **kwargs):
507 507
        if 'SAMLRequest' in request.GET:
508
            return self.idp_logout(request)
508
            return self.idp_logout(request, request.META['QUERY_STRING'])
509 509
        elif 'SAMLResponse' in request.GET:
510 510
            return self.sp_logout_response(request)
511 511
        else:
512 512
            return self.sp_logout_request(request)
513 513

  
514
    def idp_logout(self, request):
514
    def post(self, request, *args, **kwargs):
515
        return self.idp_logout(request, force_str(request.body))
516

  
517
    def idp_logout(self, request, msg):
515 518
        '''Handle logout request emitted by the IdP'''
516 519
        self.profile = logout = utils.create_logout(request)
517 520
        try:
518
            logout.processRequestMsg(request.META['QUERY_STRING'])
521
            logout.processRequestMsg(msg)
519 522
        except lasso.Error as e:
520 523
            return HttpResponseBadRequest('error processing logout request: %r' % e)
521 524
        try:
......
530 533
            logout.buildResponseMsg()
531 534
        except lasso.Error as e:
532 535
            return HttpResponseBadRequest('error processing logout request: %r' % e)
533
        return HttpResponseRedirect(logout.msgUrl)
536
        if logout.msgBody:
537
            return HttpResponse(force_text(logout.msgBody), content_type='text/xml')
538
        else:
539
            return HttpResponseRedirect(logout.msgUrl)
534 540

  
535 541
    def sp_logout_request(self, request):
536 542
        '''Launch a logout request to the identity provider'''
......
586 592
        return HttpResponseRedirect(next_url)
587 593

  
588 594

  
589
logout = LogoutView.as_view()
595
logout = csrf_exempt(LogoutView.as_view())
590 596

  
591 597

  
592 598
def metadata(request, **kwargs):
593
-