From f3b3b6683ca90b70ec4d4daae002dc0caac9ebdd Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sat, 11 Aug 2018 23:46:28 +0200 Subject: Added middleware tests --- src/Middleware/Dispatcher.php | 6 +- src/Middleware/LegacyMiddleware.php | 356 +++++++++++++++++---------------- src/Middleware/NotFoundResponse.php | 19 +- src/Middleware/SendResponseHandler.php | 30 ++- 4 files changed, 228 insertions(+), 183 deletions(-) (limited to 'src/Middleware') diff --git a/src/Middleware/Dispatcher.php b/src/Middleware/Dispatcher.php index 774040fb..f2a5b5d5 100644 --- a/src/Middleware/Dispatcher.php +++ b/src/Middleware/Dispatcher.php @@ -12,7 +12,7 @@ use Psr\Http\Server\RequestHandlerInterface; class Dispatcher implements MiddlewareInterface, RequestHandlerInterface { - /** @var MiddlewareInterface[] */ + /** @var MiddlewareInterface[]|string[] */ protected $stack; /** @var Application */ @@ -22,8 +22,8 @@ class Dispatcher implements MiddlewareInterface, RequestHandlerInterface protected $next; /** - * @param MiddlewareInterface[] $stack - * @param Application|null $container + * @param MiddlewareInterface[]|string[] $stack + * @param Application|null $container */ public function __construct($stack = [], Application $container = null) { diff --git a/src/Middleware/LegacyMiddleware.php b/src/Middleware/LegacyMiddleware.php index 41b2e471..714141de 100644 --- a/src/Middleware/LegacyMiddleware.php +++ b/src/Middleware/LegacyMiddleware.php @@ -3,6 +3,7 @@ namespace Engelsystem\Middleware; use Engelsystem\Http\Request; +use Engelsystem\Http\Response; use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -61,10 +62,6 @@ class LegacyMiddleware implements MiddlewareInterface /** @var Request $appRequest */ $appRequest = $this->container->get('request'); - - // Default page content - $content = ''; - $page = $appRequest->query->get('p'); if (empty($page)) { $page = $appRequest->path(); @@ -74,187 +71,202 @@ class LegacyMiddleware implements MiddlewareInterface $page = isset($user) ? 'news' : 'login'; } + $title = $content = ''; if ( - preg_match('/^\w+$/i', $page) + preg_match('~^\w+$~i', $page) && ( in_array($page, $this->free_pages) || (isset($privileges) && in_array($page, $privileges)) ) ) { - $title = $page; - - switch ($page) { - case 'api': - error('Api disabled temporarily.'); - redirect(page_link_to()); - break; - case 'ical': - require_once realpath(__DIR__ . '/../includes/pages/user_ical.php'); - user_ical(); - break; - case 'atom': - require_once realpath(__DIR__ . '/../includes/pages/user_atom.php'); - user_atom(); - break; - case 'shifts_json_export': - require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); - shifts_json_export_controller(); - break; - case 'shifts_json_export_all': - require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); - shifts_json_export_all_controller(); - break; - case 'stats': - require_once realpath(__DIR__ . '/../includes/pages/guest_stats.php'); - guest_stats(); - break; - case 'user_password_recovery': - require_once realpath(__DIR__ . '/../includes/controller/users_controller.php'); - $title = user_password_recovery_title(); - $content = user_password_recovery_controller(); - break; - case 'public_dashboard': - list($title, $content) = public_dashboard_controller(); - break; - case 'angeltypes': - list($title, $content) = angeltypes_controller(); - break; - case 'shift_entries': - list($title, $content) = shift_entries_controller(); - break; - case 'shifts': - list($title, $content) = shifts_controller(); - break; - case 'users': - list($title, $content) = users_controller(); - break; - case 'user_angeltypes': - list($title, $content) = user_angeltypes_controller(); - break; - case 'user_driver_licenses': - list($title, $content) = user_driver_licenses_controller(); - break; - case 'shifttypes': - list($title, $content) = shifttypes_controller(); - break; - case 'admin_event_config': - list($title, $content) = event_config_edit_controller(); - break; - case 'rooms': - list($title, $content) = rooms_controller(); - break; - case 'news': - $title = news_title(); - $content = user_news(); - break; - case 'news_comments': - require_once realpath(__DIR__ . '/../includes/pages/user_news.php'); - $title = user_news_comments_title(); - $content = user_news_comments(); - break; - case 'user_meetings': - $title = meetings_title(); - $content = user_meetings(); - break; - case 'user_myshifts': - $title = myshifts_title(); - $content = user_myshifts(); - break; - case 'user_shifts': - $title = shifts_title(); - $content = user_shifts(); - break; - case 'user_worklog': - list($title, $content) = user_worklog_controller(); - break; - case 'user_messages': - $title = messages_title(); - $content = user_messages(); - break; - case 'user_questions': - $title = questions_title(); - $content = user_questions(); - break; - case 'user_settings': - $title = settings_title(); - $content = user_settings(); - break; - case 'login': - $title = login_title(); - $content = guest_login(); - break; - case 'register': - $title = register_title(); - $content = guest_register(); - break; - case 'logout': - $title = logout_title(); - $content = guest_logout(); - break; - case 'admin_questions': - $title = admin_questions_title(); - $content = admin_questions(); - break; - case 'admin_user': - $title = admin_user_title(); - $content = admin_user(); - break; - case 'admin_arrive': - $title = admin_arrive_title(); - $content = admin_arrive(); - break; - case 'admin_active': - $title = admin_active_title(); - $content = admin_active(); - break; - case 'admin_free': - $title = admin_free_title(); - $content = admin_free(); - break; - case 'admin_news': - require_once realpath(__DIR__ . '/../includes/pages/admin_news.php'); - $content = admin_news(); - break; - case 'admin_rooms': - $title = admin_rooms_title(); - $content = admin_rooms(); - break; - case 'admin_groups': - $title = admin_groups_title(); - $content = admin_groups(); - break; - case 'admin_import': - $title = admin_import_title(); - $content = admin_import(); - break; - case 'admin_shifts': - $title = admin_shifts_title(); - $content = admin_shifts(); - break; - case 'admin_log': - $title = admin_log_title(); - $content = admin_log(); - break; - case 'credits': - require_once realpath(__DIR__ . '/../includes/pages/guest_credits.php'); - $title = credits_title(); - $content = guest_credits(); - break; - default: - require_once realpath(__DIR__ . '/../includes/pages/guest_start.php'); - $content = guest_start(); - break; - } - } else { - return $handler->handle($request); + list($title, $content) = $this->loadPage($page); } if (empty($title) and empty($content)) { return $handler->handle($request); } - $event_config = EventConfig(); + return $this->renderPage($page, $title, $content); + } + + /** + * Get the legacy page content and title + * + * @param string $page + * @return array ['title', 'content'] + * @codeCoverageIgnore + */ + protected function loadPage($page) + { + $title = ucfirst($page); + switch ($page) { + /** @noinspection PhpMissingBreakStatementInspection */ + case 'api': + error('Api disabled temporarily.'); + redirect(page_link_to()); + /** @noinspection PhpMissingBreakStatementInspection */ + case 'ical': + require_once realpath(__DIR__ . '/../../includes/pages/user_ical.php'); + user_ical(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 'atom': + require_once realpath(__DIR__ . '/../../includes/pages/user_atom.php'); + user_atom(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 'shifts_json_export': + require_once realpath(__DIR__ . '/../../includes/controller/shifts_controller.php'); + shifts_json_export_controller(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 'shifts_json_export_all': + require_once realpath(__DIR__ . '/../../includes/controller/shifts_controller.php'); + shifts_json_export_all_controller(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 'stats': + require_once realpath(__DIR__ . '/../../includes/pages/guest_stats.php'); + guest_stats(); + case 'user_password_recovery': + require_once realpath(__DIR__ . '/../../includes/controller/users_controller.php'); + $title = user_password_recovery_title(); + $content = user_password_recovery_controller(); + return [$title, $content]; + case 'public_dashboard': + return public_dashboard_controller(); + case 'angeltypes': + return angeltypes_controller(); + case 'shift_entries': + return shift_entries_controller(); + case 'shifts': + return shifts_controller(); + case 'users': + return users_controller(); + case 'user_angeltypes': + return user_angeltypes_controller(); + case 'user_driver_licenses': + return user_driver_licenses_controller(); + case 'shifttypes': + list($title, $content) = shifttypes_controller(); + return [$title, $content]; + case 'admin_event_config': + list($title, $content) = event_config_edit_controller(); + return [$title, $content]; + case 'rooms': + return rooms_controller(); + case 'news': + $title = news_title(); + $content = user_news(); + return [$title, $content]; + case 'news_comments': + require_once realpath(__DIR__ . '/../../includes/pages/user_news.php'); + $title = user_news_comments_title(); + $content = user_news_comments(); + return [$title, $content]; + case 'user_meetings': + $title = meetings_title(); + $content = user_meetings(); + return [$title, $content]; + case 'user_myshifts': + $title = myshifts_title(); + $content = user_myshifts(); + return [$title, $content]; + case 'user_shifts': + $title = shifts_title(); + $content = user_shifts(); + return [$title, $content]; + case 'user_worklog': + return user_worklog_controller(); + case 'user_messages': + $title = messages_title(); + $content = user_messages(); + return [$title, $content]; + case 'user_questions': + $title = questions_title(); + $content = user_questions(); + return [$title, $content]; + case 'user_settings': + $title = settings_title(); + $content = user_settings(); + return [$title, $content]; + case 'login': + $title = login_title(); + $content = guest_login(); + return [$title, $content]; + case 'register': + $title = register_title(); + $content = guest_register(); + return [$title, $content]; + case 'logout': + $title = logout_title(); + $content = guest_logout(); + return [$title, $content]; + case 'admin_questions': + $title = admin_questions_title(); + $content = admin_questions(); + return [$title, $content]; + case 'admin_user': + $title = admin_user_title(); + $content = admin_user(); + return [$title, $content]; + case 'admin_arrive': + $title = admin_arrive_title(); + $content = admin_arrive(); + return [$title, $content]; + case 'admin_active': + $title = admin_active_title(); + $content = admin_active(); + return [$title, $content]; + case 'admin_free': + $title = admin_free_title(); + $content = admin_free(); + return [$title, $content]; + case 'admin_news': + require_once realpath(__DIR__ . '/../../includes/pages/admin_news.php'); + $content = admin_news(); + return [$title, $content]; + case 'admin_rooms': + $title = admin_rooms_title(); + $content = admin_rooms(); + return [$title, $content]; + case 'admin_groups': + $title = admin_groups_title(); + $content = admin_groups(); + return [$title, $content]; + case 'admin_import': + $title = admin_import_title(); + $content = admin_import(); + return [$title, $content]; + case 'admin_shifts': + $title = admin_shifts_title(); + $content = admin_shifts(); + return [$title, $content]; + case 'admin_log': + $title = admin_log_title(); + $content = admin_log(); + return [$title, $content]; + case 'credits': + require_once realpath(__DIR__ . '/../../includes/pages/guest_credits.php'); + $title = credits_title(); + $content = guest_credits(); + return [$title, $content]; + } + require_once realpath(__DIR__ . '/../../includes/pages/guest_start.php'); + $content = guest_start(); + return [$title, $content]; + } + + /** + * Render the template + * + * @param string $page + * @param string $title + * @param string $content + * @return Response + * @codeCoverageIgnore + */ + protected function renderPage($page, $title, $content) + { + global $user; + $event_config = EventConfig(); $parameters = [ 'key' => (isset($user) ? $user['api_key'] : ''), ]; diff --git a/src/Middleware/NotFoundResponse.php b/src/Middleware/NotFoundResponse.php index c5d51d2d..f9431c1d 100644 --- a/src/Middleware/NotFoundResponse.php +++ b/src/Middleware/NotFoundResponse.php @@ -2,6 +2,7 @@ namespace Engelsystem\Middleware; +use Engelsystem\Http\Response; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -22,12 +23,20 @@ class NotFoundResponse implements MiddlewareInterface ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { + $info = _('This page could not be found or you don\'t have permission to view it. You probably have to sign in or register in order to gain access!'); + + return $this->renderPage($info); + } + + /** + * @param string $content + * @return Response + * @codeCoverageIgnore + */ + protected function renderPage($content) + { global $user; $event_config = EventConfig(); - $content = info( - _('This page could not be found or you don\'t have permission to view it. You probably have to sign in or register in order to gain access!'), - true - ); return response(view(__DIR__ . '/../../templates/layout.html', [ 'theme' => isset($user) ? $user['color'] : config('theme'), @@ -36,7 +45,7 @@ class NotFoundResponse implements MiddlewareInterface 'start_page_url' => page_link_to('/'), 'credits_url' => page_link_to('credits'), 'menu' => make_menu(), - 'content' => msg() . $content, + 'content' => msg() . info($content), 'header_toolbar' => header_toolbar(), 'faq_url' => config('faq_url'), 'contact_email' => config('contact_email'), diff --git a/src/Middleware/SendResponseHandler.php b/src/Middleware/SendResponseHandler.php index 06406fe0..34e70a87 100644 --- a/src/Middleware/SendResponseHandler.php +++ b/src/Middleware/SendResponseHandler.php @@ -24,8 +24,8 @@ class SendResponseHandler implements MiddlewareInterface ): ResponseInterface { $response = $handler->handle($request); - if (!headers_sent()) { - header(sprintf( + if (!$this->headersSent()) { + $this->sendHeader(sprintf( 'HTTP/%s %s %s', $response->getProtocolVersion(), $response->getStatusCode(), @@ -34,7 +34,7 @@ class SendResponseHandler implements MiddlewareInterface foreach ($response->getHeaders() as $name => $values) { foreach ($values as $value) { - header($name . ': ' . $value, false); + $this->sendHeader($name . ': ' . $value, false); } } } @@ -42,4 +42,28 @@ class SendResponseHandler implements MiddlewareInterface echo $response->getBody(); return $response; } + + /** + * Checks if headers have been sent + * + * @return bool + * @codeCoverageIgnore + */ + protected function headersSent() + { + return headers_sent(); + } + + /** + * Send a raw HTTP header + * + * @param string $content + * @param bool $replace + * @param int $code + * @codeCoverageIgnore + */ + protected function sendHeader($content, $replace = true, $code = null) + { + header($content, $replace, $code); + } } -- cgit v1.2.3-54-g00ecf