From f1a4a2f0318d00db424054a51c4af7092b076667 Mon Sep 17 00:00:00 2001 From: Jaime Perez Crespo <jaime.perez@uninett.no> Date: Thu, 6 Aug 2015 16:18:18 +0200 Subject: [PATCH] Reformat SimpleSAML_Bindings_Shib13_HTTPPost. --- lib/SimpleSAML/Bindings/Shib13/HTTPPost.php | 253 +++++++++++--------- 1 file changed, 139 insertions(+), 114 deletions(-) diff --git a/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php b/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php index ea4d1352f..70624ceb9 100644 --- a/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php +++ b/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php @@ -1,123 +1,148 @@ <?php + /** * Implementation of the Shibboleth 1.3 HTTP-POST binding. * * @author Andreas Åkre Solberg, UNINETT AS. <andreas.solberg@uninett.no> * @package SimpleSAMLphp */ -class SimpleSAML_Bindings_Shib13_HTTPPost { - - private $configuration = null; - private $metadata = null; - - function __construct(SimpleSAML_Configuration $configuration, SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore) { - $this->configuration = $configuration; - $this->metadata = $metadatastore; - } - - /** - * Send an authenticationResponse using HTTP-POST. - * - * @param string $response The response which should be sent. - * @param SimpleSAML_Configuration $idpmd The metadata of the IdP which is sending the response. - * @param SimpleSAML_Configuration $spmd The metadata of the SP which is receiving the response. - * @param string|null $relayState The relaystate for the SP. - * @param string $shire The shire which should receive the response. - */ - public function sendResponse($response, SimpleSAML_Configuration $idpmd, SimpleSAML_Configuration $spmd, $relayState, $shire) { - - \SimpleSAML\Utils\XML::checkSAMLMessage($response, 'saml11'); - - $privatekey = SimpleSAML\Utils\Crypto::loadPrivateKey($idpmd, TRUE); - $publickey = SimpleSAML\Utils\Crypto::loadPublicKey($idpmd, TRUE); - - $responsedom = new DOMDocument(); - $responsedom->loadXML(str_replace ("\r", "", $response)); - - $responseroot = $responsedom->getElementsByTagName('Response')->item(0); - $firstassertionroot = $responsedom->getElementsByTagName('Assertion')->item(0); - - /* Determine what we should sign - either the Response element or the Assertion. The default - * is to sign the Assertion, but that can be overridden by the 'signresponse' option in the - * SP metadata or 'saml20.signresponse' in the global configuration. - * - * TODO: neither 'signresponse' nor 'shib13.signresponse' are valid options any longer. Remove! - */ - $signResponse = FALSE; - if ($spmd->hasValue('signresponse')) { - $signResponse = $spmd->getBoolean('signresponse'); - } else { - $signResponse = $this->configuration->getBoolean('shib13.signresponse', TRUE); - } - - /* Check if we have an assertion to sign. Force to sign the response if not. */ - if ($firstassertionroot === NULL) { - $signResponse = TRUE; - } - - $signer = new SimpleSAML_XML_Signer(array( - 'privatekey_array' => $privatekey, - 'publickey_array' => $publickey, - 'id' => ($signResponse ? 'ResponseID' : 'AssertionID') , - )); - - if ($idpmd->hasValue('certificatechain')) { - $signer->addCertificate($idpmd->getString('certificatechain')); - } - - if ($signResponse) { - /* Sign the response - this must be done after encrypting the assertion. */ - /* We insert the signature before the saml2p:Status element. */ - $statusElements = SimpleSAML\Utils\XML::getDOMChildren($responseroot, 'Status', '@saml1p'); - assert('count($statusElements) === 1'); - $signer->sign($responseroot, $responseroot, $statusElements[0]); - - } else { - /* Sign the assertion */ - $signer->sign($firstassertionroot, $firstassertionroot); - } - - $response = $responsedom->saveXML(); - - \SimpleSAML\Utils\XML::debugSAMLMessage($response, 'out'); - - \SimpleSAML\Utils\HTTP::submitPOSTData($shire, array( - 'TARGET' => $relayState, - 'SAMLResponse' => base64_encode($response), - )); - - } - - - /** - * Decode a received response. - * - * @param array $post POST data received. - * @return SimpleSAML_XML_Shib13_AuthnResponse The response decoded into an object. - */ - public function decodeResponse($post) { - assert('is_array($post)'); - - if (!array_key_exists('SAMLResponse', $post)) { - throw new Exception('Missing required SAMLResponse parameter.'); - } - $rawResponse = $post['SAMLResponse']; - $samlResponseXML = base64_decode($rawResponse); - - \SimpleSAML\Utils\XML::debugSAMLMessage($samlResponseXML, 'in'); - - \SimpleSAML\Utils\XML::checkSAMLMessage($samlResponseXML, 'saml11'); - - $samlResponse = new SimpleSAML_XML_Shib13_AuthnResponse(); - $samlResponse->setXML($samlResponseXML); - - if (array_key_exists('TARGET', $post)) { - $samlResponse->setRelayState($post['TARGET']); - } - - return $samlResponse; - } - +class SimpleSAML_Bindings_Shib13_HTTPPost +{ + + /** + * @var SimpleSAML_Configuration + */ + private $configuration = null; + + /** + * @var SimpleSAML_Metadata_MetaDataStorageHandler + */ + private $metadata = null; + + + /** + * Constructor for the SimpleSAML_Bindings_Shib13_HTTPPost class. + * + * @param SimpleSAML_Configuration $configuration The configuration to use. + * @param SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore A store where to find metadata. + */ + public function __construct( + SimpleSAML_Configuration $configuration, + SimpleSAML_Metadata_MetaDataStorageHandler $metadatastore + ) { + $this->configuration = $configuration; + $this->metadata = $metadatastore; + } + + + /** + * Send an authenticationResponse using HTTP-POST. + * + * @param string $response The response which should be sent. + * @param SimpleSAML_Configuration $idpmd The metadata of the IdP which is sending the response. + * @param SimpleSAML_Configuration $spmd The metadata of the SP which is receiving the response. + * @param string|null $relayState The relaystate for the SP. + * @param string $shire The shire which should receive the response. + */ + public function sendResponse( + $response, + SimpleSAML_Configuration $idpmd, + SimpleSAML_Configuration $spmd, + $relayState, + $shire + ) { + + \SimpleSAML\Utils\XML::checkSAMLMessage($response, 'saml11'); + + $privatekey = SimpleSAML\Utils\Crypto::loadPrivateKey($idpmd, true); + $publickey = SimpleSAML\Utils\Crypto::loadPublicKey($idpmd, true); + + $responsedom = new DOMDocument(); + $responsedom->loadXML(str_replace("\r", "", $response)); + + $responseroot = $responsedom->getElementsByTagName('Response')->item(0); + $firstassertionroot = $responsedom->getElementsByTagName('Assertion')->item(0); + + /* Determine what we should sign - either the Response element or the Assertion. The default is to sign the + * Assertion, but that can be overridden by the 'signresponse' option in the SP metadata or + * 'saml20.signresponse' in the global configuration. + * + * TODO: neither 'signresponse' nor 'shib13.signresponse' are valid options any longer. Remove! + */ + if ($spmd->hasValue('signresponse')) { + $signResponse = $spmd->getBoolean('signresponse'); + } else { + $signResponse = $this->configuration->getBoolean('shib13.signresponse', true); + } + + // check if we have an assertion to sign. Force to sign the response if not + if ($firstassertionroot === null) { + $signResponse = true; + } + + $signer = new SimpleSAML_XML_Signer(array( + 'privatekey_array' => $privatekey, + 'publickey_array' => $publickey, + 'id' => ($signResponse ? 'ResponseID' : 'AssertionID'), + )); + + if ($idpmd->hasValue('certificatechain')) { + $signer->addCertificate($idpmd->getString('certificatechain')); + } + + if ($signResponse) { + // sign the response - this must be done after encrypting the assertion + // we insert the signature before the saml2p:Status element + $statusElements = SimpleSAML\Utils\XML::getDOMChildren($responseroot, 'Status', '@saml1p'); + assert('count($statusElements) === 1'); + $signer->sign($responseroot, $responseroot, $statusElements[0]); + } else { + /* Sign the assertion */ + $signer->sign($firstassertionroot, $firstassertionroot); + } + + $response = $responsedom->saveXML(); + + \SimpleSAML\Utils\XML::debugSAMLMessage($response, 'out'); + + \SimpleSAML\Utils\HTTP::submitPOSTData($shire, array( + 'TARGET' => $relayState, + 'SAMLResponse' => base64_encode($response), + )); + } + + + /** + * Decode a received response. + * + * @param array $post POST data received. + * + * @return SimpleSAML_XML_Shib13_AuthnResponse The response decoded into an object. + * + * @throws Exception If there is no SAMLResponse parameter. + */ + public function decodeResponse($post) + { + assert('is_array($post)'); + + if (!array_key_exists('SAMLResponse', $post)) { + throw new Exception('Missing required SAMLResponse parameter.'); + } + $rawResponse = $post['SAMLResponse']; + $samlResponseXML = base64_decode($rawResponse); + + \SimpleSAML\Utils\XML::debugSAMLMessage($samlResponseXML, 'in'); + + \SimpleSAML\Utils\XML::checkSAMLMessage($samlResponseXML, 'saml11'); + + $samlResponse = new SimpleSAML_XML_Shib13_AuthnResponse(); + $samlResponse->setXML($samlResponseXML); + + if (array_key_exists('TARGET', $post)) { + $samlResponse->setRelayState($post['TARGET']); + } + + return $samlResponse; + } } - -- GitLab