PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); } function adminer_app_bootstrap() { $pdo = adminer_app_pdo(); // Minimal users table $pdo->exec( 'CREATE TABLE IF NOT EXISTS adminer_users (' . 'id INT AUTO_INCREMENT PRIMARY KEY,' . 'username VARCHAR(190) NOT NULL UNIQUE,' . 'password_hash VARCHAR(255) NOT NULL,' . 'created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP' . ') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4' ); // Optional: auto-seed from .env ADMINER_APP_SEED_USER/PASS $vars = env_load(dirname(__DIR__) . '/.env'); $seedUser = env_get($vars, 'ADMINER_APP_SEED_USER', ''); $seedPass = env_get($vars, 'ADMINER_APP_SEED_PASS', ''); if ($seedUser !== '' && $seedPass !== '') { $stmt = $pdo->prepare('SELECT id FROM adminer_users WHERE username = ?'); $stmt->execute([$seedUser]); $exists = (bool)$stmt->fetchColumn(); if (!$exists) { $hash = password_hash($seedPass, PASSWORD_DEFAULT); $ins = $pdo->prepare('INSERT INTO adminer_users (username, password_hash) VALUES (?, ?)'); $ins->execute([$seedUser, $hash]); } } } function adminer_app_is_logged_in() { adminer_app_session_start(); return !empty($_SESSION['adminer_app']['ok']); } function adminer_app_logout() { adminer_app_session_start(); unset($_SESSION['adminer_app']); } function adminer_app_try_login($username, $password) { $username = trim((string)$username); $password = (string)$password; if ($username === '' || $password === '') { return ['ok' => false, 'error' => 'Bitte Benutzername und Passwort eingeben.']; } $pdo = adminer_app_pdo(); $stmt = $pdo->prepare('SELECT id, password_hash FROM adminer_users WHERE username = ?'); $stmt->execute([$username]); $row = $stmt->fetch(); if (!$row || empty($row['password_hash']) || !password_verify($password, (string)$row['password_hash'])) { return ['ok' => false, 'error' => 'Login fehlgeschlagen.']; } adminer_app_session_start(); $_SESSION['adminer_app'] = [ 'ok' => true, 'username' => $username, 'uid' => (int)$row['id'], ]; return ['ok' => true, 'error' => null]; }