Redirect insecure requests to the frontend
authorAlexander Ebert <ebert@woltlab.com>
Sat, 22 Jun 2024 17:23:51 +0000 (19:23 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 22 Jun 2024 17:23:51 +0000 (19:23 +0200)
wcfsetup/install/files/lib/http/middleware/CheckForTls.class.php [new file with mode: 0644]
wcfsetup/install/files/lib/system/request/RequestHandler.class.php

diff --git a/wcfsetup/install/files/lib/http/middleware/CheckForTls.class.php b/wcfsetup/install/files/lib/http/middleware/CheckForTls.class.php
new file mode 100644 (file)
index 0000000..8fc785d
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+namespace wcf\http\middleware;
+
+use Laminas\Diactoros\Response\RedirectResponse;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use wcf\system\request\RequestHandler;
+use wcf\system\request\RouteHandler;
+use wcf\util\HeaderUtil;
+
+/**
+ * Checks if the request is for the frontend and originates from an insecure context.
+ *
+ * @author      Alexander Ebert
+ * @copyright   2001-2024 WoltLab GmbH
+ * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @since       6.1
+ */
+final class CheckForTls implements MiddlewareInterface
+{
+    #[\Override]
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        if (RequestHandler::getInstance()->isACPRequest()) {
+            return $handler->handle($request);
+        }
+
+        if (RouteHandler::secureContext()) {
+            return $handler->handle($request);
+        }
+
+        return $this->redirectToHttps($request);
+    }
+
+    private function redirectToHttps(ServerRequestInterface $request): ResponseInterface
+    {
+        $uri = $request->getUri()->withScheme('https');
+
+        return HeaderUtil::withNoCacheHeaders(
+            new RedirectResponse($uri)
+        );
+    }
+}
index 6ce5f4261f2d81a9e009f47c0287da3c5758713a..b4c06bf17c68bf14e876fa41c41170cfaef7ceeb 100644 (file)
@@ -20,6 +20,7 @@ use wcf\http\middleware\CheckForExpiredAppEvaluation;
 use wcf\http\middleware\CheckForForceLogin;
 use wcf\http\middleware\CheckForMultifactorRequirement;
 use wcf\http\middleware\CheckForOfflineMode;
+use wcf\http\middleware\CheckForTls;
 use wcf\http\middleware\CheckHttpMethod;
 use wcf\http\middleware\CheckSystemEnvironment;
 use wcf\http\middleware\CheckUserBan;
@@ -144,6 +145,7 @@ final class RequestHandler extends SingletonFactory
                     new EnforceAcpAuthentication(),
                     new CheckForEnterpriseNonOwnerAccess(),
                     new CheckForExpiredAppEvaluation(),
+                    new CheckForTls(),
                     new CheckForOfflineMode(),
                     new CheckForForceLogin(),
                     new CheckForMultifactorRequirement(),