BibliotecaOnline/php/auth/register.php

109 lines
4.4 KiB
PHP

<?php
require_once "../db/connect.php";
session_start();
// Se POST: esegue la registrazione e risponde JSON
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header('Content-Type: application/json');
$nome = trim($_POST['nome'] ?? '');
$cognome = trim($_POST['cognome'] ?? '');
$data_nascita = trim($_POST['data_nascita'] ?? '');
$luogo_nascita = trim($_POST['luogo_nascita'] ?? '');
$cod_fiscale = strtoupper(trim($_POST['cod_fiscale'] ?? ''));
$telefono = preg_replace('/\D+/', '', $_POST['telefono'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');
// Validazioni base
$errors = [];
if ($nome === '' || $cognome === '' || $luogo_nascita === '') {
$errors[] = 'Nome, Cognome e Luogo di nascita sono obbligatori';
}
if ($data_nascita === '' || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_nascita)) {
$errors[] = 'Data di nascita non valida (YYYY-MM-DD)';
}
if ($cod_fiscale === '' || strlen($cod_fiscale) !== 16) {
$errors[] = 'Codice Fiscale deve avere 16 caratteri';
}
if ($telefono === '' || !preg_match('/^\d{6,10}$/', $telefono)) {
$errors[] = 'Telefono deve contenere 6-10 cifre';
}
if ($username === '' || strlen($username) < 3) {
$errors[] = 'Username deve avere almeno 3 caratteri';
}
// password policy
if ($password === '' || preg_match('/\s/', $password)) {
$errors[] = 'La password non deve contenere spazi';
}
if (strlen($password) < 8) {
$errors[] = 'La password deve avere almeno 8 caratteri';
}
if (!preg_match('/[a-z]/', $password)) {
$errors[] = 'La password deve contenere almeno una lettera minuscola';
}
if (!preg_match('/[A-Z]/', $password)) {
$errors[] = 'La password deve contenere almeno una lettera maiuscola';
}
if (!preg_match('/[^a-zA-Z0-9]/', $password)) {
$errors[] = 'La password deve contenere almeno un carattere speciale';
}
// Escaping semplice per evitare errori sintattici
$nome_e = mysqli_real_escape_string($conn, $nome);
$cognome_e = mysqli_real_escape_string($conn, $cognome);
$data_nascita_e = mysqli_real_escape_string($conn, $data_nascita);
$luogo_nascita_e = mysqli_real_escape_string($conn, $luogo_nascita);
$cod_fiscale_e = mysqli_real_escape_string($conn, $cod_fiscale);
$telefono_e = mysqli_real_escape_string($conn, $telefono);
$username_e = mysqli_real_escape_string($conn, $username);
$password_e = mysqli_real_escape_string($conn, $password);
// Verifica username univoco
$check = mysqli_query($conn, "SELECT user_id FROM `user` WHERE descrizione = '$username_e' LIMIT 1");
if ($check && mysqli_num_rows($check) > 0) {
$errors[] = 'Username già esistente';
}
if (!empty($errors)) {
echo json_encode(['status' => 'error', 'errors' => $errors]);
exit;
}
// Inserimenti semplici (senza transazioni per semplicità)
$oggi = date('Y-m-d');
$sql_person = "INSERT INTO `person` (nome, cognome, data_nascita, luogo_nascita, cod_fiscale, telefono) VALUES ('$nome_e', '$cognome_e', '$data_nascita_e', '$luogo_nascita_e', '$cod_fiscale_e', '$telefono_e')";
if (!mysqli_query($conn, $sql_person)) {
echo json_encode(['status' => 'error', 'errors' => ['Errore inserimento persona']]);
exit;
}
$person_id = mysqli_insert_id($conn);
$sql_user = "INSERT INTO `user` (descrizione, data, person_id, password) VALUES ('$username_e', '$oggi', $person_id, '$password_e')";
if (!mysqli_query($conn, $sql_user)) {
echo json_encode(['status' => 'error', 'errors' => ['Errore inserimento utente']]);
exit;
}
$user_id = mysqli_insert_id($conn);
$sql_perm = "INSERT INTO `permission` (user_id, role, data) VALUES ($user_id, 3, '$oggi')";
if (!mysqli_query($conn, $sql_perm)) {
echo json_encode(['status' => 'error', 'errors' => ['Errore assegnazione ruolo']]);
exit;
}
// Login automatico e risposta
$_SESSION['user_id'] = (int)$user_id;
$_SESSION['username'] = $username;
$_SESSION['role_id'] = 3;
$_SESSION['role_name'] = 'utente';
echo json_encode(['status' => 'ok']);
exit;
} else {
header('Content-Type: application/json');
http_response_code(405);
echo json_encode(['status' => 'error', 'errors' => ['Metodo non consentito']]);
exit;
}