Files
sld-php-template/first_start.php.completed
T
sld-admin 64f3c76f92 revert a2f36b6fac
revert Fixed the READMEs and small fix around the project
2026-08-19 17:44:20 +01:00

321 lines
12 KiB
Plaintext

<?php
/**
* Blocknotes System - First Start Setup Installer Wizard (Multilingual)
*/
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Define ROOT_DIR and include lang helper
define("ROOT_DIR", __DIR__ . "/");
require_once(__DIR__ . "/functions/lang.php");
// Handle language selection
if (isset($_GET['set_lang'])) {
set_active_lang($_GET['set_lang']);
header("Location: first_start.php");
exit;
}
$current_lang = get_current_lang();
$msg_error = "";
$msg_success = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$db_host = trim($_POST['db_host'] ?? 'localhost');
$db_name = trim($_POST['db_name'] ?? 'blocknotes_db');
$db_user = trim($_POST['db_user'] ?? '');
$db_pass = $_POST['db_pass'] ?? '';
$owner_user = trim($_POST['owner_user'] ?? '');
$owner_pass = $_POST['owner_pass'] ?? '';
$admin_user = trim($_POST['admin_user'] ?? '');
$admin_pass = $_POST['admin_pass'] ?? '';
if (empty($db_host) || empty($db_name) || empty($db_user)) {
$msg_error = __('err_setup_db_fields');
} elseif (empty($owner_user) || empty($owner_pass)) {
$msg_error = __('err_setup_owner_fields');
} elseif (empty($admin_user) || empty($admin_pass)) {
$msg_error = __('err_setup_admin_fields');
} elseif (strtolower($owner_user) === strtolower($admin_user)) {
$msg_error = __('err_setup_same_user');
} else {
mysqli_report(MYSQLI_REPORT_OFF);
$conn = @new mysqli($db_host, $db_user, $db_pass);
if ($conn->connect_error) {
$msg_error = "Connessione MySQL fallita: " . $conn->connect_error;
} else {
// Create database
$db_name_escaped = str_replace('`', '``', $db_name);
if (!$conn->query("CREATE DATABASE IF NOT EXISTS `$db_name_escaped` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")) {
$msg_error = "Impossibile creare il database '$db_name': " . $conn->error;
} else {
$conn->select_db($db_name);
// Create users table
$sql_users = "CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
role ENUM('owner', 'admin', 'user') NOT NULL DEFAULT 'user',
theme_pri INT DEFAULT 98,
theme_sec INT DEFAULT 207,
theme_thi INT DEFAULT 280,
language VARCHAR(5) NOT NULL DEFAULT 'it',
default_blocknote VARCHAR(100) NOT NULL DEFAULT '',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
$conn->query($sql_users);
// Create site_settings table
$sql_settings = "CREATE TABLE IF NOT EXISTS site_settings (
setting_key VARCHAR(50) PRIMARY KEY,
setting_value TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
$conn->query($sql_settings);
// Insert site_settings default values
$conn->query("INSERT IGNORE INTO site_settings (setting_key, setting_value) VALUES ('site_title', 'Blocknotes')");
$conn->query("INSERT IGNORE INTO site_settings (setting_key, setting_value) VALUES ('site_favicon', 'assets/img/favicon.png')");
// Create Owner account
$hash_owner = password_hash($owner_pass, PASSWORD_DEFAULT);
$stmt = $conn->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, 'owner') ON DUPLICATE KEY UPDATE password = VALUES(password), role = 'owner'");
$stmt->bind_param("ss", $owner_user, $hash_owner);
$stmt->execute();
$stmt->close();
// Create Admin account
$hash_admin = password_hash($admin_pass, PASSWORD_DEFAULT);
$stmt = $conn->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, 'admin') ON DUPLICATE KEY UPDATE password = VALUES(password), role = 'admin'");
$stmt->bind_param("ss", $admin_user, $hash_admin);
$stmt->execute();
$stmt->close();
// Create blocknotes directory if missing
$blocknotes_dir = __DIR__ . "/blocknotes/";
if (!is_dir($blocknotes_dir)) {
@mkdir($blocknotes_dir, 0777, true);
}
// Update config/settings.php file
$settings_file_content = '<?php
// -- GENERAL SETTING --
$debug="off";
$php_debug="off";
// --- DB SETTINGS ---
$db_needed="yes";
$db_debug="yes";
$db_host="' . addslashes($db_host) . '";
$db_name="' . addslashes($db_name) . '";
$db_user="' . addslashes($db_user) . '";
$db_pass="' . addslashes($db_pass) . '";
//-------------------------------------------------------------------------------------
// --- DON\'T CHANGE ALL THE CODE BELOW!!! ---
//-------------------------------------------------------------------------------------
// --- GENERAL SECTION CONFIGURATION
if ($debug == "on"){ define("DEBUG",true);} else { define("DEBUG", false); }
if ($php_debug == "on") {
ini_set(\'display_errors\', 1);
ini_set(\'display_startup_errors\', 1);
error_reporting(E_ALL);
} else {
ini_set(\'display_errors\', 0);
error_reporting(0);
}
// --- DB SECTION CONFIGURATION
if ($db_needed == "yes"){
define("DB_HOST", $db_host);
define("DB_USER", $db_user);
define("DB_PASS", $db_pass);
define("DB_NAME", $db_name);
define("DB_DEBUG", $db_debug);
require_once(CONFIG_FOLD . "db.php");
}
?>';
file_put_contents(__DIR__ . "/config/settings.php", $settings_file_content);
// Rename first_start.php to first_start.php.completed to prevent installer re-entry
@rename(__FILE__, __DIR__ . "/first_start.php.completed");
// Redirect to login page
header("Location: index.php?page=login&installed=1");
exit;
}
}
}
}
?>
<!DOCTYPE html>
<html lang="<?= htmlspecialchars($current_lang) ?>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= __('setup_title') ?> - Blocknotes</title>
<link rel="stylesheet" href="assets/css/style.css">
<style>
body {
background: radial-gradient(circle at top left, #0f172a, #020617);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 2rem 1rem;
font-family: system-ui, -apple-system, sans-serif;
color: #f8fafc;
}
.setup-container {
max-width: 680px;
width: 100%;
background: rgba(15, 23, 42, 0.75);
backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
padding: 2.5rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
}
.setup-header {
text-align: center;
margin-bottom: 2rem;
}
.setup-header h1 {
font-size: 1.8rem;
font-weight: 800;
color: #fff;
margin-bottom: 0.5rem;
}
.setup-header p {
color: #94a3b8;
font-size: 0.95rem;
}
.form-section-title {
font-size: 1.1rem;
font-weight: 700;
color: #7dd3fc;
margin-top: 1.5rem;
margin-bottom: 1rem;
padding-bottom: 0.4rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
gap: 0.5rem;
}
.grid-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
@media (max-width: 580px) {
.grid-2 { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<div class="setup-container">
<!-- LANGUAGE SELECTOR -->
<div style="display: flex; justify-content: flex-end; margin-bottom: 1rem;">
<select onchange="location.href='first_start.php?set_lang=' + this.value;" style="background: rgba(0,0,0,0.4); color: #fff; border: 1px solid rgba(255,255,255,0.2); border-radius: 6px; padding: 0.35rem 0.6rem; font-size: 0.85rem; cursor: pointer;">
<option value="it" <?= ($current_lang === 'it') ? 'selected' : '' ?>>🇮🇹 IT</option>
<option value="en" <?= ($current_lang === 'en') ? 'selected' : '' ?>>🇬🇧 EN</option>
<option value="es" <?= ($current_lang === 'es') ? 'selected' : '' ?>>🇪🇸 ES</option>
<option value="fr" <?= ($current_lang === 'fr') ? 'selected' : '' ?>>🇫🇷 FR</option>
</select>
</div>
<div class="setup-header">
<h1><?= __('setup_title') ?></h1>
<p><?= __('setup_subtitle') ?></p>
</div>
<?php if (!empty($msg_error)): ?>
<div class="alert alert-danger" style="background: rgba(239, 68, 68, 0.2); border: 1px solid rgba(239, 68, 68, 0.4); color: #fca5a5; padding: 0.85rem 1rem; border-radius: 8px; margin-bottom: 1.5rem; font-size: 0.9rem;">
⚠️ <?= htmlspecialchars($msg_error) ?>
</div>
<?php endif; ?>
<form action="first_start.php" method="POST">
<!-- SEC 1: DATABASE -->
<div class="form-section-title">
<span>🗄️</span> <?= __('setup_sec1_title') ?>
</div>
<div class="grid-2">
<div class="form-group">
<label for="db_host"><?= __('setup_db_host') ?></label>
<input type="text" name="db_host" id="db_host" class="form-control" value="<?= htmlspecialchars($_POST['db_host'] ?? 'localhost') ?>" required>
</div>
<div class="form-group">
<label for="db_name"><?= __('setup_db_name') ?></label>
<input type="text" name="db_name" id="db_name" class="form-control" value="<?= htmlspecialchars($_POST['db_name'] ?? 'blocknotes_db') ?>" required>
</div>
</div>
<div class="grid-2">
<div class="form-group">
<label for="db_user"><?= __('setup_db_user') ?></label>
<input type="text" name="db_user" id="db_user" class="form-control" value="<?= htmlspecialchars($_POST['db_user'] ?? 'simone') ?>" required>
</div>
<div class="form-group">
<label for="db_pass"><?= __('setup_db_pass') ?></label>
<input type="password" name="db_pass" id="db_pass" class="form-control" placeholder="<?= htmlspecialchars(__('setup_db_pass_placeholder')) ?>">
</div>
</div>
<!-- SEC 2: OWNER ACCOUNT -->
<div class="form-section-title" style="color: #fde047;">
<span>👑</span> <?= __('setup_sec2_title') ?>
</div>
<div class="grid-2">
<div class="form-group">
<label for="owner_user"><?= __('setup_owner_user') ?></label>
<input type="text" name="owner_user" id="owner_user" class="form-control" value="<?= htmlspecialchars($_POST['owner_user'] ?? 'owner') ?>" required placeholder="owner">
</div>
<div class="form-group">
<label for="owner_pass"><?= __('setup_owner_pass') ?></label>
<input type="password" name="owner_pass" id="owner_pass" class="form-control" required placeholder="<?= htmlspecialchars(__('setup_owner_pass_placeholder')) ?>">
</div>
</div>
<!-- SEC 3: ADMIN ACCOUNT -->
<div class="form-section-title" style="color: #a7f3d0;">
<span>🛡️</span> <?= __('setup_sec3_title') ?>
</div>
<div class="grid-2">
<div class="form-group">
<label for="admin_user"><?= __('setup_admin_user') ?></label>
<input type="text" name="admin_user" id="admin_user" class="form-control" value="<?= htmlspecialchars($_POST['admin_user'] ?? 'admin') ?>" required placeholder="admin">
</div>
<div class="form-group">
<label for="admin_pass"><?= __('setup_admin_pass') ?></label>
<input type="password" name="admin_pass" id="admin_pass" class="form-control" required placeholder="<?= htmlspecialchars(__('setup_admin_pass_placeholder')) ?>">
</div>
</div>
<div style="margin-top: 2rem;">
<button type="submit" class="btn btn-primary" style="width: 100%; justify-content: center; padding: 0.9rem; font-size: 1.05rem; font-weight: 700;">
<?= __('setup_btn_submit') ?>
</button>
</div>
</form>
</div>
</body>
</html>