From cd8b59998bb0fd8f975ea5bdbd6edc149c250a2f Mon Sep 17 00:00:00 2001 From: Thomas CHEMINEAU Date: Thu, 22 Apr 2010 17:01:37 +0000 Subject: [PATCH] SAML: first work on dispatching logout requests to SP during IDP SLO process --- .../lib/Lemonldap/NG/Portal/IssuerDBSAML.pm | 166 ++++++++++++++---- .../lib/Lemonldap/NG/Portal/_SAML.pm | 31 ++++ 2 files changed, 164 insertions(+), 33 deletions(-) diff --git a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/IssuerDBSAML.pm b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/IssuerDBSAML.pm index 8e4f6a1ef..6ac0a7026 100644 --- a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/IssuerDBSAML.pm +++ b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/IssuerDBSAML.pm @@ -6,6 +6,7 @@ package Lemonldap::NG::Portal::IssuerDBSAML; use strict; +use Lemonldap::NG::Common::Conf::SAML::Metadata; use Lemonldap::NG::Portal::Simple; use Lemonldap::NG::Portal::_SAML; our @ISA = qw(Lemonldap::NG::Portal::_SAML); @@ -671,39 +672,7 @@ sub issuerForAuthUser { $self->lmLog( "SLO: Logout request is valid", 'debug' ); - # Get EntityID - my $entityID = $logout->request->Issuer->content; - - $self->lmLog( "Request issued from $entityID", 'debug' ); - - # TODO - # Get all entityID into the current session, to send logout - # requests on all of them. - my @entitiesID = $session =~ /RemoteProviderID="[^"]+"/g; - @entitiesID = map { - my $id = $_; - $id =~ s/RemoteProviderID="([^"]+)"/$1/; - $id; - } @entitiesID; - - # Foreach SP found in session, get it from configuration, - # and send the appropriate logout request (HTTP,POST,SOAP). - foreach (@entitiesID) { - - # Do not process logout on SP that initiate the - # logout request - next if ($entityID =~ /^$_$/); - - # Find EntityID in SPList - unless ( defined $self->{_spList}->{$entityID} ) { - $self->lmLog( - "$entityID does not match any known SP", 'error' ); - return PE_ERROR; - } - - $self->lmLog( "Initiate logout request on $_", 'debug' ); - - } + $self->sendLogoutRequestToServiceProviders($logout); # Validate request if no previous error unless ( $self->validateLogoutRequest($logout) ) { @@ -831,6 +800,137 @@ sub sendLogoutResponseAfterLogoutRequest { return 1; } +sub sendLogoutRequestToServiceProviders { + my $self = shift; + my $logout = shift; + my $server = $self->{_lassoServer}; + + # Get EntityID + my $entityID = $logout->request->Issuer->content; + + # Reset providerID into Lasso::Logout object + $self->resetProviderIdIndex($logout); + + # Page header + print $self->header(); + print $self->start_html(); + print ''; + print $self->end_html(); + +} + 1; __END__ diff --git a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/_SAML.pm b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/_SAML.pm index 1f4f0c5db..1ddc0f5b9 100644 --- a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/_SAML.pm +++ b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/_SAML.pm @@ -577,6 +577,37 @@ sub getOrganizationName { return $data->{OrganizationName}->{content}; } +## @method string getNextProviderId(Lasso::Logout logout) +# Returns the provider id from providerID_index in list of providerIDs in +# principal session with the exception of initial service provider ID. +# @param logout Lasso::Logout object +# @return string +sub getNextProviderId { + my $self = shift; + my $logout = shift; + my $providerId; + + eval { $providerId = Lasso::Logout::get_next_providerID($logout); }; + if ($@) { + $self->checkLassoError($@); + return; + } + + return $providerId; +} + +## @method boolean resetProviderIdIndex(Lasso::Logout logout) +# Reset the providerID_index attribute in Lasso::Logout object +# @param logout Lasso::Logout object +# @return boolean +sub resetProviderIdIndex { + my $self = shift; + my $logout = shift; + + eval { Lasso::Logout::reset_providerID_index($logout); }; + return $self->checkLassoError($@); +} + ## @method Lasso::Login createAuthnRequest(Lasso::Server server, string idp, int method, boolean forceAuthn, boolean isPassive, string nameIDFormat, boolean allowProxiedAuthn, boolean signSSOMessage, string requestedAuthnContext) # Create authentication request for selected IDP # @param server Lasso::Server object