From a0a79e0191b5303c1613bf779551ab86e6726b34 Mon Sep 17 00:00:00 2001 From: Caroline Schulte Date: Wed, 3 Jun 2026 20:58:26 +0200 Subject: [PATCH 1/8] Reviewnacharbeitung --- content/profile.php | 18 +++-- php/controller/profile-controller.php | 84 ++++++++-------------- php/controller/register-controller.php | 50 ++++++++------ php/model/LocalUserDAO.php | 96 ++++++++++++++++---------- php/model/UserDAOInterface.php | 16 ++--- php/validator/user-validator.php | 78 +++++++++++++++++++++ 6 files changed, 209 insertions(+), 133 deletions(-) create mode 100644 php/validator/user-validator.php diff --git a/content/profile.php b/content/profile.php index 81f2006..9f35dcf 100644 --- a/content/profile.php +++ b/content/profile.php @@ -45,11 +45,19 @@ $isEditMode = isset($_GET["edit"]) && $_GET["edit"] === "1"; - " - > + + + + + +

diff --git a/php/controller/profile-controller.php b/php/controller/profile-controller.php index e492dac..3b96409 100644 --- a/php/controller/profile-controller.php +++ b/php/controller/profile-controller.php @@ -1,8 +1,9 @@ = 8 && strlen($password) <= 72; -} - try { $dao = new LocalUserDAO(); @@ -60,37 +33,31 @@ try { $nachname = trim($_POST["nachname"] ?? ""); $password = $_POST["password"] ?? ""; - if (!isValidName($vorname)) { - $error = "Der Vorname darf nur Buchstaben, Leerzeichen und Bindestriche enthalten und muss 2 bis 50 Zeichen lang sein."; - } elseif (!isValidName($nachname)) { - $error = "Der Nachname darf nur Buchstaben, Leerzeichen und Bindestriche enthalten und muss 2 bis 50 Zeichen lang sein."; - } elseif (!isValidEmailAddress($newEmail)) { + if (!userEmailValidator($newEmail)) { $error = "Bitte gib eine gültige E-Mail-Adresse ein."; - } elseif (!isValidProfilePassword($password)) { - $error = "Das Passwort muss mindestens 8 Zeichen lang sein."; + } elseif (!userNameValidator($vorname)) { + $error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; + } elseif (!userNameValidator($nachname)) { + $error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; + } elseif (!userOptionalPasswordValidator($password)) { + $error = "Das Passwort muss 8 bis 72 Zeichen lang sein."; } else { - $existingUser = $dao->findUser($newEmail); + $updated = $dao->updateUser( + $oldEmail, + $newEmail, + $vorname, + $nachname, + $password + ); - if ($existingUser && $newEmail !== $oldEmail) { - $error = "Diese E-Mail-Adresse wird bereits verwendet."; + if ($updated) { + $_SESSION["user"] = $vorname . " " . $nachname; + $_SESSION["user_email"] = $newEmail; + + header("Location: index.php?pfad=profile"); + exit(); } else { - $updated = $dao->updateUser( - $oldEmail, - $newEmail, - $vorname, - $nachname, - $password - ); - - if ($updated) { - $_SESSION["user"] = $vorname . " " . $nachname; - $_SESSION["user_email"] = $newEmail; - - header("Location: index.php?pfad=profile"); - exit(); - } else { - $error = "Die Daten konnten nicht gespeichert werden."; - } + $error = "Die Daten konnten nicht gespeichert werden."; } } } @@ -104,6 +71,9 @@ try { $_SESSION["message"] = "user_has_no_articles"; } +} catch (InvalidArgumentException $e) { + $error = $e->getMessage(); } catch (Exception $e) { + $error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut."; $_SESSION["message"] = "internal_error"; } \ No newline at end of file diff --git a/php/controller/register-controller.php b/php/controller/register-controller.php index 60eb561..d05cd5c 100644 --- a/php/controller/register-controller.php +++ b/php/controller/register-controller.php @@ -1,37 +1,43 @@ findUser($email)) { - - $error = "Diese E-Mail-Adresse ist bereits registriert."; + $email = trim($_POST["email"] ?? ""); + $vorname = trim($_POST["vorname"] ?? ""); + $nachname = trim($_POST["nachname"] ?? ""); + $plainPassword = $_POST["password"] ?? ""; + if (!userEmailValidator($email)) { + $error = "Bitte gib eine gültige E-Mail-Adresse ein."; + } elseif (!userNameValidator($vorname)) { + $error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; + } elseif (!userNameValidator($nachname)) { + $error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; + } elseif (!userPasswordValidator($plainPassword)) { + $error = "Das Passwort muss 8 bis 72 Zeichen lang sein."; } else { + try { + $dao = new LocalUserDAO(); - $dao->addUser( - $email, - $vorname, - $nachname, - $password - ); + $password = password_hash($plainPassword, PASSWORD_DEFAULT); - $_SESSION["user"] = $vorname . " " . $nachname; - $_SESSION["user_email"] = $email; + $dao->addUser($email, $vorname, $nachname, $password); - header("Location: index.php"); - exit(); + $_SESSION["user"] = $vorname . " " . $nachname; + $_SESSION["user_email"] = $email; + + header("Location: index.php"); + exit(); + + } catch (InvalidArgumentException $e) { + $error = $e->getMessage(); + } catch (Exception $e) { + $error = "Die Registrierung konnte nicht gespeichert werden."; + } } } \ No newline at end of file diff --git a/php/model/LocalUserDAO.php b/php/model/LocalUserDAO.php index 513466b..cc8b265 100644 --- a/php/model/LocalUserDAO.php +++ b/php/model/LocalUserDAO.php @@ -6,6 +6,13 @@ class LocalUserDAO implements UserDAOInterface { private string $file = "data/users.json"; + /** + * Lädt alle Benutzer aus der JSON-Datei. + * + * @return array Liste aller Benutzer + * @throws RuntimeException wenn die Datei nicht gelesen werden kann + * oder fehlerhafte JSON-Daten enthält + */ private function loadUsers() { if (!file_exists($this->file)) { return []; @@ -26,40 +33,35 @@ class LocalUserDAO implements UserDAOInterface { return is_array($users) ? $users : []; } + /** + * Speichert alle Benutzer in die JSON-Datei. + * + * @param array $users Liste aller Benutzer + * @return void + * @throws RuntimeException wenn die Daten nicht gespeichert werden können + */ private function saveUsers($users) { - $result = file_put_contents( - $this->file, - json_encode($users, JSON_PRETTY_PRINT) - ); + $json = json_encode($users, JSON_PRETTY_PRINT); + + if ($json === false) { + throw new RuntimeException("Benutzerdaten konnten nicht umgewandelt werden."); + } + + $result = file_put_contents($this->file, $json); if ($result === false) { throw new RuntimeException("Benutzerdaten konnten nicht gespeichert werden."); } } - private function validateEmail($email) { - if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { - throw new InvalidArgumentException("Ungültige E-Mail-Adresse."); - } - } - - private function validateName($name, $fieldName) { - if (!preg_match("/^[a-zA-ZäöüÄÖÜß -]{2,50}$/", $name)) { - throw new InvalidArgumentException( - $fieldName . " darf nur Buchstaben, Leerzeichen und Bindestriche enthalten." - ); - } - } - - private function validatePassword($password) { - if (empty($password)) { - throw new InvalidArgumentException("Passwort darf nicht leer sein."); - } - } - + /** + * Sucht einen Benutzer anhand seiner E-Mail-Adresse. + * + * @param string $email E-Mail-Adresse des gesuchten Benutzers + * @return array|null Benutzerdaten oder null, wenn kein Benutzer gefunden wurde + * @throws RuntimeException wenn die Benutzerdaten nicht gelesen werden können + */ public function findUser($email) { - $this->validateEmail($email); - $users = $this->loadUsers(); foreach ($users as $user) { @@ -78,12 +80,18 @@ class LocalUserDAO implements UserDAOInterface { return null; } + /** + * Fügt einen neuen Benutzer hinzu. + * + * @param string $email E-Mail-Adresse + * @param string $vorname Vorname + * @param string $nachname Nachname + * @param string $password Passwort-Hash + * @return void + * @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird + * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können + */ public function addUser($email, $vorname, $nachname, $password) { - $this->validateEmail($email); - $this->validateName($vorname, "Vorname"); - $this->validateName($nachname, "Nachname"); - $this->validatePassword($password); - $users = $this->loadUsers(); foreach ($users as $user) { @@ -102,12 +110,19 @@ class LocalUserDAO implements UserDAOInterface { $this->saveUsers($users); } + /** + * Aktualisiert einen bestehenden Benutzer. + * + * @param string $oldEmail Alte E-Mail-Adresse + * @param string $newEmail Neue E-Mail-Adresse + * @param string $vorname Neuer Vorname + * @param string $nachname Neuer Nachname + * @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 die Benutzerdaten nicht gelesen oder gespeichert werden können + */ public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) { - $this->validateEmail($oldEmail); - $this->validateEmail($newEmail); - $this->validateName($vorname, "Vorname"); - $this->validateName($nachname, "Nachname"); - $users = $this->loadUsers(); foreach ($users as $user) { @@ -140,9 +155,14 @@ class LocalUserDAO implements UserDAOInterface { return false; } + /** + * 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 die Benutzerdaten nicht gelesen oder gespeichert werden können + */ public function deleteUser($email) { - $this->validateEmail($email); - $users = $this->loadUsers(); foreach ($users as $i => $user) { diff --git a/php/model/UserDAOInterface.php b/php/model/UserDAOInterface.php index 24fb80f..306d403 100644 --- a/php/model/UserDAOInterface.php +++ b/php/model/UserDAOInterface.php @@ -21,7 +21,6 @@ interface UserDAOInterface { * @return array|null Benutzerdaten als Array oder null * * Mögliche Fehler: - * @throws InvalidArgumentException wenn die E-Mail-Adresse ungültig ist * @throws RuntimeException wenn die Benutzerdaten nicht gelesen werden können */ public function findUser($email); @@ -43,9 +42,8 @@ interface UserDAOInterface { * @return void * * Mögliche Fehler: - * @throws InvalidArgumentException wenn Eingabedaten ungültig sind - * oder die E-Mail-Adresse bereits verwendet wird - * @throws RuntimeException wenn die Benutzerdaten nicht gespeichert werden können + * @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird + * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können */ public function addUser($email, $vorname, $nachname, $password); @@ -67,10 +65,8 @@ interface UserDAOInterface { * @return bool true, wenn der Benutzer aktualisiert wurde, sonst false * * Mögliche Fehler: - * @throws InvalidArgumentException wenn Eingabedaten ungültig sind - * oder die neue E-Mail-Adresse bereits verwendet wird - * @throws RuntimeException wenn die Benutzerdaten nicht gelesen - * oder gespeichert werden können + * @throws InvalidArgumentException wenn die neue E-Mail-Adresse bereits verwendet wird + * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können */ public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null); @@ -87,9 +83,7 @@ interface UserDAOInterface { * @return bool true, wenn der Benutzer gelöscht wurde, sonst false * * Mögliche Fehler: - * @throws InvalidArgumentException wenn die E-Mail-Adresse ungültig ist - * @throws RuntimeException wenn die Benutzerdaten nicht gelesen - * oder gespeichert werden können + * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können */ public function deleteUser($email); } \ No newline at end of file diff --git a/php/validator/user-validator.php b/php/validator/user-validator.php new file mode 100644 index 0000000..96db1ce --- /dev/null +++ b/php/validator/user-validator.php @@ -0,0 +1,78 @@ += 8 && $zeichenAnzahl <= 72) { + return true; + } else { + return false; + } +} + +/** + * Prüft ein optionales Passwort. + * Leeres Passwort ist erlaubt, wenn der Nutzer sein Passwort nicht ändern möchte. + * Wenn ein Passwort eingegeben wurde, gelten die normalen Passwortregeln. + * + * @param $password + * @return bool + */ +function userOptionalPasswordValidator($password) +{ + if (!isset($password) || $password === '') { + return true; + } + + return userPasswordValidator($password); +} + +?> \ No newline at end of file From 45b6b41d6071515f0cfa072ab30df5b155d26606 Mon Sep 17 00:00:00 2001 From: Caroline Schulte Date: Wed, 3 Jun 2026 21:01:28 +0200 Subject: [PATCH 2/8] Reviewnacharbeitung --- content/profile.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/profile.php b/content/profile.php index 9f35dcf..0ef7179 100644 --- a/content/profile.php +++ b/content/profile.php @@ -2,7 +2,7 @@ include_once 'php/controller/profile-controller.php'; $user = $user ?? null; -$isEditMode = isset($_GET["edit"]) && $_GET["edit"] === "1"; +$isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error); ?>
@@ -10,19 +10,19 @@ $isEditMode = isset($_GET["edit"]) && $_GET["edit"] === "1";
- -

+ +

-
+ " + value="" required> @@ -30,7 +30,7 @@ $isEditMode = isset($_GET["edit"]) && $_GET["edit"] === "1"; " + value="" required> @@ -38,7 +38,7 @@ $isEditMode = isset($_GET["edit"]) && $_GET["edit"] === "1"; " + value="" required> From 50df844e235ef8240a58cc5d97a279bcde553ab9 Mon Sep 17 00:00:00 2001 From: Caroline Schulte Date: Wed, 3 Jun 2026 21:05:32 +0200 Subject: [PATCH 3/8] Reviewnacharbeitung --- content/profile.php | 2 +- php/controller/profile-controller.php | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/content/profile.php b/content/profile.php index 0ef7179..8fc7566 100644 --- a/content/profile.php +++ b/content/profile.php @@ -16,7 +16,7 @@ $isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);

- + updateUser( $oldEmail, @@ -58,6 +66,7 @@ try { exit(); } else { $error = "Die Daten konnten nicht gespeichert werden."; + $_GET["edit"] = "1"; } } } @@ -73,7 +82,10 @@ try { } catch (InvalidArgumentException $e) { $error = $e->getMessage(); + $_GET["edit"] = "1"; + } catch (Exception $e) { $error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut."; $_SESSION["message"] = "internal_error"; + $_GET["edit"] = "1"; } \ No newline at end of file From 22b1dd827d93649d8fdb5d16c81290f3917da0c5 Mon Sep 17 00:00:00 2001 From: Caroline Schulte Date: Wed, 3 Jun 2026 21:09:34 +0200 Subject: [PATCH 4/8] Reviewnacharbeitung --- content/register.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/content/register.php b/content/register.php index 641bca2..293c099 100644 --- a/content/register.php +++ b/content/register.php @@ -1,16 +1,18 @@ +