Reviewnacharbeitung

This commit is contained in:
2026-06-03 20:07:57 +02:00
parent 92574a0f76
commit bfc9ee4d01
3 changed files with 176 additions and 28 deletions
+63 -24
View File
@@ -4,15 +4,44 @@ require_once "php/model/LocalUserDAO.php";
require_once 'php/model/Article.php'; require_once 'php/model/Article.php';
require_once 'php/model/ArticleManager.php'; require_once 'php/model/ArticleManager.php';
$error = null;
if (!isset($_SESSION["user"])) { if (!isset($_SESSION["user"])) {
header("Location: index.php?pfad=login"); header("Location: index.php?pfad=login");
exit(); 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 { try {
$dao = new LocalUserDAO();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
if (!$user) { if (!$user) {
@@ -25,32 +54,43 @@ try {
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["saveProfile"])) { if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["saveProfile"])) {
$oldEmail = $_SESSION["user_email"]; $oldEmail = $_SESSION["user_email"];
$newEmail = $_POST["email"] ?? "";
$vorname = $_POST["vorname"] ?? ""; $newEmail = trim($_POST["email"] ?? "");
$nachname = $_POST["nachname"] ?? ""; $vorname = trim($_POST["vorname"] ?? "");
$nachname = trim($_POST["nachname"] ?? "");
$password = $_POST["password"] ?? ""; $password = $_POST["password"] ?? "";
$existingUser = $dao->findUser($newEmail); if (!isValidName($vorname)) {
$error = "Der Vorname darf nur Buchstaben, Leerzeichen und Bindestriche enthalten und muss 2 bis 50 Zeichen lang sein.";
if ($existingUser && $newEmail !== $oldEmail) { } elseif (!isValidName($nachname)) {
$error = "Diese E-Mail-Adresse wird bereits verwendet."; $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 { } else {
$updated = $dao->updateUser( $existingUser = $dao->findUser($newEmail);
$oldEmail,
$newEmail,
$vorname,
$nachname,
$password
);
if ($updated) { if ($existingUser && $newEmail !== $oldEmail) {
$_SESSION["user"] = $vorname . " " . $nachname; $error = "Diese E-Mail-Adresse wird bereits verwendet.";
$_SESSION["user_email"] = $newEmail;
header("Location: index.php?pfad=profile");
exit();
} else { } 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) { } catch (Exception $e) {
$_SESSION["message"] = "internal_error"; $_SESSION["message"] = "internal_error";
exit();
} }
+67 -4
View File
@@ -12,23 +12,58 @@ class LocalUserDAO implements UserDAOInterface {
} }
$json = file_get_contents($this->file); $json = file_get_contents($this->file);
if ($json === false) {
throw new RuntimeException("Benutzerdaten konnten nicht gelesen werden.");
}
$users = json_decode($json, true); $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 : []; return is_array($users) ? $users : [];
} }
private function saveUsers($users) { private function saveUsers($users) {
file_put_contents( $result = file_put_contents(
$this->file, $this->file,
json_encode($users, JSON_PRETTY_PRINT) 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) { public function findUser($email) {
$this->validateEmail($email);
$users = $this->loadUsers(); $users = $this->loadUsers();
foreach ($users as $user) { foreach ($users as $user) {
if ($user["email"] === $email) { if (isset($user["email"]) && $user["email"] === $email) {
if (!isset($user["vorname"]) && isset($user["username"])) { if (!isset($user["vorname"]) && isset($user["username"])) {
$nameParts = explode(" ", $user["username"], 2); $nameParts = explode(" ", $user["username"], 2);
@@ -44,8 +79,19 @@ class LocalUserDAO implements UserDAOInterface {
} }
public function addUser($email, $vorname, $nachname, $password) { public function addUser($email, $vorname, $nachname, $password) {
$this->validateEmail($email);
$this->validateName($vorname, "Vorname");
$this->validateName($nachname, "Nachname");
$this->validatePassword($password);
$users = $this->loadUsers(); $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[] = [ $users[] = [
"email" => $email, "email" => $email,
"vorname" => $vorname, "vorname" => $vorname,
@@ -57,10 +103,25 @@ class LocalUserDAO implements UserDAOInterface {
} }
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) { 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(); $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) { foreach ($users as $i => $user) {
if ($user["email"] === $oldEmail) { if (isset($user["email"]) && $user["email"] === $oldEmail) {
$users[$i]["email"] = $newEmail; $users[$i]["email"] = $newEmail;
$users[$i]["vorname"] = $vorname; $users[$i]["vorname"] = $vorname;
$users[$i]["nachname"] = $nachname; $users[$i]["nachname"] = $nachname;
@@ -80,10 +141,12 @@ class LocalUserDAO implements UserDAOInterface {
} }
public function deleteUser($email) { public function deleteUser($email) {
$this->validateEmail($email);
$users = $this->loadUsers(); $users = $this->loadUsers();
foreach ($users as $i => $user) { foreach ($users as $i => $user) {
if ($user["email"] === $email) { if (isset($user["email"]) && $user["email"] === $email) {
unset($users[$i]); unset($users[$i]);
$users = array_values($users); $users = array_values($users);
$this->saveUsers($users); $this->saveUsers($users);
+46
View File
@@ -11,39 +11,85 @@ interface UserDAOInterface {
/** /**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse. * 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 * @param string $email E-Mail-Adresse des gesuchten Benutzers
*
* Ausgabe:
* @return array|null Benutzerdaten als Array oder null * @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); public function findUser($email);
/** /**
* Fügt einen neuen Benutzer hinzu. * 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 $email E-Mail-Adresse des Benutzers
* @param string $vorname Vorname des Benutzers * @param string $vorname Vorname des Benutzers
* @param string $nachname Nachname des Benutzers * @param string $nachname Nachname des Benutzers
* @param string $password Passwort des Benutzers * @param string $password Passwort des Benutzers
*
* Ausgabe:
* @return void * @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); public function addUser($email, $vorname, $nachname, $password);
/** /**
* Aktualisiert einen bestehenden Benutzer. * 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 $oldEmail Alte E-Mail-Adresse
* @param string $newEmail Neue E-Mail-Adresse * @param string $newEmail Neue E-Mail-Adresse
* @param string $vorname Neuer Vorname * @param string $vorname Neuer Vorname
* @param string $nachname Neuer Nachname * @param string $nachname Neuer Nachname
* @param string|null $password Neues Passwort oder null * @param string|null $password Neues Passwort oder null
*
* Ausgabe:
* @return bool true, wenn der Benutzer aktualisiert wurde, sonst false * @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); public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null);
/** /**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse. * 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 * @param string $email E-Mail-Adresse des zu löschenden Benutzers
*
* Ausgabe:
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false * @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); public function deleteUser($email);
} }