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