$driver]; if ($driver === 'sqlite') return $cfg; if ($driver === 'pgsql') { $cfg['db_host'] = trim((string)($_POST['db_host_pg'] ?? $_POST['db_host'] ?? 'localhost')) ?: 'localhost'; $cfg['db_port'] = trim((string)($_POST['db_port_pg'] ?? $_POST['db_port'] ?? '5432')); $cfg['db_name'] = trim((string)($_POST['db_name_pg'] ?? $_POST['db_name'] ?? 'bastionguard_webui')) ?: 'bastionguard_webui'; $cfg['db_user'] = trim((string)($_POST['db_user_pg'] ?? $_POST['db_user'] ?? '')); $cfg['db_pass'] = (string)($_POST['db_pass_pg'] ?? $_POST['db_pass'] ?? ''); $cfg['db_maintenance'] = trim((string)($_POST['db_maintenance_pg'] ?? $_POST['db_maintenance'] ?? 'postgres')) ?: 'postgres'; } else { $cfg['db_host'] = trim((string)($_POST['db_host'] ?? 'localhost')) ?: 'localhost'; $cfg['db_port'] = trim((string)($_POST['db_port'] ?? '3306')); $cfg['db_name'] = trim((string)($_POST['db_name'] ?? 'bastionguard_webui')) ?: 'bastionguard_webui'; $cfg['db_user'] = trim((string)($_POST['db_user'] ?? '')); $cfg['db_pass'] = (string)($_POST['db_pass'] ?? ''); } return $cfg; } function bg_setup_mysql_dsn(array $cfg, $withDb = false) { $dsn = 'mysql:host=' . $cfg['db_host']; if (!empty($cfg['db_port'])) $dsn .= ';port=' . (int)$cfg['db_port']; if ($withDb) $dsn .= ';dbname=' . $cfg['db_name']; return $dsn . ';charset=utf8mb4'; } function bg_setup_pgsql_dsn(array $cfg, $dbname) { $dsn = 'pgsql:host=' . $cfg['db_host']; if (!empty($cfg['db_port'])) $dsn .= ';port=' . (int)$cfg['db_port']; $dsn .= ';dbname=' . $dbname; return $dsn; } function bg_setup_pg_ident($name) { return '"' . str_replace('"', '""', (string)$name) . '"'; } function bg_setup_validate_db(array $cfg) { $driver = bg_setup_normalize_driver($cfg['driver'] ?? 'sqlite'); $cfg['driver'] = $driver; if ($driver === 'sqlite') { if (!bg_setup_pdo_has_driver('sqlite')) throw new RuntimeException(bg_t('setup_sqlite_unavailable')); $dir = __DIR__ . '/db'; if (!is_dir($dir) && !@mkdir($dir, 0750, true)) throw new RuntimeException(bg_t('setup_sqlite_dir_error')); if (!is_writable($dir)) throw new RuntimeException(bg_t('setup_sqlite_dir_not_writable')); return $cfg; } if ($driver === 'mysql') { if (!bg_setup_pdo_has_driver('mysql')) throw new RuntimeException(bg_t('setup_mysql_unavailable')); if (($cfg['db_user'] ?? '') === '') throw new RuntimeException(bg_t('setup_missing_db_user')); $pdo = new PDO(bg_setup_mysql_dsn($cfg, false), $cfg['db_user'], $cfg['db_pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $quoted = '`' . str_replace('`', '``', $cfg['db_name']) . '`'; $pdo->exec('CREATE DATABASE IF NOT EXISTS ' . $quoted . ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'); new PDO(bg_setup_mysql_dsn($cfg, true), $cfg['db_user'], $cfg['db_pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); return $cfg; } if (!bg_setup_pdo_has_driver('pgsql')) throw new RuntimeException(bg_t('setup_pgsql_unavailable')); if (($cfg['db_user'] ?? '') === '') throw new RuntimeException(bg_t('setup_missing_db_user')); $maintenance = $cfg['db_maintenance'] ?? 'postgres'; $createdOrFound = false; try { $admin = new PDO(bg_setup_pgsql_dsn($cfg, $maintenance), $cfg['db_user'], $cfg['db_pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $stmt = $admin->prepare('SELECT 1 FROM pg_database WHERE datname = ?'); $stmt->execute([$cfg['db_name']]); if (!$stmt->fetchColumn()) { $admin->exec('CREATE DATABASE ' . bg_setup_pg_ident($cfg['db_name']) . " WITH ENCODING 'UTF8'"); } $createdOrFound = true; } catch (Throwable $e) { // Some PostgreSQL roles cannot connect to the maintenance database or cannot create DBs. // In that case an already-created target database is still valid. } try { $target = new PDO(bg_setup_pgsql_dsn($cfg, $cfg['db_name']), $cfg['db_user'], $cfg['db_pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $target->exec("SET client_encoding TO 'UTF8'"); return $cfg; } catch (Throwable $e) { if ($createdOrFound) throw new RuntimeException(bg_t('setup_pgsql_connect_created_error', ['message' => $e->getMessage()])); throw new RuntimeException(bg_t('setup_pgsql_connect_error', ['message' => $e->getMessage()])); } } function bg_setup_build_config(array $dbCfg, $webUser) { $driver = bg_setup_normalize_driver($dbCfg['driver'] ?? 'sqlite'); $cfg = " $e->getMessage()]); $setupStep = 1; $dbSession = $dbCfg; } } elseif ($action === 'complete_setup') { $dbCfg = isset($_SESSION['bg_setup_db']) && is_array($_SESSION['bg_setup_db']) ? $_SESSION['bg_setup_db'] : null; $setupStep = 2; if (!$dbCfg) { $errors[] = bg_t('setup_database_required'); $setupStep = 1; } else { $desktop_user = trim((string)($_POST['desktop_user'] ?? $desktop_user)); $username = trim((string)($_POST['username'] ?? '')); $admin_email = trim((string)($_POST['admin_email'] ?? '')); $password = (string)($_POST['password'] ?? ''); $confirm = (string)($_POST['confirm'] ?? ''); $web_user = trim((string)($_POST['web_user'] ?? 'www-data')) ?: 'www-data'; $desktopMode = bg_desktop_mode_status($desktop_user ?: null); $setupConfigScan = bg_config_scan_dir($desktop_user ?: null); $setupWizardStatus = bg_wizard_config_status($desktop_user ?: null); $setupWizardLock = bg_wizard_lock_status($desktop_user ?: null, $setupConfigScan, $setupWizardStatus, $desktopMode); if ($username === '' || $password === '' || $password !== $confirm) $errors[] = bg_t('setup_validation_admin_fields'); if ($admin_email !== '' && !filter_var($admin_email, FILTER_VALIDATE_EMAIL)) $errors[] = bg_t('invalid_email_address'); if (strlen($password) < 8) $errors[] = bg_t('setup_validation_password_len'); if (!$errors) { try { $dbCfg = bg_setup_validate_db($dbCfg); $cfg = bg_setup_build_config($dbCfg, $web_user); $authCfg = __DIR__ . '/includes/webui_config.php'; if (@file_put_contents($authCfg, $cfg, LOCK_EX) === false) throw new RuntimeException(bg_t('setup_write_config_error')); @chmod($authCfg, 0640); require $authCfg; bg_create_user($username, $password, 'admin', $admin_email); $_SESSION['user'] = $username; $_SESSION['role'] = 'admin'; unset($_SESSION['bg_setup_db']); $opts = bg_web_options(); if ($desktop_user !== '') $opts['desktop_user'] = $desktop_user; unset($opts['language'], $opts['theme']); bg_write_json('web_options.json', $opts); $messages[] = bg_t('setup_success_config_created'); $sudoers = []; $sudoers[] = '# BastionGuard WebUI - helper based sudoers. Check with: visudo -cf /etc/sudoers.d/bastionguard-webui'; $sudoers[] = '# Prefer running: sudo bash scripts/install-webui-helpers.sh "$USER"'; $sudoers[] = 'Cmnd_Alias BASTIONGUARD_WEBUI_SYSTEMCTL = /usr/local/sbin/bastionguard-webui-systemctl user ' . ($desktop_user ?: '') . ' *'; $sudoers[] = 'Cmnd_Alias BASTIONGUARD_WEBUI_ADMIN = /usr/local/sbin/bastionguard-webui-admin *'; $sudoers[] = 'Cmnd_Alias BASTIONGUARD_WEBUI_WIZARD = /usr/local/sbin/bastionguard-webui-wizard *'; $sudoers[] = $web_user . ' ALL=(root) NOPASSWD: BASTIONGUARD_WEBUI_SYSTEMCTL, BASTIONGUARD_WEBUI_ADMIN, BASTIONGUARD_WEBUI_WIZARD'; $local = __DIR__ . '/bastionguard-webui.sudo'; @file_put_contents($local, implode("\n", $sudoers) . "\n", LOCK_EX); @chmod($local, 0640); $messages[] = bg_t('setup_success_sudoers_generated', ['path' => $local]); $messages[] = bg_t('setup_success_next_wizard'); $setupDone = true; $setupStep = 3; $wizardStatus = bg_wizard_config_status($desktop_user ?: null); $setupConfigScan = bg_config_scan_dir($desktop_user ?: null); $setupWizardLock = bg_wizard_lock_status($desktop_user ?: null, $setupConfigScan, $wizardStatus, bg_desktop_mode_status($desktop_user ?: null)); $nextUrl = (!empty($setupWizardLock['locked']) || !empty($wizardStatus['exists'])) ? 'dashboard.php' : 'wizard.php?first=1&from_setup=1'; header('Refresh:2; url=' . $nextUrl); } catch (Throwable $e) { @unlink(__DIR__ . '/includes/webui_config.php'); $errors[] = bg_t('setup_error', ['message' => $e->getMessage()]); } } } } } $dbState = isset($_SESSION['bg_setup_db']) && is_array($_SESSION['bg_setup_db']) ? $_SESSION['bg_setup_db'] : ($dbSession ?: ['driver' => $driver]); $driver = bg_setup_normalize_driver($dbState['driver'] ?? $driver); $lang = bg_lang_attr(); $theme = bg_theme(); $bsTheme = $theme === 'dark' ? 'dark' : 'light'; $stepTitles = [bg_t('setup_step_database_ui'), bg_t('setup_step_admin_ui'), bg_t('setup_step_complete_ui')]; ?> <?= bg_e(bg_t('auth_setup_page_title')) ?>
EN IT

', bg_e(bg_t('auth_webpanel_bastionguard'))) ?>

BastionGuard

$title): $num = $idx + 1; ?>

:
v1.0