public function receive() : ?Message
    {
        if (array_key_exists('SAMLart', $_REQUEST)) {
            $artifact = base64_decode($_REQUEST['SAMLart']);
            $endpointIndex = bin2hex(substr($artifact, 2, 2));
            $sourceId = bin2hex(substr($artifact, 4, 20));
        } else {
            throw new \Exception('Missing SAMLart parameter.');
        }

        /** @psalm-suppress UndefinedClass */
        $metadataHandler = MetaDataStorageHandler::getMetadataHandler();

        $idpMetadata = $metadataHandler->getMetaDataConfigForSha1($sourceId, 'saml20-idp-remote');

        if ($idpMetadata === null) {
            throw new \Exception('No metadata found for remote provider with SHA1 ID: '.var_export($sourceId, true));
        }

        $endpoint = null;
        foreach ($idpMetadata->getEndpoints('ArtifactResolutionService') as $ep) {
            if ($ep['index'] === hexdec($endpointIndex)) {
                $endpoint = $ep;
                break;
            }
        }

        if ($endpoint === null) {
            throw new \Exception('No ArtifactResolutionService with the correct index.');
        }

        Utils::getContainer()->getLogger()->debug("ArtifactResolutionService endpoint being used is := ".$endpoint['Location']);

        //Construct the ArtifactResolve Request
        $ar = new ArtifactResolve();

        /* Set the request attributes */

        /** @psalm-suppress UndefinedClass */
        $ar->setIssuer($this->spMetadata->getString('entityid'));
        $ar->setArtifact($_REQUEST['SAMLart']);
        $ar->setDestination($endpoint['Location']);

        // sign the request
        /** @psalm-suppress UndefinedClass */
        MSG::addSign($this->spMetadata, $idpMetadata, $ar); // Shoaib - moved from the SOAPClient.

        $soap = new SOAPClient();

        // Send message through SoapClient
        /** @var \SAML2\ArtifactResponse $artifactResponse */
        $artifactResponse = $soap->send($ar, $this->spMetadata);

        if (!$artifactResponse->isSuccess()) {
            throw new \Exception('Received error from ArtifactResolutionService.');
        }

        $xml = $artifactResponse->getAny();
        if ($xml === null) {
            /* Empty ArtifactResponse - possibly because of Artifact replay? */

            throw new \Exception('Empty ArtifactResponse received, maybe a replay?');
        }

        $samlResponse = Message::fromXML($xml);
        $samlResponse->addValidator([get_class($this), 'validateSignature'], $artifactResponse);

        if (isset($_REQUEST['RelayState'])) {
            $samlResponse->setRelayState($_REQUEST['RelayState']);
        }

        return $samlResponse;
    }
public function receive() : ?Message
    {
        if (array_key_exists('SAMLart', $_REQUEST)) {
            $artifact = base64_decode($_REQUEST['SAMLart']);
            $endpointIndex = bin2hex(substr($artifact, 2, 2));
            $sourceId = bin2hex(substr($artifact, 4, 20));
        } else {
            throw new \Exception('Missing SAMLart parameter.');
        }

        /** @psalm-suppress UndefinedClass */
        $metadataHandler = MetaDataStorageHandler::getMetadataHandler();

        $idpMetadata = $metadataHandler->getMetaDataConfigForSha1($sourceId, 'saml20-idp-remote');

        if ($idpMetadata === null) {
            throw new \Exception('No metadata found for remote provider with SHA1 ID: '.var_export($sourceId, true));
        }

        $endpoint = null;
        foreach ($idpMetadata->getEndpoints('ArtifactResolutionService') as $ep) {
            if ($ep['index'] === hexdec($endpointIndex)) {
                $endpoint = $ep;
                break;
            }
        }

        if ($endpoint === null) {
            throw new \Exception('No ArtifactResolutionService with the correct index.');
        }

        Utils::getContainer()->getLogger()->debug("ArtifactResolutionService endpoint being used is := ".$endpoint['Location']);

        //Construct the ArtifactResolve Request
        $ar = new ArtifactResolve();

        /* Set the request attributes */

        /** @psalm-suppress UndefinedClass */
        $ar->setIssuer($this->spMetadata->getString('entityid'));
        $ar->setArtifact($_REQUEST['SAMLart']);
        $ar->setDestination($endpoint['Location']);

        // sign the request
        /** @psalm-suppress UndefinedClass */
        MSG::addSign($this->spMetadata, $idpMetadata, $ar); // Shoaib - moved from the SOAPClient.

        $soap = new SOAPClient();

        // Send message through SoapClient
        /** @var \SAML2\ArtifactResponse $artifactResponse */
        $artifactResponse = $soap->send($ar, $this->spMetadata);

        if (!$artifactResponse->isSuccess()) {
            throw new \Exception('Received error from ArtifactResolutionService.');
        }

        $xml = $artifactResponse->getAny();
        if ($xml === null) {
            /* Empty ArtifactResponse - possibly because of Artifact replay? */

            throw new \Exception('Empty ArtifactResponse received, maybe a replay?');
        }

        $samlResponse = Message::fromXML($xml);
        $samlResponse->addValidator([get_class($this), 'validateSignature'], $artifactResponse);

        if (isset($_REQUEST['RelayState'])) {
            $samlResponse->setRelayState($_REQUEST['RelayState']);
        }

        return $samlResponse;
    }
