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