false, 'message' => 'Inserisci sia username che password.']; } $stmt = $conn->prepare("SELECT id, username, password, role, theme_pri, theme_sec, theme_thi, language, default_blocknote FROM users WHERE username = ? LIMIT 1"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { if (password_verify($password, $row['password'])) { $_SESSION['user'] = [ 'id' => $row['id'], 'username' => $row['username'], 'role' => $row['role'], 'theme_pri' => $row['theme_pri'] ?? 98, 'theme_sec' => $row['theme_sec'] ?? 207, 'theme_thi' => $row['theme_thi'] ?? 280, 'language' => $row['language'] ?? 'it', 'default_blocknote' => $row['default_blocknote'] ?? '' ]; $stmt->close(); return ['success' => true]; } } $stmt->close(); return ['success' => false, 'message' => 'Username o password errati.']; } /** * Logout current user. */ function logout_user() { $_SESSION = array(); if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } session_destroy(); } /** * Update user password. */ function update_user_password($user_id, $new_password) { global $conn; if (strlen($new_password) < 4) { return ['success' => false, 'message' => 'La password deve contenere almeno 4 caratteri.']; } $hash = password_hash($new_password, PASSWORD_DEFAULT); $stmt = $conn->prepare("UPDATE users SET password = ? WHERE id = ?"); $stmt->bind_param("si", $hash, $user_id); $res = $stmt->execute(); $stmt->close(); return $res ? ['success' => true, 'message' => 'Password aggiornata con successo!'] : ['success' => false, 'message' => 'Errore durante il salvataggio della password.']; } /** * Update user language preference. */ function update_user_language($user_id, $lang) { global $conn; if (!in_array($lang, ['it', 'en', 'es', 'fr'])) { $lang = 'it'; } $stmt = $conn->prepare("UPDATE users SET language = ? WHERE id = ?"); $stmt->bind_param("si", $lang, $user_id); $res = $stmt->execute(); $stmt->close(); if ($res) { if (isset($_SESSION['user']) && $_SESSION['user']['id'] == $user_id) { $_SESSION['user']['language'] = $lang; } return ['success' => true, 'message' => 'Lingua aggiornata con successo!']; } return ['success' => false, 'message' => 'Errore durante l\'aggiornamento della lingua.']; } /** * Update user default landing blocknote preference. */ function update_user_default_blocknote($user_id, $bn_id) { global $conn; $bn_id = trim($bn_id); $stmt = $conn->prepare("UPDATE users SET default_blocknote = ? WHERE id = ?"); $stmt->bind_param("si", $bn_id, $user_id); $res = $stmt->execute(); $stmt->close(); if ($res) { if (isset($_SESSION['user']) && $_SESSION['user']['id'] == $user_id) { $_SESSION['user']['default_blocknote'] = $bn_id; } return ['success' => true, 'message' => 'Pagina di avvio aggiornata con successo!']; } return ['success' => false, 'message' => 'Errore durante l\'aggiornamento della pagina di avvio.']; } /** * Update user interface theme colors (HSL). */ function update_user_theme($user_id, $pri, $sec, $thi) { global $conn; $pri = max(0, min(360, (int)$pri)); $sec = max(0, min(360, (int)$sec)); $thi = max(0, min(360, (int)$thi)); $stmt = $conn->prepare("UPDATE users SET theme_pri = ?, theme_sec = ?, theme_thi = ? WHERE id = ?"); $stmt->bind_param("iiii", $pri, $sec, $thi, $user_id); $res = $stmt->execute(); $stmt->close(); if ($res) { if (isset($_SESSION['user']) && $_SESSION['user']['id'] == $user_id) { $_SESSION['user']['theme_pri'] = $pri; $_SESSION['user']['theme_sec'] = $sec; $_SESSION['user']['theme_thi'] = $thi; } return ['success' => true, 'message' => 'Colori dell\'interfaccia aggiornati!']; } return ['success' => false, 'message' => 'Errore durante l\'aggiornamento dei colori.']; } /** * Admin: Get list of all registered users. */ function get_all_users() { global $conn; $result = $conn->query("SELECT id, username, role, created_at FROM users ORDER BY id ASC"); $users = []; while ($row = $result->fetch_assoc()) { $users[] = $row; } return $users; } /** * Admin: Register a new user. */ function admin_create_user($username, $password, $role = 'user') { global $conn; $username = trim($username); if (empty($username) || empty($password)) { return ['success' => false, 'message' => 'Username e password sono obbligatori.']; } if (!in_array($role, ['user', 'admin', 'owner'])) { $role = 'user'; } if ($role === 'owner') { $check_owner = $conn->query("SELECT id FROM users WHERE role = 'owner'"); if ($check_owner->num_rows > 0) { return ['success' => false, 'message' => 'Può esistere un solo account Owner nel sistema!']; } } // Check if exists $stmt = $conn->prepare("SELECT id FROM users WHERE username = ? LIMIT 1"); $stmt->bind_param("s", $username); $stmt->execute(); if ($stmt->get_result()->num_rows > 0) { $stmt->close(); return ['success' => false, 'message' => 'Un utente con questo username esiste già.']; } $stmt->close(); $hash = password_hash($password, PASSWORD_DEFAULT); $stmt = $conn->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $username, $hash, $role); $res = $stmt->execute(); $stmt->close(); return $res ? ['success' => true, 'message' => 'Utente creato con successo!'] : ['success' => false, 'message' => 'Impossibile creare l\'utente.']; } /** * Admin: Delete a user by ID. */ function admin_delete_user($user_id) { global $conn; $user_id = (int)$user_id; // Prevent self-deletion if (current_user() && current_user()['id'] == $user_id) { return ['success' => false, 'message' => 'Non puoi eliminare il tuo stesso account!']; } // Check target user role - Owner can NEVER be deleted $stmt = $conn->prepare("SELECT role FROM users WHERE id = ? LIMIT 1"); $stmt->bind_param("i", $user_id); $stmt->execute(); $target_user = $stmt->get_result()->fetch_assoc(); $stmt->close(); if ($target_user && $target_user['role'] === 'owner') { return ['success' => false, 'message' => 'L\'account Owner non può essere eliminato da nessuno!']; } $stmt = $conn->prepare("DELETE FROM users WHERE id = ?"); $stmt->bind_param("i", $user_id); $res = $stmt->execute(); $stmt->close(); return $res ? ['success' => true, 'message' => 'Utente eliminato.'] : ['success' => false, 'message' => 'Errore nell\'eliminazione dell\'utente.']; } /** * Admin: Update user role. */ function admin_update_user_role($user_id, $role) { global $conn; $user_id = (int)$user_id; if (!in_array($role, ['admin', 'user', 'owner'])) return ['success' => false, 'message' => 'Ruolo non valido.']; // Check target user role - Owner role cannot be changed $stmt = $conn->prepare("SELECT role FROM users WHERE id = ? LIMIT 1"); $stmt->bind_param("i", $user_id); $stmt->execute(); $target_user = $stmt->get_result()->fetch_assoc(); $stmt->close(); if ($target_user && $target_user['role'] === 'owner') { return ['success' => false, 'message' => 'Il ruolo dell\'account Owner non può essere modificato!']; } if ($role === 'owner') { $check_owner = $conn->query("SELECT id FROM users WHERE role = 'owner'"); if ($check_owner->num_rows > 0) { return ['success' => false, 'message' => 'Può esistere un solo account Owner nel sistema!']; } } $stmt = $conn->prepare("UPDATE users SET role = ? WHERE id = ?"); $stmt->bind_param("si", $role, $user_id); $res = $stmt->execute(); $stmt->close(); return $res ? ['success' => true, 'message' => 'Ruolo aggiornato.'] : ['success' => false, 'message' => 'Impossibile aggiornare il ruolo.']; }