public function receive ( ) : ? Message { if ( array_key_exists ( 'SAMLart' , $ _REQUEST ) ) { $ artifact = base64_decode ( $ _REQUEST [ 'SAMLart' ] ) ; $ endpointIndex = bin2hex ( substr ( $ artifact , 2 , 2 ) ) ; $ sourceId = bin2hex ( substr ( $ artifact , 4 , 20 ) ) ; } else { throw new \ Exception ( 'Missing SAMLart parameter.' ) ; } /** @psalm-suppress UndefinedClass */ $ metadataHandler = MetaDataStorageHandler :: getMetadataHandler ( ) ; $ idpMetadata = $ metadataHandler -> getMetaDataConfigForSha1 ( $ sourceId , 'saml20-idp-remote' ) ; if ( $ idpMetadata === null ) { throw new \ Exception ( 'No metadata found for remote provider with SHA1 ID: ' . var_export ( $ sourceId , true ) ) ; } $ endpoint = null ; foreach ( $ idpMetadata -> getEndpoints ( 'ArtifactResolutionService' ) as $ ep ) { if ( $ ep [ 'index' ] === hexdec ( $ endpointIndex ) ) { $ endpoint = $ ep ; break ; } } if ( $ endpoint === null ) { throw new \ Exception ( 'No ArtifactResolutionService with the correct index.' ) ; } Utils :: getContainer ( ) -> getLogger ( ) -> debug ( "ArtifactResolutionService endpoint being used is := " . $ endpoint [ 'Location' ] ) ; //Construct the ArtifactResolve Request $ ar = new ArtifactResolve ( ) ; /* Set the request attributes */ /** @psalm-suppress UndefinedClass */ $ ar -> setIssuer ( $ this -> spMetadata -> getString ( 'entityid' ) ) ; $ ar -> setArtifact ( $ _REQUEST [ 'SAMLart' ] ) ; $ ar -> setDestination ( $ endpoint [ 'Location' ] ) ; // sign the request /** @psalm-suppress UndefinedClass */ MSG :: addSign ( $ this -> spMetadata , $ idpMetadata , $ ar ) ; // Shoaib - moved from the SOAPClient. $ soap = new SOAPClient ( ) ; // Send message through SoapClient /** @var \SAML2\ArtifactResponse $artifactResponse */ $ artifactResponse = $ soap -> send ( $ ar , $ this -> spMetadata ) ; if ( ! $ artifactResponse -> isSuccess ( ) ) { throw new \ Exception ( 'Received error from ArtifactResolutionService.' ) ; } $ xml = $ artifactResponse -> getAny ( ) ; if ( $ xml === null ) { /* Empty ArtifactResponse - possibly because of Artifact replay? */ throw new \ Exception ( 'Empty ArtifactResponse received, maybe a replay?' ) ; } $ samlResponse = Message :: fromXML ( $ xml ) ; $ samlResponse -> addValidator ( [ get_class ( $ this ) , 'validateSignature' ] , $ artifactResponse ) ; if ( isset ( $ _REQUEST [ 'RelayState' ] ) ) { $ samlResponse -> setRelayState ( $ _REQUEST [ 'RelayState' ] ) ; } return $ samlResponse ; }
Receive a SAML 2 message sent using the HTTP-Artifact binding.

Throws an exception if it is unable receive the message.

@throws \Exception
@return \SAML2\Message|null The received message.
Receive a SAML 2 message sent using the HTTP - Artifact binding .