From 3707ceabbae18b3a6d4d9cc48e1b643948fc56be Mon Sep 17 00:00:00 2001 From: Olav Morken <olav.morken@uninett.no> Date: Wed, 5 Jan 2011 12:17:59 +0000 Subject: [PATCH] saml:IdP: Extract extensions from authentication request. Thanks to Andjelko Horvat for implementing this! git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@2701 44740490-163a-0410-bde0-09ae8108e29a --- lib/SAML2/AuthnRequest.php | 30 +++++++++++++++++++ lib/SAML2/XML/samlp/Extensions.php | 48 ++++++++++++++++++++++++++++++ modules/saml/lib/IdP/SAML2.php | 3 ++ 3 files changed, 81 insertions(+) create mode 100644 lib/SAML2/XML/samlp/Extensions.php diff --git a/lib/SAML2/AuthnRequest.php b/lib/SAML2/AuthnRequest.php index dc1c26dc9..44fa85c1d 100644 --- a/lib/SAML2/AuthnRequest.php +++ b/lib/SAML2/AuthnRequest.php @@ -79,6 +79,12 @@ class SAML2_AuthnRequest extends SAML2_Request { */ private $requestedAuthnContext; + /** + * Request extensions. + * + * @var array + */ + private $extensions; /** * Constructor for SAML 2 authentication request messages. @@ -165,6 +171,8 @@ class SAML2_AuthnRequest extends SAML2_Request { } } + + $this->extensions = SAML2_XML_samlp_Extensions::getList($xml); } @@ -346,6 +354,28 @@ class SAML2_AuthnRequest extends SAML2_Request { } + /** + * Retrieve the Extensions. + * + * @return SAML2_XML_samlp_Extensions. + */ + public function getExtensions() { + return $this->extensions; + } + + + /** + * Set the Extensions. + * + * @param array|NULL $extensions The Extensions. + */ + public function setExtensions($extensions) { + assert('is_array($extensions) || is_null($extensions)'); + + $this->extensions = $extensions; + } + + /** * Convert this authentication request to an XML element. * diff --git a/lib/SAML2/XML/samlp/Extensions.php b/lib/SAML2/XML/samlp/Extensions.php new file mode 100644 index 000000000..ad86c3f58 --- /dev/null +++ b/lib/SAML2/XML/samlp/Extensions.php @@ -0,0 +1,48 @@ +<?php + +/** + * Class for handling SAML2 extensions. + * + * @package simpleSAMLphp + * @version $Id$ + */ +class SAML2_XML_samlp_Extensions { + + /** + * Get a list of Extensions in the given element. + * + * @param DOMElement $parent The element that may contain the samlp:Extensions element. + * @return array Array of extensions. + */ + public static function getList(DOMElement $parent) { + + $ret = array(); + foreach (SAML2_Utils::xpQuery($parent, './saml_protocol:Extensions/*') as $node) { + $ret[] = new SAML2_XML_Chunk($node); + } + + return $ret; + } + + + /** + * Add a list of Extensions to the given element. + * + * @param DOMElement $parent The element we should add the extensions to. + * @param array $extensions List of extension objects. + */ + public static function addList(DOMElement $parent, array $extensions) { + + if (empty($extensions)) { + return; + } + + $extElement = $parent->ownerDocument->createElementNS(SAML2_Const::NS_SAMLP, 'samlp:Extensions'); + $parent->appendChild($extElement); + + foreach ($extensions as $ext) { + $ext->toXML($extElement); + } + } + +} diff --git a/modules/saml/lib/IdP/SAML2.php b/modules/saml/lib/IdP/SAML2.php index 85050b4b4..589b343ef 100644 --- a/modules/saml/lib/IdP/SAML2.php +++ b/modules/saml/lib/IdP/SAML2.php @@ -173,6 +173,7 @@ class sspmod_saml_IdP_SAML2 { $forceAuthn = FALSE; $isPassive = FALSE; $consumerURL = NULL; + $extensions = NULL; SimpleSAML_Logger::info('SAML2.0 - IdP.SSOService: IdP initiated authentication: '. var_export($spEntityId, TRUE)); @@ -204,6 +205,7 @@ class sspmod_saml_IdP_SAML2 { $isPassive = $request->getIsPassive(); $consumerURL = $request->getAssertionConsumerServiceURL(); $protocolBinding = $request->getProtocolBinding(); + $extensions = $request->getExtensions(); $nameIdPolicy = $request->getNameIdPolicy(); if (isset($nameIdPolicy['Format'])) { @@ -283,6 +285,7 @@ class sspmod_saml_IdP_SAML2 { 'saml:ConsumerURL' => $consumerURL, 'saml:Binding' => $protocolBinding, 'saml:NameIDFormat' => $nameIDFormat, + 'saml:Extensions' => $extensions, ); $idp->handleAuthenticationRequest($state); -- GitLab