<?php 
 
/** 
 * WARNING: 
 * 
 * THIS FILE IS DEPRECATED AND WILL BE REMOVED IN FUTURE VERSIONS 
 * 
 * @deprecated 
 */ 
 
require_once('../../_include.php'); 
 
$config = SimpleSAML_Configuration::getInstance(); 
$metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); 
 
SimpleSAML_Logger::warning('The file saml2/sp/SingleLogoutService.php is deprecated and will be removed in future versions.'); 
 
// Get the local session 
$session = SimpleSAML_Session::getSessionFromRequest(); 
 
 
SimpleSAML_Logger::info('SAML2.0 - SP.SingleLogoutService: Accessing SAML 2.0 SP endpoint SingleLogoutService'); 
 
if (!$config->getBoolean('enable.saml20-sp', TRUE)) 
    throw new SimpleSAML_Error_Error('NOACCESS'); 
 
 
 
// Destroy local session if exists. 
$session->doLogout('saml2'); 
 
$binding = SAML2_Binding::getCurrentBinding(); 
$message = $binding->receive(); 
 
$idpEntityId = $message->getIssuer(); 
if ($idpEntityId === NULL) { 
    /* Without an issuer we have no way to respond to the message. */ 
    throw new SimpleSAML_Error_BadRequest('Received message on logout endpoint without issuer.'); 
} 
 
$spEntityId = $metadata->getMetaDataCurrentEntityId('saml20-sp-hosted'); 
 
$idpMetadata = $metadata->getMetaDataConfig($idpEntityId, 'saml20-idp-remote'); 
$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-hosted'); 
 
sspmod_saml_Message::validateMessage($idpMetadata, $spMetadata, $message); 
 
if ($message instanceof SAML2_LogoutRequest) { 
 
    try { 
        // Extract some parameters from the logout request 
        $requestid = $message->getId(); 
 
        SimpleSAML_Logger::info('SAML2.0 - SP.SingleLogoutService: IdP (' . $idpEntityId . 
            ') is sending logout request to me SP (' . $spEntityId . ') requestid '.$requestid); 
        SimpleSAML_Logger::stats('saml20-idp-SLO idpinit ' . $spEntityId . ' ' . $idpEntityId); 
 
        /* Create response. */ 
        $lr = sspmod_saml_Message::buildLogoutResponse($spMetadata, $idpMetadata); 
        $lr->setRelayState($message->getRelayState()); 
        $lr->setInResponseTo($message->getId()); 
 
        SimpleSAML_Logger::info('SAML2.0 - SP.SingleLogoutService: SP me (' . $spEntityId . ') is sending logout response to IdP (' . $idpEntityId . ')'); 
 
        $dst = $idpMetadata->getEndpointPrioritizedByBinding('SingleLogoutService', array( 
            SAML2_Const::BINDING_HTTP_REDIRECT, 
            SAML2_Const::BINDING_HTTP_POST) 
        ); 
    
        if (!$binding instanceof SAML2_SOAP) { 
            $binding = SAML2_Binding::getBinding($dst['Binding']); 
            if (isset($dst['ResponseLocation'])) { 
                $dst = $dst['ResponseLocation']; 
            } else { 
                $dst = $dst['Location']; 
            } 
            $binding->setDestination($dst); 
        } 
 
        /* Send response. */ 
        $binding->send($lr); 
    } catch (Exception $exception) { 
        throw new SimpleSAML_Error_Error('LOGOUTREQUEST', $exception); 
    } 
 
} elseif ($message instanceof SAML2_LogoutResponse) { 
 
    SimpleSAML_Logger::stats('saml20-sp-SLO spinit ' . $spEntityId . ' ' . $idpEntityId); 
 
    $id = $message->getRelayState(); 
    if (empty($id)) { 
        /* For backwardscompatibility. */ 
        $id = $message->getInResponseTo(); 
    } 
 
    // 'spLogoutReturnTo' is checked before storing it in the 
    // session, so we trust it here. 
    $returnTo = $session->getData('spLogoutReturnTo', $id); 
    if (empty($returnTo)) { 
        throw new SimpleSAML_Error_Error('LOGOUTINFOLOST'); 
    } 
 
    SimpleSAML_Utilities::redirectTrustedURL($returnTo); 
 
} else { 
    throw new SimpleSAML_Error_Error('SLOSERVICEPARAMS'); 
} 
 
 
 |