Files
intranet/web/intranet_repo/projects/authorization/signup-process.php
T

119 lines
4.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php /* Name: signup-process.php
Beschreibung: Vereinte Registrierungs-Verarbeitung
- Prüft ob Nutzer vorregistriert ist → direkte Registrierung
- Wenn nicht → automatisch Antrag in pending_registrations + Mail an Admin */
$pdo = require_once($_SERVER['DOCUMENT_ROOT']."/intranet_repo/general_files/ini/database.php");
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/general_files/ini/send_mail.php';
// === Validierung ===
if (empty($_POST["first_name"])) {
die("Vorname ist erforderlich.");
}
if (empty($_POST["last_name"])) {
die("Nachname ist erforderlich.");
}
if (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
die("Gültige E-Mail-Adresse erforderlich.");
}
if (empty($_POST["phone"])) {
die("Telefonnummer ist erforderlich.");
}
if (strlen($_POST["password"]) < 8) {
die("Passwort muss mindestens 8 Zeichen lang sein.");
}
if (!preg_match("/[a-z]/i", $_POST["password"])) {
die("Passwort muss mindestens einen Buchstaben enthalten.");
}
if (!preg_match("/[0-9]/", $_POST["password"])) {
die("Passwort muss mindestens eine Zahl enthalten.");
}
if ($_POST["password"] !== $_POST["password_confirmation"]) {
die("Passwörter stimmen nicht überein.");
}
$email = trim($_POST["email"]);
$first_name = trim($_POST["first_name"]);
$last_name = trim($_POST["last_name"]);
$phone = preg_replace('/[^0-9]/', '', trim($_POST["phone"]));
$password_hash = password_hash($_POST["password"], PASSWORD_DEFAULT);
// === Prüfung 1: Ist der Nutzer vom Admin vorregistriert? ===
$stmt = $pdo->prepare("SELECT user_id FROM user_general_information WHERE mail = ?");
$stmt->execute([$email]);
$user_id = $stmt->fetchColumn();
if ($user_id) {
// Nutzer ist vorregistriert – prüfen ob bereits Login existiert
$stmt = $pdo->prepare("SELECT COUNT(*) FROM user_login WHERE user_id = ?");
$stmt->execute([$user_id]);
$loginExists = $stmt->fetchColumn();
if ($loginExists > 0) {
// Bereits vollständig registriert
header("Location: signup.php?error=2");
exit;
}
// Direkte Registrierung durchführen
$stmt = $pdo->prepare("INSERT INTO user_login (user_id, password_hash) VALUES (?, ?)");
if ($stmt->execute([$user_id, $password_hash])) {
// Namen und Telefonnummer aktualisieren
$stmt = $pdo->prepare("UPDATE user_general_information SET first_name=?, last_name=?, phone=? WHERE user_id=?");
$stmt->execute([$first_name, $last_name, $phone, $user_id]);
header("Location: login.php");
exit;
} else {
header("Location: signup.php?error=1");
exit;
}
}
// === Prüfung 2: Liegt bereits ein Antrag vor? ===
$stmt = $pdo->prepare("SELECT COUNT(*) FROM pending_registrations WHERE email = ? AND status = 'pending'");
$stmt->execute([$email]);
$pendingCount = $stmt->fetchColumn();
if ($pendingCount > 0) {
header("Location: signup.php?error=2");
exit;
}
// === Antrag stellen (Nutzer nicht vorregistriert) ===
$token = bin2hex(random_bytes(32));
$stmt = $pdo->prepare("INSERT INTO pending_registrations (first_name, last_name, email, phone, password_hash, token) VALUES (?, ?, ?, ?, ?, ?)");
if (!$stmt->execute([$first_name, $last_name, $email, $phone, $password_hash, $token])) {
header("Location: signup.php?error=1");
exit;
}
$pending_id = $pdo->lastInsertId();
// Admin-Nachricht in Inbox speichern
$subject = "Neue Registrierungsanfrage: {$first_name} {$last_name}";
$message_text = "Neue Registrierungsanfrage:\n\nName: {$first_name} {$last_name}\nE-Mail: {$email}\n\nBitte im Adminpanel freischalten.";
$data_json = json_encode(['pending_id' => $pending_id, 'token' => $token]);
$stmt = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, data_json) VALUES ('registration', ?, ?, ?, ?, ?)");
$sender_name = "{$first_name} {$last_name}";
$stmt->execute([$sender_name, $email, $subject, $message_text, $data_json]);
// Mail an Admin-Team (Admin + Technik)
$mail_betreff = "Neue Registrierungsanfrage von {$first_name} {$last_name}";
$mail_nachricht = "Es liegt eine neue Registrierungsanfrage vor:\n\n";
$mail_nachricht .= "Name: {$first_name} {$last_name}\n";
$mail_nachricht .= "E-Mail: {$email}\n";
$mail_nachricht .= "Telefon: {$phone}\n\n";
$mail_nachricht .= "Bitte melden Sie sich im Adminpanel an, um die Anfrage zu bearbeiten.";
send_admin_team_mail($pdo, $mail_betreff, $mail_nachricht, "Im Adminpanel bearbeiten", "https://" . ($_SERVER['HTTP_HOST'] ?? intranet_env('INTRANET_FQDN')) . "/intranet_repo/projects/adminpanel/admin_inbox.php");
// Erfolg – gleiche Meldung wie bei direkter Registrierung (Nutzer merkt keinen Unterschied)
header("Location: signup.php?success=1");
exit;
?>