| Server IP : 193.86.120.172 / Your IP : 216.73.216.67 Web Server : Apache/2.4.63 (Unix) System : Linux JServices 3.10.108 #86003 SMP Wed Oct 22 13:20:46 CST 2025 x86_64 User : kubec ( 1026) PHP Version : 8.2.28 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /volume1/web/hotel_jservices_cz/api/ |
Upload File : |
<?php
// ============================================================
// Hotel DEMO — api/auth.php
// Akce: login, logout, check, zmena-hesla
// ============================================================
$action = $_GET['action'] ?? $_POST['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
match ($action) {
'login' => auth_login($input),
'logout' => auth_logout(),
'check' => auth_check_session(),
default => api_response(false, null, 'Neznámá akce', 400),
};
// ------------------------------------------------------------
// LOGIN
// ------------------------------------------------------------
function auth_login(array $input): never {
$login = trim($input['login'] ?? '');
$heslo = $input['heslo'] ?? '';
$zapamatovat = !empty($input['zapamatovat']);
if (!$login || !$heslo) {
api_response(false, null, 'Vyplňte přihlašovací jméno a heslo.', 400);
}
$user = db_row(
'SELECT id, jmeno, prijmeni, login, email, role, heslo_hash, aktivni, zmena_hesla_zakaz
FROM uzivatele WHERE login = ?',
[$login]
);
if (!$user || !password_verify($heslo, $user['heslo_hash'])) {
api_response(false, null, 'Nesprávné přihlašovací jméno nebo heslo.', 401);
}
if (!$user['aktivni']) {
api_response(false, null, 'Tento účet je zablokován. Kontaktujte správce.', 403);
}
// Smazat staré session tokeny tohoto uživatele (max 5 aktivních)
db_query(
'DELETE FROM uzivatel_session WHERE uzivatel_id = ? AND platnost_do < NOW()',
[$user['id']]
);
// Nový token
$token = bin2hex(random_bytes(32));
$ttl = $zapamatovat ? SESSION_TTL_LONG : SESSION_TTL_SHORT;
$expiry = date('Y-m-d H:i:s', time() + $ttl);
db_query(
'INSERT INTO uzivatel_session (uzivatel_id, token, zapamatovat, platnost_do)
VALUES (?, ?, ?, ?)',
[$user['id'], $token, $zapamatovat ? 1 : 0, $expiry]
);
// Aktualizace posledního přihlášení
db_query(
'UPDATE uzivatele SET posl_prihlaseni = NOW() WHERE id = ?',
[$user['id']]
);
// Cookie — HttpOnly, SameSite=Strict
$cookie_opts = [
'expires' => $zapamatovat ? time() + $ttl : 0,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict',
];
setcookie('session_token', $token, $cookie_opts);
// Načtení oprávnění (pro zaměstnance)
$opravneni = [];
if ($user['role'] === 'zamestnanec') {
$rows = db_rows(
'SELECT opravneni, povoleno FROM uzivatel_opravneni WHERE uzivatel_id = ?',
[$user['id']]
);
foreach ($rows as $r) {
$opravneni[$r['opravneni']] = (bool)$r['povoleno'];
}
}
api_response(true, [
'token' => $token,
'zapamatovat' => $zapamatovat,
'user' => [
'id' => $user['id'],
'jmeno' => $user['jmeno'],
'prijmeni' => $user['prijmeni'],
'login' => $user['login'],
'role' => $user['role'],
'zmena_hesla_zakaz'=> (bool)$user['zmena_hesla_zakaz'],
],
'opravneni' => $opravneni,
]);
}
// ------------------------------------------------------------
// LOGOUT
// ------------------------------------------------------------
function auth_logout(): never {
$token = $_COOKIE['session_token'] ?? $_SERVER['HTTP_X_SESSION_TOKEN'] ?? '';
if ($token) {
db_query('DELETE FROM uzivatel_session WHERE token = ?', [$token]);
}
// Smazat cookie
setcookie('session_token', '', [
'expires' => time() - 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict',
]);
api_response(true, null, '');
}
// ------------------------------------------------------------
// CHECK SESSION (volá se při každém otevření adminu)
// ------------------------------------------------------------
function auth_check_session(): never {
$token = $_COOKIE['session_token'] ?? $_SERVER['HTTP_X_SESSION_TOKEN'] ?? '';
if (!$token) {
api_response(false, null, 'Nepřihlášen', 401);
}
$row = db_row(
'SELECT s.zapamatovat, s.platnost_do,
u.id, u.jmeno, u.prijmeni, u.login, u.email,
u.role, u.aktivni, u.zmena_hesla_zakaz
FROM uzivatel_session s
JOIN uzivatele u ON u.id = s.uzivatel_id
WHERE s.token = ? AND s.platnost_do > NOW()',
[$token]
);
if (!$row || !$row['aktivni']) {
// Smazat expirovanou cookie
setcookie('session_token', '', [
'expires' => time() - 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict',
]);
api_response(false, null, 'Relace vypršela', 401);
}
// Prodloužení platnosti
$ttl = $row['zapamatovat'] ? SESSION_TTL_LONG : SESSION_TTL_SHORT;
db_query(
'UPDATE uzivatel_session SET platnost_do = DATE_ADD(NOW(), INTERVAL ? SECOND) WHERE token = ?',
[$ttl, $token]
);
// Oprávnění pro zaměstnance
$opravneni = [];
if ($row['role'] === 'zamestnanec') {
// Doplnit chybějící oprávnění (pro starší účty)
$vsechna_opravneni = ['kartoteka', 'hodnoceni', 'trzby', 'statistiky_modul', 'storno_rezervace', 'zmena_rezervace', 'zmena_terminu', 'potvrzeni_rezervace'];
foreach ($vsechna_opravneni as $op) {
db_query(
'INSERT IGNORE INTO uzivatel_opravneni (uzivatel_id, opravneni, povoleno) VALUES (?, ?, 0)',
[$row['id'], $op]
);
}
$rows = db_rows(
'SELECT opravneni, povoleno FROM uzivatel_opravneni WHERE uzivatel_id = ?',
[$row['id']]
);
foreach ($rows as $r) {
$opravneni[$r['opravneni']] = (bool)$r['povoleno'];
}
}
api_response(true, [
'user' => [
'id' => $row['id'],
'jmeno' => $row['jmeno'],
'prijmeni' => $row['prijmeni'],
'login' => $row['login'],
'role' => $row['role'],
'zmena_hesla_zakaz'=> (bool)$row['zmena_hesla_zakaz'],
],
'opravneni' => $opravneni,
]);
}