summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/SimpleSAML/Configuration.php49
-rw-r--r--lib/SimpleSAML/Utils/HTTP.php14
-rw-r--r--tests/lib/SimpleSAML/ConfigurationTest.php36
-rw-r--r--www/_include.php7
4 files changed, 77 insertions, 29 deletions
diff --git a/lib/SimpleSAML/Configuration.php b/lib/SimpleSAML/Configuration.php
index 2a52bf1..62f25bf 100644
--- a/lib/SimpleSAML/Configuration.php
+++ b/lib/SimpleSAML/Configuration.php
@@ -113,13 +113,32 @@ class SimpleSAML_Configuration
// the file initializes a variable named '$config'
require($filename);
+ // check that $config exists
+ if (!isset($config)) {
+ throw new \SimpleSAML\Error\ConfigurationError(
+ '$config is not defined in the configuration file.',
+ $filename
+ );
+ }
+
// check that $config is initialized to an array
if (!is_array($config)) {
- throw new Exception('Invalid configuration file: '.$filename);
+ throw new \SimpleSAML\Error\ConfigurationError(
+ '$config is not an array.',
+ $filename
+ );
+ }
+
+ // check that $config is not empty
+ if (empty($config)) {
+ throw new \SimpleSAML\Error\ConfigurationError(
+ '$config is empty.',
+ $filename
+ );
}
} elseif ($required) {
// file does not exist, but is required
- throw new Exception('Missing configuration file: '.$filename);
+ throw new \SimpleSAML\Error\ConfigurationError('Missing configuration file', $filename);
} else {
// file does not exist, but is optional, so return an empty configuration object without saving it
$cfg = new SimpleSAML_Configuration(array(), $filename);
@@ -258,10 +277,17 @@ class SimpleSAML_Configuration
}
if ($instancename === 'simplesaml') {
- return self::getConfig();
+ try {
+ return self::getConfig();
+ } catch (SimpleSAML\Error\ConfigurationError $e) {
+ throw \SimpleSAML\Error\CriticalConfigurationError::fromException($e);
+ }
+
}
- throw new Exception('Configuration with name '.$instancename.' is not initialized.');
+ throw new \SimpleSAML\Error\CriticalConfigurationError(
+ 'Configuration with name '.$instancename.' is not initialized.'
+ );
}
@@ -407,7 +433,7 @@ class SimpleSAML_Configuration
*
* @return string The absolute path relative to the root of the website.
*
- * @throws SimpleSAML_Error_Exception If the format of 'baseurlpath' is incorrect.
+ * @throws SimpleSAML\Error\CriticalConfigurationError If the format of 'baseurlpath' is incorrect.
*/
public function getBaseURL()
{
@@ -428,11 +454,18 @@ class SimpleSAML_Configuration
// local path only
return $matches[1];
} else {
- // invalid format
- throw new SimpleSAML_Error_Exception(
+ /*
+ * Invalid 'baseurlpath'. We cannot recover from this, so throw a critical exception and try to be graceful
+ * with the configuration. Use a guessed base path instead of the one provided.
+ */
+ $c = $this->toArray();
+ $c['baseurlpath'] = SimpleSAML\Utils\HTTP::guessBasePath();
+ throw new SimpleSAML\Error\CriticalConfigurationError(
'Incorrect format for option \'baseurlpath\'. Value is: "'.
$this->getString('baseurlpath', 'simplesaml/').'". Valid format is in the form'.
- ' [(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/].'
+ ' [(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/].',
+ $this->filename,
+ $c
);
}
}
diff --git a/lib/SimpleSAML/Utils/HTTP.php b/lib/SimpleSAML/Utils/HTTP.php
index a6097a5..5ebf776 100644
--- a/lib/SimpleSAML/Utils/HTTP.php
+++ b/lib/SimpleSAML/Utils/HTTP.php
@@ -539,7 +539,7 @@ class HTTP
* https://idp.example.org/simplesaml/
*
* @return string The absolute base URL for the SimpleSAMLphp installation.
- * @throws \SimpleSAML_Error_Exception If 'baseurlpath' has an invalid format.
+ * @throws \SimpleSAML\Error\CriticalConfigurationError If 'baseurlpath' has an invalid format.
*
* @author Olav Morken, UNINETT AS <olav.morken@uninett.no>
*/
@@ -567,9 +567,17 @@ class HTTP
return $protocol.$hostname.$port.$path;
} else {
- throw new \SimpleSAML_Error_Exception(
+ /*
+ * Invalid 'baseurlpath'. We cannot recover from this, so throw a critical exception and try to be graceful
+ * with the configuration. Use a guessed base path instead of the one provided.
+ */
+ $c = $globalConfig->toArray();
+ $c['baseurlpath'] = self::guessBasePath();
+ throw new \SimpleSAML\Error\CriticalConfigurationError(
'Invalid value for \'baseurlpath\' in config.php. Valid format is in the form: '.
- '[(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/]. It must end with a \'/\'.'
+ '[(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/]. It must end with a \'/\'.',
+ null,
+ $c
);
}
}
diff --git a/tests/lib/SimpleSAML/ConfigurationTest.php b/tests/lib/SimpleSAML/ConfigurationTest.php
index 5a0c7f3..076b8b0 100644
--- a/tests/lib/SimpleSAML/ConfigurationTest.php
+++ b/tests/lib/SimpleSAML/ConfigurationTest.php
@@ -15,6 +15,27 @@ class Test_SimpleSAML_Configuration extends PHPUnit_Framework_TestCase
}
/**
+ * Test that the default instance fails to load even if we previously loaded another instance.
+ * @expectedException \SimpleSAML\Error\CriticalConfigurationError
+ */
+ public function testLoadDefaultInstance()
+ {
+ SimpleSAML_Configuration::loadFromArray(array('key' => 'value'), '', 'dummy');
+ SimpleSAML_Configuration::getInstance();
+ }
+
+
+ /**
+ * Test that after a \SimpleSAML\Error\CriticalConfigurationError exception, a basic, self-survival configuration
+ * is loaded.
+ */
+ public function testCriticalConfigurationError()
+ {
+ $c = SimpleSAML_Configuration::getInstance();
+ $this->assertNotEmpty($c->toArray());
+ }
+
+ /**
* Test SimpleSAML_Configuration::getValue()
*/
public function testGetValue() {
@@ -127,7 +148,7 @@ class Test_SimpleSAML_Configuration extends PHPUnit_Framework_TestCase
/**
* Test that SimpleSAML_Configuration::getBaseURL() fails if given a path without trailing slash
- * @expectedException SimpleSAML_Error_Exception
+ * @expectedException \SimpleSAML\Error\CriticalConfigurationError
*/
public function testGetBaseURLError() {
$c = SimpleSAML_Configuration::loadFromArray(array(
@@ -861,19 +882,6 @@ class Test_SimpleSAML_Configuration extends PHPUnit_Framework_TestCase
$c->getLocalizedString('opt');
}
-
- /**
- * Test that the default instance fails to load even if we previously loaded another instance.
- * @expectedException Exception
- */
- public function testLoadDefaultInstance()
- {
- SimpleSAML_Configuration::loadFromArray(array('key' => 'value'), '', 'dummy');
- $c = SimpleSAML_Configuration::getInstance();
- var_dump($c);
- }
-
-
/**
* Test that Configuration objects can be initialized from an array.
*
diff --git a/www/_include.php b/www/_include.php
index f587766..4772fbb 100644
--- a/www/_include.php
+++ b/www/_include.php
@@ -83,10 +83,9 @@ set_error_handler('SimpleSAML_error_handler');
$configdir = SimpleSAML\Utils\Config::getConfigDir();
if (!file_exists($configdir.'/config.php')) {
- header('Content-Type: text/plain');
- echo("You have not yet created the SimpleSAMLphp configuration files.\n");
- echo("See: https://simplesamlphp.org/docs/devel/simplesamlphp-install-repo\n");
- exit(1);
+ throw new \SimpleSAML\Error\CriticalConfigurationError(
+ 'You have not yet created the SimpleSAMLphp configuration files.'
+ );
}
// set the timezone