diff options
author | Mate Bartus <mate.bartus@gmail.com> | 2015-11-04 14:00:59 +0100 |
---|---|---|
committer | Mate Bartus <mate.bartus@gmail.com> | 2015-11-27 14:50:21 +0100 |
commit | 93b37b24c2d546a2bc80830508d64338a24f9afa (patch) | |
tree | 6f52cd9cd8aedc22034c549f3f8c14defb1d543e | |
parent | 1316fe208482d0a56ce6e54b79a1a00ae05d32ce (diff) | |
download | forums-93b37b24c2d546a2bc80830508d64338a24f9afa.tar forums-93b37b24c2d546a2bc80830508d64338a24f9afa.tar.gz forums-93b37b24c2d546a2bc80830508d64338a24f9afa.tar.bz2 forums-93b37b24c2d546a2bc80830508d64338a24f9afa.tar.xz forums-93b37b24c2d546a2bc80830508d64338a24f9afa.zip |
[ticket/14269] Use http_exceptions in the installer instead of die()
PHPBB3-14269
-rw-r--r-- | phpBB/config/installer/container/services.yml | 9 | ||||
-rw-r--r-- | phpBB/language/en/install.php | 3 | ||||
-rw-r--r-- | phpBB/phpbb/install/controller/install.php | 5 | ||||
-rw-r--r-- | phpBB/phpbb/install/controller/update.php | 7 | ||||
-rw-r--r-- | phpBB/phpbb/install/event/kernel_exception_subscriber.php | 125 |
5 files changed, 147 insertions, 2 deletions
diff --git a/phpBB/config/installer/container/services.yml b/phpBB/config/installer/container/services.yml index 5626724dd0..401451cfc0 100644 --- a/phpBB/config/installer/container/services.yml +++ b/phpBB/config/installer/container/services.yml @@ -32,6 +32,15 @@ services: - @filesystem - %core.root_path% + kernel_exception_subscriber: + class: phpbb\install\event\kernel_exception_subscriber + arguments: + - @phpbb.installer.controller.helper + - @language + - @template + tags: + - { name: kernel.event_subscriber } + language.loader: parent: language.loader_abstract diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index 6097bd66bb..2341a12842 100644 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -82,6 +82,9 @@ $lang = array_merge($lang, array( <p>Only those databases supported on your server will be displayed.', 'ACP_LINK' => 'Take me to <a href="%1$s">the ACP</a>', + + 'INSTALL_PHPBB_IS_ALREADY_INSTALLED' => 'phpBB is already installed.', + 'INSTALL_PHPBB_IS_NOT_INSTALLED' => 'phpBB is not installed yet.' )); // Requirements translation diff --git a/phpBB/phpbb/install/controller/install.php b/phpBB/phpbb/install/controller/install.php index 8d5ff95958..0fd4e8897c 100644 --- a/phpBB/phpbb/install/controller/install.php +++ b/phpBB/phpbb/install/controller/install.php @@ -13,6 +13,7 @@ namespace phpbb\install\controller; +use phpbb\exception\http_exception; use phpbb\install\helper\install_helper; use phpbb\install\helper\navigation\navigation_provider; use Symfony\Component\HttpFoundation\StreamedResponse; @@ -97,12 +98,14 @@ class install * Controller logic * * @return Response|StreamedResponse + * + * @throws http_exception When phpBB is already installed */ public function handle() { if ($this->install_helper->is_phpbb_installed()) { - die ('phpBB is already installed'); + throw new http_exception(404, 'INSTALL_PHPBB_IS_ALREADY_INSTALLED'); } $this->template->assign_vars(array( diff --git a/phpBB/phpbb/install/controller/update.php b/phpBB/phpbb/install/controller/update.php index 5212ba7f26..6a4341710a 100644 --- a/phpBB/phpbb/install/controller/update.php +++ b/phpBB/phpbb/install/controller/update.php @@ -13,6 +13,7 @@ namespace phpbb\install\controller; +use phpbb\exception\http_exception; use phpbb\install\helper\install_helper; use phpbb\install\helper\iohandler\factory; use phpbb\install\helper\navigation\navigation_provider; @@ -93,12 +94,16 @@ class update /** * Controller entry point + * + * @return Response|StreamedResponse + * + * @throws http_exception When phpBB is not installed */ public function handle() { if (!$this->install_helper->is_phpbb_installed()) { - die ('phpBB is not installed'); + throw new http_exception(404, 'INSTALL_PHPBB_IS_NOT_INSTALLED'); } $this->template->assign_vars(array( diff --git a/phpBB/phpbb/install/event/kernel_exception_subscriber.php b/phpBB/phpbb/install/event/kernel_exception_subscriber.php new file mode 100644 index 0000000000..2e6f9ca74d --- /dev/null +++ b/phpBB/phpbb/install/event/kernel_exception_subscriber.php @@ -0,0 +1,125 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\install\event; + +use phpbb\exception\exception_interface; +use phpbb\install\controller\helper; +use phpbb\language\language; +use phpbb\template\template; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; + +/** + * Exception handler for the installer + */ +class kernel_exception_subscriber implements EventSubscriberInterface +{ + /** + * @var helper + */ + protected $controller_helper; + + /** + * @var language + */ + protected $language; + + /** + * @var template + */ + protected $template; + + /** + * Constructor + * + * @param helper $controller_helper + * @param language $language + * @param template $template + */ + public function __construct(helper $controller_helper, language $language, template $template) + { + $this->controller_helper = $controller_helper; + $this->language = $language; + $this->template = $template; + } + + /** + * This listener is run when the KernelEvents::EXCEPTION event is triggered + * + * @param GetResponseForExceptionEvent $event + */ + public function on_kernel_exception(GetResponseForExceptionEvent $event) + { + $exception = $event->getException(); + $message = $exception->getMessage(); + + if ($exception instanceof exception_interface) + { + $message = $this->language->lang_array($message, $exception->get_parameters()); + } + + if (!$event->getRequest()->isXmlHttpRequest()) + { + $this->template->assign_vars(array( + 'TITLE' => $this->language->lang('INFORMATION'), + 'BODY' => $message, + )); + + $response = $this->controller_helper->render( + 'installer_main.html', + $this->language->lang('INFORMATION'), + false, + 500 + ); + } + else + { + $data = array(); + + if (!empty($message)) + { + $data['message'] = $message; + } + + if (defined('DEBUG')) + { + $data['trace'] = $exception->getTrace(); + } + + $response = new JsonResponse($data, 500); + } + + if ($exception instanceof HttpExceptionInterface) + { + $response->setStatusCode($exception->getStatusCode()); + $response->headers->add($exception->getHeaders()); + } + + $event->setResponse($response); + } + + /** + * Returns an array of the events the object is subscribed to + * + * @return array Array of the events the object is subscribed to + */ + static public function getSubscribedEvents() + { + return array( + KernelEvents::EXCEPTION => 'on_kernel_exception', + ); + } +} |