summaryrefslogtreecommitdiffstats
path: root/lib/SimpleSAML/Utils
diff options
context:
space:
mode:
Diffstat (limited to 'lib/SimpleSAML/Utils')
-rw-r--r--lib/SimpleSAML/Utils/HTTP.php35
-rw-r--r--lib/SimpleSAML/Utils/XML.php26
2 files changed, 46 insertions, 15 deletions
diff --git a/lib/SimpleSAML/Utils/HTTP.php b/lib/SimpleSAML/Utils/HTTP.php
index 25d5596..9f5a50e 100644
--- a/lib/SimpleSAML/Utils/HTTP.php
+++ b/lib/SimpleSAML/Utils/HTTP.php
@@ -729,11 +729,31 @@ class HTTP
{
$cfg = \SimpleSAML_Configuration::getInstance();
$baseDir = $cfg->getBaseDir();
- $current_path = realpath($_SERVER['SCRIPT_FILENAME']);
- $rel_path = str_replace($baseDir.'www'.DIRECTORY_SEPARATOR, '', $current_path);
-
- if ($current_path == $rel_path) { // compare loosely ($current_path can be false)
- // we were accessed from an external script, do not try to apply our base URL
+ $cur_path = realpath($_SERVER['SCRIPT_FILENAME']);
+ // find the path to the current script relative to the www/ directory of SimpleSAMLphp
+ $rel_path = str_replace($baseDir.'www'.DIRECTORY_SEPARATOR, '', $cur_path);
+ // convert that relative path to an HTTP query
+ $url_path = str_replace(DIRECTORY_SEPARATOR, '/', $rel_path);
+ // find where the relative path starts in the current request URI
+ $uri_pos = (!empty($url_path)) ? strpos($_SERVER['REQUEST_URI'], $url_path) : false;
+
+ if ($cur_path == $rel_path || $uri_pos === false) {
+ /*
+ * We were accessed from an external script. This can happen in the following cases:
+ *
+ * - $_SERVER['SCRIPT_FILENAME'] points to a script that doesn't exist. E.g. functional testing. In this
+ * case, realpath() returns false and str_replace an empty string, so we compare them loosely.
+ *
+ * - The URI requested does not belong to a script in the www/ directory of SimpleSAMLphp. In that case,
+ * removing SimpleSAMLphp's base dir from the current path yields the same path, so $cur_path and
+ * $rel_path are equal.
+ *
+ * - The request URI does not match the current script. Even if the current script is located in the www/
+ * directory of SimpleSAMLphp, the URI does not contain its relative path, and $uri_pos is false.
+ *
+ * It doesn't matter which one of those cases we have. We just know we can't apply our base URL to the
+ * current URI, so we need to build it back from the PHP environment.
+ */
$protocol = 'http';
$protocol .= (self::getServerHTTPS()) ? 's' : '';
$protocol .= '://';
@@ -743,10 +763,7 @@ class HTTP
return $protocol.$hostname.$port.$_SERVER['REQUEST_URI'];
}
- $url = self::getBaseURL();
- $rel_path = str_replace(DIRECTORY_SEPARATOR, '/', $rel_path);
- $pos = strpos($_SERVER['REQUEST_URI'], $rel_path) + strlen($rel_path);
- return $url.$rel_path.substr($_SERVER['REQUEST_URI'], $pos);
+ return self::getBaseURL().$rel_path.substr($_SERVER['REQUEST_URI'], $uri_pos + strlen($url_path));
}
diff --git a/lib/SimpleSAML/Utils/XML.php b/lib/SimpleSAML/Utils/XML.php
index 05206ec..abaa005 100644
--- a/lib/SimpleSAML/Utils/XML.php
+++ b/lib/SimpleSAML/Utils/XML.php
@@ -14,7 +14,7 @@ class XML
/**
* This function performs some sanity checks on XML documents, and optionally validates them against their schema
- * if the 'debug.validatexml' option is enabled. A warning will be printed to the log if validation fails.
+ * if the 'validatexml' debugging option is enabled. A warning will be printed to the log if validation fails.
*
* @param string $message The SAML document we want to check.
* @param string $type The type of document. Can be one of:
@@ -41,8 +41,16 @@ class XML
throw new \SimpleSAML_Error_Exception('XML contained a doctype declaration.');
}
- $enabled = \SimpleSAML_Configuration::getInstance()->getBoolean('debug.validatexml', null);
- if (!$enabled) {
+ // see if debugging is enabled for XML validation
+ $debug = \SimpleSAML_Configuration::getInstance()->getArrayize('debug', array('validatexml' => false));
+ $enabled = \SimpleSAML_Configuration::getInstance()->getBoolean('debug.validatexml', false);
+
+ if (!(in_array('validatexml', $debug, true) // implicitly enabled
+ || (array_key_exists('validatexml', $debug) && $debug['validatexml'] === true) // explicitly enabled
+ // TODO: deprecate this option and remove it in 2.0
+ || $enabled // old 'debug.validatexml' configuration option
+ )) {
+ // XML validation is disabled
return;
}
@@ -84,9 +92,15 @@ class XML
throw new \InvalidArgumentException('Invalid input parameters.');
}
- $globalConfig = \SimpleSAML_Configuration::getInstance();
- if (!$globalConfig->getBoolean('debug', false)) {
- // message debug disabled
+ // see if debugging is enabled for SAML messages
+ $debug = \SimpleSAML_Configuration::getInstance()->getArrayize('debug', array('saml' => false));
+
+ if (!(in_array('saml', $debug, true) // implicitly enabled
+ || (array_key_exists('saml', $debug) && $debug['saml'] === true) // explicitly enabled
+ // TODO: deprecate the old style and remove it in 2.0
+ || (array_key_exists(0, $debug) && $debug[0] === true) // old style 'debug'
+ )) {
+ // debugging messages is disabled
return;
}