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") {
include_once "content/logout.php";
include_once "content/logout-controller.php";
exit();
}
if ($pfad === "deleteAccount") {
include_once "content/deleteAccount.php";
include_once "content/deleteAccount-controller.php";
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();
}
+18 -11
View File
@@ -2,7 +2,6 @@
require_once "php/model/UserManager.php";
$dao = UserManager::getInstance();
$error = null;
/*
@@ -11,20 +10,28 @@ $error = null;
*/
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = $_POST["email"] ?? "";
$password = $_POST["password"] ?? "";
try {
$user = $dao->findUser($email);
$dao = UserManager::getInstance();
if ($user && password_verify($password, $user["password"])) {
$email = $_POST["email"] ?? "";
$password = $_POST["password"] ?? "";
$_SESSION["user"] = $user["vorname"] . " " . $user["nachname"];
$_SESSION["user_email"] = $user["email"];
$user = $dao->findUser($email);
header("Location: index.php");
exit();
if ($user && password_verify($password, $user["password"])) {
} else {
$error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben.";
$_SESSION["user"] = $user["vorname"] . " " . $user["nachname"];
$_SESSION["user_email"] = $user["email"];
header("Location: index.php");
exit();
} else {
$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";
/**
* 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 {
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()
{
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()
{
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()
{
if (self::$instance == null) {
@@ -51,6 +77,16 @@ class DatabaseUserManager implements UserManagerDAO {
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)
{
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)
{
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)
{
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)
{
try {
+42
View File
@@ -1,5 +1,15 @@
<?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)
{
$name = trim($name);
@@ -8,6 +18,16 @@ function userNameValidator($name)
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)
{
$email = trim($email);
@@ -16,6 +36,15 @@ function userEmailValidator($email)
&& 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)
{
$zeichenAnzahl = mb_strlen($password);
@@ -23,6 +52,19 @@ function userPasswordValidator($password)
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)
{
if (!isset($password) || $password === '') {