| 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/doskocil_jservices_cz/ |
Upload File : |
<?php
/**
* GPS Instalace — auth helper
* Soubor: /auth.php
* Includuj na začátek každého admin PHP souboru.
*/
if (!defined('GPS_ADMIN_CONTEXT')) define('GPS_ADMIN_CONTEXT', true);
if (!isset($pdo)) {
require_once __DIR__ . '/config.php';
}
// Nastav session parametry před startem
session_name(SESSION_NAME);
session_set_cookie_params([
'lifetime' => 0, // cookie do zavření prohlížeče (trvalost řeší DB token)
'path' => '/',
'secure' => false, // true až bude HTTPS
'httponly' => true,
'samesite' => 'Lax',
]);
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// ------------------------------------------------------------
// Pokus o obnovení session z remember-me tokenu
// ------------------------------------------------------------
if (empty($_SESSION['uzivatel_id']) && !empty($_COOKIE['gps_remember'])) {
$token = $_COOKIE['gps_remember'];
$stmt = $pdo->prepare("
SELECT s.uzivatel_id, u.jmeno, u.prijmeni, u.email, u.username, u.role, u.tema, u.barva_kalendar, u.aktivni
FROM sessions s
JOIN uzivatele u ON u.id = s.uzivatel_id
WHERE s.token = ? AND s.vyprsi > NOW() AND u.aktivni = 1
LIMIT 1
");
$stmt->execute([hash('sha256', $token)]);
$user = $stmt->fetch();
if ($user) {
// Obnov session
$_SESSION['uzivatel_id'] = $user['uzivatel_id'];
$_SESSION['jmeno'] = $user['jmeno'];
$_SESSION['prijmeni'] = $user['prijmeni'];
$_SESSION['email'] = $user['email'];
$_SESSION['role'] = $user['role'];
$_SESSION['tema'] = $user['tema'];
$_SESSION['barva_kalendar'] = $user['barva_kalendar'];
$_SESSION['username'] = $user['username'];
// Prodluž platnost tokenu v DB (rolling window)
$pdo->prepare("
UPDATE sessions SET vyprsi = DATE_ADD(NOW(), INTERVAL 90 DAY)
WHERE token = ?
")->execute([hash('sha256', $token)]);
} else {
// Neplatný token — smaž cookie
setcookie('gps_remember', '', time() - 3600, '/', '', false, true);
}
}
// ------------------------------------------------------------
// Není přihlášen → přesměruj na login
// ------------------------------------------------------------
if (empty($_SESSION['uzivatel_id'])) {
// Pokud je to AJAX požadavek, vrať JSON
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
json_response(false, ['error' => 'Nejste přihlášen.', 'redirect' => '/admin.html'], 401);
}
redirect('/admin.html');
}
// Uživatel není aktivní
if (!empty($_SESSION['uzivatel_id'])) {
$stmt = $pdo->prepare("SELECT aktivni FROM uzivatele WHERE id = ?");
$stmt->execute([$_SESSION['uzivatel_id']]);
if (!$stmt->fetchColumn()) {
session_destroy();
redirect('/admin.html?chyba=deaktivovan');
}
}
// ------------------------------------------------------------
// Pomocné funkce pro auth
// ------------------------------------------------------------
function aktualni_uzivatel(): array {
return [
'id' => $_SESSION['uzivatel_id'],
'jmeno' => $_SESSION['jmeno'],
'prijmeni' => $_SESSION['prijmeni'],
'email' => $_SESSION['email'],
'role' => $_SESSION['role'],
'tema' => $_SESSION['tema'],
'barva_kalendar' => $_SESSION['barva_kalendar'],
];
}
function je_admin(): bool {
return ($_SESSION['role'] ?? '') === 'admin';
}
function je_majitel_nebo_admin(): bool {
return in_array($_SESSION['role'] ?? '', ['admin', 'majitel']);
}
function vyzaduj_roli(array $role): void {
if (!in_array($_SESSION['role'] ?? '', $role)) {
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
json_response(false, ['error' => 'Nedostatečná oprávnění.'], 403);
}
redirect('/admin/?chyba=opravneni');
}
}
function ma_opravneni(string $opravneni): bool {
// Admin a majitel mají vždy vše
if (je_majitel_nebo_admin()) return true;
global $pdo;
static $cache = null;
if ($cache === null) {
$stmt = $pdo->prepare("SELECT * FROM opravneni WHERE uzivatel_id = ?");
$stmt->execute([$_SESSION['uzivatel_id']]);
$cache = $stmt->fetch() ?: [];
}
return !empty($cache[$opravneni]);
}