This commit is contained in:
GitProtogen
2026-03-06 08:24:04 +01:00
parent acafa80454
commit 4b30283697
3 changed files with 29 additions and 11 deletions
Generated
+1 -1
View File
@@ -33,7 +33,7 @@
<path value="$PROJECT_DIR$/vendor/ralouphie/getallheaders" /> <path value="$PROJECT_DIR$/vendor/ralouphie/getallheaders" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="7.4"> <component name="PhpProjectSharedConfiguration" php_language_level="8.5">
<option name="suggestChangeDefaultLanguageLevel" value="false" /> <option name="suggestChangeDefaultLanguageLevel" value="false" />
</component> </component>
<component name="PhpStanOptionsConfiguration"> <component name="PhpStanOptionsConfiguration">
+6 -1
View File
@@ -26,7 +26,12 @@ class LoginController implements HttpServerInterface
$responseHead = "400"; $responseHead = "400";
$json = json_encode(["error" => "Not enough params"]); $json = json_encode(["error" => "Not enough params"]);
} }
else if (password_verify($password, Handler::class->getPasswordHash($username))) else if (!Handler::class->userExists($username) == !password_verify($password, Handler::class->getPasswordHash($username)))
{
$login = false;
$responseHead = "400";
$json = json_encode(["error" => "Bad"]);
}
if (!$login) if (!$login)
{ {
+22 -9
View File
@@ -14,24 +14,37 @@ class TokenHandler
$data[8] = chr(ord($data[8]) & 0x3f | 0x80); $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return bin2hex($data); return bin2hex($data);
} }
public static function doesUserHaveToken(string $username): bool public static function doesUserHaveToken(string $username): bool
{ {
foreach (self::$tokens as $token) { return array_any(self::$tokens, fn($token) => $token['username'] === $username);
if ($token['username'] === $username) {
return true;
}
}
return false;
} }
public static function getNewTokenForUser(string $username): string public static function getNewTokenForUser(string $username): string
{ {
$tokenBody = self::random32Characters() . str_pad(self::$iterations, 5, '0', STR_PAD_RIGHT); $tokenBody = self::random32Characters() . str_pad(self::$iterations, 5, '0');
if (self::$iterations >= 99999) { if (self::$iterations >= 99999) {
self::$iterations = 0; self::$iterations = 0;
} }
self::$tokens[] = [$username, (microtime(true) * 1000), $tokenBody]; self::$tokens[] = [$username, (microtime(true) * 1000), $tokenBody];
return self::$tokens[][0] . $tokenBody; return self::$tokens[][0] . $tokenBody;
} }
public static function getTokenOwnership(string $controlledToken): string | null
{
for ($i = 0; $i < count(self::$tokens); ++$i) {
$token = self::$tokens[$i];
if ($token[0] === $controlledToken[1] . $controlledToken[2]) {
return $token[0];
}
}
return null;
}
public static function deleteOldTokens(): void
{
for ($i = 0; $i < count(self::$tokens); ++$i) {
$token = self::$tokens[$i];
// 1 hour
if (time() - ($token[0] / 1000) > 3600) {
array_splice(self::$tokens, $i, 1);
}
}
}
} }