diff --git a/application/controllers/ErrorController.php b/application/controllers/ErrorController.php index 6b75c6488..a77d36f4f 100644 --- a/application/controllers/ErrorController.php +++ b/application/controllers/ErrorController.php @@ -3,6 +3,7 @@ use Icinga\Application\Icinga; use Icinga\Application\Logger; +use Icinga\Exception\MissingParameterException; use Icinga\Security\SecurityException; use Icinga\Web\Controller\ActionController; @@ -42,19 +43,26 @@ class ErrorController extends ActionController } break; - case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: - if ($exception instanceof SecurityException) { - $this->getResponse()->setHttpResponseCode(403); - $this->view->message = $exception->getMessage(); - break; - } - // Move to default default: + switch (true) { + case $exception instanceof SecurityException: + $this->getResponse()->setHttpResponseCode(403); + break; + case $exception instanceof MissingParameterException: + $this->getResponse()->setHttpResponseCode(400); + $this->getResponse()->setHeader( + 'X-Status-Reason', + 'Missing parameter ' . $exception->getParameter() + ); + break; + default: + $this->getResponse()->setHttpResponseCode(500); + break; + } $title = preg_replace('/\r?\n.*$/s', '', $exception->getMessage()); - $this->getResponse()->setHttpResponseCode(500); $this->view->title = 'Server error: ' . $title; $this->view->message = $exception->getMessage(); - if ($this->getInvokeArg('displayExceptions') == true) { + if ($this->getInvokeArg('displayExceptions')) { $this->view->stackTrace = $exception->getTraceAsString(); } break; diff --git a/library/Icinga/Cli/Params.php b/library/Icinga/Cli/Params.php index 27a1df9a1..34dd5e177 100644 --- a/library/Icinga/Cli/Params.php +++ b/library/Icinga/Cli/Params.php @@ -3,6 +3,8 @@ namespace Icinga\Cli; +use Icinga\Exception\MissingParameterException; + /** * Params * @@ -155,6 +157,29 @@ class Params return $default; } + /** + * Require a parameter + * + * @param string $name Name of the parameter + * @param bool $strict Whether the parameter's value must not be the empty string + * + * @return mixed + * + * @throws MissingParameterException If the parameter was not given + */ + public function req($name, $strict = true) + { + if ($this->has($name)) { + $value = $this->get($name); + if (! $strict || strlen($value) > 0) { + return $value; + } + } + $e = new MissingParameterException(t('Required parameter \'%s\' missing'), $name); + $e->setParameter($name); + throw $e; + } + /** * Set a value for the given option * diff --git a/library/Icinga/Exception/MissingParameterException.php b/library/Icinga/Exception/MissingParameterException.php index 2673cc2d6..4377ef103 100644 --- a/library/Icinga/Exception/MissingParameterException.php +++ b/library/Icinga/Exception/MissingParameterException.php @@ -4,9 +4,37 @@ namespace Icinga\Exception; /** - * Class MissingParameterException - * @package Icinga\Exception + * Exception thrown if a mandatory parameter was not given */ class MissingParameterException extends IcingaException { + /** + * Name of the missing parameter + * + * @var string + */ + protected $parameter; + + /** + * Get the name of the missing parameter + * + * @return string + */ + public function getParameter() + { + return $this->parameter; + } + + /** + * Set the name of the missing parameter + * + * @param string $name + * + * @return $this + */ + public function setParameter($name) + { + $this->parameter = (string) $name; + return $this; + } } diff --git a/library/Icinga/Web/Controller/ActionController.php b/library/Icinga/Web/Controller/ActionController.php index 89a56e745..f40b8d538 100644 --- a/library/Icinga/Web/Controller/ActionController.php +++ b/library/Icinga/Web/Controller/ActionController.php @@ -55,6 +55,11 @@ class ActionController extends Zend_Controller_Action */ private $auth; + /** + * URL parameters + * + * @var UrlParams + */ protected $params; /** diff --git a/library/Icinga/Web/UrlParams.php b/library/Icinga/Web/UrlParams.php index 5c2a79d05..a38c1a229 100644 --- a/library/Icinga/Web/UrlParams.php +++ b/library/Icinga/Web/UrlParams.php @@ -3,6 +3,8 @@ namespace Icinga\Web; +use Icinga\Exception\MissingParameterException; + class UrlParams { protected $separator = '&'; @@ -42,6 +44,29 @@ class UrlParams return rawurldecode($this->params[ end($this->index[$param]) ][ 1 ]); } + /** + * Require a parameter + * + * @param string $name Name of the parameter + * @param bool $strict Whether the parameter's value must not be the empty string + * + * @return mixed + * + * @throws MissingParameterException If the parameter was not given + */ + public function req($name, $strict = true) + { + if ($this->has($name)) { + $value = $this->get($name); + if (! $strict || strlen($value) > 0) { + return $value; + } + } + $e = new MissingParameterException(t('Required parameter \'%s\' missing'), $name); + $e->setParameter($name); + throw $e; + } + /** * Get all instances of the given parameter *