3 namespace Shaarli\Front
;
5 use Shaarli\Container\ShaarliContainer
;
6 use Shaarli\Front\Exception\UnauthorizedException
;
8 use Slim\Http\Response
;
11 * Class ShaarliMiddleware
13 * This will be called before accessing any Shaarli controller.
15 class ShaarliMiddleware
17 /** @var ShaarliContainer contains all Shaarli DI */
20 public function __construct(ShaarliContainer
$container)
22 $this->container
= $container;
26 * Middleware execution:
28 * - if not logged in open shaarli, redirect to login
29 * - execute the controller
30 * - return the response
32 * In case of error, the error template will be displayed with the exception message.
34 * @param Request $request Slim request
35 * @param Response $response Slim response
36 * @param callable $next Next action
38 * @return Response response.
40 public function __invoke(Request
$request, Response
$response, callable
$next): Response
42 $this->initBasePath($request);
45 if (!is_file($this->container
->conf
->getConfigFileExt())
46 && !in_array($next->getName(), ['displayInstall', 'saveInstall'], true)
48 return $response->withRedirect($this->container
->basePath
. '/install');
52 $this->checkOpenShaarli($request, $response, $next);
54 return $next($request, $response);
55 } catch (UnauthorizedException
$e) {
56 $returnUrl = urlencode($this->container
->environment
['REQUEST_URI']);
58 return $response->withRedirect($this->container
->basePath
. '/login?returnurl=' . $returnUrl);
60 // Other exceptions are handled by ErrorController
64 * Run the updater for every requests processed while logged in.
66 protected function runUpdates(): void
68 if ($this->container
->loginManager
->isLoggedIn() !== true) {
72 $this->container
->updater
->setBasePath($this->container
->basePath
);
73 $newUpdates = $this->container
->updater
->update();
74 if (!empty($newUpdates)) {
75 $this->container
->updater
->writeUpdates(
76 $this->container
->conf
->get('resource.updates'),
77 $this->container
->updater
->getDoneUpdates()
80 $this->container
->pageCacheManager
->invalidateCaches();
85 * Access is denied to most pages with `hide_public_links` + `force_login` settings.
87 protected function checkOpenShaarli(Request
$request, Response
$response, callable
$next): bool
89 if (// if the user isn't logged in
90 !$this->container
->loginManager
->isLoggedIn()
91 // and Shaarli doesn't have public content...
92 && $this->container
->conf
->get('privacy.hide_public_links')
93 // and is configured to enforce the login
94 && $this->container
->conf
->get('privacy.force_login')
95 // and the current page isn't already the login page
96 // and the user is not requesting a feed (which would lead to a different content-type as expected)
97 && !in_array($next->getName(), ['login', 'processLogin', 'atom', 'rss'], true)
99 throw new UnauthorizedException();
106 * Initialize the URL base path if it hasn't been defined yet.
108 protected function initBasePath(Request
$request): void
110 if (null === $this->container
->basePath
) {
111 $this->container
->basePath
= rtrim($request->getUri()->getBasePath(), '/');