From 408a54e9b9aa903ed456a4d6cffd7092b7110577 Mon Sep 17 00:00:00 2001 From: Matthias Grief Date: Sun, 1 Dec 2024 14:18:18 +0100 Subject: [PATCH 1/6] Dokumentation der Akzentfarbe angepasst --- webseite/classes/SubjectData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webseite/classes/SubjectData.php b/webseite/classes/SubjectData.php index 87c9db0..71bbd27 100644 --- a/webseite/classes/SubjectData.php +++ b/webseite/classes/SubjectData.php @@ -24,7 +24,7 @@ class SubjectData public string $description; /** - * @var string Themenfarbe des Faches, entweder als hexcode oder CSS-Klasse, noch nicht spezifiziert + * @var string Themenfarbe des Faches als hexcode */ public string $color; From 43ef23aacf733dede340ae289a3ded24e18e1b45 Mon Sep 17 00:00:00 2001 From: Matthias Grief Date: Sun, 1 Dec 2024 21:09:34 +0100 Subject: [PATCH 2/6] Loginschnittstelle eingebaut --- webseite/classes/User.php | 172 ++++++++++++++++++++++++++++++++++++++ webseite/classes/Util.php | 9 ++ webseite/test.php | 1 + 3 files changed, 182 insertions(+) create mode 100644 webseite/classes/User.php create mode 100644 webseite/test.php diff --git a/webseite/classes/User.php b/webseite/classes/User.php new file mode 100644 index 0000000..dba2246 --- /dev/null +++ b/webseite/classes/User.php @@ -0,0 +1,172 @@ + 100) { + return false; + } + if(strlen($password) > 100) { + return false; + } + + if (Util::containsIllegalCharacters($username)) { + return false; + } + + $passwordHash = password_hash($password, PASSWORD_ARGON2I); + + if(!is_dir(self::$userdataDirectory)) { + mkdir(self::$userdataDirectory); + } + + $file = fopen(self::$userdataDirectory . self::$userdataFile, "a"); + if (!$file) { + return false; + } + + fputcsv($file, array($username, $passwordHash)); + fclose($file); + + return self::getFromUsername($username); + } + + /** + * Gibt einen Benutzer anhand eines Benutzernamen zurück + * @param string $username Benutzername nach dem gesucht wird + * @return User|false Der gefundene Besucher oder false, wenn der Benutzer nicht gefunden wurde + */ + public static function getFromUsername(string $username): User|false + { + if (!file_exists(self::$userdataDirectory . self::$userdataFile)) { + return false; + } + + $file = fopen(self::$userdataDirectory . self::$userdataFile, "r"); + if (!$file) { + return false; + } + + while (($data = fgetcsv($file, 300)) !== false) { + if (count($data) != 2) { + continue; + } + if ($data[0] !== $username) { + continue; + } + + $user = new User(); + $user->username = $data[0]; + $user->passwordHash = $data[1]; + return $user; + } + + fclose($file); + + return false; + } + + /** + * Meldet den Benutzer an, wenn das Passwort richtig ist + * @param string $password Passwort + * @return bool true, wenn erfolgreich, sonst false + */ + public function login(string $password): bool + { + if(!password_verify($password, $this->passwordHash)) { + return false; + } + + if($this->isLoggedIn()) { + return false; + } + + $_SESSION["user"] = $this; + $_SESSION["login_time"] = time(); + + return true; + } + + /** + * Prüft, ob ein Benutzer angemeldet ist + * @return bool true, wenn angemeldet, sonst false + */ + public function isLoggedIn(): bool + { + if(!isset($_SESSION["user"])) { + return false; + } + + if($_SESSION["user"] != $this) { + return false; + } + + if(time() - $_SESSION["login_time"] > 86400 * 5) { + session_unset(); + session_destroy(); + return false; + } + + $_SESSION["login_time"] = time(); + + return true; + } + + /** + * Meldet den Benutzer ab + * @return bool true, wenn erfolgreich abgemeldet, false, wenn vorher schon abgemeldet + */ + public function logout(): bool + { + if(!$this->isLoggedIn()) { + return false; + } + + session_unset(); + session_destroy(); + + return true; + } + + /** + * Gibt den Benutzernamen zurück + * @return string Benutzername + */ + public function getUsername(): string + { + return $this->username; + } +} \ No newline at end of file diff --git a/webseite/classes/Util.php b/webseite/classes/Util.php index e83349f..f118056 100644 --- a/webseite/classes/Util.php +++ b/webseite/classes/Util.php @@ -15,6 +15,15 @@ class Util return preg_replace("/[^a-zA-Z0-9_-]/", "", $string); } + static function containsIllegalCharacters(string $string): bool + { + if(preg_match("/[^a-zA-Z0-9_-]/", $string)) { + return true; + } + + return false; + } + static function readFileContent(string $filename): string|null { if (!file_exists($filename)) { diff --git a/webseite/test.php b/webseite/test.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/webseite/test.php @@ -0,0 +1 @@ + Date: Mon, 2 Dec 2024 13:25:32 +0100 Subject: [PATCH 3/6] =?UTF-8?q?Passwortpr=C3=BCfung=20eingebaut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webseite/classes/User.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/webseite/classes/User.php b/webseite/classes/User.php index dba2246..84278fe 100644 --- a/webseite/classes/User.php +++ b/webseite/classes/User.php @@ -99,6 +99,16 @@ class User return false; } + /** + * Prüft, ob ein Passwort für diesen Benutzer korrekt ist + * @param string $password Zu prüfendes Passwort + * @return bool true, wenn korrekt, sonst false + */ + public function isPasswordCorrect(string $password): bool + { + return password_verify($password, $this->passwordHash); + } + /** * Meldet den Benutzer an, wenn das Passwort richtig ist * @param string $password Passwort @@ -106,7 +116,7 @@ class User */ public function login(string $password): bool { - if(!password_verify($password, $this->passwordHash)) { + if(!$this->isPasswordCorrect($password)) { return false; } From f4601e1840077ec5b219a4edc3531e85ac557aef Mon Sep 17 00:00:00 2001 From: Matthias Grief Date: Mon, 2 Dec 2024 13:54:15 +0100 Subject: [PATCH 4/6] =?UTF-8?q?L=C3=B6schen=20von=20User=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webseite/classes/User.php | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/webseite/classes/User.php b/webseite/classes/User.php index 84278fe..0608b41 100644 --- a/webseite/classes/User.php +++ b/webseite/classes/User.php @@ -99,6 +99,51 @@ class User return false; } + /** + * Löscht einen Benutzer + * @param string $password Richtiges Passwort zu diesem Nutzer + * @return bool true, wenn erfolgreich gelöscht, sonst false + */ + public function delete(string $password): bool + { + if(!$this->isPasswordCorrect($password)) { + return false; + } + + if(!$this->logout()) { + return false; + } + + $file = fopen(self::$userdataDirectory . self::$userdataFile, "r"); + if(!$file) { + return false; + } + + $newCsv = array(); + + while (($data = fgetcsv($file, 300)) !== false) { + if (count($data) != 2) { + continue; + } + if ($data[0] !== $this->username) { + $newCsv[] = $data; + } + } + fclose($file); + + $file = fopen(self::$userdataDirectory . self::$userdataFile, "w"); + if(!$file) { + return false; + } + + foreach ($newCsv as $newCsvData) { + fputcsv($file, $newCsvData); + } + fclose($file); + + return true; + } + /** * Prüft, ob ein Passwort für diesen Benutzer korrekt ist * @param string $password Zu prüfendes Passwort From 5e87a8654c9bb3bd06ab49f05132e331e6fbb731 Mon Sep 17 00:00:00 2001 From: Matthias Grief Date: Mon, 2 Dec 2024 14:58:07 +0100 Subject: [PATCH 5/6] =?UTF-8?q?Passwort=20=C3=A4ndern=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webseite/classes/User.php | 54 +++++++++++++++++++++++++++++++++++++-- webseite/test.php | 1 - webseite/users/users.csv | 1 + 3 files changed, 53 insertions(+), 3 deletions(-) delete mode 100644 webseite/test.php create mode 100644 webseite/users/users.csv diff --git a/webseite/classes/User.php b/webseite/classes/User.php index 0608b41..fecff9d 100644 --- a/webseite/classes/User.php +++ b/webseite/classes/User.php @@ -36,6 +36,10 @@ class User */ public static function createUser(string $username, string $password): User|false { + if(self::getFromUsername($username) !== false) { + return false; + } + if(strlen($username) > 100) { return false; } @@ -141,6 +145,54 @@ class User } fclose($file); + unset($this->username); + unset($this->passwordHash); + + return true; + } + + /** + * Ändert das Passwort des Accounts + * @param string $oldPassword altes Passwort + * @param string $newPassword Neues Passwort + * @return bool true, wenn erfolgreich geändert, sonst false + */ + public function changePassword(string $oldPassword, string $newPassword): bool + { + if(!$this->isPasswordCorrect($oldPassword)) { + return false; + } + + if(!$this->logout()) { + return false; + } + + $file = fopen(self::$userdataDirectory . self::$userdataFile, "c+"); + if(!$file) { + return false; + } + + $this->passwordHash = password_hash($newPassword, PASSWORD_ARGON2I); + + $lastLine = ftell($file); + while (($data = fgetcsv($file, 300)) !== false) { + if (count($data) != 2) { + + } else if ($data[0] !== $this->username) { + + } else { + $data[1] = $this->passwordHash; + + fseek($file, $lastLine); + + fputcsv($file, $data); + break; + } + + $lastLine = ftell($file); + } + fclose($file); + return true; } @@ -191,7 +243,6 @@ class User if(time() - $_SESSION["login_time"] > 86400 * 5) { session_unset(); - session_destroy(); return false; } @@ -211,7 +262,6 @@ class User } session_unset(); - session_destroy(); return true; } diff --git a/webseite/test.php b/webseite/test.php deleted file mode 100644 index b3d9bbc..0000000 --- a/webseite/test.php +++ /dev/null @@ -1 +0,0 @@ - Date: Mon, 2 Dec 2024 15:14:18 +0100 Subject: [PATCH 6/6] Dokumentation angepasst --- webseite/classes/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webseite/classes/User.php b/webseite/classes/User.php index fecff9d..11ca1c7 100644 --- a/webseite/classes/User.php +++ b/webseite/classes/User.php @@ -23,7 +23,7 @@ class User private string $username; /** - * @var string Passwort, max. 100 Zeichen + * @var string Passworthash */ private string $passwordHash;