4in1_ws_web/lib/admin.php
2024-03-09 03:00:48 +00:00

150 lines
3.7 KiB
PHP

<?php
const ADMIN_SESSION_TIMEOUT = 86400 * 14;
const ADMIN_COOKIE_NAME = 'admin_key';
const ADMIN_LOGIN_MAX_LENGTH = 32;
$AdminSession = [
'id' => null,
'auth_id' => 0,
'login' => null,
];
function is_admin(): bool {
global $AdminSession;
if ($AdminSession['id'] === null)
_admin_check();
return $AdminSession['id'] != 0;
}
function admin_current_info(): array {
global $AdminSession;
return [
'id' => $AdminSession['id'],
'login' => $AdminSession['login']
];
}
function _admin_check(): void {
if (!isset($_COOKIE[ADMIN_COOKIE_NAME]))
return;
$cookie = (string)$_COOKIE[ADMIN_COOKIE_NAME];
$db = DB();
$q = $db->query("SELECT
admin_auth.id AS auth_id,
admin_auth.admin_id AS id,
admins.login AS login
FROM admin_auth
LEFT JOIN admins ON admin_auth.admin_id=admins.id
WHERE admin_auth.token=?
LIMIT 1", $cookie);
if (!$db->numRows($q))
return;
$info = $db->fetch($q);
global $AdminSession;
$AdminSession['id'] = (int)$info['id'];
$AdminSession['login'] = $info['login'];
$AdminSession['auth_id'] = (int)$info['auth_id'];
}
function admin_exists(string $login): bool {
$db = DB();
return (int)$db->result($db->query("SELECT COUNT(*) FROM admins WHERE login=? LIMIT 1", $login)) > 0;
}
function admin_add(string $login, string $password): int {
$db = DB();
$db->insert('admins', [
'login' => $login,
'password' => salt_password($password)
]);
return $db->insertId();
}
function admin_delete(string $login): bool {
$db = DB();
$id = admin_get_id_by_login($login);
if (!$db->query("DELETE FROM admins WHERE login=?", $login)) return false;
if (!$db->query("DELETE FROM admin_auth WHERE admin_id=?", $id)) return false;
return true;
}
function admin_get_id_by_login(string $login): ?int {
$db = DB();
$q = $db->query("SELECT id FROM admins WHERE login=?", $login);
return $db->numRows($q) > 0 ? (int)$db->result($q) : null;
}
function admin_set_password(string $login, string $password): bool {
$db = DB();
$db->query("UPDATE admins SET password=? WHERE login=?", salt_password($password), $login);
return $db->affectedRows() > 0;
}
function admin_auth(string $login, string $password): bool {
global $AdminSession;
$db = DB();
$q = $db->query("SELECT id FROM admins WHERE login=? AND password=?", $login, salt_password($password));
if (!$db->numRows($q))
return false;
$id = (int)$db->result($q);
$time = time();
do {
$token = strgen(32);
} while ($db->numRows($db->query("SELECT id FROM admin_auth WHERE token=? LIMIT 1", $token)) > 0);
$db->insert('admin_auth', [
'admin_id' => $id,
'token' => $token,
'ts' => $time
]);
$db->insert('admin_log', [
'admin_id' => $id,
'ts' => $time,
'ip' => ip2ulong($_SERVER['REMOTE_ADDR']),
'ua' => $_SERVER['HTTP_USER_AGENT'] ?? '',
]);
$AdminSession = [
'id' => $id,
'login' => $login,
];
admin_set_cookie($token);
return true;
}
function admin_logout() {
if (!is_admin())
return;
global $AdminSession;
$db = DB();
$db->query("DELETE FROM admin_auth WHERE id=?", $AdminSession['auth_id']);
$AdminSession['id'] = null;
$AdminSession['login'] = null;
$AdminSession['auth_id'] = 0;
admin_unset_cookie();
}
function admin_set_cookie(string $token): void {
global $config;
setcookie(ADMIN_COOKIE_NAME, $token, time() + ADMIN_SESSION_TIMEOUT, '/', $config['cookie_host']);
}
function admin_unset_cookie(): void {
global $config;
setcookie(ADMIN_COOKIE_NAME, '', 1, '/', $config['cookie_host']);
}