Merge branch 'DatabaseUserManager' of https://git.gigaworld.ddns.net/niklas.ortmann/webprogrammierung into DatabaseUserManager

This commit is contained in:
2026-06-10 20:19:16 +02:00
7 changed files with 172 additions and 33 deletions
-20
View File
@@ -1,20 +0,0 @@
<?php
require_once "php/model/UserManager.php";
$dao = UserManager::getInstance();
/*
Deregistrierung
Funktion: Entfernt User aus der Datenbank und beendet die Session
*/
if (isset($_SESSION["user_email"])) {
$dao->deleteUser($_SESSION["user_email"]);
}
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
+2 -2
View File
@@ -17,12 +17,12 @@ if ($pfad === "register") {
} }
if ($pfad === "logout") { if ($pfad === "logout") {
include_once "content/logout.php"; include_once "content/logout-controller.php";
exit(); exit();
} }
if ($pfad === "deleteAccount") { if ($pfad === "deleteAccount") {
include_once "content/deleteAccount.php"; include_once "content/deleteAccount-controller.php";
exit(); exit();
} }
?> ?>
@@ -0,0 +1,30 @@
<?php
require_once "php/model/UserManager.php";
/*
Deregistrierung
Funktion: Entfernt User aus der Datenbank und beendet die Session
*/
try {
$dao = UserManager::getInstance();
if (isset($_SESSION["user_email"])) {
$dao->deleteUser($_SESSION["user_email"]);
}
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
} catch (Exception $e) {
$_SESSION["message"] = "internal_error";
header("Location: index.php?pfad=profile");
exit();
}
+8 -1
View File
@@ -2,7 +2,6 @@
require_once "php/model/UserManager.php"; require_once "php/model/UserManager.php";
$dao = UserManager::getInstance();
$error = null; $error = null;
/* /*
@@ -11,6 +10,10 @@ $error = null;
*/ */
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
try {
$dao = UserManager::getInstance();
$email = $_POST["email"] ?? ""; $email = $_POST["email"] ?? "";
$password = $_POST["password"] ?? ""; $password = $_POST["password"] ?? "";
@@ -27,4 +30,8 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
} else { } else {
$error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben."; $error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben.";
} }
} catch (Exception $e) {
$error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.";
}
} }
+80
View File
@@ -2,10 +2,24 @@
require_once "UserManagerDAO.php"; require_once "UserManagerDAO.php";
/**
* Klasse für den Zugriff auf Benutzerdaten über eine SQLite-Datenbank.
*
* Diese Klasse verwendet PDO, Prepared Statements und speichert
* Benutzerdaten in der Datei db/users.db.
*/
class DatabaseUserManager implements UserManagerDAO { class DatabaseUserManager implements UserManagerDAO {
private static $instance = null; private static $instance = null;
/**
* Konstruktor.
*
* Erstellt die Benutzerdatenbank und die Tabelle users,
* falls diese noch nicht existieren.
*
* @throws RuntimeException wenn die Datenbank nicht erstellt werden kann
*/
public function __construct() public function __construct()
{ {
try { try {
@@ -27,6 +41,13 @@ class DatabaseUserManager implements UserManagerDAO {
} }
} }
/**
* Baut eine Verbindung zur SQLite-Datenbank auf.
*
* @return PDO Datenbankverbindung
*
* @throws RuntimeException wenn keine Verbindung hergestellt werden kann
*/
private function getConnection() private function getConnection()
{ {
try { try {
@@ -42,6 +63,11 @@ class DatabaseUserManager implements UserManagerDAO {
} }
} }
/**
* Gibt die Singleton-Instanz des DatabaseUserManagers zurück.
*
* @return DatabaseUserManager Instanz des DatabaseUserManagers
*/
public static function getInstance() public static function getInstance()
{ {
if (self::$instance == null) { if (self::$instance == null) {
@@ -51,6 +77,16 @@ class DatabaseUserManager implements UserManagerDAO {
return self::$instance; return self::$instance;
} }
/**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des Benutzers
*
* @return array|null Benutzerdaten als Array oder null,
* wenn kein Benutzer gefunden wurde
*
* @throws RuntimeException wenn der Benutzer nicht geladen werden kann
*/
public function findUser($email) public function findUser($email)
{ {
try { try {
@@ -72,6 +108,22 @@ class DatabaseUserManager implements UserManagerDAO {
} }
} }
/**
* Fügt einen neuen Benutzer in die Datenbank ein.
*
* Die Speicherung erfolgt innerhalb einer Transaktion.
* Doppelte E-Mail-Adressen werden durch den Primary Key verhindert.
*
* @param string $email E-Mail-Adresse des Benutzers
* @param string $vorname Vorname des Benutzers
* @param string $nachname Nachname des Benutzers
* @param string $password Passwort-Hash des Benutzers
*
* @return void
*
* @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn der Benutzer nicht gespeichert werden kann
*/
public function addUser($email, $vorname, $nachname, $password) public function addUser($email, $vorname, $nachname, $password)
{ {
try { try {
@@ -107,6 +159,24 @@ class DatabaseUserManager implements UserManagerDAO {
} }
} }
/**
* Aktualisiert die Daten eines bestehenden Benutzers.
*
* Optional kann zusätzlich das Passwort geändert werden.
* Wenn kein neues Passwort übergeben wird, bleibt das alte Passwort erhalten.
*
* @param string $oldEmail Aktuelle E-Mail-Adresse des Benutzers
* @param string $newEmail Neue E-Mail-Adresse des Benutzers
* @param string $vorname Neuer Vorname des Benutzers
* @param string $nachname Neuer Nachname des Benutzers
* @param string|null $password Neues Passwort oder null
*
* @return bool true, wenn der Benutzer aktualisiert wurde,
* sonst false
*
* @throws InvalidArgumentException wenn die neue E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn der Benutzer nicht aktualisiert werden kann
*/
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null)
{ {
try { try {
@@ -160,6 +230,16 @@ class DatabaseUserManager implements UserManagerDAO {
} }
} }
/**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers
*
* @return bool true, wenn der Benutzer gelöscht wurde,
* sonst false
*
* @throws RuntimeException wenn der Benutzer nicht gelöscht werden kann
*/
public function deleteUser($email) public function deleteUser($email)
{ {
try { try {
+42
View File
@@ -1,5 +1,15 @@
<?php <?php
/**
* Prüft, ob ein Vor- oder Nachname gültig ist.
*
* Erlaubt werden Buchstaben, Umlaute, Leerzeichen und Bindestriche.
* Die Länge muss zwischen 2 und 20 Zeichen liegen.
*
* @param string $name Zu prüfender Name
*
* @return bool true wenn der Name gültig ist, sonst false
*/
function userNameValidator($name) function userNameValidator($name)
{ {
$name = trim($name); $name = trim($name);
@@ -8,6 +18,16 @@ function userNameValidator($name)
return preg_match($namePattern, $name) === 1; return preg_match($namePattern, $name) === 1;
} }
/**
* Prüft, ob eine E-Mail-Adresse gültig ist.
*
* Die E-Mail-Adresse muss dem Standardformat entsprechen
* und darf höchstens 100 Zeichen lang sein.
*
* @param string $email Zu prüfende E-Mail-Adresse
*
* @return bool true wenn die E-Mail-Adresse gültig ist, sonst false
*/
function userEmailValidator($email) function userEmailValidator($email)
{ {
$email = trim($email); $email = trim($email);
@@ -16,6 +36,15 @@ function userEmailValidator($email)
&& mb_strlen($email) <= 100; && mb_strlen($email) <= 100;
} }
/**
* Prüft, ob ein Passwort die Längenanforderungen erfüllt.
*
* Das Passwort muss zwischen 5 und 12 Zeichen lang sein.
*
* @param string $password Zu prüfendes Passwort
*
* @return bool true wenn das Passwort gültig ist, sonst false
*/
function userPasswordValidator($password) function userPasswordValidator($password)
{ {
$zeichenAnzahl = mb_strlen($password); $zeichenAnzahl = mb_strlen($password);
@@ -23,6 +52,19 @@ function userPasswordValidator($password)
return $zeichenAnzahl >= 5 && $zeichenAnzahl <= 12; return $zeichenAnzahl >= 5 && $zeichenAnzahl <= 12;
} }
/**
* Prüft ein optionales Passwort.
*
* Ein leeres Passwort ist erlaubt und bedeutet,
* dass das bestehende Passwort unverändert bleibt.
* Falls ein Passwort angegeben wurde, wird es
* mit den normalen Passwortregeln geprüft.
*
* @param string|null $password Zu prüfendes Passwort
*
* @return bool true wenn das Passwort gültig oder leer ist,
* sonst false
*/
function userOptionalPasswordValidator($password) function userOptionalPasswordValidator($password)
{ {
if (!isset($password) || $password === '') { if (!isset($password) || $password === '') {