diff --git a/lib/SimpleSAML/IdP.php b/lib/SimpleSAML/IdP.php index 89b44f7e8ad615639437c908b27735b442c72319..5d9134f95f73e12bc8630ca349ac71d05370a3b7 100644 --- a/lib/SimpleSAML/IdP.php +++ b/lib/SimpleSAML/IdP.php @@ -145,20 +145,24 @@ class SimpleSAML_IdP { public function getSPName($assocId) { assert('is_string($assocId)'); - if (substr($assocId, 0, 5) !== 'saml:') { - return NULL; - } - - $spEntityId = substr($assocId, 5); + $prefix = substr($assocId, 0, 4); + $spEntityId = substr($assocId, strlen($prefix) + 1); $metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); - try { - $spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-remote'); - } catch (Exception $e) { + + if ($prefix === 'saml') { try { - $spMetadata = $metadata->getMetaDataConfig($spEntityId, 'shib13-sp-remote'); + $spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-remote'); } catch (Exception $e) { - return NULL; + try { + $spMetadata = $metadata->getMetaDataConfig($spEntityId, 'shib13-sp-remote'); + } catch (Exception $e) { + return NULL; + } } + } else if ($prefix === 'adfs') { + $spMetadata = $metadata->getMetaDataConfig($spEntityId, 'adfs-sp-remote'); + } else { + return NULL; } if ($spMetadata->hasValue('name')) { @@ -180,6 +184,8 @@ class SimpleSAML_IdP { assert('isset($association["id"])'); assert('isset($association["Handler"])'); + $association['core:IdP'] = $this->id; + $session = SimpleSAML_Session::getInstance(); $session->addAssociation($this->associationGroup, $association); } @@ -431,7 +437,8 @@ class SimpleSAML_IdP { public function finishLogout(array &$state) { assert('isset($state["Responder"])'); - call_user_func($state['Responder'], $this, $state); + $idp = SimpleSAML_IdP::getByState($state); + call_user_func($state['Responder'], $idp, $state); assert('FALSE'); } diff --git a/lib/SimpleSAML/IdP/LogoutIFrame.php b/lib/SimpleSAML/IdP/LogoutIFrame.php index da99deed8336d16402b7fff11df1d1e267a8bc36..695c344a5589645c7e22e32998205534afba5ca9 100644 --- a/lib/SimpleSAML/IdP/LogoutIFrame.php +++ b/lib/SimpleSAML/IdP/LogoutIFrame.php @@ -24,7 +24,8 @@ class SimpleSAML_IdP_LogoutIFrame extends SimpleSAML_IdP_LogoutHandler { } foreach ($associations as $id => &$association) { - $association['core:Logout-IFrame:Name'] = $this->idp->getSPName($id); + $idp = SimpleSAML_IdP::getByState($association); + $association['core:Logout-IFrame:Name'] = $idp->getSPName($id); $association['core:Logout-IFrame:State'] = 'onhold'; } $state['core:Logout-IFrame:Associations'] = $associations; diff --git a/lib/SimpleSAML/IdP/LogoutTraditional.php b/lib/SimpleSAML/IdP/LogoutTraditional.php index 0db49e2755641a2e3a224d1cab2e9edcdbe13423..bdef21c540163f71e21a5497280017f2be3d850a 100644 --- a/lib/SimpleSAML/IdP/LogoutTraditional.php +++ b/lib/SimpleSAML/IdP/LogoutTraditional.php @@ -28,7 +28,8 @@ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler { SimpleSAML_Logger::info('Logging out of ' . var_export($id, TRUE) . '.'); try { - $url = call_user_func(array($association['Handler'], 'getLogoutURL'), $this->idp, $association, $relayState); + $idp = SimpleSAML_IdP::getByState($association); + $url = call_user_func(array($association['Handler'], 'getLogoutURL'), $idp, $association, $relayState); SimpleSAML_Utilities::redirect($url); } catch (Exception $e) { SimpleSAML_Logger::warning('Unable to initialize logout to ' . var_export($id, TRUE) . '.'); diff --git a/modules/core/www/idp/logout-iframe.php b/modules/core/www/idp/logout-iframe.php index 4caa4b47a8304b6af8086c5333356bd0f60a21c8..e4942b8d30e7b6ab680ccb519502fafa9fe79f2f 100644 --- a/modules/core/www/idp/logout-iframe.php +++ b/modules/core/www/idp/logout-iframe.php @@ -79,7 +79,8 @@ if ($type === 'js' || $type === 'nojs') { } try { - $url = call_user_func(array($sp['Handler'], 'getLogoutURL'), $idp, $sp, NULL); + $assocIdP = SimpleSAML_IdP::getByState($sp); + $url = call_user_func(array($sp['Handler'], 'getLogoutURL'), $assocIdP, $sp, NULL); $sp['core:Logout-IFrame:URL'] = $url; } catch (Exception $e) { $sp['core:Logout-IFrame:State'] = 'failed';