misuzu/public/index.php

137 lines
5 KiB
PHP
Raw Permalink Normal View History

<?php
2019-09-29 00:38:39 +02:00
namespace Misuzu;
use RuntimeException;
2024-10-05 02:40:29 +00:00
use Misuzu\Auth\{AuthTokenBuilder,AuthTokenCookie,AuthTokenInfo};
require_once __DIR__ . '/../misuzu.php';
2024-12-02 02:28:08 +00:00
if(!isset($msz) || !($msz instanceof \Misuzu\MisuzuContext))
die('Misuzu is not initialised.');
// The whole wall of shit before the router setup and dispatch should be worked away
// Lockdown things should be middleware when there's no more legacy files
ob_start();
2025-02-09 20:44:10 +00:00
if(is_file($msz->dbCtx->getMigrateLockPath())) {
http_response_code(503);
2025-01-30 14:52:01 +00:00
header('Content-Type: text/html; charset=utf-8');
header('X-Accel-Redirect: /error-503.html');
exit;
}
2025-02-09 20:44:10 +00:00
$request = \Index\Http\HttpRequest::fromRequest();
$tokenPacker = $msz->authCtx->createAuthTokenPacker();
if(filter_has_var(INPUT_COOKIE, 'msz_auth'))
$tokenInfo = $tokenPacker->unpack(filter_input(INPUT_COOKIE, 'msz_auth'));
elseif(filter_has_var(INPUT_COOKIE, 'msz_uid') && filter_has_var(INPUT_COOKIE, 'msz_sid')) {
$tokenBuilder = new AuthTokenBuilder;
$tokenBuilder->setUserId((string)filter_input(INPUT_COOKIE, 'msz_uid', FILTER_SANITIZE_NUMBER_INT));
$tokenBuilder->setSessionToken((string)filter_input(INPUT_COOKIE, 'msz_sid'));
$tokenInfo = $tokenBuilder->toInfo();
$tokenBuilder = null;
} else
$tokenInfo = AuthTokenInfo::empty();
$userInfo = null;
$sessionInfo = null;
$userInfoReal = null;
$remoteAddr = (string)filter_input(INPUT_SERVER, 'REMOTE_ADDR');
if($tokenInfo->hasUserId && $tokenInfo->hasSessionToken) {
$tokenBuilder = new AuthTokenBuilder($tokenInfo);
try {
$sessionInfo = $msz->authCtx->sessions->getSession(sessionToken: $tokenInfo->sessionToken);
2023-07-28 20:06:12 +00:00
if($sessionInfo->expired) {
$tokenBuilder->removeUserId();
$tokenBuilder->removeSessionToken();
} elseif($sessionInfo->userId === $tokenInfo->userId) {
$userInfo = $msz->usersCtx->users->getUser($tokenInfo->userId, 'id');
if($userInfo->deleted) {
$tokenBuilder->removeUserId();
$tokenBuilder->removeSessionToken();
} else {
$msz->usersCtx->users->recordUserActivity($userInfo, remoteAddr: $remoteAddr);
$msz->authCtx->sessions->recordSessionActivity(sessionInfo: $sessionInfo, remoteAddr: $remoteAddr);
if($sessionInfo->shouldBumpExpires)
$tokenBuilder->setEdited();
if($tokenInfo->hasImpersonatedUserId) {
$allowToImpersonate = $userInfo->super;
$impersonatedUserId = $tokenInfo->impersonatedUserId;
if(!$allowToImpersonate) {
2024-12-02 02:28:08 +00:00
$allowImpersonateUsers = $msz->config->getArray(sprintf('impersonate.allow.u%s', $userInfo->id));
$allowToImpersonate = in_array((string)$impersonatedUserId, $allowImpersonateUsers, true);
}
if($allowToImpersonate) {
$userInfoReal = $userInfo;
try {
$userInfo = $msz->usersCtx->users->getUser($impersonatedUserId, 'id');
} catch(RuntimeException $ex) {
$userInfo = $userInfoReal;
$userInfoReal = null;
$tokenBuilder->removeImpersonatedUserId();
}
} else $tokenBuilder->removeImpersonatedUserId();
}
}
}
} catch(RuntimeException $ex) {
$tokenBuilder->removeUserId();
$tokenBuilder->removeSessionToken();
$tokenBuilder->removeImpersonatedUserId();
$userInfo = null;
$sessionInfo = null;
$userInfoReal = null;
}
if($tokenBuilder->isEdited()) {
$tokenInfo = $tokenBuilder->toInfo();
AuthTokenCookie::apply($tokenPacker->pack($tokenInfo));
}
}
$msz->authInfo->setInfo($tokenInfo, $userInfo, $sessionInfo, $userInfoReal);
CSRF::init(
2024-12-02 02:28:08 +00:00
$msz->config->getString('csrf.secret', 'soup'),
2025-02-02 02:09:56 +00:00
($msz->authInfo->loggedIn ? $sessionInfo->token : $remoteAddr)
);
2023-09-10 00:04:53 +00:00
// order for these two currently matters i think: it shouldn't.
2025-01-29 00:25:53 +00:00
$router = $msz->createRouting($request);
2023-08-31 21:33:34 +00:00
$msz->startTemplating();
2025-02-09 23:34:28 +00:00
if($msz->domainRoles->hasRole($request->getHeaderLine('Host'), 'main')) {
2025-01-29 23:13:17 +00:00
$mszRequestPath = substr($request->path, 1);
2025-02-09 20:44:10 +00:00
$mszLegacyPathPrefix = Misuzu::PATH_PUBLIC_LEGACY . '/';
2025-01-29 00:25:53 +00:00
$mszLegacyPath = $mszLegacyPathPrefix . $mszRequestPath;
2025-01-29 00:25:53 +00:00
if(str_starts_with($mszLegacyPath, $mszLegacyPathPrefix)) {
$mszLegacyPathReal = realpath($mszLegacyPath);
if($mszLegacyPath === $mszLegacyPathReal || $mszLegacyPath === $mszLegacyPathReal . '/') {
if(str_starts_with($mszRequestPath, 'manage') && !$msz->hasManageAccess())
2025-01-29 00:25:53 +00:00
Template::throwError(403);
2025-01-29 00:25:53 +00:00
if(is_dir($mszLegacyPath))
$mszLegacyPath .= '/index.php';
2023-08-31 21:33:34 +00:00
2025-01-29 00:25:53 +00:00
if(is_file($mszLegacyPath)) {
require_once $mszLegacyPath;
return;
}
2023-09-11 20:36:20 +00:00
}
}
}
2023-09-10 00:04:53 +00:00
$router->dispatch($request);