diff --git a/php/controller/profile-controller.php b/php/controller/profile-controller.php index c2846eb..e492dac 100644 --- a/php/controller/profile-controller.php +++ b/php/controller/profile-controller.php @@ -4,15 +4,44 @@ require_once "php/model/LocalUserDAO.php"; require_once 'php/model/Article.php'; require_once 'php/model/ArticleManager.php'; +$error = null; + if (!isset($_SESSION["user"])) { header("Location: index.php?pfad=login"); exit(); } -$dao = new LocalUserDAO(); -$error = null; +/* + * Prüft Vor- und Nachnamen. + * Erlaubt sind Buchstaben, Umlaute, Leerzeichen und Bindestriche. + */ +function isValidName($name): bool { + return preg_match("/^[a-zA-ZäöüÄÖÜß -]{2,50}$/", $name); +} + +/* + * Prüft, ob die E-Mail-Adresse ein gültiges Format hat. + */ +function isValidEmailAddress($email): bool { + return filter_var($email, FILTER_VALIDATE_EMAIL) !== false + && strlen($email) <= 100; +} + +/* + * Prüft das neue Passwort. + * Leeres Passwort ist erlaubt, wenn der Nutzer es nicht ändern möchte. + */ +function isValidProfilePassword($password): bool { + if ($password === "") { + return true; + } + + return strlen($password) >= 8 && strlen($password) <= 72; +} try { + $dao = new LocalUserDAO(); + $user = $dao->findUser($_SESSION["user_email"] ?? ""); if (!$user) { @@ -25,32 +54,43 @@ try { if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["saveProfile"])) { $oldEmail = $_SESSION["user_email"]; - $newEmail = $_POST["email"] ?? ""; - $vorname = $_POST["vorname"] ?? ""; - $nachname = $_POST["nachname"] ?? ""; + + $newEmail = trim($_POST["email"] ?? ""); + $vorname = trim($_POST["vorname"] ?? ""); + $nachname = trim($_POST["nachname"] ?? ""); $password = $_POST["password"] ?? ""; - $existingUser = $dao->findUser($newEmail); - - if ($existingUser && $newEmail !== $oldEmail) { - $error = "Diese E-Mail-Adresse wird bereits verwendet."; + 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)) { + $error = "Bitte gib eine gültige E-Mail-Adresse ein."; + } elseif (!isValidProfilePassword($password)) { + $error = "Das Passwort muss mindestens 8 Zeichen lang sein."; } else { - $updated = $dao->updateUser( - $oldEmail, - $newEmail, - $vorname, - $nachname, - $password - ); + $existingUser = $dao->findUser($newEmail); - if ($updated) { - $_SESSION["user"] = $vorname . " " . $nachname; - $_SESSION["user_email"] = $newEmail; - - header("Location: index.php?pfad=profile"); - exit(); + if ($existingUser && $newEmail !== $oldEmail) { + $error = "Diese E-Mail-Adresse wird bereits verwendet."; } else { - $error = "Die Daten konnten nicht gespeichert werden."; + $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."; + } } } } @@ -66,5 +106,4 @@ try { } catch (Exception $e) { $_SESSION["message"] = "internal_error"; - exit(); } \ No newline at end of file diff --git a/php/model/LocalUserDAO.php b/php/model/LocalUserDAO.php index e7d46ee..513466b 100644 --- a/php/model/LocalUserDAO.php +++ b/php/model/LocalUserDAO.php @@ -12,23 +12,58 @@ class LocalUserDAO implements UserDAOInterface { } $json = file_get_contents($this->file); + + if ($json === false) { + throw new RuntimeException("Benutzerdaten konnten nicht gelesen werden."); + } + $users = json_decode($json, true); + if ($users === null && json_last_error() !== JSON_ERROR_NONE) { + throw new RuntimeException("Benutzerdaten sind fehlerhaft."); + } + return is_array($users) ? $users : []; } private function saveUsers($users) { - file_put_contents( + $result = file_put_contents( $this->file, json_encode($users, JSON_PRETTY_PRINT) ); + + 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."); + } } public function findUser($email) { + $this->validateEmail($email); + $users = $this->loadUsers(); foreach ($users as $user) { - if ($user["email"] === $email) { + if (isset($user["email"]) && $user["email"] === $email) { if (!isset($user["vorname"]) && isset($user["username"])) { $nameParts = explode(" ", $user["username"], 2); @@ -44,8 +79,19 @@ class LocalUserDAO implements UserDAOInterface { } 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) { + if (isset($user["email"]) && $user["email"] === $email) { + throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet."); + } + } + $users[] = [ "email" => $email, "vorname" => $vorname, @@ -57,10 +103,25 @@ class LocalUserDAO implements UserDAOInterface { } 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) { + if ( + isset($user["email"]) + && $user["email"] === $newEmail + && $newEmail !== $oldEmail + ) { + throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet."); + } + } + foreach ($users as $i => $user) { - if ($user["email"] === $oldEmail) { + if (isset($user["email"]) && $user["email"] === $oldEmail) { $users[$i]["email"] = $newEmail; $users[$i]["vorname"] = $vorname; $users[$i]["nachname"] = $nachname; @@ -80,10 +141,12 @@ class LocalUserDAO implements UserDAOInterface { } public function deleteUser($email) { + $this->validateEmail($email); + $users = $this->loadUsers(); foreach ($users as $i => $user) { - if ($user["email"] === $email) { + if (isset($user["email"]) && $user["email"] === $email) { unset($users[$i]); $users = array_values($users); $this->saveUsers($users); diff --git a/php/model/UserDAOInterface.php b/php/model/UserDAOInterface.php index 3953459..24fb80f 100644 --- a/php/model/UserDAOInterface.php +++ b/php/model/UserDAOInterface.php @@ -11,39 +11,85 @@ interface UserDAOInterface { /** * Sucht einen Benutzer anhand seiner E-Mail-Adresse. * + * Funktion: + * Liefert die gespeicherten Benutzerdaten zu einer E-Mail-Adresse. + * + * Eingabe: * @param string $email E-Mail-Adresse des gesuchten Benutzers + * + * Ausgabe: * @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); /** * Fügt einen neuen Benutzer hinzu. * + * Funktion: + * Erstellt einen neuen Benutzereintrag und speichert ihn + * in der jeweiligen Datenquelle. + * + * Eingabe: * @param string $email E-Mail-Adresse des Benutzers * @param string $vorname Vorname des Benutzers * @param string $nachname Nachname des Benutzers * @param string $password Passwort des Benutzers + * + * Ausgabe: * @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 */ public function addUser($email, $vorname, $nachname, $password); /** * Aktualisiert einen bestehenden Benutzer. * + * Funktion: + * Ändert die E-Mail-Adresse, den Vornamen, den Nachnamen + * und optional das Passwort eines bestehenden Benutzers. + * + * Eingabe: * @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 + * + * Ausgabe: * @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 */ public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null); /** * Löscht einen Benutzer anhand seiner E-Mail-Adresse. * + * Funktion: + * Entfernt einen vorhandenen Benutzer aus der Datenquelle. + * + * Eingabe: * @param string $email E-Mail-Adresse des zu löschenden Benutzers + * + * Ausgabe: * @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 */ public function deleteUser($email); } \ No newline at end of file