321 lines
12 KiB
PHP
321 lines
12 KiB
PHP
<?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'] ?? 'sld_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', 'sld-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') ?> - sld-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'] ?? 'sld_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>
|