diff --git a/auth/config.php b/auth/config.php
new file mode 100644
index 0000000..ec8be76
--- /dev/null
+++ b/auth/config.php
@@ -0,0 +1,147 @@
+ PDO::ERRMODE_EXCEPTION,
+
+ // Výsledky vrací jako asociativní pole (např. $radek['email'])
+ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+
+ // Vypne emulovné prepared statements – používáme pravé,
+ // které chrání před SQL injection na úrovni databáze
+ PDO::ATTR_EMULATE_PREPARES => false,
+];
+
+// Pokus o připojení k databázi
+try {
+ $pdo = new PDO($dsn, DB_USER, DB_PASS, $moznosti);
+} catch (PDOException $e) {
+ // Při chybě připojení zobrazíme obecnou chybovou hlášku.
+ // Detailní chybu NEZOBRAZUJEME uživateli – mohla by prozradit
+ // citlivé informace o struktuře serveru.
+ // Chybu ale zalogujeme do PHP error logu pro administrátora.
+ error_log('Chyba připojení k databázi: ' . $e->getMessage());
+ die('Nepodařilo se připojit k databázi. Zkuste to prosím později.');
+}
\ No newline at end of file
diff --git a/auth/install.php b/auth/install.php
new file mode 100644
index 0000000..11af156
--- /dev/null
+++ b/auth/install.php
@@ -0,0 +1,323 @@
+Instalace již proběhla. Pokud chceš instalaci opakovat, smaž soubor auth/install.lock. Pozor – tím přijdeš o všechna data!
');
+}
+
+// ------------------------------------------------------------
+// ZPRACOVÁNÍ FORMULÁŘE (pokud byl odeslán)
+// ------------------------------------------------------------
+
+$chyba = '';
+$uspech = false;
+
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+
+ // Načtení hodnot z formuláře
+ $email = trim($_POST['email'] ?? '');
+ $heslo = $_POST['heslo'] ?? '';
+ $heslo2 = $_POST['heslo2'] ?? '';
+
+ // Základní validace emailu
+ if (empty($email)) {
+ $chyba = 'Email nesmí být prázdný.';
+ } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
+ $chyba = 'Email není platná emailová adresa.';
+ }
+
+ // Validace hesla
+ if (empty($chyba) && empty($heslo)) {
+ $chyba = 'Heslo nesmí být prázdné.';
+ } elseif (empty($chyba) && mb_strlen($heslo) < HESLO_MIN_DELKA) {
+ $chyba = 'Heslo musí mít alespoň ' . HESLO_MIN_DELKA . ' znaků.';
+ } elseif (empty($chyba) && $heslo !== $heslo2) {
+ $chyba = 'Hesla se neshodují.';
+ }
+
+ // Pokud není chyba, spustíme instalaci
+ if (empty($chyba)) {
+
+ try {
+
+ // ------------------------------------------------
+ // VYTVOŘENÍ TABULEK
+ // ------------------------------------------------
+
+ // Tabulka uživatelů přihlašovacího systému
+ // utf8mb4 = plná podpora Unicode (diakritika, emoji)
+ $pdo->exec("
+ CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_UZIVATELE . "` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `email` VARCHAR(255) NOT NULL,
+ `heslo` VARCHAR(255) NOT NULL,
+ `admin` TINYINT(1) NOT NULL DEFAULT 0,
+ `vytvoreno` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `email` (`email`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+ ");
+
+ // Tabulka remember me tokenů
+ // selector = veřejný identifikátor pro vyhledání záznamu v DB
+ // token_hash = bcrypt hash tajného tokenu (samotný token je jen v cookie)
+ $pdo->exec("
+ CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_TOKENY . "` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `uzivatel_id` INT UNSIGNED NOT NULL,
+ `selector` VARCHAR(32) NOT NULL,
+ `token_hash` VARCHAR(255) NOT NULL,
+ `expiruje` DATETIME NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `selector` (`selector`),
+ FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+ ");
+
+ // Tabulka brute force záznamů
+ // Ukládají se neúspěšné pokusy o přihlášení
+ $pdo->exec("
+ CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_BRUTE . "` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `ip_adresa` VARCHAR(45) NOT NULL,
+ `email` VARCHAR(255) NOT NULL,
+ `cas` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ KEY `ip_adresa` (`ip_adresa`),
+ KEY `email` (`email`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+ ");
+
+ // Tabulka tokenů pro obnovu hesla
+ // Token je platný jen omezenou dobu (viz config.php)
+ $pdo->exec("
+ CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_RESET . "` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `uzivatel_id` INT UNSIGNED NOT NULL,
+ `token_hash` VARCHAR(255) NOT NULL,
+ `expiruje` DATETIME NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+ ");
+
+ // Tabulka uživatelů konkrétní služby (pokud je nastavena)
+ // Tato tabulka slouží pro data specifická pro tvůj projekt
+ // (jméno, nastavení, kontaktní údaje apod.)
+ if (DB_TABULKA_SLUZBA !== '') {
+ $pdo->exec("
+ CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_SLUZBA . "` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `uzivatel_id` INT UNSIGNED NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uzivatel_id` (`uzivatel_id`),
+ FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+ ");
+ }
+
+ // ------------------------------------------------
+ // VYTVOŘENÍ PRVNÍHO ADMIN UŽIVATELE
+ // ------------------------------------------------
+
+ $heslo_hash = password_hash($heslo, PASSWORD_DEFAULT);
+
+ $stmt = $pdo->prepare("
+ INSERT INTO `" . DB_TABULKA_UZIVATELE . "`
+ (`email`, `heslo`, `admin`)
+ VALUES
+ (:email, :heslo, 1)
+ ");
+ $stmt->execute([
+ ':email' => $email,
+ ':heslo' => $heslo_hash,
+ ]);
+
+ $novy_uzivatel_id = $pdo->lastInsertId();
+
+ // Pokud existuje tabulka služby, vytvoříme prázdný řádek
+ if (DB_TABULKA_SLUZBA !== '') {
+ $stmt2 = $pdo->prepare("
+ INSERT INTO `" . DB_TABULKA_SLUZBA . "`
+ (`uzivatel_id`)
+ VALUES
+ (:uzivatel_id)
+ ");
+ $stmt2->execute([':uzivatel_id' => $novy_uzivatel_id]);
+ }
+
+ // ------------------------------------------------
+ // VYTVOŘENÍ ZÁMKU – zabránění opakované instalaci
+ // ------------------------------------------------
+
+ file_put_contents($lock_soubor, 'Instalace proběhla: ' . date('Y-m-d H:i:s'));
+
+ $uspech = true;
+
+ } catch (PDOException $e) {
+ // Chybu zalogujeme, uživateli zobrazíme obecnou hlášku
+ error_log('Chyba při instalaci: ' . $e->getMessage());
+ $chyba = 'Při instalaci došlo k chybě databáze. Zkontroluj nastavení v config.php a PHP error log.';
+ } catch (Exception $e) {
+ error_log('Chyba při instalaci: ' . $e->getMessage());
+ $chyba = 'Při instalaci došlo k neočekávané chybě.';
+ }
+ }
+}
+
+// ------------------------------------------------------------
+// HTML VÝSTUP
+// ------------------------------------------------------------
+// Poznámka: žádné stylování – vše je záměrně prosté,
+// aby žádný prvek nebyl skrytý nebo překrytý.
+// ------------------------------------------------------------
+?>
+
+
+
+
+ Instalace –
+
+
+
+Instalace systému přihlašování
+
+
+
+
+ Instalace proběhla úspěšně!
+ Tabulky byly vytvořeny a první administrátor byl založen.
+ Byl vytvořen soubor auth/install.lock – instalaci již nelze spustit znovu.
+ Přejít na přihlášení
+
+
+
+ Tento skript vytvoří potřebné tabulky v databázi a založí prvního administrátora.
+ Spusť ho pouze jednou. Po instalaci bude zablokován souborem install.lock.
+
+
+ Chyba:
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file