diff --git a/lib/SimpleSAML/Error/ConfigurationError.php b/lib/SimpleSAML/Error/ConfigurationError.php new file mode 100644 index 0000000000000000000000000000000000000000..15eb30f366ee918b0226f1345587598c52cb4b2d --- /dev/null +++ b/lib/SimpleSAML/Error/ConfigurationError.php @@ -0,0 +1,78 @@ +<?php +/** + * This exception represents a configuration error. + * + * @author Jaime Perez Crespo, UNINETT AS <jaime.perez@uninett.no> + * @package SimpleSAMLphp + */ + +namespace SimpleSAML\Error; + + +class ConfigurationError extends \SimpleSAML_Error_Error +{ + + /** + * The reason for this exception. + * + * @var null|string + */ + protected $reason; + + /** + * The configuration file that caused this exception. + * + * @var null|string + */ + protected $config_file; + + + /** + * ConfigurationError constructor. + * + * @param string|null $reason The reason for this exception. + * @param string|null $file The configuration file that originated this error. + * @param array|null $config The configuration array that led to this problem. + */ + public function __construct($reason = null, $file = null, array $config = null) + { + $file_str = ''; + $reason_str = '.'; + $params = array('CONFIG'); + if ($file !== null) { + $params['%FILE%'] = $file; + $basepath = dirname(dirname(dirname(dirname(__FILE__)))).'/'; + $file_str = '('.str_replace($basepath, '', $file).') '; + } + if ($reason !== null) { + $params['%REASON%'] = $reason; + $reason_str = ': '.$reason; + } + $this->reason = $reason; + $this->config_file = $file; + parent::__construct($params); + $this->message = 'The configuration '.$file_str.'is invalid'.$reason_str; + } + + + /** + * Get the reason for this exception. + * + * @return null|string The reason for this exception. + */ + public function getReason() + { + return $this->reason; + } + + + /** + * Get the configuration file that caused this exception. + * + * @return null|string The configuration file that caused this exception. + */ + public function getConfFile() + { + return $this->config_file; + } +} diff --git a/lib/SimpleSAML/Error/CriticalConfigurationError.php b/lib/SimpleSAML/Error/CriticalConfigurationError.php new file mode 100644 index 0000000000000000000000000000000000000000..3d036f746b855c75c8aec9ca9cbfba05d70803c7 --- /dev/null +++ b/lib/SimpleSAML/Error/CriticalConfigurationError.php @@ -0,0 +1,81 @@ +<?php +/** + * This exception represents a configuration error that we cannot recover from. + * + * Throwing a critical configuration error indicates that the configuration available is not usable, and as such + * SimpleSAMLphp should not try to use it. However, in certain situations we might find a specific configuration + * error that makes part of the configuration unusable, while the rest we can still use. In those cases, we can + * just pass a configuration array to the constructor, making sure the offending configuration options are removed, + * reset to defaults or guessed to some usable value. + * + * If, for example, we have an error in the 'baseurlpath' configuration option, we can still load the configuration + * and substitute the value of that option with one guessed from the environment, using + * \SimpleSAML\Utils\HTTP::guessPath(). Doing so, the error is still critical, but at least we can recover up to a + * certain point and inform about the error in an ordered manner, without blank pages, logs out of place or even + * segfaults. + * + * @author Jaime Perez Crespo, UNINETT AS <jaime.perez@uninett.no> + * @package SimpleSAMLphp + */ + +namespace SimpleSAML\Error; + + +class CriticalConfigurationError extends ConfigurationError +{ + + /** + * This is the bare minimum configuration that we can use. + * + * @var array + */ + private static $minimum_config = array( + 'logging.handler' => 'errorlog', + 'logging.level' => \SimpleSAML\Logger::DEBUG, + 'errorreporting' => false, + 'debug' => true, + ); + + + /** + * CriticalConfigurationError constructor. + * + * @param string|null $reason The reason for this critical error. + * @param string|null $file The configuration file that originated this error. + * @param array|null The configuration array that led to this problem. + */ + public function __construct($reason = null, $file = null, $config = null) + { + if ($config === null) { + $config = self::$minimum_config; + } else { + $config['baseurlpath'] = \SimpleSAML\Utils\HTTP::guessBasePath(); + } + + \SimpleSAML_Configuration::loadFromArray( + $config, + '', + 'simplesaml' + ); + parent::__construct($reason, $file); + } + + + /** + * @param \Exception $exception + * + * @return CriticalConfigurationError + */ + public static function fromException(\Exception $exception) + { + $reason = null; + $file = null; + if ($exception instanceof ConfigurationError) { + $reason = $exception->getReason(); + $file = $exception->getConfFile(); + } else { + $reason = $exception->getMessage(); + } + return new CriticalConfigurationError($reason, $file); + } +}