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'] ?? ''; // 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í (IP adresa, email, čas) $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 jednorázový a platí 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 v config.php) // Tato tabulka slouží pro data specifická pro tvůj projekt. // Zatím obsahuje jen vazbu na auth_users – sloupce si přidáš sám. 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 zahashujeme pomocí bcrypt – nikdy neukládáme plaintext! $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 k novému uživateli 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 – <?php echo htmlspecialchars(PROJEKT_NAZEV); ?>

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:




Síla hesla: zadej heslo


(čekám na dostatečně silné heslo)