From e72dca49a6da57177e69033221276124fa063f61 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:22:51 +0200 Subject: [PATCH 001/236] Remove invalid return value and document thrown exception Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 6d44be0a..d9be63b2 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -150,8 +150,7 @@ public function getSettings() * Set the strict mode active/disable * * @param bool $value Strict parameter - * - * @return array The settings data. + * @throws OneLogin_Saml2_Error */ public function setStrict($value) { From dfa74d41b930463d627b8e6dd7c8fa27a35236fc Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:24:43 +0200 Subject: [PATCH 002/236] _errorReason can also be of value null if no error happened Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index d9be63b2..8673a1ef 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -98,7 +98,7 @@ class OneLogin_Saml2_Auth /** * Reason of the last error. * - * @var string + * @var string|null */ private $_errorReason; @@ -387,7 +387,7 @@ public function getErrors() /** * Returns the reason for the last error * - * @return string Error reason + * @return string|null Error reason */ public function getLastErrorReason() { From e7e1bbff37a0c44bb270f92198e4ff085e841571 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:29:08 +0200 Subject: [PATCH 003/236] \OneLogin_Saml2_Auth::$_sessionExpiration is of type int or null Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 8673a1ef..91dae32e 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -62,7 +62,7 @@ class OneLogin_Saml2_Auth * SessionNotOnOrAfter. When the user is logged, this stored it * from the AuthnStatement of the SAML Response * - * @var DateTime + * @var int|null */ private $_sessionExpiration; From 9c71cfcc06a24435048b7dd2b84d3eb3ceafa83c Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:32:59 +0200 Subject: [PATCH 004/236] \OneLogin_Saml2_Utils::redirect returns a string or redirects and exits Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 91dae32e..e1f420f6 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -291,6 +291,7 @@ public function processSLO($keepLocalSession = false, $requestId = null, $retrie * @param string $url The target URL to redirect the user. * @param array $parameters Extra parameters to be passed as part of the url * @param bool $stay True if we want to stay (returns the url string) False to redirect + * @return string|null */ public function redirectTo($url = '', $parameters = array(), $stay = false) { @@ -422,7 +423,7 @@ public function getAttribute($name) * @param bool $stay True if we want to stay (returns the url string) False to redirect * @param bool $setNameIdPolicy When true the AuthNReuqest will set a nameIdPolicy element * - * @return If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters + * @return string|null If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters */ public function login($returnTo = null, $parameters = array(), $forceAuthn = false, $isPassive = false, $stay = false, $setNameIdPolicy = true) { @@ -462,7 +463,7 @@ public function login($returnTo = null, $parameters = array(), $forceAuthn = fal * @param string|null $nameIdFormat The NameID Format will be set in the LogoutRequest. * @param string|null $nameIdNameQualifier The NameID NameQualifier will be set in the LogoutRequest. * - * @return If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters + * @return string|null If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters * * @throws OneLogin_Saml2_Error */ From b967743f2e9f5e2bd81338bc05397a00866d35ce Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:34:33 +0200 Subject: [PATCH 005/236] Explicitly typehint $matches Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 78d723a2..db3ddd9b 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -725,6 +725,7 @@ public static function parseDuration($duration, $timestamp = null) /* Parse the duration. We use a very strict pattern. */ $durationRegEx = '#^(-?)P(?:(?:(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?)|(?:(\\d+)W))$#D'; + $matches = []; if (!preg_match($durationRegEx, $duration, $matches)) { throw new Exception('Invalid ISO 8601 duration: ' . $duration); } From d2f73cbcca063d9c270ae989ea92b074003509bf Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:36:31 +0200 Subject: [PATCH 006/236] Annotate missing @throws tag Signed-off-by: Lukas Reschke --- lib/Saml2/Settings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 681c1ee1..e72769b7 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -997,6 +997,7 @@ public function getErrors() * Activates or deactivates the strict mode. * * @param bool $value Strict parameter + * @throws Exception */ public function setStrict($value) { From b99c73351229cd808bf3d0ee1bf10ab45267e559 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:37:54 +0200 Subject: [PATCH 007/236] $spValidationOnly is a boolean and not an array Signed-off-by: Lukas Reschke --- lib/Saml2/Settings.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index e72769b7..49b86aba 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -88,7 +88,7 @@ class OneLogin_Saml2_Settings /** * Setting errors. * - * @var array + * @var bool */ private $_spValidationOnly = false; @@ -98,6 +98,7 @@ class OneLogin_Saml2_Settings * - Loads settings info from settings file or array/object provided * * @param array|object|null $settings SAML Toolkit Settings + * @param bool $spValidationOnly * * @throws OneLogin_Saml2_Error If any settings parameter is invalid * @throws Exception If OneLogin_Saml2_Settings is incorrectly supplied From fcf39f91237ec1d4a4c23b8652d96e5fc9c592af Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:39:11 +0200 Subject: [PATCH 008/236] Parameters are of type array Signed-off-by: Lukas Reschke --- lib/Saml2/IdPMetadataParser.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index d9fcd9f6..9e7ca38f 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -189,8 +189,8 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n /** * Inject metadata info into php-saml settings array * - * @param string $settings php-saml settings array - * @param string $metadataInfo array metadata info + * @param array $settings php-saml settings array + * @param array $metadataInfo array metadata info * * @return array settings */ From 28d0362b3a765824fbc10d0468ce902b11f075b0 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:41:44 +0200 Subject: [PATCH 009/236] \OneLogin_Saml2_Utils::parseTime2SAML also accepts int Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index db3ddd9b..3b96b302 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -651,7 +651,7 @@ public static function generateUniqueID() * Converts a UNIX timestamp to SAML2 timestamp on the form * yyyy-mm-ddThh:mm:ss(\.s+)?Z. * - * @param string $time The time we should convert (DateTime). + * @param string|int $time The time we should convert (DateTime). * * @return string $timestamp SAML2 timestamp. */ From 3bb791c22124e2859cedc9c96bc87bfde4b712cb Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:46:45 +0200 Subject: [PATCH 010/236] Reference proper parameter name Signed-off-by: Lukas Reschke --- lib/Saml2/Settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 49b86aba..da7d358c 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -1050,7 +1050,7 @@ public function getBaseURL() /** * Sets the IdP certificate. * - * @param string $value IdP certificate + * @param string $cert IdP certificate */ public function setIdPCert($cert) { From d5042da68902de2b0cc2afd314ea38daf57b34c4 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:48:09 +0200 Subject: [PATCH 011/236] Add missing $alg parameter Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 3b96b302..780045aa 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -884,6 +884,7 @@ public static function deleteLocalSession() * Calculates the fingerprint of a x509cert. * * @param string $x509cert x509 cert + * @param string $alg * * @return null|string Formatted fingerprint */ From a51ed65313504c0f707ca9f1676c8c597b7ddfba Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:49:55 +0200 Subject: [PATCH 012/236] \OneLogin_Saml2_Utils::getExpireTime can also return null Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 780045aa..d22e6a84 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -800,7 +800,7 @@ public static function parseDuration($duration, $timestamp = null) * @param string $cacheDuration The duration, as a string. * @param string $validUntil The valid until date, as a string or as a timestamp * - * @return int $expireTime The expiration time. + * @return int|null $expireTime The expiration time. */ public static function getExpireTime($cacheDuration = null, $validUntil = null) { From 462bb480ca10fade2dedcc8db992db4cc0ecf83e Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:50:53 +0200 Subject: [PATCH 013/236] Cast mt_rand to string Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index d22e6a84..3120533d 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -644,7 +644,7 @@ public static function extractOriginalQueryParam($name) */ public static function generateUniqueID() { - return 'ONELOGIN_' . sha1(uniqid(mt_rand(), true)); + return 'ONELOGIN_' . sha1(uniqid((string)mt_rand(), true)); } /** From 87ff36f9a8fd2030b5c064622bd8e7c5c0d940e6 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:52:22 +0200 Subject: [PATCH 014/236] Members in \OneLogin_Saml2_Utils can also be null Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 3120533d..f86337fb 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -18,22 +18,22 @@ class OneLogin_Saml2_Utils /** - * @var string + * @var string|null */ private static $_host; /** - * @var string + * @var string|null */ private static $_protocol; /** - * @var int + * @var int|null */ private static $_port; /** - * @var string + * @var string|null */ private static $_baseurlpath; From f432eb58cd16272fa2a1677b1f18aa5b7fac6688 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 15:56:21 +0200 Subject: [PATCH 015/236] Add missing Exception annotation to \OneLogin_Saml2_IdPMetadataParser::parseXML Signed-off-by: Lukas Reschke --- lib/Saml2/IdPMetadataParser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 9e7ca38f..ce6a6938 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -79,6 +79,7 @@ public static function parseFileXML($filepath, $entityId = null, $desiredNameIdF * @param string $desiredNameIdFormat If available on IdP metadata, use that nameIdFormat * * @return array metadata info in php-saml settings format + * @throws \Exception */ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = null) { From cc0e5c1a09f1ebb35f30b66cce76cc1942a5b12e Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:00:19 +0200 Subject: [PATCH 016/236] Add proper return value annotations for \OneLogin_Saml2_Response::getId and \OneLogin_Saml2_Response::getAssertionId Signed-off-by: Lukas Reschke --- lib/Saml2/Response.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index c88c3c3e..76c096aa 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -409,7 +409,7 @@ public function isValid($requestId = null) } /** - * @return the ID of the Response + * @return string|null the ID of the Response */ public function getId() { @@ -421,7 +421,7 @@ public function getId() } /** - * @return the ID of the assertion in the Response + * @return string|null the ID of the assertion in the Response */ public function getAssertionId() { From 0d42ea136fbf7c27203b7aed90384d1d24431601 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:01:44 +0200 Subject: [PATCH 017/236] Replace IllegalArgumentException with InvalidArgumentException IllegalArgumentException doesn't exist in PHP Signed-off-by: Lukas Reschke --- lib/Saml2/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 76c096aa..5b286cc0 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -426,7 +426,7 @@ public function getId() public function getAssertionId() { if (!$this->validateNumAssertions()) { - throw new IllegalArgumentException("SAML Response must contain 1 Assertion."); + throw new InvalidArgumentException("SAML Response must contain 1 Assertion."); } $assertionNodes = $this->_queryAssertion(""); $id = null; From 9326f69d9e18148dfcc3825f83cc838ad7b826d3 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:05:48 +0200 Subject: [PATCH 018/236] Add proper type hints to \OneLogin_Saml2_Response::getAssertionNotOnOrAfter Signed-off-by: Lukas Reschke --- lib/Saml2/Response.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 5b286cc0..8850a0f5 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -47,7 +47,7 @@ class OneLogin_Saml2_Response /** * NotOnOrAfter value of a valid SubjectConfirmationData node * - * @var DateTime + * @var int */ private $_validSCDNotOnOrAfter; @@ -439,7 +439,8 @@ public function getAssertionId() } /** - * @return the NotOnOrAfter value of the valid SubjectConfirmationData * node if any + * @return int the NotOnOrAfter value of the valid SubjectConfirmationData + * node if any */ public function getAssertionNotOnOrAfter() { From d43797da37343f70d37c1192d968a3c5447803fd Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:07:38 +0200 Subject: [PATCH 019/236] Add proper type hints to \OneLogin_Saml2_Auth::getLastAssertionNotOnOrAfter Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index e1f420f6..3863053b 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -84,7 +84,7 @@ class OneLogin_Saml2_Auth * The NotOnOrAfter value of the valid SubjectConfirmationData * node (if any) of the last assertion processed * - * @var DateTime + * @var int */ private $_lastAssertionNotOnOrAfter; @@ -651,7 +651,7 @@ public function getLastAssertionId() } /** - * @return The NotOnOrAfter value of the valid + * @return int The NotOnOrAfter value of the valid * SubjectConfirmationData node (if any) * of the last assertion processed */ From 9718ec7bfd02e28c672a866b16154aecb5fdd23f Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:10:14 +0200 Subject: [PATCH 020/236] Remove $idpInfo PhanUndeclaredVariableDim Variable $idpInfo was undeclared, but array fields are being added to it. Signed-off-by: Lukas Reschke --- lib/Saml2/IdPMetadataParser.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index ce6a6938..9d1adae7 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -144,13 +144,11 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n if (!empty($keyDescriptorCertSigningNodes) || !empty($keyDescriptorCertEncryptionNodes)) { $metadataInfo['idp']['x509certMulti'] = array(); if (!empty($keyDescriptorCertSigningNodes)) { - $idpInfo['x509certMulti']['signing'] = array(); foreach ($keyDescriptorCertSigningNodes as $keyDescriptorCertSigningNode) { $metadataInfo['idp']['x509certMulti']['signing'][] = OneLogin_Saml2_Utils::formatCert($keyDescriptorCertSigningNode->nodeValue, false); } } if (!empty($keyDescriptorCertEncryptionNodes)) { - $idpInfo['x509certMulti']['encryption'] = array(); foreach ($keyDescriptorCertEncryptionNodes as $keyDescriptorCertEncryptionNode) { $metadataInfo['idp']['x509certMulti']['encryption'][] = OneLogin_Saml2_Utils::formatCert($keyDescriptorCertEncryptionNode->nodeValue, false); } From e5cb6bcd09e8ba888abcc763a3a33f0f4cd38aa3 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:11:52 +0200 Subject: [PATCH 021/236] Add proper data type to \OneLogin_Saml2_LogoutResponse::getId Signed-off-by: Lukas Reschke --- lib/Saml2/LogoutResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index c6b97ed9..acd7cb33 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -271,7 +271,7 @@ public function getError() } /** - * @return the ID of the Response + * @return string the ID of the Response */ public function getId() { From fdb3078ab228cf7c3fd892c66c28a9063d7378d2 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:12:29 +0200 Subject: [PATCH 022/236] \OneLogin_Saml2_LogoutResponse::getStatus can also return null Signed-off-by: Lukas Reschke --- lib/Saml2/LogoutResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index acd7cb33..c65bbf28 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -87,7 +87,7 @@ public function getIssuer() /** * Gets the Status of the Logout Response. * - * @return string The Status + * @return string|null The Status */ public function getStatus() { From 9329e6f3e1373318bdede29f4058fda8a70a73ee Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:14:25 +0200 Subject: [PATCH 023/236] \OneLogin_Saml2_Auth::getLastResponseXML can also return null Signed-off-by: Lukas Reschke --- lib/Saml2/Auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 3863053b..9c0af58e 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -677,7 +677,7 @@ public function getLastRequestXML() * If the SAMLResponse was encrypted, by default tries * to return the decrypted XML. * - * @return string The Response XML + * @return string|null The Response XML */ public function getLastResponseXML() { From 4114b66f8432646b314420a7e081a260b487267f Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:14:53 +0200 Subject: [PATCH 024/236] \OneLogin_Saml2_LogoutResponse::$_error can also be null Signed-off-by: Lukas Reschke --- lib/Saml2/LogoutResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index c65bbf28..e41dcd64 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -32,7 +32,7 @@ class OneLogin_Saml2_LogoutResponse /** * After execute a validation process, if it fails, this var contains the cause - * @var string + * @var string|null */ private $_error; From 6f2b4bff34164624a5607d0e93c4c8674d6ccbc2 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 16:15:35 +0200 Subject: [PATCH 025/236] Add missing throw tag to \OneLogin_Saml2_Response::getIssuers Signed-off-by: Lukas Reschke --- lib/Saml2/Response.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 8850a0f5..894f0015 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -525,6 +525,7 @@ public function getAudiences() * Gets the Issuers (from Response and Assertion). * * @return array @issuers The issuers of the assertion/response + * @throws OneLogin_Saml2_ValidationError */ public function getIssuers() { From c61d3c10c544581804a2589c945e46c386911ec5 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 19:26:18 +0200 Subject: [PATCH 026/236] $settings and $advancedSettings is included => suppress Signed-off-by: Lukas Reschke --- lib/Saml2/Settings.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index da7d358c..de500ff7 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -288,6 +288,7 @@ private function _loadSettingsFromArray($settings) * * @return bool True if the settings info is valid * @throws OneLogin_Saml2_Error + * @suppress PhanUndeclaredVariable */ private function _loadSettingsFromFile() { @@ -301,13 +302,15 @@ private function _loadSettingsFromFile() ); } - include $filename; + /** @var array $settings */ + include $filename; // Add advance_settings if exists $advancedFilename = $this->getConfigPath().'advanced_settings.php'; if (file_exists($advancedFilename)) { + /** @var array $advancedSettings */ include $advancedFilename; $settings = array_merge($settings, $advancedSettings); } From 9eb5ab6b815da25fee0b0a2d2785efae621b6533 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 20:03:21 +0200 Subject: [PATCH 027/236] Those functions also can return null Signed-off-by: Lukas Reschke --- lib/Saml2/Response.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 894f0015..f8cbda0d 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -623,7 +623,7 @@ public function getNameIdData() /** * Gets the NameID provided by the SAML response from the IdP. * - * @return string Name ID Value + * @return string|null Name ID Value */ public function getNameId() { @@ -638,7 +638,7 @@ public function getNameId() /** * Gets the NameID Format provided by the SAML response from the IdP. * - * @return string Name ID Format + * @return string|null Name ID Format */ public function getNameIdFormat() { @@ -653,7 +653,7 @@ public function getNameIdFormat() /** * Gets the NameID NameQualifier provided by the SAML response from the IdP. * - * @return string Name ID NameQualifier + * @return string|null Name ID NameQualifier */ public function getNameIdNameQualifier() { From 34832f2c79e9500c7de0d3fba55c2ac04aea4734 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 20:13:28 +0200 Subject: [PATCH 028/236] Suppress the undeclared constants Ref https://github.com/phan/phan/issues/707 Signed-off-by: Lukas Reschke --- lib/Saml2/Settings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index de500ff7..451c5eb8 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -150,6 +150,7 @@ public function __construct($settings = null, $spValidationOnly = false) /** * Sets the paths of the different folders + * @suppress PhanUndeclaredConstant */ private function _loadPaths() { From effabe29a0a0e5b220704c5e6f4faadaed7820f6 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 3 Oct 2017 20:16:39 +0200 Subject: [PATCH 029/236] \OneLogin_Saml2_Utils::loadXML can also return false Signed-off-by: Lukas Reschke --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index f86337fb..b999f689 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -73,7 +73,7 @@ public static function t($msg, $args = array()) * * @throws Exception * - * @return DOMDocument $dom The result of load the XML at the DomDocument + * @return DOMDocument|false $dom The result of load the XML at the DomDocument */ public static function loadXML($dom, $xml) { From 0e6ee4f12ec70d7d8414bbba17fcb0fca064e1d5 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 18 Oct 2017 17:17:17 +0200 Subject: [PATCH 030/236] Add an extra filter to the url to be used on redirection --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 78d723a2..56a5fff3 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -253,7 +253,7 @@ public static function redirect($url, $parameters = array(), $stay = false) } /* Verify that the URL is to a http or https site. */ - if (!preg_match('@^https?://@i', $url)) { + if (!preg_match('@^https?://@i', $url) || empty($url = filter_var($url, FILTER_VALIDATE_URL))) { throw new OneLogin_Saml2_Error( 'Redirect to invalid URL: ' . $url, OneLogin_Saml2_Error::REDIRECT_INVALID_URL From 52e2fde442a8b6e6a12950cdf274e31a4862a256 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 18 Oct 2017 17:28:07 +0200 Subject: [PATCH 031/236] . --- lib/Saml2/Utils.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 56a5fff3..86fb4954 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -253,7 +253,9 @@ public static function redirect($url, $parameters = array(), $stay = false) } /* Verify that the URL is to a http or https site. */ - if (!preg_match('@^https?://@i', $url) || empty($url = filter_var($url, FILTER_VALIDATE_URL))) { + $wrongProtocol = !preg_match('@^https?://@i', $url); + $url = filter_var($url, FILTER_VALIDATE_URL); + if ($wrongProtocol || empty($url)) { throw new OneLogin_Saml2_Error( 'Redirect to invalid URL: ' . $url, OneLogin_Saml2_Error::REDIRECT_INVALID_URL From 30ad63f5027bb17df421a2fc6f2ad422432ad247 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 18 Oct 2017 17:52:13 +0200 Subject: [PATCH 032/236] Fix #263. Issue with LogoutRequest rejected by ADFS due NameID with unspecified format instead no format attribute --- lib/Saml2/LogoutRequest.php | 3 +- lib/Saml2/Utils.php | 6 +- .../src/OneLogin/Saml2/LogoutRequestTest.php | 70 ++++++++++++++++++- tests/src/OneLogin/Saml2/UtilsTest.php | 19 +++++ 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 0c77a692..a10fdd80 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -72,7 +72,8 @@ public function __construct(OneLogin_Saml2_Settings $settings, $request = null, } if (!empty($nameId)) { - if (empty($nameIdFormat)) { + if (empty($nameIdFormat) && + $spData['NameIDFormat'] != OneLogin_Saml2_Constants::NAMEID_UNSPECIFIED) { $nameIdFormat = $spData['NameIDFormat']; } $spNameQualifier = null; diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 86fb4954..4f772d64 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -954,7 +954,7 @@ public static function formatFingerPrint($fingerprint) * * @return string $nameIDElement DOMElement | XMLSec nameID */ - public static function generateNameId($value, $spnq, $format, $cert = null, $nq = null) + public static function generateNameId($value, $spnq, $format = null, $cert = null, $nq = null) { $doc = new DOMDocument(); @@ -966,7 +966,9 @@ public static function generateNameId($value, $spnq, $format, $cert = null, $nq if (isset($nq)) { $nameId->setAttribute('NameQualifier', $nq); } - $nameId->setAttribute('Format', $format); + if (isset($format)) { + $nameId->setAttribute('Format', $format); + } $nameId->appendChild($doc->createTextNode($value)); $doc->appendChild($nameId); diff --git a/tests/src/OneLogin/Saml2/LogoutRequestTest.php b/tests/src/OneLogin/Saml2/LogoutRequestTest.php index 20268294..4c69f221 100644 --- a/tests/src/OneLogin/Saml2/LogoutRequestTest.php +++ b/tests/src/OneLogin/Saml2/LogoutRequestTest.php @@ -109,7 +109,7 @@ public function testConstructorWithSessionIndex() * * @covers OneLogin_Saml2_LogoutRequest */ - public function testConstructorWithNameIdFormat() + public function testConstructorWithNameIdFormatOnParameter() { $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings1.php'; @@ -137,6 +137,74 @@ public function testConstructorWithNameIdFormat() $this->assertEquals($nameIdFormat, $logoutNameIdData['Format']); } + /** + * Tests the OneLogin_Saml2_LogoutRequest Constructor. + * + * @covers OneLogin_Saml2_LogoutRequest + */ + public function testConstructorWithNameIdFormatOnSettings() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $nameId = 'test@example.com'; + $nameIdFormat = 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'; + $settingsInfo['sp']['NameIDFormat'] = $nameIdFormat; + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $logoutRequest = new OneLogin_Saml2_LogoutRequest($settings, null, $nameId, null, null); + + $parameters = array('SAMLRequest' => $logoutRequest->getRequest()); + $logoutUrl = OneLogin_Saml2_Utils::redirect('http://idp.example.com/SingleLogoutService.php', $parameters, true); + $this->assertRegExp('#^http://idp\.example\.com\/SingleLogoutService\.php\?SAMLRequest=#', $logoutUrl); + parse_str(parse_url(http://github.com/$logoutUrl,%20PHP_URL_QUERY), $exploded); + // parse_url already urldecode de params so is not required. + $payload = $exploded['SAMLRequest']; + $decoded = base64_decode($payload); + $inflated = gzinflate($decoded); + $this->assertRegExp('#^assertEquals($nameId, $logoutNameId); + + $logoutNameIdData = OneLogin_Saml2_LogoutRequest::getNameIdData($inflated); + $this->assertEquals($nameIdFormat, $logoutNameIdData['Format']); + } + + /** + * Tests the OneLogin_Saml2_LogoutRequest Constructor. + * + * @covers OneLogin_Saml2_LogoutRequest + */ + public function testConstructorWithoutNameIdFormat() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $nameId = 'test@example.com'; + $nameIdFormat = 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified'; + $settingsInfo['sp']['NameIDFormat'] = $nameIdFormat; + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $logoutRequest = new OneLogin_Saml2_LogoutRequest($settings, null, $nameId, null, null); + + $parameters = array('SAMLRequest' => $logoutRequest->getRequest()); + $logoutUrl = OneLogin_Saml2_Utils::redirect('http://idp.example.com/SingleLogoutService.php', $parameters, true); + $this->assertRegExp('#^http://idp\.example\.com\/SingleLogoutService\.php\?SAMLRequest=#', $logoutUrl); + parse_str(parse_url(http://github.com/$logoutUrl,%20PHP_URL_QUERY), $exploded); + // parse_url already urldecode de params so is not required. + $payload = $exploded['SAMLRequest']; + $decoded = base64_decode($payload); + $inflated = gzinflate($decoded); + $this->assertRegExp('#^assertEquals($nameId, $logoutNameId); + + $logoutNameIdData = OneLogin_Saml2_LogoutRequest::getNameIdData($inflated); + $this->assertFalse(isset($logoutNameIdData['Format'])); + } + /** * Tests the OneLogin_Saml2_LogoutRequest Constructor. * diff --git a/tests/src/OneLogin/Saml2/UtilsTest.php b/tests/src/OneLogin/Saml2/UtilsTest.php index 4d2b5ecc..2317859e 100644 --- a/tests/src/OneLogin/Saml2/UtilsTest.php +++ b/tests/src/OneLogin/Saml2/UtilsTest.php @@ -812,6 +812,25 @@ public function testGenerateNameIdWithSPNameQualifier() $this->assertContains($nameidExpectedEnc, $nameIdEnc); } + /** + * Tests the generateNameId method of the OneLogin_Saml2_Utils + * + * @covers OneLogin_Saml2_Utils::generateNameId + */ + public function testGenerateNameIdWithoutFormat() + { + $nameIdValue = 'ONELOGIN_ce998811003f4e60f8b07a311dc641621379cfde'; + + $nameId = OneLogin_Saml2_Utils::generateNameId( + $nameIdValue, + null, + null + ); + + $expectedNameId = 'ONELOGIN_ce998811003f4e60f8b07a311dc641621379cfde'; + $this->assertEquals($nameId, $expectedNameId); + } + /** * Tests the generateNameId method of the OneLogin_Saml2_Utils * From 282b39dfce4def24f2509904ee6e6a4a1672f54b Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 6 Nov 2017 12:10:10 +0100 Subject: [PATCH 033/236] Fix 250. Fixed issue with IdPMetadataParser only keeping 1 certificate when multiple certificates of a single type were provided. Add and to IdP Parser methods --- lib/Saml2/IdPMetadataParser.php | 24 +- tests/data/metadata/idp/idp_metadata.xml | 42 +++ tests/data/metadata/idp/idp_metadata2.xml | 1 + .../metadata/idp/idp_metadata_multi_certs.xml | 75 +++++ .../idp/idp_metadata_multi_signing_certs.xml | 75 +++++ .../metadata/idp/idp_multiple_descriptors.xml | 53 +++ .../data/metadata/idp/testshib-providers.xml | 311 ++++++++++++++++++ .../OneLogin/Saml2/IdPMetadataParserTest.php | 196 +++++++++++ 8 files changed, 769 insertions(+), 8 deletions(-) create mode 100644 tests/data/metadata/idp/idp_metadata.xml create mode 100644 tests/data/metadata/idp/idp_metadata2.xml create mode 100644 tests/data/metadata/idp/idp_metadata_multi_certs.xml create mode 100644 tests/data/metadata/idp/idp_metadata_multi_signing_certs.xml create mode 100644 tests/data/metadata/idp/idp_multiple_descriptors.xml create mode 100644 tests/data/metadata/idp/testshib-providers.xml diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index d9fcd9f6..8c0b51c9 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -16,10 +16,12 @@ class OneLogin_Saml2_IdPMetadataParser * metadata contains more than one * IDPSSODescriptor, the first is returned * @param string $desiredNameIdFormat If available on IdP metadata, use that nameIdFormat + * @param string $desiredSSOBinding Parse specific binding SSO endpoint. + * @param string $desiredSLOBinding Parse specific binding SLO endpoint. * * @return array metadata info in php-saml settings format */ - public static function parseRemoteXML($url, $entityId = null, $desiredNameIdFormat = null) + public static function parseRemoteXML($url, $entityId = null, $desiredNameIdFormat = null, $desiredSSOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, $desiredSLOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT) { $metadataInfo = array(); @@ -33,7 +35,7 @@ public static function parseRemoteXML($url, $entityId = null, $desiredNameIdForm $xml = curl_exec($ch); if ($xml !== false) { - $metadataInfo = self::parseXML($xml, $entityId); + $metadataInfo = self::parseXML($xml, $entityId, $desiredSSOBinding, $desiredSLOBinding); } else { throw new Exception(curl_error($ch), curl_errno($ch)); } @@ -51,17 +53,19 @@ public static function parseRemoteXML($url, $entityId = null, $desiredNameIdForm * metadata contains more than one * IDPSSODescriptor, the first is returned * @param string $desiredNameIdFormat If available on IdP metadata, use that nameIdFormat + * @param string $desiredSSOBinding Parse specific binding SSO endpoint. + * @param string $desiredSLOBinding Parse specific binding SLO endpoint. * * @return array metadata info in php-saml settings format */ - public static function parseFileXML($filepath, $entityId = null, $desiredNameIdFormat = null) + public static function parseFileXML($filepath, $entityId = null, $desiredNameIdFormat = null, $desiredSSOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, $desiredSLOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT) { $metadataInfo = array(); try { if (file_exists($filepath)) { $data = file_get_contents($filepath); - $metadataInfo = self::parseXML($data, $entityId); + $metadataInfo = self::parseXML($data, $entityId, $desiredSSOBinding, $desiredSLOBinding); } } catch (Exception $e) { } @@ -77,10 +81,12 @@ public static function parseFileXML($filepath, $entityId = null, $desiredNameIdF * metadata contains more than one * IDPSSODescriptor, the first is returned * @param string $desiredNameIdFormat If available on IdP metadata, use that nameIdFormat + * @param string $desiredSSOBinding Parse specific binding SSO endpoint. + * @param string $desiredSLOBinding Parse specific binding SLO endpoint. * * @return array metadata info in php-saml settings format */ - public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = null) + public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = null, $desiredSSOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, $desiredSLOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT) { $metadataInfo = array(); @@ -114,7 +120,7 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n $metadataInfo['idp']['entityId'] = $entityId; } - $ssoNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleSignOnService[@Binding="'.OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT.'"]', $idpDescriptor); + $ssoNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleSignOnService[@Binding="'.$desiredSSOBinding.'"]', $idpDescriptor); if ($ssoNodes->length < 1) { $ssoNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleSignOnService', $idpDescriptor); } @@ -125,7 +131,7 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n ); } - $sloNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleLogoutService[@Binding="'.OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT.'"]', $idpDescriptor); + $sloNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleLogoutService[@Binding="'.$desiredSLOBinding.'"]', $idpDescriptor); if ($sloNodes->length < 1) { $sloNodes = OneLogin_Saml2_Utils::query($dom, './md:SingleLogoutService', $idpDescriptor); } @@ -156,7 +162,9 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n } $idpCertdata = $metadataInfo['idp']['x509certMulti']; - if (count($idpCertdata) == 1 || ((isset($idpCertdata['signing']) && count($idpCertdata['signing']) == 1) && isset($idpCertdata['encryption']) && count($idpCertdata['encryption']) == 1 && strcmp($idpCertdata['signing'][0], $idpCertdata['encryption'][0]) == 0)) { + if (count($idpCertdata) == 1 and + ((isset($idpCertdata['signing']) and count($idpCertdata['signing']) == 1) or (isset($idpCertdata['encryption']) and count($idpCertdata['encryption']) == 1)) or + ((isset($idpCertdata['signing']) && count($idpCertdata['signing']) == 1) && isset($idpCertdata['encryption']) && count($idpCertdata['encryption']) == 1 && strcmp($idpCertdata['signing'][0], $idpCertdata['encryption'][0]) == 0)) { if (isset($metadataInfo['idp']['x509certMulti']['signing'][0])) { $metadataInfo['idp']['x509cert'] = $metadataInfo['idp']['x509certMulti']['signing'][0]; } else { diff --git a/tests/data/metadata/idp/idp_metadata.xml b/tests/data/metadata/idp/idp_metadata.xml new file mode 100644 index 00000000..146428c1 --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata.xml @@ -0,0 +1,42 @@ + + + + + + + MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET +MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD +VQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2 +MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u +ZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z +0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT +gf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m +Tr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF +zRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ +UAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV +HSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw +DwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO +BgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu +AuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV +gG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ +sTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP +TbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu +QOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78 +1sE= + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + + + + Support + support@onelogin.com + + \ No newline at end of file diff --git a/tests/data/metadata/idp/idp_metadata2.xml b/tests/data/metadata/idp/idp_metadata2.xml new file mode 100644 index 00000000..0b19f62a --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata2.xml @@ -0,0 +1 @@ + MIIDPDCCAiQCCQDydJgOlszqbzANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEQMA4GA1UEChMHSmFua3lDbzESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE0MDMxMjE5NDYzM1oXDTI3MTExOTE5NDYzM1owYDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEDAOBgNVBAoTB0phbmt5Q28xEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMGvJpRTTasRUSPqcbqCG+ZnTAurnu0vVpIG9lzExnh11o/BGmzu7lB+yLHcEdwrKBBmpepDBPCYxpVajvuEhZdKFx/Fdy6j5mH3rrW0Bh/zd36CoUNjbbhHyTjeM7FN2yF3u9lcyubuvOzr3B3gX66IwJlU46+wzcQVhSOlMk2tXR+fIKQExFrOuK9tbX3JIBUqItpI+HnAow509CnM134svw8PTFLkR6/CcMqnDfDK1m993PyoC1Y+N4X9XkhSmEQoAlAHPI5LHrvuujM13nvtoVYvKYoj7ScgumkpWNEvX652LfXOnKYlkB8ZybuxmFfIkzedQrbJsyOhfL03cMECAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAeHwzqwnzGEkxjzSD47imXaTqtYyETZow7XwBc0ZaFS50qRFJUgKTAmKS1xQBP/qHpStsROT35DUxJAE6NY1Kbq3ZbCuhGoSlY0L7VzVT5tpu4EY8+Dq/u2EjRmmhoL7UkskvIZ2n1DdERtd+YUMTeqYl9co43csZwDno/IKomeN5qaPc39IZjikJ+nUC6kPFKeu/3j9rgHNlRtocI6S1FdtFz9OZMQlpr0JbUt2T3xS/YoQJn6coDmJL5GTiiKM6cOe+Ur1VwzS1JEDbSS2TWWhzq8ojLdrotYLGd9JOsoQhElmz+tMfCFQUFLExinPAyy7YHlSiVX13QH2XTu/iQQ== urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress urn:oasis:names:tc:SAML:2.0:nameid-format:persistent urn:oasis:names:tc:SAML:2.0:nameid-format:transient \ No newline at end of file diff --git a/tests/data/metadata/idp/idp_metadata_multi_certs.xml b/tests/data/metadata/idp/idp_metadata_multi_certs.xml new file mode 100644 index 00000000..f993f64a --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata_multi_certs.xml @@ -0,0 +1,75 @@ + + + + + + + MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEF +BQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJj +aWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwW +T25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUy +MjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChz +Z2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNV +BAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo +3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRw +tnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xx +VRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5 +L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t +1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/ +BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCB +pIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYD +VQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQL +DAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaC +FD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B +AQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXM +GI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65c +hjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIB +vlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37 +MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZ +WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== + + + + + + + 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 +WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + \ No newline at end of file diff --git a/tests/data/metadata/idp/idp_metadata_multi_signing_certs.xml b/tests/data/metadata/idp/idp_metadata_multi_signing_certs.xml new file mode 100644 index 00000000..0cba257a --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata_multi_signing_certs.xml @@ -0,0 +1,75 @@ + + + + + + + MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEF +BQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJj +aWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwW +T25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUy +MjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChz +Z2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNV +BAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo +3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRw +tnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xx +VRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5 +L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t +1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/ +BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCB +pIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYD +VQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQL +DAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaC +FD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B +AQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXM +GI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65c +hjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIB +vlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37 +MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZ +WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== + + + + + + + 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 +WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + diff --git a/tests/data/metadata/idp/idp_multiple_descriptors.xml b/tests/data/metadata/idp/idp_multiple_descriptors.xml new file mode 100644 index 00000000..c77face7 --- /dev/null +++ b/tests/data/metadata/idp/idp_multiple_descriptors.xml @@ -0,0 +1,53 @@ + + + + + + + + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXhTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCaGpFTE1Ba0dBMVVFQmhNQ1FWVXgKRERBS0JnTlZCQWdUQTA1VFZ6RVBNQTBHQTFVRUJ4TUdVM2xrYm1WNU1Rd3dDZ1lEVlFRS0RBTlFTVlF4Q1RBSApCZ05WQkFzTUFERVlNQllHQTFVRUF3d1BiR0YzY21WdVkyVndhWFF1WTI5dE1TVXdJd1lKS29aSWh2Y05BUWtCCkRCWnNZWGR5Wlc1alpTNXdhWFJBWjIxaGFXd3VZMjl0TUI0WERURXlNRFF4T1RJeU5UUXhPRm9YRFRNeU1EUXgKTkRJeU5UUXhPRm93Z1lZeEN6QUpCZ05WQkFZVEFrRlZNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVApCbE41Wkc1bGVURU1NQW9HQTFVRUNnd0RVRWxVTVFrd0J3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psCmJtTmxjR2wwTG1OdmJURWxNQ01HQ1NxR1NJYjNEUUVKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnYKYlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXFqaWUzUjJvaStwRGFldndJeXMvbWJVVApubkdsa3h0ZGlrcnExMXZleHd4SmlQTmhtaHFSVzNtVXVKRXpsbElkVkw2RW14R1lUcXBxZjkzSGxoa3NhZUowCjhVZ2pQOVVtTVlyaFZKdTFqY0ZXVjdmei9yKzIxL2F3VG5EVjlzTVlRcXVJUllZeTdiRzByMU9iaXdkb3ZudGsKN2dGSTA2WjB2WmFjREU1Ym9xVUNBd0VBQWFPQ0FTVXdnZ0VoTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRRApBZ1VnTUIwR0ExVWREZ1FXQkJTUk9OOEdKOG8rOGpnRnRqa3R3WmRxeDZCUnlUQVRCZ05WSFNVRUREQUtCZ2dyCkJnRUZCUWNEQVRBZEJnbGdoa2dCaHZoQ0FRMEVFQllPVkdWemRDQllOVEE1SUdObGNuUXdnYk1HQTFVZEl3U0IKcXpDQnFJQVVrVGpmQmlmS1B2STRCYlk1TGNHWGFzZWdVY21oZ1l5a2dZa3dnWVl4Q3pBSkJnTlZCQVlUQWtGVgpNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVEJsTjVaRzVsZVRFTU1Bb0dBMVVFQ2d3RFVFbFVNUWt3CkJ3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psYm1ObGNHbDBMbU52YlRFbE1DTUdDU3FHU0liM0RRRUoKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnZiWUlCQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9CZ1FDRQpUQWVKVERTQVc2ejFVRlRWN1FyZWg0VUxGT1JhajkrZUN1RjNLV0RIYyswSVFDajlyZG5ERzRRL3dmNy9yYVEwCkpuUFFDU0NkclBMSmV5b1BIN1FhVHdvYUY3ZHpWdzRMQ3N5TkpURld4NGNNNTBWdzZSNWZET2dpQzhic2ZmUzgKQkptb3VscnJaRE5OVmpHOG1XNmNMeHJZdlZRT3JSVmVjQ0ZJZ3NzQ2JBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + + + + + + + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXhTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCaGpFTE1Ba0dBMVVFQmhNQ1FWVXgKRERBS0JnTlZCQWdUQTA1VFZ6RVBNQTBHQTFVRUJ4TUdVM2xrYm1WNU1Rd3dDZ1lEVlFRS0RBTlFTVlF4Q1RBSApCZ05WQkFzTUFERVlNQllHQTFVRUF3d1BiR0YzY21WdVkyVndhWFF1WTI5dE1TVXdJd1lKS29aSWh2Y05BUWtCCkRCWnNZWGR5Wlc1alpTNXdhWFJBWjIxaGFXd3VZMjl0TUI0WERURXlNRFF4T1RJeU5UUXhPRm9YRFRNeU1EUXgKTkRJeU5UUXhPRm93Z1lZeEN6QUpCZ05WQkFZVEFrRlZNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVApCbE41Wkc1bGVURU1NQW9HQTFVRUNnd0RVRWxVTVFrd0J3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psCmJtTmxjR2wwTG1OdmJURWxNQ01HQ1NxR1NJYjNEUUVKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnYKYlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXFqaWUzUjJvaStwRGFldndJeXMvbWJVVApubkdsa3h0ZGlrcnExMXZleHd4SmlQTmhtaHFSVzNtVXVKRXpsbElkVkw2RW14R1lUcXBxZjkzSGxoa3NhZUowCjhVZ2pQOVVtTVlyaFZKdTFqY0ZXVjdmei9yKzIxL2F3VG5EVjlzTVlRcXVJUllZeTdiRzByMU9iaXdkb3ZudGsKN2dGSTA2WjB2WmFjREU1Ym9xVUNBd0VBQWFPQ0FTVXdnZ0VoTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRRApBZ1VnTUIwR0ExVWREZ1FXQkJTUk9OOEdKOG8rOGpnRnRqa3R3WmRxeDZCUnlUQVRCZ05WSFNVRUREQUtCZ2dyCkJnRUZCUWNEQVRBZEJnbGdoa2dCaHZoQ0FRMEVFQllPVkdWemRDQllOVEE1SUdObGNuUXdnYk1HQTFVZEl3U0IKcXpDQnFJQVVrVGpmQmlmS1B2STRCYlk1TGNHWGFzZWdVY21oZ1l5a2dZa3dnWVl4Q3pBSkJnTlZCQVlUQWtGVgpNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVEJsTjVaRzVsZVRFTU1Bb0dBMVVFQ2d3RFVFbFVNUWt3CkJ3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psYm1ObGNHbDBMbU52YlRFbE1DTUdDU3FHU0liM0RRRUoKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnZiWUlCQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9CZ1FDRQpUQWVKVERTQVc2ejFVRlRWN1FyZWg0VUxGT1JhajkrZUN1RjNLV0RIYyswSVFDajlyZG5ERzRRL3dmNy9yYVEwCkpuUFFDU0NkclBMSmV5b1BIN1FhVHdvYUY3ZHpWdzRMQ3N5TkpURld4NGNNNTBWdzZSNWZET2dpQzhic2ZmUzgKQkptb3VscnJaRE5OVmpHOG1XNmNMeHJZdlZRT3JSVmVjQ0ZJZ3NzQ2JBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + + + + + + + + + + + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXhTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCaGpFTE1Ba0dBMVVFQmhNQ1FWVXgKRERBS0JnTlZCQWdUQTA1VFZ6RVBNQTBHQTFVRUJ4TUdVM2xrYm1WNU1Rd3dDZ1lEVlFRS0RBTlFTVlF4Q1RBSApCZ05WQkFzTUFERVlNQllHQTFVRUF3d1BiR0YzY21WdVkyVndhWFF1WTI5dE1TVXdJd1lKS29aSWh2Y05BUWtCCkRCWnNZWGR5Wlc1alpTNXdhWFJBWjIxaGFXd3VZMjl0TUI0WERURXlNRFF4T1RJeU5UUXhPRm9YRFRNeU1EUXgKTkRJeU5UUXhPRm93Z1lZeEN6QUpCZ05WQkFZVEFrRlZNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVApCbE41Wkc1bGVURU1NQW9HQTFVRUNnd0RVRWxVTVFrd0J3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psCmJtTmxjR2wwTG1OdmJURWxNQ01HQ1NxR1NJYjNEUUVKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnYKYlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXFqaWUzUjJvaStwRGFldndJeXMvbWJVVApubkdsa3h0ZGlrcnExMXZleHd4SmlQTmhtaHFSVzNtVXVKRXpsbElkVkw2RW14R1lUcXBxZjkzSGxoa3NhZUowCjhVZ2pQOVVtTVlyaFZKdTFqY0ZXVjdmei9yKzIxL2F3VG5EVjlzTVlRcXVJUllZeTdiRzByMU9iaXdkb3ZudGsKN2dGSTA2WjB2WmFjREU1Ym9xVUNBd0VBQWFPQ0FTVXdnZ0VoTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRRApBZ1VnTUIwR0ExVWREZ1FXQkJTUk9OOEdKOG8rOGpnRnRqa3R3WmRxeDZCUnlUQVRCZ05WSFNVRUREQUtCZ2dyCkJnRUZCUWNEQVRBZEJnbGdoa2dCaHZoQ0FRMEVFQllPVkdWemRDQllOVEE1SUdObGNuUXdnYk1HQTFVZEl3U0IKcXpDQnFJQVVrVGpmQmlmS1B2STRCYlk1TGNHWGFzZWdVY21oZ1l5a2dZa3dnWVl4Q3pBSkJnTlZCQVlUQWtGVgpNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVEJsTjVaRzVsZVRFTU1Bb0dBMVVFQ2d3RFVFbFVNUWt3CkJ3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psYm1ObGNHbDBMbU52YlRFbE1DTUdDU3FHU0liM0RRRUoKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnZiWUlCQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9CZ1FDRQpUQWVKVERTQVc2ejFVRlRWN1FyZWg0VUxGT1JhajkrZUN1RjNLV0RIYyswSVFDajlyZG5ERzRRL3dmNy9yYVEwCkpuUFFDU0NkclBMSmV5b1BIN1FhVHdvYUY3ZHpWdzRMQ3N5TkpURld4NGNNNTBWdzZSNWZET2dpQzhic2ZmUzgKQkptb3VscnJaRE5OVmpHOG1XNmNMeHJZdlZRT3JSVmVjQ0ZJZ3NzQ2JBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + + + + + + + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXhTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCaGpFTE1Ba0dBMVVFQmhNQ1FWVXgKRERBS0JnTlZCQWdUQTA1VFZ6RVBNQTBHQTFVRUJ4TUdVM2xrYm1WNU1Rd3dDZ1lEVlFRS0RBTlFTVlF4Q1RBSApCZ05WQkFzTUFERVlNQllHQTFVRUF3d1BiR0YzY21WdVkyVndhWFF1WTI5dE1TVXdJd1lKS29aSWh2Y05BUWtCCkRCWnNZWGR5Wlc1alpTNXdhWFJBWjIxaGFXd3VZMjl0TUI0WERURXlNRFF4T1RJeU5UUXhPRm9YRFRNeU1EUXgKTkRJeU5UUXhPRm93Z1lZeEN6QUpCZ05WQkFZVEFrRlZNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVApCbE41Wkc1bGVURU1NQW9HQTFVRUNnd0RVRWxVTVFrd0J3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psCmJtTmxjR2wwTG1OdmJURWxNQ01HQ1NxR1NJYjNEUUVKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnYKYlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXFqaWUzUjJvaStwRGFldndJeXMvbWJVVApubkdsa3h0ZGlrcnExMXZleHd4SmlQTmhtaHFSVzNtVXVKRXpsbElkVkw2RW14R1lUcXBxZjkzSGxoa3NhZUowCjhVZ2pQOVVtTVlyaFZKdTFqY0ZXVjdmei9yKzIxL2F3VG5EVjlzTVlRcXVJUllZeTdiRzByMU9iaXdkb3ZudGsKN2dGSTA2WjB2WmFjREU1Ym9xVUNBd0VBQWFPQ0FTVXdnZ0VoTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRRApBZ1VnTUIwR0ExVWREZ1FXQkJTUk9OOEdKOG8rOGpnRnRqa3R3WmRxeDZCUnlUQVRCZ05WSFNVRUREQUtCZ2dyCkJnRUZCUWNEQVRBZEJnbGdoa2dCaHZoQ0FRMEVFQllPVkdWemRDQllOVEE1SUdObGNuUXdnYk1HQTFVZEl3U0IKcXpDQnFJQVVrVGpmQmlmS1B2STRCYlk1TGNHWGFzZWdVY21oZ1l5a2dZa3dnWVl4Q3pBSkJnTlZCQVlUQWtGVgpNUXd3Q2dZRFZRUUlFd05PVTFjeER6QU5CZ05WQkFjVEJsTjVaRzVsZVRFTU1Bb0dBMVVFQ2d3RFVFbFVNUWt3CkJ3WURWUVFMREFBeEdEQVdCZ05WQkFNTUQyeGhkM0psYm1ObGNHbDBMbU52YlRFbE1DTUdDU3FHU0liM0RRRUoKQVF3V2JHRjNjbVZ1WTJVdWNHbDBRR2R0WVdsc0xtTnZiWUlCQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9CZ1FDRQpUQWVKVERTQVc2ejFVRlRWN1FyZWg0VUxGT1JhajkrZUN1RjNLV0RIYyswSVFDajlyZG5ERzRRL3dmNy9yYVEwCkpuUFFDU0NkclBMSmV5b1BIN1FhVHdvYUY3ZHpWdzRMQ3N5TkpURld4NGNNNTBWdzZSNWZET2dpQzhic2ZmUzgKQkptb3VscnJaRE5OVmpHOG1XNmNMeHJZdlZRT3JSVmVjQ0ZJZ3NzQ2JBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + + + + + + \ No newline at end of file diff --git a/tests/data/metadata/idp/testshib-providers.xml b/tests/data/metadata/idp/testshib-providers.xml new file mode 100644 index 00000000..c00a1b77 --- /dev/null +++ b/tests/data/metadata/idp/testshib-providers.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + testshib.org + + TestShib Test IdP + TestShib IdP. Use this as a source of attributes + for your test SP. + https://www.testshib.org/testshibtwo.jpg + + + + + + + + MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV + MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD + VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4 + MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI + EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl + c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B + AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C + yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe + 3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT + NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614 + kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH + gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G + A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86 + 9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl + bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo + aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN + BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL + I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo + 93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4 + /SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj + Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr + 8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA== + + + + + + + + + + + + + + + urn:mace:shibboleth:1.0:nameIdentifier + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + + + + + + + + + + + + MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV + MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD + VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4 + MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI + EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl + c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B + AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C + yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe + 3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT + NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614 + kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH + gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G + A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86 + 9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl + bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo + aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN + BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL + I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo + 93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4 + /SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj + Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr + 8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA== + + + + + + + + + + + + + + + + urn:mace:shibboleth:1.0:nameIdentifier + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + TestShib Two Identity Provider + TestShib Two + http://www.testshib.org/testshib-two/ + + + Nate + Klingenstein + ndk@internet2.edu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TestShib Test SP + TestShib SP. Log into this to test your machine. + Once logged in check that all attributes that you expected have been + released. + https://www.testshib.org/testshibtwo.jpg + + + + + + + + MIIEPjCCAyagAwIBAgIBADANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJVUzEV + MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMSIwIAYD + VQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3ZpZGVyMRgwFgYDVQQDEw9zcC50ZXN0 + c2hpYi5vcmcwHhcNMDYwODMwMjEyNDM5WhcNMTYwODI3MjEyNDM5WjB3MQswCQYD + VQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1 + cmdoMSIwIAYDVQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3ZpZGVyMRgwFgYDVQQD + Ew9zcC50ZXN0c2hpYi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB + AQDJyR6ZP6MXkQ9z6RRziT0AuCabDd3x1m7nLO9ZRPbr0v1LsU+nnC363jO8nGEq + sqkgiZ/bSsO5lvjEt4ehff57ERio2Qk9cYw8XCgmYccVXKH9M+QVO1MQwErNobWb + AjiVkuhWcwLWQwTDBowfKXI87SA7KR7sFUymNx5z1aoRvk3GM++tiPY6u4shy8c7 + vpWbVfisfTfvef/y+galxjPUQYHmegu7vCbjYP3On0V7/Ivzr+r2aPhp8egxt00Q + XpilNai12LBYV3Nv/lMsUzBeB7+CdXRVjZOHGuQ8mGqEbsj8MBXvcxIKbcpeK5Zi + JCVXPfarzuriM1G5y5QkKW+LAgMBAAGjgdQwgdEwHQYDVR0OBBYEFKB6wPDxwYrY + StNjU5P4b4AjBVQVMIGhBgNVHSMEgZkwgZaAFKB6wPDxwYrYStNjU5P4b4AjBVQV + oXukeTB3MQswCQYDVQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYD + VQQHEwpQaXR0c2J1cmdoMSIwIAYDVQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3Zp + ZGVyMRgwFgYDVQQDEw9zcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN + BgkqhkiG9w0BAQUFAAOCAQEAc06Kgt7ZP6g2TIZgMbFxg6vKwvDL0+2dzF11Onpl + 5sbtkPaNIcj24lQ4vajCrrGKdzHXo9m54BzrdRJ7xDYtw0dbu37l1IZVmiZr12eE + Iay/5YMU+aWP1z70h867ZQ7/7Y4HW345rdiS6EW663oH732wSYNt9kr7/0Uer3KD + 9CuPuOidBacospDaFyfsaJruE99Kd6Eu/w5KLAGG+m0iqENCziDGzVA47TngKz2v + PVA+aokoOyoz3b53qeti77ijatSEoKjxheBWpO+eoJeGq/e49Um3M2ogIX/JAlMa + Inh+vYSYngQB2sx9LGkR9KHaMKNIGCDehk93Xla4pWJx1w== + + + + + + + + + + + + + + + + + + + + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + urn:mace:shibboleth:1.0:nameIdentifier + + + + + + + + + + + + + + + + + + + + TestShib Two Service Provider + TestShib Two + http://www.testshib.org/testshib-two/ + + + Nate + Klingenstein + ndk@internet2.edu + + + + + + + diff --git a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php index 58c5bc6b..88c5ffe4 100644 --- a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php +++ b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php @@ -33,6 +33,24 @@ public function testParseFileXML() $filepath = TEST_ROOT .'/data/metadata/idp/onelogin_metadata.xml'; $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseFileXML($filepath); $this->assertEquals($expectedInfo, $idpInfo); + + $expectedInfo2 = array( + "idp" => array( + "singleSignOnService" => array( + "url" => "https://app.onelogin.com/trust/saml2/http-post/sso/383123", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509cert" => "MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9uZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sTgf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0mTr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SFzRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJUAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNVHSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHuAuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcVgG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJsTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClPTbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWuQOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh781sE=", + "entityId" => "https://app.onelogin.com/saml/metadata/383123" + ), + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" + ) + ); + + $filepath = TEST_ROOT .'/data/metadata/idp/idp_metadata.xml'; + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseFileXML($filepath); + $this->assertEquals($expectedInfo2, $idpInfo); } /** @@ -74,6 +92,108 @@ public function testParseXML() $this->assertEquals($expectedInfo, $idpInfo); } + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: Test with testshib metadata. + * Especially test extracting SSO with REDIRECT binding. + * Note that the testshib metadata does not contain an SLO specification + * in the first tag. + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseTestshibDesiredBindingSSORedirect() + { + $expectedInfo = array( + "sp" => array( + "NameIDFormat" => "urn:mace:shibboleth:1.0:nameIdentifier" + ), + "idp" => array( + "entityId" => "https://idp.testshib.org/idp/shibboleth", + "singleSignOnService" => array( + "url" => "https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509cert" => "MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYDVQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQIEwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRlc3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7CyVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aTNPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWHgWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0GA1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ869nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBlbm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNoaWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRLI4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4/SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAjGeka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA==" + ) + ); + + $xml = file_get_contents(TEST_ROOT .'/data/metadata/idp/testshib-providers.xml'); + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseXML($xml); + $idpInfo2 = OneLogin_Saml2_IdPMetadataParser::parseXML($xml, null, null, OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT); + $this->assertEquals($expectedInfo, $idpInfo); + $this->assertEquals($expectedInfo, $idpInfo2); + } + + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: Test with testshib metadata. + * Especially test extracting SSO with POST binding. + * Note that the testshib metadata does not contain an SLO specification + * in the first tag. + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseTestshibDesiredBindingSSOPost() + { + $expectedInfo = array( + "sp" => array( + "NameIDFormat" => "urn:mace:shibboleth:1.0:nameIdentifier" + ), + "idp" => array( + "entityId" => "https://idp.testshib.org/idp/shibboleth", + "singleSignOnService" => array( + "url" => "https://idp.testshib.org/idp/profile/SAML2/POST/SSO", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" + ), + "x509cert" => "MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYDVQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQIEwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRlc3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7CyVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aTNPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWHgWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0GA1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ869nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBlbm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNoaWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRLI4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4/SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAjGeka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA==" + ) + ); + + $xml = file_get_contents(TEST_ROOT .'/data/metadata/idp/testshib-providers.xml'); + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseXML($xml); + $idpInfo2 = OneLogin_Saml2_IdPMetadataParser::parseXML($xml, null, null, OneLogin_Saml2_Constants::BINDING_HTTP_POST, OneLogin_Saml2_Constants::BINDING_HTTP_POST); + $this->assertNotEquals($expectedInfo, $idpInfo); + $this->assertEquals($expectedInfo, $idpInfo2); + } + + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: Test all combinations of the `desiredSSOBinding` and + * `desiredSLOBinding` parameters. + * Note: IdP metadata contains a SSO and SLO + * service and does not specify any endpoint for the POST binding. + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseDesiredBindingAll() + { + $expectedInfo = array( + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" + ), + "idp" => array( + "entityId" => "urn:example:idp", + "x509cert" => "MIIDPDCCAiQCCQDydJgOlszqbzANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEQMA4GA1UEChMHSmFua3lDbzESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE0MDMxMjE5NDYzM1oXDTI3MTExOTE5NDYzM1owYDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEDAOBgNVBAoTB0phbmt5Q28xEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMGvJpRTTasRUSPqcbqCG+ZnTAurnu0vVpIG9lzExnh11o/BGmzu7lB+yLHcEdwrKBBmpepDBPCYxpVajvuEhZdKFx/Fdy6j5mH3rrW0Bh/zd36CoUNjbbhHyTjeM7FN2yF3u9lcyubuvOzr3B3gX66IwJlU46+wzcQVhSOlMk2tXR+fIKQExFrOuK9tbX3JIBUqItpI+HnAow509CnM134svw8PTFLkR6/CcMqnDfDK1m993PyoC1Y+N4X9XkhSmEQoAlAHPI5LHrvuujM13nvtoVYvKYoj7ScgumkpWNEvX652LfXOnKYlkB8ZybuxmFfIkzedQrbJsyOhfL03cMECAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAeHwzqwnzGEkxjzSD47imXaTqtYyETZow7XwBc0ZaFS50qRFJUgKTAmKS1xQBP/qHpStsROT35DUxJAE6NY1Kbq3ZbCuhGoSlY0L7VzVT5tpu4EY8+Dq/u2EjRmmhoL7UkskvIZ2n1DdERtd+YUMTeqYl9co43csZwDno/IKomeN5qaPc39IZjikJ+nUC6kPFKeu/3j9rgHNlRtocI6S1FdtFz9OZMQlpr0JbUt2T3xS/YoQJn6coDmJL5GTiiKM6cOe+Ur1VwzS1JEDbSS2TWWhzq8ojLdrotYLGd9JOsoQhElmz+tMfCFQUFLExinPAyy7YHlSiVX13QH2XTu/iQQ==", + "singleSignOnService" => array( + "url" => "http://idp.example.com/", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "singleLogoutService" => array( + "url" => "http://idp.example.com/logout", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ) + ) + ); + + $xml = file_get_contents(TEST_ROOT .'/data/metadata/idp/idp_metadata2.xml'); + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseXML($xml); + $idpInfo2 = OneLogin_Saml2_IdPMetadataParser::parseXML($xml, null, null, OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT); + $idpInfo3 = OneLogin_Saml2_IdPMetadataParser::parseXML($xml, null, null, OneLogin_Saml2_Constants::BINDING_HTTP_POST, OneLogin_Saml2_Constants::BINDING_HTTP_POST); + $this->assertEquals($expectedInfo, $idpInfo); + $this->assertEquals($expectedInfo, $idpInfo2); + $this->assertEquals($expectedInfo, $idpInfo3); + } + /** * Tests the parseXML method of IdPMetadataParser. * Case: With and without specify EntityId @@ -162,6 +282,82 @@ public function testParseXMLNameIdFormat() $this->assertEquals($expectedInfo2, $idpInfo2); } + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: IdP metadata contains multiple certs + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseMultiCerts() + { + $expectedInfo = array( + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" + ), + "idp" => array( + "singleLogoutService" => array( + "url" => "https://idp.examle.com/saml/slo", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509certMulti" => array( + "encryption" => array( + "MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJjaWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUyMjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRwtnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xxVRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCBpIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaCFD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXMGI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65chjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIBvlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZWQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw==" + ), + "signing" => array( + "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" + ) + ), + "entityId" => "https://idp.examle.com/saml/metadata", + "singleSignOnService" => array( + "url" => "https://idp.examle.com/saml/sso", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ) + ) + ); + + $xml = file_get_contents(TEST_ROOT .'/data/metadata/idp/idp_metadata_multi_certs.xml'); + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseXML($xml); + $this->assertEquals($expectedInfo, $idpInfo); + } + + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: IdP metadata contains multiple certs + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseMultiSigningCerts() + { + $expectedInfo = array( + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" + ), + "idp" => array( + "singleLogoutService" => array( + "url" => "https://idp.examle.com/saml/slo", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509certMulti" => array( + "signing" => array( + "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" + ) + ), + "entityId" => "https://idp.examle.com/saml/metadata", + "singleSignOnService" => array( + "url" => "https://idp.examle.com/saml/sso", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ) + ) + ); + + $xml = file_get_contents(TEST_ROOT .'/data/metadata/idp/idp_metadata_multi_signing_certs.xml'); + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseXML($xml); + $this->assertEquals($expectedInfo, $idpInfo); + } + /** * Tests the injectIntoSettings method of IdPMetadataParser. * From 8d20edbe2fe8faac5c8a65d29b3b014acda1cde1 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 6 Nov 2017 12:48:24 +0100 Subject: [PATCH 034/236] Minor phpcs --- lib/Saml2/Settings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 451c5eb8..9362c971 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -150,7 +150,7 @@ public function __construct($settings = null, $spValidationOnly = false) /** * Sets the paths of the different folders - * @suppress PhanUndeclaredConstant + * @suppress PhanUndeclaredConstant */ private function _loadPaths() { @@ -304,7 +304,7 @@ private function _loadSettingsFromFile() } /** @var array $settings */ - include $filename; + include $filename; // Add advance_settings if exists From dde1d4e0e61a89d22383749b23645499d1e8d9d6 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 6 Nov 2017 13:25:13 +0100 Subject: [PATCH 035/236] #242. Document that SHA-1 must not be used --- README.md | 12 ++++++++---- advanced_settings_example.php | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b0cf7813..5bb4ae5b 100644 --- a/README.md +++ b/README.md @@ -152,8 +152,10 @@ start, for example to use the static method getSelfURLNoQuery use: Security warning ---------------- -In production, the `strict` parameter **MUST** be set as `"true"`. Otherwise -your environment is not secure and will be exposed to attacks. +In production, the `strict` parameter **MUST** be set as `"true"` and the +`signatureAlgorithm` and `digestAlgorithm` under `security` must be set to +something other than SHA1 (see https://shattered.io/ ). Otherwise your +environment is not secure and will be exposed to attacks. Getting started @@ -496,14 +498,16 @@ $advancedSettings = array ( // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256' // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha384' // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512' - 'signatureAlgorithm' => 'http://www.w3.org/2000/09/xmldsig#rsa-sha1', + // Notice that sha1 is a deprecated algorithm and should not be used + 'signatureAlgorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', // Algorithm that the toolkit will use on digest process. Options: // 'http://www.w3.org/2000/09/xmldsig#sha1' // 'http://www.w3.org/2001/04/xmlenc#sha256' // 'http://www.w3.org/2001/04/xmldsig-more#sha384' // 'http://www.w3.org/2001/04/xmlenc#sha512' - 'digestAlgorithm' => 'http://www.w3.org/2000/09/xmldsig#sha1', + // Notice that sha1 is a deprecated algorithm and should not be used + 'digestAlgorithm' => 'http://www.w3.org/2001/04/xmlenc#sha256', // ADFS URL-Encodes SAML data as lowercase, and the toolkit by default uses // uppercase. Turn it True for ADFS compatibility on signature verification diff --git a/advanced_settings_example.php b/advanced_settings_example.php index 3ada0293..50194ae6 100644 --- a/advanced_settings_example.php +++ b/advanced_settings_example.php @@ -87,14 +87,16 @@ // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256' // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha384' // 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512' - 'signatureAlgorithm' => 'http://www.w3.org/2000/09/xmldsig#rsa-sha1', + // Notice that sha1 is a deprecated algorithm and should not be used + 'signatureAlgorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', // Algorithm that the toolkit will use on digest process. Options: // 'http://www.w3.org/2000/09/xmldsig#sha1' // 'http://www.w3.org/2001/04/xmlenc#sha256' // 'http://www.w3.org/2001/04/xmldsig-more#sha384' // 'http://www.w3.org/2001/04/xmlenc#sha512' - 'digestAlgorithm' => 'http://www.w3.org/2000/09/xmldsig#sha1', + // Notice that sha1 is a deprecated algorithm and should not be used + 'digestAlgorithm' => 'http://www.w3.org/2001/04/xmlenc#sha256', // ADFS URL-Encodes SAML data as lowercase, and the toolkit by default uses // uppercase. Turn it True for ADFS compatibility on signature verification From 9416fa739cff88ffcc472967cec048a774b97e0f Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 6 Nov 2017 18:44:03 +0100 Subject: [PATCH 036/236] Release 2.12.0 --- CHANGELOG | 10 ++++++++++ lib/Saml2/version.json | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index aa9dd0f8..e83a93ae 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,15 @@ CHANGELOG ========= +v.2.12.0 +* Improve Time management. Use DateTime/DateTimeZone classes. +* Escape error messages in debug mode +* Improve phpdoc +* Add an extra filter to the url to be used on redirection + +* [#242](https://github.com/onelogin/php-saml/pull/242) Document that SHA-1 must not be used +* [#250](https://github.com/onelogin/php-saml/pull/250) Fixed issue with IdPMetadataParser only keeping 1 certificate when multiple certificates of a single type were provided. +* [#263](https://github.com/onelogin/php-saml/issues/263) Fix incompatibility with ADFS on SLO. When on php saml settings NameID Format is set as unspecified but the SAMLResponse has no NameID Format, no NameID Format should be specified on LogoutRequest. + v.2.11.0 * [#236](https://github.com/onelogin/php-saml/pull/236) Exclude unnecesary files from Composer production downloads * [#226](https://github.com/onelogin/php-saml/pull/226) Add possibility to handle nameId NameQualifier attribute in SLO Request diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 1319c889..b201baa4 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.11.0", - "released": "21/07/2017" + "version": "2.12.0", + "released": "06/11/2017" } } From d089b4fe44d29f58f3f033264afce9cb0bbd7213 Mon Sep 17 00:00:00 2001 From: smullick <33524878+smullick@users.noreply.github.com> Date: Thu, 9 Nov 2017 12:41:52 -0500 Subject: [PATCH 037/236] Update Utils.php making it compatible with php 5.3 --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 15c5416e..013aaf97 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -727,7 +727,7 @@ public static function parseDuration($duration, $timestamp = null) /* Parse the duration. We use a very strict pattern. */ $durationRegEx = '#^(-?)P(?:(?:(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?)|(?:(\\d+)W))$#D'; - $matches = []; + $matches = array(); if (!preg_match($durationRegEx, $duration, $matches)) { throw new Exception('Invalid ISO 8601 duration: ' . $duration); } From 635d64d08f42fd848d0b7fd4a8b7a127228ed2de Mon Sep 17 00:00:00 2001 From: Tim Trinidad Date: Wed, 15 Nov 2017 15:44:37 -0500 Subject: [PATCH 038/236] allow the getSPMetadata() method to always include the encryption KeyDescriptor --- lib/Saml2/Settings.php | 10 ++- tests/src/OneLogin/Saml2/SettingsTest.php | 77 ++++++++++++++++++----- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 9362c971..5250b25c 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -800,11 +800,15 @@ public function shouldCompressResponses() /** * Gets the SP metadata. The XML representation. * + * @param bool $alwaysPublishEncryptionCert When 'true', the returned metadata + * will always include an 'encryption' KeyDescriptor. Otherwise, the 'encryption' + * KeyDescriptor will only be included if $advancedSettings['security']['wantNameIdEncrypted'] + * or $advancedSettings['security']['wantAssertionsEncrypted'] are enabled. * @return string SP metadata (xml) * @throws Exception * @throws OneLogin_Saml2_Error */ - public function getSPMetadata() + public function getSPMetadata($alwaysPublishEncryptionCert = false) { $metadata = OneLogin_Saml2_Metadata::builder($this->_sp, $this->_security['authnRequestsSigned'], $this->_security['wantAssertionsSigned'], null, null, $this->getContacts(), $this->getOrganization()); @@ -813,7 +817,7 @@ public function getSPMetadata() $metadata = OneLogin_Saml2_Metadata::addX509KeyDescriptors( $metadata, $certNew, - $this->_security['wantNameIdEncrypted'] || $this->_security['wantAssertionsEncrypted'] + $alwaysPublishEncryptionCert || $this->_security['wantNameIdEncrypted'] || $this->_security['wantAssertionsEncrypted'] ); } @@ -822,7 +826,7 @@ public function getSPMetadata() $metadata = OneLogin_Saml2_Metadata::addX509KeyDescriptors( $metadata, $cert, - $this->_security['wantNameIdEncrypted'] || $this->_security['wantAssertionsEncrypted'] + $alwaysPublishEncryptionCert || $this->_security['wantNameIdEncrypted'] || $this->_security['wantAssertionsEncrypted'] ); } diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 8c7b5c27..142d579a 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -422,33 +422,78 @@ public function testGetSPMetadata() * Case with x509certNew * * @covers OneLogin_Saml2_Settings::getSPMetadata + * @dataProvider testGetSPMetadataWithX509CertNewDataProvider */ - public function testGetSPMetadataWithX509CertNew() + public function testGetSPMetadataWithX509CertNew($alwaysIncludeEncryption, $wantNameIdEncrypted, $wantAssertionsEncrypted, $expectEncryptionKeyDescriptor) { $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings5.php'; - $settingsInfo['security']['wantNameIdEncrypted'] = false; - $settingsInfo['security']['wantAssertionsEncrypted'] = false; + $settingsInfo['security']['wantNameIdEncrypted'] = $wantNameIdEncrypted; + $settingsInfo['security']['wantAssertionsEncrypted'] = $wantAssertionsEncrypted; $settings = new OneLogin_Saml2_Settings($settingsInfo); - $metadata = $settings->getSPMetadata(); + $metadata = $settings->getSPMetadata($alwaysIncludeEncryption); - $this->assertEquals(2, substr_count($metadata, "assertEquals($expectEncryptionKeyDescriptor ? 4 : 2, substr_count($metadata, "assertEquals(2, substr_count($metadata, 'assertEquals(0, substr_count($metadata, 'getSPMetadata(); - - $this->assertEquals(4, substr_count($metadata2, "assertEquals(2, substr_count($metadata2, 'assertEquals($expectEncryptionKeyDescriptor ? 2 : 0, substr_count($metadata, 'assertEquals(2, substr_count($metadata2, ' [ + 'alwaysIncludeEncryption' => false, + 'wantNameIdEncrypted' => false, + 'wantAssertionsEncrypted' => false, + 'expectEncryptionKeyDescriptor' => false, + ], + 'wantNameIdEncrypted setting enabled' => [ + 'alwaysIncludeEncryption' => false, + 'wantNameIdEncrypted' => true, + 'wantAssertionsEncrypted' => false, + 'expectEncryptionKeyDescriptor' => true, + ], + 'wantAssertionsEncrypted setting enabled' => [ + 'alwaysIncludeEncryption' => false, + 'wantNameIdEncrypted' => false, + 'wantAssertionsEncrypted' => true, + 'expectEncryptionKeyDescriptor' => true, + ], + 'both settings enabled'=> [ + 'alwaysIncludeEncryption' => false, + 'wantNameIdEncrypted' => true, + 'wantAssertionsEncrypted' => true, + 'expectEncryptionKeyDescriptor' => true, + ], + 'metadata requested with encryption' => [ + 'alwaysIncludeEncryption' => true, + 'wantNameIdEncrypted' => false, + 'wantAssertionsEncrypted' => false, + 'expectEncryptionKeyDescriptor' => true, + ], + 'metadata requested with encryption and wantNameIdEncrypted setting enabled' => [ + 'alwaysIncludeEncryption' => true, + 'wantNameIdEncrypted' => true, + 'wantAssertionsEncrypted' => false, + 'expectEncryptionKeyDescriptor' => true, + ], + 'metadata requested with encryption and wantAssertionsEncrypted setting enabled' => [ + 'alwaysIncludeEncryption' => true, + 'wantNameIdEncrypted' => false, + 'wantAssertionsEncrypted' => true, + 'expectEncryptionKeyDescriptor' => true, + ], + 'metadata requested with encryption and both settings enabled' => [ + 'alwaysIncludeEncryption' => true, + 'wantNameIdEncrypted' => true, + 'wantAssertionsEncrypted' => true, + 'expectEncryptionKeyDescriptor' => true, + ], + ]; } /** From a5b850861724d1622e5e35208f0bf557c5012ae1 Mon Sep 17 00:00:00 2001 From: Brandon Peters Date: Thu, 16 Nov 2017 15:44:44 -0500 Subject: [PATCH 039/236] Add attributes to attribute array using FriendlyName in getAttributes method --- lib/Saml2/Response.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index f8cbda0d..eba65713 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -727,7 +727,13 @@ public function getAttributes() /** @var $entry DOMNode */ foreach ($entries as $entry) { - $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; + $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; + $attributeFriendlyName = null; + + $attributeFriendlyNameNode = $entry->attributes->getNamedItem('FriendlyName'); + if ($attributeFriendlyNameNode !== null) { + $attributeFriendlyName = $attributeFriendlyNameNode->nodeValue; + } if (in_array($attributeName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( @@ -736,6 +742,13 @@ public function getAttributes() ); } + if (!empty($attributeFriendlyName) && in_array($attributeFriendlyName, array_keys($attributes))) { + throw new OneLogin_Saml2_ValidationError( + "Found an Attribute element with duplicated FriendlyName", + OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND + ); + } + $attributeValues = array(); foreach ($entry->childNodes as $childNode) { $tagName = ($childNode->prefix ? $childNode->prefix.':' : '') . 'AttributeValue'; @@ -745,6 +758,10 @@ public function getAttributes() } $attributes[$attributeName] = $attributeValues; + + if (!empty($attributeFriendlyName)) { + $attributes[$attributeFriendlyName] = $attributeValues; + } } return $attributes; } From 173a15631caf5a0a9790e36379d22c37c2e2965a Mon Sep 17 00:00:00 2001 From: Brandon Peters Date: Fri, 17 Nov 2017 08:24:33 -0500 Subject: [PATCH 040/236] Add a getAttributesWithFriendlyName method --- lib/Saml2/Response.php | 60 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index eba65713..7d9036db 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -728,12 +728,6 @@ public function getAttributes() /** @var $entry DOMNode */ foreach ($entries as $entry) { $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; - $attributeFriendlyName = null; - - $attributeFriendlyNameNode = $entry->attributes->getNamedItem('FriendlyName'); - if ($attributeFriendlyNameNode !== null) { - $attributeFriendlyName = $attributeFriendlyNameNode->nodeValue; - } if (in_array($attributeName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( @@ -742,6 +736,54 @@ public function getAttributes() ); } + $attributeValues = array(); + foreach ($entry->childNodes as $childNode) { + $tagName = ($childNode->prefix ? $childNode->prefix.':' : '') . 'AttributeValue'; + if ($childNode->nodeType == XML_ELEMENT_NODE && $childNode->tagName === $tagName) { + $attributeValues[] = $childNode->nodeValue; + } + } + + $attributes[$attributeName] = $attributeValues; + } + return $attributes; + } + + /** + * Gets the Attributes from the AttributeStatement element using their FriendlyName. + * + * @return array The attributes of the SAML Assertion + */ + public function getAttributesWithFriendlyName() + { + $attributes = array(); + + /* EncryptedAttributes not supported + + $encriptedAttributes = $this->_queryAssertion('/saml:AttributeStatement/saml:EncryptedAttribute'); + + if ($encriptedAttributes->length > 0) { + foreach ($encriptedAttributes as $encriptedAttribute) { + $key = $this->_settings->getSPkey(); + $seckey = new XMLSecurityKey(XMLSecurityKey::RSA_1_5, array('type'=>'private')); + $seckey->loadKey($key); + $attribute = OneLogin_Saml2_Utils::decryptElement($encriptedAttribute->firstChild(), $seckey); + } + } + */ + + $entries = $this->_queryAssertion('/saml:AttributeStatement/saml:Attribute'); + + /** @var $entry DOMNode */ + foreach ($entries as $entry) { + $attributeFriendlyNameNode = $entry->attributes->getNamedItem('FriendlyName'); + + if ($attributeFriendlyNameNode === null) { + continue; + } + + $attributeFriendlyName = $attributeFriendlyNameNode->nodeValue; + if (!empty($attributeFriendlyName) && in_array($attributeFriendlyName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( "Found an Attribute element with duplicated FriendlyName", @@ -757,11 +799,7 @@ public function getAttributes() } } - $attributes[$attributeName] = $attributeValues; - - if (!empty($attributeFriendlyName)) { - $attributes[$attributeFriendlyName] = $attributeValues; - } + $attributes[$attributeFriendlyName] = $attributeValues; } return $attributes; } From 22eea235c7dbbea607f5f86c5e0a0e2dff9ee3bc Mon Sep 17 00:00:00 2001 From: Brandon Peters Date: Fri, 17 Nov 2017 08:25:01 -0500 Subject: [PATCH 041/236] Fix changed spacing --- lib/Saml2/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 7d9036db..b4086bbf 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -727,7 +727,7 @@ public function getAttributes() /** @var $entry DOMNode */ foreach ($entries as $entry) { - $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; + $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; if (in_array($attributeName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( From 1f90e549b6fee5fe67cbd832a25210102931c0d0 Mon Sep 17 00:00:00 2001 From: Brandon Peters Date: Fri, 17 Nov 2017 08:26:23 -0500 Subject: [PATCH 042/236] Clean up in_array check --- lib/Saml2/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index b4086bbf..db468611 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -784,7 +784,7 @@ public function getAttributesWithFriendlyName() $attributeFriendlyName = $attributeFriendlyNameNode->nodeValue; - if (!empty($attributeFriendlyName) && in_array($attributeFriendlyName, array_keys($attributes))) { + if (in_array($attributeFriendlyName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( "Found an Attribute element with duplicated FriendlyName", OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND From d49cf7ba087fe1837cd420ae8f2760badd338ef5 Mon Sep 17 00:00:00 2001 From: Brandon Peters Date: Fri, 17 Nov 2017 08:59:15 -0500 Subject: [PATCH 043/236] Add tests for Response::getAttributesWithFriendlyName --- ..._attributes_with_friendly_names.xml.base64 | 1 + tests/data/responses/response6.xml.base64 | 1 + tests/src/OneLogin/Saml2/ResponseTest.php | 42 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 create mode 100644 tests/data/responses/response6.xml.base64 diff --git a/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 b/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 new file mode 100644 index 00000000..aba662b2 --- /dev/null +++ b/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 @@ -0,0 +1 @@ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeDQ0OTkyZWJiLTRiMzgtZTQzMi1kYjgyLTk5NTI0MTBkOWFhYiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDI6MzFaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzE5MWMwM2U2OGQ3MWQ5Nzk2ZjVlMDdlNjI2MmNhNGFkODgzYTc0YjEiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+DQogICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogICAgICAgIDxkczpTaWduZWRJbmZvPg0KICAgICAgICAgICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgICAgICAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4NDQ5OTJlYmItNGIzOC1lNDMyLWRiODItOTk1MjQxMGQ5YWFiIj4NCiAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+DQogICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybXM+DQogICAgICAgICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+DQogICAgICAgICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmd2UnJyZ3hwQWR5bElBLzJzckZtSmQramlzOD08L2RzOkRpZ2VzdFZhbHVlPg0KICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICAgIDwvZHM6U2lnbmVkSW5mbz4NCiAgICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPktkcDhUOHJud1BjQlVvaGNxUE0wZWlOWHBNaDNsYytlcEhUREhxTEVuT0pyZ3U1L2pqK2k3RWFBbWdPMFJKVGtoREVZMFY4Rm5lVDR2b3ZjQWJnOWZiTThmVE8xbFg4MndJbXNFZHEyTDNTRTg0cUJ1YUNtRFY1WW8wN0NIYlFPUWphZXRUa3RKdW9GMDhBZDZsKzVoUk8vcEp4bXJFeUcrNEtpaEZZQnV1az08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+DQogICAgICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgICA8L2RzOktleUluZm8+DQogICAgPC9kczpTaWduYXR1cmU+DQogICAgPHNhbWxwOlN0YXR1cz4NCiAgICAgICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICAgIDwvc2FtbHA6U3RhdHVzPg0KICAgIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng4MGJhYWVmNi0yOTJiLTg3NDctY2ZjYS1kZTFlZTNmMWE0MTUiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQyOjMxWiI+DQogICAgICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+DQogICAgICAgIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgICAgICAgPGRzOlNpZ25lZEluZm8+DQogICAgICAgICAgICAgICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogICAgICAgICAgICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZng4MGJhYWVmNi0yOTJiLTg3NDctY2ZjYS1kZTFlZTNmMWE0MTUiPg0KICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybXM+DQogICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgICAgICAgICAgICA8ZHM6RGlnZXN0VmFsdWU+YVI5TTRld05zM3UrbkphUUNEMjZaMEF3RDZNPTwvZHM6RGlnZXN0VmFsdWU+DQogICAgICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICAgICAgICA8L2RzOlNpZ25lZEluZm8+DQogICAgICAgICAgICA8ZHM6U2lnbmF0dXJlVmFsdWU+NGQ4WEo1bXBOaW1vQkhkenNXZi9aemxVTlE3SmlVeEl4K1B5TjRuM0EvbWExcGwvQ0FPSUtOUzZ0clR6STg5N1ZjbGxneFhhTTljUFZqOUhLYU9aRW4wSE5Qa2FWR3VjeVVPVzFUd2dWdnJVdkNNQXVRTzdRZ21aekd1SVhsblVKS3FpTDRZMThNT1M1VGpLaExoSG4xbGE4TEFucmRVVEJobUx5eGtjZjhVPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQogICAgICAgICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgICAgICAgICA8ZHM6WDUwOURhdGE+DQogICAgICAgICAgICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQ2dUQ0NBZW9DQ1FDYk9scldEZFg3RlRBTkJna3Foa2lHOXcwQkFRVUZBRENCaERFTE1Ba0dBMVVFQmhNQ1RrOHhHREFXQmdOVkJBZ1REMEZ1WkhKbFlYTWdVMjlzWW1WeVp6RU1NQW9HQTFVRUJ4TURSbTl2TVJBd0RnWURWUVFLRXdkVlRrbE9SVlJVTVJnd0ZnWURWUVFERXc5bVpXbGtaUzVsY214aGJtY3VibTh4SVRBZkJna3Foa2lHOXcwQkNRRVdFbUZ1WkhKbFlYTkFkVzVwYm1WMGRDNXViekFlRncwd056QTJNVFV4TWpBeE16VmFGdzB3TnpBNE1UUXhNakF4TXpWYU1JR0VNUXN3Q1FZRFZRUUdFd0pPVHpFWU1CWUdBMVVFQ0JNUFFXNWtjbVZoY3lCVGIyeGlaWEpuTVF3d0NnWURWUVFIRXdOR2IyOHhFREFPQmdOVkJBb1RCMVZPU1U1RlZGUXhHREFXQmdOVkJBTVREMlpsYVdSbExtVnliR0Z1Wnk1dWJ6RWhNQjhHQ1NxR1NJYjNEUUVKQVJZU1lXNWtjbVZoYzBCMWJtbHVaWFIwTG01dk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGl2YmhSN1A1MTZ4L1MzQnFLeHVwUWUwTE9Ob2xpdXBpQk9lc0NPM1NIYkRybDMrcTlJYmZuZm1FMDRyTnVNY1BzSXhCMTYxVGREcEllc0xDbjdjOGFQSElTS090UGxBZVRaU25iOFFBdTdhUmpacTMrUGJyUDV1VzNUY2ZDR1B0S1R5dEhPZ2UvT2xKYm8wNzhkVmhYUTE0ZDFFRHdYSlcxclJYdVV0NEM4UUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFDRFZmcDg2SE9icVkrZThCVW9XUTkrVk1ReDFBU0RvaEJqd09zZzJXeWtVcVJYRitkTGZjVUg5ZFdSNjNDdFpJS0ZEYlN0Tm9tUG5RejduYksrb255Z3dCc3BWRWJuSHVVaWhacTNaVWRtdW1RcUN3NFV2cy8xVXZxM29yT28vV0pWaFR5dkxnRlZLMlFhclE0LzY3T1pmSGQ3UitQT0JYaG9waFNNdjFaT288L2RzOlg1MDlDZXJ0aWZpY2F0ZT4NCiAgICAgICAgICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgICAgICAgPC9kczpLZXlJbmZvPg0KICAgICAgICA8L2RzOlNpZ25hdHVyZT4NCiAgICAgICAgPHNhbWw6U3ViamVjdD4NCiAgICAgICAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vcGl0YnVsay5uby1pcC5vcmcvbmV3b25lbG9naW4vZGVtbzEvbWV0YWRhdGEucGhwIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnRyYW5zaWVudCI+XzIxMjZkZDE5YjhhOWEyODIzOGQ4OGZkYzczODVlNjA5OTUwMDRhNzc4Mjwvc2FtbDpOYW1lSUQ+DQogICAgICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgICAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIzLTA5LTIyVDE5OjAyOjMxWiIgUmVjaXBpZW50PSJodHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL2luZGV4LnBocD9hY3MiIEluUmVzcG9uc2VUbz0iT05FTE9HSU5fMTkxYzAzZTY4ZDcxZDk3OTZmNWUwN2U2MjYyY2E0YWQ4ODNhNzRiMSIvPg0KICAgICAgICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgICAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxNC0wMy0yMVQxMzo0MjowMVoiIE5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMjozMVoiPg0KICAgICAgICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICAgICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAxNC0wMy0yMVQyMTo0MjozMVoiIFNlc3Npb25JbmRleD0iX2U2NTc4ZDZhZjk3YjlmN2YwNjcyZDg1MGQyOWRiNGFkZDFhMjg2ZGMyNCI+DQogICAgICAgICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgICAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICAgICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjEiIEZyaWVuZGx5TmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0PC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjEiIEZyaWVuZGx5TmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0Mjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdEBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InNuIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj53YWEyPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJlZHVQZXJzb25BZmZpbGlhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZG1pbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+DQo= \ No newline at end of file diff --git a/tests/data/responses/response6.xml.base64 b/tests/data/responses/response6.xml.base64 new file mode 100644 index 00000000..b78c68eb --- /dev/null +++ b/tests/data/responses/response6.xml.base64 @@ -0,0 +1 @@ +DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgSUQ9IkdPU0FNTFIxMjkwMTE3NDU3MTc5NCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIiBEZXN0aW5hdGlvbj0ie3JlY2lwaWVudH0iPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgVmVyc2lvbj0iMi4wIiBJRD0icGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly9hcHAub25lbG9naW4uY29tL3NhbWwvbWV0YWRhdGEvMTM1OTA8L3NhbWw6SXNzdWVyPg0KICAgIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgPGRzOlNpZ25lZEluZm8+DQogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZnhhNDY1NzRkZi1iM2IwLWEwNmEtMjNjOC02MzY0MTMxOTg3NzIiPg0KICAgICAgICAgIDxkczpUcmFuc2Zvcm1zPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+DQogICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPg0KICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgIDxkczpEaWdlc3RWYWx1ZT5wSlE3TVMvZWs0S1JSV0dtdi9INDNSZUhZTXM9PC9kczpEaWdlc3RWYWx1ZT4NCiAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICA8L2RzOlNpZ25lZEluZm8+DQogICAgICA8ZHM6U2lnbmF0dXJlVmFsdWU+eWl2ZUtjUGREcHVETmo2c2hyUTNBQndyL2NBM0NyeUQycGhHL3hMWnN6S1d4VTUvbWxhS3Q4ZXdiWk9kS0t2dE9zMnBIQnk1RHVhM2s5NEFGK3p4R3llbDVnT293bW95WEpyK0FPcitrUE8wdmxpMVY4bzNoUFBVWndSZ1NYNlE5cFMxQ3FRZ2hLaUVhc1J5eWxxcUpVYVBZem1Pek9FOC9YbE1rd2lXbU8wPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQogICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgPGRzOlg1MDlEYXRhPg0KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQnJUQ0NBYUdnQXdJQkFnSUJBVEFEQmdFQU1HY3hDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SVXdFd1lEVlFRSERBeFRZVzUwWVNCTmIyNXBZMkV4RVRBUEJnTlZCQW9NQ0U5dVpVeHZaMmx1TVJrd0Z3WURWUVFEREJCaGNIQXViMjVsYkc5bmFXNHVZMjl0TUI0WERURXdNRE13T1RBNU5UZzBOVm9YRFRFMU1ETXdPVEE1TlRnME5Wb3daekVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGVEFUQmdOVkJBY01ERk5oYm5SaElFMXZibWxqWVRFUk1BOEdBMVVFQ2d3SVQyNWxURzluYVc0eEdUQVhCZ05WQkFNTUVHRndjQzV2Ym1Wc2IyZHBiaTVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFPalN1MWZqUHk4ZDV3NFF5TDEremQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiIE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vdGVzdC5leGFtcGxlLmNvbS9zYW1sL21ldGFkYXRhIj5zdXBwb3J0QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiIFJlY2lwaWVudD0ie3JlY2lwaWVudH0iLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InVybjpvaWQ6MC45LjIzNDIuMTkyMDAzMDAuMTAwLjEuMSIgRnJpZW5kbHlOYW1lPSJ1aWQiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmRlbW88L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InVybjpvaWQ6Mi41LjQuNDIiIEZyaWVuZGx5TmFtZT0iZ2l2ZW5OYW1lIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj52YWx1ZTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+DQo= \ No newline at end of file diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index b65278cf..60c4247a 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -599,6 +599,48 @@ public function testGetAttributes() } } + /** + * Tests the getAttributes method of the OneLogin_Saml2_Response + * + * @covers OneLogin_Saml2_Response::getAttributes + */ + public function testGetAttributesWithFriendlyName() + { + $xml = file_get_contents(TEST_ROOT . '/data/responses/response6.xml.base64'); + $response = new OneLogin_Saml2_Response($this->_settings, $xml); + + $expectedAttributes = array( + 'uid' => array( + 'demo' + ), + 'givenName' => array( + 'value' + ), + ); + $this->assertEquals($expectedAttributes, $response->getAttributesWithFriendlyName()); + + // An assertion that has no attributes should return an empty array when asked for the attributes + $xml2 = file_get_contents(TEST_ROOT . '/data/responses/response2.xml.base64'); + $response2 = new OneLogin_Saml2_Response($this->_settings, $xml2); + + $this->assertEmpty($response2->getAttributesWithFriendlyName()); + + // Encrypted Attributes are not supported + $xml3 = file_get_contents(TEST_ROOT . '/data/responses/invalids/encrypted_attrs.xml.base64'); + $response3 = new OneLogin_Saml2_Response($this->_settings, $xml3); + $this->assertEmpty($response3->getAttributesWithFriendlyName()); + + // Duplicated Attribute names + $xml4 = file_get_contents(TEST_ROOT . '/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64'); + $response4 = new OneLogin_Saml2_Response($this->_settings, $xml4); + try { + $attrs = $response4->getAttributesWithFriendlyName(); + $this->fail('OneLogin_Saml2_ValidationError was not raised'); + } catch (OneLogin_Saml2_ValidationError $e) { + $this->assertContains('Found an Attribute element with duplicated FriendlyName', $e->getMessage()); + } + } + /** * Tests the getNameId method of the OneLogin_Saml2_Response * From 59d34dda66d0f35bbe7404216ef0bed5ab8bd9f4 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 29 Nov 2017 10:47:57 +0100 Subject: [PATCH 044/236] Fix #275 Remove unnecesary call --- lib/Saml2/Auth.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 9c0af58e..aa636183 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -568,8 +568,6 @@ public function buildRequestSignature($samlRequest, $relayState, $signAlgorithm ); } - $key = $this->_settings->getSPkey(); - $objKey = new XMLSecurityKey($signAlgorithm, array('type' => 'private')); $objKey->loadKey($key, false); From 157a8771ad99c5f15859310fe931f9f54c40b966 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sat, 2 Dec 2017 22:45:05 +0100 Subject: [PATCH 045/236] Fix bug on parseRemoteXML and parseFileXML. Internal calls to parseXML missed the desiredNameIdFormat parameter --- lib/Saml2/IdPMetadataParser.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 00cde728..feb1a969 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -35,7 +35,7 @@ public static function parseRemoteXML($url, $entityId = null, $desiredNameIdForm $xml = curl_exec($ch); if ($xml !== false) { - $metadataInfo = self::parseXML($xml, $entityId, $desiredSSOBinding, $desiredSLOBinding); + $metadataInfo = self::parseXML($xml, $entityId, $desiredNameIdFormat, $desiredSSOBinding, $desiredSLOBinding); } else { throw new Exception(curl_error($ch), curl_errno($ch)); } @@ -65,7 +65,7 @@ public static function parseFileXML($filepath, $entityId = null, $desiredNameIdF try { if (file_exists($filepath)) { $data = file_get_contents($filepath); - $metadataInfo = self::parseXML($data, $entityId, $desiredSSOBinding, $desiredSLOBinding); + $metadataInfo = self::parseXML($data, $entityId, $desiredNameIdFormat, $desiredSSOBinding, $desiredSLOBinding); } } catch (Exception $e) { } From 283914aec41a2ac6bb1232270c7bc8577ff6e198 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 13 Dec 2017 19:06:16 +0100 Subject: [PATCH 046/236] Add more tests to cover IdPMetadataParser --- lib/Saml2/IdPMetadataParser.php | 4 +- ...tadata_different_sign_and_encrypt_cert.xml | 72 +++++++++++++++++++ ...dp_metadata_same_sign_and_encrypt_cert.xml | 71 ++++++++++++++++++ .../OneLogin/Saml2/IdPMetadataParserTest.php | 51 +++++++++++++ 4 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 tests/data/metadata/idp/idp_metadata_different_sign_and_encrypt_cert.xml create mode 100644 tests/data/metadata/idp/idp_metadata_same_sign_and_encrypt_cert.xml diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index feb1a969..0cf17997 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -161,8 +161,8 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n } $idpCertdata = $metadataInfo['idp']['x509certMulti']; - if (count($idpCertdata) == 1 and - ((isset($idpCertdata['signing']) and count($idpCertdata['signing']) == 1) or (isset($idpCertdata['encryption']) and count($idpCertdata['encryption']) == 1)) or + if ((count($idpCertdata) == 1 and + ((isset($idpCertdata['signing']) and count($idpCertdata['signing']) == 1) or (isset($idpCertdata['encryption']) and count($idpCertdata['encryption']) == 1))) or ((isset($idpCertdata['signing']) && count($idpCertdata['signing']) == 1) && isset($idpCertdata['encryption']) && count($idpCertdata['encryption']) == 1 && strcmp($idpCertdata['signing'][0], $idpCertdata['encryption'][0]) == 0)) { if (isset($metadataInfo['idp']['x509certMulti']['signing'][0])) { $metadataInfo['idp']['x509cert'] = $metadataInfo['idp']['x509certMulti']['signing'][0]; diff --git a/tests/data/metadata/idp/idp_metadata_different_sign_and_encrypt_cert.xml b/tests/data/metadata/idp/idp_metadata_different_sign_and_encrypt_cert.xml new file mode 100644 index 00000000..df90353a --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata_different_sign_and_encrypt_cert.xml @@ -0,0 +1,72 @@ + + + + + + + MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET +MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD +VQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2 +MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u +ZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z +0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT +gf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m +Tr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF +zRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ +UAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV +HSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw +DwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO +BgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu +AuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV +gG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ +sTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP +TbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu +QOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78 +1sE= + + + + + + + MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEF +BQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJj +aWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwW +T25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUy +MjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChz +Z2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNV +BAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo +3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRw +tnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xx +VRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5 +L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t +1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/ +BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCB +pIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYD +VQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQL +DAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaC +FD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B +AQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXM +GI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65c +hjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIB +vlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37 +MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZ +WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + + + + Support + support@onelogin.com + + \ No newline at end of file diff --git a/tests/data/metadata/idp/idp_metadata_same_sign_and_encrypt_cert.xml b/tests/data/metadata/idp/idp_metadata_same_sign_and_encrypt_cert.xml new file mode 100644 index 00000000..e7fd250b --- /dev/null +++ b/tests/data/metadata/idp/idp_metadata_same_sign_and_encrypt_cert.xml @@ -0,0 +1,71 @@ + + + + + + + MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET +MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD +VQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2 +MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u +ZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z +0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT +gf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m +Tr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF +zRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ +UAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV +HSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw +DwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO +BgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu +AuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV +gG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ +sTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP +TbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu +QOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78 +1sE= + + + + + + + MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET +MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD +VQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2 +MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u +ZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z +0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT +gf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m +Tr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF +zRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ +UAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV +HSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw +DwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO +BgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu +AuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV +gG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ +sTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP +TbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu +QOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78 +1sE= + + + + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + + + + Support + support@onelogin.com + + \ No newline at end of file diff --git a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php index 88c5ffe4..c6db20dd 100644 --- a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php +++ b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php @@ -358,6 +358,57 @@ public function testParseMultiSigningCerts() $this->assertEquals($expectedInfo, $idpInfo); } + /** + * Tests the parseXML method of IdPMetadataParser. + * Case: IdP metadata contains multiple signature cert and encrypt cert + * that is the same + * + * @covers OneLogin_Saml2_IdPMetadataParser::parseXML + */ + public function testParseMultiSameSigningAndEncryptCert() + { + $expectedInfo = array( + "idp" => array( + "singleSignOnService" => array( + "url" => "https://app.onelogin.com/trust/saml2/http-post/sso/383123", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509cert" => "MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9uZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sTgf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0mTr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SFzRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJUAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNVHSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHuAuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcVgG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJsTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClPTbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWuQOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh781sE=", + "entityId" => "https://app.onelogin.com/saml/metadata/383123" + ), + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" + ) + ); + + $expectedInfo2 = array( + "idp" => array( + "singleSignOnService" => array( + "url" => "https://app.onelogin.com/trust/saml2/http-post/sso/383123", + "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" + ), + "x509certMulti" => array( + "signing" => array( + 0 => "MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9uZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sTgf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0mTr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SFzRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJUAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNVHSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHuAuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcVgG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJsTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClPTbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWuQOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh781sE="), + "encryption" => array( + 0 => "MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJjaWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUyMjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRwtnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xxVRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCBpIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaCFD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXMGI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65chjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIBvlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZWQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw=="), + ), + "entityId" => "https://app.onelogin.com/saml/metadata/383123" + ), + "sp" => array( + "NameIDFormat" => "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" + ) + ); + + $filepath = TEST_ROOT .'/data/metadata/idp/idp_metadata_same_sign_and_encrypt_cert.xml'; + $idpInfo = OneLogin_Saml2_IdPMetadataParser::parseFileXML($filepath); + $this->assertEquals($expectedInfo, $idpInfo); + + $filepath2 = TEST_ROOT .'/data/metadata/idp/idp_metadata_different_sign_and_encrypt_cert.xml'; + $idpInfo2 = OneLogin_Saml2_IdPMetadataParser::parseFileXML($filepath2); + $this->assertEquals($expectedInfo2, $idpInfo2); + } + /** * Tests the injectIntoSettings method of IdPMetadataParser. * From 0b7985d41569ef2f53a5f6fd67c4761d73c8a9ed Mon Sep 17 00:00:00 2001 From: Pascal Hofmann Date: Thu, 21 Dec 2017 15:05:45 +0100 Subject: [PATCH 047/236] Fixed typo. --- demo1/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo1/index.php b/demo1/index.php index fbb06871..39967912 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -27,7 +27,7 @@ $auth->login($returnTo); } else if (isset($_GET['slo'])) { $returnTo = null; - $paramters = array(); + $parameters = array(); $nameId = null; $sessionIndex = null; $nameIdFormat = null; @@ -42,7 +42,7 @@ $nameIdFormat = $_SESSION['samlNameIdFormat']; } - $auth->logout($returnTo, $paramters, $nameId, $sessionIndex, false, $nameIdFormat); + $auth->logout($returnTo, $parameters, $nameId, $sessionIndex, false, $nameIdFormat); # If LogoutRequest ID need to be saved in order to later validate it, do instead # $sloBuiltUrl = $auth->logout(null, $paramters, $nameId, $sessionIndex, true); From 1045c6bd12ff22dc8bbfa8a0c6787f16ce930ab6 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 18 Jan 2018 19:17:03 +0100 Subject: [PATCH 048/236] Refactor, Add more tests --- lib/Saml2/Auth.php | 36 +++++++++ lib/Saml2/Response.php | 72 +++-------------- ..._attributes_with_friendly_names.xml.base64 | 2 +- tests/data/responses/response6.xml.base64 | 2 +- tests/src/OneLogin/Saml2/AuthTest.php | 78 +++++++++++++++++++ 5 files changed, 128 insertions(+), 62 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index aa636183..b53d21b2 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -20,6 +20,13 @@ class OneLogin_Saml2_Auth */ private $_attributes = array(); + /** + * User attributes data with FriendlyName index. + * + * @var array + */ + private $_attributesWithFriendlyName = array(); + /** * NameID * @@ -182,6 +189,7 @@ public function processResponse($requestId = null) if ($response->isValid($requestId)) { $this->_attributes = $response->getAttributes(); + $this->_attributesWithFriendlyName = $response->getAttributesWithFriendlyName(); $this->_nameid = $response->getNameId(); $this->_nameidFormat = $response->getNameIdFormat(); $this->_nameidNameQualifier = $response->getNameIdNameQualifier(); @@ -325,6 +333,16 @@ public function getAttributes() return $this->_attributes; } + /** + * Returns the set of SAML attributes indexed by FriendlyName + * + * @return array Attributes of the user. + */ + public function getAttributesWithFriendlyName() + { + return $this->_attributesWithFriendlyName; + } + /** * Returns the nameID * @@ -413,6 +431,24 @@ public function getAttribute($name) return $value; } + /** + * Returns the requested SAML attribute indexed by FriendlyName + * + * @param string $friendlyName The requested attribute of the user. + * + * @return array|null Requested SAML attribute ($friendlyName). + */ + public function getAttributeWithFriendlyName($friendlyName) + { + assert('is_string($friendlyName)'); + + $value = null; + if (isset($this->_attributesWithFriendlyName[$friendlyName])) { + return $this->_attributesWithFriendlyName[$friendlyName]; + } + return $value; + } + /** * Initiates the SSO process. * diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index db468611..060ed72b 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -707,46 +707,7 @@ public function getSessionIndex() */ public function getAttributes() { - $attributes = array(); - - /* EncryptedAttributes not supported - - $encriptedAttributes = $this->_queryAssertion('/saml:AttributeStatement/saml:EncryptedAttribute'); - - if ($encriptedAttributes->length > 0) { - foreach ($encriptedAttributes as $encriptedAttribute) { - $key = $this->_settings->getSPkey(); - $seckey = new XMLSecurityKey(XMLSecurityKey::RSA_1_5, array('type'=>'private')); - $seckey->loadKey($key); - $attribute = OneLogin_Saml2_Utils::decryptElement($encriptedAttribute->firstChild(), $seckey); - } - } - */ - - $entries = $this->_queryAssertion('/saml:AttributeStatement/saml:Attribute'); - - /** @var $entry DOMNode */ - foreach ($entries as $entry) { - $attributeName = $entry->attributes->getNamedItem('Name')->nodeValue; - - if (in_array($attributeName, array_keys($attributes))) { - throw new OneLogin_Saml2_ValidationError( - "Found an Attribute element with duplicated Name", - OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND - ); - } - - $attributeValues = array(); - foreach ($entry->childNodes as $childNode) { - $tagName = ($childNode->prefix ? $childNode->prefix.':' : '') . 'AttributeValue'; - if ($childNode->nodeType == XML_ELEMENT_NODE && $childNode->tagName === $tagName) { - $attributeValues[] = $childNode->nodeValue; - } - } - - $attributes[$attributeName] = $attributeValues; - } - return $attributes; + return $this->_getAttributesByKeyName('Name'); } /** @@ -756,37 +717,28 @@ public function getAttributes() */ public function getAttributesWithFriendlyName() { - $attributes = array(); - - /* EncryptedAttributes not supported - - $encriptedAttributes = $this->_queryAssertion('/saml:AttributeStatement/saml:EncryptedAttribute'); + return $this->_getAttributesByKeyName('FriendlyName'); + } - if ($encriptedAttributes->length > 0) { - foreach ($encriptedAttributes as $encriptedAttribute) { - $key = $this->_settings->getSPkey(); - $seckey = new XMLSecurityKey(XMLSecurityKey::RSA_1_5, array('type'=>'private')); - $seckey->loadKey($key); - $attribute = OneLogin_Saml2_Utils::decryptElement($encriptedAttribute->firstChild(), $seckey); - } - } - */ + private function _getAttributesByKeyName($keyName="Name") + { + $attributes = array(); $entries = $this->_queryAssertion('/saml:AttributeStatement/saml:Attribute'); /** @var $entry DOMNode */ foreach ($entries as $entry) { - $attributeFriendlyNameNode = $entry->attributes->getNamedItem('FriendlyName'); + $attributeKeyNode = $entry->attributes->getNamedItem($keyName); - if ($attributeFriendlyNameNode === null) { + if ($attributeKeyNode === null) { continue; } - $attributeFriendlyName = $attributeFriendlyNameNode->nodeValue; + $attributeKeyName = $attributeKeyNode->nodeValue; - if (in_array($attributeFriendlyName, array_keys($attributes))) { + if (in_array($attributeKeyName, array_keys($attributes))) { throw new OneLogin_Saml2_ValidationError( - "Found an Attribute element with duplicated FriendlyName", + "Found an Attribute element with duplicated ".$keyName, OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND ); } @@ -799,7 +751,7 @@ public function getAttributesWithFriendlyName() } } - $attributes[$attributeFriendlyName] = $attributeValues; + $attributes[$attributeKeyName] = $attributeValues; } return $attributes; } diff --git a/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 b/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 index aba662b2..17afb888 100644 --- a/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 +++ b/tests/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeDQ0OTkyZWJiLTRiMzgtZTQzMi1kYjgyLTk5NTI0MTBkOWFhYiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDI6MzFaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzE5MWMwM2U2OGQ3MWQ5Nzk2ZjVlMDdlNjI2MmNhNGFkODgzYTc0YjEiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+DQogICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogICAgICAgIDxkczpTaWduZWRJbmZvPg0KICAgICAgICAgICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgICAgICAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4NDQ5OTJlYmItNGIzOC1lNDMyLWRiODItOTk1MjQxMGQ5YWFiIj4NCiAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+DQogICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybXM+DQogICAgICAgICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+DQogICAgICAgICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmd2UnJyZ3hwQWR5bElBLzJzckZtSmQramlzOD08L2RzOkRpZ2VzdFZhbHVlPg0KICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICAgIDwvZHM6U2lnbmVkSW5mbz4NCiAgICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPktkcDhUOHJud1BjQlVvaGNxUE0wZWlOWHBNaDNsYytlcEhUREhxTEVuT0pyZ3U1L2pqK2k3RWFBbWdPMFJKVGtoREVZMFY4Rm5lVDR2b3ZjQWJnOWZiTThmVE8xbFg4MndJbXNFZHEyTDNTRTg0cUJ1YUNtRFY1WW8wN0NIYlFPUWphZXRUa3RKdW9GMDhBZDZsKzVoUk8vcEp4bXJFeUcrNEtpaEZZQnV1az08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+DQogICAgICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgICA8L2RzOktleUluZm8+DQogICAgPC9kczpTaWduYXR1cmU+DQogICAgPHNhbWxwOlN0YXR1cz4NCiAgICAgICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICAgIDwvc2FtbHA6U3RhdHVzPg0KICAgIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng4MGJhYWVmNi0yOTJiLTg3NDctY2ZjYS1kZTFlZTNmMWE0MTUiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQyOjMxWiI+DQogICAgICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+DQogICAgICAgIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgICAgICAgPGRzOlNpZ25lZEluZm8+DQogICAgICAgICAgICAgICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogICAgICAgICAgICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZng4MGJhYWVmNi0yOTJiLTg3NDctY2ZjYS1kZTFlZTNmMWE0MTUiPg0KICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICAgICAgICAgICAgICA8L2RzOlRyYW5zZm9ybXM+DQogICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgICAgICAgICAgICA8ZHM6RGlnZXN0VmFsdWU+YVI5TTRld05zM3UrbkphUUNEMjZaMEF3RDZNPTwvZHM6RGlnZXN0VmFsdWU+DQogICAgICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICAgICAgICA8L2RzOlNpZ25lZEluZm8+DQogICAgICAgICAgICA8ZHM6U2lnbmF0dXJlVmFsdWU+NGQ4WEo1bXBOaW1vQkhkenNXZi9aemxVTlE3SmlVeEl4K1B5TjRuM0EvbWExcGwvQ0FPSUtOUzZ0clR6STg5N1ZjbGxneFhhTTljUFZqOUhLYU9aRW4wSE5Qa2FWR3VjeVVPVzFUd2dWdnJVdkNNQXVRTzdRZ21aekd1SVhsblVKS3FpTDRZMThNT1M1VGpLaExoSG4xbGE4TEFucmRVVEJobUx5eGtjZjhVPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQogICAgICAgICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgICAgICAgICA8ZHM6WDUwOURhdGE+DQogICAgICAgICAgICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQ2dUQ0NBZW9DQ1FDYk9scldEZFg3RlRBTkJna3Foa2lHOXcwQkFRVUZBRENCaERFTE1Ba0dBMVVFQmhNQ1RrOHhHREFXQmdOVkJBZ1REMEZ1WkhKbFlYTWdVMjlzWW1WeVp6RU1NQW9HQTFVRUJ4TURSbTl2TVJBd0RnWURWUVFLRXdkVlRrbE9SVlJVTVJnd0ZnWURWUVFERXc5bVpXbGtaUzVsY214aGJtY3VibTh4SVRBZkJna3Foa2lHOXcwQkNRRVdFbUZ1WkhKbFlYTkFkVzVwYm1WMGRDNXViekFlRncwd056QTJNVFV4TWpBeE16VmFGdzB3TnpBNE1UUXhNakF4TXpWYU1JR0VNUXN3Q1FZRFZRUUdFd0pPVHpFWU1CWUdBMVVFQ0JNUFFXNWtjbVZoY3lCVGIyeGlaWEpuTVF3d0NnWURWUVFIRXdOR2IyOHhFREFPQmdOVkJBb1RCMVZPU1U1RlZGUXhHREFXQmdOVkJBTVREMlpsYVdSbExtVnliR0Z1Wnk1dWJ6RWhNQjhHQ1NxR1NJYjNEUUVKQVJZU1lXNWtjbVZoYzBCMWJtbHVaWFIwTG01dk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGl2YmhSN1A1MTZ4L1MzQnFLeHVwUWUwTE9Ob2xpdXBpQk9lc0NPM1NIYkRybDMrcTlJYmZuZm1FMDRyTnVNY1BzSXhCMTYxVGREcEllc0xDbjdjOGFQSElTS090UGxBZVRaU25iOFFBdTdhUmpacTMrUGJyUDV1VzNUY2ZDR1B0S1R5dEhPZ2UvT2xKYm8wNzhkVmhYUTE0ZDFFRHdYSlcxclJYdVV0NEM4UUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFDRFZmcDg2SE9icVkrZThCVW9XUTkrVk1ReDFBU0RvaEJqd09zZzJXeWtVcVJYRitkTGZjVUg5ZFdSNjNDdFpJS0ZEYlN0Tm9tUG5RejduYksrb255Z3dCc3BWRWJuSHVVaWhacTNaVWRtdW1RcUN3NFV2cy8xVXZxM29yT28vV0pWaFR5dkxnRlZLMlFhclE0LzY3T1pmSGQ3UitQT0JYaG9waFNNdjFaT288L2RzOlg1MDlDZXJ0aWZpY2F0ZT4NCiAgICAgICAgICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgICAgICAgPC9kczpLZXlJbmZvPg0KICAgICAgICA8L2RzOlNpZ25hdHVyZT4NCiAgICAgICAgPHNhbWw6U3ViamVjdD4NCiAgICAgICAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vcGl0YnVsay5uby1pcC5vcmcvbmV3b25lbG9naW4vZGVtbzEvbWV0YWRhdGEucGhwIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnRyYW5zaWVudCI+XzIxMjZkZDE5YjhhOWEyODIzOGQ4OGZkYzczODVlNjA5OTUwMDRhNzc4Mjwvc2FtbDpOYW1lSUQ+DQogICAgICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgICAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIzLTA5LTIyVDE5OjAyOjMxWiIgUmVjaXBpZW50PSJodHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL2luZGV4LnBocD9hY3MiIEluUmVzcG9uc2VUbz0iT05FTE9HSU5fMTkxYzAzZTY4ZDcxZDk3OTZmNWUwN2U2MjYyY2E0YWQ4ODNhNzRiMSIvPg0KICAgICAgICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgICAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxNC0wMy0yMVQxMzo0MjowMVoiIE5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMjozMVoiPg0KICAgICAgICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICAgICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAxNC0wMy0yMVQyMTo0MjozMVoiIFNlc3Npb25JbmRleD0iX2U2NTc4ZDZhZjk3YjlmN2YwNjcyZDg1MGQyOWRiNGFkZDFhMjg2ZGMyNCI+DQogICAgICAgICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgICAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICAgICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjEiIEZyaWVuZGx5TmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0PC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjEiIEZyaWVuZGx5TmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0Mjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdEBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InNuIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj53YWEyPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJlZHVQZXJzb25BZmZpbGlhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZG1pbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+DQo= \ No newline at end of file +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeDkyOWMxNjg1LWZhZTctNTJlYi05OTdkLTYxZDliMWM2YzFkZiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDI6MzFaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzE5MWMwM2U2OGQ3MWQ5Nzk2ZjVlMDdlNjI2MmNhNGFkODgzYTc0YjEiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeDkyOWMxNjg1LWZhZTctNTJlYi05OTdkLTYxZDliMWM2YzFkZiI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+RXlHY1RES1k0TlJTK0RRZlN5My9MRGFUL0lJPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5FalhCUyt1dVlHcURXTFBJZ3JpZTA3a3orcXE5bEJvTng0WVlZQUpBSTJtR3JDdjF5NkkreTFYTU1YRU9DZVh4L3F3Tk5ROGwwck13YWVXMzcxT1VxZnRzM3RsK21xWCs4b05iOWhRVkpXWTdSMGRwc25DcEcwYk1LY2FETTQwcGxuWWJzQ0UzUUZUNVFKWGFkTC9wUHN4QXVxcmNIVTdZT0pPenNwQkRXTkk9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+DQogICAgPHNhbWxwOlN0YXR1cz4NCiAgICAgICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICAgIDwvc2FtbHA6U3RhdHVzPg0KICAgIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZnhlNTUwZGFmMC1jMGUwLTFhN2YtMDgwNS1kYTcwM2IxNzMzNTgiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQyOjMxWiI+DQogICAgICAgIDxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeGU1NTBkYWYwLWMwZTAtMWE3Zi0wODA1LWRhNzAzYjE3MzM1OCI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+VFQvYjJnYm51eVBTRXJBU20wWEVSSFdhaWV3PTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5wQXEwcjNQMFJjYThmM0FTZ29MNXlHL2krOU9aSnU1dndSL09rZmg5UDVYNHpKbm1yVWN3SzZPSjRPSVkvK2RISGpkemxpR2RyQkVXdXNlWlFxSEYwR05GSk1wZmVUcVFyd3M1SUN3Z1psenNqZ3dHcXpsWUNsYkZ1aktyQUhsTDZwdHppVVZRWWhLeTdEa2RDY05NcjROako0QmpSbzkybCtXcnZvUXJqYUk9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+DQogICAgICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICAgICAgICA8c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJodHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL21ldGFkYXRhLnBocCIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDp0cmFuc2llbnQiPl8yMTI2ZGQxOWI4YTlhMjgyMzhkODhmZGM3Mzg1ZTYwOTk1MDA0YTc3ODI8L3NhbWw6TmFtZUlEPg0KICAgICAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPg0KICAgICAgICAgICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMjozMVoiIFJlY2lwaWVudD0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzE5MWMwM2U2OGQ3MWQ5Nzk2ZjVlMDdlNjI2MmNhNGFkODgzYTc0YjEiLz4NCiAgICAgICAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L3NhbWw6U3ViamVjdD4NCiAgICAgICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTQtMDMtMjFUMTM6NDI6MDFaIiBOb3RPbk9yQWZ0ZXI9IjIwMjMtMDktMjJUMTk6MDI6MzFaIj4NCiAgICAgICAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgICAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICAgICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPC9zYW1sOkNvbmRpdGlvbnM+DQogICAgICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxNC0wMy0yMVQxMzo0MTowOVoiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTQtMDMtMjFUMjE6NDI6MzFaIiBTZXNzaW9uSW5kZXg9Il9lNjU3OGQ2YWY5N2I5ZjdmMDY3MmQ4NTBkMjlkYjRhZGQxYTI4NmRjMjQiPg0KICAgICAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICAgICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0idXJuOm9pZDowLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4xIiBGcmllbmRseU5hbWU9InVpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0idXJuOm9pZDowLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS41IiBGcmllbmRseU5hbWU9InVpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdDI8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3RAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImNuIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0PC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJzbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+d2FhMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgICAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICAgICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iZWR1UGVyc29uQWZmaWxpYXRpb24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICAgICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnVzZXI8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+YWRtaW48L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvc2FtbDpBc3NlcnRpb24+DQo8L3NhbWxwOlJlc3BvbnNlPg== \ No newline at end of file diff --git a/tests/data/responses/response6.xml.base64 b/tests/data/responses/response6.xml.base64 index b78c68eb..0262ad83 100644 --- a/tests/data/responses/response6.xml.base64 +++ b/tests/data/responses/response6.xml.base64 @@ -1 +1 @@ -DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgSUQ9IkdPU0FNTFIxMjkwMTE3NDU3MTc5NCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIiBEZXN0aW5hdGlvbj0ie3JlY2lwaWVudH0iPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgVmVyc2lvbj0iMi4wIiBJRD0icGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly9hcHAub25lbG9naW4uY29tL3NhbWwvbWV0YWRhdGEvMTM1OTA8L3NhbWw6SXNzdWVyPg0KICAgIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgPGRzOlNpZ25lZEluZm8+DQogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZnhhNDY1NzRkZi1iM2IwLWEwNmEtMjNjOC02MzY0MTMxOTg3NzIiPg0KICAgICAgICAgIDxkczpUcmFuc2Zvcm1zPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+DQogICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPg0KICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgIDxkczpEaWdlc3RWYWx1ZT5wSlE3TVMvZWs0S1JSV0dtdi9INDNSZUhZTXM9PC9kczpEaWdlc3RWYWx1ZT4NCiAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICA8L2RzOlNpZ25lZEluZm8+DQogICAgICA8ZHM6U2lnbmF0dXJlVmFsdWU+eWl2ZUtjUGREcHVETmo2c2hyUTNBQndyL2NBM0NyeUQycGhHL3hMWnN6S1d4VTUvbWxhS3Q4ZXdiWk9kS0t2dE9zMnBIQnk1RHVhM2s5NEFGK3p4R3llbDVnT293bW95WEpyK0FPcitrUE8wdmxpMVY4bzNoUFBVWndSZ1NYNlE5cFMxQ3FRZ2hLaUVhc1J5eWxxcUpVYVBZem1Pek9FOC9YbE1rd2lXbU8wPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQogICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgPGRzOlg1MDlEYXRhPg0KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQnJUQ0NBYUdnQXdJQkFnSUJBVEFEQmdFQU1HY3hDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SVXdFd1lEVlFRSERBeFRZVzUwWVNCTmIyNXBZMkV4RVRBUEJnTlZCQW9NQ0U5dVpVeHZaMmx1TVJrd0Z3WURWUVFEREJCaGNIQXViMjVsYkc5bmFXNHVZMjl0TUI0WERURXdNRE13T1RBNU5UZzBOVm9YRFRFMU1ETXdPVEE1TlRnME5Wb3daekVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGVEFUQmdOVkJBY01ERk5oYm5SaElFMXZibWxqWVRFUk1BOEdBMVVFQ2d3SVQyNWxURzluYVc0eEdUQVhCZ05WQkFNTUVHRndjQzV2Ym1Wc2IyZHBiaTVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFPalN1MWZqUHk4ZDV3NFF5TDEremQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiIE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vdGVzdC5leGFtcGxlLmNvbS9zYW1sL21ldGFkYXRhIj5zdXBwb3J0QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiIFJlY2lwaWVudD0ie3JlY2lwaWVudH0iLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InVybjpvaWQ6MC45LjIzNDIuMTkyMDAzMDAuMTAwLjEuMSIgRnJpZW5kbHlOYW1lPSJ1aWQiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmRlbW88L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InVybjpvaWQ6Mi41LjQuNDIiIEZyaWVuZGx5TmFtZT0iZ2l2ZW5OYW1lIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj52YWx1ZTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+DQo= \ No newline at end of file +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgSUQ9InBmeDU0OTIzNzlmLTU4YmUtZmIxMy00ZDgxLTViZWJlMDc0ODI0NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3NwLmV4YW1wbGUuY29tL2FjcyI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeDU0OTIzNzlmLTU4YmUtZmIxMy00ZDgxLTViZWJlMDc0ODI0NyI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+TGNLTzZOSGRFRFV4b0lHVFdyRVZ0ekQrYzlnPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5RdXFvZ05tUlNHVDB2dUtuZVdMSDZ2bFBVVktRaG9CSmhmNWxqMnBQY2FteHE4NDFvY0FPRkRJNElXK09Ba3UzdDFxRG9ZYmliUmROWXVzMlVPVjZEcVRDMGtVVm9yajBxVTVEd0JwOHk5c2Z0VTJ5QS9tMHNKSGxSTVVVcHVrSzRIL3dNcjJSZm5tOHdoOE80M0VEZTlnUjIwLzlReGFHWUsrWHFXNWgzSVE9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPjwvc2FtbHA6U3RhdHVzPg0KICA8c2FtbDpBc3NlcnRpb24geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiBWZXJzaW9uPSIyLjAiIElEPSJwZnhhNDY1NzRkZi1iM2IwLWEwNmEtMjNjOC02MzY0MTMxOTg3NzIiIElzc3VlSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwczovL2lkcC5leGFtcGxlLmNvbS9tZXRhZGF0YTwvc2FtbDpJc3N1ZXI+DQogICAgPHNhbWw6U3ViamVjdD4NCiAgICAgIDxzYW1sOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyIgTmFtZVF1YWxpZmllcj0iaHR0cHM6Ly90ZXN0LmV4YW1wbGUuY29tL3NhbWwvbWV0YWRhdGEiPnN1cHBvcnRAb25lbG9naW4uY29tPC9zYW1sOk5hbWVJRD4NCiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4NCiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDEwLTExLTE4VDIyOjAyOjM3WiIgUmVjaXBpZW50PSJodHRwOi8vc3AuZXhhbXBsZS5jb20vbWV0YWRhdGEiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+ICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjEiIEZyaWVuZGx5TmFtZT0idWlkIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5kZW1vPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1cm46b2lkOjIuNS40LjQyIiBGcmllbmRseU5hbWU9ImdpdmVuTmFtZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+dmFsdWU8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogIDwvc2FtbDpBc3NlcnRpb24+DQo8L3NhbWxwOlJlc3BvbnNlPg== diff --git a/tests/src/OneLogin/Saml2/AuthTest.php b/tests/src/OneLogin/Saml2/AuthTest.php index 12a0ed92..fa96414b 100644 --- a/tests/src/OneLogin/Saml2/AuthTest.php +++ b/tests/src/OneLogin/Saml2/AuthTest.php @@ -198,6 +198,84 @@ public function testProcessResponseValid() $this->assertEquals('2655106621', $sessionExpiration); } + /** + * Tests the getAttributes and getAttributesWithFriendlyName methods + * @covers OneLogin_Saml2_Auth::getAttributes + * @covers OneLogin_Saml2_Auth::getAttribute + * @covers OneLogin_Saml2_Auth::getAttributesWithFriendlyName + * @covers OneLogin_Saml2_Auth::getAttributeWithFriendlyName + */ + public function testGetAttributes() + { + $auth = new OneLogin_Saml2_Auth($this->_settingsInfo); + + $response = file_get_contents(TEST_ROOT . '/data/responses/response6.xml.base64'); + $_POST['SAMLResponse'] = $response; + $auth->processResponse(); + + $expectedAttributes = array( + 'urn:oid:0.9.2342.19200300.100.1.1' => array( + 'demo' + ), + 'urn:oid:2.5.4.42' => array( + 'value' + ), + ); + $expectedFriendlyNameAttributes = array( + 'uid' => array( + 'demo' + ), + 'givenName' => array( + 'value' + ), + ); + $this->assertEquals($expectedAttributes, $auth->getAttributes()); + $this->assertEquals($expectedFriendlyNameAttributes, $auth->getAttributesWithFriendlyName()); + + $this->assertNull($auth->getAttribute('givenName')); + $this->assertEquals(array('value'), $auth->getAttributeWithFriendlyName('givenName')); + + $this->assertEquals(array('value'), $auth->getAttribute('urn:oid:2.5.4.42')); + $this->assertNull($auth->getAttributeWithFriendlyName('urn:oid:2.5.4.42')); + + // An assertion that has no attributes should return an empty array when asked for the attributes + $response2 = file_get_contents(TEST_ROOT . '/data/responses/response2.xml.base64'); + $_POST['SAMLResponse'] = $response2; + $auth2 = new OneLogin_Saml2_Auth($this->_settingsInfo); + $auth2->processResponse(); + $this->assertEmpty($auth2->getAttributes()); + $this->assertEmpty($auth2->getAttributesWithFriendlyName()); + + // Encrypted Attributes are not supported + $response3 = file_get_contents(TEST_ROOT . '/data/responses/invalids/encrypted_attrs.xml.base64'); + $_POST['SAMLResponse'] = $response3; + $auth3 = new OneLogin_Saml2_Auth($this->_settingsInfo); + $auth3->processResponse(); + $this->assertEmpty($auth3->getAttributes()); + $this->assertEmpty($auth3->getAttributesWithFriendlyName()); + + // Duplicated Attribute names + $response4 = file_get_contents(TEST_ROOT . '/data/responses/invalids/duplicated_attributes_with_friendly_names.xml.base64'); + $_POST['SAMLResponse'] = $response4; + $auth4 = new OneLogin_Saml2_Auth($this->_settingsInfo); + try { + $auth4->processResponse(); + $this->fail('OneLogin_Saml2_ValidationError was not raised'); + } catch (OneLogin_Saml2_ValidationError $e) { + $this->assertContains('Found an Attribute element with duplicated FriendlyName', $e->getMessage()); + } + + $response5 = file_get_contents(TEST_ROOT . '/data/responses/invalids/duplicated_attributes.xml.base64'); + $_POST['SAMLResponse'] = $response5; + $auth5 = new OneLogin_Saml2_Auth($this->_settingsInfo); + try { + $auth5->processResponse(); + $this->fail('OneLogin_Saml2_ValidationError was not raised'); + } catch (OneLogin_Saml2_ValidationError $e) { + $this->assertContains('Found an Attribute element with duplicated Name', $e->getMessage()); + } + } + /** * Tests the redirectTo method of the OneLogin_Saml2_Auth class * (phpunit raises an exception when a redirect is executed, the From 9272165365cefc2327d3499e5b837a71a794a464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Delprat?= Date: Tue, 23 Jan 2018 14:04:43 +0900 Subject: [PATCH 049/236] Change Fatal Error to Exception `OneLogin_Saml2_Utils::loadXML` returns `false` if input is not correct XML. Which leads to a Fatal Error : > Call to a member function getAttribute() on null in **/vendor/onelogin/php-saml/lib/Saml2/LogoutRequest.php:163 With this fix, an Exception is thrown. --- lib/Saml2/LogoutRequest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index a10fdd80..2ed69826 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -150,6 +150,8 @@ public function getRequest($deflate = null) * @param string|DOMDocument $request Logout Request Message * * @return string ID + * + * @throws OneLogin_Saml2_Error */ public static function getID($request) { @@ -158,6 +160,13 @@ public static function getID($request) } else { $dom = new DOMDocument(); $dom = OneLogin_Saml2_Utils::loadXML($dom, $request); + + if (false === $dom) { + throw new OneLogin_Saml2_Error( + "XML is invalid", + OneLogin_Saml2_Error::SAML_LOGOUTREQUEST_INVALID + ); + } } $id = $dom->documentElement->getAttribute('ID'); From 8fe3ab466075493d4e3ae8547bd50b57f086ca5c Mon Sep 17 00:00:00 2001 From: Stephane Delprat Date: Wed, 24 Jan 2018 12:44:21 +0900 Subject: [PATCH 050/236] Add tests and LogoutResponse --- lib/Saml2/LogoutRequest.php | 2 +- lib/Saml2/LogoutResponse.php | 9 +++++++ lib/Saml2/Utils.php | 2 +- .../src/OneLogin/Saml2/LogoutRequestTest.php | 25 ++++++++++++++++--- .../src/OneLogin/Saml2/LogoutResponseTest.php | 23 ++++++++++++++--- 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 2ed69826..8bbcedb4 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -160,7 +160,7 @@ public static function getID($request) } else { $dom = new DOMDocument(); $dom = OneLogin_Saml2_Utils::loadXML($dom, $request); - + if (false === $dom) { throw new OneLogin_Saml2_Error( "XML is invalid", diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index e41dcd64..77ce2eff 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -42,6 +42,8 @@ class OneLogin_Saml2_LogoutResponse * * @param OneLogin_Saml2_Settings $settings Settings. * @param string|null $response An UUEncoded SAML Logout response from the IdP. + * + * @throws OneLogin_Saml2_Error */ public function __construct(OneLogin_Saml2_Settings $settings, $response = null) { @@ -63,6 +65,13 @@ public function __construct(OneLogin_Saml2_Settings $settings, $response = null) $this->document = new DOMDocument(); $this->document = OneLogin_Saml2_Utils::loadXML($this->document, $this->_logoutResponse); + if (false === $this->document) { + throw new OneLogin_Saml2_Error( + "XML is invalid", + OneLogin_Saml2_Error::SAML_LOGOUTRESPONSE_INVALID + ); + } + if ($this->document->documentElement->hasAttribute('ID')) { $this->id = $this->document->documentElement->getAttribute('ID'); } diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 013aaf97..8458ffe7 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -727,7 +727,7 @@ public static function parseDuration($duration, $timestamp = null) /* Parse the duration. We use a very strict pattern. */ $durationRegEx = '#^(-?)P(?:(?:(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?)|(?:(\\d+)W))$#D'; - $matches = array(); + $matches = array(); if (!preg_match($durationRegEx, $duration, $matches)) { throw new Exception('Invalid ISO 8601 duration: ' . $duration); } diff --git a/tests/src/OneLogin/Saml2/LogoutRequestTest.php b/tests/src/OneLogin/Saml2/LogoutRequestTest.php index 4c69f221..7daa6f10 100644 --- a/tests/src/OneLogin/Saml2/LogoutRequestTest.php +++ b/tests/src/OneLogin/Saml2/LogoutRequestTest.php @@ -265,7 +265,7 @@ public function testCreateDeflatedSAMLLogoutRequestURLParameter() /** * Tests the OneLogin_Saml2_LogoutRequest Constructor. * Case: Able to generate encryptedID with MultiCert - * + * * @covers OneLogin_Saml2_LogoutRequest */ public function testConstructorEncryptIdUsingX509certMulti() @@ -828,7 +828,7 @@ public function testGetXML() $logoutRequest = new OneLogin_Saml2_LogoutRequest($settings); $xml = $logoutRequest->getXML(); $this->assertRegExp('#^getXML(); $this->assertRegExp('#^getXML(); $id1 = OneLogin_Saml2_LogoutRequest::getID($xml); $this->assertNotNull($id1); - + $logoutRequestProcessed = new OneLogin_Saml2_LogoutRequest($settings, base64_encode($xml)); $id2 = $logoutRequestProcessed->id; $this->assertEquals($id1, $id2); } + + /** + * Tests that the LogoutRequest throws an exception + * + * @covers OneLogin_Saml2_LogoutRequest::getID() + * + * @expectedException OneLogin_Saml2_Error + * @expectedExceptionMessage XML is invalid + */ + public function testGetIDException() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + $logoutRequest = new OneLogin_Saml2_LogoutRequest($settings); + $xml = $logoutRequest->getXML(); + $id1 = OneLogin_Saml2_LogoutRequest::getID($xml.''); + } } diff --git a/tests/src/OneLogin/Saml2/LogoutResponseTest.php b/tests/src/OneLogin/Saml2/LogoutResponseTest.php index 54a84976..31165485 100644 --- a/tests/src/OneLogin/Saml2/LogoutResponseTest.php +++ b/tests/src/OneLogin/Saml2/LogoutResponseTest.php @@ -437,7 +437,7 @@ public function testWeCanChooseToDeflateAResponseBody() //Test that we can choose not to compress the request payload. $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings1.php'; - + //Compression is currently turned on in settings. $settings = new OneLogin_Saml2_Settings($settingsInfo); $logoutResponse = new OneLogin_Saml2_LogoutResponse($settings, $message); @@ -448,7 +448,7 @@ public function testWeCanChooseToDeflateAResponseBody() //Test that we can choose not to compress the request payload. $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings2.php'; - + //Compression is currently turned on in settings. $settings = new OneLogin_Saml2_Settings($settingsInfo); $logoutResponse = new OneLogin_Saml2_LogoutResponse($settings, $message); @@ -497,9 +497,26 @@ public function testGetID() $xml = $logoutResponse->getXML(); $id1 = $logoutResponse->getID(); $this->assertNotNull($id1); - + $processedLogoutResponse = new OneLogin_Saml2_LogoutResponse($settings, base64_encode($xml)); $id2 = $processedLogoutResponse->getID(); $this->assertEquals($id1, $id2); } + + /** + * Tests that the LogoutRequest throws an exception + * + * @covers OneLogin_Saml2_LogoutRequest::getID() + * + * @expectedException OneLogin_Saml2_Error + * @expectedExceptionMessage XML is invalid + */ + public function testGetIDException() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + $logoutResponse = new OneLogin_Saml2_LogoutResponse($settings, ''); + } } From 035a3bf7cd1061f87fe2fcde219c8d3bd02793f0 Mon Sep 17 00:00:00 2001 From: Stephane Delprat Date: Wed, 24 Jan 2018 21:51:28 +0900 Subject: [PATCH 051/236] Change exception message --- lib/Saml2/LogoutRequest.php | 2 +- lib/Saml2/LogoutResponse.php | 2 +- tests/src/OneLogin/Saml2/LogoutRequestTest.php | 2 +- tests/src/OneLogin/Saml2/LogoutResponseTest.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 8bbcedb4..7fa6e52a 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -163,7 +163,7 @@ public static function getID($request) if (false === $dom) { throw new OneLogin_Saml2_Error( - "XML is invalid", + "LogoutRequest could not be processed", OneLogin_Saml2_Error::SAML_LOGOUTREQUEST_INVALID ); } diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index 77ce2eff..be5caf3f 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -67,7 +67,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $response = null) if (false === $this->document) { throw new OneLogin_Saml2_Error( - "XML is invalid", + "LogoutResponse could not be processed", OneLogin_Saml2_Error::SAML_LOGOUTRESPONSE_INVALID ); } diff --git a/tests/src/OneLogin/Saml2/LogoutRequestTest.php b/tests/src/OneLogin/Saml2/LogoutRequestTest.php index 7daa6f10..7c5c3cff 100644 --- a/tests/src/OneLogin/Saml2/LogoutRequestTest.php +++ b/tests/src/OneLogin/Saml2/LogoutRequestTest.php @@ -861,7 +861,7 @@ public function testGetID() * @covers OneLogin_Saml2_LogoutRequest::getID() * * @expectedException OneLogin_Saml2_Error - * @expectedExceptionMessage XML is invalid + * @expectedExceptionMessage LogoutRequest could not be processed */ public function testGetIDException() { diff --git a/tests/src/OneLogin/Saml2/LogoutResponseTest.php b/tests/src/OneLogin/Saml2/LogoutResponseTest.php index 31165485..5cc5d45b 100644 --- a/tests/src/OneLogin/Saml2/LogoutResponseTest.php +++ b/tests/src/OneLogin/Saml2/LogoutResponseTest.php @@ -509,7 +509,7 @@ public function testGetID() * @covers OneLogin_Saml2_LogoutRequest::getID() * * @expectedException OneLogin_Saml2_Error - * @expectedExceptionMessage XML is invalid + * @expectedExceptionMessage LogoutResponse could not be processed */ public function testGetIDException() { From 47cc1092daa416df3188b19966a9870f22d7d456 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 27 Feb 2018 19:05:03 +0100 Subject: [PATCH 052/236] Adding test that checks VU-475445 --- .../response_node_text_attack.xml.base64 | 1 + tests/src/OneLogin/Saml2/ResponseTest.php | 24 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 tests/data/responses/response_node_text_attack.xml.base64 diff --git a/tests/data/responses/response_node_text_attack.xml.base64 b/tests/data/responses/response_node_text_attack.xml.base64 new file mode 100644 index 00000000..ba9f2f12 --- /dev/null +++ b/tests/data/responses/response_node_text_attack.xml.base64 @@ -0,0 +1 @@ +PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJHT1NBTUxSMTI5MDExNzQ1NzE3OTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiIgRGVzdGluYXRpb249IntyZWNpcGllbnR9Ij4NCiAgPHNhbWxwOlN0YXR1cz4NCiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIFZlcnNpb249IjIuMCIgSUQ9InBmeGE0NjU3NGRmLWIzYjAtYTA2YS0yM2M4LTYzNjQxMzE5ODc3MiIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHBzOi8vYXBwLm9uZWxvZ2luLmNvbS9zYW1sL21ldGFkYXRhLzEzNTkwPC9zYW1sOklzc3Vlcj4NCiAgICA8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgIDxkczpTaWduZWRJbmZvPg0KICAgICAgICA8ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogICAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIj4NCiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICA8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4NCiAgICAgICAgICA8ZHM6RGlnZXN0VmFsdWU+cEpRN01TL2VrNEtSUldHbXYvSDQzUmVIWU1zPTwvZHM6RGlnZXN0VmFsdWU+DQogICAgICAgIDwvZHM6UmVmZXJlbmNlPg0KICAgICAgPC9kczpTaWduZWRJbmZvPg0KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnlpdmVLY1BkRHB1RE5qNnNoclEzQUJ3ci9jQTNDcnlEMnBoRy94TFpzektXeFU1L21sYUt0OGV3YlpPZEtLdnRPczJwSEJ5NUR1YTNrOTRBRnp4R3llbDVnT293bW95WEpyQU9ya1BPMHZsaTFWOG8zaFBQVVp3UmdTWDZROXBTMUNxUWdoS2lFYXNSeXlscXFKVWFQWXptT3pPRTgvWGxNa3dpV21PMD08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgPGRzOktleUluZm8+DQogICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUJyVENDQWFHZ0F3SUJBZ0lCQVRBREJnRUFNR2N4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUlV3RXdZRFZRUUhEQXhUWVc1MFlTQk5iMjVwWTJFeEVUQVBCZ05WQkFvTUNFOXVaVXh2WjJsdU1Sa3dGd1lEVlFRRERCQmhjSEF1YjI1bGJHOW5hVzR1WTI5dE1CNFhEVEV3TURNd09UQTVOVGcwTlZvWERURTFNRE13T1RBNU5UZzBOVm93WnpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RlRBVEJnTlZCQWNNREZOaGJuUmhJRTF2Ym1sallURVJNQThHQTFVRUNnd0lUMjVsVEc5bmFXNHhHVEFYQmdOVkJBTU1FR0Z3Y0M1dmJtVnNiMmRwYmk1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBT2pTdTFmalB5OGQ1dzRReUwxemQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnN1cHBvcnQ8IS0tIGF0dGFjayEgLS0+QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiIFJlY2lwaWVudD0ie3JlY2lwaWVudH0iLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InN1cm5hbWUiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnM8IS0tIGF0dGFjayEgLS0+bWl0aDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iYW5vdGhlcl92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+dmFsdWUxPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnZhbHVlMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0icm9sZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+cm9sZTE8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImZpcnN0bmFtZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+Ym9iPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4gIA0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImF0dHJpYnV0ZV93aXRoX25pbF92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJhdHRyaWJ1dGVfd2l0aF9uaWxzX2FuZF9lbXB0eV9zdHJpbmdzIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZT52YWx1ZVByZXNlbnQ8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpuaWw9IjEiLz4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 60c4247a..26939ac4 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -535,9 +535,6 @@ public function testGetIssuers() } } - - - /** * Tests the getSessionIndex method of the OneLogin_Saml2_Response * @@ -556,7 +553,6 @@ public function testGetSessionIndex() $this->assertEquals('_7164a9a9f97828bfdb8d0ebc004a05d2e7d873f70c', $response2->getSessionIndex()); } - /** * Tests the getAttributes method of the OneLogin_Saml2_Response * @@ -720,6 +716,26 @@ public function testDoesNotAllowSignatureWrappingAttack2() $this->assertFalse($valid); } + /** + * Tests the getNameId and getAttributes methods of the + * OneLogin_Saml2_Response + * + * Test that the node text with comment attack (VU#475445) + * is not allowed + * + * @covers OneLogin_Saml2_Response::getNameId + * @covers OneLogin_Saml2_Response::getAttributes + */ + public function testNodeTextAttack() + { + $xml = file_get_contents(TEST_ROOT . '/data/responses/response_node_text_attack.xml.base64'); + $response = new OneLogin_Saml2_Response($this->_settings, $xml); + $nameId = $response->getNameId(); + $attributes = $response->getAttributes(); + $this->assertEquals("support@onelogin.com", $nameId); + $this->assertEquals("smith", $attributes['surname'][0]); + } + /** * Tests the getSessionNotOnOrAfter method of the OneLogin_Saml2_Response * From 8c491d58a3c6928c3b153fd32f3b70dd4376cd60 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 2 Mar 2018 01:21:07 +0100 Subject: [PATCH 053/236] Improve how fingerprint is calcultated --- lib/Saml2/Utils.php | 40 +++++++++++++---------- tests/src/OneLogin/Saml2/ResponseTest.php | 3 +- tests/src/OneLogin/Saml2/UtilsTest.php | 14 +++++--- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 013aaf97..468308bb 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -727,7 +727,7 @@ public static function parseDuration($duration, $timestamp = null) /* Parse the duration. We use a very strict pattern. */ $durationRegEx = '#^(-?)P(?:(?:(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?)|(?:(\\d+)W))$#D'; - $matches = array(); + $matches = array(); if (!preg_match($durationRegEx, $duration, $matches)) { throw new Exception('Invalid ISO 8601 duration: ' . $duration); } @@ -894,27 +894,30 @@ public static function calculateX509Fingerprint($x509cert, $alg = 'sha1') { assert('is_string($x509cert)'); - $lines = explode("\n", $x509cert); - + $arCert = explode("\n", $x509cert); $data = ''; - - foreach ($lines as $line) { - /* Remove '\r' from end of line if present. */ - $line = rtrim($line); - if ($line === '-----BEGIN CERTIFICATE-----') { - /* Delete junk from before the certificate. */ - $data = ''; - } elseif ($line === '-----END CERTIFICATE-----') { - /* Ignore data after the certificate. */ - break; - } elseif ($line === '-----BEGIN PUBLIC KEY-----' || $line === '-----BEGIN RSA PRIVATE KEY-----') { - /* This isn't an X509 certificate. */ - return null; + $inData = false; + + foreach ($arCert as $curData) { + if (! $inData) { + if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) { + $inData = true; + } elseif ((strncmp($curData, '-----BEGIN PUBLIC KEY', 21) == 0) || (strncmp($curData, '-----BEGIN RSA PRIVATE KEY', 26) == 0)) { + /* This isn't an X509 certificate. */ + return null; + } } else { - /* Append the current line to the certificate data. */ - $data .= $line; + if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) { + break; + } + $data .= trim($curData); } } + + if (empty($data)) { + return null; + } + $decodedData = base64_decode($data); switch ($alg) { @@ -1185,6 +1188,7 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' if ($key->type === $algorithm) { return $key; } + $keyInfo = openssl_pkey_get_details($key->key); if ($keyInfo === false) { throw new Exception('Unable to get key details from XMLSecurityKey.'); diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 26939ac4..6d7d280c 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -1475,7 +1475,8 @@ public function testIsValid2() $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings1.php'; - $settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert']); + $cert = OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert']); + $settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($cert); $settingsInfo['idp']['x509cert'] = null; $settings = new OneLogin_Saml2_Settings($settingsInfo); diff --git a/tests/src/OneLogin/Saml2/UtilsTest.php b/tests/src/OneLogin/Saml2/UtilsTest.php index 2317859e..41dd8b5f 100644 --- a/tests/src/OneLogin/Saml2/UtilsTest.php +++ b/tests/src/OneLogin/Saml2/UtilsTest.php @@ -455,7 +455,7 @@ public function testSetBaseURL() $this->assertNull(OneLogin_Saml2_Utils::getSelfPort()); $this->assertNull(OneLogin_Saml2_Utils::getBaseURLPath()); - $this->assertEquals($expectedUrlNQ, OneLogin_Saml2_Utils::getSelfURLNoQuery()); + $this->assertEquals($expectedUrlNQ, OneLogin_Saml2_Utils::getSelfURLNoQuery()); $this->assertEquals($expectedRoutedUrlNQ, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery()); $this->assertEquals($expectedUrl, OneLogin_Saml2_Utils::getSelfURL()); @@ -469,14 +469,14 @@ public function testSetBaseURL() $this->assertEquals('81', OneLogin_Saml2_Utils::getSelfPort()); $this->assertEquals('/example2/', OneLogin_Saml2_Utils::getBaseURLPath()); - $this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery()); + $this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery()); $this->assertEquals($expectedRoutedUrlNQ2, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery()); $this->assertEquals($expectedUrl2, OneLogin_Saml2_Utils::getSelfURL()); $_SERVER['PATH_INFO'] = '/test'; $expectedUrlNQ2 = 'http://anothersp.example.com:81/example2/route.php/test'; - $this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery()); + $this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery()); $this->assertEquals($expectedRoutedUrlNQ2, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery()); $this->assertEquals($expectedUrl2, OneLogin_Saml2_Utils::getSelfURL()); } @@ -929,7 +929,6 @@ public function testDeleteLocalSession() // Can't test that on TRAVIS $this->markTestSkipped("Can't test that on TRAVIS"); } else { - if (!isset($_SESSION)) { $_SESSION = array(); } @@ -964,7 +963,6 @@ public function testisSessionStarted() // Can't test that on TRAVIS $this->markTestSkipped("Can't test that on TRAVIS"); } else { - $this->assertFalse(OneLogin_Saml2_Utils::isSessionStarted()); $prev = error_reporting(0); @@ -994,6 +992,12 @@ public function testCalculateX509Fingerprint() $this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($key)); + $this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint("")); + + $this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert'])); + + $this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint(OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert']))); + $this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint($cert)); $this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint($cert, 'sha1')); From 54d148932bdda678a6e296d7d0c46abe93fc8742 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 5 Mar 2018 12:47:32 +0100 Subject: [PATCH 054/236] Add some fixes to xmlseclibs. Extra protection verifying the Signature algorithm used on SignedInfo element, not only rely on verify / verifySignature methods --- extlib/xmlseclibs/xmlseclibs.php | 6 ++---- lib/Saml2/Utils.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/extlib/xmlseclibs/xmlseclibs.php b/extlib/xmlseclibs/xmlseclibs.php index 05be8643..bd3caa5f 100644 --- a/extlib/xmlseclibs/xmlseclibs.php +++ b/extlib/xmlseclibs/xmlseclibs.php @@ -282,7 +282,7 @@ public function loadKey($key, $isFile=false, $isCert = false) { } else { $this->key = openssl_get_privatekey($this->key, $this->passphrase); } - } else if ($this->cryptParams['cipher'] == MCRYPT_RIJNDAEL_128) { + } else if (isset($this->cryptParams['cipher']) && $this->cryptParams['cipher'] == MCRYPT_RIJNDAEL_128) { /* Check key length */ switch ($this->type) { case (XMLSecurityKey::AES256_CBC): @@ -724,7 +724,7 @@ public function validateDigest($refNode, $data) { $digValue = $this->calculateDigest($digestAlgorithm, $data, false); $query = 'string(./secdsig:DigestValue)'; $digestValue = $xpath->evaluate($query, $refNode); - return ($digValue == base64_decode($digestValue)); + return ($digValue === base64_decode($digestValue)); } public function processTransforms($refNode, $objData, $includeCommentNodes = true) { @@ -846,8 +846,6 @@ public function processRefNode($refNode) { } else { $dataObject = $refNode->ownerDocument; } - } else { - $dataObject = file_get_contents($arUrl); } } else { /* This reference identifies the root node with an empty URI. This should diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 468308bb..ff5b6ae2 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -1189,6 +1189,10 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' return $key; } + if (!OneLogin_Saml2_Utils::isSupportedSigningAlgorithm($algorithm)) { + throw new \Exception('Unsupported signing algorithm.'); + } + $keyInfo = openssl_pkey_get_details($key->key); if ($keyInfo === false) { throw new Exception('Unable to get key details from XMLSecurityKey.'); @@ -1201,6 +1205,17 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' return $newKey; } + public static function isSupportedSigningAlgorithm($algorithm) + { + return in_array($algorithm, array( + XMLSecurityKey::RSA_1_5, + XMLSecurityKey::RSA_SHA1, + XMLSecurityKey::RSA_SHA256, + XMLSecurityKey::RSA_SHA384, + XMLSecurityKey::RSA_SHA512 + )); + } + /** * Adds signature key and senders certificate to an element (Message or Assertion). * @@ -1312,6 +1327,10 @@ public static function validateSign($xml, $cert = null, $fingerprint = null, $fi throw new Exception('We have no idea about the key'); } + if (!OneLogin_Saml2_Utils::isSupportedSigningAlgorithm($objKey->type)) { + throw new \Exception('Unsupported signing algorithm.'); + } + $objXMLSecDSig->canonicalizeSignedInfo(); try { From 2992d885d61889e7dce30abcac81b10d821c4e8f Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 5 Mar 2018 13:08:39 +0100 Subject: [PATCH 055/236] Add warning about the use of fingerprint on signature verification method --- README.md | 6 +++++- settings_example.php | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5bb4ae5b..7c600880 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ and supported by OneLogin Inc. Warning ------- +php-saml is not affected by [201803-01](https://simplesamlphp.org/security/201803-01) + Update php-saml to 2.10.4, this version includes a security patch related to [signature validations on LogoutRequests/LogoutResponses](https://github.com/onelogin/php-saml/commit/949359f5cad5e1d085c4e5447d9aa8f49a6e82a1) @@ -157,6 +159,7 @@ In production, the `strict` parameter **MUST** be set as `"true"` and the something other than SHA1 (see https://shattered.io/ ). Otherwise your environment is not secure and will be exposed to attacks. +In production also we highly recommended to register on the settings the IdP certificate instead of using the fingerprint method. The fingerprint, is a hash, so at the end is open to a collision attack that can end on a siganture validation bypass. Other SAML toolkits deprecated that mechanism, we maintain it for compatibility and also to be used on test environment. Getting started --------------- @@ -379,7 +382,8 @@ $settings = array ( 'x509cert' => '', /* * Instead of use the whole x509cert you can use a fingerprint in order to - * validate a SAMLResponse. + * validate a SAMLResponse, but we don't recommend to use that + * method on production since is exploitable by a collision attack. * (openssl x509 -noout -fingerprint -in "idp.crt" to generate it, * or add for example the -sha256 , -sha384 or -sha512 parameter) * diff --git a/settings_example.php b/settings_example.php index 7f648512..213c9606 100644 --- a/settings_example.php +++ b/settings_example.php @@ -101,7 +101,10 @@ // Public x509 certificate of the IdP 'x509cert' => '', /* - * Instead of use the whole x509cert you can use a fingerprint + * Instead of use the whole x509cert you can use a fingerprint in + * order to validate the SAMLResponse, but we don't recommend to use + * that method on production since is exploitable by a collision + * attack. * (openssl x509 -noout -fingerprint -in "idp.crt" to generate it, * or add for example the -sha256 , -sha384 or -sha512 parameter) * From 28e7ccc949592e78f7f4648dcfb492893aecc360 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 5 Mar 2018 16:43:24 +0100 Subject: [PATCH 056/236] Release 2.13.0 --- CHANGELOG | 6 ++++++ lib/Saml2/Utils.php | 17 ++++++++++------- lib/Saml2/version.json | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e83a93ae..362fc2c7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,11 @@ CHANGELOG ========= +v.2.13.0 +* Update xmlseclibs with some fixes. +* Add extra protection verifying the Signature algorithm used on SignedInfo element, not only rely on the xmlseclibs verify / verifySignature methods. +* Add getAttributesWithFriendlyName method which returns the set of SAML attributes indexed by FriendlyName +* Fix bug on parseRemoteXML and parseFileXML. Internal calls to parseXML missed the desiredNameIdFormat parameter + v.2.12.0 * Improve Time management. Use DateTime/DateTimeZone classes. * Escape error messages in debug mode diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index ff5b6ae2..7683b632 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -1207,13 +1207,16 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' public static function isSupportedSigningAlgorithm($algorithm) { - return in_array($algorithm, array( - XMLSecurityKey::RSA_1_5, - XMLSecurityKey::RSA_SHA1, - XMLSecurityKey::RSA_SHA256, - XMLSecurityKey::RSA_SHA384, - XMLSecurityKey::RSA_SHA512 - )); + return in_array( + $algorithm, + array( + XMLSecurityKey::RSA_1_5, + XMLSecurityKey::RSA_SHA1, + XMLSecurityKey::RSA_SHA256, + XMLSecurityKey::RSA_SHA384, + XMLSecurityKey::RSA_SHA512 + ) + ); } /** diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index b201baa4..dc3aca8b 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.12.0", - "released": "06/11/2017" + "version": "2.13.0", + "released": "05/03/2017" } } From 9593164081a688fc36c0531c097c894e4566ee5f Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 11 Apr 2018 15:30:29 +0200 Subject: [PATCH 057/236] Fix release date --- lib/Saml2/version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index dc3aca8b..f502a0cb 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { "version": "2.13.0", - "released": "05/03/2017" + "released": "05/03/2018" } } From ca5dd55b4c0ee217d9c16c83dfa0da373d17d768 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 26 Apr 2018 13:19:42 +0200 Subject: [PATCH 058/236] Improve Readme --- README.md | 45 +++++++++++++++++++++++---------------------- demo1/Readme.txt | 20 ++++++++------------ 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 7c600880..578cb734 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ After installation has completed you will find at the `vendor/` folder a new fol **Important** In this option, the x509 certs must be stored at `vendor/onelogin/php-saml/certs` and settings file stored at `vendor/onelogin/php-saml`. -Your settings are at risk of being deleted when updating packages using `composer update` or similiar commands. So it is **highly** recommended that instead of using settings files, you pass the settings as an array directly to the constructor (explained later in this document). If you do not use this approach your settings are at risk of being deleted when updating packages using `composer update` or similiar commands. +Your settings are at risk of being deleted when updating packages using `composer update` or similar commands. So it is **highly** recommended that instead of using settings files, you pass the settings as an array directly to the constructor (explained later in this document). If you do not use this approach your settings are at risk of being deleted when updating packages using `composer update` or similar commands. Compatibility ------------- @@ -144,7 +144,7 @@ the new features that the new library Saml2 carries. Namespaces ---------- -If you are using the library with a framework like Symfony2 that contains +If you are using the library with a framework like Symfony that contains namespaces, remember that calls to the class must be done by adding a backslash (`\`) to the start, for example to use the static method getSelfURLNoQuery use: @@ -159,7 +159,7 @@ In production, the `strict` parameter **MUST** be set as `"true"` and the something other than SHA1 (see https://shattered.io/ ). Otherwise your environment is not secure and will be exposed to attacks. -In production also we highly recommended to register on the settings the IdP certificate instead of using the fingerprint method. The fingerprint, is a hash, so at the end is open to a collision attack that can end on a siganture validation bypass. Other SAML toolkits deprecated that mechanism, we maintain it for compatibility and also to be used on test environment. +In production also we highly recommended to register on the settings the IdP certificate instead of using the fingerprint method. The fingerprint, is a hash, so at the end is open to a collision attack that can end on a signature validation bypass. Other SAML toolkits deprecated that mechanism, we maintain it for compatibility and also to be used on test environment. Getting started --------------- @@ -173,7 +173,7 @@ Let's start describing the folders: #### `certs/` #### -SAML requires a x.509 cert to sign and encrypt elements like `NameID`, `Message`, +SAML requires a x509 cert to sign and encrypt elements like `NameID`, `Message`, `Assertion`, `Metadata`. If our environment requires sign or encrypt support, this folder may contain @@ -186,11 +186,11 @@ Or also we can provide those data in the setting file at the `$settings['sp']['x and the `$settings['sp']['privateKey']`. Sometimes we could need a signature on the metadata published by the SP, in -this case we could use the x.509 cert previously mentioned or use a new x.509 +this case we could use the x509 cert previously mentioned or use a new x509 cert: `metadata.crt` and `metadata.key`. Use `sp_new.crt` if you are in a key rollover process and you want to -publish that x509certificate on Service Provider metadata. +publish that x509 certificate on Service Provider metadata. #### `extlib/` #### @@ -545,7 +545,7 @@ $advancedSettings = array ( The compression settings allow you to instruct whether or not the IdP can accept data that has been compressed using [gzip](gzip) ('requests' and 'responses'). -But if we provide a $deflate boolean parameter to the getRequest or getResponse method it will have priority over the compression settings. +But if we provide a `$deflate` boolean parameter to the `getRequest` or `getResponse` method it will have priority over the compression settings. In the security section, you can set the way that the SP will handle the messages and assertions. Contact the admin of the IdP and ask him what the IdP expects, @@ -556,7 +556,7 @@ Once we know what kind of data could be configured, let's talk about the way settings are handled within the toolkit. The settings files described (`settings.php` and `advanced_settings.php`) are loaded -by the toolkit if not other array with settings info is provided in the constructors of the toolkit. Let's see some examples. +by the toolkit if no other array with settings info is provided in the constructor of the toolkit. Let's see some examples. ```php // Initializes toolkit with settings.php & advanced_settings files. @@ -570,7 +570,7 @@ $auth = new OneLogin_Saml2_Auth($settingsInfo); $settings = new OneLogin_Saml2_Settings($settingsInfo); ``` -You can declare the `$settingsInfo` in the file that constains the constructor +You can declare the `$settingsInfo` in the file that contains the constructor execution or locate them in any file and load the file in order to get the array available as we see in the following example: @@ -632,9 +632,9 @@ The `AuthNRequest` will be sent signed or unsigned based on the security info of the `advanced_settings.php` (`'authnRequestsSigned'`). -The IdP will then return the SAML Response to the user's client. The client is then forwarded to the Attribute Consumer Service of the SP with this information. If we do not set a 'url' param in the login method and we are using the default ACS provided by the toolkit (`endpoints/acs.php`), then the ACS endpoint will redirect the user to the file that launched the SSO request. +The IdP will then return the SAML Response to the user's client. The client is then forwarded to the Attribute Consumer Service of the SP with this information. If we do not set a `'url'` param in the login method and we are using the default ACS provided by the toolkit (`endpoints/acs.php`), then the ACS endpoint will redirect the user to the file that launched the SSO request. -We can set an `'returnTo'` url to change the workflow and redirect the user to the other PHP file. +We can set a `'returnTo'` url to change the workflow and redirect the user to the other PHP file. ```php $newTargetUrl = 'http://example.com/consume2.php'; @@ -701,7 +701,8 @@ Before the XML metadata is exposed, a check takes place to ensure that the info to be provided is valid. Instead of use the Auth object, you can directly use -``` + +```php $settings = new OneLogin_Saml2_Settings($settingsInfo, true); ``` to get the settings object and with the true parameter we will avoid the IdP Settings validation. @@ -1126,11 +1127,11 @@ php-saml toolkit uses a bunch of methods in OneLogin_Saml2_Utils that try to gue getSelfURLNoQuery and getSelfRoutedURLNoQuery are used to calculate the currentURL in order to valdate SAML elements like Destination or Recipient. -When the PHP application is behind a proxy or a load balancer we can execute setProxyVars(true) and getSelfPort and isHTTPS will take care of the $_SERVER["HTTP_X_FORWARDED_PORT"] and $_SERVER['HTTP_X_FORWARDED_PROTO'] vars (otherwise they are ignored). +When the PHP application is behind a proxy or a load balancer we can execute `setProxyVars(true)` and `setSelfPort` and `isHTTPS` will take care of the `$_SERVER["HTTP_X_FORWARDED_PORT"]` and `$_SERVER['HTTP_X_FORWARDED_PROTO']` vars (otherwise they are ignored). -Also a developer can use setSelfProtocol, setSelfHost, setSelfPort and getBaseURLPath to define a specific value to be returned by isHTTPS, getSelfHost, getSelfPort and getBaseURLPath. And define a setBasePath to be used on the getSelfURL and getSelfRoutedURLNoQuery to replace the data extracted from $_SERVER["REQUEST_URI"]. +Also a developer can use `setSelfProtocol`, `setSelfHost`, `setSelfPort` and `getBaseURLPath` to define a specific value to be returned by `isHTTPS`, `getSelfHost`, `getSelfPort` and `getBaseURLPath`. And define a `setBasePath` to be used on the `getSelfURL` and `getSelfRoutedURLNoQuery` to replace the data extracted from `$_SERVER["REQUEST_URI"]`. -At the settings the developer will be able to set a 'baseurl' parameter that automatically will use setBaseURL to set values for setSelfProtocol, setSelfHost, setSelfPort and setBaseURLPath. +At the settings the developer will be able to set a `'baseurl'` parameter that automatically will use `setBaseURL` to set values for `setSelfProtocol`, `setSelfHost`, `setSelfPort` and `setBaseURLPath`. ### Working behind load balancer ### @@ -1144,7 +1145,7 @@ Or by using the method described on the previous section. ### SP Key rollover ### -If you plan to update the SP x509cert and privateKey you can define the new x509cert as $settings['sp']['x509certNew'] and it will be +If you plan to update the SP x509cert and privateKey you can define the new x509cert as `$settings['sp']['x509certNew']` and it will be published on the SP metadata so Identity Providers can read them and get ready for rollover. @@ -1153,20 +1154,20 @@ published on the SP metadata so Identity Providers can read them and get ready f In some scenarios the IdP uses different certificates for signing/encryption, or is under key rollover phase and more than one certificate is published on IdP metadata. -In order to handle that the toolkit offers the $settings['idp']['x509certMulti'] parameter. +In order to handle that the toolkit offers the `$settings['idp']['x509certMulti']` parameter. -When that parameter is used, 'x509cert' and 'certFingerprint' values will be ignored by the toolkit. +When that parameter is used, `'x509cert'` and `'certFingerprint'` values will be ignored by the toolkit. -The 'x509certMulti' is an array with 2 keys: -- 'signing'. An array of certs that will be used to validate IdP signature -- 'encryption' An array with one unique cert that will be used to encrypt data to be sent to the IdP +The `'x509certMulti'` is an array with 2 keys: +- `'signing'`. An array of certs that will be used to validate IdP signature +- `'encryption'` An array with one unique cert that will be used to encrypt data to be sent to the IdP ### Replay attacks ### In order to avoid replay attacks, you can store the ID of the SAML messages already processed, to avoid processing them twice. Since the Messages expires and will be invalidated due that fact, you don't need to store those IDs longer than the time frame that you currently accepting. -Get the ID of the last processed message/assertion with the getLastMessageId/getLastAssertionId method of the Auth object. +Get the ID of the last processed message/assertion with the `getLastMessageId/getLastAssertionId` methods of the Auth object. ### Main classes and methods ### diff --git a/demo1/Readme.txt b/demo1/Readme.txt index 1493b353..fae19121 100644 --- a/demo1/Readme.txt +++ b/demo1/Readme.txt @@ -19,8 +19,7 @@ file is loaded in order to get the $settingsInfo var to be used to initialize the Setting class. Notice that in this demo, the setting.php file that could be defined at the base -folder of the toolkit is ignored and the libs are loaded using the -_toolkit_loader.php located at the base folder of the toolkit. +folder of the toolkit is ignored and the libs are loaded using the _toolkit_loader.php located at the base folder of the toolkit. IdP setup @@ -37,40 +36,37 @@ How it works to the same view or login and be redirected to the attrs.php view. 2. When you click: - + 2.1 in the first link, we access to (index.php?sso) an AuthNRequest is sent to the IdP, we authenticate at the IdP and then a Response is sent to the SP, specifically the Assertion Consumer Service view: index.php?acs, notice that a RelayState parameter is set to the url that initiated the process, the index.php view. - 2.2 in the second link we access to (attrs.php) have the same process - described at 2.1 with the diference that as RelayState is set the attrs.php + 2.2 in the second link we access to (attrs.php) have the same process described at 2.1 with the diference that as RelayState is set the attrs.php 3. The SAML Response is processed in the ACS (index.php?acs), if the Response is not valid, the process stop here and a message is showed. Otherwise we are redirected to the RelayState view. a) index.php or b) attrs.php -4. We are logged in the app and the user attributes are showed. +4. We are logged in the app and the user attributes are showed. At this point, we can test the single log out functionality. -5. The single log out funcionality could be tested by 2 ways. +5. The single log out functionality could be tested by 2 ways. 5.1 SLO Initiated by SP. Click on the "logout" link at the SP, after that a - Logout Request is sent to the IdP, the session at the IdP is closed and - replies to the SP a Logout Response (sent to the Single Logout Service + Logout Request is sent to the IdP, the session at the IdP is closed and replies to the SP a Logout Response (sent to the Single Logout Service endpoint). The SLS endpoint (index.php?sls)of the SP process the Logout Response and if is valid, close the user session of the local app. Notice that the SLO Workflow starts and ends at the SP. 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP - side, the logout process is initiated at the idP, sends a Logout - Request to the SP (SLS endpoint, index.php?sls). The SLS endpoint of the SP + side, the logout process is initiated at the idP, sends a Logout Request to the SP (SLS endpoint, index.php?sls). The SLS endpoint of the SP process the Logout Request and if is valid, close the session of the user at the local app and send a Logout Response to the IdP (to the SLS endpoint of the IdP). The IdP recieve the Logout Response, process it and close the session at of the IdP. Notice that the SLO Workflow starts and ends at the IdP. - + Notice that all the SAML Requests and Responses are handler at a unique file, the index.php file and how GET paramters are used to know the action that must be done. From f13c9f3ed0e0492ff938a0af0fa8270a95a9b404 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 26 Apr 2018 18:53:50 +0200 Subject: [PATCH 059/236] Fix phpdoc --- lib/Saml2/Auth.php | 24 ++++++++++++------------ lib/Saml2/AuthnRequest.php | 2 ++ lib/Saml2/Response.php | 2 +- lib/Saml2/Utils.php | 28 ++++++++++++++++++++-------- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index b53d21b2..b547804d 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -129,7 +129,7 @@ class OneLogin_Saml2_Auth * (SAMLResponse, LogoutResponse). If the SAMLResponse was * encrypted, by default tries to return the decrypted XML * - * @var string + * @var string|\DomDocument|null */ private $_lastResponse; @@ -215,13 +215,13 @@ public function processResponse($requestId = null) /** * Process the SAML Logout Response / Logout Request sent by the IdP. * - * @param bool $keepLocalSession When false will destroy the local session, otherwise will keep it - * @param string|null $requestId The ID of the LogoutRequest sent by this SP to the IdP - * @param bool $retrieveParametersFromServer - * @param callable $cbDeleteSession - * @param bool $stay True if we want to stay (returns the url string) False to redirect + * @param bool $keepLocalSession When false will destroy the local session, otherwise will keep it + * @param string|null $requestId The ID of the LogoutRequest sent by this SP to the IdP + * @param bool $retrieveParametersFromServer True if we want to use parameters from $_SERVER to validate the signature + * @param callable $cbDeleteSession Callback to be executed to delete session + * @param bool $stay True if we want to stay (returns the url string) False to redirect * - * @return string|void + * @return string|null * * @throws OneLogin_Saml2_Error */ @@ -386,7 +386,7 @@ public function getSessionIndex() /** * Returns the SessionNotOnOrAfter * - * @return DateTime|null The SessionNotOnOrAfter of the assertion + * @return int|null The SessionNotOnOrAfter of the assertion */ public function getSessionExpiration() { @@ -454,10 +454,10 @@ public function getAttributeWithFriendlyName($friendlyName) * * @param string|null $returnTo The target URL the user should be returned to after login. * @param array $parameters Extra parameters to be added to the GET - * @param bool $forceAuthn When true the AuthNReuqest will set the ForceAuthn='true' - * @param bool $isPassive When true the AuthNReuqest will set the Ispassive='true' + * @param bool $forceAuthn When true the AuthNRequest will set the ForceAuthn='true' + * @param bool $isPassive When true the AuthNRequest will set the Ispassive='true' * @param bool $stay True if we want to stay (returns the url string) False to redirect - * @param bool $setNameIdPolicy When true the AuthNReuqest will set a nameIdPolicy element + * @param bool $setNameIdPolicy When true the AuthNRueqest will set a nameIdPolicy element * * @return string|null If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters */ @@ -560,7 +560,7 @@ public function getSSOurl() /** * Gets the SLO url. * - * @return string The url of the Single Logout Service + * @return string|null The url of the Single Logout Service */ public function getSLOurl() { diff --git a/lib/Saml2/AuthnRequest.php b/lib/Saml2/AuthnRequest.php index 5735a6f3..8418ee37 100644 --- a/lib/Saml2/AuthnRequest.php +++ b/lib/Saml2/AuthnRequest.php @@ -141,6 +141,8 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal * Returns deflated, base64 encoded, unsigned AuthnRequest. * * @param bool|null $deflate Whether or not we should 'gzdeflate' the request body before we return it. + * + * @return string */ public function getRequest($deflate = null) { diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 060ed72b..779d66a3 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -950,7 +950,7 @@ public function validateSignedElements($signedElements) /** * Extracts a node from the DOMDocument (Assertion). * - * @param string $assertionXpath Xpath Expresion + * @param string $assertionXpath Xpath Expression * * @return DOMNodeList The queried node * diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 7683b632..7852df4a 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -406,7 +406,7 @@ public static function setBaseURLPath($baseurlpath) } /** - * return string The baseurlpath to be used when constructing URLs + * @return string The baseurlpath to be used when constructing URLs */ public static function getBaseURLPath() { @@ -716,7 +716,7 @@ public static function parseSAML2Time($time) * duration to. Optional, default to the * current time. * - * @return int|null The new timestamp, after the duration is applied. + * @return int The new timestamp, after the duration is applied. * * @throws Exception */ @@ -799,8 +799,8 @@ public static function parseDuration($duration, $timestamp = null) /** * Compares 2 dates and returns the earliest. * - * @param string $cacheDuration The duration, as a string. - * @param string $validUntil The valid until date, as a string or as a timestamp + * @param string|null $cacheDuration The duration, as a string. + * @param string|int|null $validUntil The valid until date, as a string or as a timestamp * * @return int|null $expireTime The expiration time. */ @@ -830,9 +830,9 @@ public static function getExpireTime($cacheDuration = null, $validUntil = null) /** * Extracts nodes from the DOMDocument. * - * @param DOMDocument $dom The DOMDocument - * @param string $query Xpath Expresion - * @param DomElement $context Context Node (DomElement) + * @param DOMDocument $dom The DOMDocument + * @param string $query Xpath Expresion + * @param DomElement|null $context Context Node (DomElement) * * @return DOMNodeList The queried nodes */ @@ -953,7 +953,7 @@ public static function formatFingerPrint($fingerprint) * * @param string $value fingerprint * @param string $spnq SP Name Qualifier - * @param string $format SP Format + * @param string|null $format SP Format * @param string|null $cert IdP Public cert to encrypt the nameID * @param string|null $nq IdP Name Qualifier * @@ -1381,6 +1381,18 @@ public static function validateSign($xml, $cert = null, $fingerprint = null, $fi return $valid; } + /** + * Validates a binary signature + * + * @param string $messageType Type of SAML Message + * @param array $getData HTTP GET array + * @param array $idpData IdP setting data + * @param bool $retrieveParametersFromServer Indicates where to get the values in order to validate the Sign, from getData or from $_SERVER + * + * @return bool + * + * @throws Exception + */ public static function validateBinarySign($messageType, $getData, $idpData, $retrieveParametersFromServer = false) { if (!isset($getData['SigAlg'])) { From 1b2a413d32136fbee23fb7c8036123e04191ed37 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 2 May 2018 18:49:11 +0200 Subject: [PATCH 060/236] Fix #265. Support and parameters at getSPMetadata method --- lib/Saml2/Settings.php | 9 ++++--- tests/src/OneLogin/Saml2/SettingsTest.php | 29 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 5250b25c..0547ab23 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -803,14 +803,17 @@ public function shouldCompressResponses() * @param bool $alwaysPublishEncryptionCert When 'true', the returned metadata * will always include an 'encryption' KeyDescriptor. Otherwise, the 'encryption' * KeyDescriptor will only be included if $advancedSettings['security']['wantNameIdEncrypted'] - * or $advancedSettings['security']['wantAssertionsEncrypted'] are enabled. + * or $advancedSettings['security']['wantAssertionsEncrypted'] are enabled. + * @param DateTime|null $validUntil Metadata's valid time + * @param int|null $cacheDuration Duration of the cache in seconds + * * @return string SP metadata (xml) * @throws Exception * @throws OneLogin_Saml2_Error */ - public function getSPMetadata($alwaysPublishEncryptionCert = false) + public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil = null, $cacheDuration = null) { - $metadata = OneLogin_Saml2_Metadata::builder($this->_sp, $this->_security['authnRequestsSigned'], $this->_security['wantAssertionsSigned'], null, null, $this->getContacts(), $this->getOrganization()); + $metadata = OneLogin_Saml2_Metadata::builder($this->_sp, $this->_security['authnRequestsSigned'], $this->_security['wantAssertionsSigned'], $validUntil, $cacheDuration, $this->getContacts(), $this->getOrganization()); $certNew = $this->getSPcertNew(); if (!empty($certNew)) { diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 142d579a..c60ff412 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -496,6 +496,35 @@ public function testGetSPMetadataWithX509CertNewDataProvider() ]; } + /** + * Tests the getSPMetadata method of the OneLogin_Saml2_Settings + * Case ValidUntil CacheDuration + * + * @covers OneLogin_Saml2_Settings::getSPMetadata + */ + public function testGetSPMetadataTiming() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $currentValidUntil = time() + OneLogin_Saml2_Metadata::TIME_VALID; + $currentValidUntilStr = gmdate('Y-m-d\TH:i:s\Z', $currentValidUntil); + $defaultCacheDuration = OneLogin_Saml2_Metadata::TIME_CACHED; + + $metadata = $settings->getSPMetadata(); + $this->assertContains('validUntil="'.$currentValidUntilStr.'"', $metadata); + $this->assertContains('cacheDuration="PT604800S"', $metadata); + + $newValidUntil = 2524668343; + $newValidUntilStr = gmdate('Y-m-d\TH:i:s\Z', $newValidUntil); + $newCacheDuration = 1209600; + $metadata2 = $settings->getSPMetadata(false, $newValidUntil, $newCacheDuration); + $this->assertContains('validUntil="'.$newValidUntilStr.'"', $metadata2); + $this->assertContains('cacheDuration="PT1209600S"', $metadata2); + } + /** * Tests the getSPMetadata method of the OneLogin_Saml2_Settings * Case signed metadata From 12948aaa44957f7a13a197908931aa57f4392deb Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 2 May 2018 18:52:31 +0200 Subject: [PATCH 061/236] Remove extra spaces --- tests/src/OneLogin/Saml2/SettingsTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index c60ff412..913cace4 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -446,49 +446,49 @@ public function testGetSPMetadataWithX509CertNewDataProvider() { return [ 'settings do not require encryption' => [ - 'alwaysIncludeEncryption' => false, + 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => false, ], 'wantNameIdEncrypted setting enabled' => [ - 'alwaysIncludeEncryption' => false, + 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, ], 'wantAssertionsEncrypted setting enabled' => [ - 'alwaysIncludeEncryption' => false, + 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, ], 'both settings enabled'=> [ - 'alwaysIncludeEncryption' => false, + 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, ], 'metadata requested with encryption' => [ - 'alwaysIncludeEncryption' => true, + 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, ], - 'metadata requested with encryption and wantNameIdEncrypted setting enabled' => [ - 'alwaysIncludeEncryption' => true, + 'metadata requested with encryption and wantNameIdEncrypted setting enabled' => [ + 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, ], 'metadata requested with encryption and wantAssertionsEncrypted setting enabled' => [ - 'alwaysIncludeEncryption' => true, + 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, ], 'metadata requested with encryption and both settings enabled' => [ - 'alwaysIncludeEncryption' => true, + 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, From 428ffa877577114528d8346320d2031375bfba2e Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 15 May 2018 14:10:49 +0200 Subject: [PATCH 062/236] Fix #283.New method of importing a decrypted assertion into the XML document to replace the EncryptedAssertion. Fix signature issues on Signed Encrypted Assertions with default namespace --- lib/Saml2/Response.php | 41 +++++++++++++++++++++-------------------- lib/Saml2/Utils.php | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 779d66a3..0b39f752 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -720,7 +720,7 @@ public function getAttributesWithFriendlyName() return $this->_getAttributesByKeyName('FriendlyName'); } - private function _getAttributesByKeyName($keyName="Name") + private function _getAttributesByKeyName($keyName = "Name") { $attributes = array(); @@ -1028,14 +1028,12 @@ private function _query($query) protected function _decryptAssertion($dom) { $pem = $this->_settings->getSPkey(); - if (empty($pem)) { throw new OneLogin_Saml2_Error( "No private key available, check settings", OneLogin_Saml2_Error::PRIVATE_KEY_NOT_FOUND ); } - $objenc = new XMLSecEnc(); $encData = $objenc->locateEncryptedData($dom); if (!$encData) { @@ -1044,7 +1042,6 @@ protected function _decryptAssertion($dom) OneLogin_Saml2_ValidationError::MISSING_ENCRYPTED_ELEMENT ); } - $objenc->setNode($encData); $objenc->type = $encData->getAttribute("Type"); if (!$objKey = $objenc->locateKey()) { @@ -1053,7 +1050,6 @@ protected function _decryptAssertion($dom) OneLogin_Saml2_ValidationError::KEY_ALGORITHM_ERROR ); } - $key = null; if ($objKeyInfo = $objenc->locateKeyInfo($objKey)) { if ($objKeyInfo->isEncrypted) { @@ -1069,22 +1065,26 @@ protected function _decryptAssertion($dom) if (empty($objKey->key)) { $objKey->loadKey($key); } - - $decrypted = $objenc->decryptNode($objKey, true); - - if ($decrypted instanceof DOMDocument) { + $decryptedXML = $objenc->decryptNode($objKey, false); + $decrypted = new DOMDocument(); + $check = OneLogin_Saml2_Utils::loadXML($decrypted, $decryptedXML); + if ($check === false) { + throw new Exception('Error: string from decrypted assertion could not be loaded into a XML document'); + } + if ($encData->parentNode instanceof DOMDocument) { return $decrypted; } else { - $encryptedAssertion = $decrypted->parentNode; + $decrypted = $decrypted->documentElement; + $encryptedAssertion = $encData->parentNode; $container = $encryptedAssertion->parentNode; - # Fix possible issue with saml namespace - if (!$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml') && - !$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml2') && - !$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns') && - !$container->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml') && - !$container->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml2') - ) { + // Fix possible issue with saml namespace + if (!$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml') + && !$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml2') + && !$decrypted->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns') + && !$container->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml') + && !$container->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml2') + ) { if (strpos($encryptedAssertion->tagName, 'saml2:') !== false) { $ns = 'xmlns:saml2'; } else if (strpos($encryptedAssertion->tagName, 'saml:') !== false) { @@ -1092,13 +1092,14 @@ protected function _decryptAssertion($dom) } else { $ns = 'xmlns'; } - $decrypted->setAttributeNS('http://www.w3.org/2000/xmlns/', $ns, OneLogin_Saml2_Constants::NS_SAML); } - $container->replaceChild($decrypted, $encryptedAssertion); + OneLogin_Saml2_Utils::treeCopyReplace($encryptedAssertion, $decrypted); - return $decrypted->ownerDocument; + // Rebuild the DOM will fix issues with namespaces as well + $dom = new DOMDocument(); + return OneLogin_Saml2_Utils::loadXML($dom, $container->ownerDocument->saveXML()); } } diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 7852df4a..955a4ddb 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -145,6 +145,48 @@ public static function validateXML($xml, $schema, $debug = false) return $dom; } + /** + * Import a node tree into a target document + * Copy it before a reference node as a sibling + * and at the end of the copy remove + * the reference node in the target document + * As it were 'replacing' it + * Leaving nested default namespaces alone + * (Standard importNode with deep copy + * mangles nested default namespaces) + * + * The reference node must not be a DomDocument + * It CAN be the top element of a document + * Returns the copied node in the target document + * + * @param DomNode $targetNode + * @param DomNode $sourceNode + * @param bool $recurse + * @return DOMNode + * @throws Exception + */ + public static function treeCopyReplace(DomNode $targetNode, DomNode $sourceNode, $recurse = false) + { + if ($targetNode->parentNode === null) { + throw new Exception('Illegal argument targetNode. It has no parentNode.'); + } + $clonedNode = $targetNode->ownerDocument->importNode($sourceNode, false); + if ($recurse) { + $resultNode = $targetNode->appendChild($clonedNode); + } else { + $resultNode = $targetNode->parentNode->insertBefore($clonedNode, $targetNode); + } + if ($sourceNode->childNodes !== null) { + foreach ($sourceNode->childNodes as $child) { + self::treeCopyReplace($resultNode, $child, true); + } + } + if (!$recurse) { + $targetNode->parentNode->removeChild($targetNode); + } + return $resultNode; + } + /** * Returns a x509 cert (adding header & footer if required). * From ab7fff7cd15f225da17bd8b3e4e99b66685f0be1 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 15 May 2018 14:15:28 +0200 Subject: [PATCH 063/236] Add parameter to the decryptElement method to make optional the formatting --- lib/Saml2/Utils.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 955a4ddb..f173f8a0 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -1100,12 +1100,13 @@ public static function getStatus($dom) * * @param DOMElement $encryptedData The encrypted data. * @param XMLSecurityKey $inputKey The decryption key. + * @param bool $formatOutput Format or not the output. * * @return DOMElement The decrypted element. * * @throws Exception */ - public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey) + public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey, $formatOutput = true) { $enc = new XMLSecEnc(); @@ -1190,8 +1191,10 @@ public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $xml = ''.$decrypted.''; $newDoc = new DOMDocument(); - $newDoc->preserveWhiteSpace = false; - $newDoc->formatOutput = true; + if ($formatOutput) { + $newDoc->preserveWhiteSpace = false; + $newDoc->formatOutput = true; + } $newDoc = self::loadXML($newDoc, $xml); if (!$newDoc) { throw new OneLogin_Saml2_ValidationError( @@ -1211,7 +1214,7 @@ public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey return $decryptedElement; } - /** + /** * Converts a XMLSecurityKey to the correct algorithm. * * @param XMLSecurityKey $key The key. From cfb7254d81ba0acdadee949a62259f463ed38c22 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 7 Jun 2018 19:35:51 +0200 Subject: [PATCH 064/236] Merge --- lib/Saml2/Auth.php | 37 ++++++++------ lib/Saml2/IdPMetadataParser.php | 3 +- lib/Saml2/LogoutRequest.php | 60 ++++++++++++---------- lib/Saml2/LogoutResponse.php | 29 +++++------ lib/Saml2/Metadata.php | 21 +++++--- lib/Saml2/Response.php | 90 +++++++++++++++++++++------------ lib/Saml2/Settings.php | 19 ++++--- lib/Saml2/Utils.php | 55 ++++++++++++-------- 8 files changed, 186 insertions(+), 128 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index b547804d..429d965c 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -137,6 +137,8 @@ class OneLogin_Saml2_Auth * Initializes the SP SAML instance. * * @param array|object|null $oldSettings Setting data (You can provide a OneLogin_Saml_Settings, the settings object of the Saml folder implementation) + * + * @throws OneLogin_Saml2_Error */ public function __construct($oldSettings = null) { @@ -157,11 +159,12 @@ public function getSettings() * Set the strict mode active/disable * * @param bool $value Strict parameter + * * @throws OneLogin_Saml2_Error */ public function setStrict($value) { - if (! (is_bool($value))) { + if (!is_bool($value)) { throw new OneLogin_Saml2_Error( 'Invalid value passed to setStrict()', OneLogin_Saml2_Error::SETTINGS_INVALID_SYNTAX @@ -177,12 +180,13 @@ public function setStrict($value) * @param string|null $requestId The ID of the AuthNRequest sent by this SP to the IdP * * @throws OneLogin_Saml2_Error + * @throws OneLogin_Saml2_ValidationError */ public function processResponse($requestId = null) { $this->_errors = array(); $this->_errorReason = null; - if (isset($_POST) && isset($_POST['SAMLResponse'])) { + if (isset($_POST['SAMLResponse'])) { // AuthnResponse -- HTTP_POST Binding $response = new OneLogin_Saml2_Response($this->_settings, $_POST['SAMLResponse']); $this->_lastResponse = $response->getXMLDocument(); @@ -229,7 +233,7 @@ public function processSLO($keepLocalSession = false, $requestId = null, $retrie { $this->_errors = array(); $this->_errorReason = null; - if (isset($_GET) && isset($_GET['SAMLResponse'])) { + if (isset($_GET['SAMLResponse'])) { $logoutResponse = new OneLogin_Saml2_LogoutResponse($this->_settings, $_GET['SAMLResponse']); $this->_lastResponse = $logoutResponse->getXML(); if (!$logoutResponse->isValid($requestId, $retrieveParametersFromServer)) { @@ -247,7 +251,7 @@ public function processSLO($keepLocalSession = false, $requestId = null, $retrie } } } - } else if (isset($_GET) && isset($_GET['SAMLRequest'])) { + } else if (isset($_GET['SAMLRequest'])) { $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, $_GET['SAMLRequest']); $this->_lastRequest = $logoutRequest->getXML(); if (!$logoutRequest->isValid($retrieveParametersFromServer)) { @@ -296,10 +300,13 @@ public function processSLO($keepLocalSession = false, $requestId = null, $retrie * Redirects the user to the url past by parameter * or to the url that we defined in our SSO Request. * - * @param string $url The target URL to redirect the user. - * @param array $parameters Extra parameters to be passed as part of the url - * @param bool $stay True if we want to stay (returns the url string) False to redirect + * @param string $url The target URL to redirect the user. + * @param array $parameters Extra parameters to be passed as part of the url + * @param bool $stay True if we want to stay (returns the url string) False to redirect + * * @return string|null + * + * @throws OneLogin_Saml2_Error */ public function redirectTo($url = '', $parameters = array(), $stay = false) { @@ -452,14 +459,16 @@ public function getAttributeWithFriendlyName($friendlyName) /** * Initiates the SSO process. * - * @param string|null $returnTo The target URL the user should be returned to after login. - * @param array $parameters Extra parameters to be added to the GET - * @param bool $forceAuthn When true the AuthNRequest will set the ForceAuthn='true' - * @param bool $isPassive When true the AuthNRequest will set the Ispassive='true' - * @param bool $stay True if we want to stay (returns the url string) False to redirect - * @param bool $setNameIdPolicy When true the AuthNRueqest will set a nameIdPolicy element + * @param string|null $returnTo The target URL the user should be returned to after login. + * @param array $parameters Extra parameters to be added to the GET + * @param bool $forceAuthn When true the AuthNRequest will set the ForceAuthn='true' + * @param bool $isPassive When true the AuthNRequest will set the Ispassive='true' + * @param bool $stay True if we want to stay (returns the url string) False to redirect + * @param bool $setNameIdPolicy When true the AuthNRueqest will set a nameIdPolicy element * * @return string|null If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters + * + * @throws OneLogin_Saml2_Error */ public function login($returnTo = null, $parameters = array(), $forceAuthn = false, $isPassive = false, $stay = false, $setNameIdPolicy = true) { @@ -591,7 +600,6 @@ public function getLastRequestID() * * @return string A base64 encoded signature * - * @throws Exception * @throws OneLogin_Saml2_Error */ public function buildRequestSignature($samlRequest, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA1) @@ -634,7 +642,6 @@ public function buildRequestSignature($samlRequest, $relayState, $signAlgorithm * * @return string A base64 encoded signature * - * @throws Exception * @throws OneLogin_Saml2_Error */ public function buildResponseSignature($samlResponse, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA1) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 0cf17997..5ad795c4 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -85,7 +85,8 @@ public static function parseFileXML($filepath, $entityId = null, $desiredNameIdF * @param string $desiredSLOBinding Parse specific binding SLO endpoint. * * @return array metadata info in php-saml settings format - * @throws \Exception + * + * @throws Exception */ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = null, $desiredSSOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT, $desiredSLOBinding = OneLogin_Saml2_Constants::BINDING_HTTP_REDIRECT) { diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 7fa6e52a..595c1ca1 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -33,12 +33,14 @@ class OneLogin_Saml2_LogoutRequest /** * Constructs the Logout Request object. * - * @param OneLogin_Saml2_Settings $settings Settings - * @param string|null $request A UUEncoded Logout Request. - * @param string|null $nameId The NameID that will be set in the LogoutRequest. - * @param string|null $sessionIndex The SessionIndex (taken from the SAML Response in the SSO process). - * @param string|null $nameIdFormat The NameID Format will be set in the LogoutRequest. - * @param string|null $nameIdNameQualifier The NameID NameQualifier will be set in the LogoutRequest. + * @param OneLogin_Saml2_Settings $settings Settings + * @param string|null $request A UUEncoded Logout Request. + * @param string|null $nameId The NameID that will be set in the LogoutRequest. + * @param string|null $sessionIndex The SessionIndex (taken from the SAML Response in the SSO process). + * @param string|null $nameIdFormat The NameID Format will be set in the LogoutRequest. + * @param string|null $nameIdNameQualifier The NameID NameQualifier will be set in the LogoutRequest. + * + * @throws OneLogin_Saml2_Error */ public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $nameId = null, $sessionIndex = null, $nameIdFormat = null, $nameIdNameQualifier = null) { @@ -177,11 +179,12 @@ public static function getID($request) * Gets the NameID Data of the the Logout Request. * * @param string|DOMDocument $request Logout Request Message - * @param string|null $key The SP key + * @param string|null $key The SP key * * @return array Name ID Data (Value, Format, NameQualifier, SPNameQualifier) * - * @throws Exception + * @throws OneLogin_Saml2_Error + * @throws OneLogin_Saml2_ValidationError */ public static function getNameIdData($request, $key = null) { @@ -239,9 +242,12 @@ public static function getNameIdData($request, $key = null) * Gets the NameID of the Logout Request. * * @param string|DOMDocument $request Logout Request Message - * @param string|null $key The SP key + * @param string|null $key The SP key * * @return string Name ID Value + * + * @throws OneLogin_Saml2_Error + * @throws OneLogin_Saml2_ValidationError */ public static function getNameId($request, $key = null) { @@ -255,6 +261,7 @@ public static function getNameId($request, $key = null) * @param string|DOMDocument $request Logout Request Message * * @return string|null $issuer The Issuer + * @throws Exception */ public static function getIssuer($request) { @@ -282,6 +289,8 @@ public static function getIssuer($request) * @param string|DOMDocument $request Logout Request Message * * @return array The SessionIndex value + * + * @throws Exception */ public static function getSessionIndexes($request) { @@ -303,6 +312,8 @@ public static function getSessionIndexes($request) /** * Checks if the Logout Request recieved is valid. * + * @param bool $retrieveParametersFromServer + * * @return bool If the Logout Request is or not valid */ public function isValid($retrieveParametersFromServer = false) @@ -344,20 +355,18 @@ public function isValid($retrieveParametersFromServer = false) // Check destination if ($dom->documentElement->hasAttribute('Destination')) { $destination = $dom->documentElement->getAttribute('Destination'); - if (!empty($destination)) { - if (strpos($destination, $currentURL) === false) { - throw new OneLogin_Saml2_ValidationError( - "The LogoutRequest was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION - ); - } + if (!empty($destination) && strpos($destination, $currentURL) === false) { + throw new OneLogin_Saml2_ValidationError( + "The LogoutRequest was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION + ); } } - $nameId = $this->getNameId($dom, $this->_settings->getSPkey()); + $nameId = static::getNameId($dom, $this->_settings->getSPkey()); // Check issuer - $issuer = $this->getIssuer($dom); + $issuer = static::getIssuer($dom); if (!empty($issuer) && $issuer != $idPEntityId) { throw new OneLogin_Saml2_ValidationError( "Invalid issuer in the Logout Request", @@ -365,13 +374,11 @@ public function isValid($retrieveParametersFromServer = false) ); } - if ($security['wantMessagesSigned']) { - if (!isset($_GET['Signature'])) { - throw new OneLogin_Saml2_ValidationError( - "The Message of the Logout Request is not signed and the SP require it", - OneLogin_Saml2_ValidationError::NO_SIGNED_MESSAGE - ); - } + if ($security['wantMessagesSigned'] && !isset($_GET['Signature'])) { + throw new OneLogin_Saml2_ValidationError( + "The Message of the Logout Request is not signed and the SP require it", + OneLogin_Saml2_ValidationError::NO_SIGNED_MESSAGE + ); } } @@ -396,7 +403,8 @@ public function isValid($retrieveParametersFromServer = false) } } - /* After execute a validation process, if fails this method returns the cause + /** + * After execute a validation process, if fails this method returns the cause * * @return string Cause */ diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index be5caf3f..20f582a1 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -115,8 +115,6 @@ public function getStatus() * @param bool $retrieveParametersFromServer * * @return bool Returns if the SAML LogoutResponse is or not valid - * - * @throws Exception */ public function isValid($requestId = null, $retrieveParametersFromServer = false) { @@ -163,24 +161,20 @@ public function isValid($requestId = null, $retrieveParametersFromServer = false // Check destination if ($this->document->documentElement->hasAttribute('Destination')) { $destination = $this->document->documentElement->getAttribute('Destination'); - if (!empty($destination)) { - if (strpos($destination, $currentURL) === false) { - throw new OneLogin_Saml2_ValidationError( - "The LogoutResponse was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION - ); - } - } - } - - if ($security['wantMessagesSigned']) { - if (!isset($_GET['Signature'])) { + if (!empty($destination) && strpos($destination, $currentURL) === false) { throw new OneLogin_Saml2_ValidationError( - "The Message of the Logout Response is not signed and the SP requires it", - OneLogin_Saml2_ValidationError::NO_SIGNED_MESSAGE + "The LogoutResponse was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION ); } } + + if ($security['wantMessagesSigned'] && !isset($_GET['Signature'])) { + throw new OneLogin_Saml2_ValidationError( + "The Message of the Logout Response is not signed and the SP requires it", + OneLogin_Saml2_ValidationError::NO_SIGNED_MESSAGE + ); + } } if (isset($_GET['Signature'])) { @@ -270,7 +264,8 @@ public function getResponse($deflate = null) return base64_encode($subject); } - /* After execute a validation process, if fails this method returns the cause. + /** + * After execute a validation process, if fails this method returns the cause. * * @return string Cause */ diff --git a/lib/Saml2/Metadata.php b/lib/Saml2/Metadata.php index 9e2049db..0f05a1a1 100644 --- a/lib/Saml2/Metadata.php +++ b/lib/Saml2/Metadata.php @@ -21,6 +21,7 @@ class OneLogin_Saml2_Metadata * @param array $contacts Contacts info * @param array $organization Organization ingo * @param array $attributes + * * @return string SAML Metadata XML */ public static function builder($sp, $authnsign = false, $wsign = false, $validUntil = null, $cacheDuration = null, $contacts = array(), $organization = array(), $attributes = array()) @@ -173,13 +174,15 @@ public static function builder($sp, $authnsign = false, $wsign = false, $validUn /** * Signs the metadata with the key/cert provided * - * @param string $metadata SAML Metadata XML - * @param string $key x509 key - * @param string $cert x509 cert - * @param string $signAlgorithm Signature algorithm method - * @param string $digestAlgorithm Digest algorithm method + * @param string $metadata SAML Metadata XML + * @param string $key x509 key + * @param string $cert x509 cert + * @param string $signAlgorithm Signature algorithm method + * @param string $digestAlgorithm Digest algorithm method * * @return string Signed Metadata + * + * @throws Exception */ public static function signMetadata($metadata, $key, $cert, $signAlgorithm = XMLSecurityKey::RSA_SHA1, $digestAlgorithm = XMLSecurityDSig::SHA1) { @@ -190,11 +193,13 @@ public static function signMetadata($metadata, $key, $cert, $signAlgorithm = XML * Adds the x509 descriptors (sign/encriptation) to the metadata * The same cert will be used for sign/encrypt * - * @param string $metadata SAML Metadata XML - * @param string $cert x509 cert - * @param bool $wantsEncrypted Whether to include the KeyDescriptor for encryption + * @param string $metadata SAML Metadata XML + * @param string $cert x509 cert + * @param bool $wantsEncrypted Whether to include the KeyDescriptor for encryption * * @return string Metadata with KeyDescriptors + * + * @throws Exception */ public static function addX509KeyDescriptors($metadata, $cert, $wantsEncrypted = true) { diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 0b39f752..cc23a6c4 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -55,9 +55,10 @@ class OneLogin_Saml2_Response * Constructs the SAML Response object. * * @param OneLogin_Saml2_Settings $settings Settings. - * @param string $response A UUEncoded SAML response from the IdP. + * @param string $response A UUEncoded SAML response from the IdP. * - * @throws Exception + * @throws OneLogin_Saml2_Error + * @throws OneLogin_Saml2_ValidationError */ public function __construct(OneLogin_Saml2_Settings $settings, $response) { @@ -94,8 +95,6 @@ public function __construct(OneLogin_Saml2_Settings $settings, $response) * @param string|null $requestId The ID of the AuthNRequest sent by this SP to the IdP * * @return bool Validate the document - * - * @throws Exception */ public function isValid($requestId = null) { @@ -172,13 +171,11 @@ public function isValid($requestId = null) } // Check if the InResponseTo of the Response matchs the ID of the AuthNRequest (requestId) if provided - if (isset($requestId) && isset($responseInResponseTo)) { - if ($requestId != $responseInResponseTo) { - throw new OneLogin_Saml2_ValidationError( - "The InResponseTo of the Response: $responseInResponseTo, does not match the ID of the AuthNRequest sent by the SP: $requestId", - OneLogin_Saml2_ValidationError::WRONG_INRESPONSETO - ); - } + if (isset($requestId) && isset($responseInResponseTo) && $requestId != $responseInResponseTo) { + throw new OneLogin_Saml2_ValidationError( + "The InResponseTo of the Response: $responseInResponseTo, does not match the ID of the AuthNRequest sent by the SP: $requestId", + OneLogin_Saml2_ValidationError::WRONG_INRESPONSETO + ); } if (!$this->encrypted && $security['wantAssertionsEncrypted']) { @@ -422,6 +419,8 @@ public function getId() /** * @return string|null the ID of the assertion in the Response + * + * @throws InvalidArgumentException */ public function getAssertionId() { @@ -430,10 +429,8 @@ public function getAssertionId() } $assertionNodes = $this->_queryAssertion(""); $id = null; - if ($assertionNodes->length == 1) { - if ($assertionNodes->item(0)->hasAttribute('ID')) { - $id = $assertionNodes->item(0)->getAttribute('ID'); - } + if ($assertionNodes->length == 1 && $assertionNodes->item(0)->hasAttribute('ID')) { + $id = $assertionNodes->item(0)->getAttribute('ID'); } return $id; } @@ -450,7 +447,7 @@ public function getAssertionNotOnOrAfter() /** * Checks if the Status is success * - * @throws $statusExceptionMsg If status is not success + * @throws OneLogin_Saml2_ValidationError If status is not success */ public function checkStatus() { @@ -525,6 +522,7 @@ public function getAudiences() * Gets the Issuers (from Response and Assertion). * * @return array @issuers The issuers of the assertion/response + * * @throws OneLogin_Saml2_ValidationError */ public function getIssuers() @@ -560,6 +558,8 @@ public function getIssuers() * Gets the NameID Data provided by the SAML response from the IdP. * * @return array Name ID Data (Value, Format, NameQualifier, SPNameQualifier) + * + * @throws OneLogin_Saml2_ValidationError */ public function getNameIdData() { @@ -624,6 +624,8 @@ public function getNameIdData() * Gets the NameID provided by the SAML response from the IdP. * * @return string|null Name ID Value + * + * @throws OneLogin_Saml2_ValidationError */ public function getNameId() { @@ -639,6 +641,8 @@ public function getNameId() * Gets the NameID Format provided by the SAML response from the IdP. * * @return string|null Name ID Format + * + * @throws OneLogin_Saml2_ValidationError */ public function getNameIdFormat() { @@ -654,6 +658,8 @@ public function getNameIdFormat() * Gets the NameID NameQualifier provided by the SAML response from the IdP. * * @return string|null Name ID NameQualifier + * + * @throws OneLogin_Saml2_ValidationError */ public function getNameIdNameQualifier() { @@ -670,6 +676,8 @@ public function getNameIdNameQualifier() * Could be used to set the local session expiration * * @return int|null The SessionNotOnOrAfter value + * + * @throws Exception */ public function getSessionNotOnOrAfter() { @@ -704,6 +712,8 @@ public function getSessionIndex() * Gets the Attributes from the AttributeStatement element. * * @return array The attributes of the SAML Assertion + * + * @throws OneLogin_Saml2_ValidationError */ public function getAttributes() { @@ -714,13 +724,22 @@ public function getAttributes() * Gets the Attributes from the AttributeStatement element using their FriendlyName. * * @return array The attributes of the SAML Assertion + * + * @throws OneLogin_Saml2_ValidationError */ public function getAttributesWithFriendlyName() { return $this->_getAttributesByKeyName('FriendlyName'); } - private function _getAttributesByKeyName($keyName = "Name") + /** + * @param string $keyName + * + * @return array + * + * @throws OneLogin_Saml2_ValidationError + */ + private function _getAttributesByKeyName($keyName="Name") { $attributes = array(); @@ -782,6 +801,8 @@ public function validateNumAssertions() * - Check that IDs and reference URI are unique and consistent. * * @return array Signed element tags + * + * @throws OneLogin_Saml2_ValidationError */ public function processSignedElements() { @@ -855,14 +876,12 @@ public function processSignedElements() $signedElements[] = $signedElement; } - if (!empty($signedElements)) { - // Check SignedElements - if (!$this->validateSignedElements($signedElements)) { - throw new OneLogin_Saml2_ValidationError( - 'Found an unexpected Signature Element. SAML Response rejected', - OneLogin_Saml2_ValidationError::UNEXPECTED_SIGNED_ELEMENTS - ); - } + // Check SignedElements + if (!empty($signedElements) && !$this->validateSignedElements($signedElements)) { + throw new OneLogin_Saml2_ValidationError( + 'Found an unexpected Signature Element. SAML Response rejected', + OneLogin_Saml2_ValidationError::UNEXPECTED_SIGNED_ELEMENTS + ); } return $signedElements; } @@ -871,6 +890,9 @@ public function processSignedElements() * Verifies that the document is still valid according Conditions Element. * * @return bool + * + * @throws Exception + * @throws OneLogin_Saml2_ValidationError */ public function validateTimestamps() { @@ -884,13 +906,13 @@ public function validateTimestamps() for ($i = 0; $i < $timestampNodes->length; $i++) { $nbAttribute = $timestampNodes->item($i)->attributes->getNamedItem("NotBefore"); $naAttribute = $timestampNodes->item($i)->attributes->getNamedItem("NotOnOrAfter"); - if ($nbAttribute && OneLogin_SAML2_Utils::parseSAML2Time($nbAttribute->textContent) > time() + OneLogin_Saml2_Constants::ALLOWED_CLOCK_DRIFT) { + if ($nbAttribute && OneLogin_Saml2_Utils::parseSAML2Time($nbAttribute->textContent) > time() + OneLogin_Saml2_Constants::ALLOWED_CLOCK_DRIFT) { throw new OneLogin_Saml2_ValidationError( 'Could not validate timestamp: not yet valid. Check system clock.', OneLogin_Saml2_ValidationError::ASSERTION_TOO_EARLY ); } - if ($naAttribute && OneLogin_SAML2_Utils::parseSAML2Time($naAttribute->textContent) + OneLogin_Saml2_Constants::ALLOWED_CLOCK_DRIFT <= time()) { + if ($naAttribute && OneLogin_Saml2_Utils::parseSAML2Time($naAttribute->textContent) + OneLogin_Saml2_Constants::ALLOWED_CLOCK_DRIFT <= time()) { throw new OneLogin_Saml2_ValidationError( 'Could not validate timestamp: expired. Check system clock.', OneLogin_Saml2_ValidationError::ASSERTION_EXPIRED @@ -903,7 +925,11 @@ public function validateTimestamps() /** * Verifies that the document has the expected signed nodes. * + * @param $signedElements + * * @return bool + * + * @throws OneLogin_Saml2_ValidationError */ public function validateSignedElements($signedElements) { @@ -953,8 +979,6 @@ public function validateSignedElements($signedElements) * @param string $assertionXpath Xpath Expression * * @return DOMNodeList The queried node - * - * @throws Exception */ protected function _queryAssertion($assertionXpath) { @@ -1023,7 +1047,8 @@ private function _query($query) * * @return DOMDocument Decrypted Assertion * - * @throws Exception + * @throws OneLogin_Saml2_Error + * @throws OneLogin_Saml2_ValidationError */ protected function _decryptAssertion($dom) { @@ -1103,7 +1128,8 @@ protected function _decryptAssertion($dom) } } - /* After execute a validation process, if fails this method returns the cause + /** + * After execute a validation process, if fails this method returns the cause * * @return string Cause */ @@ -1112,7 +1138,7 @@ public function getError() return $this->_error; } - /* + /** * Returns the SAML Response document (If contains an encrypted assertion, decrypts it) * * @return DomDocument SAML Response diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 0547ab23..5d0f7eda 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -288,7 +288,9 @@ private function _loadSettingsFromArray($settings) * Loads settings info from the settings file * * @return bool True if the settings info is valid + * * @throws OneLogin_Saml2_Error + * * @suppress PhanUndeclaredVariable */ private function _loadSettingsFromFile() @@ -598,12 +600,9 @@ public function checkSPSettings($settings) $errors[] = 'sp_sls_url_invalid'; } - if (isset($security['signMetadata']) && is_array($security['signMetadata'])) { - if (!isset($security['signMetadata']['keyFileName']) - || !isset($security['signMetadata']['certFileName']) - ) { - $errors[] = 'sp_signMetadata_invalid'; - } + if (isset($security['signMetadata']) && is_array($security['signMetadata']) && + (!isset($security['signMetadata']['keyFileName']) || !isset($security['signMetadata']['certFileName']))) { + $errors[] = 'sp_signMetadata_invalid'; } if (((isset($security['authnRequestsSigned']) && $security['authnRequestsSigned'] == true) @@ -808,6 +807,7 @@ public function shouldCompressResponses() * @param int|null $cacheDuration Duration of the cache in seconds * * @return string SP metadata (xml) + * * @throws Exception * @throws OneLogin_Saml2_Error */ @@ -900,6 +900,8 @@ public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil * @param string $xml Metadata's XML that will be validate * * @return Array The list of found errors + * + * @throws Exception */ public function validateMetadata($xml) { @@ -1009,11 +1011,12 @@ public function getErrors() * Activates or deactivates the strict mode. * * @param bool $value Strict parameter + * * @throws Exception */ public function setStrict($value) { - if (! (is_bool($value))) { + if (!is_bool($value)) { throw new Exception('Invalid value passed to setStrict()'); } @@ -1042,6 +1045,8 @@ public function isDebugActive() /** * Set a baseurl value. + * + * @param $baseurl */ public function setBaseURL($baseurl) { diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index f173f8a0..d38e1247 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -71,9 +71,9 @@ public static function t($msg, $args = array()) * @param DOMDocument $dom The document where load the xml. * @param string $xml The XML string to be loaded. * - * @throws Exception - * * @return DOMDocument|false $dom The result of load the XML at the DomDocument + * + * @throws Exception */ public static function loadXML($dom, $xml) { @@ -100,11 +100,13 @@ public static function loadXML($dom, $xml) * * It will parse the string into a DOM document and validate this document against the schema. * - * @param string|DOMDocument $xml The XML string or document which should be validated. - * @param string $schema The schema filename which should be used. - * @param bool $debug To disable/enable the debug mode + * @param string|DOMDocument $xml The XML string or document which should be validated. + * @param string $schema The schema filename which should be used. + * @param bool $debug To disable/enable the debug mode * * @return string|DOMDocument $dom string that explains the problem or the DOMDocument + * + * @throws Exception */ public static function validateXML($xml, $schema, $debug = false) { @@ -629,10 +631,8 @@ public static function getSelfURL() $requestURI = ''; if (!empty($_SERVER['REQUEST_URI'])) { $requestURI = $_SERVER['REQUEST_URI']; - if ($requestURI[0] !== '/') { - if (preg_match('#^https?://[^/]*(/.*)#i', $requestURI, $matches)) { - $requestURI = $matches[1]; - } + if ($requestURI[0] !== '/' && preg_match('#^https?://[^/]*(/.*)#i', $requestURI, $matches)) { + $requestURI = $matches[1]; } } @@ -647,6 +647,8 @@ public static function getSelfURL() /** * Returns the part of the URL with the BaseURLPath. * + * @param $info + * * @return string */ protected static function buildWithBaseURLPath($info) @@ -806,8 +808,8 @@ public static function parseDuration($duration, $timestamp = null) * gmtime function. Instead we use the gmdate function, and split the result. */ $yearmonth = explode(':', gmdate('Y:n', $timestamp)); - $year = (int)($yearmonth[0]); - $month = (int)($yearmonth[1]); + $year = (int)$yearmonth[0]; + $month = (int)$yearmonth[1]; /* Remove the year and month from the timestamp. */ $timestamp -= gmmktime(0, 0, 0, $month, 1, $year); @@ -841,10 +843,12 @@ public static function parseDuration($duration, $timestamp = null) /** * Compares 2 dates and returns the earliest. * - * @param string|null $cacheDuration The duration, as a string. - * @param string|int|null $validUntil The valid until date, as a string or as a timestamp + * @param string|null $cacheDuration The duration, as a string. + * @param string|int|null $validUntil The valid until date, as a string or as a timestamp * * @return int|null $expireTime The expiration time. + * + * @throws Exception */ public static function getExpireTime($cacheDuration = null, $validUntil = null) { @@ -993,13 +997,15 @@ public static function formatFingerPrint($fingerprint) /** * Generates a nameID. * - * @param string $value fingerprint - * @param string $spnq SP Name Qualifier + * @param string $value fingerprint + * @param string $spnq SP Name Qualifier * @param string|null $format SP Format - * @param string|null $cert IdP Public cert to encrypt the nameID - * @param string|null $nq IdP Name Qualifier + * @param string|null $cert IdP Public cert to encrypt the nameID + * @param string|null $nq IdP Name Qualifier * * @return string $nameIDElement DOMElement | XMLSec nameID + * + * @throws Exception */ public static function generateNameId($value, $spnq, $format = null, $cert = null, $nq = null) { @@ -1056,7 +1062,7 @@ public static function generateNameId($value, $spnq, $format = null, $cert = nul * * @return array $status The Status, an array with the code and a message. * - * @throws Exception + * @throws OneLogin_Saml2_ValidationError */ public static function getStatus($dom) { @@ -1104,7 +1110,7 @@ public static function getStatus($dom) * * @return DOMElement The decrypted element. * - * @throws Exception + * @throws OneLogin_Saml2_ValidationError */ public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey, $formatOutput = true) { @@ -1173,7 +1179,7 @@ public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $key = str_pad($key, $keySize); } } - $symmetricKey->loadkey($key); + $symmetricKey->loadKey($key); } else { $symKeyAlgo = $symmetricKey->getAlgorithm(); if ($inputKeyAlgo !== $symKeyAlgo) { @@ -1235,7 +1241,7 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' } if (!OneLogin_Saml2_Utils::isSupportedSigningAlgorithm($algorithm)) { - throw new \Exception('Unsupported signing algorithm.'); + throw new Exception('Unsupported signing algorithm.'); } $keyInfo = openssl_pkey_get_details($key->key); @@ -1250,6 +1256,11 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public' return $newKey; } + /** + * @param $algorithm + * + * @return bool + */ public static function isSupportedSigningAlgorithm($algorithm) { return in_array( @@ -1376,7 +1387,7 @@ public static function validateSign($xml, $cert = null, $fingerprint = null, $fi } if (!OneLogin_Saml2_Utils::isSupportedSigningAlgorithm($objKey->type)) { - throw new \Exception('Unsupported signing algorithm.'); + throw new Exception('Unsupported signing algorithm.'); } $objXMLSecDSig->canonicalizeSignedInfo(); From 55d82780e56542e64d0913268541a7707eb4b757 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 7 Jun 2018 19:36:09 +0200 Subject: [PATCH 065/236] Release 2.14.0 --- CHANGELOG | 8 ++++++++ lib/Saml2/version.json | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 362fc2c7..079e45c8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,13 @@ CHANGELOG ========= +v.2.14.0 +* Add parameter to the decryptElement method to make optional the formatting +* [#283](https://github.com/onelogin/php-saml/pull/283) New method of importing a decrypted assertion into the XML document to replace the EncryptedAssertion. Fix signature issues on Signed Encrypted Assertions with default namespace +* Allow the getSPMetadata() method to always include the encryption Key Descriptor +* Change some Fatal Error to Exceptions +* [#265](https://github.com/onelogin/php-saml/issues/265) Support parameters at getSPMetadata method +* Avoid calling static method using this + v.2.13.0 * Update xmlseclibs with some fixes. * Add extra protection verifying the Signature algorithm used on SignedInfo element, not only rely on the xmlseclibs verify / verifySignature methods. diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index f502a0cb..b00006b9 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.13.0", - "released": "05/03/2018" + "version": "2.14.0", + "released": "07/06/2018" } } From ededcba36b37262bddf776b5bbd22e68b69f1503 Mon Sep 17 00:00:00 2001 From: Nik Karbaum Date: Sat, 16 Jun 2018 16:41:57 +0200 Subject: [PATCH 066/236] Add ability to change regex for protocol check --- lib/Saml2/Utils.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index d38e1247..da83ae20 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -37,6 +37,10 @@ class OneLogin_Saml2_Utils */ private static $_baseurlpath; + /** + * @var string + */ + private static $_protocolRegex = '@^https?://@i'; /** * Translates any string. Accepts args @@ -296,8 +300,11 @@ public static function redirect($url, $parameters = array(), $stay = false) $url = self::getSelfURLhost() . $url; } - /* Verify that the URL is to a http or https site. */ - $wrongProtocol = !preg_match('@^https?://@i', $url); + /** + * Verify that the URL matches the regex for the protocol. + * By default this will check for http and https + */ + $wrongProtocol = !preg_match(self::$_protocolRegex, $url); $url = filter_var($url, FILTER_VALIDATE_URL); if ($wrongProtocol || empty($url)) { throw new OneLogin_Saml2_Error( @@ -344,6 +351,16 @@ public static function redirect($url, $parameters = array(), $stay = false) exit(); } + /** + * @var $protocolRegex string + */ + public static function setProtocolRegex($protocolRegex) + { + if (!empty($protocolRegex)) { + self::$_protocolRegex = $protocolRegex; + } + } + /** * @param $baseurl string The base url to be used when constructing URLs */ From 332219024bb4a9d9e6c6e7522b25787627847139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20M=C3=BChl?= Date: Mon, 16 Jul 2018 15:31:48 +0700 Subject: [PATCH 067/236] Typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 578cb734..9c0eadd5 100644 --- a/README.md +++ b/README.md @@ -1559,7 +1559,7 @@ demo1, only changes the targets. valid, close the user session of the local app. Notice that the SLO Workflow starts and ends at the SP. - 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP + 4.2 SLO Initiated by IdP. In this case, the action takes place on the IdP side, the logout process is initiated at the idP, sends a Logout Request to the SP (SLS endpoint `sls.php` of the endpoint folder). The SLS endpoint of the SP process the Logout Request and if is valid, From 18cedc6df345c41f5e39f27de8ce27d7e01a0023 Mon Sep 17 00:00:00 2001 From: Matt DeLong Date: Tue, 11 Sep 2018 17:08:12 -0500 Subject: [PATCH 068/236] typo fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c0eadd5..58d4912d 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ If our environment requires sign or encrypt support, this folder may contain the x509 cert and the private key that the SP will use: * `sp.crt` - The public cert of the SP - * `sp.key` - The privake key of the SP + * `sp.key` - The private key of the SP Or also we can provide those data in the setting file at the `$settings['sp']['x509cert']` and the `$settings['sp']['privateKey']`. From eda6530f216fe562fb973095a14cb9733bf34eae Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 12 Sep 2018 20:00:42 +0200 Subject: [PATCH 069/236] Refactor buildRequestSignature and buildResponseSignature adding buildMessageSignature --- lib/Saml2/Auth.php | 60 +++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 429d965c..bfa09a0b 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -604,33 +604,7 @@ public function getLastRequestID() */ public function buildRequestSignature($samlRequest, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA1) { - $key = $this->_settings->getSPkey(); - if (empty($key)) { - throw new OneLogin_Saml2_Error( - "Trying to sign the SAML Request but can't load the SP private key", - OneLogin_Saml2_Error::PRIVATE_KEY_NOT_FOUND - ); - } - - $objKey = new XMLSecurityKey($signAlgorithm, array('type' => 'private')); - $objKey->loadKey($key, false); - - $security = $this->_settings->getSecurityData(); - if ($security['lowercaseUrlencoding']) { - $msg = 'SAMLRequest='.rawurlencode($samlRequest); - if (isset($relayState)) { - $msg .= '&RelayState='.rawurlencode($relayState); - } - $msg .= '&SigAlg=' . rawurlencode($signAlgorithm); - } else { - $msg = 'SAMLRequest='.urlencode($samlRequest); - if (isset($relayState)) { - $msg .= '&RelayState='.urlencode($relayState); - } - $msg .= '&SigAlg=' . urlencode($signAlgorithm); - } - $signature = $objKey->signData($msg); - return base64_encode($signature); + return $this->buildMessageSignature($samlRequest, $relayState, $signAlgorithm, "SAMLRequest"); } /** @@ -645,13 +619,33 @@ public function buildRequestSignature($samlRequest, $relayState, $signAlgorithm * @throws OneLogin_Saml2_Error */ public function buildResponseSignature($samlResponse, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA1) + { + return $this->buildMessageSignature($samlResponse, $relayState, $signAlgorithm, "SAMLResponse"); + } + + /** + * Generates the Signature for a SAML Response + * + * @param string $samlMessage The SAML Response + * @param string $relayState The RelayState + * @param string $signAlgorithm Signature algorithm method + * @param string $type "SAMLRequest" or "SAMLResponse" + * + * @return string A base64 encoded signature + * + * @throws OneLogin_Saml2_Error + */ + private function buildMessageSignature($samlMessage, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA256, $type="SAMLRequest") { $key = $this->_settings->getSPkey(); if (empty($key)) { - throw new OneLogin_Saml2_Error( - "Trying to sign the SAML Response but can't load the SP private key", - OneLogin_Saml2_Error::PRIVATE_KEY_NOT_FOUND - ); + if ($type == "SAMLRequest") { + $errorMsg = "Trying to sign the SAML Request but can't load the SP private key"; + } else { + $errorMsg = "Trying to sign the SAML Response but can't load the SP private key"; + } + + throw new OneLogin_Saml2_Error($errorMsg, OneLogin_Saml2_Error::PRIVATE_KEY_NOT_FOUND); } $objKey = new XMLSecurityKey($signAlgorithm, array('type' => 'private')); @@ -659,13 +653,13 @@ public function buildResponseSignature($samlResponse, $relayState, $signAlgorith $security = $this->_settings->getSecurityData(); if ($security['lowercaseUrlencoding']) { - $msg = 'SAMLResponse='.rawurlencode($samlResponse); + $msg = $type.'='.rawurlencode($samlMessage); if (isset($relayState)) { $msg .= '&RelayState='.rawurlencode($relayState); } $msg .= '&SigAlg=' . rawurlencode($signAlgorithm); } else { - $msg = 'SAMLResponse='.urlencode($samlResponse); + $msg = $type.'='.urlencode($samlMessage); if (isset($relayState)) { $msg .= '&RelayState='.urlencode($relayState); } From da96b0683addad9ffc1dbff48a38a0517a746aec Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 14 Jan 2019 15:27:17 +0100 Subject: [PATCH 070/236] Fix Readme #353 --- settings_example.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings_example.php b/settings_example.php index 213c9606..ea5cc898 100644 --- a/settings_example.php +++ b/settings_example.php @@ -34,7 +34,7 @@ // attributeConsumingService. nameFormat, attributeValue and // friendlyName can be omitted. Otherwise remove this section. "attributeConsumingService"=> array( - "ServiceName" => "SP test", + "serviceName" => "SP test" "serviceDescription" => "Test Service", "requestedAttributes" => array( array( From 2a9c538d3edb58b1f0d81561e02fcc2ce2408b94 Mon Sep 17 00:00:00 2001 From: Chris Rowles <42321445+chrisdevelops@users.noreply.github.com> Date: Wed, 16 Jan 2019 10:08:38 +0000 Subject: [PATCH 071/236] Fix syntax error on line 37 Array item was missing a comma :) --- settings_example.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings_example.php b/settings_example.php index ea5cc898..c7cf2e8d 100644 --- a/settings_example.php +++ b/settings_example.php @@ -34,7 +34,7 @@ // attributeConsumingService. nameFormat, attributeValue and // friendlyName can be omitted. Otherwise remove this section. "attributeConsumingService"=> array( - "serviceName" => "SP test" + "serviceName" => "SP test", "serviceDescription" => "Test Service", "requestedAttributes" => array( array( From d9e316a7d6d4453a80e1ebd595f584269d3230d1 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 22 Jan 2019 13:48:54 +0100 Subject: [PATCH 072/236] Remove unused var --- lib/Saml2/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index cc23a6c4..b2a6f689 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -115,7 +115,7 @@ public function isValid($requestId = null) ); } - $status = $this->checkStatus(); + $this->checkStatus(); $singleAssertion = $this->validateNumAssertions(); if (!$singleAssertion) { From c6ca9929c1d025727ef9f3a0123ab9f9e856267f Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 23 Jan 2019 18:57:56 +0100 Subject: [PATCH 073/236] Security improvement suggested by Nils Engelbertz to prevent DDOS by expansion of internally defined entities (XEE) --- lib/Saml2/Utils.php | 14 +++++++++---- tests/src/OneLogin/Saml2/UtilsTest.php | 28 ++++++++++++++++++++------ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index da83ae20..248b954c 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -84,14 +84,20 @@ public static function loadXML($dom, $xml) assert('$dom instanceof DOMDocument'); assert('is_string($xml)'); - if (strpos($xml, 'loadXML($xml); + libxml_disable_entity_loader($oldEntityLoader); + foreach ($dom->childNodes as $child) { + if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { + throw new Exception( + 'Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks' + ); + } + } + if (!$res) { return false; } else { diff --git a/tests/src/OneLogin/Saml2/UtilsTest.php b/tests/src/OneLogin/Saml2/UtilsTest.php index 41dd8b5f..47f09772 100644 --- a/tests/src/OneLogin/Saml2/UtilsTest.php +++ b/tests/src/OneLogin/Saml2/UtilsTest.php @@ -70,9 +70,9 @@ public function testXMLAttacks() ]>&xxe;'; try { $res = OneLogin_Saml2_Utils::loadXML($dom, $attackXXE); - $this->fail('Exception was not raised'); + $this->assertFalse($res); } catch (Exception $e) { - $this->assertEquals('Detected use of ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); + $this->assertEquals('Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); } $xmlWithDTD = ' @@ -83,8 +83,12 @@ public function testXMLAttacks() test '; - $res2 = OneLogin_Saml2_Utils::loadXML($dom, $xmlWithDTD); - $this->assertTrue($res2 instanceof DOMDocument); + try { + $res2 = OneLogin_Saml2_Utils::loadXML($dom, $xmlWithDTD); + $this->assertFalse($res2); + } catch (Exception $e) { + $this->assertEquals('Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); + } $attackXEE = ' ]> @@ -93,9 +97,21 @@ public function testXMLAttacks() '; try { $res3 = OneLogin_Saml2_Utils::loadXML($dom, $attackXEE); - $this->fail('Exception was not raised'); + $this->assertFalse($res3); + } catch (Exception $e) { + $this->assertEquals('Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); + } + + $attackXEEutf16 = mb_convert_encoding(' + ]> + + This result is &harmless; + ', 'UTF-16'); + try { + $res4 = OneLogin_Saml2_Utils::loadXML($dom, $attackXEEutf16); + $this->assertFalse($res4); } catch (Exception $e) { - $this->assertEquals('Detected use of ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); + $this->assertEquals('Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); } } From db784e00053e84e7f970f3a4535e21ea4ca922c8 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 28 Jan 2019 13:57:04 +0100 Subject: [PATCH 074/236] Release 2.15.0 --- README.md | 2 ++ lib/Saml2/version.json | 4 ++-- tests/src/OneLogin/Saml2/UtilsTest.php | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 58d4912d..b5801a1f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ and supported by OneLogin Inc. Warning ------- +Update php-saml to 2.15.0, this version includes a security patch related to XEE attacks + php-saml is not affected by [201803-01](https://simplesamlphp.org/security/201803-01) Update php-saml to 2.10.4, this version includes a security patch related to diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index b00006b9..091f09ab 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.14.0", - "released": "07/06/2018" + "version": "2.15.0", + "released": "28/01/2019" } } diff --git a/tests/src/OneLogin/Saml2/UtilsTest.php b/tests/src/OneLogin/Saml2/UtilsTest.php index 47f09772..b70901b8 100644 --- a/tests/src/OneLogin/Saml2/UtilsTest.php +++ b/tests/src/OneLogin/Saml2/UtilsTest.php @@ -102,11 +102,14 @@ public function testXMLAttacks() $this->assertEquals('Detected use of DOCTYPE/ENTITY in XML, disabled to prevent XXE/XEE attacks', $e->getMessage()); } - $attackXEEutf16 = mb_convert_encoding(' + $attackXEEutf16 = mb_convert_encoding( + ' ]> This result is &harmless; - ', 'UTF-16'); + ', + 'UTF-16' + ); try { $res4 = OneLogin_Saml2_Utils::loadXML($dom, $attackXEEutf16); $this->assertFalse($res4); From 35efa30cc1a7f6d1685c59f8e91ebe20310ae755 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 28 Jan 2019 14:02:22 +0100 Subject: [PATCH 075/236] Update changelog with 2.15.0 info --- CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 079e45c8..4153f982 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,10 @@ CHANGELOG ========= + +v.2.15.0 +* Security improvement suggested by Nils Engelbertz to prevent DDOS by expansion of internally defined entities (XEE) +* Fix bug on settings_example.php + v.2.14.0 * Add parameter to the decryptElement method to make optional the formatting * [#283](https://github.com/onelogin/php-saml/pull/283) New method of importing a decrypted assertion into the XML document to replace the EncryptedAssertion. Fix signature issues on Signed Encrypted Assertions with default namespace From acf61a87dd7d609e089d0e6230f1a8cf792fa266 Mon Sep 17 00:00:00 2001 From: Martin Wey Date: Tue, 5 Feb 2019 12:05:42 +0100 Subject: [PATCH 076/236] add getSLOResponseUrl(), add check for setting ['singleLogoutService']['responseUrl'] --- lib/Saml2/Auth.php | 17 ++++++++++++++++- lib/Saml2/Settings.php | 8 ++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index bfa09a0b..95d8ad32 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -285,7 +285,7 @@ public function processSLO($keepLocalSession = false, $requestId = null, $retrie $parameters['Signature'] = $signature; } - return $this->redirectTo($this->getSLOurl(), $parameters, $stay); + return $this->redirectTo($this->getSLOResponseUrl(), $parameters, $stay); } } else { $this->_errors[] = 'invalid_binding'; @@ -581,6 +581,21 @@ public function getSLOurl() return $url; } + /** + * Gets the SLO response url. + * + * @return string|null The response url of the Single Logout Service + */ + public function getSLOResponseUrl() + { + $url = null; + $idpData = $this->_settings->getIdPData(); + if (isset($idpData['singleLogoutService']) && isset($idpData['singleLogoutService']['responseUrl'])) { + return $idpData['singleLogoutService']['responseUrl']; + } + return $this->getSLOurl(); + } + /** * Gets the ID of the last AuthNRequest or LogoutRequest generated by the Service Provider. * diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 5d0f7eda..ffc1b27b 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -531,6 +531,14 @@ public function checkIdPSettings($settings) $errors[] = 'idp_slo_url_invalid'; } + if (isset($idp['singleLogoutService']) + && isset($idp['singleLogoutService']['responseUrl']) + && !empty($idp['singleLogoutService']['responseUrl']) + && !filter_var($idp['singleLogoutService']['responseUrl'], FILTER_VALIDATE_URL) + ) { + $errors[] = 'idp_slo_response_url_invalid'; + } + if (isset($settings['security'])) { $security = $settings['security']; From ecc1abc0f2dc683146d8019a33671148a7fc4b1b Mon Sep 17 00:00:00 2001 From: Martin Wey Date: Wed, 6 Feb 2019 18:00:27 +0100 Subject: [PATCH 077/236] add more tests --- README.md | 3 +++ lib/Saml2/Auth.php | 1 - settings_example.php | 3 +++ tests/settings/settings1.php | 1 + tests/src/OneLogin/Saml2/AuthTest.php | 27 ++++++++++++++++------- tests/src/OneLogin/Saml2/SettingsTest.php | 2 ++ 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b5801a1f..feb836bf 100644 --- a/README.md +++ b/README.md @@ -375,6 +375,9 @@ $settings = array ( 'singleLogoutService' => array ( // URL Location of the IdP where SLO Request will be sent. 'url' => '', + // URL location of the IdP where the SP will send the SLO Response (ResponseLocation) + // if not set, url for the SLO Request will be used + 'responseUrl' => '', // SAML protocol binding to be used when returning the // message. OneLogin Toolkit supports the HTTP-Redirect binding // only for this endpoint. diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 95d8ad32..0fb93492 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -588,7 +588,6 @@ public function getSLOurl() */ public function getSLOResponseUrl() { - $url = null; $idpData = $this->_settings->getIdPData(); if (isset($idpData['singleLogoutService']) && isset($idpData['singleLogoutService']['responseUrl'])) { return $idpData['singleLogoutService']['responseUrl']; diff --git a/settings_example.php b/settings_example.php index c7cf2e8d..29f8da63 100644 --- a/settings_example.php +++ b/settings_example.php @@ -93,6 +93,9 @@ 'singleLogoutService' => array ( // URL Location of the IdP where the SP will send the SLO Request 'url' => '', + // URL location of the IdP where the SP will send the SLO Response (ResponseLocation) + // if not set, url for the SLO Request will be used + 'responseUrl' => '', // SAML protocol binding to be used when returning the // message. Onelogin Toolkit supports for this endpoint the // HTTP-Redirect binding only diff --git a/tests/settings/settings1.php b/tests/settings/settings1.php index a69eab2f..5e2d9b72 100644 --- a/tests/settings/settings1.php +++ b/tests/settings/settings1.php @@ -19,6 +19,7 @@ ), 'singleLogoutService' => array ( 'url' => 'http://idp.example.com/SingleLogoutService.php', + 'responseUrl' => 'http://idp.example.com/SingleLogoutServiceResponse.php', ), 'x509cert' => 'MIICgTCCAeoCCQCbOlrWDdX7FTANBgkqhkiG9w0BAQUFADCBhDELMAkGA1UEBhMCTk8xGDAWBgNVBAgTD0FuZHJlYXMgU29sYmVyZzEMMAoGA1UEBxMDRm9vMRAwDgYDVQQKEwdVTklORVRUMRgwFgYDVQQDEw9mZWlkZS5lcmxhbmcubm8xITAfBgkqhkiG9w0BCQEWEmFuZHJlYXNAdW5pbmV0dC5ubzAeFw0wNzA2MTUxMjAxMzVaFw0wNzA4MTQxMjAxMzVaMIGEMQswCQYDVQQGEwJOTzEYMBYGA1UECBMPQW5kcmVhcyBTb2xiZXJnMQwwCgYDVQQHEwNGb28xEDAOBgNVBAoTB1VOSU5FVFQxGDAWBgNVBAMTD2ZlaWRlLmVybGFuZy5ubzEhMB8GCSqGSIb3DQEJARYSYW5kcmVhc0B1bmluZXR0Lm5vMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDivbhR7P516x/S3BqKxupQe0LONoliupiBOesCO3SHbDrl3+q9IbfnfmE04rNuMcPsIxB161TdDpIesLCn7c8aPHISKOtPlAeTZSnb8QAu7aRjZq3+PbrP5uW3TcfCGPtKTytHOge/OlJbo078dVhXQ14d1EDwXJW1rRXuUt4C8QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBACDVfp86HObqY+e8BUoWQ9+VMQx1ASDohBjwOsg2WykUqRXF+dLfcUH9dWR63CtZIKFDbStNomPnQz7nbK+onygwBspVEbnHuUihZq3ZUdmumQqCw4Uvs/1Uvq3orOo/WJVhTyvLgFVK2QarQ4/67OZfHd7R+POBXhophSMv1ZOo', ), diff --git a/tests/src/OneLogin/Saml2/AuthTest.php b/tests/src/OneLogin/Saml2/AuthTest.php index fa96414b..d06fc0e2 100644 --- a/tests/src/OneLogin/Saml2/AuthTest.php +++ b/tests/src/OneLogin/Saml2/AuthTest.php @@ -79,6 +79,17 @@ public function testGetSLOurl() $this->assertEquals($this->_auth->getSLOurl(), $sloUrl); } + /** + * Tests the getSLOResponseUrl method of the OneLogin_Saml2_Auth class + * + * @covers OneLogin_Saml2_Auth::getSLOurl + */ + public function testGetSLOResponseUrl() + { + $sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl']; + $this->assertEquals($this->_auth->getSLOResponseUrl(), $sloResponseUrl); + } + /** * Tests the processResponse method of the OneLogin_Saml2_Auth class * Case No Response, An exception is throw @@ -548,8 +559,8 @@ public function testProcessSLORequestInvalidValid() $parsedQuery = getParamsFromUrl($targetUrl); $this->assertEmpty($this->_auth->getErrors()); - $sloUrl = $this->_settingsInfo['idp']['singleLogoutService']['url']; - $this->assertContains($sloUrl, $targetUrl); + $sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl']; + $this->assertContains($sloResponseUrl, $targetUrl); $this->assertArrayHasKey('SAMLResponse', $parsedQuery); $this->assertArrayNotHasKey('RelayState', $parsedQuery); } @@ -570,8 +581,8 @@ public function testProcessSLORequestInvalidValid() $parsedQuery = getParamsFromUrl($targetUrl); $this->assertEmpty($this->_auth->getErrors()); - $sloUrl = $this->_settingsInfo['idp']['singleLogoutService']['url']; - $this->assertContains($sloUrl, $targetUrl); + $sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl']; + $this->assertContains($sloResponseUrl, $targetUrl); $this->assertArrayHasKey('SAMLResponse', $parsedQuery); $this->assertArrayNotHasKey('RelayState', $parsedQuery); } @@ -636,8 +647,8 @@ public function testProcessSLORequestDeletingSession() $targetUrl = getUrlFromRedirect($trace); $parsedQuery = getParamsFromUrl($targetUrl); - $sloUrl = $this->_settingsInfo['idp']['singleLogoutService']['url']; - $this->assertContains($sloUrl, $targetUrl); + $sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl']; + $this->assertContains($sloResponseUrl, $targetUrl); $this->assertArrayHasKey('SAMLResponse', $parsedQuery); $this->assertArrayNotHasKey('RelayState', $parsedQuery); @@ -657,8 +668,8 @@ public function testProcessSLORequestDeletingSession() $targetUrl = getUrlFromRedirect($trace); $parsedQuery = getParamsFromUrl($targetUrl); - $sloUrl = $this->_settingsInfo['idp']['singleLogoutService']['url']; - $this->assertContains($sloUrl, $targetUrl); + $sloResponseUrl = $this->_settingsInfo['idp']['singleLogoutService']['responseUrl']; + $this->assertContains($sloResponseUrl, $targetUrl); $this->assertArrayHasKey('SAMLResponse', $parsedQuery); $this->assertArrayNotHasKey('RelayState', $parsedQuery); diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 913cace4..c0db5d5c 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -333,6 +333,7 @@ public function testCheckSettings() $settingsInfo['idp']['entityID'] = 'entityId'; $settingsInfo['idp']['singleSignOnService']['url'] = 'invalid_value'; $settingsInfo['idp']['singleLogoutService']['url'] = 'invalid_value'; + $settingsInfo['idp']['singleLogoutService']['responseUrl'] = 'invalid_value'; $settingsInfo['sp']['assertionConsumerService']['url'] = 'invalid_value'; $settingsInfo['sp']['singleLogoutService']['url'] = 'invalid_value'; try { @@ -341,6 +342,7 @@ public function testCheckSettings() } catch (OneLogin_Saml2_error $e) { $this->assertContains('idp_sso_url_invalid', $e->getMessage()); $this->assertContains('idp_slo_url_invalid', $e->getMessage()); + $this->assertContains('idp_slo_response_url_invalid', $e->getMessage()); $this->assertContains('sp_acs_url_invalid', $e->getMessage()); $this->assertContains('sp_sls_url_invalid', $e->getMessage()); } From ec053249bbe08bf7e2f18cc6cccf090a8761dbd2 Mon Sep 17 00:00:00 2001 From: Martin Wey Date: Thu, 7 Feb 2019 07:53:01 +0100 Subject: [PATCH 078/236] read ResponseLocation from idP metadata --- lib/Saml2/IdPMetadataParser.php | 1 + tests/data/metadata/idp/metadata.xml | 2 +- tests/src/OneLogin/Saml2/IdPMetadataParserTest.php | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 5ad795c4..9acca013 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -140,6 +140,7 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n if ($sloNodes->length > 0) { $metadataInfo['idp']['singleLogoutService'] = array( 'url' => $sloNodes->item(0)->getAttribute('Location'), + 'responseUrl' => $sloNodes->item(0)->getAttribute('ResponseLocation'), 'binding' => $sloNodes->item(0)->getAttribute('Binding') ); } diff --git a/tests/data/metadata/idp/metadata.xml b/tests/data/metadata/idp/metadata.xml index 7c1991f4..c2ca6739 100644 --- a/tests/data/metadata/idp/metadata.xml +++ b/tests/data/metadata/idp/metadata.xml @@ -68,7 +68,7 @@ WQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw== - + urn:oasis:names:tc:SAML:2.0:nameid-format:transient diff --git a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php index c6db20dd..51c80716 100644 --- a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php +++ b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php @@ -21,6 +21,7 @@ public function testParseFileXML() ), 'singleLogoutService' => array ( 'url' => 'https://example.onelogin.com/trust/saml2/http-redirect/slo/645460', + 'responseUrl' => '', 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' ), 'x509cert' => 'MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJjaWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUyMjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRwtnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xxVRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCBpIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaCFD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXMGI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65chjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIBvlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZWQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw==' @@ -70,6 +71,7 @@ public function testParseXML() ), 'singleLogoutService' => array ( 'url' => 'https://idp.examle.com/saml/slo', + 'responseUrl' => 'https://idp.examle.com/saml/slr', 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' ), 'x509certMulti' => array ( @@ -180,6 +182,7 @@ public function testParseDesiredBindingAll() ), "singleLogoutService" => array( "url" => "http://idp.example.com/logout", + 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ) ) @@ -297,6 +300,7 @@ public function testParseMultiCerts() "idp" => array( "singleLogoutService" => array( "url" => "https://idp.examle.com/saml/slo", + 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ), "x509certMulti" => array( @@ -336,6 +340,7 @@ public function testParseMultiSigningCerts() "idp" => array( "singleLogoutService" => array( "url" => "https://idp.examle.com/saml/slo", + 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ), "x509certMulti" => array( @@ -424,6 +429,7 @@ public function testInjectIntoSettings() ), 'singleLogoutService' => array ( 'url' => 'http://stuff.com/endpoints/endpoints/sls.php' + ), 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' ), @@ -435,6 +441,7 @@ public function testInjectIntoSettings() ), 'singleLogoutService' => array ( 'url' => 'https://idp.adfs.example.com/adfs/ls/', + 'responseUrl' => '', 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' ), 'x509certMulti' => array ( From 7dc2a85ad80a2467d004d62739dfff7a8566ef48 Mon Sep 17 00:00:00 2001 From: Martin Wey Date: Thu, 7 Feb 2019 07:58:09 +0100 Subject: [PATCH 079/236] remove empty line --- tests/src/OneLogin/Saml2/IdPMetadataParserTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php index 51c80716..1198176a 100644 --- a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php +++ b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php @@ -429,7 +429,6 @@ public function testInjectIntoSettings() ), 'singleLogoutService' => array ( 'url' => 'http://stuff.com/endpoints/endpoints/sls.php' - ), 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' ), From 95ba1d9c488bdad8d8506595a1116bd3988fad73 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 11 Mar 2019 10:36:26 +0100 Subject: [PATCH 080/236] Set strict=true on config examples --- README.md | 2 +- settings_example.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index feb836bf..5b549f79 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,7 @@ $settings = array ( // or unencrypted messages if it expects them to be signed or encrypted. // Also it will reject the messages if the SAML standard is not strictly // followed: Destination, NameId, Conditions ... are validated too. - 'strict' => false, + 'strict' => true, // Enable debug mode (to print errors). 'debug' => false, diff --git a/settings_example.php b/settings_example.php index 29f8da63..7b5fc960 100644 --- a/settings_example.php +++ b/settings_example.php @@ -5,7 +5,7 @@ // or unencrypted messages if it expects them signed or encrypted // Also will reject the messages if not strictly follow the SAML // standard: Destination, NameId, Conditions ... are validated too. - 'strict' => false, + 'strict' => true, // Enable debug mode (to print errors) 'debug' => false, From 3f51a3224e82970c4bf4e5ad923a66e39407bba0 Mon Sep 17 00:00:00 2001 From: tjallingt Date: Mon, 6 Aug 2018 12:12:02 +0200 Subject: [PATCH 081/236] Move phpunit.xml --- .travis.yml | 2 +- phpunit.xml | 18 ++++++++++++++++++ tests/phpunit.xml | 18 ------------------ 3 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 phpunit.xml delete mode 100644 tests/phpunit.xml diff --git a/.travis.yml b/.travis.yml index 648e8cc0..412b3293 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ before_script: - phpenv config-rm xdebug.ini script: - - vendor/bin/phpunit --bootstrap tests/bootstrap.php --configuration tests/phpunit.xml + - vendor/bin/phpunit - php vendor/bin/phpcpd --exclude tests --exclude vendor . - php vendor/bin/phploc . --exclude vendor - php vendor/bin/phploc lib/. diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..ceb2c5c9 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,18 @@ + + + + ./tests/src + + + + + ./lib + + + + + + + + + diff --git a/tests/phpunit.xml b/tests/phpunit.xml deleted file mode 100644 index 35073c85..00000000 --- a/tests/phpunit.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - ./src - - - - - ./../lib/ - - - - - - - - - From 6de04e019bc6a047687b97b368dd6ed6445a6681 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 2 Apr 2019 18:30:58 +0200 Subject: [PATCH 082/236] Add support for Subjects on AuthNRequests by the new parameter --- README.md | 3 +- lib/Saml2/Auth.php | 5 +- lib/Saml2/AuthnRequest.php | 25 ++++-- tests/src/OneLogin/Saml2/AuthTest.php | 84 +++++++++++++++++++ tests/src/OneLogin/Saml2/AuthnRequestTest.php | 37 ++++++++ 5 files changed, 144 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5b549f79..f8820540 100644 --- a/README.md +++ b/README.md @@ -647,13 +647,14 @@ $auth = new OneLogin_Saml2_Auth(); $auth->login($newTargetUrl); ``` -The login method can receive other five optional parameters: +The login method can receive other six optional parameters: * `$parameters` - An array of parameters that will be added to the `GET` in the HTTP-Redirect. * `$forceAuthn` - When true the `AuthNRequest` will set the `ForceAuthn='true'` * `$isPassive` - When true the `AuthNRequest` will set the `Ispassive='true'` * `$strict` - True if we want to stay (returns the url string) False to redirect * `$setNameIdPolicy` - When true the AuthNRequest will set a nameIdPolicy element. +* `$nameIdValueReq` - Indicates to the IdP the subject that should be authenticated. If a match on the future SAMLResponse ID and the AuthNRequest ID to be sent is required, that AuthNRequest ID must to be extracted and saved. diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 0fb93492..fed8aceb 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -465,16 +465,17 @@ public function getAttributeWithFriendlyName($friendlyName) * @param bool $isPassive When true the AuthNRequest will set the Ispassive='true' * @param bool $stay True if we want to stay (returns the url string) False to redirect * @param bool $setNameIdPolicy When true the AuthNRueqest will set a nameIdPolicy element + * @param string $nameIdValueReq Indicates to the IdP the subject that should be authenticated * * @return string|null If $stay is True, it return a string with the SLO URL + LogoutRequest + parameters * * @throws OneLogin_Saml2_Error */ - public function login($returnTo = null, $parameters = array(), $forceAuthn = false, $isPassive = false, $stay = false, $setNameIdPolicy = true) + public function login($returnTo = null, $parameters = array(), $forceAuthn = false, $isPassive = false, $stay = false, $setNameIdPolicy = true, $nameIdValueReq = null) { assert('is_array($parameters)'); - $authnRequest = new OneLogin_Saml2_AuthnRequest($this->_settings, $forceAuthn, $isPassive, $setNameIdPolicy); + $authnRequest = new OneLogin_Saml2_AuthnRequest($this->_settings, $forceAuthn, $isPassive, $setNameIdPolicy, $nameIdValueReq); $this->_lastRequest = $authnRequest->getXML(); $this->_lastRequestID = $authnRequest->getId(); diff --git a/lib/Saml2/AuthnRequest.php b/lib/Saml2/AuthnRequest.php index 8418ee37..2da1046e 100644 --- a/lib/Saml2/AuthnRequest.php +++ b/lib/Saml2/AuthnRequest.php @@ -29,11 +29,12 @@ class OneLogin_Saml2_AuthnRequest * Constructs the AuthnRequest object. * * @param OneLogin_Saml2_Settings $settings Settings - * @param bool $forceAuthn When true the AuthNReuqest will set the ForceAuthn='true' - * @param bool $isPassive When true the AuthNReuqest will set the Ispassive='true' + * @param bool $forceAuthn When true the AuthNReuqest will set the ForceAuthn='true' + * @param bool $isPassive When true the AuthNReuqest will set the Ispassive='true' * @param bool $setNameIdPolicy When true the AuthNReuqest will set a nameIdPolicy + * @param string $nameIdValueReq Indicates to the IdP the subject that should be authenticated */ - public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = false, $isPassive = false, $setNameIdPolicy = true) + public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = false, $isPassive = false, $setNameIdPolicy = true, $nameIdValueReq = null) { $this->_settings = $settings; @@ -44,6 +45,17 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal $id = OneLogin_Saml2_Utils::generateUniqueID(); $issueInstant = OneLogin_Saml2_Utils::parseTime2SAML(time()); + $subjectStr = ""; + if (isset($nameIdValueReq)) { + $subjectStr = << + {$nameIdValueReq} + + +SUBJECT; + } + $nameIdPolicyStr = ''; if ($setNameIdPolicy) { $nameIDPolicyFormat = $spData['NameIDFormat']; @@ -52,6 +64,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal } $nameIdPolicyStr = << @@ -93,7 +106,6 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal $requestedAuthnStr = ''; if (isset($security['requestedAuthnContext']) && $security['requestedAuthnContext'] !== false) { - $authnComparison = 'exact'; if (isset($security['requestedAuthnContextComparison'])) { $authnComparison = $security['requestedAuthnContextComparison']; @@ -101,6 +113,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal if ($security['requestedAuthnContext'] === true) { $requestedAuthnStr = << urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport @@ -127,9 +140,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal Destination="{$idpData['singleSignOnService']['url']}" ProtocolBinding="{$spData['assertionConsumerService']['binding']}" AssertionConsumerServiceURL="{$acsUrl}"> - {$spEntityId} -{$nameIdPolicyStr} -{$requestedAuthnStr} + {$spEntityId}{$subjectStr}{$nameIdPolicyStr}{$requestedAuthnStr} AUTHNREQUEST; diff --git a/tests/src/OneLogin/Saml2/AuthTest.php b/tests/src/OneLogin/Saml2/AuthTest.php index d06fc0e2..2606448e 100644 --- a/tests/src/OneLogin/Saml2/AuthTest.php +++ b/tests/src/OneLogin/Saml2/AuthTest.php @@ -1196,6 +1196,90 @@ public function testLoginNameIDPolicy() } } + /** + * Tests the login method of the OneLogin_Saml2_Auth class + * Case Login with no parameters. A AuthN Request is built with and without Subject + * + * @covers OneLogin_Saml2_Auth::login + * @runInSeparateProcess + */ + public function testLoginSubject() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $auth = new OneLogin_Saml2_Auth($settingsInfo); + + try { + // The Header of the redirect produces an Exception + $returnTo = 'http://example.com/returnto'; + $auth->login($returnTo); + // Do not ever get here + $this->assertFalse(true); + } catch (Exception $e) { + $this->assertContains('Cannot modify header information', $e->getMessage()); + $trace = $e->getTrace(); + $targetUrl = getUrlFromRedirect($trace); + $parsedQuery = getParamsFromUrl($targetUrl); + + $ssoUrl = $settingsInfo['idp']['singleSignOnService']['url']; + $this->assertContains($ssoUrl, $targetUrl); + $this->assertArrayHasKey('SAMLRequest', $parsedQuery); + $encodedRequest = $parsedQuery['SAMLRequest']; + $decoded = base64_decode($encodedRequest); + $request = gzinflate($decoded); + $this->assertNotContains('login($returnTo, array(), false, false, false, true, "testuser@example.com"); + // Do not ever get here + $this->assertFalse(true); + } catch (Exception $e) { + $this->assertContains('Cannot modify header information', $e->getMessage()); + $trace2 = $e->getTrace(); + $targetUrl2 = getUrlFromRedirect($trace2); + $parsedQuery2 = getParamsFromUrl($targetUrl2); + + $ssoUrl2 = $settingsInfo['idp']['singleSignOnService']['url']; + $this->assertContains($ssoUrl2, $targetUrl2); + $this->assertArrayHasKey('SAMLRequest', $parsedQuery2); + $encodedRequest2 = $parsedQuery2['SAMLRequest']; + $decoded2 = base64_decode($encodedRequest2); + $request2 = gzinflate($decoded2); + $this->assertContains('assertContains('Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">testuser@example.com', $request2); + $this->assertContains('', $request2); + } + + try { + // The Header of the redirect produces an Exception + $returnTo = 'http://example.com/returnto'; + $settingsInfo['sp']['NameIDFormat'] = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"; + $auth2 = new OneLogin_Saml2_Auth($settingsInfo); + $auth2->login($returnTo); + // Do not ever get here + $this->assertFalse(true); + } catch (Exception $e) { + $this->assertContains('Cannot modify header information', $e->getMessage()); + $trace3 = $e->getTrace(); + $targetUrl3 = getUrlFromRedirect($trace3); + $parsedQuery3 = getParamsFromUrl($targetUrl3); + + $ssoUrl3 = $settingsInfo['idp']['singleSignOnService']['url']; + $this->assertContains($ssoUrl3, $targetUrl3); + $this->assertArrayHasKey('SAMLRequest', $parsedQuery3); + $encodedRequest3 = $parsedQuery3['SAMLRequest']; + $decoded3 = base64_decode($encodedRequest3); + $request3 = gzinflate($decoded3); + $this->assertContains('assertContains('Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">testuser@example.com', $request3); + $this->assertContains('', $request3); + } + } + /** * Tests the logout method of the OneLogin_Saml2_Auth class * Case Logout with no parameters. A logout Request is built and redirect executed diff --git a/tests/src/OneLogin/Saml2/AuthnRequestTest.php b/tests/src/OneLogin/Saml2/AuthnRequestTest.php index c62e8a36..7d1ab056 100644 --- a/tests/src/OneLogin/Saml2/AuthnRequestTest.php +++ b/tests/src/OneLogin/Saml2/AuthnRequestTest.php @@ -189,6 +189,43 @@ public function testNameIDPolicy() $this->assertContains('getRequest(); + $decoded = base64_decode($encodedRequest); + $request = gzinflate($decoded); + $this->assertNotContains('getRequest(); + $decoded2 = base64_decode($encodedRequest2); + $request2 = gzinflate($decoded2); + $this->assertContains('assertContains('Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">testuser@example.com', $request2); + $this->assertContains('', $request2); + + $settingsInfo['sp']['NameIDFormat'] = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"; + $settings = new OneLogin_Saml2_Settings($settingsInfo); + $authnRequest3 = new OneLogin_Saml2_AuthnRequest($settings, false, false, true, "testuser@example.com"); + $encodedRequest3 = $authnRequest3->getRequest(); + $decoded3 = base64_decode($encodedRequest3); + $request3 = gzinflate($decoded3); + $this->assertContains('assertContains('Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">testuser@example.com', $request3); + $this->assertContains('', $request3); + } + /** * Tests the OneLogin_Saml2_AuthnRequest Constructor. * The creation of a deflated SAML Request From 5dfb2de42a4cb02c94570e42168e63e2c1aef5ce Mon Sep 17 00:00:00 2001 From: Ying Date: Wed, 24 Apr 2019 21:50:03 -0700 Subject: [PATCH 083/236] Update README.md with Composer example Update README.md to include a fully working example using Composer --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index f8820540..028fc789 100644 --- a/README.md +++ b/README.md @@ -1119,6 +1119,46 @@ if (isset($_SESSION['samlUserdata'])) { // If there is user data we print it. } ``` +#### Example (using Composer) that initiates the SSO request and handles the response (is the acs target) #### + +Install package via composer: +``` +composer require onelogin/php-saml +``` + +Create an index.php: +```php +processResponse(null); + $errors = $auth->getErrors(); + if (empty($errors)) { + // user has authenticated successfully + $needsAuth = false; + $_SESSION['samlUserdata'] = $auth->getAttributes(); + } + } + + if ($needsAuth) { + $auth->login(); + } +} + +// rest of your app goes here +``` + #### URL-guessing methods #### php-saml toolkit uses a bunch of methods in OneLogin_Saml2_Utils that try to guess the URL where the SAML messages are processed. From f34e85fc4b9e45f3c4d7714e8b7dce382ab8069d Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 11 Jun 2019 12:10:41 +0200 Subject: [PATCH 084/236] Fix #375 Typo on binding documentation --- settings_example.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings_example.php b/settings_example.php index 7b5fc960..d29d069e 100644 --- a/settings_example.php +++ b/settings_example.php @@ -27,7 +27,7 @@ 'url' => '', // SAML protocol binding to be used when returning the // message. Onelogin Toolkit supports for this endpoint the - // HTTP-Redirect binding only + // HTTP-POST binding only 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', ), // If you need to specify requested attributes, set a @@ -86,7 +86,7 @@ 'url' => '', // SAML protocol binding to be used when returning the // message. Onelogin Toolkit supports for this endpoint the - // HTTP-POST binding only + // HTTP-Redirect binding only 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ), // SLO endpoint info of the IdP. From 4348bd7d90b92099e68b01470afdb18ce75a4103 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 13 Jun 2019 16:57:49 +0200 Subject: [PATCH 085/236] Adjusted acs endpoint to extract NameQualifier and SPNameQualifier from SAMLResponse. Adjusted single logout service to provide NameQualifier and SPNameQualifier to logout method. Add getNameIdNameQualifier to Auth and SamlResponse. Extend logout method from Auth and LogoutRequest constructor to support SPNameQualifier parameter. Align LogoutRequest constructor with SAML specs --- README.md | 22 ++++++- demo1/index.php | 16 +++-- lib/Saml2/Auth.php | 24 +++++++- lib/Saml2/LogoutRequest.php | 20 ++++-- lib/Saml2/Response.php | 17 ++++++ tests/src/OneLogin/Saml2/AuthTest.php | 61 +++++++++++++++++++ .../src/OneLogin/Saml2/LogoutRequestTest.php | 18 ++++++ tests/src/OneLogin/Saml2/ResponseTest.php | 29 +++++++++ 8 files changed, 193 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 028fc789..900e0413 100644 --- a/README.md +++ b/README.md @@ -753,6 +753,8 @@ if (!$auth->isAuthenticated()) { $_SESSION['samlUserdata'] = $auth->getAttributes(); $_SESSION['samlNameId'] = $auth->getNameId(); $_SESSION['samlNameIdFormat'] = $auth->getNameIdFormat(); +$_SESSION['samlNameidNameQualifier' = $auth->getNameIdNameQualifier(); +$_SESSION['samlNameidSPNameQualifier' = $auth->getNameIdSPNameQualifier(); $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { @@ -980,7 +982,7 @@ $auth = new OneLogin_Saml2_Auth(); $auth->logout(); // Method that sent the Logout Request. ``` -Also there are six optional parameters that can be set: +Also there are eight optional parameters that can be set: * `$returnTo` - The target URL the user should be returned to after logout. * `$parameters` - Extra parameters to be added to the GET. * `$name_id` - That will be used to build the LogoutRequest. If `name_id` parameter is not set and the auth object processed a @@ -988,6 +990,8 @@ SAML Response with a `NameId`, then this `NameId` will be used. * `$session_index` - SessionIndex that identifies the session of the user. * `$stay` - True if we want to stay (returns the url string) False to redirect. * `$nameIdFormat` - The NameID Format will be set in the LogoutRequest. +* `$nameIdNameQualifier` - The NameID NameQualifier will be set in the LogoutRequest. +* `$nameIdSPNameQualifier` - The NameID SP NameQualifier will be set in the LogoutRequest. The Logout Request will be sent signed or unsigned based on the security info of the `advanced_settings.php` (`'logoutRequestSigned'`). @@ -1014,6 +1018,9 @@ $paramters = array(); $nameId = null; $sessionIndex = null; $nameIdFormat = null; +$nameIdNameQualifier = null; +$nameIdSPNameQualifier = null; + if (isset($_SESSION['samlNameId'])) { $nameId = $_SESSION['samlNameId']; } @@ -1023,7 +1030,13 @@ if (isset($_SESSION['samlSessionIndex'])) { if (isset($_SESSION['samlNameIdFormat'])) { $nameIdFormat = $_SESSION['samlNameIdFormat']; } -$auth->logout($returnTo, $paramters, $nameId, $sessionIndex, false, $nameIdFormat); +if (isset($_SESSION['samlNameIdNameQualifier'])) { + $nameIdNameQualifier = $_SESSION['samlNameIdNameQualifier']; +} +if (isset($_SESSION['samlNameIdSPNameQualifier'])) { + $nameIdSPNameQualifier = $_SESSION['samlNameIdSPNameQualifier']; +} +$auth->logout($returnTo, $paramters, $nameId, $sessionIndex, false, $nameIdFormat, $nameIdNameQualifier, $nameIdSPNameQualifier); ``` If a match on the future LogoutResponse ID and the LogoutRequest ID to be sent is required, that LogoutRequest ID must to be extracted and stored. @@ -1282,6 +1295,9 @@ Main class of OneLogin PHP Toolkit * `getAttributes` - Returns the set of SAML attributes. * `getAttribute` - Returns the requested SAML attribute * `getNameId` - Returns the nameID + * `getNameIdFormat` - Gets the NameID Format provided by the SAML response from the IdP. + * `getNameIdNameQualifier` - Gets the NameID NameQualifier provided from the SAML Response String. + * `getNameIdNameSPQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. * `getSessionIndex` - Gets the SessionIndex from the AuthnStatement. * `getErrors` - Returns if there were any error * `getSSOurl` - Gets the SSO url. @@ -1318,6 +1334,8 @@ SAML 2 Authentication Response class IdP. * `getNameId` - Gets the NameID provided by the SAML response from the IdP. * `getNameIdFormat` - Gets the NameID Format provided by the SAML response from the IdP. + * `getNameIdNameQualifier` - Gets the NameID NameQualifier provided from the SAML Response String. + * `getNameIdNameSPQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. * `getSessionNotOnOrAfter` - Gets the SessionNotOnOrAfter from the AuthnStatement * `getSessionIndex` - Gets the SessionIndex from the AuthnStatement. diff --git a/demo1/index.php b/demo1/index.php index 39967912..2400451f 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -35,14 +35,20 @@ if (isset($_SESSION['samlNameId'])) { $nameId = $_SESSION['samlNameId']; } - if (isset($_SESSION['samlSessionIndex'])) { - $sessionIndex = $_SESSION['samlSessionIndex']; - } if (isset($_SESSION['samlNameIdFormat'])) { $nameIdFormat = $_SESSION['samlNameIdFormat']; } + if (isset($_SESSION['samlNameIdNameQualifier'])) { + $nameIdNameQualifier = $_SESSION['samlNameIdNameQualifier']; + } + if (isset($_SESSION['samlNameIdSPNameQualifier'])) { + $nameIdSPNameQualifier = $_SESSION['samlNameIdSPNameQualifier']; + } + if (isset($_SESSION['samlSessionIndex'])) { + $sessionIndex = $_SESSION['samlSessionIndex']; + } - $auth->logout($returnTo, $parameters, $nameId, $sessionIndex, false, $nameIdFormat); + $auth->logout($returnTo, $parameters, $nameId, $sessionIndex, false, $nameIdFormat, $nameIdNameQualifier, $nameIdSPNameQualifier); # If LogoutRequest ID need to be saved in order to later validate it, do instead # $sloBuiltUrl = $auth->logout(null, $paramters, $nameId, $sessionIndex, true); @@ -75,6 +81,8 @@ $_SESSION['samlUserdata'] = $auth->getAttributes(); $_SESSION['samlNameId'] = $auth->getNameId(); $_SESSION['samlNameIdFormat'] = $auth->getNameIdFormat(); + $_SESSION['samlNameIdNameQualifier'] = $auth->getNameIdNameQualifier(); + $_SESSION['samlNameIdSPNameQualifier'] = $auth->getNameIdSPNameQualifier(); $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); unset($_SESSION['AuthNRequestID']); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index fed8aceb..591ffd37 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -49,6 +49,13 @@ class OneLogin_Saml2_Auth */ private $_nameidNameQualifier; + /** + * NameID SP NameQualifier + * + * @var string + */ + private $_nameidSPNameQualifier; + /** * If user is authenticated. * @@ -197,6 +204,7 @@ public function processResponse($requestId = null) $this->_nameid = $response->getNameId(); $this->_nameidFormat = $response->getNameIdFormat(); $this->_nameidNameQualifier = $response->getNameIdNameQualifier(); + $this->_nameidSPNameQualifier = $response->getNameIdSPNameQualifier(); $this->_authenticated = true; $this->_sessionIndex = $response->getSessionIndex(); $this->_sessionExpiration = $response->getSessionNotOnOrAfter(); @@ -380,6 +388,16 @@ public function getNameIdNameQualifier() return $this->_nameidNameQualifier; } + /** + * Returns the nameID SP NameQualifier + * + * @return string The nameID SP NameQualifier of the assertion + */ + public function getNameIdSPNameQualifier() + { + return $this->_nameidSPNameQualifier; + } + /** * Returns the SessionIndex * @@ -513,7 +531,7 @@ public function login($returnTo = null, $parameters = array(), $forceAuthn = fal * * @throws OneLogin_Saml2_Error */ - public function logout($returnTo = null, $parameters = array(), $nameId = null, $sessionIndex = null, $stay = false, $nameIdFormat = null, $nameIdNameQualifier = null) + public function logout($returnTo = null, $parameters = array(), $nameId = null, $sessionIndex = null, $stay = false, $nameIdFormat = null, $nameIdNameQualifier = null, $nameIdSPNameQualifier = null) { assert('is_array($parameters)'); @@ -532,7 +550,7 @@ public function logout($returnTo = null, $parameters = array(), $nameId = null, $nameIdFormat = $this->_nameidFormat; } - $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, null, $nameId, $sessionIndex, $nameIdFormat, $nameIdNameQualifier); + $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, null, $nameId, $sessionIndex, $nameIdFormat, $nameIdNameQualifier, $nameIdSPNameQualifier); $this->_lastRequest = $logoutRequest->getXML(); $this->_lastRequestID = $logoutRequest->id; @@ -650,7 +668,7 @@ public function buildResponseSignature($samlResponse, $relayState, $signAlgorith * * @throws OneLogin_Saml2_Error */ - private function buildMessageSignature($samlMessage, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA256, $type="SAMLRequest") + private function buildMessageSignature($samlMessage, $relayState, $signAlgorithm = XMLSecurityKey::RSA_SHA256, $type = "SAMLRequest") { $key = $this->_settings->getSPkey(); if (empty($key)) { diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 595c1ca1..e1523903 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -39,10 +39,11 @@ class OneLogin_Saml2_LogoutRequest * @param string|null $sessionIndex The SessionIndex (taken from the SAML Response in the SSO process). * @param string|null $nameIdFormat The NameID Format will be set in the LogoutRequest. * @param string|null $nameIdNameQualifier The NameID NameQualifier will be set in the LogoutRequest. + * @param string|null $nameIdSPNameQualifier The NameID SP NameQualifier will be set in the LogoutRequest. * * @throws OneLogin_Saml2_Error */ - public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $nameId = null, $sessionIndex = null, $nameIdFormat = null, $nameIdNameQualifier = null) + public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $nameId = null, $sessionIndex = null, $nameIdFormat = null, $nameIdNameQualifier = null, $nameIdSPNameQualifier = null) { $this->_settings = $settings; @@ -59,7 +60,6 @@ public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $id = OneLogin_Saml2_Utils::generateUniqueID(); $this->id = $id; - $nameIdValue = OneLogin_Saml2_Utils::generateUniqueID(); $issueInstant = OneLogin_Saml2_Utils::parseTime2SAML(time()); $cert = null; @@ -78,16 +78,26 @@ public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $spData['NameIDFormat'] != OneLogin_Saml2_Constants::NAMEID_UNSPECIFIED) { $nameIdFormat = $spData['NameIDFormat']; } - $spNameQualifier = null; } else { $nameId = $idpData['entityId']; $nameIdFormat = OneLogin_Saml2_Constants::NAMEID_ENTITY; - $spNameQualifier = $spData['entityId']; + } + + /* From saml-core-2.0-os 8.3.6, when the entity Format is used: + "The NameQualifier, SPNameQualifier, and SPProvidedID attributes MUST be omitted. + */ + if (!empty($nameIdFormat) && $nameIdFormat == OneLogin_Saml2_Constants::NAMEID_ENTITY) { + $nameIdNameQualifier = null; + $nameIdSPNameQualifier = null; + } + // NameID Format UNSPECIFIED omitted + if (!empty($nameIdFormat) && $nameIdFormat == OneLogin_Saml2_Constants::NAMEID_UNSPECIFIED) { + $nameIdFormat = null; } $nameIdObj = OneLogin_Saml2_Utils::generateNameId( $nameId, - $spNameQualifier, + $nameIdSPNameQualifier, $nameIdFormat, $cert, $nameIdNameQualifier diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index b2a6f689..55e480d6 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -671,6 +671,23 @@ public function getNameIdNameQualifier() return $nameIdNameQualifier; } + /** + * Gets the NameID SP NameQualifier provided by the SAML response from the IdP. + * + * @return string|null NameID SP NameQualifier + * + * @throws ValidationError + */ + public function getNameIdSPNameQualifier() + { + $nameIdSPNameQualifier = null; + $nameIdData = $this->getNameIdData(); + if (!empty($nameIdData) && isset($nameIdData['SPNameQualifier'])) { + $nameIdSPNameQualifier = $nameIdData['SPNameQualifier']; + } + return $nameIdSPNameQualifier; + } + /** * Gets the SessionNotOnOrAfter from the AuthnStatement. * Could be used to set the local session expiration diff --git a/tests/src/OneLogin/Saml2/AuthTest.php b/tests/src/OneLogin/Saml2/AuthTest.php index 2606448e..94e3872f 100644 --- a/tests/src/OneLogin/Saml2/AuthTest.php +++ b/tests/src/OneLogin/Saml2/AuthTest.php @@ -120,6 +120,8 @@ public function testProcessNoResponse() * @covers OneLogin_Saml2_Auth::getAttribute * @covers OneLogin_Saml2_Auth::getNameId * @covers OneLogin_Saml2_Auth::getNameIdFormat + * @covers OneLogin_Saml2_Auth::getNameIdNameQualifier + * @covers OneLogin_Saml2_Auth::getNameIdSPNameQualifier * @covers OneLogin_Saml2_Auth::getErrors * @covers OneLogin_Saml2_Auth::getSessionIndex * @covers OneLogin_Saml2_Auth::getSessionExpiration @@ -136,6 +138,8 @@ public function testProcessResponseInvalid() $this->assertEmpty($this->_auth->getAttributes()); $this->assertNull($this->_auth->getNameId()); $this->assertNull($this->_auth->getNameIdFormat()); + $this->assertNull($this->_auth->getNameIdNameQualifier()); + $this->assertNull($this->_auth->getNameIdSPNameQualifier()); $this->assertNull($this->_auth->getSessionIndex()); $this->assertNull($this->_auth->getSessionExpiration()); $this->assertNull($this->_auth->getAttribute('uid')); @@ -209,6 +213,63 @@ public function testProcessResponseValid() $this->assertEquals('2655106621', $sessionExpiration); } + /** + * Tests the getNameIdNameQualifier method of the Auth class + * Case found + * @covers OneLogin_Saml2_Auth::getNameIdNameQualifier + */ + public function testGetNameIdNameQualifier() + { + $message = file_get_contents(TEST_ROOT . '/data/responses/valid_response_with_namequalifier.xml.base64'); + $_POST['SAMLResponse'] = $message; + $this->assertNull($this->_auth->getNameIdNameQualifier()); + $this->_auth->processResponse(); + $this->assertTrue($this->_auth->isAuthenticated()); + $this->assertEquals('https://test.example.com/saml/metadata', $this->_auth->getNameIdNameQualifier()); + } + /** + * Tests the getNameIdNameQualifier method of the Auth class + * Case Null + * @covers OneLogin_Saml2_Auth::getNameIdNameQualifier + */ + public function testGetNameIdNameQualifier2() + { + $message = file_get_contents(TEST_ROOT . '/data/responses/valid_response.xml.base64'); + $_POST['SAMLResponse'] = $message; + $this->assertNull($this->_auth->getNameIdNameQualifier()); + $this->_auth->processResponse(); + $this->assertTrue($this->_auth->isAuthenticated()); + $this->assertNull($this->_auth->getNameIdNameQualifier()); + } + /** + * Tests the getNameIdSPNameQualifier method of the Auth class + * Case Found + * @covers OneLogin_Saml2_Auth::getNameIdSPNameQualifier + */ + public function testGetNameIdSPNameQualifier() + { + $message = file_get_contents(TEST_ROOT . '/data/responses/valid_response_with_namequalifier.xml.base64'); + $_POST['SAMLResponse'] = $message; + $this->assertNull($this->_auth->getNameIdSPNameQualifier()); + $this->_auth->processResponse(); + $this->assertTrue($this->_auth->isAuthenticated()); + $this->assertNull($this->_auth->getNameIdSPNameQualifier()); + } + /** + * Tests the getNameIdSPNameQualifier method of the Auth class + * Case Null + * @covers OneLogin_Saml2_Auth::getNameIdSPNameQualifier + */ + public function testGetNameIdSPNameQualifier2() + { + $message = file_get_contents(TEST_ROOT . '/data/responses/valid_response.xml.base64'); + $_POST['SAMLResponse'] = $message; + $this->assertNull($this->_auth->getNameIdSPNameQualifier()); + $this->_auth->processResponse(); + $this->assertTrue($this->_auth->isAuthenticated()); + $this->assertEquals('http://stuff.com/endpoints/metadata.php', $this->_auth->getNameIdSPNameQualifier()); + } + /** * Tests the getAttributes and getAttributesWithFriendlyName methods * @covers OneLogin_Saml2_Auth::getAttributes diff --git a/tests/src/OneLogin/Saml2/LogoutRequestTest.php b/tests/src/OneLogin/Saml2/LogoutRequestTest.php index 7c5c3cff..f48dc555 100644 --- a/tests/src/OneLogin/Saml2/LogoutRequestTest.php +++ b/tests/src/OneLogin/Saml2/LogoutRequestTest.php @@ -374,6 +374,24 @@ public function testGetNameIdData() $this->assertContains('NameID not found in the Logout Request', $e->getMessage()); } + $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_PERSISTENT, $this->_settings->getIdPData()['entityId'], $this->_settings->getSPData()['entityId']); + $logoutRequestStr = $logoutRequest->getXML(); + $this->assertContains('ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c', $logoutRequestStr); + $this->assertContains('Format="'.OneLogin_Saml2_Constants::NAMEID_PERSISTENT, $logoutRequestStr); + $this->assertContains('NameQualifier="'.$this->_settings->getIdPData()['entityId'], $logoutRequestStr); + $this->assertContains('SPNameQualifier="'.$this->_settings->getSPData()['entityId'], $logoutRequestStr); + $logoutRequest2 = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_ENTITY, $this->_settings->getIdPData()['entityId'], $this->_settings->getSPData()['entityId']); + $logoutRequestStr2 = $logoutRequest2->getXML(); + $this->assertContains('ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c', $logoutRequestStr2); + $this->assertContains('Format="'.OneLogin_Saml2_Constants::NAMEID_ENTITY, $logoutRequestStr2); + $this->assertNotContains('NameQualifier', $logoutRequestStr2); + $this->assertNotContains('SPNameQualifier', $logoutRequestStr2); + $logoutRequest3 = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_UNSPECIFIED); + $logoutRequestStr3 = $logoutRequest3->getXML(); + $this->assertContains('ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c', $logoutRequestStr3); + $this->assertNotContains('Format', $logoutRequestStr3); + $this->assertNotContains('NameQualifier', $logoutRequestStr3); + $this->assertNotContains('SPNameQualifier', $logoutRequestStr3); } /** diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 6d7d280c..54097a42 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -258,6 +258,35 @@ public function testGetNameIdNameQualifier() } } + /** + * Tests the getNameIdSPNameQualifier method of the Response + * + * @covers OneLogin_Saml2_Response::getNameIdSPNameQualifier + */ + public function testGetNameIdSPNameQualifier() + { + $xml = file_get_contents(TEST_ROOT . '/data/responses/response1.xml.base64'); + $response = new OneLogin_Saml2_Response($this->_settings, $xml); + $this->assertNull($response->getNameIdSPNameQualifier()); + $xml2 = file_get_contents(TEST_ROOT . '/data/responses/response_encrypted_nameid.xml.base64'); + $response2 = new OneLogin_Saml2_Response($this->_settings, $xml2); + $this->assertEquals('http://stuff.com/endpoints/metadata.php', $response2->getNameIdSPNameQualifier()); + $xml3 = file_get_contents(TEST_ROOT . '/data/responses/valid_encrypted_assertion.xml.base64'); + $response3 = new OneLogin_Saml2_Response($this->_settings, $xml3); + $this->assertEquals('http://stuff.com/endpoints/metadata.php', $response3->getNameIdSPNameQualifier()); + $xml4 = file_get_contents(TEST_ROOT . '/data/responses/valid_response.xml.base64'); + $response4 = new OneLogin_Saml2_Response($this->_settings, $xml4); + $this->assertEquals('http://stuff.com/endpoints/metadata.php', $response4->getNameIdSPNameQualifier()); + $xml5 = file_get_contents(TEST_ROOT . '/data/responses/invalids/no_nameid.xml.base64'); + $response5 = new OneLogin_Saml2_Response($this->_settings, $xml5); + try { + $nameId5 = $response5->getNameIdSPNameQualifier(); + $this->fail('ValidationError was not raised'); + } catch (OneLogin_Saml2_ValidationError $e) { + $this->assertContains('NameID not found in the assertion of the Response', $e->getMessage()); + } + } + /** * Tests the getNameIdData method of the OneLogin_Saml2_Response * From 622e14ece11cba27edc723435d6363b9993920c5 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 13 Jun 2019 17:05:23 +0200 Subject: [PATCH 086/236] Missed file --- .../data/responses/valid_response_with_namequalifier.xml.base64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/data/responses/valid_response_with_namequalifier.xml.base64 diff --git a/tests/data/responses/valid_response_with_namequalifier.xml.base64 b/tests/data/responses/valid_response_with_namequalifier.xml.base64 new file mode 100644 index 00000000..5bca509b --- /dev/null +++ b/tests/data/responses/valid_response_with_namequalifier.xml.base64 @@ -0,0 +1 @@ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeDhmZWI5YWNkLTFlODYtYWMxMi05MDIzLTEzYjg0NDc5YjI1YiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDItMTlUMDE6Mzc6MDFaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzVmZTlkNmU0OTliMmYwOTEzMjA2YWFiM2Y3MTkxNzI5MDQ5YmI4MDciPjxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeDhmZWI5YWNkLTFlODYtYWMxMi05MDIzLTEzYjg0NDc5YjI1YiI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+NVRWZURYbGQ3YzhURmtybVlDeFpuL2ZHRTRzPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5hZlFaVUE2REpHa0hLNjVMMENBaTJBSDJkOWNwbExuekNPTHBCYm9hUmVmaWdtVC92L0tJZGcyYXpWRzY2Ykk1aFA1NTBNR0c2ZVVzaWJ1N2N3ZytFbG9tejVBalE3dzlGZG8waHdWWWhib3JaSkN2TUxLUzBEWkFzc01XZnZ3RGNUNmhra3UreXFlS2RhZ1BBOTYwQ25YcUMxeHpjMk43WS82dlBCU081bVU9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PHNhbWxwOlN0YXR1cz48c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+PHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDQxN2ZiOTc2LTk0NGEtNDNiZi05ZTUyLWZiOWM1OTYxNzYxZiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDItMTlUMDE6Mzc6MDFaIj48c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPjxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICA8ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZng0MTdmYjk3Ni05NDRhLTQzYmYtOWU1Mi1mYjljNTk2MTc2MWYiPjxkczpUcmFuc2Zvcm1zPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48L2RzOlRyYW5zZm9ybXM+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzOkRpZ2VzdFZhbHVlPmxSbTJ3UW13ZGhmZVZuMDFaS1Ewb05CN1JqQT08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU+aktwQUNmMWkxR0FMSWQ5Y0liQlFsTkJQMVhpZDhhYXFKOUxyTkFIZ1lpR2VIc0NscldVUkZJREprOGI0T3RmdHdXTGZKeXBXbXgwWm15M2hpTTJyVHBIbDBLMGVqSFNsOS9Ed0pabkNEQW1CS1lhZ0ZFR0xxWXYwaXI0Y2lYaForTkdXSDY1czhBRlVibjU2SytaS3lpMFkwMWc4TmVqaS92OTNlZFZ6ZTZnPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQo8ZHM6S2V5SW5mbz48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlDZ1RDQ0Flb0NDUUNiT2xyV0RkWDdGVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JoREVMTUFrR0ExVUVCaE1DVGs4eEdEQVdCZ05WQkFnVEQwRnVaSEpsWVhNZ1UyOXNZbVZ5WnpFTU1Bb0dBMVVFQnhNRFJtOXZNUkF3RGdZRFZRUUtFd2RWVGtsT1JWUlVNUmd3RmdZRFZRUURFdzltWldsa1pTNWxjbXhoYm1jdWJtOHhJVEFmQmdrcWhraUc5dzBCQ1FFV0VtRnVaSEpsWVhOQWRXNXBibVYwZEM1dWJ6QWVGdzB3TnpBMk1UVXhNakF4TXpWYUZ3MHdOekE0TVRReE1qQXhNelZhTUlHRU1Rc3dDUVlEVlFRR0V3Sk9UekVZTUJZR0ExVUVDQk1QUVc1a2NtVmhjeUJUYjJ4aVpYSm5NUXd3Q2dZRFZRUUhFd05HYjI4eEVEQU9CZ05WQkFvVEIxVk9TVTVGVkZReEdEQVdCZ05WQkFNVEQyWmxhV1JsTG1WeWJHRnVaeTV1YnpFaE1COEdDU3FHU0liM0RRRUpBUllTWVc1a2NtVmhjMEIxYm1sdVpYUjBMbTV2TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEaXZiaFI3UDUxNngvUzNCcUt4dXBRZTBMT05vbGl1cGlCT2VzQ08zU0hiRHJsMytxOUliZm5mbUUwNHJOdU1jUHNJeEIxNjFUZERwSWVzTENuN2M4YVBISVNLT3RQbEFlVFpTbmI4UUF1N2FSalpxMytQYnJQNXVXM1RjZkNHUHRLVHl0SE9nZS9PbEpibzA3OGRWaFhRMTRkMUVEd1hKVzFyUlh1VXQ0QzhRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUNEVmZwODZIT2JxWStlOEJVb1dROStWTVF4MUFTRG9oQmp3T3NnMld5a1VxUlhGK2RMZmNVSDlkV1I2M0N0WklLRkRiU3ROb21QblF6N25iSytvbnlnd0JzcFZFYm5IdVVpaFpxM1pVZG11bVFxQ3c0VXZzLzFVdnEzb3JPby9XSlZoVHl2TGdGVksyUWFyUTQvNjdPWmZIZDdSK1BPQlhob3BoU012MVpPbzwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE+PC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vdGVzdC5leGFtcGxlLmNvbS9zYW1sL21ldGFkYXRhIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+NDkyODgyNjE1YWNmMzFjODA5NmI2MjcyNDVkNzZhZTUzMDM2YzA5MDwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjA1NC0wOC0yM1QwNjo1NzowMVoiIFJlY2lwaWVudD0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzVmZTlkNmU0OTliMmYwOTEzMjA2YWFiM2Y3MTkxNzI5MDQ5YmI4MDciLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxNC0wMi0xOVQwMTozNjozMVoiIE5vdE9uT3JBZnRlcj0iMjA1NC0wOC0yM1QwNjo1NzowMVoiPjxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxNC0wMi0xOVQwMTozNzowMVoiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwNTQtMDItMTlUMDk6Mzc6MDFaIiBTZXNzaW9uSW5kZXg9Il82MjczZDc3YjhjZGUwYzMzM2VjNzlkMjJhOWZhMDAwM2I5ZmUyZDc1Y2IiPjxzYW1sOkF1dGhuQ29udGV4dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5Db250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlIE5hbWU9InVpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c21hcnRpbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zbWFydGluQHlhY28uZXM8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPlNpeHRvMzwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJzbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+TWFydGluMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJlZHVQZXJzb25BZmZpbGlhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZG1pbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PC9zYW1sOkFzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg== From 0a98e72cca5e98598e08dca398a3adad460a7d18 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 24 Jun 2019 12:40:44 +0200 Subject: [PATCH 087/236] Add info about PHP 7.X support and the 3.X branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 900e0413..57305a0f 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Forget those complicated libraries and use this open source library provided and supported by OneLogin Inc. +**The 3.X branch is compatible with PHP > 7.1, so if you are using that PHP version, use it and not the 2.X or the master branch** + Warning ------- From 8ec4aa6eb85a0fe87cb5dbabe9e649781870885f Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 24 Jun 2019 17:17:22 +0200 Subject: [PATCH 088/236] Fix #344 Raise errors on IdPMetadataParser::parseRemoteXML and IdPMetadataParser::parseFileXML --- lib/Saml2/IdPMetadataParser.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 9acca013..7d2220d6 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -40,6 +40,7 @@ public static function parseRemoteXML($url, $entityId = null, $desiredNameIdForm throw new Exception(curl_error($ch), curl_errno($ch)); } } catch (Exception $e) { + throw new Exception('Error on parseRemoteXML. '.$e->getMessage()); } return $metadataInfo; } @@ -68,6 +69,7 @@ public static function parseFileXML($filepath, $entityId = null, $desiredNameIdF $metadataInfo = self::parseXML($data, $entityId, $desiredNameIdFormat, $desiredSSOBinding, $desiredSLOBinding); } } catch (Exception $e) { + throw new Exception('Error on parseFileXML. '.$e->getMessage()); } return $metadataInfo; } From e16161d89067866cabb6dd4f5ccd1437b6a64eda Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 24 Jun 2019 19:43:15 +0200 Subject: [PATCH 089/236] Release 2.16.0 --- CHANGELOG | 6 ++++++ lib/Saml2/version.json | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4153f982..e0dc4fd2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,11 @@ CHANGELOG ========= +v.2.16.0 +* Support SLO ResponseLocation +* [#344](https://github.com/onelogin/php-saml/issues/344) Raise errors on IdPMetadataParser::parseRemoteXML and IdPMetadataParser::parseFileXML +* Adjusted acs endpoint to extract NameQualifier and SPNameQualifier from SAMLResponse. Adjusted single logout service to provide NameQualifier and SPNameQualifier to logout method. Add getNameIdNameQualifier to Auth and SamlResponse. Extend logout method from Auth and LogoutRequest constructor to support SPNameQualifier parameter. Align LogoutRequest constructor with SAML specs +* Add support for Subjects on AuthNRequests by the new parameter +* Set strict=true on config examples v.2.15.0 * Security improvement suggested by Nils Engelbertz to prevent DDOS by expansion of internally defined entities (XEE) diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 091f09ab..112ca458 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.15.0", - "released": "28/01/2019" + "version": "2.16.0", + "released": "24/06/2019" } } From c02356e96ba6ce8cf895bd4e9d9c7bb0de822e33 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 16 Jul 2019 09:05:27 +0200 Subject: [PATCH 090/236] Relax comparision of false on SignMetadata --- lib/Saml2/Settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index ffc1b27b..5374a416 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -842,7 +842,7 @@ public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil } //Sign Metadata - if (isset($this->_security['signMetadata']) && $this->_security['signMetadata'] !== false) { + if (isset($this->_security['signMetadata']) && $this->_security['signMetadata'] != false) { if ($this->_security['signMetadata'] === true) { $keyMetadata = $this->getSPkey(); $certMetadata = $cert; From 17770c0587f82d31418db2609a699f7ee7bfd905 Mon Sep 17 00:00:00 2001 From: ignaciovazquez Date: Thu, 18 Jul 2019 16:34:17 -0700 Subject: [PATCH 091/236] Fixed syntax errors in endpoints/acs.php example --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 57305a0f..0dd26e28 100644 --- a/README.md +++ b/README.md @@ -755,8 +755,8 @@ if (!$auth->isAuthenticated()) { $_SESSION['samlUserdata'] = $auth->getAttributes(); $_SESSION['samlNameId'] = $auth->getNameId(); $_SESSION['samlNameIdFormat'] = $auth->getNameIdFormat(); -$_SESSION['samlNameidNameQualifier' = $auth->getNameIdNameQualifier(); -$_SESSION['samlNameidSPNameQualifier' = $auth->getNameIdSPNameQualifier(); +$_SESSION['samlNameidNameQualifier'] = $auth->getNameIdNameQualifier(); +$_SESSION['samlNameidSPNameQualifier'] = $auth->getNameIdSPNameQualifier(); $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { From 7afe73c3b6c6cb658d9489bd3d2d3191004badde Mon Sep 17 00:00:00 2001 From: Pierre Grimaud Date: Mon, 9 Sep 2019 17:01:21 +0200 Subject: [PATCH 092/236] Fix typos --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0dd26e28..802f4b75 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Since [PHP 5.3 is officially unsupported](http://php.net/eol.php) we recommend y The toolkit is hosted on github. You can download it from: - * Lastest release: https://github.com/onelogin/php-saml/releases/latest + * Latest release: https://github.com/onelogin/php-saml/releases/latest * Master repo: https://github.com/onelogin/php-saml/tree/master Copy the core of the library inside the php application. (each application has its @@ -199,7 +199,7 @@ publish that x509 certificate on Service Provider metadata. #### `extlib/` #### This folder contains the 3rd party libraries that the toolkit uses. At the -moment only uses the `xmlseclibs` (autor Robert Richards, BSD Licensed) which +moment only uses the `xmlseclibs` (author Robert Richards, BSD Licensed) which handle the sign and the encryption of xml elements. @@ -1186,7 +1186,7 @@ php-saml toolkit uses a bunch of methods in OneLogin_Saml2_Utils that try to gue * `getSelfURLNoQuery` Returns the URL of the current host + current view. * `getSelfRoutedURLNoQuery` Returns the routed URL of the current host + current view. -getSelfURLNoQuery and getSelfRoutedURLNoQuery are used to calculate the currentURL in order to valdate SAML elements like Destination or Recipient. +getSelfURLNoQuery and getSelfRoutedURLNoQuery are used to calculate the currentURL in order to validate SAML elements like Destination or Recipient. When the PHP application is behind a proxy or a load balancer we can execute `setProxyVars(true)` and `setSelfPort` and `isHTTPS` will take care of the `$_SERVER["HTTP_X_FORWARDED_PORT"]` and `$_SERVER['HTTP_X_FORWARDED_PROTO']` vars (otherwise they are ignored). @@ -1530,7 +1530,7 @@ Once the SP is configured, the metadata of the SP is published at the process, the `index.php` view. 2.2 in the second link we access to (`attrs.php`) have the same process - described at 2.1 with the diference that as `RelayState` is set the `attrs.php`. + described at 2.1 with the difference that as `RelayState` is set the `attrs.php`. 3. The SAML Response is processed in the ACS (`index.php?acs`), if the Response is not valid, the process stops here and a message is shown. Otherwise we @@ -1557,7 +1557,7 @@ Once the SP is configured, the metadata of the SP is published at the session at of the IdP. Notice that the SLO Workflow starts and ends at the IdP. Notice that all the SAML Requests and Responses are handled by a unique file, -the `index.php` file and how `GET` paramters are used to know the action that +the `index.php` file and how `GET` parameters are used to know the action that must be done. From 7a6f4babaa57a38ab8e565561d4d2e9dfbae7144 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 10 Sep 2019 19:29:13 +0200 Subject: [PATCH 093/236] Set true as the default value for strict setting --- lib/Saml2/Settings.php | 2 +- tests/src/OneLogin/Saml2/SettingsTest.php | 26 +++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 5374a416..13e54ff1 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -26,7 +26,7 @@ class OneLogin_Saml2_Settings * * @var bool */ - private $_strict = false; + private $_strict = true; /** * Activate debug mode diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index c0db5d5c..f23e56c2 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -199,7 +199,7 @@ public function testNonArrayCompressionSettingsCauseSyntaxError($invalidValue) return; } - $this->fail("An OneLogin_Saml2_error should have been caught."); + $this->fail("An OneLogin_Saml2_Error should have been caught."); } /** @@ -233,7 +233,7 @@ public function testThatOnlyBooleansCanBeUsedForCompressionSettings($invalidValu $settingsInfo['compress']['responses'] = $invalidValue; $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $expectedMessage = "Invalid array settings: 'compress'=>'responses' values must be true or false."; $this->assertEquals($expectedMessage, $e->getMessage()); $responsesIsInvalid = true; @@ -301,7 +301,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('Invalid array settings: invalid_syntax', $e->getMessage()); } @@ -309,7 +309,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_not_found', $e->getMessage()); $this->assertContains('sp_not_found', $e->getMessage()); } @@ -323,7 +323,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_entityId_not_found', $e->getMessage()); $this->assertContains('idp_sso_not_found', $e->getMessage()); $this->assertContains('sp_entityId_not_found', $e->getMessage()); @@ -339,7 +339,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_sso_url_invalid', $e->getMessage()); $this->assertContains('idp_slo_url_invalid', $e->getMessage()); $this->assertContains('idp_slo_response_url_invalid', $e->getMessage()); @@ -351,7 +351,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_cert_or_fingerprint_not_found_and_required', $e->getMessage()); } @@ -359,7 +359,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_cert_not_found_and_required', $e->getMessage()); } @@ -386,7 +386,7 @@ public function testCheckSettings() try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('sp_signMetadata_invalid', $e->getMessage()); $this->assertContains('organization_not_enought_data', $e->getMessage()); $this->assertContains('contact_type_invalid', $e->getMessage()); @@ -610,7 +610,7 @@ public function testGetSPMetadataSignedNoMetadataCert() $settings = new OneLogin_Saml2_Settings($settingsInfo); $metadata = $settings->getSPMetadata(); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('sp_signMetadata_invalid', $e->getMessage()); } @@ -624,7 +624,7 @@ public function testGetSPMetadataSignedNoMetadataCert() try { $metadata = $settings->getSPMetadata(); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('Private key file not found', $e->getMessage()); } @@ -637,7 +637,7 @@ public function testGetSPMetadataSignedNoMetadataCert() try { $metadata = $settings->getSPMetadata(); $this->fail('OneLogin_Saml2_Error was not raised'); - } catch (OneLogin_Saml2_error $e) { + } catch (OneLogin_Saml2_Error $e) { $this->assertContains('Public cert file not found', $e->getMessage()); } } @@ -1023,7 +1023,7 @@ public function testIsStrict() unset($settingsInfo['strict']); $settings = new OneLogin_Saml2_Settings($settingsInfo); - $this->assertFalse($settings->isStrict()); + $this->assertTrue($settings->isStrict()); $settingsInfo['strict'] = false; $settings2 = new OneLogin_Saml2_Settings($settingsInfo); From dc9708878a83209d4369d3f748b2bfa947256a60 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 10 Sep 2019 19:40:49 +0200 Subject: [PATCH 094/236] Support 'x509cert' and 'privateKey' on signMetadata security settings --- README.md | 6 ++- advanced_settings_example.php | 8 +++- lib/Saml2/Settings.php | 51 ++++++++++++++--------- tests/src/OneLogin/Saml2/SettingsTest.php | 30 +++++++++++++ 4 files changed, 73 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 802f4b75..dd0a868b 100644 --- a/README.md +++ b/README.md @@ -463,7 +463,11 @@ $advancedSettings = array ( False || True (use sp certs) || array ( keyFileName => 'metadata.key', certFileName => 'metadata.crt' - ) + ) + || array ( + 'x509cert' => '', + 'privateKey' => '' + ) */ 'signMetadata' => false, diff --git a/advanced_settings_example.php b/advanced_settings_example.php index 50194ae6..99d0c044 100644 --- a/advanced_settings_example.php +++ b/advanced_settings_example.php @@ -2,7 +2,7 @@ $advancedSettings = array ( - // Compression settings + // Compression settings // Handle if the getRequest/getResponse methods will return the Request/Response deflated. // But if we provide a $deflate boolean parameter to the getRequest or getResponse // method it will have priority over the compression settings. @@ -36,7 +36,11 @@ False || True (use sp certs) || array ( keyFileName => 'metadata.key', certFileName => 'metadata.crt' - ) + ) + || array ( + 'x509cert' => '', + 'privateKey' => '' + ) */ 'signMetadata' => false, diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 13e54ff1..67410cf0 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -608,9 +608,14 @@ public function checkSPSettings($settings) $errors[] = 'sp_sls_url_invalid'; } - if (isset($security['signMetadata']) && is_array($security['signMetadata']) && - (!isset($security['signMetadata']['keyFileName']) || !isset($security['signMetadata']['certFileName']))) { - $errors[] = 'sp_signMetadata_invalid'; + if (isset($security['signMetadata']) && is_array($security['signMetadata'])) { + if ((!isset($security['signMetadata']['keyFileName']) + || !isset($security['signMetadata']['certFileName'])) && + (!isset($security['signMetadata']['privateKey']) + || !isset($security['signMetadata']['x509cert'])) + ) { + $errors[] = 'sp_signMetadata_invalid'; + } } if (((isset($security['authnRequestsSigned']) && $security['authnRequestsSigned'] == true) @@ -842,40 +847,28 @@ public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil } //Sign Metadata - if (isset($this->_security['signMetadata']) && $this->_security['signMetadata'] != false) { + if (isset($this->_security['signMetadata']) && $this->_security['signMetadata'] !== false) { if ($this->_security['signMetadata'] === true) { $keyMetadata = $this->getSPkey(); $certMetadata = $cert; - if (!$keyMetadata) { throw new OneLogin_Saml2_Error( 'SP Private key not found.', OneLogin_Saml2_Error::PRIVATE_KEY_FILE_NOT_FOUND ); } - if (!$certMetadata) { throw new OneLogin_Saml2_Error( 'SP Public cert not found.', OneLogin_Saml2_Error::PUBLIC_CERT_FILE_NOT_FOUND ); } - } else { - if (!isset($this->_security['signMetadata']['keyFileName']) - || !isset($this->_security['signMetadata']['certFileName']) - ) { - throw new OneLogin_Saml2_Error( - 'Invalid Setting: signMetadata value of the sp is not valid', - OneLogin_Saml2_Error::SETTINGS_INVALID_SYNTAX - ); - } + } else if (isset($this->_security['signMetadata']['keyFileName']) && + isset($this->_security['signMetadata']['certFileName'])) { $keyFileName = $this->_security['signMetadata']['keyFileName']; $certFileName = $this->_security['signMetadata']['certFileName']; - $keyMetadataFile = $this->_paths['cert'].$keyFileName; $certMetadataFile = $this->_paths['cert'].$certFileName; - - if (!file_exists($keyMetadataFile)) { throw new OneLogin_Saml2_Error( 'SP Private key file not found: %s', @@ -883,7 +876,6 @@ public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil array($keyMetadataFile) ); } - if (!file_exists($certMetadataFile)) { throw new OneLogin_Saml2_Error( 'SP Public cert file not found: %s', @@ -893,6 +885,27 @@ public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil } $keyMetadata = file_get_contents($keyMetadataFile); $certMetadata = file_get_contents($certMetadataFile); + } else if (isset($this->_security['signMetadata']['privateKey']) && + isset($this->_security['signMetadata']['x509cert'])) { + $keyMetadata = OneLogin_Saml2_Utils::formatPrivateKey($this->_security['signMetadata']['privateKey']); + $certMetadata = OneLogin_Saml2_Utils::formatCert($this->_security['signMetadata']['x509cert']); + if (!$keyMetadata) { + throw new OneLogin_Saml2_Error( + 'Private key not found.', + OneLogin_Saml2_Error::PRIVATE_KEY_FILE_NOT_FOUND + ); + } + if (!$certMetadata) { + throw new OneLogin_Saml2_Error( + 'Public cert not found.', + OneLogin_Saml2_Error::PUBLIC_CERT_FILE_NOT_FOUND + ); + } + } else { + throw new OneLogin_Saml2_Error( + 'Invalid Setting: signMetadata value of the sp is not valid', + OneLogin_Saml2_Error::SETTINGS_INVALID_SYNTAX + ); } $signatureAlgorithm = $this->_security['signatureAlgorithm']; diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index f23e56c2..44bdae5a 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -391,6 +391,16 @@ public function testCheckSettings() $this->assertContains('organization_not_enought_data', $e->getMessage()); $this->assertContains('contact_type_invalid', $e->getMessage()); } + + $settingsInfo['security']['signMetadata'] = ['privateKey' => file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.key')]; + try { + $settings = new OneLogin_Saml2_Settings($settingsInfo); + $this->fail('Error was not raised'); + } catch (OneLogin_Saml2_Error $e) { + $this->assertContains('sp_signMetadata_invalid', $e->getMessage()); + $this->assertContains('organization_not_enought_data', $e->getMessage()); + $this->assertContains('contact_type_invalid', $e->getMessage()); + } } /** @@ -588,6 +598,26 @@ public function testGetSPMetadataSigned() $this->assertContains('assertContains('', $metadata2); + $cert = file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.crt'); + $settingsInfo['security']['signMetadata'] = [ + 'privateKey' => file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.key'), + 'x509cert' => $cert, + ]; + $settings3 = new OneLogin_Saml2_Settings($settingsInfo); + $metadata3 = $settings3->getSPMetadata(); + $this->assertNotEmpty($metadata3); + $this->assertContains('assertContains('entityID="http://stuff.com/endpoints/metadata.php"', $metadata3); + $this->assertContains('AuthnRequestsSigned="false"', $metadata3); + $this->assertContains('WantAssertionsSigned="false"', $metadata3); + $this->assertContains('', $metadata3); + $this->assertContains('', $metadata3); + $this->assertContains('urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', $metadata3); + $this->assertContains('', $metadata3); + $this->assertContains('', $metadata3); + $this->assertContains('assertContains('', $metadata3); + $this->assertContains(OneLogin_Saml2_Utils::formatCert($cert, false), $metadata3); } /** From ba415aa0ccf0f0b8d0174ae619b0a17766a52163 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 11 Sep 2019 02:07:07 +0200 Subject: [PATCH 095/236] Fix CI --- .travis.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 412b3293..f3c0a43e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,19 @@ language: php - +dist: trusty php: - - 5.6 - 5.5 - - 5.4 -# - 5.3 - - 7.0 - -env: - - TRAVIS=true + - 5.6 matrix: fast_finish: true + include: + - php: 5.3 + dist: precise + - php: 5.4 + dist: precise + +env: + - TRAVIS=true before_install: - composer self-update || true From 47eea7f5059ae147f152db7baf16b61a24572987 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 11 Sep 2019 02:20:59 +0200 Subject: [PATCH 096/236] Fix test for php5.3 --- tests/src/OneLogin/Saml2/LogoutRequestTest.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/src/OneLogin/Saml2/LogoutRequestTest.php b/tests/src/OneLogin/Saml2/LogoutRequestTest.php index f48dc555..211f41ed 100644 --- a/tests/src/OneLogin/Saml2/LogoutRequestTest.php +++ b/tests/src/OneLogin/Saml2/LogoutRequestTest.php @@ -374,13 +374,15 @@ public function testGetNameIdData() $this->assertContains('NameID not found in the Logout Request', $e->getMessage()); } - $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_PERSISTENT, $this->_settings->getIdPData()['entityId'], $this->_settings->getSPData()['entityId']); + $idpData = $this->_settings->getIdPData(); + $spData = $this->_settings->getSPData(); + $logoutRequest = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_PERSISTENT, $idpData['entityId'], $spData['entityId']); $logoutRequestStr = $logoutRequest->getXML(); $this->assertContains('ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c', $logoutRequestStr); $this->assertContains('Format="'.OneLogin_Saml2_Constants::NAMEID_PERSISTENT, $logoutRequestStr); - $this->assertContains('NameQualifier="'.$this->_settings->getIdPData()['entityId'], $logoutRequestStr); - $this->assertContains('SPNameQualifier="'.$this->_settings->getSPData()['entityId'], $logoutRequestStr); - $logoutRequest2 = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_ENTITY, $this->_settings->getIdPData()['entityId'], $this->_settings->getSPData()['entityId']); + $this->assertContains('NameQualifier="'.$idpData['entityId'], $logoutRequestStr); + $this->assertContains('SPNameQualifier="'.$spData['entityId'], $logoutRequestStr); + $logoutRequest2 = new OneLogin_Saml2_LogoutRequest($this->_settings, null, "ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c", null, OneLogin_Saml2_Constants::NAMEID_ENTITY, $idpData['entityId'], $spData['entityId']); $logoutRequestStr2 = $logoutRequest2->getXML(); $this->assertContains('ONELOGIN_1e442c129e1f822c8096086a1103c5ee2c7cae1c', $logoutRequestStr2); $this->assertContains('Format="'.OneLogin_Saml2_Constants::NAMEID_ENTITY, $logoutRequestStr2); From d427b07ba5150b28249eeca5029fbe5d911ee12d Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 11 Sep 2019 14:00:26 +0200 Subject: [PATCH 097/236] More fixes for PHP 5.3 --- tests/src/OneLogin/Saml2/SettingsTest.php | 42 +++++++++++------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 44bdae5a..00e3d903 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -392,7 +392,7 @@ public function testCheckSettings() $this->assertContains('contact_type_invalid', $e->getMessage()); } - $settingsInfo['security']['signMetadata'] = ['privateKey' => file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.key')]; + $settingsInfo['security']['signMetadata'] = array('privateKey' => file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.key')); try { $settings = new OneLogin_Saml2_Settings($settingsInfo); $this->fail('Error was not raised'); @@ -456,56 +456,56 @@ public function testGetSPMetadataWithX509CertNew($alwaysIncludeEncryption, $want public function testGetSPMetadataWithX509CertNewDataProvider() { - return [ - 'settings do not require encryption' => [ + return array( + 'settings do not require encryption' => array( 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => false, - ], - 'wantNameIdEncrypted setting enabled' => [ + ), + 'wantNameIdEncrypted setting enabled' => array( 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, - ], - 'wantAssertionsEncrypted setting enabled' => [ + ), + 'wantAssertionsEncrypted setting enabled' => array( 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, - ], - 'both settings enabled'=> [ + ), + 'both settings enabled'=> array( 'alwaysIncludeEncryption' => false, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, - ], - 'metadata requested with encryption' => [ + ), + 'metadata requested with encryption' => array( 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, - ], - 'metadata requested with encryption and wantNameIdEncrypted setting enabled' => [ + ), + 'metadata requested with encryption and wantNameIdEncrypted setting enabled' => array( 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => false, 'expectEncryptionKeyDescriptor' => true, - ], - 'metadata requested with encryption and wantAssertionsEncrypted setting enabled' => [ + ), + 'metadata requested with encryption and wantAssertionsEncrypted setting enabled' => array( 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => false, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, - ], - 'metadata requested with encryption and both settings enabled' => [ + ), + 'metadata requested with encryption and both settings enabled' => array( 'alwaysIncludeEncryption' => true, 'wantNameIdEncrypted' => true, 'wantAssertionsEncrypted' => true, 'expectEncryptionKeyDescriptor' => true, - ], - ]; + ), + ); } /** @@ -599,10 +599,10 @@ public function testGetSPMetadataSigned() $this->assertContains('', $metadata2); $cert = file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.crt'); - $settingsInfo['security']['signMetadata'] = [ + $settingsInfo['security']['signMetadata'] = array( 'privateKey' => file_get_contents(TEST_ROOT . '/data/customPath/certs/metadata.key'), 'x509cert' => $cert, - ]; + ); $settings3 = new OneLogin_Saml2_Settings($settingsInfo); $metadata3 = $settings3->getSPMetadata(); $this->assertNotEmpty($metadata3); From 2aaa5aaa9aa6d6887fbd15be0013dd7fac793fc9 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 11 Sep 2019 15:55:25 +0200 Subject: [PATCH 098/236] Release 2.17.0 --- CHANGELOG | 6 ++++++ README.md | 2 ++ lib/Saml2/version.json | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e0dc4fd2..7e240dcc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,11 @@ CHANGELOG ========= +v.2.17.0 +* Set true as the default value for strict setting +* Support 'x509cert' and 'privateKey' on signMetadata security settings +* Relax comparision of false on SignMetadata +* Fix CI + v.2.16.0 * Support SLO ResponseLocation * [#344](https://github.com/onelogin/php-saml/issues/344) Raise errors on IdPMetadataParser::parseRemoteXML and IdPMetadataParser::parseFileXML diff --git a/README.md b/README.md index dd0a868b..12289672 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ and supported by OneLogin Inc. Warning ------- +Version 2.17.0 sets strict mode active by default + Update php-saml to 2.15.0, this version includes a security patch related to XEE attacks php-saml is not affected by [201803-01](https://simplesamlphp.org/security/201803-01) diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 112ca458..2dcd57f4 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.16.0", - "released": "24/06/2019" + "version": "2.17.0", + "released": "11/09/2019" } } From a965cd72d9c317187606ba9cba319c848fac15db Mon Sep 17 00:00:00 2001 From: Davide Porrovecchio Date: Tue, 1 Oct 2019 10:13:05 +0200 Subject: [PATCH 099/236] Add 'destinationStrictlyMatches' option --- README.md | 6 ++++++ advanced_settings_example.php | 6 ++++++ lib/Saml2/Settings.php | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/README.md b/README.md index 12289672..f1acba7b 100644 --- a/README.md +++ b/README.md @@ -509,6 +509,12 @@ $advancedSettings = array ( // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, Destination URL should strictly match to the address to + // which the response has been sent. + // Notice that if 'relaxDestinationValidation' is true an empty Destintation + // will be accepted. + 'destinationStrictlyMatches' => false, + // Algorithm that the toolkit will use on signing process. Options: // 'http://www.w3.org/2000/09/xmldsig#rsa-sha1' // 'http://www.w3.org/2000/09/xmldsig#dsa-sha1' diff --git a/advanced_settings_example.php b/advanced_settings_example.php index 99d0c044..4350765a 100644 --- a/advanced_settings_example.php +++ b/advanced_settings_example.php @@ -85,6 +85,12 @@ // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, Destination URL should strictly match to the address to + // which the response has been sent. + // Notice that if 'relaxDestinationValidation' is true an empty Destintation + // will be accepted. + 'destinationStrictlyMatches' => false, + // Algorithm that the toolkit will use on signing process. Options: // 'http://www.w3.org/2000/09/xmldsig#rsa-sha1' // 'http://www.w3.org/2000/09/xmldsig#dsa-sha1' diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 67410cf0..de721473 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -385,6 +385,11 @@ private function _addDefaultValues() $this->_security['relaxDestinationValidation'] = false; } + // Strict Destination match validation + if (!isset($this->_security['destinationStrictlyMatches'])) { + $this->_security['destinationStrictlyMatches'] = false; + } + // encrypt expected if (!isset($this->_security['wantAssertionsEncrypted'])) { $this->_security['wantAssertionsEncrypted'] = false; From 6feb4b34be5d35931e887a68aca92a6accd058a8 Mon Sep 17 00:00:00 2001 From: Davide Porrovecchio Date: Tue, 1 Oct 2019 10:15:14 +0200 Subject: [PATCH 100/236] Add strict verification for destination --- lib/Saml2/Response.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 55e480d6..adcd4cb8 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -234,10 +234,12 @@ public function isValid($requestId = null) ); } } else { - if (strpos($destination, $currentURL) !== 0) { + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURL); + if (strncmp($destination, $currentURL, $urlComparisonLength) !== 0) { $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURLNoRouted); - if (strpos($destination, $currentURLNoRouted) !== 0) { + if (strncmp($destination, $currentURLNoRouted, $urlComparisonLength) !== 0) { throw new OneLogin_Saml2_ValidationError( "The response was received at $currentURL instead of $destination", OneLogin_Saml2_ValidationError::WRONG_DESTINATION From f52248e008fbad5f12787e134bbb08d363c6964c Mon Sep 17 00:00:00 2001 From: Davide Porrovecchio Date: Tue, 1 Oct 2019 10:15:37 +0200 Subject: [PATCH 101/236] Add strict destination test --- .../invalid_strict_destination.xml.base64 | 1 + tests/src/OneLogin/Saml2/ResponseTest.php | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 tests/data/responses/invalids/invalid_strict_destination.xml.base64 diff --git a/tests/data/responses/invalids/invalid_strict_destination.xml.base64 b/tests/data/responses/invalids/invalid_strict_destination.xml.base64 new file mode 100644 index 00000000..53aebd6a --- /dev/null +++ b/tests/data/responses/invalids/invalid_strict_destination.xml.base64 @@ -0,0 +1 @@ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeDE5MjQwZjZmLWRlNzQtOWUzMS05MzI3LWViYzFhZWQ3ZDIyYSIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDE6MDlaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwLzEiIEluUmVzcG9uc2VUbz0iT05FTE9HSU5fNWQ5ZTMxOWMxYjhhNjdkYTQ4MjI3OTY0YzI4ZDI4MGU3ODYwZjgwNCI+PHNhbWw6SXNzdWVyPmh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgPGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4MTkyNDBmNmYtZGU3NC05ZTMxLTkzMjctZWJjMWFlZDdkMjJhIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkczpEaWdlc3RWYWx1ZT56SjBjdExiSVZUcjBUN3lzRENsWHRGSWdzaFU9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8+PGRzOlNpZ25hdHVyZVZhbHVlPjF4Wks2emNtT2dRV2hhbFRkVTdQWVBmSGYyczdJdXRubmVEYnVFN1R1UkhVaGNzdy9JNm5lRks0SFJlYzJ0dktOeUpiZ1J1MmZyVDVhZE5tcWRBbUpEMjg4VGxCK0hNeGJaNWgxRWJHc2EzbEV3YThLYUVxNWtna1hUcWVOdTVaaHlxbGlWNktCNXVhRUlOZzVtTXdyLzFuZFVCRUxoTjRVMlR0SitJT211Zz08L2RzOlNpZ25hdHVyZVZhbHVlPg0KPGRzOktleUluZm8+PGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQ2dUQ0NBZW9DQ1FDYk9scldEZFg3RlRBTkJna3Foa2lHOXcwQkFRVUZBRENCaERFTE1Ba0dBMVVFQmhNQ1RrOHhHREFXQmdOVkJBZ1REMEZ1WkhKbFlYTWdVMjlzWW1WeVp6RU1NQW9HQTFVRUJ4TURSbTl2TVJBd0RnWURWUVFLRXdkVlRrbE9SVlJVTVJnd0ZnWURWUVFERXc5bVpXbGtaUzVsY214aGJtY3VibTh4SVRBZkJna3Foa2lHOXcwQkNRRVdFbUZ1WkhKbFlYTkFkVzVwYm1WMGRDNXViekFlRncwd056QTJNVFV4TWpBeE16VmFGdzB3TnpBNE1UUXhNakF4TXpWYU1JR0VNUXN3Q1FZRFZRUUdFd0pPVHpFWU1CWUdBMVVFQ0JNUFFXNWtjbVZoY3lCVGIyeGlaWEpuTVF3d0NnWURWUVFIRXdOR2IyOHhFREFPQmdOVkJBb1RCMVZPU1U1RlZGUXhHREFXQmdOVkJBTVREMlpsYVdSbExtVnliR0Z1Wnk1dWJ6RWhNQjhHQ1NxR1NJYjNEUUVKQVJZU1lXNWtjbVZoYzBCMWJtbHVaWFIwTG01dk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGl2YmhSN1A1MTZ4L1MzQnFLeHVwUWUwTE9Ob2xpdXBpQk9lc0NPM1NIYkRybDMrcTlJYmZuZm1FMDRyTnVNY1BzSXhCMTYxVGREcEllc0xDbjdjOGFQSElTS090UGxBZVRaU25iOFFBdTdhUmpacTMrUGJyUDV1VzNUY2ZDR1B0S1R5dEhPZ2UvT2xKYm8wNzhkVmhYUTE0ZDFFRHdYSlcxclJYdVV0NEM4UUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFDRFZmcDg2SE9icVkrZThCVW9XUTkrVk1ReDFBU0RvaEJqd09zZzJXeWtVcVJYRitkTGZjVUg5ZFdSNjNDdFpJS0ZEYlN0Tm9tUG5RejduYksrb255Z3dCc3BWRWJuSHVVaWhacTNaVWRtdW1RcUN3NFV2cy8xVXZxM29yT28vV0pWaFR5dkxnRlZLMlFhclE0LzY3T1pmSGQ3UitQT0JYaG9waFNNdjFaT288L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48c2FtbHA6U3RhdHVzPjxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz48c2FtbDpBc3NlcnRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0icGZ4MDNhNjU2N2YtNDAxNC1lZTIwLThhZDYtNjg5MTQ5ZjM0ZTdmIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxNC0wMy0yMVQxMzo0MTowOVoiPjxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+PHNhbWw6U3ViamVjdD48c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJodHRwczovL3BpdGJ1bGsubm8taXAub3JnL25ld29uZWxvZ2luL2RlbW8xL21ldGFkYXRhLnBocCIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDp0cmFuc2llbnQiPl9iOThmOThiYjFhYjUxMmNlZDY1M2I1OGJhYWZmNTQzNDQ4ZGFlZDUzNWQ8L3NhbWw6TmFtZUlEPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj48c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjMtMDktMjJUMTk6MDE6MDlaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJPTkVMT0dJTl81ZDllMzE5YzFiOGE2N2RhNDgyMjc5NjRjMjhkMjgwZTc4NjBmODA0Ii8+PC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+PC9zYW1sOlN1YmplY3Q+PHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTQtMDMtMjFUMTM6NDA6MzlaIiBOb3RPbk9yQWZ0ZXI9IjIwMjMtMDktMjJUMTk6MDE6MDlaIj48c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT48L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48L3NhbWw6Q29uZGl0aW9ucz48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDE6MDlaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTA5LTIyVDE5OjAxOjA5WiIgU2Vzc2lvbkluZGV4PSJfOWZlMGM4ZGNkMzMwMmU3MzY0ZmNhYjIyYTUyNzQ4ZWJmMjIyNGRmMGFhIj48c2FtbDpBdXRobkNvbnRleHQ+PHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+PC9zYW1sOkF1dGhuQ29udGV4dD48L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdEBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJjbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJzbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+d2FhMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJlZHVQZXJzb25BZmZpbGlhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZG1pbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PC9zYW1sOkFzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg== \ No newline at end of file diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 54097a42..db778366 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -1011,6 +1011,10 @@ public function testIsInValidWrongXML() */ public function testIsInValidDestination() { + $_SERVER['HTTP_HOST'] = 'stuff.com'; + $_SERVER['HTTPS'] = 'https'; + $_SERVER['REQUEST_URI'] = '/endpoints/endpoints/acs.php'; + $xml = file_get_contents(TEST_ROOT . '/data/responses/unsigned_response.xml.base64'); $response = new OneLogin_Saml2_Response($this->_settings, $xml); @@ -1031,10 +1035,28 @@ public function testIsInValidDestination() $this->assertEquals('The response has an empty Destination value', $response3->getError()); include TEST_ROOT .'/settings/settings1.php'; + $settingsInfo['strict'] = true; $settingsInfo['security']['relaxDestinationValidation'] = true; $settings = new OneLogin_Saml2_Settings($settingsInfo); $response4 = new OneLogin_Saml2_Response($settings, $xml2); $this->assertTrue($response4->isValid()); + + // Destination strict match + $xml3 = file_get_contents(TEST_ROOT . '/data/responses/invalids/invalid_strict_destination.xml.base64'); + $response5 = new OneLogin_Saml2_Response($settings, $xml3); + $this->assertTrue($response5->isValid()); + + $settingsInfo['security']['destinationStrictlyMatches'] = true; + $settings2 = new OneLogin_Saml2_Settings($settingsInfo); + $response6 = new OneLogin_Saml2_Response($settings2, $xml3); + $this->assertFalse($response6->isValid()); + $this->assertContains('The response was received at', $response6->getError()); + + unset($settingsInfo['strict']); + unset($settingsInfo['security']['destinationStrictlyMatches']); + unset($_SERVER['HTTP_HOST']); + unset($_SERVER['HTTPS']); + unset($_SERVER['REQUEST_URI']); } /** From 78ac9f404c3fce525b70998eedf67fcf811ad641 Mon Sep 17 00:00:00 2001 From: Davide Porrovecchio Date: Tue, 1 Oct 2019 10:15:57 +0200 Subject: [PATCH 102/236] Fix empty destination test saml response --- tests/data/responses/invalids/empty_destination.xml.base64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/responses/invalids/empty_destination.xml.base64 b/tests/data/responses/invalids/empty_destination.xml.base64 index c41dc637..2b16b213 100644 --- a/tests/data/responses/invalids/empty_destination.xml.base64 +++ b/tests/data/responses/invalids/empty_destination.xml.base64 @@ -1 +1 @@ -PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJwZnhjM2QyYjU0Mi0wZjdlLTg3NjctOGU4Ny01YjBkYzY5MTMzNzUiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiIgRGVzdGluYXRpb249IiIgSW5SZXNwb25zZVRvPSJPTkVMT0dJTl81ZDllMzE5YzFiOGE2N2RhNDgyMjc5NjRjMjhkMjgwZTc4NjBmODA0Ij48c2FtbDpJc3N1ZXI+aHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9zaW1wbGVzYW1sL3NhbWwyL2lkcC9tZXRhZGF0YS5waHA8L3NhbWw6SXNzdWVyPjxzYW1scDpTdGF0dXM+PHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPjwvc2FtbHA6U3RhdHVzPjxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZngwM2E2NTY3Zi00MDE0LWVlMjAtOGFkNi02ODkxNDlmMzRlN2YiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiI+PHNhbWw6SXNzdWVyPmh0dHBzOi8vcGl0YnVsay5uby1pcC5vcmcvc2ltcGxlc2FtbC9zYW1sMi9pZHAvbWV0YWRhdGEucGhwPC9zYW1sOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgPGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4MDNhNjU2N2YtNDAxNC1lZTIwLThhZDYtNjg5MTQ5ZjM0ZTdmIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkczpEaWdlc3RWYWx1ZT5GeXQ0SlRNTVZYdzhSRmExZkFnRjMrMjRFVG89PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8+PGRzOlNpZ25hdHVyZVZhbHVlPmh1ckVlUi9sREtGbFJoN0t6S2tMdkdvUFhraUhkU1RqZ2tXaHF3VDhvOEkreDlwc1JJdCsraGVaZGxmRkpGMWttQUpJSDlmNUJWRFpld29VM2g4cjVnVFd5aGZPWHFKQldodjE3bnBZb1MxNWVNWWpaKzd5a3dTU3Y2Mmt1bGxSTVVXQ0NjL2krNm1RcFp1WTBoNjNlWW96d3RKUFlTdnU2NFhlSjNhOFI0VT08L2RzOlNpZ25hdHVyZVZhbHVlPg0KPGRzOktleUluZm8+PGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQ2dUQ0NBZW9DQ1FDYk9scldEZFg3RlRBTkJna3Foa2lHOXcwQkFRVUZBRENCaERFTE1Ba0dBMVVFQmhNQ1RrOHhHREFXQmdOVkJBZ1REMEZ1WkhKbFlYTWdVMjlzWW1WeVp6RU1NQW9HQTFVRUJ4TURSbTl2TVJBd0RnWURWUVFLRXdkVlRrbE9SVlJVTVJnd0ZnWURWUVFERXc5bVpXbGtaUzVsY214aGJtY3VibTh4SVRBZkJna3Foa2lHOXcwQkNRRVdFbUZ1WkhKbFlYTkFkVzVwYm1WMGRDNXViekFlRncwd056QTJNVFV4TWpBeE16VmFGdzB3TnpBNE1UUXhNakF4TXpWYU1JR0VNUXN3Q1FZRFZRUUdFd0pPVHpFWU1CWUdBMVVFQ0JNUFFXNWtjbVZoY3lCVGIyeGlaWEpuTVF3d0NnWURWUVFIRXdOR2IyOHhFREFPQmdOVkJBb1RCMVZPU1U1RlZGUXhHREFXQmdOVkJBTVREMlpsYVdSbExtVnliR0Z1Wnk1dWJ6RWhNQjhHQ1NxR1NJYjNEUUVKQVJZU1lXNWtjbVZoYzBCMWJtbHVaWFIwTG01dk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGl2YmhSN1A1MTZ4L1MzQnFLeHVwUWUwTE9Ob2xpdXBpQk9lc0NPM1NIYkRybDMrcTlJYmZuZm1FMDRyTnVNY1BzSXhCMTYxVGREcEllc0xDbjdjOGFQSElTS090UGxBZVRaU25iOFFBdTdhUmpacTMrUGJyUDV1VzNUY2ZDR1B0S1R5dEhPZ2UvT2xKYm8wNzhkVmhYUTE0ZDFFRHdYSlcxclJYdVV0NEM4UUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFDRFZmcDg2SE9icVkrZThCVW9XUTkrVk1ReDFBU0RvaEJqd09zZzJXeWtVcVJYRitkTGZjVUg5ZFdSNjNDdFpJS0ZEYlN0Tm9tUG5RejduYksrb255Z3dCc3BWRWJuSHVVaWhacTNaVWRtdW1RcUN3NFV2cy8xVXZxM29yT28vV0pWaFR5dkxnRlZLMlFhclE0LzY3T1pmSGQ3UitQT0JYaG9waFNNdjFaT288L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48c2FtbDpTdWJqZWN0PjxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9Imh0dHBzOi8vcGl0YnVsay5uby1pcC5vcmcvbmV3b25lbG9naW4vZGVtbzEvbWV0YWRhdGEucGhwIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnRyYW5zaWVudCI+X2I5OGY5OGJiMWFiNTEyY2VkNjUzYjU4YmFhZmY1NDM0NDhkYWVkNTM1ZDwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMTowOVoiIFJlY2lwaWVudD0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9pbmRleC5waHA/YWNzIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzVkOWUzMTljMWI4YTY3ZGE0ODIyNzk2NGMyOGQyODBlNzg2MGY4MDQiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxNC0wMy0yMVQxMzo0MDozOVoiIE5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMTowOVoiPjxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PHNhbWw6QXVkaWVuY2U+aHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+PC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PC9zYW1sOkNvbmRpdGlvbnM+PHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAxNC0wMy0yMVQyMTo0MTowOVoiIFNlc3Npb25JbmRleD0iXzlmZTBjOGRjZDMzMDJlNzM2NGZjYWIyMmE1Mjc0OGViZjIyMjRkZjBhYSI+PHNhbWw6QXV0aG5Db250ZXh0PjxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPjwvc2FtbDpBdXRobkNvbnRleHQ+PC9zYW1sOkF1dGhuU3RhdGVtZW50PjxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGUgTmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0PC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3RAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0ic24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPndhYTI8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iZWR1UGVyc29uQWZmaWxpYXRpb24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnVzZXI8L3NhbWw6QXR0cmlidXRlVmFsdWU+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+YWRtaW48L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pjwvc2FtbDpBc3NlcnRpb24+PC9zYW1scDpSZXNwb25zZT4= \ No newline at end of file +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGE0NGYyNzA1LTFhOTYtZDFmMS1kZDdmLTc2YTliYzY2ZjYyOCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDE6MDlaIiBEZXN0aW5hdGlvbj0iIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzVkOWUzMTljMWI4YTY3ZGE0ODIyNzk2NGMyOGQyODBlNzg2MGY4MDQiPjxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeGE0NGYyNzA1LTFhOTYtZDFmMS1kZDdmLTc2YTliYzY2ZjYyOCI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+NWVqaURNeEE2b01sUEh0Mnh5Q3BXbkhoakFvPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT56OURHRUd2cEJXWHUwdSt5VzlVdUNaNE4wUmVPZ044bHNOakhjb2syS0dlSFExTEtKNzFqdjMveG5TbTR0aXBZcEt4TDhyMU5OTDF4a1gvSUc5YTVEaGVmWFZldm5YK1ljQi9LeDBLNkdTbW1ocFp6ckpXUEhmcmx5RU5wZnRPdUhQUWFab2YwaFVnWGEyZm05SGlxTm90QzZ6RmIxOWRUNE1IMHdqelpOYWc9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PHNhbWxwOlN0YXR1cz48c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+PHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDAzYTY1NjdmLTQwMTQtZWUyMC04YWQ2LTY4OTE0OWYzNGU3ZiIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTQtMDMtMjFUMTM6NDE6MDlaIj48c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaHR0cHM6Ly9waXRidWxrLm5vLWlwLm9yZy9uZXdvbmVsb2dpbi9kZW1vMS9tZXRhZGF0YS5waHAiIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5fYjk4Zjk4YmIxYWI1MTJjZWQ2NTNiNThiYWFmZjU0MzQ0OGRhZWQ1MzVkPC9zYW1sOk5hbWVJRD48c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIzLTA5LTIyVDE5OjAxOjA5WiIgUmVjaXBpZW50PSJodHRwczovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iT05FTE9HSU5fNWQ5ZTMxOWMxYjhhNjdkYTQ4MjI3OTY0YzI4ZDI4MGU3ODYwZjgwNCIvPjwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPjwvc2FtbDpTdWJqZWN0PjxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDE0LTAzLTIxVDEzOjQwOjM5WiIgTm90T25PckFmdGVyPSIyMDIzLTA5LTIyVDE5OjAxOjA5WiI+PHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+PC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PC9zYW1sOkNvbmRpdGlvbnM+PHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDE0LTAzLTIxVDEzOjQxOjA5WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAyMy0wOS0yMlQxOTowMTowOVoiIFNlc3Npb25JbmRleD0iXzlmZTBjOGRjZDMzMDJlNzM2NGZjYWIyMmE1Mjc0OGViZjIyMjRkZjBhYSI+PHNhbWw6QXV0aG5Db250ZXh0PjxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPjwvc2FtbDpBdXRobkNvbnRleHQ+PC9zYW1sOkF1dGhuU3RhdGVtZW50PjxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGUgTmFtZT0idWlkIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj50ZXN0PC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3RAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0ic24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPndhYTI8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iZWR1UGVyc29uQWZmaWxpYXRpb24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnVzZXI8L3NhbWw6QXR0cmlidXRlVmFsdWU+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+YWRtaW48L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pjwvc2FtbDpBc3NlcnRpb24+PC9zYW1scDpSZXNwb25zZT4= \ No newline at end of file From c898e943fdf2fe5e249d0485219ff60a1792cd8e Mon Sep 17 00:00:00 2001 From: Davide Porrovecchio Date: Sat, 5 Oct 2019 12:18:31 +0200 Subject: [PATCH 103/236] Add keys to SettingsTest --- tests/src/OneLogin/Saml2/SettingsTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 00e3d903..561e774f 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -919,6 +919,8 @@ public function testGetSecurityData() $this->assertArrayHasKey('requestedAuthnContext', $security); $this->assertArrayHasKey('wantXMLValidation', $security); $this->assertArrayHasKey('wantNameId', $security); + $this->assertArrayHasKey('relaxDestinationValidation', $security); + $this->assertArrayHasKey('destinationStrictlyMatches', $security); } /** From 791066ad7284970bb970e31ec8cbcbf1c466eb66 Mon Sep 17 00:00:00 2001 From: Vitalii Shtykno Date: Tue, 15 Oct 2019 16:58:50 +0300 Subject: [PATCH 104/236] Remove Comparison atribute for empty value --- lib/Saml2/AuthnRequest.php | 9 +++++++-- tests/src/OneLogin/Saml2/AuthnRequestTest.php | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/AuthnRequest.php b/lib/Saml2/AuthnRequest.php index 2da1046e..fc6d3237 100644 --- a/lib/Saml2/AuthnRequest.php +++ b/lib/Saml2/AuthnRequest.php @@ -111,15 +111,20 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal $authnComparison = $security['requestedAuthnContextComparison']; } + $authnComparisonAttr = ''; + if (!empty($authnComparison)) { + $authnComparisonAttr = sprintf('Comparison="%s"', $authnComparison); + } + if ($security['requestedAuthnContext'] === true) { $requestedAuthnStr = << + urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport REQUESTEDAUTHN; } else { - $requestedAuthnStr .= " \n"; + $requestedAuthnStr .= " \n"; foreach ($security['requestedAuthnContext'] as $contextValue) { $requestedAuthnStr .= " ".$contextValue."\n"; } diff --git a/tests/src/OneLogin/Saml2/AuthnRequestTest.php b/tests/src/OneLogin/Saml2/AuthnRequestTest.php index 7d1ab056..f3eea822 100644 --- a/tests/src/OneLogin/Saml2/AuthnRequestTest.php +++ b/tests/src/OneLogin/Saml2/AuthnRequestTest.php @@ -94,6 +94,14 @@ public function testAuthNContext() $decoded5 = base64_decode($encodedRequest5); $request5 = gzinflate($decoded5); $this->assertContains('', $request5); + + $settingsInfo['security']['requestedAuthnContextComparison'] = ''; + $settings6 = new OneLogin_Saml2_Settings($settingsInfo); + $authnRequest6 = new OneLogin_Saml2_AuthnRequest($settings6); + $encodedRequest6 = $authnRequest6->getRequest(); + $decoded6 = base64_decode($encodedRequest6); + $request6 = gzinflate($decoded6); + $this->assertContains('', $request6); } /** From d868c41533d68627557942795bdf55a7902a7ce6 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 6 Nov 2019 17:23:58 +0100 Subject: [PATCH 105/236] Update xmlseclibs to 3.0.4 --- extlib/xmlseclibs/xmlseclibs.php | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/extlib/xmlseclibs/xmlseclibs.php b/extlib/xmlseclibs/xmlseclibs.php index bd3caa5f..d1095c8a 100644 --- a/extlib/xmlseclibs/xmlseclibs.php +++ b/extlib/xmlseclibs/xmlseclibs.php @@ -2,7 +2,7 @@ /** * xmlseclibs.php * - * Copyright (c) 2007-2015, Robert Richards . + * Copyright (c) 2007-2019, Robert Richards . * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,9 +35,9 @@ * POSSIBILITY OF SUCH DAMAGE. * * @author Robert Richards - * @copyright 2007-2015 Robert Richards + * @copyright 2007-2019 Robert Richards * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version 2.0.0 modified + * @version 3.0.4 modified */ class XMLSecurityKey { @@ -589,6 +589,11 @@ public function locateSignature($objDoc, $pos=0) { $query = ".//secdsig:Signature"; $nodeset = $xpath->query($query, $objDoc); $this->sigNode = $nodeset->item($pos); + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length > 1) { + throw new Exception("Invalid structure - Too many SignedInfo elements found"); + } return $this->sigNode; } return null; @@ -675,6 +680,9 @@ public function canonicalizeSignedInfo() { $xpath = $this->getXPathObj(); $query = "./secdsig:SignedInfo"; $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length > 1) { + throw new Exception("Invalid structure - Too many SignedInfo elements found"); + } if ($signInfoNode = $nodeset->item(0)) { $query = "./secdsig:CanonicalizationMethod"; $nodeset = $xpath->query($query, $signInfoNode); @@ -790,7 +798,7 @@ public function processTransforms($refNode, $objData, $includeCommentNodes = tru if ($node->localName == 'XPath') { $arXPath = array(); $arXPath['query'] = '(.//. | .//@* | .//namespace::*)['.$node->nodeValue.']'; - $arXpath['namespaces'] = array(); + $arXPath['namespaces'] = array(); $nslist = $xpath->query('./namespace::*', $node); foreach ($nslist AS $nsnode) { if ($nsnode->localName != "xml") { @@ -888,7 +896,7 @@ public function getRefIDs() { $refids = array(); $xpath = $this->getXPathObj(); - $query = "./secdsig:SignedInfo/secdsig:Reference"; + $query = "./secdsig:SignedInfo[1]/secdsig:Reference"; $nodeset = $xpath->query($query, $this->sigNode); if ($nodeset->length == 0) { throw new Exception("Reference nodes not found"); @@ -905,7 +913,7 @@ public function validateReference() { $this->sigNode->parentNode->removeChild($this->sigNode); } $xpath = $this->getXPathObj(); - $query = "./secdsig:SignedInfo/secdsig:Reference"; + $query = "./secdsig:SignedInfo[1]/secdsig:Reference"; $nodeset = $xpath->query($query, $this->sigNode); if ($nodeset->length == 0) { throw new Exception("Reference nodes not found"); From 0c44b699c12e7d5296f13d1ba3620792b2e89895 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 6 Nov 2019 17:25:01 +0100 Subject: [PATCH 106/236] Release 2.17.1 --- CHANGELOG | 4 ++++ lib/Saml2/version.json | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7e240dcc..152ebdf3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,9 @@ CHANGELOG ========= +v.2.17.1 +* Update xmlseclibs to 3.0.4 +* Remove Comparison atribute from RequestedAuthnContext when setting has empty value + v.2.17.0 * Set true as the default value for strict setting * Support 'x509cert' and 'privateKey' on signMetadata security settings diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 2dcd57f4..7c74ba40 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.17.0", - "released": "11/09/2019" + "version": "2.17.1", + "released": "06/11/2019" } } From aa7e0f24cf287d44f618f7634b8464a3b4645472 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 6 Nov 2019 17:32:50 +0100 Subject: [PATCH 107/236] Add notification about CVE-2019-3465 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 12289672..34de15c0 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ and supported by OneLogin Inc. Warning ------- +Version 2.17.1 updates xmlseclibs to 3.0.4 (CVE-2019-3465), but php-saml was not directly affected since it implements additional checks that prevent to exploit that vulnerability. + Version 2.17.0 sets strict mode active by default Update php-saml to 2.15.0, this version includes a security patch related to XEE attacks From edbab290b39656fef77b0b95535b8fa60e6915bb Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 8 Nov 2019 18:36:45 +0100 Subject: [PATCH 108/236] Update xmlseclibs changelog --- extlib/xmlseclibs/CHANGELOG.txt | 64 ++++++++++++++++++++++++++++++--- extlib/xmlseclibs/LICENSE | 2 +- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/extlib/xmlseclibs/CHANGELOG.txt b/extlib/xmlseclibs/CHANGELOG.txt index c0b8cfe4..642fcda8 100644 --- a/extlib/xmlseclibs/CHANGELOG.txt +++ b/extlib/xmlseclibs/CHANGELOG.txt @@ -1,8 +1,64 @@ xmlseclibs.php -??, ??? ????, 2.0.0 -Features: -- Support for locating specific signature when multiple exist in - document. (griga3k) + +06, Nov 2019, 3.0.4 +Security Improvements: +- Insure only a single SignedInfo element exists within a signature during + verification. Refs CVE-2019-3465. +Bug Fixes: +- Fix variable casing. + +15, Nov 2018, 3.0.3 +Bug Fixes: +- Fix casing of class name. (Willem Stuursma-Ruwen) +- Fix Xpath casing. (Tim van Dijen) + +Improvements: +- Make PCRE2 compliant. (Stefan Winter) +- Add PHP 7.3 support. (Stefan Winter) + +27, Sep 2018, 3.0.2 +Security Improvements: +- OpenSSL is now a requirement rather than suggestion. (Slaven Bacelic) +- Filter input to avoid XPath injection. (Jaime Pérez) + +Bug Fixes: +- Fix missing parentheses (Tim van Dijen) + +Improvements: +- Use strict comparison operator to compare digest values. (Jaime Pérez) +- Remove call to file_get_contents that doesn't even work. (Jaime Pérez) +- Document potentially dangerous return value behaviour. (Thijs Kinkhorst) + +31, Aug 2017, 3.0.1 +Bug Fixes: +- Fixed missing () in function call. (Dennis Væversted) + +Improvements: +- Add OneLogin to supported software. +- Add .gitattributes to remove unneeded files. (Filippo Tessarotto) +- Fix bug in example code. (Dan Church) +- Travis: add PHP 7.1, move hhvm to allowed failures. (Thijs Kinkhorst) +- Drop failing extract-win-cert test (Thijs Kinkhorst). (Thijs Kinkhorst) +- Add comments to warn about return values of verify(). (Thijs Kinkhorst) +- Fix tests to properly check return code of verify(). (Thijs Kinkhorst) +- Restore support for PHP >= 5.4. (Jaime Pérez) + +25, May 2017, 3.0.0 +Improvements: +- Remove use of mcrypt (skymeyer) + +08, Sep 2016, 2.0.1 +Bug Fixes: +- Strip whitespace characters when parsing X509Certificate. fixes #84 + (klemen.bratec) +- Certificate 'subject' values can be arrays. fixes #80 (Andreas Stangl) +- HHVM signing node with ID attribute w/out namespace regenerates ID value. + fixes #88 (Milos Tomic) + +Improvements: +- Fix typos and add some PHPDoc Blocks. (gfaust-qb) +- Update lightSAML link. (Milos Tomic) +- Update copyright dates. 23, Jun 2015, 1.4.0 Features: diff --git a/extlib/xmlseclibs/LICENSE b/extlib/xmlseclibs/LICENSE index 2a102b76..0ca76899 100644 --- a/extlib/xmlseclibs/LICENSE +++ b/extlib/xmlseclibs/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2007-2013, Robert Richards . +Copyright (c) 2007-2019, Robert Richards . All rights reserved. Redistribution and use in source and binary forms, with or without From 5ab552a060926bb7178aa8f8a75667f70fd7ead6 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 8 Nov 2019 18:38:29 +0100 Subject: [PATCH 109/236] Check destination against the getSelfURLNoQuery as well on LogoutRequest and LogoutResponse as we do on Response --- lib/Saml2/LogoutRequest.php | 14 +++++++++----- lib/Saml2/LogoutResponse.php | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index e1523903..4217f1ae 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -365,11 +365,15 @@ public function isValid($retrieveParametersFromServer = false) // Check destination if ($dom->documentElement->hasAttribute('Destination')) { $destination = $dom->documentElement->getAttribute('Destination'); - if (!empty($destination) && strpos($destination, $currentURL) === false) { - throw new OneLogin_Saml2_ValidationError( - "The LogoutRequest was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION - ); + if (!empty($destination) && strpos($destination, $currentURL) !== 0) { + $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + + if (strpos($destination, $currentURLNoRouted) !== 0) { + throw new OneLogin_Saml2_ValidationError( + "The LogoutRequest was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION + ); + } } } diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index 20f582a1..3411b007 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -161,11 +161,15 @@ public function isValid($requestId = null, $retrieveParametersFromServer = false // Check destination if ($this->document->documentElement->hasAttribute('Destination')) { $destination = $this->document->documentElement->getAttribute('Destination'); - if (!empty($destination) && strpos($destination, $currentURL) === false) { - throw new OneLogin_Saml2_ValidationError( - "The LogoutResponse was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION - ); + if (!empty($destination) && strpos($destination, $currentURL) !== 0) { + $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + + if (strpos($destination, $currentURLNoRouted) !== 0) { + throw new OneLogin_Saml2_ValidationError( + "The LogoutResponse was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION + ); + } } } From 36aa9554335b2eb07f5add4929a5d4c35499bc19 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 8 Nov 2019 18:39:15 +0100 Subject: [PATCH 110/236] Improve getSelfRoutedURLNoQuery method --- lib/Saml2/Utils.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 248b954c..f2747110 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -626,7 +626,7 @@ public static function getSelfRoutedURLNoQuery() if (!empty($_SERVER['REQUEST_URI'])) { $route = $_SERVER['REQUEST_URI']; if (!empty($_SERVER['QUERY_STRING'])) { - $route = str_replace($_SERVER['QUERY_STRING'], '', $route); + $route = self::str_lreplace($_SERVER['QUERY_STRING'], '', $route); if (substr($route, -1) == '?') { $route = substr($route, 0, -1); } @@ -639,9 +639,26 @@ public static function getSelfRoutedURLNoQuery() } $selfRoutedURLNoQuery = $selfURLhost . $route; + + $pos = strpos($selfRoutedURLNoQuery, "?"); + if ($pos !== false) { + $selfRoutedURLNoQuery = substr($selfRoutedURLNoQuery, 0, $pos-1); + } + return $selfRoutedURLNoQuery; } + public static function str_lreplace($search, $replace, $subject) + { + $pos = strrpos($subject, $search); + + if ($pos !== false) { + $subject = substr_replace($subject, $replace, $pos, strlen($search)); + } + + return $subject; + } + /** * Returns the URL of the current host + current view + query. * From 61f4df58b3d33870fb478779155e72595af084aa Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 8 Nov 2019 21:15:35 +0100 Subject: [PATCH 111/236] Fix #407 Only add responseUrl to the settings if ResponseLocation present --- lib/Saml2/IdPMetadataParser.php | 5 ++++- tests/src/OneLogin/Saml2/IdPMetadataParserTest.php | 5 ----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index 7d2220d6..ca385644 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -142,9 +142,12 @@ public static function parseXML($xml, $entityId = null, $desiredNameIdFormat = n if ($sloNodes->length > 0) { $metadataInfo['idp']['singleLogoutService'] = array( 'url' => $sloNodes->item(0)->getAttribute('Location'), - 'responseUrl' => $sloNodes->item(0)->getAttribute('ResponseLocation'), 'binding' => $sloNodes->item(0)->getAttribute('Binding') ); + + if ($sloNodes->item(0)->hasAttribute('ResponseLocation')) { + $metadataInfo['idp']['singleLogoutService']['responseUrl'] = $sloNodes->item(0)->getAttribute('ResponseLocation'); + } } $keyDescriptorCertSigningNodes = OneLogin_Saml2_Utils::query($dom, './md:KeyDescriptor[not(contains(@use, "encryption"))]/ds:KeyInfo/ds:X509Data/ds:X509Certificate', $idpDescriptor); diff --git a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php index 1198176a..797b5c75 100644 --- a/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php +++ b/tests/src/OneLogin/Saml2/IdPMetadataParserTest.php @@ -21,7 +21,6 @@ public function testParseFileXML() ), 'singleLogoutService' => array ( 'url' => 'https://example.onelogin.com/trust/saml2/http-redirect/slo/645460', - 'responseUrl' => '', 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' ), 'x509cert' => 'MIIEZTCCA02gAwIBAgIUPyy/A3bZAZ4m28PzEUUoT7RJhxIwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UEBhMCVVMxKzApBgNVBAoMIk9uZUxvZ2luIFRlc3QgKHNnYXJjaWEtdXMtcHJlcHJvZCkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA4OTE0NjAeFw0xNjA4MDQyMjI5MzdaFw0yMTA4MDUyMjI5MzdaMHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN6iqQGcLOCglNO42I2rkzE05UXSiMXT6c8ALThMMiaDw6qqzo3sd/tKK+NcNKWLIIC8TozWVyh5ykUiVZps+08xil7VsTU7E+wKu3kvmOsvw2wlRwtnoKZJwYhnr+RkBa+h1r3ZYUgXm1ZPeHMKj1g18KaWz9+MxYL6BhKqrOzfW/P2xxVRcFH7/pq+ZsDdgNzD2GD+apzY4MZyZj/N6BpBWJ0GlFsmtBegpbX3LBitJuFkk5L4/U/jjF1AJa3boBdCUVfATqO5G03H4XS1GySjBIRQXmlUF52rLjg6xCgWJ30/+t1X+IHLJeixiQ0vxyh6C4/usCEt94cgD1r8ADAgMBAAGjgfIwge8wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUPW0DcH0G3IwynWgi74co4wZ6n7gwga8GA1UdIwSBpzCBpIAUPW0DcH0G3IwynWgi74co4wZ6n7ihdqR0MHIxCzAJBgNVBAYTAlVTMSswKQYDVQQKDCJPbmVMb2dpbiBUZXN0IChzZ2FyY2lhLXVzLXByZXByb2QpMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgODkxNDaCFD8svwN22QGeJtvD8xFFKE+0SYcSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAQhB4q9jrycwbHrDSoYR1X4LFFzvJ9Us75wQquRHXpdyS9D6HUBXMGI6ahPicXCQrfLgN8vzMIiqZqfySXXv/8/dxe/X4UsWLYKYJHDJmxXD5EmWTa65chjkeP1oJAc8f3CKCpcP2lOBTthbnk2fEVAeLHR4xNdQO0VvGXWO9BliYPpkYqUIBvlm+Fg9mF7AM/Uagq2503XXIE1Lq//HON68P10vNMwLSKOtYLsoTiCnuIKGJqG37MsZVjQ1ZPRcO+LSLkq0i91gFxrOrVCrgztX4JQi5XkvEsYZGIXXjwHqxTVyt3adZWQO0LPxPqRiUqUzyhDhLo/xXNrHCu4VbMw==' @@ -182,7 +181,6 @@ public function testParseDesiredBindingAll() ), "singleLogoutService" => array( "url" => "http://idp.example.com/logout", - 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ) ) @@ -300,7 +298,6 @@ public function testParseMultiCerts() "idp" => array( "singleLogoutService" => array( "url" => "https://idp.examle.com/saml/slo", - 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ), "x509certMulti" => array( @@ -340,7 +337,6 @@ public function testParseMultiSigningCerts() "idp" => array( "singleLogoutService" => array( "url" => "https://idp.examle.com/saml/slo", - 'responseUrl' => '', "binding" => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" ), "x509certMulti" => array( @@ -440,7 +436,6 @@ public function testInjectIntoSettings() ), 'singleLogoutService' => array ( 'url' => 'https://idp.adfs.example.com/adfs/ls/', - 'responseUrl' => '', 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' ), 'x509certMulti' => array ( From 6af4a7bdbc03a4f66df9601b0100b1edd3567f9e Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sat, 9 Nov 2019 08:26:40 +0100 Subject: [PATCH 112/236] Fix #395 Bad use of on static method validateBinarySign --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index f2747110..ddcea66f 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -1549,7 +1549,7 @@ public static function validateBinarySign($messageType, $getData, $idpData, $ret } } - if ($objKey->verifySignature($signedQuery, base64_decode($_GET['Signature'])) === 1) { + if ($objKey->verifySignature($signedQuery, base64_decode($getData['Signature'])) === 1) { $signatureValid = true; break; } From 4ff22ef9ece38839e798313e95e882432857ac94 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sat, 9 Nov 2019 08:35:25 +0100 Subject: [PATCH 113/236] Fix #391 Invalid error message when assertion and nameid was encrypted --- lib/Saml2/Response.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 55e480d6..48c92275 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -354,7 +354,7 @@ public function isValid($requestId = null) $encryptedIDNodes = OneLogin_Saml2_Utils::query($this->decryptedDocument, '/samlp:Response/saml:Assertion/saml:Subject/saml:EncryptedID'); if ($encryptedIDNodes->length > 0) { throw new OneLogin_Saml2_ValidationError( - 'Unsigned SAML Response that contains a signed and encrypted Assertion with encrypted nameId is not supported.', + 'SAML Response that contains a an encrypted Assertion with encrypted nameId is not supported.', OneLogin_Saml2_ValidationError::NOT_SUPPORTED ); } @@ -756,7 +756,7 @@ public function getAttributesWithFriendlyName() * * @throws OneLogin_Saml2_ValidationError */ - private function _getAttributesByKeyName($keyName="Name") + private function _getAttributesByKeyName($keyName = "Name") { $attributes = array(); @@ -1148,7 +1148,7 @@ protected function _decryptAssertion($dom) /** * After execute a validation process, if fails this method returns the cause * - * @return string Cause + * @return string Cause */ public function getError() { From 0c557b45dde31300f239a65a429481f0e05e3942 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sun, 10 Nov 2019 10:01:24 +0100 Subject: [PATCH 114/236] Fix #386. Support rejecting unsolicited SAMLResponses. Reject SAMLResponse if requestID was provided to the validotr but the InResponseTo attributeof the SAMLResponse is missing --- README.md | 6 ++ advanced_settings_example.php | 4 ++ lib/Saml2/Response.php | 21 ++++++- lib/Saml2/Settings.php | 5 ++ lib/Saml2/version.json | 2 +- .../invalid_unpaired_inresponsesto.xml.base64 | 1 + tests/src/OneLogin/Saml2/ResponseTest.php | 63 +++++++++++++++++++ 7 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 diff --git a/README.md b/README.md index 34de15c0..fa25e8de 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ and supported by OneLogin Inc. Warning ------- +Version 2.18.0 introduces the 'rejectUnsolicitedResponsesWithInResponseTo' setting parameter, by default disabled, that will allow invalidate unsolicited SAMLResponse. This version as well will reject SAMLResponse if requestId was provided to the validator but the SAMLResponse does not contain a InResponseTo attribute. + Version 2.17.1 updates xmlseclibs to 3.0.4 (CVE-2019-3465), but php-saml was not directly affected since it implements additional checks that prevent to exploit that vulnerability. Version 2.17.0 sets strict mode active by default @@ -511,6 +513,10 @@ $advancedSettings = array ( // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, SAMLResponses with an InResponseTo value will be rejectd if not + // AuthNRequest ID provided to the validation method. + 'rejectUnsolicitedResponsesWithInResponseTo' => false, + // Algorithm that the toolkit will use on signing process. Options: // 'http://www.w3.org/2000/09/xmldsig#rsa-sha1' // 'http://www.w3.org/2000/09/xmldsig#dsa-sha1' diff --git a/advanced_settings_example.php b/advanced_settings_example.php index 99d0c044..1bb6c832 100644 --- a/advanced_settings_example.php +++ b/advanced_settings_example.php @@ -85,6 +85,10 @@ // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, SAMLResponses with an InResponseTo value will be rejectd if not + // AuthNRequest ID provided to the validation method. + 'rejectUnsolicitedResponsesWithInResponseTo' => false, + // Algorithm that the toolkit will use on signing process. Options: // 'http://www.w3.org/2000/09/xmldsig#rsa-sha1' // 'http://www.w3.org/2000/09/xmldsig#dsa-sha1' diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 48c92275..15ec846b 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -166,18 +166,33 @@ public function isValid($requestId = null) $currentURL = OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery(); + $responseInResponseTo = null; if ($this->document->documentElement->hasAttribute('InResponseTo')) { $responseInResponseTo = $this->document->documentElement->getAttribute('InResponseTo'); } - // Check if the InResponseTo of the Response matchs the ID of the AuthNRequest (requestId) if provided - if (isset($requestId) && isset($responseInResponseTo) && $requestId != $responseInResponseTo) { + if (!isset($requestId) && isset($responseInResponseTo) && $security['rejectUnsolicitedResponsesWithInResponseTo']) { throw new OneLogin_Saml2_ValidationError( - "The InResponseTo of the Response: $responseInResponseTo, does not match the ID of the AuthNRequest sent by the SP: $requestId", + "The Response has an InResponseTo attribute: " . $responseInResponseTo . " while no InResponseTo was expected", OneLogin_Saml2_ValidationError::WRONG_INRESPONSETO ); } + // Check if the InResponseTo of the Response matchs the ID of the AuthNRequest (requestId) if provided + if (isset($requestId) && $requestId != $responseInResponseTo) { + if ($responseInResponseTo == null) { + throw new OneLogin_Saml2_ValidationError( + "No InResponseTo at the Response, but it was provided the requestId related to the AuthNRequest sent by the SP: $requestId", + OneLogin_Saml2_ValidationError::WRONG_INRESPONSETO + ); + } else { + throw new OneLogin_Saml2_ValidationError( + "The InResponseTo of the Response: $responseInResponseTo, does not match the ID of the AuthNRequest sent by the SP: $requestId", + OneLogin_Saml2_ValidationError::WRONG_INRESPONSETO + ); + } + } + if (!$this->encrypted && $security['wantAssertionsEncrypted']) { throw new OneLogin_Saml2_ValidationError( "The assertion of the Response is not encrypted and the SP requires it", diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index 67410cf0..e8cf78bb 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -385,6 +385,11 @@ private function _addDefaultValues() $this->_security['relaxDestinationValidation'] = false; } + // InResponseTo + if (!isset($this->_security['rejectUnsolicitedResponsesWithInResponseTo'])) { + $this->_security['rejectUnsolicitedResponsesWithInResponseTo'] = false; + } + // encrypt expected if (!isset($this->_security['wantAssertionsEncrypted'])) { $this->_security['wantAssertionsEncrypted'] = false; diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 7c74ba40..9f151295 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.17.1", + "version": "2.18.0", "released": "06/11/2019" } } diff --git a/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 b/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 new file mode 100644 index 00000000..87ce60fc --- /dev/null +++ b/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 @@ -0,0 +1 @@ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4gICAgDQogICAgPHNhbWw6U3ViamVjdD4NCiAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9ImhlbGxvLmNvbSIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6TmFtZUlEPg0KICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPg0KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89ImludmFsaWRfaW5yZXNwb25zZSIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 54097a42..5d1f7436 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -1280,6 +1280,69 @@ public function testIsInValidRequestId() $this->assertContains('No Signature found. SAML Response rejected', $response2->getError()); } + /** + * Tests the isValid method of the OneLogin_Saml2_Response class + * Case Invalid Response, Unexpected InResponseTo + * + * @covers OneLogin_Saml2_Response::isValid + */ + public function testIsInValidUnexpectedInResponseTo() + { + $xml = file_get_contents(TEST_ROOT . '/data/responses/unsigned_response.xml.base64'); + + $plainMessage = base64_decode($xml); + $currentURL = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + $plainMessage = str_replace('http://stuff.com/endpoints/endpoints/acs.php', $currentURL, $plainMessage); + $message = base64_encode($plainMessage); + + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + $settingsInfo['security']['rejectUnsolicitedResponsesWithInResponseTo'] = true; + $settingsInfo['strict'] = true; + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $response = new OneLogin_Saml2_Response($settings, $message); + + $inResponseTo = "_57bcbf70-7b1f-012e-c821-782bcb13bb38"; + + $response->isValid(); + $this->assertEquals('The Response has an InResponseTo attribute: '.$inResponseTo.' while no InResponseTo was expected', $response->getError()); + + $response->isValid($inResponseTo); + $this->assertContains('No Signature found. SAML Response rejected', $response->getError()); + } + + /** + * Tests the isValid method of the OneLogin_Saml2_Response class + * Case Invalid Response, No InResponseTo + * + * @covers OneLogin_Saml2_Response::isValid + */ + public function testIsInValidNoInResponseTo() + { + $xml = file_get_contents(TEST_ROOT . '/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64'); + + $plainMessage = base64_decode($xml); + $currentURL = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + $plainMessage = str_replace('http://stuff.com/endpoints/endpoints/acs.php', $currentURL, $plainMessage); + $message = base64_encode($plainMessage); + + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + $settingsInfo['security']['rejectUnsolicitedResponsesWithInResponseTo'] = true; + $settingsInfo['strict'] = true; + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $response = new OneLogin_Saml2_Response($settings, $message); + + $inResponseTo = "_57bcbf70-7b1f-012e-c821-782bcb13bb38"; + + $response->isValid(); + $this->assertContains('No Signature found. SAML Response rejected', $response->getError()); + + $response->isValid($inResponseTo); + $this->assertEquals('No InResponseTo at the Response, but it was provided the requestId related to the AuthNRequest sent by the SP: '.$inResponseTo, $response->getError()); + } /** * Tests the isValid method of the OneLogin_Saml2_Response class From c0bf17218081ed575dc21b2882568c4ee0276c81 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sun, 10 Nov 2019 10:25:17 +0100 Subject: [PATCH 115/236] Add additional way to get the toolkit: git clone --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fa25e8de..f1e8ea62 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,11 @@ Since [PHP 5.3 is officially unsupported](http://php.net/eol.php) we recommend y ### Code ### -#### Option 1. Download from github #### +#### Option 1. clone the repository from github #### + +git clone git@github.com:onelogin/php-saml.git + +#### Option 2. Download from github #### The toolkit is hosted on github. You can download it from: @@ -115,7 +119,10 @@ Copy the core of the library inside the php application. (each application has i structure so take your time to locate the PHP SAML toolkit in the best place). See the "Guide to add SAML support to my app" to know how. -#### Option 2. Composer #### +Take in mind that the compressed file only contains the main files. +If you plan to play with the demos, use the Option 1. + +#### Option 3. Composer #### The toolkit supports [composer](https://getcomposer.org/). You can find the `onelogin/php-saml` package at https://packagist.org/packages/onelogin/php-saml From c5b05cd9cc7bed1c81c2f37ef6e3eef2cb2b3ac7 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 13 Nov 2019 15:58:14 +0100 Subject: [PATCH 116/236] Update changelog --- CHANGELOG | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 152ebdf3..ccdba903 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,14 @@ CHANGELOG ========= +v.2.18.0 +* Support rejecting unsolicited SAMLResponses. +* Reject SAMLResponse if requestID was provided to the validotr but the InResponseTo attributeof the SAMLResponse is missing +* Check destination against the getSelfURLNoQuery as well on LogoutRequest and LogoutResponse as we do on Response +* Improve getSelfRoutedURLNoQuery method +* Only add responseUrl to the settings if ResponseLocation present in the IdPMetadataParser +* Remove use of $_GET on static method validateBinarySign +* Fix error message when Assertion and NameId are both encrypted (not supported) + v.2.17.1 * Update xmlseclibs to 3.0.4 * Remove Comparison atribute from RequestedAuthnContext when setting has empty value From e163da23e814d7569a8b723e4c6a72b2186c80ba Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 13 Nov 2019 16:43:01 +0100 Subject: [PATCH 117/236] Ability to set custom schema path --- lib/Saml2/LogoutRequest.php | 2 +- lib/Saml2/LogoutResponse.php | 2 +- lib/Saml2/Response.php | 4 ++-- lib/Saml2/Settings.php | 18 ++++++++++++++++-- lib/Saml2/Utils.php | 14 ++++++++++---- tests/src/OneLogin/Saml2/SettingsTest.php | 18 ++++++++++++++++-- 6 files changed, 46 insertions(+), 12 deletions(-) diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index 4217f1ae..b9c6bfcf 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -340,7 +340,7 @@ public function isValid($retrieveParametersFromServer = false) $security = $this->_settings->getSecurityData(); if ($security['wantXMLValidation']) { - $res = OneLogin_Saml2_Utils::validateXML($dom, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive()); + $res = OneLogin_Saml2_Utils::validateXML($dom, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive(), $this->_settings->getSchemasPath()); if (!$res instanceof DOMDocument) { throw new OneLogin_Saml2_ValidationError( "Invalid SAML Logout Request. Not match the saml-schema-protocol-2.0.xsd", diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index 3411b007..39bbf9fc 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -127,7 +127,7 @@ public function isValid($requestId = null, $retrieveParametersFromServer = false $security = $this->_settings->getSecurityData(); if ($security['wantXMLValidation']) { - $res = OneLogin_Saml2_Utils::validateXML($this->document, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive()); + $res = OneLogin_Saml2_Utils::validateXML($this->document, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive(), $this->_settings->getSchemasPath()); if (!$res instanceof DOMDocument) { throw new OneLogin_Saml2_ValidationError( "Invalid SAML Logout Response. Not match the saml-schema-protocol-2.0.xsd", diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 15ec846b..29979faf 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -143,7 +143,7 @@ public function isValid($requestId = null) if ($security['wantXMLValidation']) { $errorXmlMsg = "Invalid SAML Response. Not match the saml-schema-protocol-2.0.xsd"; - $res = OneLogin_Saml2_Utils::validateXML($this->document, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive()); + $res = OneLogin_Saml2_Utils::validateXML($this->document, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive(), $this->_settings->getSchemasPath()); if (!$res instanceof DOMDocument) { throw new OneLogin_Saml2_ValidationError( $errorXmlMsg, @@ -153,7 +153,7 @@ public function isValid($requestId = null) # If encrypted, check also the decrypted document if ($this->encrypted) { - $res = OneLogin_Saml2_Utils::validateXML($this->decryptedDocument, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive()); + $res = OneLogin_Saml2_Utils::validateXML($this->decryptedDocument, 'saml-schema-protocol-2.0.xsd', $this->_settings->isDebugActive(), $this->_settings->getSchemasPath()); if (!$res instanceof DOMDocument) { throw new OneLogin_Saml2_ValidationError( $errorXmlMsg, diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index e8cf78bb..d287e8f4 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -159,7 +159,7 @@ private function _loadPaths() 'base' => $basePath, 'config' => $basePath, 'cert' => $basePath.'certs/', - 'lib' => $basePath.'lib/', + 'lib' => $basePath.'lib/Saml2/', 'extlib' => $basePath.'extlib/' ); @@ -226,9 +226,23 @@ public function getExtLibPath() */ public function getSchemasPath() { + if (isset($this->_paths['schemas'])) { + return $this->_paths['schemas']; + } return $this->_paths['lib'].'schemas/'; } + /** + * Set schemas path + * + * @param string $path + * @return $this + */ + public function setSchemasPath($path) + { + $this->_paths['schemas'] = $path; + } + /** * Loads settings info from a settings Array * @@ -934,7 +948,7 @@ public function validateMetadata($xml) assert('is_string($xml)'); $errors = array(); - $res = OneLogin_Saml2_Utils::validateXML($xml, 'saml-schema-metadata-2.0.xsd', $this->_debug); + $res = OneLogin_Saml2_Utils::validateXML($xml, 'saml-schema-metadata-2.0.xsd', $this->_debug, $this->getSchemasPath()); if (!$res instanceof DOMDocument) { $errors[] = $res; } else { diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index ddcea66f..5a7ea51f 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -113,12 +113,13 @@ public static function loadXML($dom, $xml) * @param string|DOMDocument $xml The XML string or document which should be validated. * @param string $schema The schema filename which should be used. * @param bool $debug To disable/enable the debug mode + * @param string $schemaPath Change schema path * * @return string|DOMDocument $dom string that explains the problem or the DOMDocument * * @throws Exception */ - public static function validateXML($xml, $schema, $debug = false) + public static function validateXML($xml, $schema, $debug = false, $schemaPath = null) { assert('is_string($xml) || $xml instanceof DOMDocument'); assert('is_string($schema)'); @@ -136,7 +137,12 @@ public static function validateXML($xml, $schema, $debug = false) } } - $schemaFile = __DIR__.'/schemas/' . $schema; + if (isset($schemaPath)) { + $schemaFile = $schemaPath . $schema; + } else { + $schemaFile = __DIR__ . '/schemas/' . $schema; + } + $oldEntityLoader = libxml_disable_entity_loader(false); $res = $dom->schemaValidate($schemaFile); libxml_disable_entity_loader($oldEntityLoader); @@ -626,7 +632,7 @@ public static function getSelfRoutedURLNoQuery() if (!empty($_SERVER['REQUEST_URI'])) { $route = $_SERVER['REQUEST_URI']; if (!empty($_SERVER['QUERY_STRING'])) { - $route = self::str_lreplace($_SERVER['QUERY_STRING'], '', $route); + $route = self::strLreplace($_SERVER['QUERY_STRING'], '', $route); if (substr($route, -1) == '?') { $route = substr($route, 0, -1); } @@ -648,7 +654,7 @@ public static function getSelfRoutedURLNoQuery() return $selfRoutedURLNoQuery; } - public static function str_lreplace($search, $replace, $subject) + public static function strLreplace($search, $replace, $subject) { $pos = strrpos($subject, $search); diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 00e3d903..3a32d45d 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -95,7 +95,7 @@ public function testGetLibPath() $settings = new OneLogin_Saml2_Settings(); $base = $settings->getBasePath(); - $this->assertEquals($base.'lib/', $settings->getLibPath()); + $this->assertEquals($base.'lib/Saml2/', $settings->getLibPath()); } /** @@ -121,10 +121,24 @@ public function testGetSchemasPath() $settings = new OneLogin_Saml2_Settings(); $base = $settings->getBasePath(); - $this->assertEquals($base.'lib/schemas/', $settings->getSchemasPath()); + $this->assertEquals($base.'lib/Saml2/schemas/', $settings->getSchemasPath()); } + /** + * Tests getSchemasPath method of the Settings + * + * @covers OneLogin_Saml2_Settings::setSchemasPath + */ + public function testSetSchemasPath() + { + $settings = new OneLogin_Saml2_Settings(); + $base = $settings->getBasePath(); + $this->assertEquals($base.'lib/Saml2/schemas/', $settings->getSchemasPath()); + $settings->setSchemasPath('custompath/'); + $this->assertEquals('custompath/', $settings->getSchemasPath()); + } + /** * Tests shouldCompressRequests method of OneLogin_Saml2_Settings. * From 96dd9ef647b7af838123067a5109467dbf65738c Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 13 Nov 2019 17:08:44 +0100 Subject: [PATCH 118/236] Update changelog. Apply strict destination matching also on logout request and logout response --- CHANGELOG | 1 + lib/Saml2/LogoutRequest.php | 23 +++++++++++++++++------ lib/Saml2/LogoutResponse.php | 23 +++++++++++++++++------ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ccdba903..603e07fa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ CHANGELOG ========= v.2.18.0 * Support rejecting unsolicited SAMLResponses. +* Support stric destination matching. * Reject SAMLResponse if requestID was provided to the validotr but the InResponseTo attributeof the SAMLResponse is missing * Check destination against the getSelfURLNoQuery as well on LogoutRequest and LogoutResponse as we do on Response * Improve getSelfRoutedURLNoQuery method diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index b9c6bfcf..b7014866 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -365,15 +365,26 @@ public function isValid($retrieveParametersFromServer = false) // Check destination if ($dom->documentElement->hasAttribute('Destination')) { $destination = $dom->documentElement->getAttribute('Destination'); - if (!empty($destination) && strpos($destination, $currentURL) !== 0) { - $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); - - if (strpos($destination, $currentURLNoRouted) !== 0) { + if (empty($destination)) { + if (!$security['relaxDestinationValidation']) { throw new OneLogin_Saml2_ValidationError( - "The LogoutRequest was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION + "The LogoutRequest has an empty Destination value", + OneLogin_Saml2_ValidationError::EMPTY_DESTINATION ); } + } else { + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURL); + if (strncmp($destination, $currentURL, $urlComparisonLength) !== 0) { + $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURLNoRouted); + + if (strncmp($destination, $currentURLNoRouted, $urlComparisonLength) !== 0) { + throw new OneLogin_Saml2_ValidationError( + "The LogoutRequest was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION + ); + } + } } } diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index 39bbf9fc..bb7da37d 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -161,15 +161,26 @@ public function isValid($requestId = null, $retrieveParametersFromServer = false // Check destination if ($this->document->documentElement->hasAttribute('Destination')) { $destination = $this->document->documentElement->getAttribute('Destination'); - if (!empty($destination) && strpos($destination, $currentURL) !== 0) { - $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); - - if (strpos($destination, $currentURLNoRouted) !== 0) { + if (empty($destination)) { + if (!$security['relaxDestinationValidation']) { throw new OneLogin_Saml2_ValidationError( - "The LogoutResponse was received at $currentURL instead of $destination", - OneLogin_Saml2_ValidationError::WRONG_DESTINATION + "The LogoutResponse has an empty Destination value", + OneLogin_Saml2_ValidationError::EMPTY_DESTINATION ); } + } else { + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURL); + if (strncmp($destination, $currentURL, $urlComparisonLength) !== 0) { + $currentURLNoRouted = OneLogin_Saml2_Utils::getSelfURLNoQuery(); + $urlComparisonLength = $security['destinationStrictlyMatches'] ? strlen($destination) : strlen($currentURLNoRouted); + + if (strncmp($destination, $currentURLNoRouted, $urlComparisonLength) !== 0) { + throw new OneLogin_Saml2_ValidationError( + "The LogoutResponse was received at $currentURL instead of $destination", + OneLogin_Saml2_ValidationError::WRONG_DESTINATION + ); + } + } } } From bbb3c1e27ba38261307836d7926b306e873877f5 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 13 Nov 2019 17:15:01 +0100 Subject: [PATCH 119/236] Typo --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1ae55a52..d5059ee0 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,7 @@ and supported by OneLogin Inc. Warning ------- -Version 2.18.0 introduces the 'rejectUnsolicitedResponsesWithInResponseTo' setting parameter, by default disabled, that will allow invalidate unsolicited SAMLResponse. This version as well will reject SAMLResponse if requestId was provided to the validator but the SAMLResponse does not contain a InResponseTo attribute. -as well as the 'destinationStrictlyMatches' parameter, by default disabled, that will force that the Destination URL should strictly match to the address that process the SAMLResponse. +Version 2.18.0 introduces the 'rejectUnsolicitedResponsesWithInResponseTo' setting parameter, by default disabled, that will allow invalidate unsolicited SAMLResponse. This version as well will reject SAMLResponse if requestId was provided to the validator but the SAMLResponse does not contain a InResponseTo attribute. And an additional setting parameter 'destinationStrictlyMatches', by default disabled, that will force that the Destination URL should strictly match to the address that process the SAMLResponse. Version 2.17.1 updates xmlseclibs to 3.0.4 (CVE-2019-3465), but php-saml was not directly affected since it implements additional checks that prevent to exploit that vulnerability. From a1864313eb4e886bc26a77375ce204fad7027450 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 19 Nov 2019 17:03:59 +0100 Subject: [PATCH 120/236] Release 2.18.0 --- lib/Saml2/version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 9f151295..c7ad54c3 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { "version": "2.18.0", - "released": "06/11/2019" + "released": "19/11/2019" } } From d4407715d9fa705c752c3e3d089f3c47d446cd11 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 25 Nov 2019 18:31:18 +0100 Subject: [PATCH 121/236] Add setSchemasPath to Auth class and fix backward compatibility --- lib/Saml2/Auth.php | 11 +++++++++++ lib/Saml2/Settings.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 591ffd37..43c2f930 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -181,6 +181,17 @@ public function setStrict($value) $this->_settings->setStrict($value); } + /** + * Set schemas path + * + * @param string $path + * @return $this + */ + public function setSchemasPath($path) + { + $this->_paths['schemas'] = $path; + } + /** * Process the SAML Response sent by the IdP. * diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index e9fe5957..fd8a12e6 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -229,7 +229,7 @@ public function getSchemasPath() if (isset($this->_paths['schemas'])) { return $this->_paths['schemas']; } - return $this->_paths['lib'].'schemas/'; + return __DIR__ . '/schemas/'; } /** From a4619e04e8e4b958a941a02125d1d9314ba5f0b3 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Mon, 25 Nov 2019 18:31:38 +0100 Subject: [PATCH 122/236] Release 2.18.1 --- CHANGELOG | 3 +++ lib/Saml2/version.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 603e07fa..526279a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ CHANGELOG ========= +v.2.18.1 +* Add setSchemasPath to Auth class and fix backward compatibility + v.2.18.0 * Support rejecting unsolicited SAMLResponses. * Support stric destination matching. diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index c7ad54c3..91b7e8f1 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.18.0", - "released": "19/11/2019" + "version": "2.18.1", + "released": "25/11/2019" } } From 7f0a1518a80ddb3f1947f3039e1de272fa6b3f88 Mon Sep 17 00:00:00 2001 From: Swen van Zanten Date: Thu, 5 Dec 2019 07:46:40 +0100 Subject: [PATCH 123/236] Empty the $_SESSION variable instead of unset We shouldn't destroy a global variable cause other scripts trust them to be there. --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 5a7ea51f..4d73280f 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -971,7 +971,7 @@ public static function deleteLocalSession() session_destroy(); } - unset($_SESSION); + $_SESSION = []; } /** From 674903bc66fa1e9b61494c5ea8c3647ec352f667 Mon Sep 17 00:00:00 2001 From: Swen van Zanten Date: Thu, 5 Dec 2019 08:09:36 +0100 Subject: [PATCH 124/236] Adjust unit tests to expect an empty array --- tests/src/OneLogin/Saml2/UtilsTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/src/OneLogin/Saml2/UtilsTest.php b/tests/src/OneLogin/Saml2/UtilsTest.php index b70901b8..387ea410 100644 --- a/tests/src/OneLogin/Saml2/UtilsTest.php +++ b/tests/src/OneLogin/Saml2/UtilsTest.php @@ -370,10 +370,10 @@ public function testGetselfhost() public function testisHTTPS() { $this->assertFalse(OneLogin_Saml2_Utils::isHTTPS()); - + $_SERVER['HTTPS'] = 'on'; $this->assertTrue(OneLogin_Saml2_Utils::isHTTPS()); - + unset($_SERVER['HTTPS']); $this->assertFalse(OneLogin_Saml2_Utils::isHTTPS()); $_SERVER['HTTP_HOST'] = 'example.com:443'; @@ -482,7 +482,7 @@ public function testSetBaseURL() $expectedUrlNQ2 = 'http://anothersp.example.com:81/example2/route.php'; $expectedRoutedUrlNQ2 = 'http://anothersp.example.com:81/example2/route.php'; $expectedUrl2 = 'http://anothersp.example.com:81/example2/route.php?x=test'; - + $this->assertEquals('http', OneLogin_Saml2_Utils::getSelfProtocol()); $this->assertEquals('anothersp.example.com', OneLogin_Saml2_Utils::getSelfHost()); $this->assertEquals('81', OneLogin_Saml2_Utils::getSelfPort()); @@ -957,7 +957,7 @@ public function testDeleteLocalSession() $this->assertTrue($_SESSION['samltest']); OneLogin_Saml2_Utils::deleteLocalSession(); - $this->assertFalse(isset($_SESSION)); + $this->assertEmpty($_SESSION); $this->assertFalse(isset($_SESSION['samltest'])); $prev = error_reporting(0); @@ -966,7 +966,7 @@ public function testDeleteLocalSession() $_SESSION['samltest'] = true; OneLogin_Saml2_Utils::deleteLocalSession(); - $this->assertFalse(isset($_SESSION)); + $this->assertEmpty($_SESSION); $this->assertFalse(isset($_SESSION['samltest'])); } } From c9e16f31216b99069966e76eb89ab2fcfacd4c26 Mon Sep 17 00:00:00 2001 From: Swen van Zanten Date: Thu, 5 Dec 2019 08:33:25 +0100 Subject: [PATCH 125/236] Use the session_unset function --- lib/Saml2/Utils.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 4d73280f..c2d2fdbe 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -968,10 +968,9 @@ public static function deleteLocalSession() { if (OneLogin_Saml2_Utils::isSessionStarted()) { + session_unset(); session_destroy(); } - - $_SESSION = []; } /** From 1d2c22656c41239b9ca7775a8d7937ef64700808 Mon Sep 17 00:00:00 2001 From: Swen van Zanten Date: Thu, 5 Dec 2019 11:37:01 +0100 Subject: [PATCH 126/236] Move session_unset() upwards --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index c2d2fdbe..5ca01876 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -966,9 +966,9 @@ public static function isSessionStarted() */ public static function deleteLocalSession() { + session_unset(); if (OneLogin_Saml2_Utils::isSessionStarted()) { - session_unset(); session_destroy(); } } From 2fcb2e9699a3df470d126151ecf0ebd4b4d46340 Mon Sep 17 00:00:00 2001 From: Swen van Zanten Date: Fri, 6 Dec 2019 10:45:01 +0100 Subject: [PATCH 127/236] Reset the $_SESSION variable if the session isn't started --- lib/Saml2/Utils.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 5ca01876..2ea69951 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -966,10 +966,11 @@ public static function isSessionStarted() */ public static function deleteLocalSession() { - session_unset(); - if (OneLogin_Saml2_Utils::isSessionStarted()) { + session_unset(); session_destroy(); + } else { + $_SESSION = array(); } } From ead86cf9ac7d2218a470aff029782db3eac13032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Mon, 16 Dec 2019 17:44:47 +0100 Subject: [PATCH 128/236] Fix documentation for getNameIdSPNameQualifier --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5059ee0..b7d464c2 100644 --- a/README.md +++ b/README.md @@ -1326,7 +1326,7 @@ Main class of OneLogin PHP Toolkit * `getNameId` - Returns the nameID * `getNameIdFormat` - Gets the NameID Format provided by the SAML response from the IdP. * `getNameIdNameQualifier` - Gets the NameID NameQualifier provided from the SAML Response String. - * `getNameIdNameSPQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. + * `getNameIdSPNameQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. * `getSessionIndex` - Gets the SessionIndex from the AuthnStatement. * `getErrors` - Returns if there were any error * `getSSOurl` - Gets the SSO url. @@ -1364,7 +1364,7 @@ SAML 2 Authentication Response class * `getNameId` - Gets the NameID provided by the SAML response from the IdP. * `getNameIdFormat` - Gets the NameID Format provided by the SAML response from the IdP. * `getNameIdNameQualifier` - Gets the NameID NameQualifier provided from the SAML Response String. - * `getNameIdNameSPQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. + * `getNameIdSPNameQualifier` - Gets the NameID SP NameQualifier provided from the SAML Response String. * `getSessionNotOnOrAfter` - Gets the SessionNotOnOrAfter from the AuthnStatement * `getSessionIndex` - Gets the SessionIndex from the AuthnStatement. From c3803254a2ffb36bd0cdbcaf200469309973dd52 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 15 Jan 2020 17:04:07 +0100 Subject: [PATCH 129/236] Fix php composer requirement --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 106f0bde..b8131f6e 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "source": "https://github.com/onelogin/php-saml/" }, "require": { - "php": ">=5.3.2", + "php": ">=5.3.2 <7.2", "ext-curl": "*", "ext-openssl": "*", "ext-dom": "*", From 6f0b41d1cc5b46742e303da8d11d48d1c21a3e82 Mon Sep 17 00:00:00 2001 From: Fred McMullen Date: Wed, 12 Aug 2020 11:51:24 -0500 Subject: [PATCH 130/236] Add Auth Context Class Constants --- lib/Saml2/Constants.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Saml2/Constants.php b/lib/Saml2/Constants.php index dd702fa3..86c28efb 100644 --- a/lib/Saml2/Constants.php +++ b/lib/Saml2/Constants.php @@ -49,9 +49,11 @@ class OneLogin_Saml2_Constants const AC_PASSWORD_PROTECTED = 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'; const AC_X509 = 'urn:oasis:names:tc:SAML:2.0:ac:classes:X509'; const AC_SMARTCARD = 'urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard'; + const AC_SMARTCARD_PKI = 'urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI'; const AC_KERBEROS = 'urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos'; const AC_WINDOWS = 'urn:federation:authentication:windows'; const AC_TLS = 'urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient'; + const AC_RSATOKEN = 'urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken'; // Subject Confirmation const CM_BEARER = 'urn:oasis:names:tc:SAML:2.0:cm:bearer'; From 89aa21894098f571749b6f8ded287c4cb752c44d Mon Sep 17 00:00:00 2001 From: Tony McNulty Date: Fri, 16 Oct 2020 16:17:00 +0100 Subject: [PATCH 131/236] Fix typo --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 2ea69951..7a0d2bee 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -1391,7 +1391,7 @@ public static function addSign($xml, $key, $cert, $signAlgorithm = XMLSecurityKe * Validates a signature (Message or Assertion). * * @param string|DomNode $xml The element we should validate - * @param string|null $cert The pubic cert + * @param string|null $cert The public cert * @param string|null $fingerprint The fingerprint of the public cert * @param string|null $fingerprintalg The algorithm used to get the fingerprint * @param string|null $xpath The xpath of the signed element From 399a98e2c448eded7ab7ca1a2ee6714317a937f8 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 24 Nov 2020 18:17:30 +0100 Subject: [PATCH 132/236] Update README.md Update docs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7d464c2..796dd7dd 100644 --- a/README.md +++ b/README.md @@ -510,7 +510,7 @@ $advancedSettings = array ( // Set to false and no AuthContext will be sent in the AuthNRequest. // Set true or don't present this parameter and you will get an AuthContext 'exact' 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'. // Set an array with the possible auth context values: array ('urn:oasis:names:tc:SAML:2.0:ac:classes:Password', 'urn:oasis:names:tc:SAML:2.0:ac:classes:X509'). - 'requestedAuthnContext' => true, + 'requestedAuthnContext' => false, // Indicates if the SP will validate all received xmls. // (In order to validate the xml, 'strict' and 'wantXMLValidation' must be true). From 635bd9470d3ca1d1aecb7afb1e167e66c6d10c18 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 25 Nov 2020 17:29:55 +0100 Subject: [PATCH 133/236] Update unitests --- .../invalids/invalid_subjectconfirmation_nb.xml.base64 | 2 +- .../invalids/invalid_unpaired_inresponsesto.xml.base64 | 2 +- tests/data/responses/unsigned_response.xml.base64 | 2 +- .../data/responses/unsigned_response_with_miliseconds.xm.base64 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/data/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 b/tests/data/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 index ff6d371c..de582bfb 100644 --- a/tests/data/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 +++ b/tests/data/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdEJlZm9yZT0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdEJlZm9yZT0iMjk5OS0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 b/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 index 87ce60fc..bfd1a938 100644 --- a/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 +++ b/tests/data/responses/invalids/invalid_unpaired_inresponsesto.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4gICAgDQogICAgPHNhbWw6U3ViamVjdD4NCiAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9ImhlbGxvLmNvbSIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6TmFtZUlEPg0KICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPg0KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89ImludmFsaWRfaW5yZXNwb25zZSIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4gICAgDQogICAgPHNhbWw6U3ViamVjdD4NCiAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9ImhlbGxvLmNvbSIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6TmFtZUlEPg0KICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPg0KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89ImludmFsaWRfaW5yZXNwb25zZSIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/unsigned_response.xml.base64 b/tests/data/responses/unsigned_response.xml.base64 index 66892b53..09ea69c7 100644 --- a/tests/data/responses/unsigned_response.xml.base64 +++ b/tests/data/responses/unsigned_response.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjk5OS0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/unsigned_response_with_miliseconds.xm.base64 b/tests/data/responses/unsigned_response_with_miliseconds.xm.base64 index 76522b7e..b3bc8fce 100644 --- a/tests/data/responses/unsigned_response_with_miliseconds.xm.base64 +++ b/tests/data/responses/unsigned_response_with_miliseconds.xm.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTQuMTIwWiIgRGVzdGluYXRpb249Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0LjEyMFoiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIA0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJoZWxsby5jb20iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOk5hbWVJRD4NCiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4NCiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIwLTA2LTE3VDE0OjU5OjE0WiIgUmVjaXBpZW50PSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NC4xNzNaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTQuMjM1WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDcuMTIwWiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QyMjo1NDoxNC4xMjBaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file +PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTQuMTIwWiIgRGVzdGluYXRpb249Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0LjEyMFoiPg0KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIA0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJoZWxsby5jb20iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOk5hbWVJRD4NCiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4NCiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyOTk5LTA2LTE3VDE0OjU5OjE0WiIgUmVjaXBpZW50PSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NC4xNzNaIiBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTQuMjM1WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDcuMTIwWiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjk5OS0wNi0xN1QyMjo1NDoxNC4xMjBaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file From c12a61a58b4d16fdb9df3c2ae367aae81ad6c16d Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 25 Nov 2020 18:40:08 +0100 Subject: [PATCH 134/236] Check for x509Cert of the IdP when loading settings, even if the security index was not provided --- lib/Saml2/Settings.php | 20 ++++++++++---------- tests/src/OneLogin/Saml/AuthRequestTest.php | 2 ++ tests/src/OneLogin/Saml2/SettingsTest.php | 2 ++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index fd8a12e6..bc059625 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -564,19 +564,19 @@ public function checkIdPSettings($settings) $errors[] = 'idp_slo_response_url_invalid'; } - if (isset($settings['security'])) { - $security = $settings['security']; + $existsX509 = isset($idp['x509cert']) && !empty($idp['x509cert']); + $existsMultiX509Sign = isset($idp['x509certMulti']) && isset($idp['x509certMulti']['signing']) && !empty($idp['x509certMulti']['signing']); + $existsFingerprint = isset($idp['certFingerprint']) && !empty($idp['certFingerprint']); + + if (!($existsX509 || $existsFingerprint || $existsMultiX509Sign) + ) { + $errors[] = 'idp_cert_or_fingerprint_not_found_and_required'; + } - $existsX509 = isset($idp['x509cert']) && !empty($idp['x509cert']); - $existsMultiX509Sign = isset($idp['x509certMulti']) && isset($idp['x509certMulti']['signing']) && !empty($idp['x509certMulti']['signing']); + if (isset($settings['security'])) { $existsMultiX509Enc = isset($idp['x509certMulti']) && isset($idp['x509certMulti']['encryption']) && !empty($idp['x509certMulti']['encryption']); - $existsFingerprint = isset($idp['certFingerprint']) && !empty($idp['certFingerprint']); - if (!($existsX509 || $existsFingerprint || $existsMultiX509Sign) - ) { - $errors[] = 'idp_cert_or_fingerprint_not_found_and_required'; - } - if ((isset($security['nameIdEncrypted']) && $security['nameIdEncrypted'] == true) + if ((isset($settings['security']['nameIdEncrypted']) && $settings['security']['nameIdEncrypted'] == true) && !($existsX509 || $existsMultiX509Enc) ) { $errors[] = 'idp_cert_not_found_and_required'; diff --git a/tests/src/OneLogin/Saml/AuthRequestTest.php b/tests/src/OneLogin/Saml/AuthRequestTest.php index ddc279f0..1906c141 100644 --- a/tests/src/OneLogin/Saml/AuthRequestTest.php +++ b/tests/src/OneLogin/Saml/AuthRequestTest.php @@ -15,6 +15,8 @@ public function setUp() $settings = new OneLogin_Saml_Settings; $settings->idpSingleSignOnUrl = 'http://stuff.com/'; $settings->spReturnUrl = 'http://sp.stuff.com/'; + $cert = file_get_contents(TEST_ROOT . '/data/customPath/certs/sp.crt'); + $settings->idpPublicCertificate = $cert; $this->_settings = $settings; } diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 93aaf6fc..3e41d30b 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -53,6 +53,8 @@ public function testLoadSettingsFromObject() $settingsObj = new OneLogin_Saml_Settings; $settingsObj->idpSingleSignOnUrl = 'http://stuff.com/'; $settingsObj->spReturnUrl = 'http://sp.stuff.com/'; + $cert = file_get_contents(TEST_ROOT . '/data/customPath/certs/sp.crt'); + $settingsObj->idpPublicCertificate = $cert; $settings = new OneLogin_Saml2_Settings($settingsObj); From 370a5d9c8432ede5776f278edcdcf3b8e8212cc6 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 25 Nov 2020 19:58:50 +0100 Subject: [PATCH 135/236] allowRepeatAttributeName settings added in order to support AttributeStatements with Attribute elements with the same name --- README.md | 4 ++++ advanced_settings_example.php | 4 ++++ lib/Saml2/Response.php | 19 ++++++++++++++----- lib/Saml2/Settings.php | 4 ++++ tests/src/OneLogin/Saml2/ResponseTest.php | 8 ++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 796dd7dd..546fe5c8 100644 --- a/README.md +++ b/README.md @@ -520,6 +520,10 @@ $advancedSettings = array ( // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, the toolkit will not raised an error when the Statement Element + // contain atribute elements with name duplicated + 'allowRepeatAttributeName' => false, + // If true, Destination URL should strictly match to the address to // which the response has been sent. // Notice that if 'relaxDestinationValidation' is true an empty Destintation diff --git a/advanced_settings_example.php b/advanced_settings_example.php index 54224b9b..95b2f87e 100644 --- a/advanced_settings_example.php +++ b/advanced_settings_example.php @@ -85,6 +85,10 @@ // attribute will not be rejected for this fact. 'relaxDestinationValidation' => false, + // If true, the toolkit will not raised an error when the Statement Element + // contain atribute elements with name duplicated + 'allowRepeatAttributeName' => false, + // If true, Destination URL should strictly match to the address to // which the response has been sent. // Notice that if 'relaxDestinationValidation' is true an empty Destintation diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 4408feb3..69b17736 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -779,6 +779,9 @@ private function _getAttributesByKeyName($keyName = "Name") $entries = $this->_queryAssertion('/saml:AttributeStatement/saml:Attribute'); + $security = $this->_settings->getSecurityData(); + $allowRepeatAttributeName = $security['allowRepeatAttributeName']; + /** @var $entry DOMNode */ foreach ($entries as $entry) { $attributeKeyNode = $entry->attributes->getNamedItem($keyName); @@ -790,10 +793,12 @@ private function _getAttributesByKeyName($keyName = "Name") $attributeKeyName = $attributeKeyNode->nodeValue; if (in_array($attributeKeyName, array_keys($attributes))) { - throw new OneLogin_Saml2_ValidationError( - "Found an Attribute element with duplicated ".$keyName, - OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND - ); + if (!$allowRepeatAttributeName) { + throw new OneLogin_Saml2_ValidationError( + "Found an Attribute element with duplicated ".$keyName, + OneLogin_Saml2_ValidationError::DUPLICATED_ATTRIBUTE_NAME_FOUND + ); + } } $attributeValues = array(); @@ -804,7 +809,11 @@ private function _getAttributesByKeyName($keyName = "Name") } } - $attributes[$attributeKeyName] = $attributeValues; + if (in_array($attributeKeyName, array_keys($attributes))) { + $attributes[$attributeKeyName] = array_merge($attributes[$attributeKeyName], $attributeValues); + } else { + $attributes[$attributeKeyName] = $attributeValues; + } } return $attributes; } diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index bc059625..dcc0e8b6 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -399,6 +399,10 @@ private function _addDefaultValues() $this->_security['relaxDestinationValidation'] = false; } + // Allow duplicated Attribute Names + if (!isset($this->_security['allowRepeatAttributeName'])) { + $this->_security['allowRepeatAttributeName'] = false; + } // Strict Destination match validation if (!isset($this->_security['destinationStrictlyMatches'])) { diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 0d23a7bc..571aaa31 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -622,6 +622,14 @@ public function testGetAttributes() } catch (OneLogin_Saml2_ValidationError $e) { $this->assertContains('Found an Attribute element with duplicated Name', $e->getMessage()); } + + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + $settingsInfo['security']['allowRepeatAttributeName'] = true; + $settings2 = new OneLogin_Saml2_Settings($settingsInfo); + $response5 = new OneLogin_Saml2_Response($settings2, $xml4); + $attrs = $response5->getAttributes(); + $this->assertEquals([0 => "test", 1 => "test2"], $attrs['uid']); } /** From c51877e9e5801209da9a3e8c4a4c26e3f8b30e49 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Wed, 25 Nov 2020 21:14:00 +0100 Subject: [PATCH 136/236] Get lib path dinamically --- lib/Saml2/Settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index dcc0e8b6..a94183de 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -159,7 +159,7 @@ private function _loadPaths() 'base' => $basePath, 'config' => $basePath, 'cert' => $basePath.'certs/', - 'lib' => $basePath.'lib/Saml2/', + 'lib' => __DIR__ . '/', 'extlib' => $basePath.'extlib/' ); From 7aca365b538b19d9dc3da8a36380e60d5eac5330 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 26 Nov 2020 18:22:24 +0100 Subject: [PATCH 137/236] Fix #443. Incorrect Destination in LogoutResponse when using responseUrl. Add IdP value getters to the Settings class --- lib/Saml2/Auth.php | 28 ++++------- lib/Saml2/LogoutRequest.php | 3 +- lib/Saml2/LogoutResponse.php | 3 +- lib/Saml2/Settings.php | 41 ++++++++++++++++ tests/src/OneLogin/Saml2/AuthTest.php | 2 +- tests/src/OneLogin/Saml2/SettingsTest.php | 60 +++++++++++++++++++++++ 6 files changed, 115 insertions(+), 22 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 43c2f930..8a97cc33 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -586,43 +586,33 @@ public function logout($returnTo = null, $parameters = array(), $nameId = null, } /** - * Gets the SSO url. + * Gets the IdP SSO url. * - * @return string The url of the Single Sign On Service + * @return string The url of the IdP Single Sign On Service */ public function getSSOurl() { - $idpData = $this->_settings->getIdPData(); - return $idpData['singleSignOnService']['url']; + return $this->_settings->getIdPSSOUrl(); } /** - * Gets the SLO url. + * Gets the IdP SLO url. * - * @return string|null The url of the Single Logout Service + * @return string|null The url of the IdP Single Logout Service */ public function getSLOurl() { - $url = null; - $idpData = $this->_settings->getIdPData(); - if (isset($idpData['singleLogoutService']) && isset($idpData['singleLogoutService']['url'])) { - $url = $idpData['singleLogoutService']['url']; - } - return $url; + return $this->_settings->getIdPSLOUrl(); } /** - * Gets the SLO response url. + * Gets the IdP SLO response url. * - * @return string|null The response url of the Single Logout Service + * @return string|null The response url of the IdP Single Logout Service */ public function getSLOResponseUrl() { - $idpData = $this->_settings->getIdPData(); - if (isset($idpData['singleLogoutService']) && isset($idpData['singleLogoutService']['responseUrl'])) { - return $idpData['singleLogoutService']['responseUrl']; - } - return $this->getSLOurl(); + return $this->_settings->getIdPSLOResponseUrl(); } /** diff --git a/lib/Saml2/LogoutRequest.php b/lib/Saml2/LogoutRequest.php index b7014866..5865c8a6 100644 --- a/lib/Saml2/LogoutRequest.php +++ b/lib/Saml2/LogoutRequest.php @@ -106,6 +106,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $request = null, $sessionIndexStr = isset($sessionIndex) ? "{$sessionIndex}" : ""; $spEntityId = htmlspecialchars($spData['entityId'], ENT_QUOTES); + $destination = $this->_settings->getIdPSLOUrl(); $logoutRequest = << + Destination="{$destination}"> {$spEntityId} {$nameIdObj} {$sessionIndexStr} diff --git a/lib/Saml2/LogoutResponse.php b/lib/Saml2/LogoutResponse.php index bb7da37d..21c1adad 100644 --- a/lib/Saml2/LogoutResponse.php +++ b/lib/Saml2/LogoutResponse.php @@ -240,13 +240,14 @@ public function build($inResponseTo) $issueInstant = OneLogin_Saml2_Utils::parseTime2SAML(time()); $spEntityId = htmlspecialchars($spData['entityId'], ENT_QUOTES); + $destination = $this->_settings->getIdPSLOResponseUrl(); $logoutResponse = << {$spEntityId} diff --git a/lib/Saml2/Settings.php b/lib/Saml2/Settings.php index a94183de..cb752d22 100644 --- a/lib/Saml2/Settings.php +++ b/lib/Saml2/Settings.php @@ -838,6 +838,47 @@ public function shouldCompressResponses() return $this->_compress['responses']; } + /** + * Gets the IdP SSO url. + * + * @return string|null The url of the IdP Single Sign On Service + */ + public function getIdPSSOUrl() + { + $ssoUrl = null; + if (isset($this->_idp['singleSignOnService']) && isset($this->_idp['singleSignOnService']['url'])) { + $ssoUrl = $this->_idp['singleSignOnService']['url']; + } + return $ssoUrl; + } + + /** + * Gets the IdP SLO url. + * + * @return string|null The request url of the IdP Single Logout Service + */ + public function getIdPSLOUrl() + { + $sloUrl = null; + if (isset($this->_idp['singleLogoutService']) && isset($this->_idp['singleLogoutService']['url'])) { + $sloUrl = $this->_idp['singleLogoutService']['url']; + } + return $sloUrl; + } + + /** + * Gets the IdP SLO response url. + * + * @return string|null The response url of the IdP Single Logout Service + */ + public function getIdPSLOResponseUrl() + { + if (isset($this->_idp['singleLogoutService']) && isset($this->_idp['singleLogoutService']['responseUrl'])) { + return $this->_idp['singleLogoutService']['responseUrl']; + } + return $this->getIdPSLOUrl(); + } + /** * Gets the SP metadata. The XML representation. * diff --git a/tests/src/OneLogin/Saml2/AuthTest.php b/tests/src/OneLogin/Saml2/AuthTest.php index 94e3872f..908a7994 100644 --- a/tests/src/OneLogin/Saml2/AuthTest.php +++ b/tests/src/OneLogin/Saml2/AuthTest.php @@ -82,7 +82,7 @@ public function testGetSLOurl() /** * Tests the getSLOResponseUrl method of the OneLogin_Saml2_Auth class * - * @covers OneLogin_Saml2_Auth::getSLOurl + * @covers OneLogin_Saml2_Auth::getSLOResponseUrl */ public function testGetSLOResponseUrl() { diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 3e41d30b..66f041ed 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -419,6 +419,66 @@ public function testCheckSettings() } } + /** + * Tests the getIdPSSOurl method of the OneLogin_Saml2_Settings class + * + * @covers OneLogin_Saml2_Settings::getIdPSSOurl + */ + public function testGetIdPSSOurl() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $ssoUrl = "http://idp.example.com/SSOService.php"; + $this->assertEquals($settings->getIdPSSOUrl(), $ssoUrl); + } + + /** + * Tests the getIdPSLOurl method of the OneLogin_Saml2_Settings class + * + * @covers OneLogin_Saml2_Settings::getIdPSLOurl + */ + public function testGetIdPSLOurl() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $sloUrl = "http://idp.example.com/SingleLogoutService.php"; + $this->assertEquals($settings->getIdPSLOUrl(), $sloUrl); + + include $settingsDir.'settings2.php'; + $settings2 = new OneLogin_Saml2_Settings($settingsInfo); + + $sloUrl = "http://idp.example.com/SingleLogoutService.php"; + $this->assertEquals($settings2->getIdPSLOUrl(), $sloUrl); + } + + /** + * Tests the getIdPSLOResponseUrl method of the OneLogin_Saml2_Settings class + * + * @covers OneLogin_Saml2_Settings::getIdPSLOResponseUrl + */ + public function testGetIdPSLOResponseUrl() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings1.php'; + + $settings = new OneLogin_Saml2_Settings($settingsInfo); + + $sloUrl = "http://idp.example.com/SingleLogoutServiceResponse.php"; + $this->assertEquals($settings->getIdPSLOResponseUrl(), $sloUrl); + + include $settingsDir.'settings2.php'; + $settings2 = new OneLogin_Saml2_Settings($settingsInfo); + + $sloUrl = "http://idp.example.com/SingleLogoutService.php"; + $this->assertEquals($settings2->getIdPSLOUrl(), $sloUrl); + } + /** * Tests the getSPMetadata method of the OneLogin_Saml2_Settings * Case unsigned metadata From bc3742fe1c5e50532c621a5aa79a9331844979ee Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 26 Nov 2020 18:29:01 +0100 Subject: [PATCH 138/236] Another refactor --- lib/Saml2/AuthnRequest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/AuthnRequest.php b/lib/Saml2/AuthnRequest.php index fc6d3237..c112a400 100644 --- a/lib/Saml2/AuthnRequest.php +++ b/lib/Saml2/AuthnRequest.php @@ -39,7 +39,6 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal $this->_settings = $settings; $spData = $this->_settings->getSPData(); - $idpData = $this->_settings->getIdPData(); $security = $this->_settings->getSecurityData(); $id = OneLogin_Saml2_Utils::generateUniqueID(); @@ -134,6 +133,7 @@ public function __construct(OneLogin_Saml2_Settings $settings, $forceAuthn = fal $spEntityId = htmlspecialchars($spData['entityId'], ENT_QUOTES); $acsUrl = htmlspecialchars($spData['assertionConsumerService']['url'], ENT_QUOTES); + $destination = $this->_settings->getIdPSSOUrl(); $request = << {$spEntityId}{$subjectStr}{$nameIdPolicyStr}{$requestedAuthnStr} From cc6d4e7ef77b57125c3758fe5fbf21aa7e9a2628 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 26 Nov 2020 19:47:56 +0100 Subject: [PATCH 139/236] Update Changelog --- CHANGELOG | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 526279a9..b617b502 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,13 @@ CHANGELOG ========= +v.2.19.0 +* [#412](https://github.com/onelogin/php-saml/pull/412) Empty instead of unset the $_SESSION variable +* [#433](https://github.com/onelogin/php-saml/issues/443) Fix Incorrect Destination in LogoutResponse when using responseUrl #443 +* Add support for SMARTCARD_PKI and RSA_TOKEN Auth Contexts +* Support Statements with Attribute elements with the same name enabling the allowRepeatAttributeName setting +* Get lib path dinamically +* Check for x509Cert of the IdP when loading settings, even if the security index was not provided + v.2.18.1 * Add setSchemasPath to Auth class and fix backward compatibility From c137eebfff82313a1c9f12f63e90c28233bd51c5 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Sat, 28 Nov 2020 02:10:41 +0100 Subject: [PATCH 140/236] Add missing vars to the demo --- demo1/index.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo1/index.php b/demo1/index.php index 2400451f..44ce30c2 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -31,6 +31,8 @@ $nameId = null; $sessionIndex = null; $nameIdFormat = null; + $samlNameIdNameQualifier = null; + $samlNameIdSPNameQualifier = null; if (isset($_SESSION['samlNameId'])) { $nameId = $_SESSION['samlNameId']; From b9a777a5a66c53495f56a9ea6a1df0a8fdc1a16a Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 7 Jan 2021 16:21:04 +0100 Subject: [PATCH 141/236] Improve demo to print cause of Message invalidation if debug is enabled --- demo1/index.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/demo1/index.php b/demo1/index.php index 44ce30c2..d3dbc541 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -73,6 +73,9 @@ if (!empty($errors)) { echo '

',implode(', ', $errors),'

'; + if ($auth->getSettings()->isDebugActive()) { + echo '

'.$auth->getLastErrorReason().'

'; + } } if (!$auth->isAuthenticated()) { @@ -103,6 +106,9 @@ echo '

Sucessfully logged out

'; } else { echo '

', implode(', ', $errors), '

'; + if ($auth->getSettings()->isDebugActive()) { + echo '

'.$auth->getLastErrorReason().'

'; + } } } From 9c39466c7df0e39beaecdc4e51d591204f6754d1 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 2 Feb 2021 23:27:44 +0900 Subject: [PATCH 142/236] Update composer.json Add ext-zlib as a dependency - gzdeflate is used 7 times in various files --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b8131f6e..0c2bfd12 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,8 @@ "ext-curl": "*", "ext-openssl": "*", "ext-dom": "*", - "ext-mcrypt": "*" + "ext-mcrypt": "*", + "ext-zlib": "*" }, "require-dev": { "phpunit/phpunit": "4.8", From 5fd9812ea824179616a978b77ace2aabfae7ebbd Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 19 Feb 2021 02:02:47 +0100 Subject: [PATCH 143/236] Forgot update version on 2.19.0 release --- lib/Saml2/version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 91b7e8f1..5bec39fa 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.18.1", - "released": "25/11/2019" + "version": "2.19.0", + "released": "26/11/2020" } } From e4c1fb2a9b89f64e9b9539bafe3bfc2987ff74ee Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 19 Feb 2021 02:04:09 +0100 Subject: [PATCH 144/236] Fix #467 bug on getSelfRoutedURLNoQuery method --- lib/Saml2/Utils.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Saml2/Utils.php b/lib/Saml2/Utils.php index 7a0d2bee..9983e2d1 100644 --- a/lib/Saml2/Utils.php +++ b/lib/Saml2/Utils.php @@ -648,7 +648,7 @@ public static function getSelfRoutedURLNoQuery() $pos = strpos($selfRoutedURLNoQuery, "?"); if ($pos !== false) { - $selfRoutedURLNoQuery = substr($selfRoutedURLNoQuery, 0, $pos-1); + $selfRoutedURLNoQuery = substr($selfRoutedURLNoQuery, 0, $pos); } return $selfRoutedURLNoQuery; From 5cb18a3536cca7d5fec1bc3fd04f6f5233176f65 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 2 Mar 2021 11:20:53 +0100 Subject: [PATCH 145/236] Fix phpunit --- tests/src/OneLogin/Saml2/ResponseTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 571aaa31..8f1e162d 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -629,7 +629,7 @@ public function testGetAttributes() $settings2 = new OneLogin_Saml2_Settings($settingsInfo); $response5 = new OneLogin_Saml2_Response($settings2, $xml4); $attrs = $response5->getAttributes(); - $this->assertEquals([0 => "test", 1 => "test2"], $attrs['uid']); + $this->assertEquals(array(0 => "test", 1 => "test2"), $attrs['uid']); } /** From 790a042f2d16a086a563793dab0eeb6a5a8c4e70 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 2 Mar 2021 12:05:02 +0100 Subject: [PATCH 146/236] Release 2.19.1 --- CHANGELOG | 3 +++ lib/Saml2/version.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b617b502..08a1a53a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ CHANGELOG ========= +v.2.19.1 +* [#467](https://github.com/onelogin/php-saml/issues/467) Fix bug on getSelfRoutedURLNoQuery method + v.2.19.0 * [#412](https://github.com/onelogin/php-saml/pull/412) Empty instead of unset the $_SESSION variable * [#433](https://github.com/onelogin/php-saml/issues/443) Fix Incorrect Destination in LogoutResponse when using responseUrl #443 diff --git a/lib/Saml2/version.json b/lib/Saml2/version.json index 5bec39fa..ac6f7011 100644 --- a/lib/Saml2/version.json +++ b/lib/Saml2/version.json @@ -1,6 +1,6 @@ { "php-saml": { - "version": "2.19.0", - "released": "26/11/2020" + "version": "2.19.1", + "released": "02/03/2021" } } From 9a4ad2d54bf538f65926e5088f3644ee38b5a681 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Sat, 1 May 2021 20:27:15 +0700 Subject: [PATCH 147/236] Update index.php $samlNameIdSPNameQualifier and $samlNameIdNameQualifier inconsistently named and consequently not correctly initialized. --- demo1/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demo1/index.php b/demo1/index.php index d3dbc541..d3648ad0 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -41,16 +41,16 @@ $nameIdFormat = $_SESSION['samlNameIdFormat']; } if (isset($_SESSION['samlNameIdNameQualifier'])) { - $nameIdNameQualifier = $_SESSION['samlNameIdNameQualifier']; + $samlNameIdNameQualifier = $_SESSION['samlNameIdNameQualifier']; } if (isset($_SESSION['samlNameIdSPNameQualifier'])) { - $nameIdSPNameQualifier = $_SESSION['samlNameIdSPNameQualifier']; + $samlNameIdSPNameQualifier = $_SESSION['samlNameIdSPNameQualifier']; } if (isset($_SESSION['samlSessionIndex'])) { $sessionIndex = $_SESSION['samlSessionIndex']; } - $auth->logout($returnTo, $parameters, $nameId, $sessionIndex, false, $nameIdFormat, $nameIdNameQualifier, $nameIdSPNameQualifier); + $auth->logout($returnTo, $parameters, $nameId, $sessionIndex, false, $nameIdFormat, $samlNameIdNameQualifier, $samlNameIdSPNameQualifier); # If LogoutRequest ID need to be saved in order to later validate it, do instead # $sloBuiltUrl = $auth->logout(null, $paramters, $nameId, $sessionIndex, true); From 9d0e8596d1e3c949ac7c24c4f9cdcc47af380211 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 14 May 2021 14:54:35 +0200 Subject: [PATCH 148/236] Create php-package.yml --- .github/workflows/php-package.yml | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/workflows/php-package.yml diff --git a/.github/workflows/php-package.yml b/.github/workflows/php-package.yml new file mode 100644 index 00000000..85a82fa8 --- /dev/null +++ b/.github/workflows/php-package.yml @@ -0,0 +1,48 @@ +# This workflow will install PHP dependencies, run tests and lint with a variety of PHP versions +# For more information see: https://github.com/marketplace/actions/setup-php-action + +name: php-saml package + +on: + push: + branches: [ master, 2.* ] + pull_request: + branches: [ master, 2.* ] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest'] + php-version: [5.3, 5.4, 5.5, 5.6] +steps: + - name: Checkout + uses: actions/checkout@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, intl, mcrypt, xml + tools: composer:v2 + ini-values: post_max_size=256M, max_execution_time=180 + coverage: xdebug + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Install Composer dependencies + composer self-update + composer install --prefer-source --no-interaction + + - name: Syntax check PHP + php vendor/bin/phpcpd --exclude tests --exclude vendor . + php vendor/bin/phploc . --exclude vendor + php vendor/bin/phploc lib/. + mkdir -p tests/build/dependences + php vendor/bin/pdepend --summary-xml=tests/build/logs/dependence-summary.xml --jdepend-chart=tests/build/dependences/jdepend.svg --overview-pyramid=tests/build/dependences/pyramid.svg lib/. + + - name: PHP Code Sniffer + php vendor/bin/phpcs --standard=tests/ZendModStandard lib/Saml2 demo1 demo2 demo-old endpoints tests/src + + - name: Run unit tests + vendor/bin/phpunit From 2992c70fcab6c36e5772056fd1805530b99da450 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Fri, 14 May 2021 20:10:33 +0200 Subject: [PATCH 149/236] Update php-package.yml --- .github/workflows/php-package.yml | 63 ++++++++++++++++++------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/.github/workflows/php-package.yml b/.github/workflows/php-package.yml index 85a82fa8..54d9402a 100644 --- a/.github/workflows/php-package.yml +++ b/.github/workflows/php-package.yml @@ -11,38 +11,47 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ${{ matrix.operating-system }} strategy: fail-fast: false matrix: - operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest'] - php-version: [5.3, 5.4, 5.5, 5.6] -steps: - - name: Checkout - uses: actions/checkout@v2 - with: - php-version: ${{ matrix.php-versions }} - extensions: mbstring, intl, mcrypt, xml - tools: composer:v2 - ini-values: post_max_size=256M, max_execution_time=180 - coverage: xdebug - - - name: Validate composer.json and composer.lock + operating-system: ['ubuntu-latest'] + php-versions: [5.3, 5.4, 5.5, 5.6] + steps: + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, intl, mcrypt, xml + tools: composer:v2 + ini-values: post_max_size=256M, max_execution_time=180 + coverage: xdebug + + - name: Set git to use LF + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - uses: actions/checkout@v2 + + - name: Validate composer.json and composer.lock run: composer validate - - name: Install Composer dependencies - composer self-update - composer install --prefer-source --no-interaction + - name: Install Composer dependencies + run: | + composer self-update + composer install --prefer-source --no-interaction - - name: Syntax check PHP - php vendor/bin/phpcpd --exclude tests --exclude vendor . - php vendor/bin/phploc . --exclude vendor - php vendor/bin/phploc lib/. - mkdir -p tests/build/dependences - php vendor/bin/pdepend --summary-xml=tests/build/logs/dependence-summary.xml --jdepend-chart=tests/build/dependences/jdepend.svg --overview-pyramid=tests/build/dependences/pyramid.svg lib/. + - name: Syntax check PHP + run: | + php vendor/bin/phpcpd --exclude tests --exclude vendor . + php vendor/bin/phploc . --exclude vendor + php vendor/bin/phploc lib/. + mkdir -p tests/build/dependences + php vendor/bin/pdepend --summary-xml=tests/build/logs/dependence-summary.xml --jdepend-chart=tests/build/dependences/jdepend.svg --overview-pyramid=tests/build/dependences/pyramid.svg lib/. - - name: PHP Code Sniffer - php vendor/bin/phpcs --standard=tests/ZendModStandard lib/Saml2 demo1 demo2 demo-old endpoints tests/src + - name: PHP Code Sniffer + run: php vendor/bin/phpcs --standard=tests/ZendModStandard lib/Saml2 demo1 demo2 demo-old endpoints tests/src - - name: Run unit tests - vendor/bin/phpunit + - name: Run unit tests + run: vendor/bin/phpunit --verbose --debug From 748abe18166a500b944835b9b07ed6129e3cd157 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 25 May 2021 17:42:36 +0200 Subject: [PATCH 150/236] Add warning about the use of IdpMetadataParser class. If Metadata URLs are provided by 3rd parties, the URL inputs MUST be validated to avoid issues like SSRF --- README.md | 4 ++++ lib/Saml2/IdPMetadataParser.php | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 546fe5c8..1369eca2 100644 --- a/README.md +++ b/README.md @@ -1503,6 +1503,8 @@ Auxiliary class that contains several methods to retrieve and process IdP metada * `parseXML` - Get IdP Metadata Info from XML. * `injectIntoSettings` - Inject metadata info into php-saml settings array. +The class does not validate in any way the URL that is introduced on methods like parseRemoteXML in order to retrieve the remove XML. Usually is the same administrator that handles the Service Provider the ones that set the URL that should belong to a trusted third-party IdP. +But there are other scenarios, like a SAAS app where the administrator of the app delegates on other administrators. In such case, extra protection should be taken in order to validate such URL inputs and avoid attacks like SSRF. For more info, look at the source code; each method is documented and details about what it does and how to use it are provided. Make sure to also check the doc folder where @@ -1510,6 +1512,8 @@ HTML documentation about the classes and methods is provided for SAML and SAML2. + + Demos included in the toolkit ----------------------------- diff --git a/lib/Saml2/IdPMetadataParser.php b/lib/Saml2/IdPMetadataParser.php index ca385644..53b201dc 100644 --- a/lib/Saml2/IdPMetadataParser.php +++ b/lib/Saml2/IdPMetadataParser.php @@ -10,6 +10,10 @@ class OneLogin_Saml2_IdPMetadataParser /** * Get IdP Metadata Info from URL * + * This class does not validate in any way the URL that is introduced, + * make sure to validate it properly before use it in the parseRemoteXML + * method in order to avoid security issues like SSRF attacks. + * * @param string $url URL where the IdP metadata is published * @param string $entityId Entity Id of the desired IdP, if no * entity Id is provided and the XML @@ -27,6 +31,9 @@ public static function parseRemoteXML($url, $entityId = null, $desiredNameIdForm try { $ch = curl_init($url); + curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP); + curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP); + curl_setopt($ch, CURLOPT_MAXREDIRS, 5); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); From 9e15d1491d4677f3185e0b9a2dd244ffe587d1bd Mon Sep 17 00:00:00 2001 From: Andrew Welburn Date: Mon, 28 Jun 2021 16:04:17 +0100 Subject: [PATCH 151/236] Fix typos in error messages --- lib/Saml2/Response.php | 2 +- tests/src/OneLogin/Saml2/ResponseTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 69b17736..58489194 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -624,7 +624,7 @@ public function getNameIdData() $spEntityId = $spData['entityId']; if ($spEntityId != $nameId->getAttribute($attr)) { throw new OneLogin_Saml2_ValidationError( - "The SPNameQualifier value mistmatch the SP entityID value.", + "The SPNameQualifier value mismatch the SP entityID value.", OneLogin_Saml2_ValidationError::SP_NAME_QUALIFIER_NAME_MISMATCH ); } diff --git a/tests/src/OneLogin/Saml2/ResponseTest.php b/tests/src/OneLogin/Saml2/ResponseTest.php index 8f1e162d..b4cb5017 100644 --- a/tests/src/OneLogin/Saml2/ResponseTest.php +++ b/tests/src/OneLogin/Saml2/ResponseTest.php @@ -184,7 +184,7 @@ public function testReturnNameId() $nameId10 = $response10->getNameId(); $this->fail('OneLogin_Saml2_ValidationError was not raised'); } catch (OneLogin_Saml2_ValidationError $e) { - $this->assertContains('The SPNameQualifier value mistmatch the SP entityID value.', $e->getMessage()); + $this->assertContains('The SPNameQualifier value mismatch the SP entityID value.', $e->getMessage()); } $response11 = new OneLogin_Saml2_Response($settings, $xml6); @@ -395,7 +395,7 @@ public function testGetNameIdData() $nameIdData10 = $response10->getNameIdData(); $this->fail('OneLogin_Saml2_ValidationError was not raised'); } catch (OneLogin_Saml2_ValidationError $e) { - $this->assertContains('The SPNameQualifier value mistmatch the SP entityID value.', $e->getMessage()); + $this->assertContains('The SPNameQualifier value mismatch the SP entityID value.', $e->getMessage()); } $response11 = new OneLogin_Saml2_Response($settings, $xml6); From 57902c444acfafba3c2d520745886816d1830f4c Mon Sep 17 00:00:00 2001 From: Ted Date: Tue, 3 Aug 2021 17:03:45 +0900 Subject: [PATCH 152/236] Update README.md code bug --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1369eca2..6544285c 100644 --- a/README.md +++ b/README.md @@ -713,7 +713,7 @@ This code will provide the XML metadata file of our SP, based on the info that w Date: Mon, 6 Sep 2021 17:29:27 +0200 Subject: [PATCH 153/236] Fix #487. Enable strict check on in_array method --- lib/Saml2/Response.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Response.php b/lib/Saml2/Response.php index 58489194..1b57400e 100644 --- a/lib/Saml2/Response.php +++ b/lib/Saml2/Response.php @@ -792,7 +792,7 @@ private function _getAttributesByKeyName($keyName = "Name") $attributeKeyName = $attributeKeyNode->nodeValue; - if (in_array($attributeKeyName, array_keys($attributes))) { + if (in_array($attributeKeyName, array_keys($attributes), true)) { if (!$allowRepeatAttributeName) { throw new OneLogin_Saml2_ValidationError( "Found an Attribute element with duplicated ".$keyName, @@ -809,7 +809,7 @@ private function _getAttributesByKeyName($keyName = "Name") } } - if (in_array($attributeKeyName, array_keys($attributes))) { + if (in_array($attributeKeyName, array_keys($attributes), true)) { $attributes[$attributeKeyName] = array_merge($attributes[$attributeKeyName], $attributeValues); } else { $attributes[$attributeKeyName] = $attributeValues; From d074a814c45b96fd69b0401493385a17e006c533 Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Tue, 19 Oct 2021 19:28:57 +0200 Subject: [PATCH 154/236] Warn about Open Redirect and Reply attacks --- README.md | 35 +++++++++++++++++++++++++++++++++++ demo1/index.php | 8 +++++--- demo2/consume.php | 4 ++-- demo2/index.php | 2 +- endpoints/acs.php | 6 ++++-- endpoints/sls.php | 2 +- 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6544285c..e97cb71b 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,37 @@ environment is not secure and will be exposed to attacks. In production also we highly recommended to register on the settings the IdP certificate instead of using the fingerprint method. The fingerprint, is a hash, so at the end is open to a collision attack that can end on a signature validation bypass. Other SAML toolkits deprecated that mechanism, we maintain it for compatibility and also to be used on test environment. + +### Avoiding Open Redirect attacks ### + +Some implementations uses the RelayState parameter as a way to control the flow when SSO and SLO succeeded. So basically the +user is redirected to the value of the RelayState. + +If you are using Signature Validation on the HTTP-Redirect binding, you will have the RelayState value integrity covered, otherwise, and +on HTTP-POST binding, you can't trust the RelayState so before +executing the validation, you need to verify that its value belong +a trusted and expected URL. + +Read more about Open Redirect [CWE-601](https://cwe.mitre.org/data/definitions/601.html). + + +### Avoiding Reply attacks ### + +A reply attack is basically try to reuse an intercepted valid SAML Message in order to impersonate a SAML action (SSO or SLO). + +SAML Messages have a limited timelife (NotBefore, NotOnOrAfter) that +make harder this kind of attacks, but they are still possible. + +In order to avoid them, the SP can keep a list of SAML Messages or Assertion IDs alredy valdidated and processed. Those values only need +to be stored the amount of time of the SAML Message life time, so +we don't need to store all processed message/assertion Ids, but the most recent ones. + +The OneLogin_Saml2_Auth class contains the [getLastRequestID](https://github.com/onelogin/php-saml/blob/f08bc1e8321cc8b855481153a26b9ed57a5201c2/lib/Saml2/Auth.php#L623), [getLastMessageId](https://github.com/onelogin/php-saml/blob/f08bc1e8321cc8b855481153a26b9ed57a5201c2/lib/Saml2/Auth.php#L709) and [getLastAssertionId](https://github.com/onelogin/php-saml/blob/f08bc1e8321cc8b855481153a26b9ed57a5201c2/lib/Saml2/Auth.php#L717) methods to retrieve the IDs + +Checking that the ID of the current Message/Assertion does not exists in the list of the ones already processed will prevent reply +attacks. + + Getting started --------------- @@ -791,6 +822,8 @@ $_SESSION['samlNameidSPNameQualifier'] = $auth->getNameIdSPNameQualifier(); $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + // To avoid 'Open Redirect' attacks, before execute the + // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); } @@ -1129,6 +1162,8 @@ if (isset($_GET['sso'])) { // SSO action. Will send an AuthNRequest to the I $_SESSION['samlUserdata'] = $auth->getAttributes(); // Retrieves user data if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + // To avoid 'Open Redirect' attacks, before execute the + // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); // Redirect if there is a } // relayState set } else if (isset($_GET['sls'])) { // Single Logout Service diff --git a/demo1/index.php b/demo1/index.php index d3648ad0..8e1babd9 100644 --- a/demo1/index.php +++ b/demo1/index.php @@ -74,7 +74,7 @@ if (!empty($errors)) { echo '

',implode(', ', $errors),'

'; if ($auth->getSettings()->isDebugActive()) { - echo '

'.$auth->getLastErrorReason().'

'; + echo '

'.htmlentities($auth->getLastErrorReason()).'

'; } } @@ -91,6 +91,8 @@ $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); unset($_SESSION['AuthNRequestID']); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + // To avoid 'Open Redirect' attacks, before execute the + // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); } } else if (isset($_GET['sls'])) { @@ -105,9 +107,9 @@ if (empty($errors)) { echo '

Sucessfully logged out

'; } else { - echo '

', implode(', ', $errors), '

'; + echo '

', htmlentities(implode(', ', $errors)), '

'; if ($auth->getSettings()->isDebugActive()) { - echo '

'.$auth->getLastErrorReason().'

'; + echo '

'.htmlentities($auth->getLastErrorReason()).'

'; } } } diff --git a/demo2/consume.php b/demo2/consume.php index b7c5cdd7..adff0aa7 100644 --- a/demo2/consume.php +++ b/demo2/consume.php @@ -14,7 +14,7 @@ $samlSettings = new OneLogin_Saml2_Settings(); $samlResponse = new OneLogin_Saml2_Response($samlSettings, $_POST['SAMLResponse']); if ($samlResponse->isValid()) { - echo 'You are: ' . $samlResponse->getNameId() . '
'; + echo 'You are: ' . htmlentities($samlResponse->getNameId()) . '
'; $attributes = $samlResponse->getAttributes(); if (!empty($attributes)) { echo 'You have the following attributes:
'; @@ -35,5 +35,5 @@ echo 'No SAML Response found in POST.'; } } catch (Exception $e) { - echo 'Invalid SAML Response: ' . $e->getMessage(); + echo 'Invalid SAML Response: ' . htmlentities($e->getMessage()); } diff --git a/demo2/index.php b/demo2/index.php index 64f6e0c1..cea57e83 100755 --- a/demo2/index.php +++ b/demo2/index.php @@ -39,7 +39,7 @@ } echo ''; if (!empty($_SESSION['IdPSessionIndex'])) { - echo '

The SessionIndex of the IdP is: '.$_SESSION['IdPSessionIndex'].'

'; + echo '

The SessionIndex of the IdP is: '.htmlentities($_SESSION['IdPSessionIndex']).'

'; } } else { echo "

You don't have any attribute

"; diff --git a/endpoints/acs.php b/endpoints/acs.php index 431455fd..280c961a 100644 --- a/endpoints/acs.php +++ b/endpoints/acs.php @@ -15,7 +15,7 @@ $errors = $auth->getErrors(); if (!empty($errors)) { - echo '

', implode(', ', $errors), '

'; + echo '

', htmlentities(implode(', ', $errors)), '

'; exit(); } @@ -27,6 +27,8 @@ $_SESSION['samlUserdata'] = $auth->getAttributes(); $_SESSION['IdPSessionIndex'] = $auth->getSessionIndex(); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + // To avoid 'Open Redirect' attacks, before execute the + // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); } @@ -44,7 +46,7 @@ } echo ''; if (!empty($_SESSION['IdPSessionIndex'])) { - echo '

The SessionIndex of the IdP is: '.$_SESSION['IdPSessionIndex'].'

'; + echo '

The SessionIndex of the IdP is: '.htmlentities($_SESSION['IdPSessionIndex']).'

'; } } else { echo _('Attributes not found'); diff --git a/endpoints/sls.php b/endpoints/sls.php index 8fd1078f..7dd508ba 100644 --- a/endpoints/sls.php +++ b/endpoints/sls.php @@ -16,5 +16,5 @@ if (empty($errors)) { echo 'Sucessfully logged out'; } else { - echo implode(', ', $errors); + echo htmlentities(implode(', ', $errors)); } From 655a3cf7baff9b32027226634a21fa7029c57659 Mon Sep 17 00:00:00 2001 From: Zhangqi Chen Date: Sun, 30 Jan 2022 11:23:07 +0800 Subject: [PATCH 155/236] Make `Saml2\Auth` can accept a param `$spValidationOnly` The user who uses this package can decide if they want to make `$spValidationOnly` to be true --- lib/Saml2/Auth.php | 5 +++-- tests/src/OneLogin/Saml2/SettingsTest.php | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index 8a97cc33..d510bb4f 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -144,12 +144,13 @@ class OneLogin_Saml2_Auth * Initializes the SP SAML instance. * * @param array|object|null $oldSettings Setting data (You can provide a OneLogin_Saml_Settings, the settings object of the Saml folder implementation) + * @param bool $spValidationOnly if you only as an SP , you should set it to false if not you should set it to true * * @throws OneLogin_Saml2_Error */ - public function __construct($oldSettings = null) + public function __construct($oldSettings = null , $spValidationOnly = true) { - $this->_settings = new OneLogin_Saml2_Settings($oldSettings); + $this->_settings = new OneLogin_Saml2_Settings($oldSettings, $spValidationOnly); } /** diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 66f041ed..1380a121 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -1164,4 +1164,17 @@ public function testIsDebugActive() $settings3 = new OneLogin_Saml2_Settings($settingsInfo); $this->assertTrue($settings3->isDebugActive()); } + /** + * Tests the checkSettings method of the OneLogin_Saml2_Settings + * + * @covers OneLogin_Saml2_Settings::checkSettings + */ + public function testSpValidateOnlyIsTrue() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings2.php'; + unset($settingsInfo['idp']); + $settings = new OneLogin_Saml2_Settings($settingsInfo,true); + $this->assertEmpty($settings->getErrors()); + } } From 04232b7e86e00f9d1bd70733a2792667e2a51a01 Mon Sep 17 00:00:00 2001 From: Zhangqi Chen Date: Wed, 23 Feb 2022 11:22:55 +0800 Subject: [PATCH 156/236] Fix style error and add another test for my changes --- lib/Saml2/Auth.php | 2 +- tests/src/OneLogin/Saml2/SettingsTest.php | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/Saml2/Auth.php b/lib/Saml2/Auth.php index d510bb4f..df769531 100644 --- a/lib/Saml2/Auth.php +++ b/lib/Saml2/Auth.php @@ -148,7 +148,7 @@ class OneLogin_Saml2_Auth * * @throws OneLogin_Saml2_Error */ - public function __construct($oldSettings = null , $spValidationOnly = true) + public function __construct($oldSettings = null , $spValidationOnly = false) { $this->_settings = new OneLogin_Saml2_Settings($oldSettings, $spValidationOnly); } diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 1380a121..6da2e5d2 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -1165,7 +1165,7 @@ public function testIsDebugActive() $this->assertTrue($settings3->isDebugActive()); } /** - * Tests the checkSettings method of the OneLogin_Saml2_Settings + * Tests the checkSettings method of the OneLogin_Saml2_Settings when SpValidateOnly is false and IdP is not defined * * @covers OneLogin_Saml2_Settings::checkSettings */ @@ -1174,7 +1174,25 @@ public function testSpValidateOnlyIsTrue() $settingsDir = TEST_ROOT .'/settings/'; include $settingsDir.'settings2.php'; unset($settingsInfo['idp']); - $settings = new OneLogin_Saml2_Settings($settingsInfo,true); + $settings = new OneLogin_Saml2_Settings($settingsInfo, true); $this->assertEmpty($settings->getErrors()); } + + /** + * Tests the checkSettings method of the OneLogin_Saml2_Settings when SpValidateOnly is false and IdP is not defined + * + * @covers OneLogin_Saml2_Settings::checkSettings + */ + public function testSpValidateOnlyIsFalse() + { + $settingsDir = TEST_ROOT .'/settings/'; + include $settingsDir.'settings2.php'; + unset($settingsInfo['idp']); + try { + $settings = new OneLogin_Saml2_Settings($settingsInfo); + }catch (OneLogin_Saml2_Error $e) { + $this->assertContains('idp_not_found', $e->getMessage()); + } + $this->assertEmpty($settings); + } } From b35b96c21f2ece659fde4e106032ddebdeb74065 Mon Sep 17 00:00:00 2001 From: Zhangqi Chen Date: Fri, 25 Feb 2022 09:51:15 +0800 Subject: [PATCH 157/236] Fix tests error. --- tests/src/OneLogin/Saml2/SettingsTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/src/OneLogin/Saml2/SettingsTest.php b/tests/src/OneLogin/Saml2/SettingsTest.php index 6da2e5d2..be03fe76 100644 --- a/tests/src/OneLogin/Saml2/SettingsTest.php +++ b/tests/src/OneLogin/Saml2/SettingsTest.php @@ -1193,6 +1193,5 @@ public function testSpValidateOnlyIsFalse() }catch (OneLogin_Saml2_Error $e) { $this->assertContains('idp_not_found', $e->getMessage()); } - $this->assertEmpty($settings); } } From f04475edd397537e86763fa63b9192b6567a07a8 Mon Sep 17 00:00:00 2001 From: Zhangqi Chen Date: Mon, 28 Feb 2022 09:58:08 +0800 Subject: [PATCH 158/236] Fix action errors by change the `NotOnOrAfter` --- tests/data/responses/invalids/encrypted_attrs.xml.base64 | 2 +- tests/data/responses/invalids/invalid_audience.xml.base64 | 2 +- .../data/responses/invalids/invalid_issuer_assertion.xml.base64 | 2 +- tests/data/responses/invalids/invalid_issuer_message.xml.base64 | 2 +- tests/data/responses/invalids/invalid_sessionindex.xml.base64 | 2 +- .../invalids/invalid_subjectconfirmation_inresponse.xml.base64 | 2 +- .../invalids/invalid_subjectconfirmation_noa.xml.base64 | 2 +- .../invalids/invalid_subjectconfirmation_recipient.xml.base64 | 2 +- .../responses/invalids/no_subjectconfirmation_data.xml.base64 | 2 +- .../responses/invalids/no_subjectconfirmation_method.xml.base64 | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/data/responses/invalids/encrypted_attrs.xml.base64 b/tests/data/responses/invalids/encrypted_attrs.xml.base64 index f452075c..64438cbb 100644 --- a/tests/data/responses/invalids/encrypted_attrs.xml.base64 +++ b/tests/data/responses/invalids/encrypted_attrs.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaGh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NFoiIE5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QxNDo1OToxNFoiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPg0KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgPC9zYW1sOkNvbmRpdGlvbnM+DQogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KIDxzYW1sOkVuY3J5cHRlZEF0dHJpYnV0ZSB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj4NCiAgICAgICAgICA8eGVuYzpFbmNyeXB0ZWREYXRhIHhtbG5zOnhlbmM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIyIgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjRWxlbWVudCIgSWQ9Il9GMzk2MjVBRjY4QjRGQzA3OENDNzU4MkQyOEQwNUQ5QyI+DQogICAgICAgICAgICA8eGVuYzpFbmNyeXB0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjYWVzMjU2LWNiYyIvPg0KICAgICAgICAgICAgPGRzOktleUluZm8geG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgICAgICAgICA8eGVuYzpFbmNyeXB0ZWRLZXk+DQogICAgICAgICAgICAgICAgPHhlbmM6RW5jcnlwdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3JzYS1vYWVwLW1nZjFwIi8+DQogICAgICAgICAgICAgICAgPGRzOktleUluZm8geG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogICAgICAgICAgICAgICAgICA8ZHM6S2V5TmFtZT42MjM1NWZiZDFmNjI0NTAzYzVjOTY3NzQwMmVjY2EwMGVmMWY2Mjc3PC9kczpLZXlOYW1lPg0KICAgICAgICAgICAgICAgIDwvZHM6S2V5SW5mbz4NCiAgICAgICAgICAgICAgICA8eGVuYzpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgICAgICAgPHhlbmM6Q2lwaGVyVmFsdWU+SzBtQkx4Zkx6aUtWVUtFQU9ZZTdENnVWU0NQeTh2eVdWaDNSZWNuUEVTKzhRa0FoT3VSU3VFL0xRcEZyMGh1SS9pQ0V5OXBkZTFRZ2pZREx0akhjdWpLaTJ4R3FXNmprWFcvRXVLb21xV1BQQTJ4WXMxZnBCMXN1NGFYVU9RQjZPSjcwL29EY09zeTgzNGdoRmFCV2lsRThmcXlEQlVCdlcrMkl2YU1VWmFid04vczltVmtXek0zcjMwdGxraExLN2lPcmJHQWxkSUh3RlU1ejdQUFI2Uk8zWTNmSXhqSFU0ME9uTHNKYzN4SXFkTEgzZlhwQzBrZ2k1VXNwTGRxMTRlNU9vWGpMb1BHM0JPM3p3T0FJSjhYTkJXWTV1UW9mNktyS2JjdnRaU1kwZk12UFloWWZOanRSRnk4eTQ5b3ZMOWZ3akNSVERsVDUrYUhxc0NUQnJ3PT08L3hlbmM6Q2lwaGVyVmFsdWU+DQogICAgICAgICAgICAgICAgPC94ZW5jOkNpcGhlckRhdGE+DQogICAgICAgICAgICAgIDwveGVuYzpFbmNyeXB0ZWRLZXk+DQogICAgICAgICAgICA8L2RzOktleUluZm8+DQogICAgICAgICAgICA8eGVuYzpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgICA8eGVuYzpDaXBoZXJWYWx1ZT5aekN1NmF4R2dBWVpIVmY3N05YOGFwWktCL0dKRGV1VjZiRkJ5QlMwQUlnaVhrdkRVQW1MQ3BhYlRBV0JNK3l6MTlvbEE2cnJ5dU9mcjgyZXYyYnpQTlVSdm00U1l4YWh2dUw0UGlibjV3Smt5MEJsNTRWcW1jVStBcWowZEF2T2dxRzF5M1g0d085bjliUnNUdjY5MjFtMGVxUkFGcGg4a0s4TDloaXJLMUJ4WUJZajJSeUZDb0ZEUHhWWjV3eXJhM3E0cW1FNC9FTFFwRlA2bWZVOExYYjB1b1dKVWpHVWVsUzJBYTdiWmlzOHpFcHdvdjRDd3RsTmpsdFFpaDRtdjd0dENBZllxY1FJRnpCVEIrREFhMCtYZ2d4Q0xjZEIzK21RaVJjRUNCZndISEo3Z1JtbnVCRWdlV1QzQ0dLYTNOYjdHTVhPZnV4RktGNXBJZWhXZ28za2ROUUxhbG9yOFJWVzZJOFAvSThmUTMzRmUrTnNIVm5KM3p3U0EvL2E8L3hlbmM6Q2lwaGVyVmFsdWU+DQogICAgICAgICAgICA8L3hlbmM6Q2lwaGVyRGF0YT4NCiAgICAgICAgICA8L3hlbmM6RW5jcnlwdGVkRGF0YT4NCiAgICAgICAgPC9zYW1sOkVuY3J5cHRlZEF0dHJpYnV0ZT4NCiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICA8L3NhbWw6QXNzZXJ0aW9uPg0KPC9zYW1scDpSZXNwb25zZT4= +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9ImhodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPgogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4KICAgIDwvc2FtbDpTdWJqZWN0PgogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIj4KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+CiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgPC9zYW1sOkNvbmRpdGlvbnM+CiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0PgogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPgogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0PgogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogPHNhbWw6RW5jcnlwdGVkQXR0cmlidXRlIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPgogICAgICAgICAgPHhlbmM6RW5jcnlwdGVkRGF0YSB4bWxuczp4ZW5jPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI0VsZW1lbnQiIElkPSJfRjM5NjI1QUY2OEI0RkMwNzhDQzc1ODJEMjhEMDVEOUMiPgogICAgICAgICAgICA8eGVuYzpFbmNyeXB0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjYWVzMjU2LWNiYyIvPgogICAgICAgICAgICA8ZHM6S2V5SW5mbyB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgICAgICAgICAgICAgPHhlbmM6RW5jcnlwdGVkS2V5PgogICAgICAgICAgICAgICAgPHhlbmM6RW5jcnlwdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3JzYS1vYWVwLW1nZjFwIi8+CiAgICAgICAgICAgICAgICA8ZHM6S2V5SW5mbyB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KICAgICAgICAgICAgICAgICAgPGRzOktleU5hbWU+NjIzNTVmYmQxZjYyNDUwM2M1Yzk2Nzc0MDJlY2NhMDBlZjFmNjI3NzwvZHM6S2V5TmFtZT4KICAgICAgICAgICAgICAgIDwvZHM6S2V5SW5mbz4KICAgICAgICAgICAgICAgIDx4ZW5jOkNpcGhlckRhdGE+CiAgICAgICAgICAgICAgICAgIDx4ZW5jOkNpcGhlclZhbHVlPkswbUJMeGZMemlLVlVLRUFPWWU3RDZ1VlNDUHk4dnlXVmgzUmVjblBFUys4UWtBaE91UlN1RS9MUXBGcjBodUkvaUNFeTlwZGUxUWdqWURMdGpIY3VqS2kyeEdxVzZqa1hXL0V1S29tcVdQUEEyeFlzMWZwQjFzdTRhWFVPUUI2T0o3MC9vRGNPc3k4MzRnaEZhQldpbEU4ZnF5REJVQnZXKzJJdmFNVVphYndOL3M5bVZrV3pNM3IzMHRsa2hMSzdpT3JiR0FsZElId0ZVNXo3UFBSNlJPM1kzZkl4akhVNDBPbkxzSmMzeElxZExIM2ZYcEMwa2dpNVVzcExkcTE0ZTVPb1hqTG9QRzNCTzN6d09BSUo4WE5CV1k1dVFvZjZLcktiY3Z0WlNZMGZNdlBZaFlmTmp0UkZ5OHk0OW92TDlmd2pDUlREbFQ1K2FIcXNDVEJydz09PC94ZW5jOkNpcGhlclZhbHVlPgogICAgICAgICAgICAgICAgPC94ZW5jOkNpcGhlckRhdGE+CiAgICAgICAgICAgICAgPC94ZW5jOkVuY3J5cHRlZEtleT4KICAgICAgICAgICAgPC9kczpLZXlJbmZvPgogICAgICAgICAgICA8eGVuYzpDaXBoZXJEYXRhPgogICAgICAgICAgICAgIDx4ZW5jOkNpcGhlclZhbHVlPlp6Q3U2YXhHZ0FZWkhWZjc3Tlg4YXBaS0IvR0pEZXVWNmJGQnlCUzBBSWdpWGt2RFVBbUxDcGFiVEFXQk0reXoxOW9sQTZycnl1T2ZyODJldjJielBOVVJ2bTRTWXhhaHZ1TDRQaWJuNXdKa3kwQmw1NFZxbWNVK0FxajBkQXZPZ3FHMXkzWDR3TzluOWJSc1R2NjkyMW0wZXFSQUZwaDhrSzhMOWhpcksxQnhZQllqMlJ5RkNvRkRQeFZaNXd5cmEzcTRxbUU0L0VMUXBGUDZtZlU4TFhiMHVvV0pVakdVZWxTMkFhN2JaaXM4ekVwd292NEN3dGxOamx0UWloNG12N3R0Q0FmWXFjUUlGekJUQitEQWEwK1hnZ3hDTGNkQjMrbVFpUmNFQ0Jmd0hISjdnUm1udUJFZ2VXVDNDR0thM05iN0dNWE9mdXhGS0Y1cEllaFdnbzNrZE5RTGFsb3I4UlZXNkk4UC9JOGZRMzNGZStOc0hWbkozendTQS8vYTwveGVuYzpDaXBoZXJWYWx1ZT4KICAgICAgICAgICAgPC94ZW5jOkNpcGhlckRhdGE+CiAgICAgICAgICA8L3hlbmM6RW5jcnlwdGVkRGF0YT4KICAgICAgICA8L3NhbWw6RW5jcnlwdGVkQXR0cmlidXRlPgogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICA8L3NhbWw6QXNzZXJ0aW9uPgo8L3NhbWxwOlJlc3BvbnNlPg== \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_audience.xml.base64 b/tests/data/responses/invalids/invalid_audience.xml.base64 index a2575836..3bf86bb7 100644 --- a/tests/data/responses/invalids/invalid_audience.xml.base64 +++ b/tests/data/responses/invalids/invalid_audience.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9pbnZhbGlkLmF1ZGllbmNlLmNvbTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiLz4KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWw6U3ViamVjdD4KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDE0OjU5OjE0WiI+CiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL2ludmFsaWQuYXVkaWVuY2UuY29tPC9zYW1sOkF1ZGllbmNlPgogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgIDwvc2FtbDpDb25kaXRpb25zPgogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjA5OS0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+CiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+CiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogIDwvc2FtbDpBc3NlcnRpb24+Cjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_issuer_assertion.xml.base64 b/tests/data/responses/invalids/invalid_issuer_assertion.xml.base64 index 07748ece..794c6c60 100644 --- a/tests/data/responses/invalids/invalid_issuer_assertion.xml.base64 +++ b/tests/data/responses/invalids/invalid_issuer_assertion.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2ludmFsaWQuaXNzdWVyLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIA0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJoZWxsby5jb20iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOk5hbWVJRD4NCiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4NCiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIwLTA2LTE3VDE0OjU5OjE0WiIgUmVjaXBpZW50PSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NFoiIE5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QxNDo1OToxNFoiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPg0KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgPC9zYW1sOkNvbmRpdGlvbnM+DQogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICA8L3NhbWw6QXNzZXJ0aW9uPg0KPC9zYW1scDpSZXNwb25zZT4= +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaW52YWxpZC5pc3N1ZXIuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4gICAgCiAgICA8c2FtbDpTdWJqZWN0PgogICAgICA8c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJoZWxsby5jb20iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOk5hbWVJRD4KICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPgogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjA5OS0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPgogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4KICAgIDwvc2FtbDpTdWJqZWN0PgogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIj4KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+CiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgPC9zYW1sOkNvbmRpdGlvbnM+CiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0PgogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPgogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0PgogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sOkFzc2VydGlvbj4KPC9zYW1scDpSZXNwb25zZT4= \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_issuer_message.xml.base64 b/tests/data/responses/invalids/invalid_issuer_message.xml.base64 index f1f49fe5..a65a79c1 100644 --- a/tests/data/responses/invalids/invalid_issuer_message.xml.base64 +++ b/tests/data/responses/invalids/invalid_issuer_message.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaW52YWxpZC5pc3Nlci5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4NCiAgPC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHA6Ly9pZHAuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4gICAgDQogICAgPHNhbWw6U3ViamVjdD4NCiAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9ImhlbGxvLmNvbSIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6TmFtZUlEPg0KICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPg0KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiLz4NCiAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDE0OjU5OjE0WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4NCiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4NCiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogIDwvc2FtbDpBc3NlcnRpb24+DQo8L3NhbWxwOlJlc3BvbnNlPg0KICA= +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2ludmFsaWQuaXNzZXIuZXhhbXBsZS5jb20vPC9zYW1sOklzc3Vlcj4KICA8c2FtbHA6U3RhdHVzPgogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPgogIDwvc2FtbHA6U3RhdHVzPgogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIElEPSJwZng3ODQxOTkxYy1jNzNmLTQwMzUtZTJlZS1jMTcwYzBlMWQzZTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjE0WiI+CiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICAKICAgIDxzYW1sOlN1YmplY3Q+CiAgICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9ImhlbGxvLmNvbSIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6TmFtZUlEPgogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+CiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDE0OjU5OjE0WiIgUmVjaXBpZW50PSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+CiAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPgogICAgPC9zYW1sOlN1YmplY3Q+CiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NFoiIE5vdE9uT3JBZnRlcj0iMjA5OS0wNi0xN1QxNDo1OToxNFoiPgogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICA8L3NhbWw6Q29uZGl0aW9ucz4KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPgogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+CiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+CiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+CiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+CiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWw6QXR0cmlidXRlPgogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICA8L3NhbWw6QXNzZXJ0aW9uPgo8L3NhbWxwOlJlc3BvbnNlPg== \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_sessionindex.xml.base64 b/tests/data/responses/invalids/invalid_sessionindex.xml.base64 index cc5a581c..b1873e14 100644 --- a/tests/data/responses/invalids/invalid_sessionindex.xml.base64 +++ b/tests/data/responses/invalids/invalid_sessionindex.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTMtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiLz4KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWw6U3ViamVjdD4KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDE0OjU5OjE0WiI+CiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPgogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgIDwvc2FtbDpDb25kaXRpb25zPgogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAxMy0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+CiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+CiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogIDwvc2FtbDpBc3NlcnRpb24+Cjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 b/tests/data/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 index 2ce545f8..5ee14894 100644 --- a/tests/data/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 +++ b/tests/data/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iaW52YWxpZF9pbnJlc3BvbnNlIi8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NFoiIE5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QxNDo1OToxNFoiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPg0KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgPC9zYW1sOkNvbmRpdGlvbnM+DQogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAyMS0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICA8L3NhbWw6QXNzZXJ0aW9uPg0KPC9zYW1scDpSZXNwb25zZT4= +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89ImludmFsaWRfaW5yZXNwb25zZSIvPgogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4KICAgIDwvc2FtbDpTdWJqZWN0PgogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIj4KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+CiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgPC9zYW1sOkNvbmRpdGlvbnM+CiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0PgogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPgogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0PgogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sOkFzc2VydGlvbj4KPC9zYW1scDpSZXNwb25zZT4= \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 b/tests/data/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 index 6d4b70aa..926336ba 100644 --- a/tests/data/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 +++ b/tests/data/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjI5OTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzhfZXJyb3IiLz4KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWw6U3ViamVjdD4KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyOTk5LTA2LTE3VDE0OjU5OjE0WiI+CiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPgogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgIDwvc2FtbDpDb25kaXRpb25zPgogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjk5OS0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+CiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+CiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogIDwvc2FtbDpBc3NlcnRpb24+Cjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 b/tests/data/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 index 1bf1d25a..4ce477a3 100644 --- a/tests/data/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 +++ b/tests/data/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMC0wNi0xN1QxNDo1OToxNFoiIFJlY2lwaWVudD0iaHR0cDovL2ludmFsaWQucmVjaXBlbnQuZXhhbXBsZS5jb20iIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCIvPg0KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+DQogICAgPC9zYW1sOlN1YmplY3Q+DQogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMTQ6NTk6MTRaIj4NCiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPg0KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4NCiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+DQogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50Pg0KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+ +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwOTktMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9pbnZhbGlkLnJlY2lwZW50LmV4YW1wbGUuY29tIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiLz4KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWw6U3ViamVjdD4KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDk5LTA2LTE3VDE0OjU5OjE0WiI+CiAgICAgIDxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWw6QXVkaWVuY2U+aHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvbWV0YWRhdGEucGhwPC9zYW1sOkF1ZGllbmNlPgogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgIDwvc2FtbDpDb25kaXRpb25zPgogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDExLTA2LTE3VDE0OjU0OjA3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjA5OS0wNi0xN1QyMjo1NDoxNFoiIFNlc3Npb25JbmRleD0iXzUxYmUzNzk2NWZlYjU1NzlkODAzMTQxMDc2OTM2ZGMyZTlkMWQ5OGViZiI+CiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4KICAgICAgICA8c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4KICAgIDxzYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9Im1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+CiAgICA8L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogIDwvc2FtbDpBc3NlcnRpb24+Cjwvc2FtbHA6UmVzcG9uc2U+ \ No newline at end of file diff --git a/tests/data/responses/invalids/no_subjectconfirmation_data.xml.base64 b/tests/data/responses/invalids/no_subjectconfirmation_data.xml.base64 index 3c92f561..0c0c1837 100644 --- a/tests/data/responses/invalids/no_subjectconfirmation_data.xml.base64 +++ b/tests/data/responses/invalids/no_subjectconfirmation_data.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+ICAgICAgICANCiAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDE0OjU5OjE0WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4NCiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4NCiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogIDwvc2FtbDpBc3NlcnRpb24+DQo8L3NhbWxwOlJlc3BvbnNlPg== +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4gICAgICAgIAogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4KICAgIDwvc2FtbDpTdWJqZWN0PgogICAgPHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTAtMDYtMTdUMTQ6NTM6NDRaIiBOb3RPbk9yQWZ0ZXI9IjIwNDktMDYtMTdUMTQ6NTk6MTRaIj4KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+CiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgPC9zYW1sOkNvbmRpdGlvbnM+CiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDQ5LTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4KICAgICAgPHNhbWw6QXV0aG5Db250ZXh0PgogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPgogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0PgogICAgPC9zYW1sOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PgogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sOkFzc2VydGlvbj4KPC9zYW1scDpSZXNwb25zZT4= \ No newline at end of file diff --git a/tests/data/responses/invalids/no_subjectconfirmation_method.xml.base64 b/tests/data/responses/invalids/no_subjectconfirmation_method.xml.base64 index 07ce153a..ef222469 100644 --- a/tests/data/responses/invalids/no_subjectconfirmation_method.xml.base64 +++ b/tests/data/responses/invalids/no_subjectconfirmation_method.xml.base64 @@ -1 +1 @@ -PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgSUQ9InBmeGMzMmFlZDY3LTgyMGYtNDI5Ni0wYzIwLTIwNWExMGRkNTc4NyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIiBEZXN0aW5hdGlvbj0iaHR0cDovL3N0dWZmLmNvbS9lbmRwb2ludHMvZW5kcG9pbnRzL2Fjcy5waHAiIEluUmVzcG9uc2VUbz0iXzU3YmNiZjcwLTdiMWYtMDEyZS1jODIxLTc4MmJjYjEzYmIzOCI+DQogIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+DQogIDxzYW1scDpTdGF0dXM+DQogICAgPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPg0KICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPiAgICANCiAgICA8c2FtbDpTdWJqZWN0Pg0KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmhvbGRlci1vZi1rZXkiPg0KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDYtMTdUMTQ6NTk6MTRaIiBSZWNpcGllbnQ9Imh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL2VuZHBvaW50cy9hY3MucGhwIiBJblJlc3BvbnNlVG89Il81N2JjYmY3MC03YjFmLTAxMmUtYzgyMS03ODJiY2IxM2JiMzgiLz4NCiAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTA2LTE3VDE0OjUzOjQ0WiIgTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDE0OjU5OjE0WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9tZXRhZGF0YS5waHA8L3NhbWw6QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MDdaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIxLTA2LTE3VDIyOjU0OjE0WiIgU2Vzc2lvbkluZGV4PSJfNTFiZTM3OTY1ZmViNTU3OWQ4MDMxNDEwNzY5MzZkYzJlOWQxZDk4ZWJmIj4NCiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4NCiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0ibWFpbCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNvbWVvbmVAZXhhbXBsZS5jb208L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogIDwvc2FtbDpBc3NlcnRpb24+DQo8L3NhbWxwOlJlc3BvbnNlPg== +PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0icGZ4YzMyYWVkNjctODIwZi00Mjk2LTBjMjAtMjA1YTEwZGQ1Nzg3IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDoxNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ij4KICA8c2FtbDpJc3N1ZXI+aHR0cDovL2lkcC5leGFtcGxlLmNvbS88L3NhbWw6SXNzdWVyPgogIDxzYW1scDpTdGF0dXM+CiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+CiAgPC9zYW1scDpTdGF0dXM+CiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9InBmeDc4NDE5OTFjLWM3M2YtNDAzNS1lMmVlLWMxNzBjMGUxZDNlNCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTEtMDYtMTdUMTQ6NTQ6MTRaIj4KICAgIDxzYW1sOklzc3Vlcj5odHRwOi8vaWRwLmV4YW1wbGUuY29tLzwvc2FtbDpJc3N1ZXI+ICAgIAogICAgPHNhbWw6U3ViamVjdD4KICAgICAgPHNhbWw6TmFtZUlEIFNQTmFtZVF1YWxpZmllcj0iaGVsbG8uY29tIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzcyI+c29tZW9uZUBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206aG9sZGVyLW9mLWtleSI+CiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDQ5LTA2LTE3VDE0OjU5OjE0WiIgUmVjaXBpZW50PSJodHRwOi8vc3R1ZmYuY29tL2VuZHBvaW50cy9lbmRwb2ludHMvYWNzLnBocCIgSW5SZXNwb25zZVRvPSJfNTdiY2JmNzAtN2IxZi0wMTJlLWM4MjEtNzgyYmNiMTNiYjM4Ii8+CiAgICAgIDwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPgogICAgPC9zYW1sOlN1YmplY3Q+CiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0wNi0xN1QxNDo1Mzo0NFoiIE5vdE9uT3JBZnRlcj0iMjA0OS0wNi0xN1QxNDo1OToxNFoiPgogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgICAgIDxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9zdHVmZi5jb20vZW5kcG9pbnRzL21ldGFkYXRhLnBocDwvc2FtbDpBdWRpZW5jZT4KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICA8L3NhbWw6Q29uZGl0aW9ucz4KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0xN1QxNDo1NDowN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwNDktMDYtMTdUMjI6NTQ6MTRaIiBTZXNzaW9uSW5kZXg9Il81MWJlMzc5NjVmZWI1NTc5ZDgwMzE0MTA3NjkzNmRjMmU5ZDFkOThlYmYiPgogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+CiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+CiAgICAgIDwvc2FtbDpBdXRobkNvbnRleHQ+CiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+CiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj4KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zb21lb25lQGV4YW1wbGUuY29tPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWw6QXR0cmlidXRlPgogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4KICA8L3NhbWw6QXNzZXJ0aW9uPgo8L3NhbWxwOlJlc3BvbnNlPg== \ No newline at end of file From 20a2cb3e2c2722f4a06d2b16006d5e140adb48db Mon Sep 17 00:00:00 2001 From: Bryan Vestey Date: Fri, 12 Aug 2022 09:48:44 -0700 Subject: [PATCH 159/236] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e97cb71b..9f0ebb02 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Build Status](https://api.travis-ci.org/onelogin/php-saml.png?branch=master)](http://travis-ci.org/onelogin/php-saml) [![Coverage Status](https://coveralls.io/repos/onelogin/php-saml/badge.png)](https://coveralls.io/r/onelogin/php-saml) [![License](https://poser.pugx.org/onelogin/php-saml/license.png)](https://packagist.org/packages/onelogin/php-saml) +## **Notice:** This project is currently not under active development, please see [#531](https://github.com/onelogin/php-saml/issues/531) for more information. + Add SAML support to your PHP software using this library. Forget those complicated libraries and use this open source library provided and supported by OneLogin Inc. From e2657c3f2cea55180ebe976b28e1c4b7a358dc5a Mon Sep 17 00:00:00 2001 From: George Khaburzaniya Date: Fri, 18 Nov 2022 14:25:37 -0800 Subject: [PATCH 160/236] Remove references to onelogin support. --- README.md | 40 ++- certs/README | 2 +- composer.json | 2 +- demo-old/consume.php | 2 +- demo1/Readme.txt | 4 +- demo2/Readme.txt | 12 +- .../classes/OneLogin_Saml_AuthRequest.html | 52 ++-- docs/Saml/classes/OneLogin_Saml_Metadata.html | 54 ++-- docs/Saml/classes/OneLogin_Saml_Response.html | 44 ++-- docs/Saml/classes/OneLogin_Saml_Settings.html | 80 +++--- docs/Saml/classes/OneLogin_Saml_XmlSec.html | 60 ++--- docs/Saml/graph_class.html | 12 +- docs/Saml/index.html | 18 +- docs/Saml/namespaces/default.html | 24 +- docs/Saml2/classes/OneLogin_Saml2_Auth.html | 158 ++++++------ .../classes/OneLogin_Saml2_AuthnRequest.html | 54 ++-- .../classes/OneLogin_Saml2_Constants.html | 184 ++++++------- docs/Saml2/classes/OneLogin_Saml2_Error.html | 82 +++--- .../classes/OneLogin_Saml2_LogoutRequest.html | 76 +++--- .../OneLogin_Saml2_LogoutResponse.html | 80 +++--- .../classes/OneLogin_Saml2_Metadata.html | 46 ++-- .../classes/OneLogin_Saml2_Response.html | 138 +++++----- .../classes/OneLogin_Saml2_Settings.html | 244 +++++++++--------- docs/Saml2/classes/OneLogin_Saml2_Utils.html | 152 +++++------ docs/Saml2/graph_class.html | 12 +- docs/Saml2/index.html | 14 +- docs/Saml2/namespaces/default.html | 34 +-- lib/Saml2/Auth.php | 4 +- lib/Saml2/Constants.php | 4 +- lib/Saml2/Error.php | 4 +- lib/Saml2/IdPMetadataParser.php | 2 +- lib/Saml2/Metadata.php | 2 +- lib/Saml2/Settings.php | 2 +- lib/Saml2/Utils.php | 2 +- phpdoc.xml | 2 +- phpunit.xml | 2 +- settings_example.php | 12 +- 37 files changed, 856 insertions(+), 860 deletions(-) diff --git a/README.md b/README.md index 9f0ebb02..d91ca948 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,8 @@ -# OneLogin's SAML PHP Toolkit +# SAML PHP Toolkit [![Build Status](https://api.travis-ci.org/onelogin/php-saml.png?branch=master)](http://travis-ci.org/onelogin/php-saml) [![Coverage Status](https://coveralls.io/repos/onelogin/php-saml/badge.png)](https://coveralls.io/r/onelogin/php-saml) [![License](https://poser.pugx.org/onelogin/php-saml/license.png)](https://packagist.org/packages/onelogin/php-saml) -## **Notice:** This project is currently not under active development, please see [#531](https://github.com/onelogin/php-saml/issues/531) for more information. - Add SAML support to your PHP software using this library. -Forget those complicated libraries and use this open source library provided -and supported by OneLogin Inc. **The 3.X branch is compatible with PHP > 7.1, so if you are using that PHP version, use it and not the 2.X or the master branch** @@ -22,7 +18,7 @@ Version 2.17.0 sets strict mode active by default Update php-saml to 2.15.0, this version includes a security patch related to XEE attacks -php-saml is not affected by [201803-01](https://simplesamlphp.org/security/201803-01) +php-saml is not affected by [201803-01](https://simplesamlphp.org/security/201803-01) Update php-saml to 2.10.4, this version includes a security patch related to [signature validations on LogoutRequests/LogoutResponses](https://github.com/onelogin/php-saml/commit/949359f5cad5e1d085c4e5447d9aa8f49a6e82a1) @@ -35,7 +31,7 @@ php-saml < v2.10.0 is vulnerable and allows signature wrapping! Security Guidelines ------------------- -If you believe you have discovered a security vulnerability in this toolkit, please report it at https://www.onelogin.com/security with a description. We follow responsible disclosure guidelines, and will work with you to quickly find a resolution. +If you believe you have discovered a security vulnerability in this toolkit, please report it as an issue Why add SAML support to my software? @@ -65,7 +61,7 @@ since 2002, but lately it is becoming popular due its advantages: General description ------------------- -OneLogin's SAML PHP toolkit let you build a SP (Service Provider) over +SAML PHP toolkit let you build a SP (Service Provider) over your PHP application and connect it to any IdP (Identity Provider). Supports: @@ -86,7 +82,7 @@ Key features: * **Easy to use** - Programmer will be allowed to code high-level and low-level programming, 2 easy to use APIs are available. * **Tested** - Thoroughly tested. - * **Popular** - OneLogin's customers use it. Many PHP SAML plugins uses it. + * **Popular** - customers use it. Many PHP SAML plugins uses it. Integrate your PHP toolkit at OneLogin using this guide: [https://developers.onelogin.com/page/saml-toolkit-for-php](https://developers.onelogin.com/page/saml-toolkit-for-php) @@ -356,7 +352,7 @@ $settings = array ( // URL Location where the from the IdP will be returned 'url' => '', // SAML protocol binding to be used when returning the - // message. OneLogin Toolkit supports this endpoint for the + // message. SAML Toolkit supports this endpoint for the // HTTP-POST binding only. 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', ), @@ -382,7 +378,7 @@ $settings = array ( // URL Location where the from the IdP will be returned 'url' => '', // SAML protocol binding to be used when returning the - // message. OneLogin Toolkit supports the HTTP-Redirect binding + // message. SAML Toolkit supports the HTTP-Redirect binding // only for this endpoint. 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ), @@ -415,7 +411,7 @@ $settings = array ( // will be sent. 'url' => '', // SAML protocol binding to be used when returning the - // message. OneLogin Toolkit supports the HTTP-Redirect binding + // message. SAML Toolkit supports the HTTP-Redirect binding // only for this endpoint. 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ), @@ -425,9 +421,9 @@ $settings = array ( 'url' => '', // URL location of the IdP where the SP will send the SLO Response (ResponseLocation) // if not set, url for the SLO Request will be used - 'responseUrl' => '', + 'responseUrl' => '', // SAML protocol binding to be used when returning the - // message. OneLogin Toolkit supports the HTTP-Redirect binding + // message. SAML Toolkit supports the HTTP-Redirect binding // only for this endpoint. 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ), @@ -824,7 +820,7 @@ $_SESSION['samlNameidSPNameQualifier'] = $auth->getNameIdSPNameQualifier(); $_SESSION['samlSessionIndex'] = $auth->getSessionIndex(); if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { - // To avoid 'Open Redirect' attacks, before execute the + // To avoid 'Open Redirect' attacks, before execute the // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); } @@ -1164,7 +1160,7 @@ if (isset($_GET['sso'])) { // SSO action. Will send an AuthNRequest to the I $_SESSION['samlUserdata'] = $auth->getAttributes(); // Retrieves user data if (isset($_POST['RelayState']) && OneLogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { - // To avoid 'Open Redirect' attacks, before execute the + // To avoid 'Open Redirect' attacks, before execute the // redirection confirm the value of $_POST['RelayState'] is a // trusted URL. $auth->redirectTo($_POST['RelayState']); // Redirect if there is a } // relayState set @@ -1219,9 +1215,9 @@ $needsAuth = empty($_SESSION['samlUserdata']); if ($needsAuth) { // put SAML settings into an array to avoid placing files in the - // composer vendor/ directories + // composer vendor/ directories $samlsettings = array(/*...config goes here...*/); - + $auth = new \OneLogin\Saml2\Auth($samlsettings); if (!empty($_REQUEST['SAMLResponse']) && !empty($_REQUEST['RelayState'])) { @@ -1351,7 +1347,7 @@ Lets describe now the classes and methods of the SAML2 library. ##### OneLogin_Saml2_Auth - Auth.php ##### -Main class of OneLogin PHP Toolkit +Main class of PHP Toolkit * `OneLogin_Saml2_Auth` - Initializes the SP SAML instance * `login` - Initiates the SSO process. @@ -1448,7 +1444,7 @@ SAML 2 Logout Response class ##### OneLogin_Saml2_Settings - `Settings.php` ##### -Configuration of the OneLogin PHP Toolkit +Configuration of the PHP Toolkit * `OneLogin_Saml2_Settings` - Initializes the settings: Sets the paths of the different folders and Loads settings info from settings file or @@ -1562,7 +1558,7 @@ Demos require that SP and IdP are well configured before test it. ### SP setup ### -The Onelogin's PHP Toolkit allows you to provide the settings info in two ways: +The PHP Toolkit allows you to provide the settings info in two ways: * Use a `settings.php` file that we should locate at the base folder of the toolkit. @@ -1637,7 +1633,7 @@ must be done. ### SP setup ### -The Onelogin's PHP Toolkit allows you to provide the settings info in two ways: +The PHP Toolkit allows you to provide the settings info in two ways: * Use a `settings.php` file that we should locate at the base folder of the toolkit. diff --git a/certs/README b/certs/README index fa28e252..ceee1f3e 100644 --- a/certs/README +++ b/certs/README @@ -1,6 +1,6 @@ Take care of this folder that could contain private key. Be sure that this folder never is published. -Onelogin PHP Toolkit expects certs for the SP stored at: +PHP Toolkit expects certs for the SP stored at: * sp.key Private Key * sp.crt Public cert diff --git a/composer.json b/composer.json index 0c2bfd12..614c708c 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "onelogin/php-saml", - "description": "OneLogin PHP SAML Toolkit", + "description": "PHP SAML Toolkit", "license": "MIT", "homepage": "https://developers.onelogin.com/saml/php", "keywords": ["saml", "saml2", "onelogin"], diff --git a/demo-old/consume.php b/demo-old/consume.php index fc33df84..8d993a48 100644 --- a/demo-old/consume.php +++ b/demo-old/consume.php @@ -27,7 +27,7 @@ echo ''; } echo '

'; - echo "The v.1 of the Onelogin's PHP SAML Tookit does not support SLO."; + echo "The v.1 of the PHP SAML Tookit does not support SLO."; } } else { echo 'Invalid SAML response.'; diff --git a/demo1/Readme.txt b/demo1/Readme.txt index fae19121..d8810676 100644 --- a/demo1/Readme.txt +++ b/demo1/Readme.txt @@ -3,7 +3,7 @@ The example requires that SP and IdP are well configured before test it. SP setup -------- -The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: +The PHP Toolkit allows you to provide the settings info in 2 ways: * Use a settings.php file that we should locate at the base folder of the toolkit. * Use an array with the setting data. @@ -59,7 +59,7 @@ How it works endpoint). The SLS endpoint (index.php?sls)of the SP process the Logout Response and if is valid, close the user session of the local app. Notice that the SLO Workflow starts and ends at the SP. - + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP side, the logout process is initiated at the idP, sends a Logout Request to the SP (SLS endpoint, index.php?sls). The SLS endpoint of the SP process the Logout Request and if is valid, close the session of the user diff --git a/demo2/Readme.txt b/demo2/Readme.txt index b969e670..7a34800f 100644 --- a/demo2/Readme.txt +++ b/demo2/Readme.txt @@ -3,12 +3,12 @@ The example requires that SP and IdP are well configured before test it. SP setup -------- -The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: +The PHP Toolkit allows you to provide the settings info in 2 ways: * Use a settings.php file that we should locate at the base folder of the toolkit. * Use an array with the setting data. -The first is the case of the demo2 app. The setting.php file and the +The first is the case of the demo2 app. The setting.php file and the setting_extended.php file should be defined at the base folder of the toolkit. Review the setting_example.php and the advanced_settings_example.php to learn how to build them. @@ -44,14 +44,14 @@ demo1, only changes the targets. sent to the IdP automatically, (as RelayState is sent the origin url). We authenticate at the IdP and then a Response is sent to the SP, to the ACS endpoint, in this case acs.php of the endpoints folder. - + 2. The SAML Response is processed in the ACS, if the Response is not valid, the process stop here and a message is showed. Otherwise we are redirected to the RelayState view (sso.php or index.php). The sso.php detect if the user is logged and do a redirect to index.php, so we will be in the index.php at the end. - 3. We are logged in the app and the user attributes are showed. + 3. We are logged in the app and the user attributes are showed. At this point, we can test the single log out functionality. 4. The single log out funcionality could be tested by 2 ways. @@ -63,9 +63,9 @@ demo1, only changes the targets. The SLS endpoint of the SP process the Logout Response and if is valid, close the user session of the local app. Notice that the SLO Workflow starts and ends at the SP. - + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP - side, the logout process is initiated at the idP, sends a Logout + side, the logout process is initiated at the idP, sends a Logout Request to the SP (SLS endpoint sls.php of the endpoint folder). The SLS endpoint of the SP process the Logout Request and if is valid, close the session of the user at the local app and sends a Logout Response diff --git a/docs/Saml/classes/OneLogin_Saml_AuthRequest.html b/docs/Saml/classes/OneLogin_Saml_AuthRequest.html index b5cd01a6..c2324a8b 100644 --- a/docs/Saml/classes/OneLogin_Saml_AuthRequest.html +++ b/docs/Saml/classes/OneLogin_Saml_AuthRequest.html @@ -3,13 +3,13 @@ - Onelogin's SAML PHP Toolkit » \OneLogin_Saml_AuthRequest + <title> SAML PHP Toolkit » \OneLogin_Saml_AuthRequest - + @@ -19,7 +19,7 @@ - + @@ -33,7 +33,7 @@ - Onelogin's SAML PHP Toolkit + SAML PHP Toolkit - +
- + -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml_AuthRequest

- - -

-
-
- -
- -
- -

Methods

- -
-

Constructs the OneLogin_Saml2_Auth, initializing -the SP SAML instance.

-
__construct(\OneLogin_Saml2_Settings $settings) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$settings

- \OneLogin_Saml2_Settings

Settings

-
- -
-
-
- -
-

Obtains the SSO URL containing the AuthRequest -message deflated.

-
getRedirectUrl($returnTo = null) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$returnTo

-

-
- -
-
-
- -
-

_generateUniqueID

-
_generateUniqueID() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

_getTimestamp

-
_getTimestamp() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- - -

Properties

- -
-

object

-
auth : \OneLogin_Saml2_Auth
-
-
-
-
-
- - - - - - - - - - -
- var - -

object

-
- - -
- -

Type(s)

- \OneLogin_Saml2_Auth -
-
-
-
-
- - -
-
- -
- - - - diff --git a/docs/Saml/classes/OneLogin_Saml_Metadata.html b/docs/Saml/classes/OneLogin_Saml_Metadata.html deleted file mode 100644 index 18592ea4..00000000 --- a/docs/Saml/classes/OneLogin_Saml_Metadata.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml_Metadata - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml_Metadata

- - -

-
-
- -
- -
- -

Methods

- -
-

__construct

-
__construct($settings = null) 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- -

Arguments

-
-

$settings

-

-
- -
-
-
- -
-

getXml

-
getXml() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

_getMetadataValidTimestamp

-
_getMetadataValidTimestamp() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -

Constants

- -
-

VALIDITY_SECONDS

-
VALIDITY_SECONDS
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -

Properties

- -
-

_settings

-
_settings : 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -
-
-
-
-
- - -
-
- -
- - - - diff --git a/docs/Saml/classes/OneLogin_Saml_Response.html b/docs/Saml/classes/OneLogin_Saml_Response.html deleted file mode 100644 index be561798..00000000 --- a/docs/Saml/classes/OneLogin_Saml_Response.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml_Response - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml_Response

- - Extends \OneLogin_Saml2_Response - -

-
-
- -
- -
- -

Methods

- -
-

Constructor that process the SAML Response, -Internally initializes an SP SAML instance -and an OneLogin_Saml2_Response.

-
__construct(\OneLogin_Saml_Settings $oldSettings, $assertion) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$oldSettings

- \OneLogin_Saml_Settings

Settings

-
-
-

$assertion

-

-
- -
-
-
- -
-

Retrieves an Array with the logged user data.

-
get_saml_attributes() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

Retrieves the nameId

-
get_nameid() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- - -
-
- - -
-
- -
- - - - diff --git a/docs/Saml/classes/OneLogin_Saml_Settings.html b/docs/Saml/classes/OneLogin_Saml_Settings.html deleted file mode 100644 index 21ea4a42..00000000 --- a/docs/Saml/classes/OneLogin_Saml_Settings.html +++ /dev/null @@ -1,635 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml_Settings - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml_Settings

- - -

Holds SAML settings for the SamlResponse and SamlAuthRequest classes.

-
-
-

These settings need to be filled in by the user prior to being used.

-
- -
- -

Methods

- -
-

Return an Array with the values (compatibility with the new version)

-
getValues() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -

Constants

- -
-

NAMEID_EMAIL_ADDRESS

-
NAMEID_EMAIL_ADDRESS
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_X509_SUBJECT_NAME

-
NAMEID_X509_SUBJECT_NAME
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_WINDOWS_DOMAIN_QUALIFIED_NAME

-
NAMEID_WINDOWS_DOMAIN_QUALIFIED_NAME
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_KERBEROS

-
NAMEID_KERBEROS
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_ENTITY

-
NAMEID_ENTITY
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_TRANSIENT

-
NAMEID_TRANSIENT
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

NAMEID_PERSISTENT

-
NAMEID_PERSISTENT
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -

Properties

- -
-

The URL to submit SAML authentication requests to.

-
idpSingleSignOnUrl : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

The URL to submit SAML Logout Request to.

-
idpSingleLogOutUrl : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

The x509 certificate used to authenticate the request.

-
idpPublicCertificate : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

The URL where to the SAML Response/SAML Assertion will be posted.

-
spReturnUrl : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

The name of the application.

-
spIssuer : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

Specifies what format to return the authentication token, i.e, the email address.

-
requestedNameIdFormat : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
-
-
- - -
-
- -
- - - - diff --git a/docs/Saml/classes/OneLogin_Saml_XmlSec.html b/docs/Saml/classes/OneLogin_Saml_XmlSec.html deleted file mode 100644 index 5ae89468..00000000 --- a/docs/Saml/classes/OneLogin_Saml_XmlSec.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml_XmlSec - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml_XmlSec

- - -

Determine if the SAML response is valid using a provided x509 certificate.

-
-
- -
- -
- -

Methods

- -
-

Construct the SamlXmlSec object.

-
__construct(\OneLogin_Saml_Settings $settings, \OneLogin_Saml_Response $response) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$settings

- \OneLogin_Saml_Settings

A SamlResponse settings object containing the necessary

-
                                     x509 certicate to test the document.

-
-
-

$response

- \OneLogin_Saml_Response

The document to test.

-
- -
-
-
- -
-

Verify that the document only contains a single Assertion

-
validateNumAssertions() : bool
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- bool

TRUE if the document passes.

-
-
-
- -
-

Verify that the document is still valid according

-
validateTimestamps() : bool
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- bool

-
-
-
- -
-

isValid

-
isValid() : bool
-
-
-
-
-
- - - - - - - - - - - - - - -
- throws - - - -
- - -
- - -
- - -

Response

- bool

-
-
-
- - -

Properties

- -
-

A SamlResponse class provided to the constructor.

-
_settings : \OneLogin_Saml_Settings
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \OneLogin_Saml_Settings -
-
-
- -
-

The document to be tested.

-
_document : \DomDocument
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \DomDocument -
-
-
-
-
- - -
-
- -
- - - - diff --git a/docs/Saml/css/bootstrap-responsive.css b/docs/Saml/css/bootstrap-responsive.css deleted file mode 100644 index 4b032cdb..00000000 --- a/docs/Saml/css/bootstrap-responsive.css +++ /dev/null @@ -1,567 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.hidden { - display: none; - visibility: hidden; -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 18px; - } - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - height: 28px; - /* Make inputs at least the height of their button counterpart */ - - /* Makes inputs behave like true block-level elements */ - - -webkit-box-sizing: border-box; - /* Older Webkit */ - - -moz-box-sizing: border-box; - /* Older FF */ - - -ms-box-sizing: border-box; - /* IE8 */ - - box-sizing: border-box; - /* CSS3 spec*/ - - } - .input-prepend input[class*="span"], .input-append input[class*="span"] { - width: auto; - } - input[type="checkbox"], input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-group > label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .modal { - position: absolute; - top: 10px; - left: 10px; - right: 10px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 768px) { - .container { - width: auto; - padding: 0 20px; - } - .row-fluid { - width: 100%; - } - .row { - margin-left: 0; - } - .row > [class*="span"], .row-fluid > [class*="span"] { - float: none; - display: block; - width: auto; - margin: 0; - } -} -@media (min-width: 768px) and (max-width: 980px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 20px; - } - .span1 { - width: 42px; - } - .span2 { - width: 104px; - } - .span3 { - width: 166px; - } - .span4 { - width: 228px; - } - .span5 { - width: 290px; - } - .span6 { - width: 352px; - } - .span7 { - width: 414px; - } - .span8 { - width: 476px; - } - .span9 { - width: 538px; - } - .span10 { - width: 600px; - } - .span11 { - width: 662px; - } - .span12, .container { - width: 724px; - } - .offset1 { - margin-left: 82px; - } - .offset2 { - margin-left: 144px; - } - .offset3 { - margin-left: 206px; - } - .offset4 { - margin-left: 268px; - } - .offset5 { - margin-left: 330px; - } - .offset6 { - margin-left: 392px; - } - .offset7 { - margin-left: 454px; - } - .offset8 { - margin-left: 516px; - } - .offset9 { - margin-left: 578px; - } - .offset10 { - margin-left: 640px; - } - .offset11 { - margin-left: 702px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid > [class*="span"] { - float: left; - margin-left: 2.762430939%; - } - .row-fluid > [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span1 { - width: 5.801104972%; - } - .row-fluid .span2 { - width: 14.364640883%; - } - .row-fluid .span3 { - width: 22.928176794%; - } - .row-fluid .span4 { - width: 31.491712705%; - } - .row-fluid .span5 { - width: 40.055248616%; - } - .row-fluid .span6 { - width: 48.618784527%; - } - .row-fluid .span7 { - width: 57.182320438000005%; - } - .row-fluid .span8 { - width: 65.74585634900001%; - } - .row-fluid .span9 { - width: 74.30939226%; - } - .row-fluid .span10 { - width: 82.87292817100001%; - } - .row-fluid .span11 { - width: 91.436464082%; - } - .row-fluid .span12 { - width: 99.999999993%; - } - input.span1, textarea.span1, .uneditable-input.span1 { - width: 32px; - } - input.span2, textarea.span2, .uneditable-input.span2 { - width: 94px; - } - input.span3, textarea.span3, .uneditable-input.span3 { - width: 156px; - } - input.span4, textarea.span4, .uneditable-input.span4 { - width: 218px; - } - input.span5, textarea.span5, .uneditable-input.span5 { - width: 280px; - } - input.span6, textarea.span6, .uneditable-input.span6 { - width: 342px; - } - input.span7, textarea.span7, .uneditable-input.span7 { - width: 404px; - } - input.span8, textarea.span8, .uneditable-input.span8 { - width: 466px; - } - input.span9, textarea.span9, .uneditable-input.span9 { - width: 528px; - } - input.span10, textarea.span10, .uneditable-input.span10 { - width: 590px; - } - input.span11, textarea.span11, .uneditable-input.span11 { - width: 652px; - } - input.span12, textarea.span12, .uneditable-input.span12 { - width: 714px; - } -} -@media (max-width: 980px) { - body { - padding-top: 0; - } - .navbar-fixed-top { - position: static; - margin-bottom: 18px; - } - .navbar-fixed-top .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .navbar .nav-collapse { - clear: left; - } - .navbar .nav { - float: none; - margin: 0 0 9px; - } - .navbar .nav > li { - float: none; - } - .navbar .nav > li > a { - margin-bottom: 2px; - } - .navbar .nav > .divider-vertical { - display: none; - } - .navbar .nav > li > a, .navbar .dropdown-menu a { - padding: 6px 15px; - font-weight: bold; - color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .navbar .dropdown-menu li + li a { - margin-bottom: 2px; - } - .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover { - background-color: #222222; - } - .navbar .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: block; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .navbar .dropdown-menu:before, .navbar .dropdown-menu:after { - display: none; - } - .navbar .dropdown-menu .divider { - display: none; - } - .navbar-form, .navbar-search { - float: none; - padding: 9px 15px; - margin: 9px 0; - border-top: 1px solid #222222; - border-bottom: 1px solid #222222; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar .nav.pull-right { - float: none; - margin-left: 0; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } - .btn-navbar { - display: block; - } - .nav-collapse { - overflow: hidden; - height: 0; - } -} -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - } -} -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 30px; - } - .span1 { - width: 70px; - } - .span2 { - width: 170px; - } - .span3 { - width: 270px; - } - .span4 { - width: 370px; - } - .span5 { - width: 470px; - } - .span6 { - width: 570px; - } - .span7 { - width: 670px; - } - .span8 { - width: 770px; - } - .span9 { - width: 870px; - } - .span10 { - width: 970px; - } - .span11 { - width: 1070px; - } - .span12, .container { - width: 1170px; - } - .offset1 { - margin-left: 130px; - } - .offset2 { - margin-left: 230px; - } - .offset3 { - margin-left: 330px; - } - .offset4 { - margin-left: 430px; - } - .offset5 { - margin-left: 530px; - } - .offset6 { - margin-left: 630px; - } - .offset7 { - margin-left: 730px; - } - .offset8 { - margin-left: 830px; - } - .offset9 { - margin-left: 930px; - } - .offset10 { - margin-left: 1030px; - } - .offset11 { - margin-left: 1130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid > [class*="span"] { - float: left; - margin-left: 2.564102564%; - } - .row-fluid > [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span1 { - width: 5.982905983%; - } - .row-fluid .span2 { - width: 14.529914530000001%; - } - .row-fluid .span3 { - width: 23.076923077%; - } - .row-fluid .span4 { - width: 31.623931624%; - } - .row-fluid .span5 { - width: 40.170940171000005%; - } - .row-fluid .span6 { - width: 48.717948718%; - } - .row-fluid .span7 { - width: 57.264957265%; - } - .row-fluid .span8 { - width: 65.81196581200001%; - } - .row-fluid .span9 { - width: 74.358974359%; - } - .row-fluid .span10 { - width: 82.905982906%; - } - .row-fluid .span11 { - width: 91.45299145300001%; - } - .row-fluid .span12 { - width: 100%; - } - input.span1, textarea.span1, .uneditable-input.span1 { - width: 60px; - } - input.span2, textarea.span2, .uneditable-input.span2 { - width: 160px; - } - input.span3, textarea.span3, .uneditable-input.span3 { - width: 260px; - } - input.span4, textarea.span4, .uneditable-input.span4 { - width: 360px; - } - input.span5, textarea.span5, .uneditable-input.span5 { - width: 460px; - } - input.span6, textarea.span6, .uneditable-input.span6 { - width: 560px; - } - input.span7, textarea.span7, .uneditable-input.span7 { - width: 660px; - } - input.span8, textarea.span8, .uneditable-input.span8 { - width: 760px; - } - input.span9, textarea.span9, .uneditable-input.span9 { - width: 860px; - } - input.span10, textarea.span10, .uneditable-input.span10 { - width: 960px; - } - input.span11, textarea.span11, .uneditable-input.span11 { - width: 1060px; - } - input.span12, textarea.span12, .uneditable-input.span12 { - width: 1160px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } -} diff --git a/docs/Saml/css/bootstrap-responsive.min.css b/docs/Saml/css/bootstrap-responsive.min.css deleted file mode 100644 index bc3f2ab7..00000000 --- a/docs/Saml/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,3 +0,0 @@ - -.hidden{display:none;visibility:hidden;} -@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/docs/Saml/css/bootstrap.css b/docs/Saml/css/bootstrap.css deleted file mode 100644 index 563050c0..00000000 --- a/docs/Saml/css/bootstrap.css +++ /dev/null @@ -1,3370 +0,0 @@ -/*! - * Bootstrap v2.0.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, canvas, video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, a:active { - outline: 0; -} -sub, sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - max-width: 100%; - height: auto; - border: 0; - -ms-interpolation-mode: bicubic; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} -a { - color: #0088cc; - text-decoration: none; -} -a:hover { - color: #005580; - text-decoration: underline; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, .row:after { - display: table; - content: ""; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.span1 { - width: 60px; -} -.span2 { - width: 140px; -} -.span3 { - width: 220px; -} -.span4 { - width: 300px; -} -.span5 { - width: 380px; -} -.span6 { - width: 460px; -} -.span7 { - width: 540px; -} -.span8 { - width: 620px; -} -.span9 { - width: 700px; -} -.span10 { - width: 780px; -} -.span11 { - width: 860px; -} -.span12, .container { - width: 940px; -} -.offset1 { - margin-left: 100px; -} -.offset2 { - margin-left: 180px; -} -.offset3 { - margin-left: 260px; -} -.offset4 { - margin-left: 340px; -} -.offset5 { - margin-left: 420px; -} -.offset6 { - margin-left: 500px; -} -.offset7 { - margin-left: 580px; -} -.offset8 { - margin-left: 660px; -} -.offset9 { - margin-left: 740px; -} -.offset10 { - margin-left: 820px; -} -.offset11 { - margin-left: 900px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, .row-fluid:after { - display: table; - content: ""; -} -.row-fluid:after { - clear: both; -} -.row-fluid > [class*="span"] { - float: left; - margin-left: 2.127659574%; -} -.row-fluid > [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .span1 { - width: 6.382978723%; -} -.row-fluid .span2 { - width: 14.89361702%; -} -.row-fluid .span3 { - width: 23.404255317%; -} -.row-fluid .span4 { - width: 31.914893614%; -} -.row-fluid .span5 { - width: 40.425531911%; -} -.row-fluid .span6 { - width: 48.93617020799999%; -} -.row-fluid .span7 { - width: 57.446808505%; -} -.row-fluid .span8 { - width: 65.95744680199999%; -} -.row-fluid .span9 { - width: 74.468085099%; -} -.row-fluid .span10 { - width: 82.97872339599999%; -} -.row-fluid .span11 { - width: 91.489361693%; -} -.row-fluid .span12 { - width: 99.99999998999999%; -} -.container { - width: 940px; - margin-left: auto; - margin-right: auto; - *zoom: 1; -} -.container:before, .container:after { - display: table; - content: ""; -} -.container:after { - clear: both; -} -.container-fluid { - padding-left: 20px; - padding-right: 20px; - *zoom: 1; -} -.container-fluid:before, .container-fluid:after { - display: table; - content: ""; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; -} -p small { - font-size: 11px; - color: #999999; -} -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-weight: bold; - color: #333333; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} -h1 { - font-size: 30px; - line-height: 36px; -} -h1 small { - font-size: 18px; -} -h2 { - font-size: 24px; - line-height: 36px; -} -h2 small { - font-size: 18px; -} -h3 { - line-height: 27px; - font-size: 18px; -} -h3 small { - font-size: 14px; -} -h4, h5, h6 { - line-height: 18px; -} -h4 { - font-size: 14px; -} -h4 small { - font-size: 12px; -} -h5 { - font-size: 12px; -} -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} -.page-header h1 { - line-height: 1; -} -ul, ol { - padding: 0; - margin: 0 0 9px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -ul { - list-style: disc; -} -ol { - list-style: decimal; -} -li { - line-height: 18px; -} -ul.unstyled { - margin-left: 0; - list-style: none; -} -dl { - margin-bottom: 18px; -} -dt, dd { - line-height: 18px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 9px; -} -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #ffffff; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -.muted { - color: #999999; -} -abbr { - font-size: 90%; - text-transform: uppercase; - border-bottom: 1px dotted #ddd; - cursor: help; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-left: 0; - padding-right: 15px; - border-left: 0; - border-right: 5px solid #eeeeee; -} -blockquote.pull-right p, blockquote.pull-right small { - text-align: right; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 18px; - line-height: 18px; - font-style: normal; -} -small { - font-size: 100%; -} -cite { - font-style: normal; -} -code, pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 3px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12px; - line-height: 18px; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - white-space: pre; - white-space: pre-wrap; - word-break: break-all; -} -pre.prettyprint { - margin-bottom: 18px; -} -pre code { - padding: 0; - background-color: transparent; -} -form { - margin: 0 0 18px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} -label, -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 18px; -} -label { - display: block; - margin-bottom: 5px; - color: #333333; -} -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; - border: 1px solid #ccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.uneditable-textarea { - width: auto; - height: auto; -} -label input, label textarea, label select { - display: block; -} -input[type="image"], input[type="checkbox"], input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - border: 0; - cursor: pointer; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -input[type="file"] { - padding: initial; - line-height: initial; - border: initial; - background-color: #ffffff; - background-color: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -input[type="button"], input[type="reset"], input[type="submit"] { - width: auto; - height: auto; -} -select, input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} -select { - width: 220px; - background-color: #ffffff; -} -select[multiple], select[size] { - height: auto; -} -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -textarea { - height: auto; -} -input[type="hidden"] { - display: none; -} -.radio, .checkbox { - padding-left: 18px; -} -.radio input[type="radio"], .checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, .controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, .checkbox.inline { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child { - padding-top: 0; -} -input, textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} -input:focus, textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - outline: 0; - outline: thin dotted \9; - /* IE6-8 */ - -} -input[type="file"]:focus, input[type="checkbox"]:focus, select:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input { - float: none; - margin-left: 0; -} -input.span1, textarea.span1, .uneditable-input.span1 { - width: 50px; -} -input.span2, textarea.span2, .uneditable-input.span2 { - width: 130px; -} -input.span3, textarea.span3, .uneditable-input.span3 { - width: 210px; -} -input.span4, textarea.span4, .uneditable-input.span4 { - width: 290px; -} -input.span5, textarea.span5, .uneditable-input.span5 { - width: 370px; -} -input.span6, textarea.span6, .uneditable-input.span6 { - width: 450px; -} -input.span7, textarea.span7, .uneditable-input.span7 { - width: 530px; -} -input.span8, textarea.span8, .uneditable-input.span8 { - width: 610px; -} -input.span9, textarea.span9, .uneditable-input.span9 { - width: 690px; -} -input.span10, textarea.span10, .uneditable-input.span10 { - width: 770px; -} -input.span11, textarea.span11, .uneditable-input.span11 { - width: 850px; -} -input.span12, textarea.span12, .uneditable-input.span12 { - width: 930px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #f5f5f5; - border-color: #ddd; - cursor: not-allowed; -} -.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning input, .control-group.warning select, .control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} -.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { - color: #b94a48; -} -.control-group.error input, .control-group.error select, .control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} -.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { - color: #468847; -} -.control-group.success input, .control-group.success select, .control-group.success textarea { - color: #468847; - border-color: #468847; -} -.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; -} -.uneditable-input { - display: block; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -:-moz-placeholder { - color: #999999; -} -::-webkit-input-placeholder { - color: #999999; -} -.help-block { - margin-top: 5px; - margin-bottom: 0; - color: #999999; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-bottom: 9px; - vertical-align: middle; - padding-left: 5px; -} -.input-prepend, .input-append { - margin-bottom: 5px; - *zoom: 1; -} -.input-prepend:before, -.input-append:before, -.input-prepend:after, -.input-append:after { - display: table; - content: ""; -} -.input-prepend:after, .input-append:after { - clear: both; -} -.input-prepend input, -.input-append input, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend input:focus, -.input-append input:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - position: relative; - z-index: 2; -} -.input-prepend .uneditable-input, .input-append .uneditable-input { - border-left-color: #ccc; -} -.input-prepend .add-on, .input-append .add-on { - float: left; - display: block; - width: auto; - min-width: 16px; - height: 18px; - margin-right: -1px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - color: #999999; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #f5f5f5; - border: 1px solid #ccc; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend .active, .input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on { - *margin-top: 1px; - /* IE6-7 */ - -} -.input-append input, .input-append .uneditable-input { - float: left; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append .uneditable-input { - border-right-color: #ccc; -} -.input-append .add-on { - margin-right: 0; - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:first-child { - *margin-left: -160px; -} -.input-append input:first-child + .add-on { - *margin-left: -21px; -} -.search-query { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input { - display: inline-block; - margin-bottom: 0; -} -.form-search label, -.form-inline label, -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - display: inline-block; -} -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on, -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on { - vertical-align: middle; -} -.control-group { - margin-bottom: 9px; -} -.form-horizontal legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} -.form-horizontal .control-group:before, .form-horizontal .control-group:after { - display: table; - content: ""; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-group > label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - margin-left: 160px; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -table { - max-width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 18px; -} -.table th, .table td { - padding: 8px; - line-height: 18px; - text-align: left; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; - vertical-align: bottom; -} -.table td { - vertical-align: top; -} -.table thead:first-child tr th, .table thead:first-child tr td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table-condensed th, .table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapsed; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th + th, -.table-bordered td + td, -.table-bordered th + td, -.table-bordered td + th { - border-left: 1px solid #ddd; -} -.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-radius: 4px 0 0 0; - -moz-border-radius: 4px 0 0 0; - border-radius: 4px 0 0 0; -} -.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-radius: 0 4px 0 0; - -moz-border-radius: 0 4px 0 0; - border-radius: 0 4px 0 0; -} -.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; -} -.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-radius: 0 0 4px 0; - -moz-border-radius: 0 0 4px 0; - border-radius: 0 0 4px 0; -} -.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -[class^="icon-"] { - display: inline-block; - width: 14px; - height: 14px; - vertical-align: text-top; - background-image: url(http://github.com/img/glyphicons-halflings.png); - background-position: 14px 14px; - background-repeat: no-repeat; - *margin-right: .3em; -} -[class^="icon-"]:last-child { - *margin-left: 0; -} -.icon-white { - background-image: url(http://github.com/img/glyphicons-halflings-white.png); -} -.icon-glass { - background-position: 0 0; -} -.icon-music { - background-position: -24px 0; -} -.icon-search { - background-position: -48px 0; -} -.icon-envelope { - background-position: -72px 0; -} -.icon-heart { - background-position: -96px 0; -} -.icon-star { - background-position: -120px 0; -} -.icon-star-empty { - background-position: -144px 0; -} -.icon-user { - background-position: -168px 0; -} -.icon-film { - background-position: -192px 0; -} -.icon-th-large { - background-position: -216px 0; -} -.icon-th { - background-position: -240px 0; -} -.icon-th-list { - background-position: -264px 0; -} -.icon-ok { - background-position: -288px 0; -} -.icon-remove { - background-position: -312px 0; -} -.icon-zoom-in { - background-position: -336px 0; -} -.icon-zoom-out { - background-position: -360px 0; -} -.icon-off { - background-position: -384px 0; -} -.icon-signal { - background-position: -408px 0; -} -.icon-cog { - background-position: -432px 0; -} -.icon-trash { - background-position: -456px 0; -} -.icon-home { - background-position: 0 -24px; -} -.icon-file { - background-position: -24px -24px; -} -.icon-time { - background-position: -48px -24px; -} -.icon-road { - background-position: -72px -24px; -} -.icon-download-alt { - background-position: -96px -24px; -} -.icon-download { - background-position: -120px -24px; -} -.icon-upload { - background-position: -144px -24px; -} -.icon-inbox { - background-position: -168px -24px; -} -.icon-play-circle { - background-position: -192px -24px; -} -.icon-repeat { - background-position: -216px -24px; -} -.icon-refresh { - background-position: -240px -24px; -} -.icon-list-alt { - background-position: -264px -24px; -} -.icon-lock { - background-position: -287px -24px; -} -.icon-flag { - background-position: -312px -24px; -} -.icon-headphones { - background-position: -336px -24px; -} -.icon-volume-off { - background-position: -360px -24px; -} -.icon-volume-down { - background-position: -384px -24px; -} -.icon-volume-up { - background-position: -408px -24px; -} -.icon-qrcode { - background-position: -432px -24px; -} -.icon-barcode { - background-position: -456px -24px; -} -.icon-tag { - background-position: 0 -48px; -} -.icon-tags { - background-position: -25px -48px; -} -.icon-book { - background-position: -48px -48px; -} -.icon-bookmark { - background-position: -72px -48px; -} -.icon-print { - background-position: -96px -48px; -} -.icon-camera { - background-position: -120px -48px; -} -.icon-font { - background-position: -144px -48px; -} -.icon-bold { - background-position: -167px -48px; -} -.icon-italic { - background-position: -192px -48px; -} -.icon-text-height { - background-position: -216px -48px; -} -.icon-text-width { - background-position: -240px -48px; -} -.icon-align-left { - background-position: -264px -48px; -} -.icon-align-center { - background-position: -288px -48px; -} -.icon-align-right { - background-position: -312px -48px; -} -.icon-align-justify { - background-position: -336px -48px; -} -.icon-list { - background-position: -360px -48px; -} -.icon-indent-left { - background-position: -384px -48px; -} -.icon-indent-right { - background-position: -408px -48px; -} -.icon-facetime-video { - background-position: -432px -48px; -} -.icon-picture { - background-position: -456px -48px; -} -.icon-pencil { - background-position: 0 -72px; -} -.icon-map-marker { - background-position: -24px -72px; -} -.icon-adjust { - background-position: -48px -72px; -} -.icon-tint { - background-position: -72px -72px; -} -.icon-edit { - background-position: -96px -72px; -} -.icon-share { - background-position: -120px -72px; -} -.icon-check { - background-position: -144px -72px; -} -.icon-move { - background-position: -168px -72px; -} -.icon-step-backward { - background-position: -192px -72px; -} -.icon-fast-backward { - background-position: -216px -72px; -} -.icon-backward { - background-position: -240px -72px; -} -.icon-play { - background-position: -264px -72px; -} -.icon-pause { - background-position: -288px -72px; -} -.icon-stop { - background-position: -312px -72px; -} -.icon-forward { - background-position: -336px -72px; -} -.icon-fast-forward { - background-position: -360px -72px; -} -.icon-step-forward { - background-position: -384px -72px; -} -.icon-eject { - background-position: -408px -72px; -} -.icon-chevron-left { - background-position: -432px -72px; -} -.icon-chevron-right { - background-position: -456px -72px; -} -.icon-plus-sign { - background-position: 0 -96px; -} -.icon-minus-sign { - background-position: -24px -96px; -} -.icon-remove-sign { - background-position: -48px -96px; -} -.icon-ok-sign { - background-position: -72px -96px; -} -.icon-question-sign { - background-position: -96px -96px; -} -.icon-info-sign { - background-position: -120px -96px; -} -.icon-screenshot { - background-position: -144px -96px; -} -.icon-remove-circle { - background-position: -168px -96px; -} -.icon-ok-circle { - background-position: -192px -96px; -} -.icon-ban-circle { - background-position: -216px -96px; -} -.icon-arrow-left { - background-position: -240px -96px; -} -.icon-arrow-right { - background-position: -264px -96px; -} -.icon-arrow-up { - background-position: -289px -96px; -} -.icon-arrow-down { - background-position: -312px -96px; -} -.icon-share-alt { - background-position: -336px -96px; -} -.icon-resize-full { - background-position: -360px -96px; -} -.icon-resize-small { - background-position: -384px -96px; -} -.icon-plus { - background-position: -408px -96px; -} -.icon-minus { - background-position: -433px -96px; -} -.icon-asterisk { - background-position: -456px -96px; -} -.icon-exclamation-sign { - background-position: 0 -120px; -} -.icon-gift { - background-position: -24px -120px; -} -.icon-leaf { - background-position: -48px -120px; -} -.icon-fire { - background-position: -72px -120px; -} -.icon-eye-open { - background-position: -96px -120px; -} -.icon-eye-close { - background-position: -120px -120px; -} -.icon-warning-sign { - background-position: -144px -120px; -} -.icon-plane { - background-position: -168px -120px; -} -.icon-calendar { - background-position: -192px -120px; -} -.icon-random { - background-position: -216px -120px; -} -.icon-comment { - background-position: -240px -120px; -} -.icon-magnet { - background-position: -264px -120px; -} -.icon-chevron-up { - background-position: -288px -120px; -} -.icon-chevron-down { - background-position: -313px -119px; -} -.icon-retweet { - background-position: -336px -120px; -} -.icon-shopping-cart { - background-position: -360px -120px; -} -.icon-folder-close { - background-position: -384px -120px; -} -.icon-folder-open { - background-position: -408px -120px; -} -.icon-resize-vertical { - background-position: -432px -119px; -} -.icon-resize-horizontal { - background-position: -456px -118px; -} -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, .open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - text-indent: -99999px; - *text-indent: 0; - vertical-align: top; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #000000; - opacity: 0.3; - filter: alpha(opacity=30); - content: "\2193"; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown:hover .caret, .open.dropdown .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - float: left; - display: none; - min-width: 160px; - max-width: 220px; - _width: 160px; - padding: 4px 0; - margin: 0; - list-style: none; - background-color: #ffffff; - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 1px; - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - *border-right-width: 2px; - *border-bottom-width: 2px; -} -.dropdown-menu.bottom-up { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -.dropdown-menu .divider { - height: 1px; - margin: 5px 1px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; - *width: 100%; - *margin: -5px 0 5px; -} -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #555555; - white-space: nowrap; -} -.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} -.dropdown.open { - *z-index: 1000; -} -.dropdown.open .dropdown-toggle { - color: #ffffff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} -.dropdown.open .dropdown-menu { - display: block; -} -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.fade { - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - opacity: 0; -} -.fade.in { - opacity: 1; -} -.collapse { - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; - position: relative; - overflow: hidden; - height: 0; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000000; - text-decoration: none; - opacity: 0.4; - filter: alpha(opacity=40); - cursor: pointer; -} -.btn { - display: inline-block; - padding: 4px 10px 4px; - font-size: 13px; - line-height: 18px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #fafafa; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-repeat: no-repeat; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - border: 1px solid #ccc; - border-bottom-color: #bbb; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - cursor: pointer; - *margin-left: .3em; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, .btn:active { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - color: rgba(0, 0, 0, 0.5); - outline: 0; -} -.btn.disabled, .btn[disabled] { - cursor: default; - background-image: none; - background-color: #e6e6e6; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-large .icon { - margin-top: 1px; -} -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} -.btn-small .icon { - margin-top: -1px; -} -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - color: #ffffff; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0044cc; -} -.btn-primary:active, .btn-primary.active { - background-color: #003399 \9; -} -.btn-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; -} -.btn-warning:active, .btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; -} -.btn-danger:active, .btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; -} -.btn-success:active, .btn-success.active { - background-color: #408140 \9; -} -.btn-info { - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; -} -.btn-info:active, .btn-info.active { - background-color: #24748c \9; -} -button.btn, input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} -button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.large, input[type="submit"].btn.large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.small, input[type="submit"].btn.small { - *padding-top: 3px; - *padding-bottom: 3px; -} -.btn-group { - position: relative; - *zoom: 1; - *margin-left: .3em; -} -.btn-group:before, .btn-group:after { - display: table; - content: ""; -} -.btn-group:after { - clear: both; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} -.btn-group .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group .btn:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.btn-group .btn:last-child, .btn-group .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.btn-group .btn.large:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 6px; - -moz-border-radius-topleft: 6px; - border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - border-bottom-left-radius: 6px; -} -.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - -moz-border-radius-topright: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-bottomright: 6px; - border-bottom-right-radius: 6px; -} -.btn-group .btn:hover, -.btn-group .btn:focus, -.btn-group .btn:active, -.btn-group .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group.open { - *z-index: 1000; -} -.btn-group.open .dropdown-menu { - display: block; - margin-top: 1px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.btn .caret { - margin-top: 7px; - margin-left: 0; -} -.btn:hover .caret, .open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.btn-primary .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret { - border-top-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} -.btn-small .caret { - margin-top: 4px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, .alert-heading { - color: #c09853; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success, .alert-success .alert-heading { - color: #468847; -} -.alert-danger, .alert-error { - background-color: #f2dede; - border-color: #eed3d7; -} -.alert-danger, -.alert-error, -.alert-danger .alert-heading, -.alert-error .alert-heading { - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info, .alert-info .alert-heading { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, .alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 18px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} -.nav-list { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; -} -.nav-list > li > a, .nav-list .nav-header { - display: block; - padding: 3px 15px; - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list .nav-header { - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-transform: uppercase; -} - -.nav-list .nav-header * { - text-transform:none; -} - -.nav-list > li + .nav-header { - margin-top: 9px; -} -.nav-list .active > a, .nav-list .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-tabs, .nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} -.nav-tabs:after, .nav-pills:after { - clear: both; -} -.nav-tabs > li, .nav-pills > li { - float: left; -} -.nav-tabs > li > a, .nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 9px; - padding-bottom: 9px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} -.nav-tabs > .active > a, .nav-tabs > .active > a:hover { - color: #555555; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills .active > a, .nav-pills .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { - margin-top: 1px; - border-width: 1px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { - border-top-color: #0088cc; - margin-top: 6px; -} -.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; -} -.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; -} -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} -.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { - border-top-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, .tabbable:after { - display: table; - content: ""; -} -.tabbable:after { - clear: both; -} -.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, .pill-content > .pill-pane { - display: none; -} -.tab-content > .active, .pill-content > .active { - display: block; -} -.tabs-below .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { - float: none; -} -.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} -.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} -.tabs-right .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} -.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} -.navbar { - overflow: visible; - margin-bottom: 18px; -} -.navbar-inner { - padding-left: 20px; - padding-right: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} -.btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} -.btn-navbar:hover, -.btn-navbar:active, -.btn-navbar.active, -.btn-navbar.disabled, -.btn-navbar[disabled] { - background-color: #222222; -} -.btn-navbar:active, .btn-navbar.active { - background-color: #080808 \9; -} -.btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.nav-collapse.collapse { - height: auto; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #ffffff; -} -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #999999; -} -.navbar .navbar-text a:hover { - color: #ffffff; - background-color: transparent; -} -.navbar .btn, .navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, .navbar-form:after { - display: table; - content: ""; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, .navbar-form select { - display: inline-block; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-form .radio, .navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - color: rgba(255, 255, 255, 0.75); - background: #666; - background: rgba(255, 255, 255, 0.3); - border: 1px solid #111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} -.navbar-search .search-query :-moz-placeholder { - color: #eeeeee; -} -.navbar-search .search-query::-webkit-input-placeholder { - color: #eeeeee; -} -.navbar-search .search-query:hover { - color: #ffffff; - background-color: #999999; - background-color: rgba(255, 255, 255, 0.5); -} -.navbar-search .search-query:focus, .navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} -.navbar-fixed-top .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - display: block; - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar .nav > li > a:hover { - background-color: transparent; - color: #ffffff; - text-decoration: none; -} -.navbar .nav .active > a, .navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; - background-color: rgba(0, 0, 0, 0.5); -} -.navbar .divider-vertical { - height: 40px; - width: 1px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} -.navbar .nav.pull-right { - margin-left: 10px; - margin-right: 0; -} -.navbar .dropdown-menu { - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.navbar .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { - border-top-color: #ffffff; -} -.navbar .nav .active .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { - background-color: transparent; -} -.navbar .nav .active > .dropdown-toggle:hover { - color: #ffffff; -} -.navbar .nav.pull-right .dropdown-menu { - left: auto; - right: 0; -} -.navbar .nav.pull-right .dropdown-menu:before { - left: auto; - right: 12px; -} -.navbar .nav.pull-right .dropdown-menu:after { - left: auto; - right: 13px; -} -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -.breadcrumb li { - display: inline; - text-shadow: 0 1px 0 #ffffff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} -.breadcrumb .active a { - color: #333333; -} -.pagination { - height: 36px; - margin: 18px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination li { - display: inline; -} -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination a:hover, .pagination .active a { - background-color: #f5f5f5; -} -.pagination .active a { - color: #999999; - cursor: default; -} -.pagination .disabled a, .pagination .disabled a:hover { - color: #999999; - background-color: transparent; - cursor: default; -} -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pager { - margin-left: 0; - margin-bottom: 18px; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, .pager:after { - display: table; - content: ""; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next a { - float: right; -} -.pager .previous a { - float: left; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2070; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, .modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - max-height: 500px; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -ms-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-body { - padding: 15px; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; - *zoom: 1; -} -.modal-footer:before, .modal-footer:after { - display: table; - content: ""; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn { - float: right; - margin-left: 5px; - margin-bottom: 0; -} -.tooltip { - position: absolute; - z-index: 1020; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -2px; -} -.tooltip.right { - margin-left: 2px; -} -.tooltip.bottom { - margin-top: 2px; -} -.tooltip.left { - margin-left: -2px; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} -.popover.top { - margin-top: -5px; -} -.popover.right { - margin-left: 5px; -} -.popover.bottom { - margin-top: 5px; -} -.popover.left { - margin-left: -5px; -} -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} -.popover-inner { - padding: 3px; - width: 280px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.popover-content p, .popover-content ul, .popover-content ol { - margin-bottom: 0; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, .thumbnails:after { - display: table; - content: ""; -} -.thumbnails:after { - clear: both; -} -.thumbnails > li { - float: left; - margin: 0 0 18px 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; -} -.label { - padding: 1px 3px 2px; - font-size: 9.75px; - font-weight: bold; - color: #ffffff; - text-transform: uppercase; - background-color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.label-important { - background-color: #b94a48; -} -.label-warning { - background-color: #f89406; -} -.label-success { - background-color: #468847; -} -.label-info { - background-color: #3a87ad; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -.progress { - overflow: hidden; - height: 18px; - margin-bottom: 18px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 18px; - color: #ffffff; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 18px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel .item > img { - display: block; - line-height: 1; -} -.carousel .active, .carousel .next, .carousel .prev { - display: block; -} -.carousel .active { - left: 0; -} -.carousel .next, .carousel .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel .next { - left: 100%; -} -.carousel .prev { - left: -100%; -} -.carousel .next.left, .carousel .prev.right { - left: 0; -} -.carousel .active.left { - left: -100%; -} -.carousel .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, .carousel-caption p { - color: #ffffff; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #f5f5f5; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; -} -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} diff --git a/docs/Saml/css/bootstrap.min.css b/docs/Saml/css/bootstrap.min.css deleted file mode 100644 index d5221249..00000000 --- a/docs/Saml/css/bootstrap.min.css +++ /dev/null @@ -1,611 +0,0 @@ -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} -input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} -.row:after{clear:both;} -[class*="span"]{float:left;margin-left:20px;} -.span1{width:60px;} -.span2{width:140px;} -.span3{width:220px;} -.span4{width:300px;} -.span5{width:380px;} -.span6{width:460px;} -.span7{width:540px;} -.span8{width:620px;} -.span9{width:700px;} -.span10{width:780px;} -.span11{width:860px;} -.span12,.container{width:940px;} -.offset1{margin-left:100px;} -.offset2{margin-left:180px;} -.offset3{margin-left:260px;} -.offset4{margin-left:340px;} -.offset5{margin-left:420px;} -.offset6{margin-left:500px;} -.offset7{margin-left:580px;} -.offset8{margin-left:660px;} -.offset9{margin-left:740px;} -.offset10{margin-left:820px;} -.offset11{margin-left:900px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} -.row-fluid:after{clear:both;} -.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} -.row-fluid>[class*="span"]:first-child{margin-left:0;} -.row-fluid .span1{width:6.382978723%;} -.row-fluid .span2{width:14.89361702%;} -.row-fluid .span3{width:23.404255317%;} -.row-fluid .span4{width:31.914893614%;} -.row-fluid .span5{width:40.425531911%;} -.row-fluid .span6{width:48.93617020799999%;} -.row-fluid .span7{width:57.446808505%;} -.row-fluid .span8{width:65.95744680199999%;} -.row-fluid .span9{width:74.468085099%;} -.row-fluid .span10{width:82.97872339599999%;} -.row-fluid .span11{width:91.489361693%;} -.row-fluid .span12{width:99.99999998999999%;} -.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} -.container:after{clear:both;} -.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} -.container-fluid:after{clear:both;} -p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} -.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} -h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} -h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} -h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} -h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} -h4,h5,h6{line-height:18px;} -h4{font-size:14px;}h4 small{font-size:12px;} -h5{font-size:12px;} -h6{font-size:11px;color:#999999;text-transform:uppercase;} -.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} -.page-header h1{line-height:1;} -ul,ol{padding:0;margin:0 0 9px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -ul{list-style:disc;} -ol{list-style:decimal;} -li{line-height:18px;} -ul.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:18px;} -dt,dd{line-height:18px;} -dt{font-weight:bold;} -dd{margin-left:9px;} -hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} -strong{font-weight:bold;} -em{font-style:italic;} -.muted{color:#999999;} -abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} -blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} -blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} -small{font-size:100%;} -cite{font-style:normal;} -code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} -pre code{padding:0;background-color:transparent;} -form{margin:0 0 18px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} -label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} -label{display:block;margin-bottom:5px;color:#333333;} -input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.uneditable-textarea{width:auto;height:auto;} -label input,label textarea,label select{display:block;} -input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} -select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} -select{width:220px;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -textarea{height:auto;} -input[type="hidden"]{display:none;} -.radio,.checkbox{padding-left:18px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} -input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} -input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} -input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} -input.span1,textarea.span1,.uneditable-input.span1{width:50px;} -input.span2,textarea.span2,.uneditable-input.span2{width:130px;} -input.span3,textarea.span3,.uneditable-input.span3{width:210px;} -input.span4,textarea.span4,.uneditable-input.span4{width:290px;} -input.span5,textarea.span5,.uneditable-input.span5{width:370px;} -input.span6,textarea.span6,.uneditable-input.span6{width:450px;} -input.span7,textarea.span7,.uneditable-input.span7{width:530px;} -input.span8,textarea.span8,.uneditable-input.span8{width:610px;} -input.span9,textarea.span9,.uneditable-input.span9{width:690px;} -input.span10,textarea.span10,.uneditable-input.span10{width:770px;} -input.span11,textarea.span11,.uneditable-input.span11{width:850px;} -input.span12,textarea.span12,.uneditable-input.span12{width:930px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} -.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -:-moz-placeholder{color:#999999;} -::-webkit-input-placeholder{color:#999999;} -.help-block{margin-top:5px;margin-bottom:0;color:#999999;} -.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} -.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} -.input-prepend:after,.input-append:after{clear:both;} -.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} -.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} -.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on{*margin-top:1px;} -.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-append .uneditable-input{border-right-color:#ccc;} -.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} -.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} -.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} -.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} -.control-group{margin-bottom:9px;} -.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} -.form-horizontal .controls{margin-left:160px;} -.form-horizontal .form-actions{padding-left:160px;} -table{max-width:100%;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} -.table th{font-weight:bold;vertical-align:bottom;} -.table td{vertical-align:top;} -.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} -.table tbody+tbody{border-top:2px solid #ddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} -.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} -.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} -table .span1{float:none;width:44px;margin-left:0;} -table .span2{float:none;width:124px;margin-left:0;} -table .span3{float:none;width:204px;margin-left:0;} -table .span4{float:none;width:284px;margin-left:0;} -table .span5{float:none;width:364px;margin-left:0;} -table .span6{float:none;width:444px;margin-left:0;} -table .span7{float:none;width:524px;margin-left:0;} -table .span8{float:none;width:604px;margin-left:0;} -table .span9{float:none;width:684px;margin-left:0;} -table .span10{float:none;width:764px;margin-left:0;} -table .span11{float:none;width:844px;margin-left:0;} -table .span12{float:none;width:924px;margin-left:0;} -[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(http://github.com/img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} -.icon-white{background-image:url(http://github.com/img/glyphicons-halflings-white.png);} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} -.dropdown .caret{margin-top:8px;margin-left:2px;} -.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} -.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} -.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} -.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} -.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} -.dropdown.open .dropdown-menu{display:block;} -.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} -.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} -.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} -.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} -.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} -.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-large .icon{margin-top:1px;} -.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} -.btn-small .icon{margin-top:-1px;} -.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} -.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} -button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} -.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} -.btn-group:after{clear:both;} -.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} -.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} -.btn .caret{margin-top:7px;margin-left:0;} -.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} -.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} -.btn-small .caret{margin-top:4px;} -.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.alert,.alert-heading{color:#c09853;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} -.alert-success,.alert-success .alert-heading{color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} -.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;} -.alert-info,.alert-info .alert-heading{color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -.nav{margin-left:0;margin-bottom:18px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} -.nav-list .nav-header *{text-transform:none;} -.nav-list>li+.nav-header{margin-top:9px;} -.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list [class^="icon-"]{margin-right:2px;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} -.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} -.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} -.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} -.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} -.tabbable:after{clear:both;} -.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below .nav-tabs{border-top:1px solid #ddd;} -.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} -.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.navbar{overflow:visible;margin-bottom:18px;} -.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} -.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} -.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} -.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.nav-collapse.collapse{height:auto;} -.navbar .brand:hover{text-decoration:none;} -.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} -.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} -.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} -.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} -.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} -.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} -.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;} -.navbar .nav>li{display:block;float:left;} -.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} -.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} -.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} -.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} -.navbar .nav.pull-right{margin-left:10px;margin-right:0;} -.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} -.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} -.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} -.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} -.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} -.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} -.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} -.breadcrumb .divider{padding:0 5px;color:#999999;} -.breadcrumb .active a{color:#333333;} -.pagination{height:36px;margin:18px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination li{display:inline;} -.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} -.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} -.pagination .active a{color:#999999;cursor:default;} -.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager a:hover{text-decoration:none;background-color:#f5f5f5;} -.pager .next a{float:right;} -.pager .previous a{float:left;} -.modal-open .dropdown-menu{z-index:2050;} -.modal-open .dropdown.open{*z-index:2050;} -.modal-open .popover{z-index:2060;} -.modal-open .tooltip{z-index:2070;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} -.modal.fade.in{top:50%;} -.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-body{padding:15px;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} -.modal-footer:after{clear:both;} -.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} -.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-2px;} -.tooltip.right{margin-left:2px;} -.tooltip.bottom{margin-top:2px;} -.tooltip.left{margin-left:-2px;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} -.popover.right{margin-left:5px;} -.popover.bottom{margin-top:5px;} -.popover.left{margin-left:-5px;} -.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.popover .arrow{position:absolute;width:0;height:0;} -.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} -.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} -.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} -.thumbnails:after{clear:both;} -.thumbnails>li{float:left;margin:0 0 18px 20px;} -.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;} -.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.label-important{background-color:#b94a48;} -.label-warning{background-color:#f89406;} -.label-success{background-color:#468847;} -.label-info{background-color:#3a87ad;} -@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} -.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} -.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} -.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} -.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.accordion{margin-bottom:18px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} -.carousel{position:relative;margin-bottom:18px;line-height:1;} -.carousel-inner{overflow:hidden;width:100%;position:relative;} -.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} -.carousel .item>img{display:block;line-height:1;} -.carousel .active,.carousel .next,.carousel .prev{display:block;} -.carousel .active{left:0;} -.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} -.carousel .next{left:100%;} -.carousel .prev{left:-100%;} -.carousel .next.left,.carousel .prev.right{left:0;} -.carousel .active.left{left:-100%;} -.carousel .active.right{left:100%;} -.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} -.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} -.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} -.carousel-caption h4,.carousel-caption p{color:#ffffff;} -.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} -.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} diff --git a/docs/Saml/css/jquery.iviewer.css b/docs/Saml/css/jquery.iviewer.css deleted file mode 100644 index d68c6422..00000000 --- a/docs/Saml/css/jquery.iviewer.css +++ /dev/null @@ -1,91 +0,0 @@ -.iviewer_common { - position:absolute; - bottom:10px; - border: 1px solid #000; - height: 28px; - z-index: 5000; -} - -.iviewer_cursor { - cursor: url(http://github.com/img/iviewer/hand.cur) 6 8, pointer; -} - -.iviewer_drag_cursor { - cursor: url(http://github.com/img/iviewer/grab.cur) 6 8, pointer; -} - -.iviewer_button { - width: 28px; - cursor: pointer; - background-position: center center; - background-repeat: no-repeat; -} - -.iviewer_zoom_in { - left: 20px; - background: url(http://github.com/img/iviewer/iviewer.zoom_in.png); -} - -.iviewer_zoom_out { - left: 55px; - background: url(http://github.com/img/iviewer/iviewer.zoom_out.png); -} - -.iviewer_zoom_zero { - left: 90px; - background: url(http://github.com/img/iviewer/iviewer.zoom_zero.png); -} - -.iviewer_zoom_fit { - left: 125px; - background: url(http://github.com/img/iviewer/iviewer.zoom_fit.png); -} - -.iviewer_zoom_status { - left: 160px; - font: 1em/28px Sans; - color: #000; - background-color: #fff; - text-align: center; - width: 60px; -} - -.iviewer_rotate_left { - left: 227px; - background: #fff url(http://github.com/img/iviewer/iviewer.rotate_left.png) center center no-repeat; -} - -.iviewer_rotate_right { - left: 262px; - background: #fff url(http://github.com/img/iviewer/iviewer.rotate_right.png) center center no-repeat; -} - -.viewer -{ - width: 100%; - height: 500px; - position: relative; - background: transparent url('http://github.com/img/loader.gif') no-repeat center center; -} - -.viewer img -{ - max-width: none; -} - -.wrapper -{ - overflow: hidden; -} - -.iviewer_common -{ - border: 0; - bottom: auto; - top: 10px; -} - -.iviewer_zoom_status -{ - border: 1px solid black; -} diff --git a/docs/Saml/css/prettify.css b/docs/Saml/css/prettify.css deleted file mode 100644 index d44b3a22..00000000 --- a/docs/Saml/css/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/docs/Saml/css/template.css b/docs/Saml/css/template.css deleted file mode 100644 index 45d61967..00000000 --- a/docs/Saml/css/template.css +++ /dev/null @@ -1,527 +0,0 @@ -@import url(http://github.com/bootstrap.min.css); -@import url(http://github.com/bootstrap-responsive.css); -@import url(http://github.com/prettify.css); -@import url(http://github.com/jquery.iviewer.css); -@import url(http://fonts.googleapis.com/css?family=Forum); - -body -{ - padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ - background: #f9f9f9; - color: #444; -} - -a -{ - color: #55A72F; -} - -td p:last-of-type { - margin: 0; -} - -li.l0, li.l1, li.l2, li.l3, li.l5, li.l6, li.l7, li.l8 -{ - list-style-type: decimal; -} - -a.brand, h2, .hero-unit h1 -{ - font-family: 'Forum', "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -.element .span4 -{ - width: 275px; -} - -.namespace-contents hr, .package-contents hr -{ - border-top: 3px dotted silver; -} - -.namespace-indent, .package-indent -{ - padding-left: 10px; border-left: 1px dashed #f0f0f0; -} - -.element h3 i, .namespace-contents h3 i, .package-contents h3 i -{ - margin-top: 2px; - margin-right: 5px; -} - -.element h3, .namespace-contents h3, .package-contents h3 -{ - margin-top: 25px; - margin-bottom: 20px; - border-bottom: 1px solid silver; -} - -.element h3:first-of-type, .namespace-contents h3:first-of-type, -.package-contents h3:first-of-type -{ - margin-top: 30px; -} - -.element h2 -{ - font-family: inherit; - font-size: 1.2em; - color: black; -} - -.element .type -{ - font-weight: bold; -} - -#search-query -{ - height: auto; -} - -.hero-unit, div.element, .well -{ - border: 1px solid #e0e0e0; - background: white; -} - -.dropdown-menu a{ - overflow: hidden; - text-overflow: ellipsis; -} -h2 -{ - border-bottom: 1px dashed #55A72F; - margin-bottom: 10px; - padding-bottom: 0; - padding-left: 5px; - color: #e9e9e9; - font-weight: normal; - margin-top: 40px; -} - -h2:first-of-type -{ - margin-top: 0; -} - -.hero-unit -{ - background: #75a70d; /* Old browsers */ - background: -moz-radial-gradient(center, ellipse cover, #bfd255 0%, #8eb92a 72%, #72aa00 96%, #9ecb2d 100%); /* FF3.6+ */ - background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#bfd255), color-stop(72%,#8eb92a), color-stop(96%,#72aa00), color-stop(100%,#9ecb2d)); /* Chrome,Safari4+ */ - background: -webkit-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Chrome10+,Safari5.1+ */ - background: -o-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Opera 12+ */ - background: -ms-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* IE10+ */ - background: radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bfd255', endColorstr='#9ecb2d',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ - - padding: 40px 0 15px 0; - box-shadow: inset 0 0 10px gray; -} - -.hero-unit h1 -{ - font-weight: normal; - text-align: center; - color: white; - text-shadow: black 0 0 15px; -} - -.hero-unit h2 -{ - border: none; - color: white; - background: rgba(48, 48, 48, 0.5); - padding: 0; - margin: 0; - margin-top: 15px; - text-align: center; -} - -.namespace-contents h2, .package-contents h2 -{ - padding-left: 44px; - background: transparent url('http://github.com/img/icons/icon-th-big.png') no-repeat 3px center; -} - -.package-contents h2 -{ - background-image: url('http://github.com/img/icons/icon-folder-open-big.png'); -} - -.namespace-contents .element h2, .package-contents .element h2 -{ - padding-left: 0; - background: none; -} - -div.element -{ - border-left: 10px solid #55A72F; - border-radius: 5px; - padding: 7px 7px 2px 7px; - margin-bottom: 15px; - margin-left: 0; -} - -div.element.protected -{ - border-left-color: orange; -} - -div.element.private -{ - border-left-color: red; -} - -div.element.class, div.element.interface -{ - border-left-color: #e0e0e0; -} - -div.element.class.abstract h1, div.element.interface.abstract h1 -{ - font-style: italic; -} - -div.element h1 -{ - font-size: 1.2em; - line-height: 1.5em; - margin-bottom: 10px; - padding-left: 22px; - background: transparent no-repeat left 2px; - word-wrap: break-word; -} - -div.element h1 a -{ - color: transparent; - margin-left: 10px; -} - -div.element h1:hover a -{ - color: silver; -} - -div.element h1 a:hover -{ - color: navy; -} - -div.element a.more:hover -{ - background: #f0f0f0; - color: #444; - text-decoration: none; -} - -div.element a.more -{ - font-weight: bold; - text-align: center; - color: gray; - border-top: 1px dashed silver; - display: block; - margin-top: 5px; - padding: 5px 0; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; -} - -div.element p -{ - font-size: 0.9em; -} - -div.element .table -{ - font-size: 0.9em; -} - -div.element .table th -{ - text-transform: capitalize; -} - -div.detail-description -{ - padding-left: 30px; -} - -div.detail-description table th { - vertical-align: top; -} - -body.invert -{ - background: white; -} - -body.invert div.element -{ - background: #f9f9f9; -} - -ul.side-nav -{ - clear: both; -} - -ul.side-nav li -{ - word-wrap: break-word; - padding-left: 10px; - text-indent: -10px; -} - -ul.side-nav li a -{ - background: transparent no-repeat 5px 3px; - padding-bottom: 10px; - font-style: italic; -} - -ul.side-nav li pre -{ - font-size: 0.8em; - margin: 5px 15px 0 15px; - padding: 2px 5px; - background-color: #f8f8f8; - color: gray; - font-style: normal; - word-wrap: break-word; - text-indent: 0; -} - -ul.side-nav li.view-simple span.description -{ - display: none; -} - -ul.side-nav li.view-simple pre -{ - font-size: inherit; - margin: inherit; - padding: inherit; - background-color: inherit; - border: none; - color: inherit; - font-family: inherit; - font-style: inherit; - padding-bottom: 0; - padding-left: 5px; -} - -ul.side-nav li.view-simple a -{ - padding-bottom: 0; -} - -i.icon-custom -{ - width: 16px; - height: 16px; - background-position: 0; -} - -.table.markers -{ - background: white; -} - -/* JS only functionality; disable by default */ -.btn-group.visibility, .btn-group.view, .btn-group.type-filter -{ - display: none; -} - -.visibility button -{ - height: 24px; -} - -div.element.constant h1, -i.icon-constant { background-image: url('http://github.com/img/icons/constant.png'); } - -div.element.function h1, -i.icon-function { background-image: url('http://github.com/img/icons/function.png'); } - -div.element.method h1, -i.icon-method { background-image: url('http://github.com/img/icons/method.png'); } - -div.element.class h1, -i.icon-class { background-image: url('http://github.com/img/icons/class.png'); } - -div.element.interface h1, -i.icon-interface { background-image: url('http://github.com/img/icons/interface.png'); } - -div.element.property h1, -i.icon-property { background-image: url('http://github.com/img/icons/property.png'); } - -span.empty-namespace -{ - color: silver; -} - -footer -{ - text-align: right; - font-size: 0.8em; - opacity: 0.5; -} - -#mapHolder -{ - border: 4px solid #555; - padding: 0 !important; - overflow: hidden -} - -div.element div.subelement -{ - margin-left: 10px; - padding-bottom: 5px; - clear: both; -} - -pre code -{ - border: none; -} - -div.element div.subelement > code -{ - font-size: 0.8em; - float: left; - margin-right: 10px; - padding: 0 5px; - line-height: 16px; -} - -div.element div.subelement > p -{ - margin-left: 20px; - margin-right: 50px; -} - -div.element div.subelement h4 -{ - color: #666; - margin-bottom: 5px; -} - -div.element div.subelement.response -{ - padding-bottom: 15px; - margin-right: 50px; -} - -div.labels -{ - text-align: right; -} - -.nav-list .nav-header -{ - font-size: 13px; -} - -.nav-list .nav-header .side-nav-header -{ - font-weight: bold; - line-height: 18px; - color: #999999; - text-transform: uppercase; -} - -.detail-description code { - white-space: pre; - display: inline-block; - padding: 10px; -} - -.go_to_top -{ - float: right; - margin-right: 20px; - background: #2C2C2C; - color: #999; - padding: 3px 10px; - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - line-height: 19px; -} - -.visibility .btn { - text-transform: uppercase; - font-size: 0.7em; - font-weight: bold; -} - -.iviewer_common -{ - z-index: 100; -} - -@media (min-width: 980px) -{ - a[name] - { - margin-top: -50px; - position: absolute; - } -} - -@media (min-width: 1200px) -{ - .method .span4 - { - width: 345px; - } -} - -/* redefined because twitter bootstrap assumes that bootstrap-responsive.css */ -@media (max-width: 980px) -{ - body - { - padding-top: 0; - } - - .go_to_top - { - display: none; - } - - .btn-group.visibility - { - font-size: 0.80em; - margin-bottom: 7px; - display: inline-block; - float: right; - } -} - -@media (max-width: 768px) -{ - .hero-unit h1 { - font-size: 30px; - } - .hero-unit h2 { - font-size: 19px; - } - -} -@media (min-width: 768px) and (max-width: 980px) -{ - .method .span4 - { - width: 203px; - } -} diff --git a/docs/Saml/graph_class.html b/docs/Saml/graph_class.html deleted file mode 100644 index 1a3ab977..00000000 --- a/docs/Saml/graph_class.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - SAML PHP Toolkit - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
-
-
-
-
-
- - - -
- - - - diff --git a/docs/Saml/img/apple-touch-icon-114x114.png b/docs/Saml/img/apple-touch-icon-114x114.png deleted file mode 100644 index 1506f6a668fbb2837c06b561895da248c310ac53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28338 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�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 diff --git a/docs/Saml/img/apple-touch-icon.png b/docs/Saml/img/apple-touch-icon.png deleted file mode 100644 index 2d320cb5e1215894ef37cf8c6fd7a0085eba06f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8358 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 LNHCv2rc(U_{c|km diff --git a/docs/Saml/img/glyphicons-halflings-white.png b/docs/Saml/img/glyphicons-halflings-white.png deleted file mode 100644 index a20760bfde58d1c92cee95116059fba03c68d689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4352 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 diff --git a/docs/Saml/img/icons/arrow_down.png b/docs/Saml/img/icons/arrow_down.png deleted file mode 100644 index 61505adc46d8fa4156d9b31831ebe6770f0e2757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmV-k0-^nhP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qcLRmoAwA00G`fL_t(I%cWC2tJ+``e%^eL7t$KUBw$9t*+0;sKcG;!o#ftvQ=v=O zPEznkbn((fBwn}RP@zy12dlPS%uu3(Akjdnjb!m7Z{AKf?FH|p;Io_q=Wq_^JkLWo z=Qsxf&cxXRNV#0TVT@UX5OB_sBngrvNpr^7o%nCPR4T2dTrT%m)3hhWViEKC9B~|j zF^1#uh$Kmn&1OL6a}1fD2f7I*U{_szDuTQUi!ZOqfjWA01!nH;yA``w*%)K zs;Yug3Q-h6DTN>iAcUaZZvWhDHqV4=wffsM&FACsIL_zuX_G9=kR&O+_4XuD6w&YZ zlPHQVyWQ?u0DxMp_GP_Z-y9AHSe6Azl0XPax7|XPWh@p8ESJmcPN(zf4hxRsTn&fA zuar{gx(-1QAP9d+5=9YV7-BM+jB~l%>ytFDR;#zJ>#hvLKqiw(w{yPNyJ*ytHlGe^5w{<6H+p@P5DF!?G;MvWzec z5d^`9X0!S6zm#a(_8ZrA2b!kAG);J(_suYjSEqWV`y{Gq+Kbt2=5Dv!N1CQx)a!M2 sQpyjxu~Ml#WsK2AqtU(B3+LMT58IsRj2DXS7XSbN07*qoM6N<$f?9MBJpcdz diff --git a/docs/Saml/img/icons/arrow_right.png b/docs/Saml/img/icons/arrow_right.png deleted file mode 100644 index 60c5927ebf63f388b45315cbc4cc56a77b9f903c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qT;gv2%z300Hz#L_t(I%axPMt5Q)EhkyI*EgldQ%_FEFNFoiwK|$ce2O<`vO%-#J z*f5+m4E!U)pbO5VW@l24A`$5(O~gT>V;_X?vwa*%Pb1@|_l9>(HfyjxzP0vRMAI}J zBA?HH1aP2?dagoht>5TwNDO6R(YPG_8y~cXI2Im}{b9lX8_ zilTha<#MhY4K|w%7K;TIiv<)#fubnjoMSSXfKrNJF!)f@w4a$w<}m=UV}t2*irH)i z#ux-a_&XQ9UJr-E0ZJ)MCKDfz$D3;n4h4so5CWso2)Ek}0I1jNHC0vbmrA9tCkBKN z=yW=Wq6k3{z!-zoYK0_8=yW=};c)o2TrR)5TEmVFD5YSGK@>$e91e)0h*qoB@AZ0b zWLbWH{Ea67#u&_IGwgOdw%aYL)#{IazyG>ct9`j{4^CR}cs$tcc4#yjzXyZC2U(V% z|8JH50ce_rZnulkX!Ofwvpp*oi2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4`J+jIM*dB6Xqg)}~| zJoCIb=eAt%N2Sc0*LR=)Gr>jXc+U1{2EKOY&`?3wi#H~`UdZcts5G`~(Smi^VXH-t zNnA2H`u*=l#_~yWzkbC{@|eWZU~_(X%TKE^b)f2_P*>quOSp`{Hl;21nz{an^LB{Ts5!Fr;& diff --git a/docs/Saml/img/icons/constant.png b/docs/Saml/img/icons/constant.png deleted file mode 100644 index f5f180d5a9b09a19b5ae44ad64a1fdceb6a86d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmVrl1?U*0YQ8KBh3^hnN3W5 z2%|~HXz55n-@#z_4GhF=O%)o!1~F5NWx9pcZ;~F+?Pl3!f;~`hPjKs2om2M?&}Yi{ z)a|hNOZ<{ll;no}Bk)fO?j?Pd^dsz_V-;AIg>Bmyh7qUYr=-X5?0(D-NtDZF=JPoK zm&=9SZbzX|h$DHpwjoI*lSww44g39`Mx%jgn$+ucGMNm9VNk2pa2$tryNzwzJxRTg z;8l{SR;vIEhr`H=-EJ4(_i-GD)oR6Jv3R?-aYHZ~jUoig<&w!{f+RYf4giC};OT}S zkx1Zq9*4t$R;z_&Su~qXve_)-@tE~`O*);X-|ureoq}Sq`0d7mBub?cv)PRE`3%5z zyCt8`Q>j##PN(?3kLP)~uKN-h;x$auB$vxYtfW$@*foCnJuN{HCvYhz#zuJz@P!dKp~(AL>x#lFaYJy!Tsagqt+F;zg(Vd_Ma3C z(nGFZm^~mf*5 z)sz1pn_UOj3v?y|2J0zg2h4lZXZ~Oq6V)2(>o0PAi0Mp zcm2O}aQ*+4X;%Lqp4$EY_?&u@^n?8R{_$;a_<;NZ^2eq1Gykv3ut72B2M+tMZ(scX z!_&L}cQnO<)vrjkgy>B%C#)Z+=I#Bf|8MMChN2ecXJi`Peo$P2?0#|mG=^J|^}*N= zPwo1DaqZOq$7k37KfSmE=*JoV_w{7|UykNZn0k89t1|6?Zs{cGcU*1(=|3{P60d%I dd2d6B_y4`!nK<=Rk_TaW8yL|`1mgK1y#VW>cs>9C diff --git a/docs/Saml/img/icons/file-php.png b/docs/Saml/img/icons/file-php.png deleted file mode 100644 index c323f09f66241a28d61f1d2c8e90be0a68126bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4017 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 L;uWgGz+epk&R;19 diff --git a/docs/Saml/img/icons/folder.gif b/docs/Saml/img/icons/folder.gif deleted file mode 100644 index 2b31631ca2bfec3a8afb1bfdd4f8ed4c5bcc3a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmZ?wbhEHb6ky=hKW2GJ7 I#Kd3?0MGg2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4c?q7?3B2Xp1x8ImHETXz54QVYrPgqHx8=(z e>Gl76{l!*pI92y$_dTH37(8A5T-G@yGywo6mxkK_ diff --git a/docs/Saml/img/icons/icon-folder-open-big.png b/docs/Saml/img/icons/icon-folder-open-big.png deleted file mode 100644 index fae384ef4df761b2d6cc250ed5787e430ae91663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^azHG`!3HF+C+nOCQtLfk978H@y`6TEw^f11_3i;d ziGzYN2L&Zg3QDws(66dq&SgShn{Thb{zRo^(j5Lg&dD7z8Ed<2HaxncvF_0qB|qh( zD^{Iwcon{}=b8RLEj=%X$?owoQ+czMDqpDz@out+{J4%~%}Jdw83lFk?!Av|@026WQIOdE8_{3R(~E4X}F}*cK0{Nlc(N@tWx{N75ZIyLFkD`ce?_+omU+4eIu&X fef&+H?MME!>ysALYPH`1I-SAO)z4*}Q$iB}E$LkN diff --git a/docs/Saml/img/icons/icon-th-big.png b/docs/Saml/img/icons/icon-th-big.png deleted file mode 100644 index 04b0ad872a98de63bc0e300e627ce69a2a209471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fhMq2tAr-gYPBH{4<6!#zfBD*P z%ML8Ga1?(i);mdUy45w?2d5KGCQHxw$nZHi?xXOW{3u1P>qQzNK+O!Eu6{1-oD!M< D6}BRE diff --git a/docs/Saml/img/icons/icon_template.svg b/docs/Saml/img/icons/icon_template.svg deleted file mode 100644 index b0428aa4..00000000 --- a/docs/Saml/img/icons/icon_template.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - Co - - diff --git a/docs/Saml/img/icons/interface.png b/docs/Saml/img/icons/interface.png deleted file mode 100644 index 51a3a1762db628e8cbbfb4d933a74b4d962d2d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR40E|;Z~{{z_~j>MQR++0q{n_jdZ_~Xzv)82ln zir1^4FSoop)7kP4q||D^oYExqqT%4L-+qnX2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4|3mlps%(3Z75trJZsonk=m!SRtUbjIcd*Gd{GD-MU&5kK`Fd$; z&qe*M;R)u)+B55zu54SYqS>Xy$aOeCxaR(R@13(xM|fE^lFf7PnUNSzTjBx@u1_}0S82W4^{;r-{cRJTTl!v}kb2YK z*1sl?dBGmby>EB*DR3}+u*rYhnEoKO=X=4viDB0(R!$ZFviy;n_U!uqz48-dSM>2+ S-W3cC0R~T3KbLh*2~7ZLUYG9x diff --git a/docs/Saml/img/icons/ok.png b/docs/Saml/img/icons/ok.png deleted file mode 100644 index 39f287ab19b8bcdc156ea56355a95290d04f0ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3685 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 AIsgCw diff --git a/docs/Saml/img/icons/search.gif b/docs/Saml/img/icons/search.gif deleted file mode 100644 index eef46fc9ee10547bfa2da348f81b4c83f19e65a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmZ?wbhEHb6krfw*v!MQVZ+APuU|iW_~^rj4_mixJ96acuV25;ojZ5^`i(nx?(W*P zd;k6e|NsAIfC0syEQ|~cJPbM@0gxFCEUptydamAU5nbG%&zz z##7bH4$=1vId^*V*v!xR>*{?7mqKrCnmdg!}G z=IXm8Sn&!;akH?purU1n%JB2k%b%|wU4DOV*XpD9FQ1(YRJQ}B0U&^o4e)SH>*-Ur zh)`kY;$&s`_k)2EsF{J8m4Sm#kV96(KvF=6-{ZWnu*|swyBJ`G00a;d%-Q;G(RnJC zk*X~0{H%Zf{A2k0_b@F4v6je+t14+fASCR#!a*Y7?B`u`upwYzT_j5PRxk@1k>@6WFcf574M53UU$ zfM5nZ{PpG4FOc(@{(fdKQRiUz`t=9HgNKh8zJB|~V5B3;@aO9@i00pa89smd@*SEs z7ytqYX29h)kFR`S`1=Lu?N1E0y_w^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/docs/Saml/img/icons/visibility_private.png b/docs/Saml/img/icons/visibility_private.png deleted file mode 100644 index 386dc2d879d20cf85e4eeaaeb29e66bfe8398995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3433 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 diff --git a/docs/Saml/img/iviewer/grab.cur b/docs/Saml/img/iviewer/grab.cur deleted file mode 100644 index ef540be09383a215ba21287683ae956b74a6dbbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmeHEF%H8Z3_L;+LM2k9N*yv~>~H#wK9i4B>Jy?)*;1Rr5Mf~HSVzWizBA$iDEg)e zv@Up@fGdC-B|(IIaVjw`XMnR4do4(}ceLED$#?I4PhZt?V;F{(zNyX4aU6>oTI<~I zR%1+|Z@pO>D9unx@mz^sV2R6KAHrH&a3w(Uah_+1dcf$ic$W0J$AsEGc`x}F-{G8# oT0W#ZA~$;zN&n?%4r~@-v(K$0B;Q#;t diff --git a/docs/Saml/img/iviewer/hand.cur b/docs/Saml/img/iviewer/hand.cur deleted file mode 100644 index 1a5bafb5263fd4937dda4098b04aa5c70e2de924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)3OKyWe4E694LIn}22q6~8?0U4`qB$BzVUYuLnN^5A#g-vqrbZ8co}UNC0FIu^ z1?Y|NodI+J@I{~!RsQPaynTKEFe0{|*)R-iM9cJuPktQ*F&}vmxJX7;nU}sFz|xzG*A)o1}vy~Np8!oh{{D) z3FWrSE(G-lOIo^%@l%Jh z7d(bKZD(=f(+rDu3Ibk!p~fAzvAEw(G5oFaf>VGX;I$X`=G^#MhKzfwaaX++^R_aG z{23g@-KfbsV!rlS8y~jNpC$Q98001E5Sq?VpxukSs-?)+t$^aeGL+RsprA4wk<#_> z_+u(WTiH*vZ^%;_bKH_BUEq}jd#?-l#9J=q_v{?VaI4}Q9JQ|FoaxO4M#r~&(9l-@ga5_qddH0^Pp)3D%%13U()$KPZ9mfuKHeN zh|FV%AcKd9$Xte~JpHr7ISdEsS=dbylRpV}b%EG*(H$Zm7BrYE89CoGzCv2mgg*7U?}T-eQj1 z{ctQepE}YD%L6}S{pbtWcxoXGX*qRvIs~7NleuJ1rI2sTU9}wgEO}#naM{Mwl$wh8u zCnBy@;!tLlFk2ANZy*yRh*u1IjEu7sgd^u~j?-pP>cuPS5S69F5h60HO2`84nde#W zyHhV;*NN!tY8*EZeXCkX$LB3TNWEh+HIj>(aWc0CrwBgBQY@5_fO(q}ggUVHfHYwh z33cBmty=DP=A9=gECUXndMm_NP*e}Z-LCDyS)!}~n7b*S3$R(WUj{y!TOYyebROJ- zFF$p&>5+Q7DfKeS+K_mst_KprM8H(Hy%~al3{|Z#A5JZTYe-7!V4F>!)KgSFrn=vN z3kCIkDE(K!G*^RwzlwE`Dy#7rUC1u2#kz=0tng2mHP|cZPQ4qN4qPSy<|wW2D5KC{MlR z;>)=A5V)!Cz;#udS#FfKqnHHD=_R1Ptpjzf{nOgnDXf!ZtKqUo3Ky}YM}T&xUI8_p z+{#DD)pj7q40-gM-UA6eVt~J6Ck37*j6+@9f{jOSVfEgWC}V(*7I~i&Dx8uU4S&P_ z;3=qW>uyHVjD_fF#+pz$KVvi(@T$|6gmQ;1NkX6Jb)Y}^@BGWy!Sjrgf9<#ho=bDz zCj-9w{fH|?2J}+O500000NkvXXu0mjf*RRDb diff --git a/docs/Saml/img/iviewer/iviewer.rotate_right.png b/docs/Saml/img/iviewer/iviewer.rotate_right.png deleted file mode 100644 index 7a6c829871d058af5a5ca0ac67256c259f84c5ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1482 zcmV;*1vUDKP)W@q8L24va@vW@P7*!=(&yIADtgIo?`IW@@z#oP%kAO5~e4>aSvdau$keO zelrxe7h>a?XEPGL-8ZvUK7S5JxO_SC%cam%h9U3nOynA8Bd1~p@(p_slER=;FN42~ zVT$Cx%L&IBfqkNPU0Q$wV<=M8^Ktsd`-seX8%Hx4(Mza9RSeQph6Cvg*A2_?bs*!Z zJm9Mh7vz)H#bKgf96Z*=%6lrx!F>}8+<9p(ZW^~EGIuaSuQBYWfCsY}!gCl75#iYs zn4X1YwmkE{L{qbYU7_|vC;44Kc>_>d53G;Ofy>H6K72&Q1n)K0hYkOJ{}5yueQ_kO zAEZ3kO@`uTdQ^;QD4P$Xc-46$f7y>g|g44T+ z#BgE=@!>Z#-vKoL6Wa&pE*R*#HWno`0s)tGNL1G$LZyexFDGPt0qahH^Hl0tOywX% zlsY1!jA8k4hEa>zCTrlAtqC<~Car`X>shKzaMo5pP+|!}lx4#8x7#jb=yVHAyecTTC4J8t z#9H#H1x)ab5$qRn{T_~Gwh%$&8k>4#Nl^>etY1&RH*c@JV*VdWES08K(6hJ3ua1F+ z1Vqx@pUkersqB_Ip|BQ5mEtYg?Pld26u-(ZDhIXZN8p8vpywZqUmXq21K`XJ6VBRD zSPjgUh_hsuo0Zq@#H52sg=lQDK%p}U0=)MqxPXrz3y|HcLaYr6jTyT{TGH;2&kl$g zvn(tPnZ+iUo13A~-oxKTMnQmAi+~YaKrsopkYC+_iv!`6FZ*8at59p?CSTLD^ce@1hVDp0-#Q zq7i&EGSIAWEAo-(3@vR~e8qHMf3DS%&Pzg-H4FABh2HRK5QhTu_A0SBL~)<~@sXQv zl!l*(`MH4my)*cGH#$9gu8S$5cCU4I9uNy}^C|I;^|0b5vYngtVB^%;d7vlsx1OAw ktS2S0?VM~5JkO{63m1~IVD>3BuK)l507*qoM6N<$f)6RO6951J diff --git a/docs/Saml/img/iviewer/iviewer.zoom_fit.png b/docs/Saml/img/iviewer/iviewer.zoom_fit.png deleted file mode 100644 index 364e01d90eae19584713851314629f2468198e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmbVMZD`zN9M7nO!F>6)Qu>rmKTa$KDx31r-tX6e<%`(6Krd_QfiW`8t`1_@uq7ekl83AbH+? zzu*7$$#_?1`>KY!8VG_|C2bSZcx-mx`sMihAai~i59?7fi@MD`D#97s?^ptvbD@%0UaWlEb9Y?!POak>Kac>j_lvC`$F%JGkXW>_ZEGx zJom!Kv#(7V2O9tK-kSZb!BUHpo@HF_;W5I?7`%^kn|fV6LyKC%38?;(5V z!PU9ZKS#&d``e%Ktf-E%=q0M&EZqyy}ir$_H&JcW2fJ{{PgiX z8-IUUIXQgrq&9v}_F_|k9sDEvsw97zUz^v|wk^6~k{(E}g+-F{ISKr))j<47BXr41~e0blAr&bSs z|IrSo^7@evzS-=(@x`Huqc2r99GkQ^PabxeDqKE2-7j>wsvG2m_N{Pyfo(Z~3KXY?;^Pc&YH??aJsCHEo`3 w8eZ!(AMJatv3kpyYro>2$M)>r+u)qoRbjGiisBQYX$xZ(3D5f)$iQF?09S=3^#A|> diff --git a/docs/Saml/img/iviewer/iviewer.zoom_in.png b/docs/Saml/img/iviewer/iviewer.zoom_in.png deleted file mode 100644 index 78993327c62ddd64e7fe33bc1b0d469ef9e17f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmbVMeM}o=96n$mLI`O1*jPqxokAS8_t9QIP6}&#?I^6YLL;DzakN*s!1Zp|0}9Rz z8rh;F0cBg38IU39T#zkeLnml8hzMCSG?@^xXdOBYVGI|HL|oz(DEbH4A6|0zem&3g z`+V;WTfxD&nA8{m0OHKKM4>pQ1>fi>@%sWi*eedZ1Y?O%#JYqAlBWQjldYscGecHU zg%s&*JUU5b0YHS4wwDMcmP5FMWn^R!Bl9wx$OeF{94|*YYA6A$q^fAQR`OuPF9B(% zR#J>vU<+rUs_EP&o+@f8usfP+92%!2CmYQ2;-UaU2_)!cYTX{(tCg(l;^I8G4N1Ut zh)|=IY&cb7v4IAbr$9^wOC7Kh29<~mkt? zy6{56v}sFRX(iQyz~K<#uSL*ic3n>tk$HCK_ zK(lTzs7O|_b%ItRdb$w;!&xj_!fwxIqQsOzUXp_l84NK@Fs^m9M<}HJbz@t!$KJ?M zP$A`E>v)G)57)jBS6;_)Fv2Ks*P|kY8`^A2u!ZfsWAnHVJ68Y*ZF@k28qrD)nZSf_1^Pw#| z@pZkmCA&G}0&7bcjq%x*?aRCV3irha4o~M_DArx{=C$ijm7gxpJfn{2L~$I+EADGSEAJts^bthXdZ0!+7(pGrKca+s`)MokNH6@80m`S3a@u zY1ygFvFkgB8j(NleZ>ubn=|IJ|7-yHzY}KZV-M0lk+#l6X1~TQy|p*uWp8(@{ii>t zUM%g1pU@A_-dyI62l_3g1J;f*Z-2$!(N|(ifOlu2-fw+1YIXRfE0Nik_Z$MUT=6@` he~f-qo>Y;tmQ(?tGoVp(DLyXve>58lh(UdY?;kaa{Rsd7 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_in2.gif b/docs/Saml/img/iviewer/iviewer.zoom_in2.gif deleted file mode 100644 index 5d596181627a30344f9783d466ce0558279fe729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_O4Pyfo(Z}}I`;fT1UbHL~G(^^jrxfIDc qOSLxju^l&BbLLyj{a>m(=kzlMwFoEmw|glD9`i8f>~-Q|um%7;9UyH0 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_out.png b/docs/Saml/img/iviewer/iviewer.zoom_out.png deleted file mode 100644 index 893f3502baaab667354fe8b560c1712b72630836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{T%CB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA){ffi_eM3D1{oGuTzrd=COM+4n&cLd=IHa;5RX-@T zIKQ+g85kdF$}r8qu)}W=NFmTQR{lkqz(`5Vami0E%}vcK@pQ3O0?O#6WTsddyBS)T zxj4DGI+;7U8WbpSnwXlJx+y{RrjQe2`as9%gOUbPQh^Bp(;tWlPxwF%JnN+90rN`{ zFk|eTuyZ2=1LH1F7srr_TYIJ*^g8Sy&?e2@*d%abWdMgri<5t&U4#0<`~ZPHTulKV zL_SFVVrt@l5PQLUVYuUp3a@^r?zky&+EXok@RH&z@w!8r$f$z%0{cUx;M)M%(BO@dlSAr|x|-`3zUuyW0)IVtW>|s>WVT?mGEc zSkr=`cGH2CXUi731dH|WWa9iWg>~1jL@c(3*I%OB-d`n9ld0_~{X@e~VM+?bvqa&xDF~4=3Dc{-t;PQB<+c zv78v6y_Q$sW5p8UNtB8n}}+(%+^^VTDLxDs_M@V zktZgdHP!#l9(Qv}igT01!>vuNAL^777;7#{%n;%?`4GGKfzXddg$9fTvuy=L>XpA# emo~({32$Iz;FK4L4Ckl>myMpTelF{r5}E)fw)-Uj diff --git a/docs/Saml/img/iviewer/iviewer.zoom_out2.gif b/docs/Saml/img/iviewer/iviewer.zoom_out2.gif deleted file mode 100644 index 77ec19af216c5525438e73e4fafef1ce08db3cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_N!Pyfo(Z}}I`*>bCU^SwRQTrH10rZprj VQ(Lv|A^Y)9KG(nX7PB%~0{{a@8tMQ5 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_zero.png b/docs/Saml/img/iviewer/iviewer.zoom_zero.png deleted file mode 100644 index c981db6d690774d0c2e67e21c9081d5c89b5fd2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmbVL&ui0A9M4pSOy+USDH`Jt54L&lWo?(ZTAQSq1v^VuUA;)t~d_LcwSBo>#!$V_3 z9LEjkPwFMM?vLJ`gY0_@JiN=6Jv3LLv!qU2W`Mb@O=_6WyXHJDVbfl^_!>`f+;-b3 zS7@bhO0kF=HzS*P+w~cm6!@+QT}TTXPE`s;ULyhK6LAo; zKoamt7>CkCDwR6QBLIO2kO)x>rW6S&0Pwv>U}}L~S4z6k(_*Kz(4f>;M6uOs#amLG z1oI-4WjW$ND8?*e;gUzqcFYS8^%-;=T7lzJhj@I%Xx2!RrUmBdMhLE7C~OjYVJ}fE zWn$a(MHmO7>qc>PtwUPEf85y8IxH{wSS;a?Gy{v(qkgClX1V*fP-MuwQBDUAD~h?O z6RYWBkLLBX!2ZN-$5tc*P9}BL$f+qc2OyjTdQR0O9U94`B&o2^u@x4nAeBw1(2x=n z5avKO31v+Nl7u7!=(60$=Dm=bo`w6m4%6*n!9THz7GRT-piIbOzXOU5LP^*lKCjIt z_&LY3Nh^$svk|L~1LqR9jexj(H@k|ng?bW90+iEJ2GWfvYE_c6auz`iY1tG)S)qru z|0iQ2b4H9>hb!)51ol8qidf>uee2NcllE7&Y7PpcX!=7_qbu-x&Nqo^YXsS zx4psB1L(rH2OVv_Ry|wWf8@aTYwPTIZ{+>+x4F)XFBxU;`RVIF##f(pxPd|L)0^?x S8}D{hqp{BCX7q<@b>%mi3|d_P diff --git a/docs/Saml/img/iviewer/iviewer.zoom_zero2.gif b/docs/Saml/img/iviewer/iviewer.zoom_zero2.gif deleted file mode 100644 index e56c670fe62062458276fab5512701433b37af4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 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 diff --git a/docs/Saml/index.html b/docs/Saml/index.html deleted file mode 100644 index bf5027b1..00000000 --- a/docs/Saml/index.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - SAML PHP Toolkit - - - - - - - - - - - - - - - - - - - - - - -
- - -
-

SAML PHP Toolkit

-

Documentation SAML lib

-
- -
-
-
- -
- -
-
-
- -
-
-
-
- - - - diff --git a/docs/Saml/js/SVGPan.js b/docs/Saml/js/SVGPan.js deleted file mode 100644 index 4966b999..00000000 --- a/docs/Saml/js/SVGPan.js +++ /dev/null @@ -1,232 +0,0 @@ -/** - * SVGPan library 1.2 - phpDocumentor1 - * ==================== - * - * Given an unique existing element with id "viewport", including the - * the library into any SVG adds the following capabilities: - * - * - Mouse panning - * - Mouse zooming (using the wheel) - * - Object dargging - * - * Known issues: - * - * - Zooming (while panning) on Safari has still some issues - * - * Releases: - * - * 1.2 - phpDocumentor1, Fri Apr 08 19:19:00 CET 2011, Mike van Riel - * Increased zoom speed with 20% - * Disabled element moving functionality - * - * 1.2, Sat Mar 20 08:42:50 GMT 2010, Zeng Xiaohui - * Fixed a bug with browser mouse handler interaction - * - * 1.1, Wed Feb 3 17:39:33 GMT 2010, Zeng Xiaohui - * Updated the zoom code to support the mouse wheel on Safari/Chrome - * - * 1.0, Andrea Leofreddi - * First release - * - * This code is licensed under the following BSD license: - * - * Copyright 2009-2010 Andrea Leofreddi . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of Andrea Leofreddi. - */ - -var root = document.documentElement; - -var state = 'none', stateTarget, stateOrigin, stateTf; - -setupHandlers(root); - -/** - * Register handlers - */ -function setupHandlers(root){ - setAttributes(root, { - "onmouseup" : "add(evt)", - "onmousedown" : "handleMouseDown(evt)", - "onmousemove" : "handleMouseMove(evt)", - "onmouseup" : "handleMouseUp(evt)", -// "onmouseout" : "handleMouseUp(evt)" // Decomment this to stop the pan functionality when dragging out of the SVG element - }); - - if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0) - window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - else - window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others -} - -/** - * Instance an SVGPoint object with given event coordinates. - */ -function getEventPoint(evt) { - var p = root.createSVGPoint(); - - p.x = evt.clientX; - p.y = evt.clientY; - - return p; -} - -/** - * Sets the current transform matrix of an element. - */ -function setCTM(element, matrix) { - var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; - - element.setAttribute("transform", s); -} - -/** - * Dumps a matrix to a string (useful for debug). - */ -function dumpMatrix(matrix) { - var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]"; - - return s; -} - -/** - * Sets attributes of an element. - */ -function setAttributes(element, attributes){ - for (i in attributes) - element.setAttributeNS(null, i, attributes[i]); -} - -/** - * Handle mouse move event. - */ -function handleMouseWheel(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var delta; - - if(evt.wheelDelta) - delta = evt.wheelDelta / 3600; // Chrome/Safari - else - delta = evt.detail / -90; // Mozilla - - var z = 1 + (delta * 1.2); // Zoom factor: 0.9/1.1 - - var g = svgDoc.getElementById("viewport"); - - var p = getEventPoint(evt); - - p = p.matrixTransform(g.getCTM().inverse()); - - // Compute new scale matrix in current mouse position - var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y); - - setCTM(g, g.getCTM().multiply(k)); - - stateTf = stateTf.multiply(k.inverse()); -} - -/** - * Handle mouse move event. - */ -function handleMouseMove(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var g = svgDoc.getElementById("viewport"); - - if(state == 'pan') { - // Pan mode - var p = getEventPoint(evt).matrixTransform(stateTf); - - setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y)); - } else if(state == 'move') { - // Move mode - var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse()); - - setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM())); - - stateOrigin = p; - } -} - -/** - * Handle click event. - */ -function handleMouseDown(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var g = svgDoc.getElementById("viewport"); - -// if(evt.target.tagName == "svg") { - // Pan mode - state = 'pan'; - - stateTf = g.getCTM().inverse(); - - stateOrigin = getEventPoint(evt).matrixTransform(stateTf); -// } else { - // Move mode -// state = 'move'; -// -// stateTarget = evt.target; -// -// stateTf = g.getCTM().inverse(); -// -// stateOrigin = getEventPoint(evt).matrixTransform(stateTf); -// } -} - -/** - * Handle mouse button release event. - */ -function handleMouseUp(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - if(state == 'pan' || state == 'move') { - // Quit pan mode - state = ''; - } -} - diff --git a/docs/Saml/js/bootstrap.js b/docs/Saml/js/bootstrap.js deleted file mode 100644 index c832ccb2..00000000 --- a/docs/Saml/js/bootstrap.js +++ /dev/null @@ -1,1722 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!function( $ ) { - - $(function () { - - "use strict" - - /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) - * ======================================================= */ - - $.support.transition = (function () { - var thisBody = document.body || document.documentElement - , thisStyle = thisBody.style - , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined - - return support && { - end: (function () { - var transitionEnd = "TransitionEnd" - if ( $.browser.webkit ) { - transitionEnd = "webkitTransitionEnd" - } else if ( $.browser.mozilla ) { - transitionEnd = "transitionend" - } else if ( $.browser.opera ) { - transitionEnd = "oTransitionEnd" - } - return transitionEnd - }()) - } - })() - - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-alert.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function ( el ) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype = { - - constructor: Alert - - , close: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.trigger('close') - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.removeClass('in') - - function removeElement() { - $parent.remove() - $parent.trigger('closed') - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-button.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype = { - - constructor: Button - - , setState: function ( state ) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - , toggle: function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - $(e.target).button('toggle') - }) - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-carousel.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.carousel.defaults, options) - this.options.slide && this.slide(this.options.slide) - } - - Carousel.prototype = { - - cycle: function () { - this.interval = setInterval($.proxy(this.next, this), this.options.interval) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function () { - clearInterval(this.interval) - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if (!$.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger('slide') - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } else { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.trigger('slide') - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = typeof option == 'object' && option - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}( window.jQuery ) -/* ============================================================= - * bootstrap-collapse.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - var Collapse = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options["parent"]) { - this.$parent = $(this.options["parent"]) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension = this.dimension() - , scroll = $.camelCase(['scroll', dimension].join('-')) - , actives = this.$parent && this.$parent.find('.in') - , hasData - - if (actives && actives.length) { - hasData = actives.data('collapse') - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', 'show', 'shown') - this.$element[dimension](this.$element[0][scroll]) - - } - - , hide: function () { - var dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', 'hide', 'hidden') - this.$element[dimension](0) - } - - , reset: function ( size ) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element.addClass('collapse') - } - - , transition: function ( method, startEvent, completeEvent ) { - var that = this - , complete = function () { - if (startEvent == 'show') that.reset() - that.$element.trigger(completeEvent) - } - - this.$element - .trigger(startEvent) - [method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-dropdown.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function( $ ){ - - "use strict" - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function ( element ) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - , isActive - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - !isActive && $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}( window.jQuery ) -/* ========================================================= - * bootstrap-modal.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function( $ ){ - - "use strict" - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function ( content, options ) { - this.options = $.extend({}, $.fn.modal.defaults, options) - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - - if (this.isShown) return - - $('body').addClass('modal-open') - - this.isShown = true - this.$element.trigger('show') - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function ( e ) { - e && e.preventDefault() - - if (!this.isShown) return - - var that = this - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element - .trigger('hide') - .removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal( that ) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop( callback ) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(' - - - - diff --git a/docs/Saml2/classes/OneLogin_Saml2_LogoutResponse.html b/docs/Saml2/classes/OneLogin_Saml2_LogoutResponse.html deleted file mode 100644 index fbcc883a..00000000 --- a/docs/Saml2/classes/OneLogin_Saml2_LogoutResponse.html +++ /dev/null @@ -1,600 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml2_LogoutResponse - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
-
-

OneLogin_Saml2_LogoutResponse

- - -

SAML 2 Logout Response

-
-
- -
- -
- -

Methods

- -
-

Constructs a Logout Response object (Initialize params from settings and if provided -load the Logout Response.

-
__construct(\OneLogin_Saml2_Settings $settings, string|null $response = null) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$settings

- \OneLogin_Saml2_Settings

Settings.

-
-
-

$response

- string|null

An UUEncoded SAML Logout response from the IdP.

-
- -
-
-
- -
-

Gets the Issuer of the Logout Response.

-
getIssuer() : string|null
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string|null

$issuer The Issuer

-
-
-
- -
-

Gets the Status of the Logout Response.

-
getStatus() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The Status

-
-
-
- - -
-

After execute a validation process, if fails this method returns the cause.

-
getError() : string
-
-
-
-
-

Response

- string

Cause

-
-
-
- - -
-

Generates a Logout Response object.

-
build(string $inResponseTo) 
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$inResponseTo

- string

InResponseTo value for the Logout Response.

-
- -
-
-
- -
-

Returns a Logout Response object.

-
getResponse() : string
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

Logout Response deflated and base64 encoded

-
-
-
- - -
-

Determines if the SAML LogoutResponse is valid

-
isValid(string $requestId = null) : bool
-
-
-
-
- - - - - - - - - - -
- throws - - - -
- - -
- -

Arguments

-
-

$requestId

- string

The ID of the LogoutRequest sent by this SP to the IdP

-
- -

Response

- bool

Returns if the SAML LogoutResponse is or not valid

-
-
-
-
- -
-

Extracts a node from the DOMDocument (Logout Response Menssage)

-
_query(string $query) : \DOMNodeList
-
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$query

- string

Xpath Expresion

-
- -

Response

- \DOMNodeList

The queried node

-
-
-
-
-

Properties

- -
-

Object that represents the setting info

-
_settings : \OneLogin_Saml2_Settings
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \OneLogin_Saml2_Settings -
-
-
- -
-

The decoded, unprocessed XML response provided to the constructor.

-
_logoutResponse : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

A DOMDocument class loaded from the SAML LogoutResponse.

-
document : \DomDocument
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \DomDocument -
-
-
-
- - -
-

After execute a validation process, if it fails, this var contains the cause

-
_error : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
-
- - - -
-
- - - - - - diff --git a/docs/Saml2/classes/OneLogin_Saml2_Metadata.html b/docs/Saml2/classes/OneLogin_Saml2_Metadata.html deleted file mode 100644 index 862a0cd0..00000000 --- a/docs/Saml2/classes/OneLogin_Saml2_Metadata.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml2_Metadata - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
-
-

OneLogin_Saml2_Metadata

- - -

Metadata lib of PHP Toolkit

-
-
- -
- -
- -

Methods

- -
-

Generates the metadata of the SP based on the settings

-
builder(string $sp, string $authnsign = false, string $wsign = false, \DateTime $validUntil = null, \Timestamp $cacheDuration = null, array $contacts = array(), array $organization = array()) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$sp

- string

The SP data

-
-
-

$authnsign

- string

authnRequestsSigned attribute

-
-
-

$wsign

- string

wantAssertionsSigned attribute

-
-
-

$validUntil

- \DateTime

Metadata's valid time

-
-
-

$cacheDuration

- \Timestamp

Duration of the cache in seconds

-
-
-

$contacts

- array

Contacts info

-
-
-

$organization

- array

Organization ingo

-
- -

Response

- string

SAML Metadata XML

-
-
-
- - - -
-

Adds the x509 descriptors (sign/encriptation) to the metadata -The same cert will be used for sign/encrypt

-
addX509KeyDescriptors(string $metadata, string $cert, boolean $wantsEncrypted) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$metadata

- string

SAML Metadata XML

-
-
-

$cert

- string

x509 cert

-
-
-

$wantsEncrypted

- boolean

Whether to include the KeyDescriptor for encryption

-
- -

Response

- string

Metadata with KeyDescriptors

-
-
-
- -

Constants

- -
-

TIME_VALID

-
TIME_VALID
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-

TIME_CACHED

-
TIME_CACHED
-
-
-
-
-
- - - - - - - - - -
- - -
- - -
-
-
-
- -
-
- - -
-
- -
- - - - diff --git a/docs/Saml2/classes/OneLogin_Saml2_Response.html b/docs/Saml2/classes/OneLogin_Saml2_Response.html deleted file mode 100644 index 3913cc0e..00000000 --- a/docs/Saml2/classes/OneLogin_Saml2_Response.html +++ /dev/null @@ -1,970 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml2_Response - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml2_Response

- - -

SAML 2 Authentication Response

-
-
- -
- -
- -

Methods

- -
-

Constructs the SAML Response object.

-
__construct(\OneLogin_Saml2_Settings $settings, string $response) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$settings

- \OneLogin_Saml2_Settings

Settings.

-
-
-

$response

- string

A UUEncoded SAML response from the IdP.

-
- -
-
-
- -
-

Determines if the SAML Response is valid using the certificate.

-
isValid(string $requestId = null) : bool
-
-
-
-
- - - - - - - - - -
- throws -
- -

Arguments

-
-

$requestId

- string

The ID of the AuthNRequest sent by this SP to the IdP

-
- -

Response

- bool

Validate the document

-
-
-
- - -
-

Checks if the Status is success

-
checkStatus() 
-
-
-
-
-
- - - - - - - - - - - - - - - - - - -
- throws - - -

If status is not success

-
- - -
- - -
- - -
- - -
-
-
- -
-

Gets the audiences.

-
getAudiences() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

@audience The valid audiences of the response

-
-
-
- -
-

Gets the Issuers (from Response and Assertion).

-
getIssuers() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

@issuers The issuers of the assertion/response

-
-
-
- -
-

Gets the NameID Data provided by the SAML response from the IdP.

-
getNameIdData() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

Name ID Data (Value, Format, NameQualifier, SPNameQualifier)

-
-
-
- -
-

Gets the NameID provided by the SAML response from the IdP.

-
getNameId() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

Name ID Value

-
-
-
- -
-

Gets the SessionNotOnOrAfter from the AuthnStatement.

-
getSessionNotOnOrAfter() : \DateTime|null
-
-
-
-
-

Could be used to set the local session expiration

- - - - - - - - - - -
- - -
- - -
- - -

Response

- \DateTime|null

The SessionNotOnOrAfter value

-
-
-
- -
-

Gets the SessionIndex from the AuthnStatement.

-
getSessionIndex() : string|null
-
-
-
-
-

Could be used to be stored in the local session in order -to be used in a future Logout Request that the SP could -send to the SP, to set what specific session must be deleted

- - - - - - - - - - -
- - -
- - -
- - -

Response

- string|null

The SessionIndex value

-
-
-
- -
-

Gets the Attributes from the AttributeStatement element.

-
getAttributes() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

The attributes of the SAML Assertion

-
-
-
- -
-

Verifies that the document only contains a single Assertion (encrypted or not).

-
validateNumAssertions() : bool
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- bool

TRUE if the document passes.

-
-
-
- -
-

Verifies that the document is still valid according Conditions Element.

-
validateTimestamps() : bool
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- bool

-
-
-
- - -
-

After execute a validation process, if fails this method returns the cause.

-
getError() : string
-
-
-
-
- -

Response

- string

Cause

-
-
-
- - -
-

Extracts a node from the DOMDocument (Assertion).

-
_queryAssertion(string $assertionXpath) : \DOMNodeList
-
-
-
-
-
- - - - - - - - - - -
- throws - - - -
- - -
- -

Arguments

-
-

$assertionXpath

- string

Xpath Expresion

-
- -

Response

- \DOMNodeList

The queried node

-
-
-
- -
-

Extracts nodes that match the query from the DOMDocument (Response Menssage)

-
_query(string $query) : \DOMNodeList
-
-
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$query

- string

Xpath Expresion

-
- -

Response

- \DOMNodeList

The queried nodes

-
-
-
- -
-

Decrypts the Assertion (DOMDocument)

-
_decryptAssertion(string $dom) : \DOMDocument
-
-
-
-
-
- - - - - - - - - - -
- throws - - - -
- - -
- -

Arguments

-
-

$dom

- string

DomDocument

-
- -

Response

- \DOMDocument

Decrypted Assertion

-
-
-
- - -

Properties

- -
-

Settings

-
_settings : \OneLogin_Saml2_Settings
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \OneLogin_Saml2_Settings -
-
-
- -
-

The decoded, unprocessed XML response provided to the constructor.

-
response : string
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- string -
-
-
- -
-

A DOMDocument class loaded from the SAML Response.

-
document : \DomDocument
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \DomDocument -
-
-
- -
-

A DOMDocument class loaded from the SAML Response (Decrypted).

-
decryptedDocument : \DomDocument
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- \DomDocument -
-
-
- -
-

The response contains an encrypted assertion.

-
encrypted : boolean
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- boolean -
-
-
-
-
- - -
-
- -
- - - - diff --git a/docs/Saml2/classes/OneLogin_Saml2_Settings.html b/docs/Saml2/classes/OneLogin_Saml2_Settings.html deleted file mode 100644 index 84778546..00000000 --- a/docs/Saml2/classes/OneLogin_Saml2_Settings.html +++ /dev/null @@ -1,1631 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml2_Settings - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml2_Settings

- - -

Configuration of the PHP Toolkit

-
-
- -
- -
- -

Methods

- -
-

Initializes the settings: -- Sets the paths of the different folders -- Loads settings info from settings file or array/object provided

-
__construct(array|object $settings = null) 
-
-
-
-
-
- - - - - - - - - - - - - - -
- exceptions - - -

Throws error exception if any settings parameter is invalid

-
- - -
- - -
- -

Arguments

-
-

$settings

- array|object

SAML Toolkit Settings

-
- -
-
-
- -
-

Sets the paths of the different folders

-
_loadPaths() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

Returns base path.

-
getBasePath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The base toolkit folder path

-
-
-
- -
-

Returns cert path.

-
getCertPath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The cert folder path

-
-
-
- -
- -
-

Returns config path.

-
getConfigPath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The config folder path

-
-
-
- - -
-

Returns lib path.

-
getLibPath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The library folder path

-
-
-
- -
-

Returns external lib path.

-
getExtLibPath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The external library folder path

-
-
-
- -
-

Returns schema path.

-
getSchemasPath() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

The external library folder path

-
-
-
- -
-

Loads settings info from a settings Array

-
_loadSettingsFromArray(array $settings) : boolean
-
-
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$settings

- array

SAML Toolkit Settings

-
- -

Response

- boolean

True if the settings info is valid

-
-
-
- -
-

Loads settings info from the settings file

-
_loadSettingsFromFile() : boolean
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

True if the settings info is valid

-
-
-
- -
-

Add default values if the settings info is not complete

-
_addDefaultValues() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

Checks the settings info.

-
checkSettings(array $settings) : array
-
-
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$settings

- array

Array with settings data

-
- -

Response

- array

$errors Errors found on the settings data

-
-
-
- -
-

Checks if the x509 certs of the SP exists and are valid.

-
checkSPCerts() : boolean
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

-
-
-
- -
-

Returns the x509 private key of the SP.

-
getSPkey() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

SP private key

-
-
-
- -
-

Returns the x509 public cert of the SP.

-
getSPcert() : string
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

SP public cert

-
-
-
- -
-

Gets the IdP data.

-
getIdPData() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

IdP info

-
-
-
- -
-

Gets the SP data.

-
getSPData() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

SP info

-
-
-
- -
-

Gets security data.

-
getSecurityData() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

SP info

-
-
-
- -
-

Gets contact data.

-
getContacts() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

SP info

-
-
-
- -
-

Gets organization data.

-
getOrganization() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

SP info

-
-
-
- - - - - -
-

Formats the IdP cert.

-
formatIdPCert() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- - -
-

Formats the SP private key.

-
formatSPKey() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- - -
-

Formats the SP cert.

-
formatSPCert() 
-
-
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- -
-
-
- -
-

Returns an array with the errors, the array is empty when the settings is ok.

-
getErrors() : array
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- array

Errors

-
-
-
- -
-

Activates or deactivates the strict mode.

-
setStrict(boolean $value) 
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$value

- boolean

Strict parameter

-
- -
-
-
- -
-

Returns if the 'strict' mode is active.

-
isStrict() : boolean
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

Strict parameter

-
-
-
- -
-

Returns if the debug is active.

-
isDebugActive() : boolean
-
-
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

Debug parameter

-
-
-
- - -

Properties

- -
-

List of paths.

-
_paths : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

Strict. If active, PHP Toolkit will reject unsigned or unencrypted messages -if it expects them signed or encrypted. If not, the messages will be accepted -and some security issues will be also relaxed.

-
_strict : boolean
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- boolean -
-
-
- -
-

Activate debug mode

-
_debug : boolean
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- boolean -
-
-
- -
-

SP data.

-
_sp : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

IdP data.

-
_idp : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

Security Info related to the SP.

-
_security : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

Setting contacts.

-
_contacts : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

Setting organization.

-
_organization : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
- -
-

Setting errors.

-
_errors : array
-
-
-
-
-
- - - - - - - - - - -
- var - - -
- - -
- -

Type(s)

- array -
-
-
-
-
- - -
-
- - - - - - diff --git a/docs/Saml2/classes/OneLogin_Saml2_Utils.html b/docs/Saml2/classes/OneLogin_Saml2_Utils.html deleted file mode 100644 index bc525f63..00000000 --- a/docs/Saml2/classes/OneLogin_Saml2_Utils.html +++ /dev/null @@ -1,1259 +0,0 @@ - - - - - - SAML PHP Toolkit » \OneLogin_Saml2_Utils - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
- - -
-
- - - - -
- - - - -
- -
-
-

OneLogin_Saml2_Utils

- - -

Utils of PHP Toolkit

-
-
-

Defines several often used methods

-
- -
- -

Methods

- -
-

Translates any string. Accepts args

-
t(string $msg, array $args = array()) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$msg

- string

Message to be translated

-
-
-

$args

- array

Arguments

-
- -

Response

- string

$translatedMsg Translated text

-
-
-
- -
-

This function attempts to validate an XML string against the specified schema.

-
validateXML(string $xml, string $schema, boolean $debug = false) : string
-
- static
-
-
-

It will parse the string into a DOM document and validate this document against the schema.

- - - - - - -
- - -
- -

Arguments

-
-

$xml

- string

The XML string or document which should be validated.

-
-
-

$schema

- string

The schema filename which should be used.

-
-
-

$debug

- boolean

To disable/enable the debug mode

-
- -

Response

- string

| DOMDocument $dom string that explains the problem or the DOMDocument

-
-
-
- -
-

Returns a x509 cert (adding header & footer if required).

-
formatCert(string $cert, boolean $heads = true) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$cert

- string

A x509 unformated cert

-
-
-

$heads

- boolean

True if we want to include head and footer

-
- -

Response

- string

$x509 Formated cert

-
-
-
- -
-

Returns a private key (adding header & footer if required).

-
formatPrivateKey(string $key, boolean $heads = true) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$key

- string

A private key

-
-
-

$heads

- boolean

True if we want to include head and footer

-
- -

Response

- string

$rsaKey Formated private key

-
-
-
- - - -
-

Executes a redirection to the provided url (or return the target url).

-
redirect(string $url, array $parameters = array(), boolean $stay = false) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$url

- string

The target url

-
-
-

$parameters

- array

Extra parameters to be passed as part of the url

-
-
-

$stay

- boolean

True if we want to stay (returns the url string) False to redirect

-
- -

Response

- string

$url

-
-
-
- -
-

Returns the protocol + the current host + the port (if different than -common ports).

-
getSelfURLhost() : string
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

$url

-
-
-
- -
-

Returns the current host.

-
getSelfHost() : string
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

$currentHost The current host

-
-
-
- -
-

Checks if https or http.

-
isHTTPS() : boolean
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

$isHttps False if https is not active

-
-
-
- -
-

Returns the URL of the current host + current view.

-
getSelfURLNoQuery() : string
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

-
-
-
- -
-

Returns the URL of the current host + current view + query.

-
getSelfURL() : string
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

-
-
-
- -
-

Generates an unique string (used for example as ID for assertions).

-
generateUniqueID() : string
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- string

A unique string

-
-
-
- -
-

Converts a UNIX timestamp to SAML2 timestamp on the form -yyyy-mm-ddThh:mm:ss(\.s+)?Z.

-
parseTime2SAML(string $time) : \$timestamp
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$time

- string

The time we should convert (DateTime).

-
- -

Response

- \$timestamp

SAML2 timestamp.

-
-
-
- -
-

Converts a SAML2 timestamp on the form yyyy-mm-ddThh:mm:ss(\.s+)?Z -to a UNIX timestamp. The sub-second part is ignored.

-
parseSAML2Time(string $time) : \$timestamp
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$time

- string

The time we should convert (SAML Timestamp).

-
- -

Response

- \$timestamp

Converted to a unix timestamp.

-
-
-
- -
-

Interprets a ISO8601 duration value relative to a given timestamp.

-
parseDuration(string $duration, int $timestamp = null) : int
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$duration

- string

The duration, as a string.

-
-
-

$timestamp

- int

The unix timestamp we should apply the

-
                     duration to. Optional, default to the
-                     current time.

-
- -

Response

- int

The new timestamp, after the duration is applied.

-
-
-
- -
-

Compares 2 dates and returns the earliest.

-
getExpireTime(string $cacheDuration = null, string $validUntil = null) : int
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$cacheDuration

- string

The duration, as a string.

-
-
-

$validUntil

- string

The valid until date, as a string or as a timestamp

-
- -

Response

- int

$expireTime The expiration time.

-
-
-
- -
-

Extracts nodes from the DOMDocument.

-
query(\DOMDocument $dom, string $query, \DomElement $context = null) : \DOMNodeList
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$dom

- \DOMDocument

The DOMDocument

-
-
-

$query

- string

Xpath Expresion

-
-
-

$context

- \DomElement

Context Node (DomElement)

-
- -

Response

- \DOMNodeList

The queried nodes

-
-
-
- -
-

Checks if the session is started or not.

-
isSessionStarted() : boolean
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- - -

Response

- boolean

true if the sessíon is started

-
-
-
- -
-

Deletes the local session.

-
deleteLocalSession() 
-
- static
-
-
-
- - - - - - - - - - - - - - -
- - -
- - -
- - -
- - -
-
-
- -
-

Calculates the fingerprint of a x509cert.

-
calculateX509Fingerprint(string $x509cert) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$x509cert

- string

x509 cert

-
- -

Response

- string

Formated fingerprint

-
-
-
- -
-

Formates a fingerprint.

-
formatFingerPrint(string $fingerprint) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$fingerprint

- string

fingerprint

-
- -

Response

- string

Formated fingerprint

-
-
-
- -
-

Generates a nameID.

-
generateNameId(string $value, string $spnq, string $format, string $key = null) : string
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$value

- string

fingerprint

-
-
-

$spnq

- string

SP Name Qualifier

-
-
-

$format

- string

SP Format

-
-
-

$key

- string

SP Key to encrypt the nameID

-
- -

Response

- string

$nameIDElement DOMElement | XMLSec nameID

-
-
-
- -
-

Gets Status from a Response.

-
getStatus(\DomElement $dom) : array
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$dom

- \DomElement

The Response as XML

-
- -

Response

- array

$status The Status, an array with the code and a message.

-
-
-
- -
-

Decrypts an encrypted element.

-
decryptElement(\DOMElement $encryptedData, \XMLSecurityKey $inputKey) : \DOMElement
-
- static
-
-
-
- - - - - - -
- - -
- -

Arguments

-
-

$encryptedData

- \DOMElement

The encrypted data.

-
-
-

$inputKey

- \XMLSecurityKey

The decryption key.

-
- -

Response

- \DOMElement

The decrypted element.

-
-
-
- - - -
-

Converts a XMLSecurityKey to the correct algorithm.

-
castKey(XMLSecurityKey $key, $algorithm, $type = 'public')
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$key

- XMLSecurityKey

The key

-
-
-

$algorithm

- string

The desired algorithm

-
-
-

$type

- string

Public or private key, defaults to public.

-
- -
-
-
- - - -
-

Adds signature key and senders certificate to an element (Message or Assertion).

-
addSign(string|\DomDocument $xml, string $key, string $cert) 
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$xml

- string|\DomDocument

The element we should sign

-
-
-

$key

- string

The private key

-
-
-

$cert

- string

The public

-
- -
-
-
- -
-

Validates a signature (Message or Assertion).

-
validateSign(string|\DomDocument $xml, string|null $cert = null, string|null $fingerprint = null) 
-
- static
-
-
-
- - - - - - - - - - -
- - -
- - -
- -

Arguments

-
-

$xml

- string|\DomDocument

The element we should validate

-
-
-

$cert

- string|null

The pubic cert

-
-
-

$fingerprint

- string|null

The fingerprint of the public cert

-
- -
-
-
- - -
-
- - -
-
- -
- - - - diff --git a/docs/Saml2/css/bootstrap-responsive.css b/docs/Saml2/css/bootstrap-responsive.css deleted file mode 100644 index 4b032cdb..00000000 --- a/docs/Saml2/css/bootstrap-responsive.css +++ /dev/null @@ -1,567 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.hidden { - display: none; - visibility: hidden; -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 18px; - } - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - height: 28px; - /* Make inputs at least the height of their button counterpart */ - - /* Makes inputs behave like true block-level elements */ - - -webkit-box-sizing: border-box; - /* Older Webkit */ - - -moz-box-sizing: border-box; - /* Older FF */ - - -ms-box-sizing: border-box; - /* IE8 */ - - box-sizing: border-box; - /* CSS3 spec*/ - - } - .input-prepend input[class*="span"], .input-append input[class*="span"] { - width: auto; - } - input[type="checkbox"], input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-group > label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .modal { - position: absolute; - top: 10px; - left: 10px; - right: 10px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 768px) { - .container { - width: auto; - padding: 0 20px; - } - .row-fluid { - width: 100%; - } - .row { - margin-left: 0; - } - .row > [class*="span"], .row-fluid > [class*="span"] { - float: none; - display: block; - width: auto; - margin: 0; - } -} -@media (min-width: 768px) and (max-width: 980px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 20px; - } - .span1 { - width: 42px; - } - .span2 { - width: 104px; - } - .span3 { - width: 166px; - } - .span4 { - width: 228px; - } - .span5 { - width: 290px; - } - .span6 { - width: 352px; - } - .span7 { - width: 414px; - } - .span8 { - width: 476px; - } - .span9 { - width: 538px; - } - .span10 { - width: 600px; - } - .span11 { - width: 662px; - } - .span12, .container { - width: 724px; - } - .offset1 { - margin-left: 82px; - } - .offset2 { - margin-left: 144px; - } - .offset3 { - margin-left: 206px; - } - .offset4 { - margin-left: 268px; - } - .offset5 { - margin-left: 330px; - } - .offset6 { - margin-left: 392px; - } - .offset7 { - margin-left: 454px; - } - .offset8 { - margin-left: 516px; - } - .offset9 { - margin-left: 578px; - } - .offset10 { - margin-left: 640px; - } - .offset11 { - margin-left: 702px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid > [class*="span"] { - float: left; - margin-left: 2.762430939%; - } - .row-fluid > [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span1 { - width: 5.801104972%; - } - .row-fluid .span2 { - width: 14.364640883%; - } - .row-fluid .span3 { - width: 22.928176794%; - } - .row-fluid .span4 { - width: 31.491712705%; - } - .row-fluid .span5 { - width: 40.055248616%; - } - .row-fluid .span6 { - width: 48.618784527%; - } - .row-fluid .span7 { - width: 57.182320438000005%; - } - .row-fluid .span8 { - width: 65.74585634900001%; - } - .row-fluid .span9 { - width: 74.30939226%; - } - .row-fluid .span10 { - width: 82.87292817100001%; - } - .row-fluid .span11 { - width: 91.436464082%; - } - .row-fluid .span12 { - width: 99.999999993%; - } - input.span1, textarea.span1, .uneditable-input.span1 { - width: 32px; - } - input.span2, textarea.span2, .uneditable-input.span2 { - width: 94px; - } - input.span3, textarea.span3, .uneditable-input.span3 { - width: 156px; - } - input.span4, textarea.span4, .uneditable-input.span4 { - width: 218px; - } - input.span5, textarea.span5, .uneditable-input.span5 { - width: 280px; - } - input.span6, textarea.span6, .uneditable-input.span6 { - width: 342px; - } - input.span7, textarea.span7, .uneditable-input.span7 { - width: 404px; - } - input.span8, textarea.span8, .uneditable-input.span8 { - width: 466px; - } - input.span9, textarea.span9, .uneditable-input.span9 { - width: 528px; - } - input.span10, textarea.span10, .uneditable-input.span10 { - width: 590px; - } - input.span11, textarea.span11, .uneditable-input.span11 { - width: 652px; - } - input.span12, textarea.span12, .uneditable-input.span12 { - width: 714px; - } -} -@media (max-width: 980px) { - body { - padding-top: 0; - } - .navbar-fixed-top { - position: static; - margin-bottom: 18px; - } - .navbar-fixed-top .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .navbar .nav-collapse { - clear: left; - } - .navbar .nav { - float: none; - margin: 0 0 9px; - } - .navbar .nav > li { - float: none; - } - .navbar .nav > li > a { - margin-bottom: 2px; - } - .navbar .nav > .divider-vertical { - display: none; - } - .navbar .nav > li > a, .navbar .dropdown-menu a { - padding: 6px 15px; - font-weight: bold; - color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .navbar .dropdown-menu li + li a { - margin-bottom: 2px; - } - .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover { - background-color: #222222; - } - .navbar .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: block; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .navbar .dropdown-menu:before, .navbar .dropdown-menu:after { - display: none; - } - .navbar .dropdown-menu .divider { - display: none; - } - .navbar-form, .navbar-search { - float: none; - padding: 9px 15px; - margin: 9px 0; - border-top: 1px solid #222222; - border-bottom: 1px solid #222222; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar .nav.pull-right { - float: none; - margin-left: 0; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } - .btn-navbar { - display: block; - } - .nav-collapse { - overflow: hidden; - height: 0; - } -} -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - } -} -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 30px; - } - .span1 { - width: 70px; - } - .span2 { - width: 170px; - } - .span3 { - width: 270px; - } - .span4 { - width: 370px; - } - .span5 { - width: 470px; - } - .span6 { - width: 570px; - } - .span7 { - width: 670px; - } - .span8 { - width: 770px; - } - .span9 { - width: 870px; - } - .span10 { - width: 970px; - } - .span11 { - width: 1070px; - } - .span12, .container { - width: 1170px; - } - .offset1 { - margin-left: 130px; - } - .offset2 { - margin-left: 230px; - } - .offset3 { - margin-left: 330px; - } - .offset4 { - margin-left: 430px; - } - .offset5 { - margin-left: 530px; - } - .offset6 { - margin-left: 630px; - } - .offset7 { - margin-left: 730px; - } - .offset8 { - margin-left: 830px; - } - .offset9 { - margin-left: 930px; - } - .offset10 { - margin-left: 1030px; - } - .offset11 { - margin-left: 1130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid > [class*="span"] { - float: left; - margin-left: 2.564102564%; - } - .row-fluid > [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span1 { - width: 5.982905983%; - } - .row-fluid .span2 { - width: 14.529914530000001%; - } - .row-fluid .span3 { - width: 23.076923077%; - } - .row-fluid .span4 { - width: 31.623931624%; - } - .row-fluid .span5 { - width: 40.170940171000005%; - } - .row-fluid .span6 { - width: 48.717948718%; - } - .row-fluid .span7 { - width: 57.264957265%; - } - .row-fluid .span8 { - width: 65.81196581200001%; - } - .row-fluid .span9 { - width: 74.358974359%; - } - .row-fluid .span10 { - width: 82.905982906%; - } - .row-fluid .span11 { - width: 91.45299145300001%; - } - .row-fluid .span12 { - width: 100%; - } - input.span1, textarea.span1, .uneditable-input.span1 { - width: 60px; - } - input.span2, textarea.span2, .uneditable-input.span2 { - width: 160px; - } - input.span3, textarea.span3, .uneditable-input.span3 { - width: 260px; - } - input.span4, textarea.span4, .uneditable-input.span4 { - width: 360px; - } - input.span5, textarea.span5, .uneditable-input.span5 { - width: 460px; - } - input.span6, textarea.span6, .uneditable-input.span6 { - width: 560px; - } - input.span7, textarea.span7, .uneditable-input.span7 { - width: 660px; - } - input.span8, textarea.span8, .uneditable-input.span8 { - width: 760px; - } - input.span9, textarea.span9, .uneditable-input.span9 { - width: 860px; - } - input.span10, textarea.span10, .uneditable-input.span10 { - width: 960px; - } - input.span11, textarea.span11, .uneditable-input.span11 { - width: 1060px; - } - input.span12, textarea.span12, .uneditable-input.span12 { - width: 1160px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } -} diff --git a/docs/Saml2/css/bootstrap-responsive.min.css b/docs/Saml2/css/bootstrap-responsive.min.css deleted file mode 100644 index bc3f2ab7..00000000 --- a/docs/Saml2/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,3 +0,0 @@ - -.hidden{display:none;visibility:hidden;} -@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/docs/Saml2/css/bootstrap.css b/docs/Saml2/css/bootstrap.css deleted file mode 100644 index 563050c0..00000000 --- a/docs/Saml2/css/bootstrap.css +++ /dev/null @@ -1,3370 +0,0 @@ -/*! - * Bootstrap v2.0.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, canvas, video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, a:active { - outline: 0; -} -sub, sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - max-width: 100%; - height: auto; - border: 0; - -ms-interpolation-mode: bicubic; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} -a { - color: #0088cc; - text-decoration: none; -} -a:hover { - color: #005580; - text-decoration: underline; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, .row:after { - display: table; - content: ""; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.span1 { - width: 60px; -} -.span2 { - width: 140px; -} -.span3 { - width: 220px; -} -.span4 { - width: 300px; -} -.span5 { - width: 380px; -} -.span6 { - width: 460px; -} -.span7 { - width: 540px; -} -.span8 { - width: 620px; -} -.span9 { - width: 700px; -} -.span10 { - width: 780px; -} -.span11 { - width: 860px; -} -.span12, .container { - width: 940px; -} -.offset1 { - margin-left: 100px; -} -.offset2 { - margin-left: 180px; -} -.offset3 { - margin-left: 260px; -} -.offset4 { - margin-left: 340px; -} -.offset5 { - margin-left: 420px; -} -.offset6 { - margin-left: 500px; -} -.offset7 { - margin-left: 580px; -} -.offset8 { - margin-left: 660px; -} -.offset9 { - margin-left: 740px; -} -.offset10 { - margin-left: 820px; -} -.offset11 { - margin-left: 900px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, .row-fluid:after { - display: table; - content: ""; -} -.row-fluid:after { - clear: both; -} -.row-fluid > [class*="span"] { - float: left; - margin-left: 2.127659574%; -} -.row-fluid > [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .span1 { - width: 6.382978723%; -} -.row-fluid .span2 { - width: 14.89361702%; -} -.row-fluid .span3 { - width: 23.404255317%; -} -.row-fluid .span4 { - width: 31.914893614%; -} -.row-fluid .span5 { - width: 40.425531911%; -} -.row-fluid .span6 { - width: 48.93617020799999%; -} -.row-fluid .span7 { - width: 57.446808505%; -} -.row-fluid .span8 { - width: 65.95744680199999%; -} -.row-fluid .span9 { - width: 74.468085099%; -} -.row-fluid .span10 { - width: 82.97872339599999%; -} -.row-fluid .span11 { - width: 91.489361693%; -} -.row-fluid .span12 { - width: 99.99999998999999%; -} -.container { - width: 940px; - margin-left: auto; - margin-right: auto; - *zoom: 1; -} -.container:before, .container:after { - display: table; - content: ""; -} -.container:after { - clear: both; -} -.container-fluid { - padding-left: 20px; - padding-right: 20px; - *zoom: 1; -} -.container-fluid:before, .container-fluid:after { - display: table; - content: ""; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; -} -p small { - font-size: 11px; - color: #999999; -} -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-weight: bold; - color: #333333; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} -h1 { - font-size: 30px; - line-height: 36px; -} -h1 small { - font-size: 18px; -} -h2 { - font-size: 24px; - line-height: 36px; -} -h2 small { - font-size: 18px; -} -h3 { - line-height: 27px; - font-size: 18px; -} -h3 small { - font-size: 14px; -} -h4, h5, h6 { - line-height: 18px; -} -h4 { - font-size: 14px; -} -h4 small { - font-size: 12px; -} -h5 { - font-size: 12px; -} -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} -.page-header h1 { - line-height: 1; -} -ul, ol { - padding: 0; - margin: 0 0 9px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -ul { - list-style: disc; -} -ol { - list-style: decimal; -} -li { - line-height: 18px; -} -ul.unstyled { - margin-left: 0; - list-style: none; -} -dl { - margin-bottom: 18px; -} -dt, dd { - line-height: 18px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 9px; -} -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #ffffff; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -.muted { - color: #999999; -} -abbr { - font-size: 90%; - text-transform: uppercase; - border-bottom: 1px dotted #ddd; - cursor: help; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-left: 0; - padding-right: 15px; - border-left: 0; - border-right: 5px solid #eeeeee; -} -blockquote.pull-right p, blockquote.pull-right small { - text-align: right; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 18px; - line-height: 18px; - font-style: normal; -} -small { - font-size: 100%; -} -cite { - font-style: normal; -} -code, pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 3px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12px; - line-height: 18px; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - white-space: pre; - white-space: pre-wrap; - word-break: break-all; -} -pre.prettyprint { - margin-bottom: 18px; -} -pre code { - padding: 0; - background-color: transparent; -} -form { - margin: 0 0 18px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} -label, -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 18px; -} -label { - display: block; - margin-bottom: 5px; - color: #333333; -} -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; - border: 1px solid #ccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.uneditable-textarea { - width: auto; - height: auto; -} -label input, label textarea, label select { - display: block; -} -input[type="image"], input[type="checkbox"], input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - border: 0; - cursor: pointer; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -input[type="file"] { - padding: initial; - line-height: initial; - border: initial; - background-color: #ffffff; - background-color: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -input[type="button"], input[type="reset"], input[type="submit"] { - width: auto; - height: auto; -} -select, input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} -select { - width: 220px; - background-color: #ffffff; -} -select[multiple], select[size] { - height: auto; -} -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -textarea { - height: auto; -} -input[type="hidden"] { - display: none; -} -.radio, .checkbox { - padding-left: 18px; -} -.radio input[type="radio"], .checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, .controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, .checkbox.inline { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child { - padding-top: 0; -} -input, textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} -input:focus, textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - outline: 0; - outline: thin dotted \9; - /* IE6-8 */ - -} -input[type="file"]:focus, input[type="checkbox"]:focus, select:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input { - float: none; - margin-left: 0; -} -input.span1, textarea.span1, .uneditable-input.span1 { - width: 50px; -} -input.span2, textarea.span2, .uneditable-input.span2 { - width: 130px; -} -input.span3, textarea.span3, .uneditable-input.span3 { - width: 210px; -} -input.span4, textarea.span4, .uneditable-input.span4 { - width: 290px; -} -input.span5, textarea.span5, .uneditable-input.span5 { - width: 370px; -} -input.span6, textarea.span6, .uneditable-input.span6 { - width: 450px; -} -input.span7, textarea.span7, .uneditable-input.span7 { - width: 530px; -} -input.span8, textarea.span8, .uneditable-input.span8 { - width: 610px; -} -input.span9, textarea.span9, .uneditable-input.span9 { - width: 690px; -} -input.span10, textarea.span10, .uneditable-input.span10 { - width: 770px; -} -input.span11, textarea.span11, .uneditable-input.span11 { - width: 850px; -} -input.span12, textarea.span12, .uneditable-input.span12 { - width: 930px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #f5f5f5; - border-color: #ddd; - cursor: not-allowed; -} -.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning input, .control-group.warning select, .control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} -.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { - color: #b94a48; -} -.control-group.error input, .control-group.error select, .control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} -.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { - color: #468847; -} -.control-group.success input, .control-group.success select, .control-group.success textarea { - color: #468847; - border-color: #468847; -} -.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; -} -.uneditable-input { - display: block; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -:-moz-placeholder { - color: #999999; -} -::-webkit-input-placeholder { - color: #999999; -} -.help-block { - margin-top: 5px; - margin-bottom: 0; - color: #999999; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-bottom: 9px; - vertical-align: middle; - padding-left: 5px; -} -.input-prepend, .input-append { - margin-bottom: 5px; - *zoom: 1; -} -.input-prepend:before, -.input-append:before, -.input-prepend:after, -.input-append:after { - display: table; - content: ""; -} -.input-prepend:after, .input-append:after { - clear: both; -} -.input-prepend input, -.input-append input, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend input:focus, -.input-append input:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - position: relative; - z-index: 2; -} -.input-prepend .uneditable-input, .input-append .uneditable-input { - border-left-color: #ccc; -} -.input-prepend .add-on, .input-append .add-on { - float: left; - display: block; - width: auto; - min-width: 16px; - height: 18px; - margin-right: -1px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - color: #999999; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #f5f5f5; - border: 1px solid #ccc; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend .active, .input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on { - *margin-top: 1px; - /* IE6-7 */ - -} -.input-append input, .input-append .uneditable-input { - float: left; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append .uneditable-input { - border-right-color: #ccc; -} -.input-append .add-on { - margin-right: 0; - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:first-child { - *margin-left: -160px; -} -.input-append input:first-child + .add-on { - *margin-left: -21px; -} -.search-query { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input { - display: inline-block; - margin-bottom: 0; -} -.form-search label, -.form-inline label, -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - display: inline-block; -} -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on, -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on { - vertical-align: middle; -} -.control-group { - margin-bottom: 9px; -} -.form-horizontal legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} -.form-horizontal .control-group:before, .form-horizontal .control-group:after { - display: table; - content: ""; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-group > label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - margin-left: 160px; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -table { - max-width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 18px; -} -.table th, .table td { - padding: 8px; - line-height: 18px; - text-align: left; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; - vertical-align: bottom; -} -.table td { - vertical-align: top; -} -.table thead:first-child tr th, .table thead:first-child tr td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table-condensed th, .table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapsed; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th + th, -.table-bordered td + td, -.table-bordered th + td, -.table-bordered td + th { - border-left: 1px solid #ddd; -} -.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-radius: 4px 0 0 0; - -moz-border-radius: 4px 0 0 0; - border-radius: 4px 0 0 0; -} -.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-radius: 0 4px 0 0; - -moz-border-radius: 0 4px 0 0; - border-radius: 0 4px 0 0; -} -.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; -} -.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-radius: 0 0 4px 0; - -moz-border-radius: 0 0 4px 0; - border-radius: 0 0 4px 0; -} -.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -[class^="icon-"] { - display: inline-block; - width: 14px; - height: 14px; - vertical-align: text-top; - background-image: url(http://github.com/img/glyphicons-halflings.png); - background-position: 14px 14px; - background-repeat: no-repeat; - *margin-right: .3em; -} -[class^="icon-"]:last-child { - *margin-left: 0; -} -.icon-white { - background-image: url(http://github.com/img/glyphicons-halflings-white.png); -} -.icon-glass { - background-position: 0 0; -} -.icon-music { - background-position: -24px 0; -} -.icon-search { - background-position: -48px 0; -} -.icon-envelope { - background-position: -72px 0; -} -.icon-heart { - background-position: -96px 0; -} -.icon-star { - background-position: -120px 0; -} -.icon-star-empty { - background-position: -144px 0; -} -.icon-user { - background-position: -168px 0; -} -.icon-film { - background-position: -192px 0; -} -.icon-th-large { - background-position: -216px 0; -} -.icon-th { - background-position: -240px 0; -} -.icon-th-list { - background-position: -264px 0; -} -.icon-ok { - background-position: -288px 0; -} -.icon-remove { - background-position: -312px 0; -} -.icon-zoom-in { - background-position: -336px 0; -} -.icon-zoom-out { - background-position: -360px 0; -} -.icon-off { - background-position: -384px 0; -} -.icon-signal { - background-position: -408px 0; -} -.icon-cog { - background-position: -432px 0; -} -.icon-trash { - background-position: -456px 0; -} -.icon-home { - background-position: 0 -24px; -} -.icon-file { - background-position: -24px -24px; -} -.icon-time { - background-position: -48px -24px; -} -.icon-road { - background-position: -72px -24px; -} -.icon-download-alt { - background-position: -96px -24px; -} -.icon-download { - background-position: -120px -24px; -} -.icon-upload { - background-position: -144px -24px; -} -.icon-inbox { - background-position: -168px -24px; -} -.icon-play-circle { - background-position: -192px -24px; -} -.icon-repeat { - background-position: -216px -24px; -} -.icon-refresh { - background-position: -240px -24px; -} -.icon-list-alt { - background-position: -264px -24px; -} -.icon-lock { - background-position: -287px -24px; -} -.icon-flag { - background-position: -312px -24px; -} -.icon-headphones { - background-position: -336px -24px; -} -.icon-volume-off { - background-position: -360px -24px; -} -.icon-volume-down { - background-position: -384px -24px; -} -.icon-volume-up { - background-position: -408px -24px; -} -.icon-qrcode { - background-position: -432px -24px; -} -.icon-barcode { - background-position: -456px -24px; -} -.icon-tag { - background-position: 0 -48px; -} -.icon-tags { - background-position: -25px -48px; -} -.icon-book { - background-position: -48px -48px; -} -.icon-bookmark { - background-position: -72px -48px; -} -.icon-print { - background-position: -96px -48px; -} -.icon-camera { - background-position: -120px -48px; -} -.icon-font { - background-position: -144px -48px; -} -.icon-bold { - background-position: -167px -48px; -} -.icon-italic { - background-position: -192px -48px; -} -.icon-text-height { - background-position: -216px -48px; -} -.icon-text-width { - background-position: -240px -48px; -} -.icon-align-left { - background-position: -264px -48px; -} -.icon-align-center { - background-position: -288px -48px; -} -.icon-align-right { - background-position: -312px -48px; -} -.icon-align-justify { - background-position: -336px -48px; -} -.icon-list { - background-position: -360px -48px; -} -.icon-indent-left { - background-position: -384px -48px; -} -.icon-indent-right { - background-position: -408px -48px; -} -.icon-facetime-video { - background-position: -432px -48px; -} -.icon-picture { - background-position: -456px -48px; -} -.icon-pencil { - background-position: 0 -72px; -} -.icon-map-marker { - background-position: -24px -72px; -} -.icon-adjust { - background-position: -48px -72px; -} -.icon-tint { - background-position: -72px -72px; -} -.icon-edit { - background-position: -96px -72px; -} -.icon-share { - background-position: -120px -72px; -} -.icon-check { - background-position: -144px -72px; -} -.icon-move { - background-position: -168px -72px; -} -.icon-step-backward { - background-position: -192px -72px; -} -.icon-fast-backward { - background-position: -216px -72px; -} -.icon-backward { - background-position: -240px -72px; -} -.icon-play { - background-position: -264px -72px; -} -.icon-pause { - background-position: -288px -72px; -} -.icon-stop { - background-position: -312px -72px; -} -.icon-forward { - background-position: -336px -72px; -} -.icon-fast-forward { - background-position: -360px -72px; -} -.icon-step-forward { - background-position: -384px -72px; -} -.icon-eject { - background-position: -408px -72px; -} -.icon-chevron-left { - background-position: -432px -72px; -} -.icon-chevron-right { - background-position: -456px -72px; -} -.icon-plus-sign { - background-position: 0 -96px; -} -.icon-minus-sign { - background-position: -24px -96px; -} -.icon-remove-sign { - background-position: -48px -96px; -} -.icon-ok-sign { - background-position: -72px -96px; -} -.icon-question-sign { - background-position: -96px -96px; -} -.icon-info-sign { - background-position: -120px -96px; -} -.icon-screenshot { - background-position: -144px -96px; -} -.icon-remove-circle { - background-position: -168px -96px; -} -.icon-ok-circle { - background-position: -192px -96px; -} -.icon-ban-circle { - background-position: -216px -96px; -} -.icon-arrow-left { - background-position: -240px -96px; -} -.icon-arrow-right { - background-position: -264px -96px; -} -.icon-arrow-up { - background-position: -289px -96px; -} -.icon-arrow-down { - background-position: -312px -96px; -} -.icon-share-alt { - background-position: -336px -96px; -} -.icon-resize-full { - background-position: -360px -96px; -} -.icon-resize-small { - background-position: -384px -96px; -} -.icon-plus { - background-position: -408px -96px; -} -.icon-minus { - background-position: -433px -96px; -} -.icon-asterisk { - background-position: -456px -96px; -} -.icon-exclamation-sign { - background-position: 0 -120px; -} -.icon-gift { - background-position: -24px -120px; -} -.icon-leaf { - background-position: -48px -120px; -} -.icon-fire { - background-position: -72px -120px; -} -.icon-eye-open { - background-position: -96px -120px; -} -.icon-eye-close { - background-position: -120px -120px; -} -.icon-warning-sign { - background-position: -144px -120px; -} -.icon-plane { - background-position: -168px -120px; -} -.icon-calendar { - background-position: -192px -120px; -} -.icon-random { - background-position: -216px -120px; -} -.icon-comment { - background-position: -240px -120px; -} -.icon-magnet { - background-position: -264px -120px; -} -.icon-chevron-up { - background-position: -288px -120px; -} -.icon-chevron-down { - background-position: -313px -119px; -} -.icon-retweet { - background-position: -336px -120px; -} -.icon-shopping-cart { - background-position: -360px -120px; -} -.icon-folder-close { - background-position: -384px -120px; -} -.icon-folder-open { - background-position: -408px -120px; -} -.icon-resize-vertical { - background-position: -432px -119px; -} -.icon-resize-horizontal { - background-position: -456px -118px; -} -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, .open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - text-indent: -99999px; - *text-indent: 0; - vertical-align: top; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #000000; - opacity: 0.3; - filter: alpha(opacity=30); - content: "\2193"; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown:hover .caret, .open.dropdown .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - float: left; - display: none; - min-width: 160px; - max-width: 220px; - _width: 160px; - padding: 4px 0; - margin: 0; - list-style: none; - background-color: #ffffff; - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 1px; - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - *border-right-width: 2px; - *border-bottom-width: 2px; -} -.dropdown-menu.bottom-up { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -.dropdown-menu .divider { - height: 1px; - margin: 5px 1px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; - *width: 100%; - *margin: -5px 0 5px; -} -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #555555; - white-space: nowrap; -} -.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} -.dropdown.open { - *z-index: 1000; -} -.dropdown.open .dropdown-toggle { - color: #ffffff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} -.dropdown.open .dropdown-menu { - display: block; -} -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.fade { - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - opacity: 0; -} -.fade.in { - opacity: 1; -} -.collapse { - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; - position: relative; - overflow: hidden; - height: 0; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000000; - text-decoration: none; - opacity: 0.4; - filter: alpha(opacity=40); - cursor: pointer; -} -.btn { - display: inline-block; - padding: 4px 10px 4px; - font-size: 13px; - line-height: 18px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #fafafa; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-repeat: no-repeat; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - border: 1px solid #ccc; - border-bottom-color: #bbb; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - cursor: pointer; - *margin-left: .3em; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, .btn:active { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - color: rgba(0, 0, 0, 0.5); - outline: 0; -} -.btn.disabled, .btn[disabled] { - cursor: default; - background-image: none; - background-color: #e6e6e6; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-large .icon { - margin-top: 1px; -} -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} -.btn-small .icon { - margin-top: -1px; -} -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - color: #ffffff; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0044cc; -} -.btn-primary:active, .btn-primary.active { - background-color: #003399 \9; -} -.btn-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; -} -.btn-warning:active, .btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; -} -.btn-danger:active, .btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; -} -.btn-success:active, .btn-success.active { - background-color: #408140 \9; -} -.btn-info { - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; -} -.btn-info:active, .btn-info.active { - background-color: #24748c \9; -} -button.btn, input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} -button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.large, input[type="submit"].btn.large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.small, input[type="submit"].btn.small { - *padding-top: 3px; - *padding-bottom: 3px; -} -.btn-group { - position: relative; - *zoom: 1; - *margin-left: .3em; -} -.btn-group:before, .btn-group:after { - display: table; - content: ""; -} -.btn-group:after { - clear: both; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} -.btn-group .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group .btn:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.btn-group .btn:last-child, .btn-group .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.btn-group .btn.large:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 6px; - -moz-border-radius-topleft: 6px; - border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - border-bottom-left-radius: 6px; -} -.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - -moz-border-radius-topright: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-bottomright: 6px; - border-bottom-right-radius: 6px; -} -.btn-group .btn:hover, -.btn-group .btn:focus, -.btn-group .btn:active, -.btn-group .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group.open { - *z-index: 1000; -} -.btn-group.open .dropdown-menu { - display: block; - margin-top: 1px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.btn .caret { - margin-top: 7px; - margin-left: 0; -} -.btn:hover .caret, .open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.btn-primary .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret { - border-top-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} -.btn-small .caret { - margin-top: 4px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, .alert-heading { - color: #c09853; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success, .alert-success .alert-heading { - color: #468847; -} -.alert-danger, .alert-error { - background-color: #f2dede; - border-color: #eed3d7; -} -.alert-danger, -.alert-error, -.alert-danger .alert-heading, -.alert-error .alert-heading { - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info, .alert-info .alert-heading { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, .alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 18px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} -.nav-list { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; -} -.nav-list > li > a, .nav-list .nav-header { - display: block; - padding: 3px 15px; - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list .nav-header { - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-transform: uppercase; -} - -.nav-list .nav-header * { - text-transform:none; -} - -.nav-list > li + .nav-header { - margin-top: 9px; -} -.nav-list .active > a, .nav-list .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-tabs, .nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} -.nav-tabs:after, .nav-pills:after { - clear: both; -} -.nav-tabs > li, .nav-pills > li { - float: left; -} -.nav-tabs > li > a, .nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 9px; - padding-bottom: 9px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} -.nav-tabs > .active > a, .nav-tabs > .active > a:hover { - color: #555555; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills .active > a, .nav-pills .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { - margin-top: 1px; - border-width: 1px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { - border-top-color: #0088cc; - margin-top: 6px; -} -.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; -} -.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; -} -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} -.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { - border-top-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, .tabbable:after { - display: table; - content: ""; -} -.tabbable:after { - clear: both; -} -.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, .pill-content > .pill-pane { - display: none; -} -.tab-content > .active, .pill-content > .active { - display: block; -} -.tabs-below .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { - float: none; -} -.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} -.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} -.tabs-right .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} -.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} -.navbar { - overflow: visible; - margin-bottom: 18px; -} -.navbar-inner { - padding-left: 20px; - padding-right: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} -.btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} -.btn-navbar:hover, -.btn-navbar:active, -.btn-navbar.active, -.btn-navbar.disabled, -.btn-navbar[disabled] { - background-color: #222222; -} -.btn-navbar:active, .btn-navbar.active { - background-color: #080808 \9; -} -.btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.nav-collapse.collapse { - height: auto; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #ffffff; -} -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #999999; -} -.navbar .navbar-text a:hover { - color: #ffffff; - background-color: transparent; -} -.navbar .btn, .navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, .navbar-form:after { - display: table; - content: ""; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, .navbar-form select { - display: inline-block; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-form .radio, .navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - color: rgba(255, 255, 255, 0.75); - background: #666; - background: rgba(255, 255, 255, 0.3); - border: 1px solid #111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} -.navbar-search .search-query :-moz-placeholder { - color: #eeeeee; -} -.navbar-search .search-query::-webkit-input-placeholder { - color: #eeeeee; -} -.navbar-search .search-query:hover { - color: #ffffff; - background-color: #999999; - background-color: rgba(255, 255, 255, 0.5); -} -.navbar-search .search-query:focus, .navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} -.navbar-fixed-top .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - display: block; - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar .nav > li > a:hover { - background-color: transparent; - color: #ffffff; - text-decoration: none; -} -.navbar .nav .active > a, .navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; - background-color: rgba(0, 0, 0, 0.5); -} -.navbar .divider-vertical { - height: 40px; - width: 1px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} -.navbar .nav.pull-right { - margin-left: 10px; - margin-right: 0; -} -.navbar .dropdown-menu { - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.navbar .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { - border-top-color: #ffffff; -} -.navbar .nav .active .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { - background-color: transparent; -} -.navbar .nav .active > .dropdown-toggle:hover { - color: #ffffff; -} -.navbar .nav.pull-right .dropdown-menu { - left: auto; - right: 0; -} -.navbar .nav.pull-right .dropdown-menu:before { - left: auto; - right: 12px; -} -.navbar .nav.pull-right .dropdown-menu:after { - left: auto; - right: 13px; -} -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -.breadcrumb li { - display: inline; - text-shadow: 0 1px 0 #ffffff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} -.breadcrumb .active a { - color: #333333; -} -.pagination { - height: 36px; - margin: 18px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination li { - display: inline; -} -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination a:hover, .pagination .active a { - background-color: #f5f5f5; -} -.pagination .active a { - color: #999999; - cursor: default; -} -.pagination .disabled a, .pagination .disabled a:hover { - color: #999999; - background-color: transparent; - cursor: default; -} -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pager { - margin-left: 0; - margin-bottom: 18px; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, .pager:after { - display: table; - content: ""; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next a { - float: right; -} -.pager .previous a { - float: left; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2070; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, .modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - max-height: 500px; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -ms-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-body { - padding: 15px; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; - *zoom: 1; -} -.modal-footer:before, .modal-footer:after { - display: table; - content: ""; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn { - float: right; - margin-left: 5px; - margin-bottom: 0; -} -.tooltip { - position: absolute; - z-index: 1020; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -2px; -} -.tooltip.right { - margin-left: 2px; -} -.tooltip.bottom { - margin-top: 2px; -} -.tooltip.left { - margin-left: -2px; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} -.popover.top { - margin-top: -5px; -} -.popover.right { - margin-left: 5px; -} -.popover.bottom { - margin-top: 5px; -} -.popover.left { - margin-left: -5px; -} -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} -.popover-inner { - padding: 3px; - width: 280px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.popover-content p, .popover-content ul, .popover-content ol { - margin-bottom: 0; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, .thumbnails:after { - display: table; - content: ""; -} -.thumbnails:after { - clear: both; -} -.thumbnails > li { - float: left; - margin: 0 0 18px 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; -} -.label { - padding: 1px 3px 2px; - font-size: 9.75px; - font-weight: bold; - color: #ffffff; - text-transform: uppercase; - background-color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.label-important { - background-color: #b94a48; -} -.label-warning { - background-color: #f89406; -} -.label-success { - background-color: #468847; -} -.label-info { - background-color: #3a87ad; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -.progress { - overflow: hidden; - height: 18px; - margin-bottom: 18px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 18px; - color: #ffffff; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 18px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel .item > img { - display: block; - line-height: 1; -} -.carousel .active, .carousel .next, .carousel .prev { - display: block; -} -.carousel .active { - left: 0; -} -.carousel .next, .carousel .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel .next { - left: 100%; -} -.carousel .prev { - left: -100%; -} -.carousel .next.left, .carousel .prev.right { - left: 0; -} -.carousel .active.left { - left: -100%; -} -.carousel .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, .carousel-caption p { - color: #ffffff; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #f5f5f5; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; -} -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} diff --git a/docs/Saml2/css/bootstrap.min.css b/docs/Saml2/css/bootstrap.min.css deleted file mode 100644 index d5221249..00000000 --- a/docs/Saml2/css/bootstrap.min.css +++ /dev/null @@ -1,611 +0,0 @@ -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} -input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} -.row:after{clear:both;} -[class*="span"]{float:left;margin-left:20px;} -.span1{width:60px;} -.span2{width:140px;} -.span3{width:220px;} -.span4{width:300px;} -.span5{width:380px;} -.span6{width:460px;} -.span7{width:540px;} -.span8{width:620px;} -.span9{width:700px;} -.span10{width:780px;} -.span11{width:860px;} -.span12,.container{width:940px;} -.offset1{margin-left:100px;} -.offset2{margin-left:180px;} -.offset3{margin-left:260px;} -.offset4{margin-left:340px;} -.offset5{margin-left:420px;} -.offset6{margin-left:500px;} -.offset7{margin-left:580px;} -.offset8{margin-left:660px;} -.offset9{margin-left:740px;} -.offset10{margin-left:820px;} -.offset11{margin-left:900px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} -.row-fluid:after{clear:both;} -.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} -.row-fluid>[class*="span"]:first-child{margin-left:0;} -.row-fluid .span1{width:6.382978723%;} -.row-fluid .span2{width:14.89361702%;} -.row-fluid .span3{width:23.404255317%;} -.row-fluid .span4{width:31.914893614%;} -.row-fluid .span5{width:40.425531911%;} -.row-fluid .span6{width:48.93617020799999%;} -.row-fluid .span7{width:57.446808505%;} -.row-fluid .span8{width:65.95744680199999%;} -.row-fluid .span9{width:74.468085099%;} -.row-fluid .span10{width:82.97872339599999%;} -.row-fluid .span11{width:91.489361693%;} -.row-fluid .span12{width:99.99999998999999%;} -.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} -.container:after{clear:both;} -.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} -.container-fluid:after{clear:both;} -p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} -.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} -h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} -h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} -h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} -h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} -h4,h5,h6{line-height:18px;} -h4{font-size:14px;}h4 small{font-size:12px;} -h5{font-size:12px;} -h6{font-size:11px;color:#999999;text-transform:uppercase;} -.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} -.page-header h1{line-height:1;} -ul,ol{padding:0;margin:0 0 9px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -ul{list-style:disc;} -ol{list-style:decimal;} -li{line-height:18px;} -ul.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:18px;} -dt,dd{line-height:18px;} -dt{font-weight:bold;} -dd{margin-left:9px;} -hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} -strong{font-weight:bold;} -em{font-style:italic;} -.muted{color:#999999;} -abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} -blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} -blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} -small{font-size:100%;} -cite{font-style:normal;} -code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} -pre code{padding:0;background-color:transparent;} -form{margin:0 0 18px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} -label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} -label{display:block;margin-bottom:5px;color:#333333;} -input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.uneditable-textarea{width:auto;height:auto;} -label input,label textarea,label select{display:block;} -input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} -select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} -select{width:220px;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -textarea{height:auto;} -input[type="hidden"]{display:none;} -.radio,.checkbox{padding-left:18px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} -input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} -input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} -input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} -input.span1,textarea.span1,.uneditable-input.span1{width:50px;} -input.span2,textarea.span2,.uneditable-input.span2{width:130px;} -input.span3,textarea.span3,.uneditable-input.span3{width:210px;} -input.span4,textarea.span4,.uneditable-input.span4{width:290px;} -input.span5,textarea.span5,.uneditable-input.span5{width:370px;} -input.span6,textarea.span6,.uneditable-input.span6{width:450px;} -input.span7,textarea.span7,.uneditable-input.span7{width:530px;} -input.span8,textarea.span8,.uneditable-input.span8{width:610px;} -input.span9,textarea.span9,.uneditable-input.span9{width:690px;} -input.span10,textarea.span10,.uneditable-input.span10{width:770px;} -input.span11,textarea.span11,.uneditable-input.span11{width:850px;} -input.span12,textarea.span12,.uneditable-input.span12{width:930px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} -.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -:-moz-placeholder{color:#999999;} -::-webkit-input-placeholder{color:#999999;} -.help-block{margin-top:5px;margin-bottom:0;color:#999999;} -.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} -.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} -.input-prepend:after,.input-append:after{clear:both;} -.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} -.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} -.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on{*margin-top:1px;} -.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-append .uneditable-input{border-right-color:#ccc;} -.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} -.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} -.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} -.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} -.control-group{margin-bottom:9px;} -.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} -.form-horizontal .controls{margin-left:160px;} -.form-horizontal .form-actions{padding-left:160px;} -table{max-width:100%;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} -.table th{font-weight:bold;vertical-align:bottom;} -.table td{vertical-align:top;} -.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} -.table tbody+tbody{border-top:2px solid #ddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} -.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} -.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} -table .span1{float:none;width:44px;margin-left:0;} -table .span2{float:none;width:124px;margin-left:0;} -table .span3{float:none;width:204px;margin-left:0;} -table .span4{float:none;width:284px;margin-left:0;} -table .span5{float:none;width:364px;margin-left:0;} -table .span6{float:none;width:444px;margin-left:0;} -table .span7{float:none;width:524px;margin-left:0;} -table .span8{float:none;width:604px;margin-left:0;} -table .span9{float:none;width:684px;margin-left:0;} -table .span10{float:none;width:764px;margin-left:0;} -table .span11{float:none;width:844px;margin-left:0;} -table .span12{float:none;width:924px;margin-left:0;} -[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(http://github.com/img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} -.icon-white{background-image:url(http://github.com/img/glyphicons-halflings-white.png);} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} -.dropdown .caret{margin-top:8px;margin-left:2px;} -.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} -.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} -.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} -.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} -.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} -.dropdown.open .dropdown-menu{display:block;} -.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} -.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} -.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} -.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} -.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} -.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-large .icon{margin-top:1px;} -.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} -.btn-small .icon{margin-top:-1px;} -.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} -.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} -button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} -.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} -.btn-group:after{clear:both;} -.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} -.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} -.btn .caret{margin-top:7px;margin-left:0;} -.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} -.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} -.btn-small .caret{margin-top:4px;} -.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.alert,.alert-heading{color:#c09853;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} -.alert-success,.alert-success .alert-heading{color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} -.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;} -.alert-info,.alert-info .alert-heading{color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -.nav{margin-left:0;margin-bottom:18px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} -.nav-list .nav-header *{text-transform:none;} -.nav-list>li+.nav-header{margin-top:9px;} -.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list [class^="icon-"]{margin-right:2px;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} -.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} -.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} -.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} -.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} -.tabbable:after{clear:both;} -.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below .nav-tabs{border-top:1px solid #ddd;} -.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} -.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.navbar{overflow:visible;margin-bottom:18px;} -.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} -.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} -.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} -.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.nav-collapse.collapse{height:auto;} -.navbar .brand:hover{text-decoration:none;} -.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} -.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} -.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} -.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} -.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} -.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} -.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;} -.navbar .nav>li{display:block;float:left;} -.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} -.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} -.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} -.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} -.navbar .nav.pull-right{margin-left:10px;margin-right:0;} -.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} -.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} -.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} -.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} -.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} -.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} -.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} -.breadcrumb .divider{padding:0 5px;color:#999999;} -.breadcrumb .active a{color:#333333;} -.pagination{height:36px;margin:18px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination li{display:inline;} -.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} -.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} -.pagination .active a{color:#999999;cursor:default;} -.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager a:hover{text-decoration:none;background-color:#f5f5f5;} -.pager .next a{float:right;} -.pager .previous a{float:left;} -.modal-open .dropdown-menu{z-index:2050;} -.modal-open .dropdown.open{*z-index:2050;} -.modal-open .popover{z-index:2060;} -.modal-open .tooltip{z-index:2070;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} -.modal.fade.in{top:50%;} -.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-body{padding:15px;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} -.modal-footer:after{clear:both;} -.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} -.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-2px;} -.tooltip.right{margin-left:2px;} -.tooltip.bottom{margin-top:2px;} -.tooltip.left{margin-left:-2px;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} -.popover.right{margin-left:5px;} -.popover.bottom{margin-top:5px;} -.popover.left{margin-left:-5px;} -.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.popover .arrow{position:absolute;width:0;height:0;} -.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} -.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} -.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} -.thumbnails:after{clear:both;} -.thumbnails>li{float:left;margin:0 0 18px 20px;} -.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;} -.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.label-important{background-color:#b94a48;} -.label-warning{background-color:#f89406;} -.label-success{background-color:#468847;} -.label-info{background-color:#3a87ad;} -@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} -.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} -.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} -.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} -.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.accordion{margin-bottom:18px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} -.carousel{position:relative;margin-bottom:18px;line-height:1;} -.carousel-inner{overflow:hidden;width:100%;position:relative;} -.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} -.carousel .item>img{display:block;line-height:1;} -.carousel .active,.carousel .next,.carousel .prev{display:block;} -.carousel .active{left:0;} -.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} -.carousel .next{left:100%;} -.carousel .prev{left:-100%;} -.carousel .next.left,.carousel .prev.right{left:0;} -.carousel .active.left{left:-100%;} -.carousel .active.right{left:100%;} -.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} -.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} -.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} -.carousel-caption h4,.carousel-caption p{color:#ffffff;} -.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} -.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} diff --git a/docs/Saml2/css/jquery.iviewer.css b/docs/Saml2/css/jquery.iviewer.css deleted file mode 100644 index d68c6422..00000000 --- a/docs/Saml2/css/jquery.iviewer.css +++ /dev/null @@ -1,91 +0,0 @@ -.iviewer_common { - position:absolute; - bottom:10px; - border: 1px solid #000; - height: 28px; - z-index: 5000; -} - -.iviewer_cursor { - cursor: url(http://github.com/img/iviewer/hand.cur) 6 8, pointer; -} - -.iviewer_drag_cursor { - cursor: url(http://github.com/img/iviewer/grab.cur) 6 8, pointer; -} - -.iviewer_button { - width: 28px; - cursor: pointer; - background-position: center center; - background-repeat: no-repeat; -} - -.iviewer_zoom_in { - left: 20px; - background: url(http://github.com/img/iviewer/iviewer.zoom_in.png); -} - -.iviewer_zoom_out { - left: 55px; - background: url(http://github.com/img/iviewer/iviewer.zoom_out.png); -} - -.iviewer_zoom_zero { - left: 90px; - background: url(http://github.com/img/iviewer/iviewer.zoom_zero.png); -} - -.iviewer_zoom_fit { - left: 125px; - background: url(http://github.com/img/iviewer/iviewer.zoom_fit.png); -} - -.iviewer_zoom_status { - left: 160px; - font: 1em/28px Sans; - color: #000; - background-color: #fff; - text-align: center; - width: 60px; -} - -.iviewer_rotate_left { - left: 227px; - background: #fff url(http://github.com/img/iviewer/iviewer.rotate_left.png) center center no-repeat; -} - -.iviewer_rotate_right { - left: 262px; - background: #fff url(http://github.com/img/iviewer/iviewer.rotate_right.png) center center no-repeat; -} - -.viewer -{ - width: 100%; - height: 500px; - position: relative; - background: transparent url('http://github.com/img/loader.gif') no-repeat center center; -} - -.viewer img -{ - max-width: none; -} - -.wrapper -{ - overflow: hidden; -} - -.iviewer_common -{ - border: 0; - bottom: auto; - top: 10px; -} - -.iviewer_zoom_status -{ - border: 1px solid black; -} diff --git a/docs/Saml2/css/prettify.css b/docs/Saml2/css/prettify.css deleted file mode 100644 index d44b3a22..00000000 --- a/docs/Saml2/css/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/docs/Saml2/css/template.css b/docs/Saml2/css/template.css deleted file mode 100644 index 45d61967..00000000 --- a/docs/Saml2/css/template.css +++ /dev/null @@ -1,527 +0,0 @@ -@import url(http://github.com/bootstrap.min.css); -@import url(http://github.com/bootstrap-responsive.css); -@import url(http://github.com/prettify.css); -@import url(http://github.com/jquery.iviewer.css); -@import url(http://fonts.googleapis.com/css?family=Forum); - -body -{ - padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ - background: #f9f9f9; - color: #444; -} - -a -{ - color: #55A72F; -} - -td p:last-of-type { - margin: 0; -} - -li.l0, li.l1, li.l2, li.l3, li.l5, li.l6, li.l7, li.l8 -{ - list-style-type: decimal; -} - -a.brand, h2, .hero-unit h1 -{ - font-family: 'Forum', "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -.element .span4 -{ - width: 275px; -} - -.namespace-contents hr, .package-contents hr -{ - border-top: 3px dotted silver; -} - -.namespace-indent, .package-indent -{ - padding-left: 10px; border-left: 1px dashed #f0f0f0; -} - -.element h3 i, .namespace-contents h3 i, .package-contents h3 i -{ - margin-top: 2px; - margin-right: 5px; -} - -.element h3, .namespace-contents h3, .package-contents h3 -{ - margin-top: 25px; - margin-bottom: 20px; - border-bottom: 1px solid silver; -} - -.element h3:first-of-type, .namespace-contents h3:first-of-type, -.package-contents h3:first-of-type -{ - margin-top: 30px; -} - -.element h2 -{ - font-family: inherit; - font-size: 1.2em; - color: black; -} - -.element .type -{ - font-weight: bold; -} - -#search-query -{ - height: auto; -} - -.hero-unit, div.element, .well -{ - border: 1px solid #e0e0e0; - background: white; -} - -.dropdown-menu a{ - overflow: hidden; - text-overflow: ellipsis; -} -h2 -{ - border-bottom: 1px dashed #55A72F; - margin-bottom: 10px; - padding-bottom: 0; - padding-left: 5px; - color: #e9e9e9; - font-weight: normal; - margin-top: 40px; -} - -h2:first-of-type -{ - margin-top: 0; -} - -.hero-unit -{ - background: #75a70d; /* Old browsers */ - background: -moz-radial-gradient(center, ellipse cover, #bfd255 0%, #8eb92a 72%, #72aa00 96%, #9ecb2d 100%); /* FF3.6+ */ - background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#bfd255), color-stop(72%,#8eb92a), color-stop(96%,#72aa00), color-stop(100%,#9ecb2d)); /* Chrome,Safari4+ */ - background: -webkit-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Chrome10+,Safari5.1+ */ - background: -o-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Opera 12+ */ - background: -ms-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* IE10+ */ - background: radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bfd255', endColorstr='#9ecb2d',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ - - padding: 40px 0 15px 0; - box-shadow: inset 0 0 10px gray; -} - -.hero-unit h1 -{ - font-weight: normal; - text-align: center; - color: white; - text-shadow: black 0 0 15px; -} - -.hero-unit h2 -{ - border: none; - color: white; - background: rgba(48, 48, 48, 0.5); - padding: 0; - margin: 0; - margin-top: 15px; - text-align: center; -} - -.namespace-contents h2, .package-contents h2 -{ - padding-left: 44px; - background: transparent url('http://github.com/img/icons/icon-th-big.png') no-repeat 3px center; -} - -.package-contents h2 -{ - background-image: url('http://github.com/img/icons/icon-folder-open-big.png'); -} - -.namespace-contents .element h2, .package-contents .element h2 -{ - padding-left: 0; - background: none; -} - -div.element -{ - border-left: 10px solid #55A72F; - border-radius: 5px; - padding: 7px 7px 2px 7px; - margin-bottom: 15px; - margin-left: 0; -} - -div.element.protected -{ - border-left-color: orange; -} - -div.element.private -{ - border-left-color: red; -} - -div.element.class, div.element.interface -{ - border-left-color: #e0e0e0; -} - -div.element.class.abstract h1, div.element.interface.abstract h1 -{ - font-style: italic; -} - -div.element h1 -{ - font-size: 1.2em; - line-height: 1.5em; - margin-bottom: 10px; - padding-left: 22px; - background: transparent no-repeat left 2px; - word-wrap: break-word; -} - -div.element h1 a -{ - color: transparent; - margin-left: 10px; -} - -div.element h1:hover a -{ - color: silver; -} - -div.element h1 a:hover -{ - color: navy; -} - -div.element a.more:hover -{ - background: #f0f0f0; - color: #444; - text-decoration: none; -} - -div.element a.more -{ - font-weight: bold; - text-align: center; - color: gray; - border-top: 1px dashed silver; - display: block; - margin-top: 5px; - padding: 5px 0; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; -} - -div.element p -{ - font-size: 0.9em; -} - -div.element .table -{ - font-size: 0.9em; -} - -div.element .table th -{ - text-transform: capitalize; -} - -div.detail-description -{ - padding-left: 30px; -} - -div.detail-description table th { - vertical-align: top; -} - -body.invert -{ - background: white; -} - -body.invert div.element -{ - background: #f9f9f9; -} - -ul.side-nav -{ - clear: both; -} - -ul.side-nav li -{ - word-wrap: break-word; - padding-left: 10px; - text-indent: -10px; -} - -ul.side-nav li a -{ - background: transparent no-repeat 5px 3px; - padding-bottom: 10px; - font-style: italic; -} - -ul.side-nav li pre -{ - font-size: 0.8em; - margin: 5px 15px 0 15px; - padding: 2px 5px; - background-color: #f8f8f8; - color: gray; - font-style: normal; - word-wrap: break-word; - text-indent: 0; -} - -ul.side-nav li.view-simple span.description -{ - display: none; -} - -ul.side-nav li.view-simple pre -{ - font-size: inherit; - margin: inherit; - padding: inherit; - background-color: inherit; - border: none; - color: inherit; - font-family: inherit; - font-style: inherit; - padding-bottom: 0; - padding-left: 5px; -} - -ul.side-nav li.view-simple a -{ - padding-bottom: 0; -} - -i.icon-custom -{ - width: 16px; - height: 16px; - background-position: 0; -} - -.table.markers -{ - background: white; -} - -/* JS only functionality; disable by default */ -.btn-group.visibility, .btn-group.view, .btn-group.type-filter -{ - display: none; -} - -.visibility button -{ - height: 24px; -} - -div.element.constant h1, -i.icon-constant { background-image: url('http://github.com/img/icons/constant.png'); } - -div.element.function h1, -i.icon-function { background-image: url('http://github.com/img/icons/function.png'); } - -div.element.method h1, -i.icon-method { background-image: url('http://github.com/img/icons/method.png'); } - -div.element.class h1, -i.icon-class { background-image: url('http://github.com/img/icons/class.png'); } - -div.element.interface h1, -i.icon-interface { background-image: url('http://github.com/img/icons/interface.png'); } - -div.element.property h1, -i.icon-property { background-image: url('http://github.com/img/icons/property.png'); } - -span.empty-namespace -{ - color: silver; -} - -footer -{ - text-align: right; - font-size: 0.8em; - opacity: 0.5; -} - -#mapHolder -{ - border: 4px solid #555; - padding: 0 !important; - overflow: hidden -} - -div.element div.subelement -{ - margin-left: 10px; - padding-bottom: 5px; - clear: both; -} - -pre code -{ - border: none; -} - -div.element div.subelement > code -{ - font-size: 0.8em; - float: left; - margin-right: 10px; - padding: 0 5px; - line-height: 16px; -} - -div.element div.subelement > p -{ - margin-left: 20px; - margin-right: 50px; -} - -div.element div.subelement h4 -{ - color: #666; - margin-bottom: 5px; -} - -div.element div.subelement.response -{ - padding-bottom: 15px; - margin-right: 50px; -} - -div.labels -{ - text-align: right; -} - -.nav-list .nav-header -{ - font-size: 13px; -} - -.nav-list .nav-header .side-nav-header -{ - font-weight: bold; - line-height: 18px; - color: #999999; - text-transform: uppercase; -} - -.detail-description code { - white-space: pre; - display: inline-block; - padding: 10px; -} - -.go_to_top -{ - float: right; - margin-right: 20px; - background: #2C2C2C; - color: #999; - padding: 3px 10px; - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - line-height: 19px; -} - -.visibility .btn { - text-transform: uppercase; - font-size: 0.7em; - font-weight: bold; -} - -.iviewer_common -{ - z-index: 100; -} - -@media (min-width: 980px) -{ - a[name] - { - margin-top: -50px; - position: absolute; - } -} - -@media (min-width: 1200px) -{ - .method .span4 - { - width: 345px; - } -} - -/* redefined because twitter bootstrap assumes that bootstrap-responsive.css */ -@media (max-width: 980px) -{ - body - { - padding-top: 0; - } - - .go_to_top - { - display: none; - } - - .btn-group.visibility - { - font-size: 0.80em; - margin-bottom: 7px; - display: inline-block; - float: right; - } -} - -@media (max-width: 768px) -{ - .hero-unit h1 { - font-size: 30px; - } - .hero-unit h2 { - font-size: 19px; - } - -} -@media (min-width: 768px) and (max-width: 980px) -{ - .method .span4 - { - width: 203px; - } -} diff --git a/docs/Saml2/graph_class.html b/docs/Saml2/graph_class.html deleted file mode 100644 index edcc5d84..00000000 --- a/docs/Saml2/graph_class.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - SAML PHP Toolkit - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
-
-
-
-
-
- - - -
- - - - diff --git a/docs/Saml2/img/apple-touch-icon-114x114.png b/docs/Saml2/img/apple-touch-icon-114x114.png deleted file mode 100644 index 1506f6a668fbb2837c06b561895da248c310ac53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28338 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�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 diff --git a/docs/Saml2/img/apple-touch-icon.png b/docs/Saml2/img/apple-touch-icon.png deleted file mode 100644 index 2d320cb5e1215894ef37cf8c6fd7a0085eba06f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8358 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 LNHCv2rc(U_{c|km diff --git a/docs/Saml2/img/glyphicons-halflings-white.png b/docs/Saml2/img/glyphicons-halflings-white.png deleted file mode 100644 index a20760bfde58d1c92cee95116059fba03c68d689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4352 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 diff --git a/docs/Saml2/img/icons/arrow_down.png b/docs/Saml2/img/icons/arrow_down.png deleted file mode 100644 index 61505adc46d8fa4156d9b31831ebe6770f0e2757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmV-k0-^nhP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qcLRmoAwA00G`fL_t(I%cWC2tJ+``e%^eL7t$KUBw$9t*+0;sKcG;!o#ftvQ=v=O zPEznkbn((fBwn}RP@zy12dlPS%uu3(Akjdnjb!m7Z{AKf?FH|p;Io_q=Wq_^JkLWo z=Qsxf&cxXRNV#0TVT@UX5OB_sBngrvNpr^7o%nCPR4T2dTrT%m)3hhWViEKC9B~|j zF^1#uh$Kmn&1OL6a}1fD2f7I*U{_szDuTQUi!ZOqfjWA01!nH;yA``w*%)K zs;Yug3Q-h6DTN>iAcUaZZvWhDHqV4=wffsM&FACsIL_zuX_G9=kR&O+_4XuD6w&YZ zlPHQVyWQ?u0DxMp_GP_Z-y9AHSe6Azl0XPax7|XPWh@p8ESJmcPN(zf4hxRsTn&fA zuar{gx(-1QAP9d+5=9YV7-BM+jB~l%>ytFDR;#zJ>#hvLKqiw(w{yPNyJ*ytHlGe^5w{<6H+p@P5DF!?G;MvWzec z5d^`9X0!S6zm#a(_8ZrA2b!kAG);J(_suYjSEqWV`y{Gq+Kbt2=5Dv!N1CQx)a!M2 sQpyjxu~Ml#WsK2AqtU(B3+LMT58IsRj2DXS7XSbN07*qoM6N<$f?9MBJpcdz diff --git a/docs/Saml2/img/icons/arrow_right.png b/docs/Saml2/img/icons/arrow_right.png deleted file mode 100644 index 60c5927ebf63f388b45315cbc4cc56a77b9f903c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qT;gv2%z300Hz#L_t(I%axPMt5Q)EhkyI*EgldQ%_FEFNFoiwK|$ce2O<`vO%-#J z*f5+m4E!U)pbO5VW@l24A`$5(O~gT>V;_X?vwa*%Pb1@|_l9>(HfyjxzP0vRMAI}J zBA?HH1aP2?dagoht>5TwNDO6R(YPG_8y~cXI2Im}{b9lX8_ zilTha<#MhY4K|w%7K;TIiv<)#fubnjoMSSXfKrNJF!)f@w4a$w<}m=UV}t2*irH)i z#ux-a_&XQ9UJr-E0ZJ)MCKDfz$D3;n4h4so5CWso2)Ek}0I1jNHC0vbmrA9tCkBKN z=yW=Wq6k3{z!-zoYK0_8=yW=};c)o2TrR)5TEmVFD5YSGK@>$e91e)0h*qoB@AZ0b zWLbWH{Ea67#u&_IGwgOdw%aYL)#{IazyG>ct9`j{4^CR}cs$tcc4#yjzXyZC2U(V% z|8JH50ce_rZnulkX!Ofwvpp*oi2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4`J+jIM*dB6Xqg)}~| zJoCIb=eAt%N2Sc0*LR=)Gr>jXc+U1{2EKOY&`?3wi#H~`UdZcts5G`~(Smi^VXH-t zNnA2H`u*=l#_~yWzkbC{@|eWZU~_(X%TKE^b)f2_P*>quOSp`{Hl;21nz{an^LB{Ts5!Fr;& diff --git a/docs/Saml2/img/icons/constant.png b/docs/Saml2/img/icons/constant.png deleted file mode 100644 index f5f180d5a9b09a19b5ae44ad64a1fdceb6a86d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmVrl1?U*0YQ8KBh3^hnN3W5 z2%|~HXz55n-@#z_4GhF=O%)o!1~F5NWx9pcZ;~F+?Pl3!f;~`hPjKs2om2M?&}Yi{ z)a|hNOZ<{ll;no}Bk)fO?j?Pd^dsz_V-;AIg>Bmyh7qUYr=-X5?0(D-NtDZF=JPoK zm&=9SZbzX|h$DHpwjoI*lSww44g39`Mx%jgn$+ucGMNm9VNk2pa2$tryNzwzJxRTg z;8l{SR;vIEhr`H=-EJ4(_i-GD)oR6Jv3R?-aYHZ~jUoig<&w!{f+RYf4giC};OT}S zkx1Zq9*4t$R;z_&Su~qXve_)-@tE~`O*);X-|ureoq}Sq`0d7mBub?cv)PRE`3%5z zyCt8`Q>j##PN(?3kLP)~uKN-h;x$auB$vxYtfW$@*foCnJuN{HCvYhz#zuJz@P!dKp~(AL>x#lFaYJy!Tsagqt+F;zg(Vd_Ma3C z(nGFZm^~mf*5 z)sz1pn_UOj3v?y|2J0zg2h4lZXZ~Oq6V)2(>o0PAi0Mp zcm2O}aQ*+4X;%Lqp4$EY_?&u@^n?8R{_$;a_<;NZ^2eq1Gykv3ut72B2M+tMZ(scX z!_&L}cQnO<)vrjkgy>B%C#)Z+=I#Bf|8MMChN2ecXJi`Peo$P2?0#|mG=^J|^}*N= zPwo1DaqZOq$7k37KfSmE=*JoV_w{7|UykNZn0k89t1|6?Zs{cGcU*1(=|3{P60d%I dd2d6B_y4`!nK<=Rk_TaW8yL|`1mgK1y#VW>cs>9C diff --git a/docs/Saml2/img/icons/file-php.png b/docs/Saml2/img/icons/file-php.png deleted file mode 100644 index c323f09f66241a28d61f1d2c8e90be0a68126bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4017 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 L;uWgGz+epk&R;19 diff --git a/docs/Saml2/img/icons/folder.gif b/docs/Saml2/img/icons/folder.gif deleted file mode 100644 index 2b31631ca2bfec3a8afb1bfdd4f8ed4c5bcc3a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmZ?wbhEHb6ky=hKW2GJ7 I#Kd3?0MGg2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4c?q7?3B2Xp1x8ImHETXz54QVYrPgqHx8=(z e>Gl76{l!*pI92y$_dTH37(8A5T-G@yGywo6mxkK_ diff --git a/docs/Saml2/img/icons/icon-folder-open-big.png b/docs/Saml2/img/icons/icon-folder-open-big.png deleted file mode 100644 index fae384ef4df761b2d6cc250ed5787e430ae91663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^azHG`!3HF+C+nOCQtLfk978H@y`6TEw^f11_3i;d ziGzYN2L&Zg3QDws(66dq&SgShn{Thb{zRo^(j5Lg&dD7z8Ed<2HaxncvF_0qB|qh( zD^{Iwcon{}=b8RLEj=%X$?owoQ+czMDqpDz@out+{J4%~%}Jdw83lFk?!Av|@026WQIOdE8_{3R(~E4X}F}*cK0{Nlc(N@tWx{N75ZIyLFkD`ce?_+omU+4eIu&X fef&+H?MME!>ysALYPH`1I-SAO)z4*}Q$iB}E$LkN diff --git a/docs/Saml2/img/icons/icon-th-big.png b/docs/Saml2/img/icons/icon-th-big.png deleted file mode 100644 index 04b0ad872a98de63bc0e300e627ce69a2a209471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fhMq2tAr-gYPBH{4<6!#zfBD*P z%ML8Ga1?(i);mdUy45w?2d5KGCQHxw$nZHi?xXOW{3u1P>qQzNK+O!Eu6{1-oD!M< D6}BRE diff --git a/docs/Saml2/img/icons/icon_template.svg b/docs/Saml2/img/icons/icon_template.svg deleted file mode 100644 index b0428aa4..00000000 --- a/docs/Saml2/img/icons/icon_template.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - Co - - diff --git a/docs/Saml2/img/icons/interface.png b/docs/Saml2/img/icons/interface.png deleted file mode 100644 index 51a3a1762db628e8cbbfb4d933a74b4d962d2d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR40E|;Z~{{z_~j>MQR++0q{n_jdZ_~Xzv)82ln zir1^4FSoop)7kP4q||D^oYExqqT%4L-+qnX2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4|3mlps%(3Z75trJZsonk=m!SRtUbjIcd*Gd{GD-MU&5kK`Fd$; z&qe*M;R)u)+B55zu54SYqS>Xy$aOeCxaR(R@13(xM|fE^lFf7PnUNSzTjBx@u1_}0S82W4^{;r-{cRJTTl!v}kb2YK z*1sl?dBGmby>EB*DR3}+u*rYhnEoKO=X=4viDB0(R!$ZFviy;n_U!uqz48-dSM>2+ S-W3cC0R~T3KbLh*2~7ZLUYG9x diff --git a/docs/Saml2/img/icons/ok.png b/docs/Saml2/img/icons/ok.png deleted file mode 100644 index 39f287ab19b8bcdc156ea56355a95290d04f0ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3685 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 AIsgCw diff --git a/docs/Saml2/img/icons/search.gif b/docs/Saml2/img/icons/search.gif deleted file mode 100644 index eef46fc9ee10547bfa2da348f81b4c83f19e65a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmZ?wbhEHb6krfw*v!MQVZ+APuU|iW_~^rj4_mixJ96acuV25;ojZ5^`i(nx?(W*P zd;k6e|NsAIfC0syEQ|~cJPbM@0gxFCEUptydamAU5nbG%&zz z##7bH4$=1vId^*V*v!xR>*{?7mqKrCnmdg!}G z=IXm8Sn&!;akH?purU1n%JB2k%b%|wU4DOV*XpD9FQ1(YRJQ}B0U&^o4e)SH>*-Ur zh)`kY;$&s`_k)2EsF{J8m4Sm#kV96(KvF=6-{ZWnu*|swyBJ`G00a;d%-Q;G(RnJC zk*X~0{H%Zf{A2k0_b@F4v6je+t14+fASCR#!a*Y7?B`u`upwYzT_j5PRxk@1k>@6WFcf574M53UU$ zfM5nZ{PpG4FOc(@{(fdKQRiUz`t=9HgNKh8zJB|~V5B3;@aO9@i00pa89smd@*SEs z7ytqYX29h)kFR`S`1=Lu?N1E0y_w^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/docs/Saml2/img/icons/visibility_private.png b/docs/Saml2/img/icons/visibility_private.png deleted file mode 100644 index 386dc2d879d20cf85e4eeaaeb29e66bfe8398995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3433 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 diff --git a/docs/Saml2/img/iviewer/grab.cur b/docs/Saml2/img/iviewer/grab.cur deleted file mode 100644 index ef540be09383a215ba21287683ae956b74a6dbbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmeHEF%H8Z3_L;+LM2k9N*yv~>~H#wK9i4B>Jy?)*;1Rr5Mf~HSVzWizBA$iDEg)e zv@Up@fGdC-B|(IIaVjw`XMnR4do4(}ceLED$#?I4PhZt?V;F{(zNyX4aU6>oTI<~I zR%1+|Z@pO>D9unx@mz^sV2R6KAHrH&a3w(Uah_+1dcf$ic$W0J$AsEGc`x}F-{G8# oT0W#ZA~$;zN&n?%4r~@-v(K$0B;Q#;t diff --git a/docs/Saml2/img/iviewer/hand.cur b/docs/Saml2/img/iviewer/hand.cur deleted file mode 100644 index 1a5bafb5263fd4937dda4098b04aa5c70e2de924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)3OKyWe4E694LIn}22q6~8?0U4`qB$BzVUYuLnN^5A#g-vqrbZ8co}UNC0FIu^ z1?Y|NodI+J@I{~!RsQPaynTKEFe0{|*)R-iM9cJuPktQ*F&}vmxJX7;nU}sFz|xzG*A)o1}vy~Np8!oh{{D) z3FWrSE(G-lOIo^%@l%Jh z7d(bKZD(=f(+rDu3Ibk!p~fAzvAEw(G5oFaf>VGX;I$X`=G^#MhKzfwaaX++^R_aG z{23g@-KfbsV!rlS8y~jNpC$Q98001E5Sq?VpxukSs-?)+t$^aeGL+RsprA4wk<#_> z_+u(WTiH*vZ^%;_bKH_BUEq}jd#?-l#9J=q_v{?VaI4}Q9JQ|FoaxO4M#r~&(9l-@ga5_qddH0^Pp)3D%%13U()$KPZ9mfuKHeN zh|FV%AcKd9$Xte~JpHr7ISdEsS=dbylRpV}b%EG*(H$Zm7BrYE89CoGzCv2mgg*7U?}T-eQj1 z{ctQepE}YD%L6}S{pbtWcxoXGX*qRvIs~7NleuJ1rI2sTU9}wgEO}#naM{Mwl$wh8u zCnBy@;!tLlFk2ANZy*yRh*u1IjEu7sgd^u~j?-pP>cuPS5S69F5h60HO2`84nde#W zyHhV;*NN!tY8*EZeXCkX$LB3TNWEh+HIj>(aWc0CrwBgBQY@5_fO(q}ggUVHfHYwh z33cBmty=DP=A9=gECUXndMm_NP*e}Z-LCDyS)!}~n7b*S3$R(WUj{y!TOYyebROJ- zFF$p&>5+Q7DfKeS+K_mst_KprM8H(Hy%~al3{|Z#A5JZTYe-7!V4F>!)KgSFrn=vN z3kCIkDE(K!G*^RwzlwE`Dy#7rUC1u2#kz=0tng2mHP|cZPQ4qN4qPSy<|wW2D5KC{MlR z;>)=A5V)!Cz;#udS#FfKqnHHD=_R1Ptpjzf{nOgnDXf!ZtKqUo3Ky}YM}T&xUI8_p z+{#DD)pj7q40-gM-UA6eVt~J6Ck37*j6+@9f{jOSVfEgWC}V(*7I~i&Dx8uU4S&P_ z;3=qW>uyHVjD_fF#+pz$KVvi(@T$|6gmQ;1NkX6Jb)Y}^@BGWy!Sjrgf9<#ho=bDz zCj-9w{fH|?2J}+O500000NkvXXu0mjf*RRDb diff --git a/docs/Saml2/img/iviewer/iviewer.rotate_right.png b/docs/Saml2/img/iviewer/iviewer.rotate_right.png deleted file mode 100644 index 7a6c829871d058af5a5ca0ac67256c259f84c5ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1482 zcmV;*1vUDKP)W@q8L24va@vW@P7*!=(&yIADtgIo?`IW@@z#oP%kAO5~e4>aSvdau$keO zelrxe7h>a?XEPGL-8ZvUK7S5JxO_SC%cam%h9U3nOynA8Bd1~p@(p_slER=;FN42~ zVT$Cx%L&IBfqkNPU0Q$wV<=M8^Ktsd`-seX8%Hx4(Mza9RSeQph6Cvg*A2_?bs*!Z zJm9Mh7vz)H#bKgf96Z*=%6lrx!F>}8+<9p(ZW^~EGIuaSuQBYWfCsY}!gCl75#iYs zn4X1YwmkE{L{qbYU7_|vC;44Kc>_>d53G;Ofy>H6K72&Q1n)K0hYkOJ{}5yueQ_kO zAEZ3kO@`uTdQ^;QD4P$Xc-46$f7y>g|g44T+ z#BgE=@!>Z#-vKoL6Wa&pE*R*#HWno`0s)tGNL1G$LZyexFDGPt0qahH^Hl0tOywX% zlsY1!jA8k4hEa>zCTrlAtqC<~Car`X>shKzaMo5pP+|!}lx4#8x7#jb=yVHAyecTTC4J8t z#9H#H1x)ab5$qRn{T_~Gwh%$&8k>4#Nl^>etY1&RH*c@JV*VdWES08K(6hJ3ua1F+ z1Vqx@pUkersqB_Ip|BQ5mEtYg?Pld26u-(ZDhIXZN8p8vpywZqUmXq21K`XJ6VBRD zSPjgUh_hsuo0Zq@#H52sg=lQDK%p}U0=)MqxPXrz3y|HcLaYr6jTyT{TGH;2&kl$g zvn(tPnZ+iUo13A~-oxKTMnQmAi+~YaKrsopkYC+_iv!`6FZ*8at59p?CSTLD^ce@1hVDp0-#Q zq7i&EGSIAWEAo-(3@vR~e8qHMf3DS%&Pzg-H4FABh2HRK5QhTu_A0SBL~)<~@sXQv zl!l*(`MH4my)*cGH#$9gu8S$5cCU4I9uNy}^C|I;^|0b5vYngtVB^%;d7vlsx1OAw ktS2S0?VM~5JkO{63m1~IVD>3BuK)l507*qoM6N<$f)6RO6951J diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_fit.png b/docs/Saml2/img/iviewer/iviewer.zoom_fit.png deleted file mode 100644 index 364e01d90eae19584713851314629f2468198e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmbVMZD`zN9M7nO!F>6)Qu>rmKTa$KDx31r-tX6e<%`(6Krd_QfiW`8t`1_@uq7ekl83AbH+? zzu*7$$#_?1`>KY!8VG_|C2bSZcx-mx`sMihAai~i59?7fi@MD`D#97s?^ptvbD@%0UaWlEb9Y?!POak>Kac>j_lvC`$F%JGkXW>_ZEGx zJom!Kv#(7V2O9tK-kSZb!BUHpo@HF_;W5I?7`%^kn|fV6LyKC%38?;(5V z!PU9ZKS#&d``e%Ktf-E%=q0M&EZqyy}ir$_H&JcW2fJ{{PgiX z8-IUUIXQgrq&9v}_F_|k9sDEvsw97zUz^v|wk^6~k{(E}g+-F{ISKr))j<47BXr41~e0blAr&bSs z|IrSo^7@evzS-=(@x`Huqc2r99GkQ^PabxeDqKE2-7j>wsvG2m_N{Pyfo(Z~3KXY?;^Pc&YH??aJsCHEo`3 w8eZ!(AMJatv3kpyYro>2$M)>r+u)qoRbjGiisBQYX$xZ(3D5f)$iQF?09S=3^#A|> diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_in.png b/docs/Saml2/img/iviewer/iviewer.zoom_in.png deleted file mode 100644 index 78993327c62ddd64e7fe33bc1b0d469ef9e17f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmbVMeM}o=96n$mLI`O1*jPqxokAS8_t9QIP6}&#?I^6YLL;DzakN*s!1Zp|0}9Rz z8rh;F0cBg38IU39T#zkeLnml8hzMCSG?@^xXdOBYVGI|HL|oz(DEbH4A6|0zem&3g z`+V;WTfxD&nA8{m0OHKKM4>pQ1>fi>@%sWi*eedZ1Y?O%#JYqAlBWQjldYscGecHU zg%s&*JUU5b0YHS4wwDMcmP5FMWn^R!Bl9wx$OeF{94|*YYA6A$q^fAQR`OuPF9B(% zR#J>vU<+rUs_EP&o+@f8usfP+92%!2CmYQ2;-UaU2_)!cYTX{(tCg(l;^I8G4N1Ut zh)|=IY&cb7v4IAbr$9^wOC7Kh29<~mkt? zy6{56v}sFRX(iQyz~K<#uSL*ic3n>tk$HCK_ zK(lTzs7O|_b%ItRdb$w;!&xj_!fwxIqQsOzUXp_l84NK@Fs^m9M<}HJbz@t!$KJ?M zP$A`E>v)G)57)jBS6;_)Fv2Ks*P|kY8`^A2u!ZfsWAnHVJ68Y*ZF@k28qrD)nZSf_1^Pw#| z@pZkmCA&G}0&7bcjq%x*?aRCV3irha4o~M_DArx{=C$ijm7gxpJfn{2L~$I+EADGSEAJts^bthXdZ0!+7(pGrKca+s`)MokNH6@80m`S3a@u zY1ygFvFkgB8j(NleZ>ubn=|IJ|7-yHzY}KZV-M0lk+#l6X1~TQy|p*uWp8(@{ii>t zUM%g1pU@A_-dyI62l_3g1J;f*Z-2$!(N|(ifOlu2-fw+1YIXRfE0Nik_Z$MUT=6@` he~f-qo>Y;tmQ(?tGoVp(DLyXve>58lh(UdY?;kaa{Rsd7 diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_in2.gif b/docs/Saml2/img/iviewer/iviewer.zoom_in2.gif deleted file mode 100644 index 5d596181627a30344f9783d466ce0558279fe729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_O4Pyfo(Z}}I`;fT1UbHL~G(^^jrxfIDc qOSLxju^l&BbLLyj{a>m(=kzlMwFoEmw|glD9`i8f>~-Q|um%7;9UyH0 diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_out.png b/docs/Saml2/img/iviewer/iviewer.zoom_out.png deleted file mode 100644 index 893f3502baaab667354fe8b560c1712b72630836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{T%CB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA){ffi_eM3D1{oGuTzrd=COM+4n&cLd=IHa;5RX-@T zIKQ+g85kdF$}r8qu)}W=NFmTQR{lkqz(`5Vami0E%}vcK@pQ3O0?O#6WTsddyBS)T zxj4DGI+;7U8WbpSnwXlJx+y{RrjQe2`as9%gOUbPQh^Bp(;tWlPxwF%JnN+90rN`{ zFk|eTuyZ2=1LH1F7srr_TYIJ*^g8Sy&?e2@*d%abWdMgri<5t&U4#0<`~ZPHTulKV zL_SFVVrt@l5PQLUVYuUp3a@^r?zky&+EXok@RH&z@w!8r$f$z%0{cUx;M)M%(BO@dlSAr|x|-`3zUuyW0)IVtW>|s>WVT?mGEc zSkr=`cGH2CXUi731dH|WWa9iWg>~1jL@c(3*I%OB-d`n9ld0_~{X@e~VM+?bvqa&xDF~4=3Dc{-t;PQB<+c zv78v6y_Q$sW5p8UNtB8n}}+(%+^^VTDLxDs_M@V zktZgdHP!#l9(Qv}igT01!>vuNAL^777;7#{%n;%?`4GGKfzXddg$9fTvuy=L>XpA# emo~({32$Iz;FK4L4Ckl>myMpTelF{r5}E)fw)-Uj diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_out2.gif b/docs/Saml2/img/iviewer/iviewer.zoom_out2.gif deleted file mode 100644 index 77ec19af216c5525438e73e4fafef1ce08db3cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_N!Pyfo(Z}}I`*>bCU^SwRQTrH10rZprj VQ(Lv|A^Y)9KG(nX7PB%~0{{a@8tMQ5 diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_zero.png b/docs/Saml2/img/iviewer/iviewer.zoom_zero.png deleted file mode 100644 index c981db6d690774d0c2e67e21c9081d5c89b5fd2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmbVL&ui0A9M4pSOy+USDH`Jt54L&lWo?(ZTAQSq1v^VuUA;)t~d_LcwSBo>#!$V_3 z9LEjkPwFMM?vLJ`gY0_@JiN=6Jv3LLv!qU2W`Mb@O=_6WyXHJDVbfl^_!>`f+;-b3 zS7@bhO0kF=HzS*P+w~cm6!@+QT}TTXPE`s;ULyhK6LAo; zKoamt7>CkCDwR6QBLIO2kO)x>rW6S&0Pwv>U}}L~S4z6k(_*Kz(4f>;M6uOs#amLG z1oI-4WjW$ND8?*e;gUzqcFYS8^%-;=T7lzJhj@I%Xx2!RrUmBdMhLE7C~OjYVJ}fE zWn$a(MHmO7>qc>PtwUPEf85y8IxH{wSS;a?Gy{v(qkgClX1V*fP-MuwQBDUAD~h?O z6RYWBkLLBX!2ZN-$5tc*P9}BL$f+qc2OyjTdQR0O9U94`B&o2^u@x4nAeBw1(2x=n z5avKO31v+Nl7u7!=(60$=Dm=bo`w6m4%6*n!9THz7GRT-piIbOzXOU5LP^*lKCjIt z_&LY3Nh^$svk|L~1LqR9jexj(H@k|ng?bW90+iEJ2GWfvYE_c6auz`iY1tG)S)qru z|0iQ2b4H9>hb!)51ol8qidf>uee2NcllE7&Y7PpcX!=7_qbu-x&Nqo^YXsS zx4psB1L(rH2OVv_Ry|wWf8@aTYwPTIZ{+>+x4F)XFBxU;`RVIF##f(pxPd|L)0^?x S8}D{hqp{BCX7q<@b>%mi3|d_P diff --git a/docs/Saml2/img/iviewer/iviewer.zoom_zero2.gif b/docs/Saml2/img/iviewer/iviewer.zoom_zero2.gif deleted file mode 100644 index e56c670fe62062458276fab5512701433b37af4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 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 diff --git a/docs/Saml2/index.html b/docs/Saml2/index.html deleted file mode 100644 index 7d94bc2a..00000000 --- a/docs/Saml2/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - SAML PHP Toolkit - - - - - - - - - - - - - - - - - - - - - - -
- - -
-

SAML PHP Toolkit

-

Documentation SAML2 lib

-
- -
-
-
- -
-
-
-
- -
-
-
-
- - - - diff --git a/docs/Saml2/js/SVGPan.js b/docs/Saml2/js/SVGPan.js deleted file mode 100644 index 4966b999..00000000 --- a/docs/Saml2/js/SVGPan.js +++ /dev/null @@ -1,232 +0,0 @@ -/** - * SVGPan library 1.2 - phpDocumentor1 - * ==================== - * - * Given an unique existing element with id "viewport", including the - * the library into any SVG adds the following capabilities: - * - * - Mouse panning - * - Mouse zooming (using the wheel) - * - Object dargging - * - * Known issues: - * - * - Zooming (while panning) on Safari has still some issues - * - * Releases: - * - * 1.2 - phpDocumentor1, Fri Apr 08 19:19:00 CET 2011, Mike van Riel - * Increased zoom speed with 20% - * Disabled element moving functionality - * - * 1.2, Sat Mar 20 08:42:50 GMT 2010, Zeng Xiaohui - * Fixed a bug with browser mouse handler interaction - * - * 1.1, Wed Feb 3 17:39:33 GMT 2010, Zeng Xiaohui - * Updated the zoom code to support the mouse wheel on Safari/Chrome - * - * 1.0, Andrea Leofreddi - * First release - * - * This code is licensed under the following BSD license: - * - * Copyright 2009-2010 Andrea Leofreddi . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of Andrea Leofreddi. - */ - -var root = document.documentElement; - -var state = 'none', stateTarget, stateOrigin, stateTf; - -setupHandlers(root); - -/** - * Register handlers - */ -function setupHandlers(root){ - setAttributes(root, { - "onmouseup" : "add(evt)", - "onmousedown" : "handleMouseDown(evt)", - "onmousemove" : "handleMouseMove(evt)", - "onmouseup" : "handleMouseUp(evt)", -// "onmouseout" : "handleMouseUp(evt)" // Decomment this to stop the pan functionality when dragging out of the SVG element - }); - - if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0) - window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - else - window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others -} - -/** - * Instance an SVGPoint object with given event coordinates. - */ -function getEventPoint(evt) { - var p = root.createSVGPoint(); - - p.x = evt.clientX; - p.y = evt.clientY; - - return p; -} - -/** - * Sets the current transform matrix of an element. - */ -function setCTM(element, matrix) { - var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; - - element.setAttribute("transform", s); -} - -/** - * Dumps a matrix to a string (useful for debug). - */ -function dumpMatrix(matrix) { - var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]"; - - return s; -} - -/** - * Sets attributes of an element. - */ -function setAttributes(element, attributes){ - for (i in attributes) - element.setAttributeNS(null, i, attributes[i]); -} - -/** - * Handle mouse move event. - */ -function handleMouseWheel(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var delta; - - if(evt.wheelDelta) - delta = evt.wheelDelta / 3600; // Chrome/Safari - else - delta = evt.detail / -90; // Mozilla - - var z = 1 + (delta * 1.2); // Zoom factor: 0.9/1.1 - - var g = svgDoc.getElementById("viewport"); - - var p = getEventPoint(evt); - - p = p.matrixTransform(g.getCTM().inverse()); - - // Compute new scale matrix in current mouse position - var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y); - - setCTM(g, g.getCTM().multiply(k)); - - stateTf = stateTf.multiply(k.inverse()); -} - -/** - * Handle mouse move event. - */ -function handleMouseMove(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var g = svgDoc.getElementById("viewport"); - - if(state == 'pan') { - // Pan mode - var p = getEventPoint(evt).matrixTransform(stateTf); - - setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y)); - } else if(state == 'move') { - // Move mode - var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse()); - - setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM())); - - stateOrigin = p; - } -} - -/** - * Handle click event. - */ -function handleMouseDown(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - var g = svgDoc.getElementById("viewport"); - -// if(evt.target.tagName == "svg") { - // Pan mode - state = 'pan'; - - stateTf = g.getCTM().inverse(); - - stateOrigin = getEventPoint(evt).matrixTransform(stateTf); -// } else { - // Move mode -// state = 'move'; -// -// stateTarget = evt.target; -// -// stateTf = g.getCTM().inverse(); -// -// stateOrigin = getEventPoint(evt).matrixTransform(stateTf); -// } -} - -/** - * Handle mouse button release event. - */ -function handleMouseUp(evt) { - if(evt.preventDefault) - evt.preventDefault(); - - evt.returnValue = false; - - var svgDoc = evt.target.ownerDocument; - - if(state == 'pan' || state == 'move') { - // Quit pan mode - state = ''; - } -} - diff --git a/docs/Saml2/js/bootstrap.js b/docs/Saml2/js/bootstrap.js deleted file mode 100644 index c832ccb2..00000000 --- a/docs/Saml2/js/bootstrap.js +++ /dev/null @@ -1,1722 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -!function( $ ) { - - $(function () { - - "use strict" - - /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) - * ======================================================= */ - - $.support.transition = (function () { - var thisBody = document.body || document.documentElement - , thisStyle = thisBody.style - , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined - - return support && { - end: (function () { - var transitionEnd = "TransitionEnd" - if ( $.browser.webkit ) { - transitionEnd = "webkitTransitionEnd" - } else if ( $.browser.mozilla ) { - transitionEnd = "transitionend" - } else if ( $.browser.opera ) { - transitionEnd = "oTransitionEnd" - } - return transitionEnd - }()) - } - })() - - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-alert.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function ( el ) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype = { - - constructor: Alert - - , close: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.trigger('close') - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.removeClass('in') - - function removeElement() { - $parent.remove() - $parent.trigger('closed') - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-button.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype = { - - constructor: Button - - , setState: function ( state ) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - , toggle: function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - $(e.target).button('toggle') - }) - }) - -}( window.jQuery ) -/* ========================================================== - * bootstrap-carousel.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.carousel.defaults, options) - this.options.slide && this.slide(this.options.slide) - } - - Carousel.prototype = { - - cycle: function () { - this.interval = setInterval($.proxy(this.next, this), this.options.interval) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function () { - clearInterval(this.interval) - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if (!$.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger('slide') - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } else { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.trigger('slide') - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = typeof option == 'object' && option - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}( window.jQuery ) -/* ============================================================= - * bootstrap-collapse.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - var Collapse = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options["parent"]) { - this.$parent = $(this.options["parent"]) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension = this.dimension() - , scroll = $.camelCase(['scroll', dimension].join('-')) - , actives = this.$parent && this.$parent.find('.in') - , hasData - - if (actives && actives.length) { - hasData = actives.data('collapse') - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', 'show', 'shown') - this.$element[dimension](this.$element[0][scroll]) - - } - - , hide: function () { - var dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', 'hide', 'hidden') - this.$element[dimension](0) - } - - , reset: function ( size ) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element.addClass('collapse') - } - - , transition: function ( method, startEvent, completeEvent ) { - var that = this - , complete = function () { - if (startEvent == 'show') that.reset() - that.$element.trigger(completeEvent) - } - - this.$element - .trigger(startEvent) - [method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}( window.jQuery ) -/* ============================================================ - * bootstrap-dropdown.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function( $ ){ - - "use strict" - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function ( element ) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - , isActive - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - !isActive && $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}( window.jQuery ) -/* ========================================================= - * bootstrap-modal.js v2.0.0 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function( $ ){ - - "use strict" - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function ( content, options ) { - this.options = $.extend({}, $.fn.modal.defaults, options) - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - - if (this.isShown) return - - $('body').addClass('modal-open') - - this.isShown = true - this.$element.trigger('show') - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function ( e ) { - e && e.preventDefault() - - if (!this.isShown) return - - var that = this - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element - .trigger('hide') - .removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal( that ) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop( callback ) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('