| 
<?php
 /**
 * WARNING:
 *
 * THIS FILE IS DEPRECATED AND WILL BE REMOVED IN FUTURE VERSIONS
 *
 * @deprecated
 */
 
 require_once('../../_include.php');
 
 /**
 * This SAML 2.0 endpoint is the endpoint at the SAML 2.0 SP that takes an Authentication Response
 * as HTTP-POST in, and parses and processes it before it redirects the use to the RelayState.
 *
 * @author Andreas Aakre Solberg, UNINETT AS. <[email protected]>
 * @package simpleSAMLphp
 * @abstract
 */
 
 $config = SimpleSAML_Configuration::getInstance();
 
 SimpleSAML_Logger::warning('The file saml2/sp/AssertionConsumerService.php is deprecated and will be removed in future versions.');
 
 /* Get the session object for the user. Create a new session if no session
 * exists for this user.
 */
 $session = SimpleSAML_Session::getSessionFromRequest();
 
 
 /**
 * Finish login operation.
 *
 * This helper function finishes a login operation and redirects the user back to the page which
 * requested the login.
 *
 * @param array $authProcState  The state of the authentication process.
 */
 function finishLogin($authProcState) {
 assert('is_array($authProcState)');
 assert('array_key_exists("Attributes", $authProcState)');
 assert('array_key_exists("core:saml20-sp:NameID", $authProcState)');
 assert('array_key_exists("core:saml20-sp:SessionIndex", $authProcState)');
 assert('array_key_exists("core:saml20-sp:TargetURL", $authProcState)');
 assert('array_key_exists("Source", $authProcState)');
 assert('array_key_exists("entityid", $authProcState["Source"])');
 
 $authData = array(
 'Attributes' => $authProcState['Attributes'],
 'saml:sp:NameID' => $authProcState['core:saml20-sp:NameID'],
 'saml:sp:SessionIndex' => $authProcState['core:saml20-sp:SessionIndex'],
 'saml:sp:IdP' => $authProcState['Source']['entityid'],
 );
 
 global $session;
 $session->doLogin('saml2', $authData);
 
 SimpleSAML_Utilities::redirectTrustedURL($authProcState['core:saml20-sp:TargetURL']);
 }
 
 SimpleSAML_Logger::info('SAML2.0 - SP.AssertionConsumerService: Accessing SAML 2.0 SP endpoint AssertionConsumerService');
 
 if (!$config->getBoolean('enable.saml20-sp', TRUE))
 throw new SimpleSAML_Error_Error('NOACCESS');
 
 if (array_key_exists(SimpleSAML_Auth_ProcessingChain::AUTHPARAM, $_REQUEST)) {
 /* We have returned from the authentication processing filters. */
 
 $authProcId = $_REQUEST[SimpleSAML_Auth_ProcessingChain::AUTHPARAM];
 
 // sanitize the input
 $sid = SimpleSAML_Utilities::parseStateID($authProcId);
 if (!is_null($sid['url'])) {
 SimpleSAML_Utilities::checkURLAllowed($sid['url']);
 }
 
 $authProcState = SimpleSAML_Auth_ProcessingChain::fetchProcessedState($authProcId);
 finishLogin($authProcState);
 }
 
 
 try {
 $metadataHandler = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler();
 $sp = $metadataHandler->getMetaDataCurrentEntityID();
 $spMetadata = $metadataHandler->getMetaDataConfig($sp, 'saml20-sp-hosted');
 
 $b = SAML2_Binding::getCurrentBinding();
 if ($b instanceof SAML2_HTTPArtifact) {
 $b->setSPMetadata($spMetadata);
 }
 
 $response = $b->receive();
 if (!($response instanceof SAML2_Response)) {
 throw new SimpleSAML_Error_BadRequest('Invalid message received to AssertionConsumerService endpoint.');
 }
 
 $idp = $response->getIssuer();
 if ($idp === NULL) {
 throw new Exception('Missing <saml:Issuer> in message delivered to AssertionConsumerService.');
 }
 
 
 $idpMetadata = $metadataHandler->getMetaDataConfig($idp, 'saml20-idp-remote');
 
 /* Fetch the request information if it exists, fall back to RelayState if not. */
 $requestId = $response->getInResponseTo();
 $info = $session->getData('SAML2:SP:SSO:Info', $requestId);
 if($info === NULL) {
 /* Fall back to RelayState. */
 $info = array();
 $info['RelayState'] = SimpleSAML_Utilities::checkURLAllowed($response->getRelayState());
 if(empty($info['RelayState'])) {
 $info['RelayState'] = $spMetadata->getString('RelayState', NULL);
 }
 if(empty($info['RelayState'])) {
 /* RelayState missing. */
 throw new SimpleSAML_Error_Error('NORELAYSTATE');
 }
 }
 
 
 try {
 $assertion = sspmod_saml_Message::processResponse($spMetadata, $idpMetadata, $response);
 if (count($assertion) > 1) {
 throw new SimpleSAML_Error_Exception('More than one assertion in received response.');
 }
 $assertion = $assertion[0];
 } catch (sspmod_saml_Error $e) {
 /* The status of the response wasn't "success". */
 
 $status = $response->getStatus();
 if(array_key_exists('OnError', $info)) {
 /* We have an error handler. Return the error to it. */
 SimpleSAML_Utilities::redirectTrustedURL($info['OnError'], array('StatusCode' => $status['Code']));
 }
 
 /* We don't have an error handler. Show an error page. */
 throw new SimpleSAML_Error_Error('RESPONSESTATUSNOSUCCESS', $e);
 }
 
 
 SimpleSAML_Logger::info('SAML2.0 - SP.AssertionConsumerService: Successful response from IdP');
 
 /*
 * Attribute handling
 */
 $attributes = $assertion->getAttributes();
 
 SimpleSAML_Logger::stats('saml20-sp-SSO ' . $metadataHandler->getMetaDataCurrentEntityID() . ' ' . $idp . ' NA');
 
 
 $nameId = $assertion->getNameId();
 
 /* Begin module attribute processing */
 
 $spMetadataArray = $spMetadata->toArray();
 $idpMetadataArray = $idpMetadata->toArray();
 
 $pc = new SimpleSAML_Auth_ProcessingChain($idpMetadataArray, $spMetadataArray, 'sp');
 
 $authProcState = array(
 'core:saml20-sp:NameID' => $nameId,
 'core:saml20-sp:SessionIndex' => $assertion->getSessionIndex(),
 'core:saml20-sp:TargetURL' => $info['RelayState'],
 'ReturnURL' => SimpleSAML_Utilities::selfURLNoQuery(),
 'Attributes' => $attributes,
 'Destination' => $spMetadataArray,
 'Source' => $idpMetadataArray,
 );
 
 $pc->processState($authProcState);
 /* Since this function returns, processing has completed and attributes have
 * been updated.
 */
 
 finishLogin($authProcState);
 
 } catch(Exception $exception) {
 throw new SimpleSAML_Error_Error('PROCESSASSERTION', $exception);
 }
 
 
 ?>
 |