Compare commits

..

14 Commits

22 changed files with 404 additions and 1957 deletions
-18
View File
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="IU-261.24374.151">
<data-source name="articles" uuid="315cb5c9-2b0f-435b-b602-59823b160908">
<database-info product="SQLite" version="3.51.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.51.1.0" dbms="SQLITE" exact-version="3.51.1" exact-driver-version="3.51">
<identifier-quote-string>&quot;</identifier-quote-string>
</database-info>
<case-sensitivity plain-identifiers="mixed" quoted-identifiers="mixed" />
<secret-storage>master_key</secret-storage>
<auth-provider>no-auth</auth-provider>
<schema-mapping>
<introspection-scope>
<node kind="schema" qname="@" />
</introspection-scope>
</schema-mapping>
</data-source>
</component>
</project>
-12
View File
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="articles" uuid="315cb5c9-2b0f-435b-b602-59823b160908">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/articles</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>
File diff suppressed because it is too large Load Diff
@@ -1,2 +0,0 @@
#n:main
!<md> [0, 0, null, null, -2147483648, -2147483648]
+3 -2
View File
@@ -53,8 +53,9 @@ if (!isset($_SESSION["user"])) {
<input type="text" id="title" name="title" <input type="text" id="title" name="title"
value="<?php echo htmlspecialchars($_SESSION['old_title'] ?? ''); unset($_SESSION['old_title']); ?>" value="<?php echo htmlspecialchars($_SESSION['old_title'] ?? ''); unset($_SESSION['old_title']); ?>"
placeholder="Titel hier eingeben" required> placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."><?php if (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){echo htmlspecialchars($_SESSION['old_content']); unset($_SESSION['old_content']);}elseif (isset($content) && !empty($content)){echo htmlspecialchars($content);}?></textarea> <textarea id="content" name="content" placeholder="Schreibe deinen Beitrag...">
<?php echo htmlspecialchars($_SESSION['old_content'] ?? ''); unset($_SESSION['old_content']); ?>
</textarea>
</main> </main>
<!-- Seitenleiste --> <!-- Seitenleiste -->
-19
View File
@@ -1,19 +0,0 @@
<?php
require_once "php/model/LocalUserManager.php";
$dao = new LocalUserManager();
/*
Deregistrierung
Funktion: Entfernt User aus Dummy-Daten und beendet Session
*/
if (isset($_SESSION["user_email"])) {
$dao->deleteUser($_SESSION["user_email"]);
}
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
+13 -13
View File
@@ -58,27 +58,28 @@ include_once 'php/controller/showArticle-controller.php';
Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten. Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "not_found_article"): ?>
<p class="alert-message is-error">
Der zu bearbeitende Artikel wurde nicht gefunden. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php <?php
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
<input type="text" id="title" name="title" <input type="text" id="title" name="title"
value="<?php value="<?php
if (isset($_SESSION['old_title']) && !empty($_SESSION['old_title'])){ if (isset($title) && !empty($title)){echo htmlspecialchars($title);
}elseif (isset($_SESSION['old_title']) && !empty($_SESSION['old_title'])){
echo htmlspecialchars($_SESSION['old_title']); echo htmlspecialchars($_SESSION['old_title']);
unset($_SESSION['old_title']); unset($_SESSION['old_title']);
}elseif (isset($title) && !empty($title)){
echo htmlspecialchars($title);
} }
?>" ?>"
placeholder="Titel hier eingeben" required> placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."><?php if (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){echo htmlspecialchars($_SESSION['old_content']); unset($_SESSION['old_content']);}elseif (isset($content) && !empty($content)){echo htmlspecialchars($content);}?></textarea> <textarea id="content" name="content" placeholder="Schreibe deinen Beitrag...">
<?php
if (isset($content) && !empty($content)){echo htmlspecialchars($content);
}elseif (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){
echo htmlspecialchars($_SESSION['old_content']);
unset($_SESSION['old_content']);
}
?>
</textarea>
</main> </main>
<!-- Seitenleiste --> <!-- Seitenleiste -->
@@ -137,11 +138,10 @@ include_once 'php/controller/showArticle-controller.php';
<label for="tags">Schlagwörter</label> <label for="tags">Schlagwörter</label>
<input type="text" id="tags" name="tags" <input type="text" id="tags" name="tags"
value="<?php value="<?php
if (isset($_SESSION['old_tags']) && !empty($_SESSION['old_tags'])){ if (isset($tags) && !empty($tags)){echo htmlspecialchars($tags);
} elseif (isset($_SESSION['old_tags']) && !empty($_SESSION['old_tags'])){
echo htmlspecialchars($_SESSION['old_tags']); echo htmlspecialchars($_SESSION['old_tags']);
unset($_SESSION['old_tags']); unset($_SESSION['old_tags']);
} elseif (isset($tags) && !empty($tags)){
echo htmlspecialchars($tags);
} }
?>" ?>"
placeholder="z.B. Technik, IT (mit Komma trennen)"> placeholder="z.B. Technik, IT (mit Komma trennen)">
+2 -2
View File
@@ -17,12 +17,12 @@ if ($pfad === "register") {
} }
if ($pfad === "logout") { if ($pfad === "logout") {
include_once "content/logout.php"; include_once "content/logout-controller.php";
exit(); exit();
} }
if ($pfad === "deleteAccount") { if ($pfad === "deleteAccount") {
include_once "content/deleteAccount.php"; include_once "content/deleteAccount-controller.php";
exit(); exit();
} }
?> ?>
@@ -3,7 +3,6 @@ SESSION_START();
require_once '../model/LocalArticleManager.php'; require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php'; require_once '../model/ArticleManager.php';
require_once '../validator/article-validator.php'; require_once '../validator/article-validator.php';
require_once "../model/LocalUserManager.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$_SESSION["old_title"] = $_POST["title"] ?? ''; $_SESSION["old_title"] = $_POST["title"] ?? '';
@@ -0,0 +1,30 @@
<?php
require_once "php/model/UserManager.php";
/*
Deregistrierung
Funktion: Entfernt User aus der Datenbank und beendet die Session
*/
try {
$dao = UserManager::getInstance();
if (isset($_SESSION["user_email"])) {
$dao->deleteUser($_SESSION["user_email"]);
}
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
} catch (Exception $e) {
$_SESSION["message"] = "internal_error";
header("Location: index.php?pfad=profile");
exit();
}
+17 -15
View File
@@ -1,8 +1,7 @@
<?php <?php
require_once "php/model/LocalUserManager.php"; require_once "php/model/UserManager.php";
$dao = new LocalUserManager();
$error = null; $error = null;
/* /*
@@ -11,25 +10,28 @@ $error = null;
*/ */
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = $_POST["email"] ?? ""; try {
$password = $_POST["password"] ?? "";
$user = $dao->findUser($email); $dao = UserManager::getInstance();
if ($user && password_verify($password, $user["password"])) { $email = $_POST["email"] ?? "";
$password = $_POST["password"] ?? "";
$user = $dao->findUser($email);
if ($user && password_verify($password, $user["password"])) {
if (isset($user["vorname"]) && isset($user["nachname"])) {
$_SESSION["user"] = $user["vorname"] . " " . $user["nachname"]; $_SESSION["user"] = $user["vorname"] . " " . $user["nachname"];
$_SESSION["user_email"] = $user["email"];
header("Location: index.php");
exit();
} else { } else {
$_SESSION["user"] = $user["username"] ?? ""; $error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben.";
} }
$_SESSION["user_email"] = $user["email"]; } catch (Exception $e) {
$error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.";
header("Location: index.php");
exit();
} else {
$error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben.";
} }
} }
+5 -5
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once "php/model/LocalUserManager.php"; require_once "php/model/UserManager.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";
require_once "php/validator/user-validator.php"; require_once "php/validator/user-validator.php";
@@ -13,7 +13,7 @@ if (!isset($_SESSION["user"])) {
} }
try { try {
$dao = new LocalUserManager(); $dao = UserManager::getInstance();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
@@ -38,15 +38,15 @@ try {
$_GET["edit"] = "1"; $_GET["edit"] = "1";
} elseif (!userNameValidator($vorname)) { } elseif (!userNameValidator($vorname)) {
$error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; $error = "Der Vorname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
$_GET["edit"] = "1"; $_GET["edit"] = "1";
} elseif (!userNameValidator($nachname)) { } elseif (!userNameValidator($nachname)) {
$error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."; $error = "Der Nachname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
$_GET["edit"] = "1"; $_GET["edit"] = "1";
} elseif (!userOptionalPasswordValidator($password)) { } elseif (!userOptionalPasswordValidator($password)) {
$error = "Das Passwort muss 8 bis 72 Zeichen lang sein."; $error = "Das Passwort muss 5 bis 12 Zeichen lang sein.";
$_GET["edit"] = "1"; $_GET["edit"] = "1";
} else { } else {
@@ -5,10 +5,10 @@
require_once 'php/model/Article.php'; require_once 'php/model/Article.php';
require_once 'php/model/ArticleManager.php'; require_once 'php/model/ArticleManager.php';
require_once "../model/LocalUserManager.php"; require_once "php/model/UserManager.php";
try { try {
$dao = new LocalUserManager(); $dao = UserManager::getInstance();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
$author = $user["email"]; $author = $user["email"];
+5 -5
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once "php/model/LocalUserManager.php"; require_once "php/model/UserManager.php";
require_once "php/validator/user-validator.php"; require_once "php/validator/user-validator.php";
$error = null; $error = null;
@@ -15,14 +15,14 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!userEmailValidator($email)) { if (!userEmailValidator($email)) {
$error = "Bitte gib eine gültige E-Mail-Adresse ein."; $error = "Bitte gib eine gültige E-Mail-Adresse ein.";
} elseif (!userNameValidator($vorname)) { } elseif (!userNameValidator($vorname)) {
$error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten."; $error = "Der Vorname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten.";
} elseif (!userNameValidator($nachname)) { } elseif (!userNameValidator($nachname)) {
$error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten."; $error = "Der Nachname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten.";
} elseif (!userPasswordValidator($plainPassword)) { } elseif (!userPasswordValidator($plainPassword)) {
$error = "Das Passwort muss 8 bis 72 Zeichen lang sein."; $error = "Das Passwort muss 5 bis 12 Zeichen lang sein.";
} else { } else {
try { try {
$dao = new LocalUserManager(); $dao = UserManager::getInstance();
$password = password_hash($plainPassword, PASSWORD_DEFAULT); $password = password_hash($plainPassword, PASSWORD_DEFAULT);
+7 -7
View File
@@ -21,7 +21,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){ if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){
$_SESSION["message"] = "missing_parameters"; $_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
}else{ }else{
$title = $_POST["title"]; $title = $_POST["title"];
@@ -33,31 +33,31 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
// -------------------------------- Validierung der Daten: ------------------------- // -------------------------------- Validierung der Daten: -------------------------
if (!articleAuthorValidator($author)) { if (!articleAuthorValidator($author)) {
$_SESSION["message"] = "author_not_valid"; $_SESSION["message"] = "author_not_valid";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
if (!articleTitleValidator($title)) { if (!articleTitleValidator($title)) {
$_SESSION["message"] = "invalid_title"; $_SESSION["message"] = "invalid_title";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
if (!articleContentValidator($content)) { if (!articleContentValidator($content)) {
$_SESSION["message"] = "invalid_content"; $_SESSION["message"] = "invalid_content";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
if (!articleCategoryValidator($category)) { if (!articleCategoryValidator($category)) {
$_SESSION["message"] = "invalid_category"; $_SESSION["message"] = "invalid_category";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
if (!articleTagValidator($tags)) { if (!articleTagValidator($tags)) {
$_SESSION["message"] = "invalid_tags"; $_SESSION["message"] = "invalid_tags";
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} else { } else {
$cleanedTags = []; $cleanedTags = [];
@@ -83,7 +83,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$articleManager->updateArticle($id ,$article, $author); $articleManager->updateArticle($id ,$article, $author);
} catch (Exception $e){ } catch (Exception $e){
$_SESSION["message"] = $e->getMessage(); $_SESSION["message"] = $e->getMessage();
header("location: ../../index.php?pfad=updateArticle&id=$id"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
$_SESSION["message"] = "article_updated"; $_SESSION["message"] = "article_updated";
+4 -2
View File
@@ -20,8 +20,10 @@ class DatabaseArticleManager implements ArticleManagerDAO {
{ {
if (!file_exists(__DIR__ . '/../../db/articles.db')) { if (!file_exists(__DIR__ . '/../../db/articles.db')) {
try { try {
$user = 'root';
$db = $this->getConnection(); $pw = null;
$dsn = 'sqlite:' . __DIR__ . '/../../db/articles.db';
$db = new PDO($dsn, $user, $pw);
$db->exec(" $db->exec("
CREATE TABLE articles ( CREATE TABLE articles (
+240 -5
View File
@@ -1,26 +1,261 @@
<?php <?php
require_once "UserManagerDAO.php"; require_once "UserManagerDAO.php";
/**
* Klasse für den Zugriff auf Benutzerdaten über eine SQLite-Datenbank.
*
* Diese Klasse verwendet PDO, Prepared Statements und speichert
* Benutzerdaten in der Datei db/users.db.
*/
class DatabaseUserManager implements UserManagerDAO { class DatabaseUserManager implements UserManagerDAO {
private static $instance = null;
/**
* Konstruktor.
*
* Erstellt die Benutzerdatenbank und die Tabelle users,
* falls diese noch nicht existieren.
*
* @throws RuntimeException wenn die Datenbank nicht erstellt werden kann
*/
public function __construct()
{
try {
$db = $this->getConnection();
$db->exec("
CREATE TABLE IF NOT EXISTS users (
email TEXT PRIMARY KEY,
vorname TEXT NOT NULL,
nachname TEXT NOT NULL,
password TEXT NOT NULL
);
");
unset($db);
} catch (PDOException $e) {
throw new RuntimeException("Benutzerdatenbank konnte nicht erstellt werden.");
}
}
/**
* Baut eine Verbindung zur SQLite-Datenbank auf.
*
* @return PDO Datenbankverbindung
*
* @throws RuntimeException wenn keine Verbindung hergestellt werden kann
*/
private function getConnection()
{
try {
$dsn = 'sqlite:' . __DIR__ . '/../../db/users.db';
$db = new PDO($dsn, null, null);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
} catch (PDOException $e) {
throw new RuntimeException("Verbindung zur Benutzerdatenbank fehlgeschlagen.");
}
}
/**
* Gibt die Singleton-Instanz des DatabaseUserManagers zurück.
*
* @return DatabaseUserManager Instanz des DatabaseUserManagers
*/
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new DatabaseUserManager();
}
return self::$instance;
}
/**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des Benutzers
*
* @return array|null Benutzerdaten als Array oder null,
* wenn kein Benutzer gefunden wurde
*
* @throws RuntimeException wenn der Benutzer nicht geladen werden kann
*/
public function findUser($email) public function findUser($email)
{ {
// TODO: Implement findUser() method. try {
$db = $this->getConnection();
$sql = "SELECT * FROM users WHERE email = :email";
$command = $db->prepare($sql);
$command->execute([
":email" => $email
]);
$user = $command->fetch(PDO::FETCH_ASSOC);
return $user ?: null;
} catch (PDOException $e) {
throw new RuntimeException("Benutzer konnte nicht geladen werden.");
}
} }
/**
* Fügt einen neuen Benutzer in die Datenbank ein.
*
* Die Speicherung erfolgt innerhalb einer Transaktion.
* Doppelte E-Mail-Adressen werden durch den Primary Key verhindert.
*
* @param string $email E-Mail-Adresse des Benutzers
* @param string $vorname Vorname des Benutzers
* @param string $nachname Nachname des Benutzers
* @param string $password Passwort-Hash des Benutzers
*
* @return void
*
* @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn der Benutzer nicht gespeichert werden kann
*/
public function addUser($email, $vorname, $nachname, $password) public function addUser($email, $vorname, $nachname, $password)
{ {
// TODO: Implement addUser() method. try {
$db = $this->getConnection();
$db->beginTransaction();
$sql = "
INSERT INTO users (email, vorname, nachname, password)
VALUES (:email, :vorname, :nachname, :password)
";
$command = $db->prepare($sql);
$command->execute([
":email" => $email,
":vorname" => $vorname,
":nachname" => $nachname,
":password" => $password
]);
$db->commit();
} catch (PDOException $e) {
if (isset($db) && $db->inTransaction()) {
$db->rollBack();
}
if ($e->getCode() === "23000") {
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
}
throw new RuntimeException("Benutzer konnte nicht gespeichert werden.");
}
} }
/**
* Aktualisiert die Daten eines bestehenden Benutzers.
*
* Optional kann zusätzlich das Passwort geändert werden.
* Wenn kein neues Passwort übergeben wird, bleibt das alte Passwort erhalten.
*
* @param string $oldEmail Aktuelle E-Mail-Adresse des Benutzers
* @param string $newEmail Neue E-Mail-Adresse des Benutzers
* @param string $vorname Neuer Vorname des Benutzers
* @param string $nachname Neuer Nachname des Benutzers
* @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 der Benutzer nicht aktualisiert werden kann
*/
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null)
{ {
// TODO: Implement updateUser() method. try {
$db = $this->getConnection();
if (!empty($password)) {
$sql = "
UPDATE users
SET email = :newEmail,
vorname = :vorname,
nachname = :nachname,
password = :password
WHERE email = :oldEmail
";
$params = [
":newEmail" => $newEmail,
":vorname" => $vorname,
":nachname" => $nachname,
":password" => password_hash($password, PASSWORD_DEFAULT),
":oldEmail" => $oldEmail
];
} else {
$sql = "
UPDATE users
SET email = :newEmail,
vorname = :vorname,
nachname = :nachname
WHERE email = :oldEmail
";
$params = [
":newEmail" => $newEmail,
":vorname" => $vorname,
":nachname" => $nachname,
":oldEmail" => $oldEmail
];
}
$command = $db->prepare($sql);
$command->execute($params);
return $command->rowCount() > 0;
} catch (PDOException $e) {
if ($e->getCode() === "23000") {
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
}
throw new RuntimeException("Benutzer konnte nicht aktualisiert werden.");
}
} }
/**
* 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 der Benutzer nicht gelöscht werden kann
*/
public function deleteUser($email) public function deleteUser($email)
{ {
// TODO: Implement deleteUser() method. try {
} $db = $this->getConnection();
$sql = "DELETE FROM users WHERE email = :email";
$command = $db->prepare($sql);
$command->execute([
":email" => $email
]);
return $command->rowCount() > 0;
} catch (PDOException $e) {
throw new RuntimeException("Benutzer konnte nicht gelöscht werden.");
}
}
} }
+5 -5
View File
@@ -66,7 +66,7 @@ class LocalArticleManager implements ArticleManagerDAO {
public function updateArticle($id, $article, $author) public function updateArticle($id, $article, $author)
{ {
if (empty($article)) { if (empty($article)) {
throw new NotFoundException("not_found_article"); throw new InternalServerErrorException("internal_error");
} }
// Berechtigungsprüfung: // Berechtigungsprüfung:
@@ -178,7 +178,7 @@ class LocalArticleManager implements ArticleManagerDAO {
} }
public function search(string $keyword): array public function search(string $keyword): array
{ {
$articles = $this->getAllArticles(); $articles = $this->getAllArticles();
$filteredArticles = []; $filteredArticles = [];
@@ -193,9 +193,9 @@ class LocalArticleManager implements ArticleManagerDAO {
$title = isset($article['title']) ? strtolower((string)$article['title']) : ''; $title = isset($article['title']) ? strtolower((string)$article['title']) : '';
$content = isset($article['content']) ? strtolower((string)$article['content']) : ''; $content = isset($article['content']) ? strtolower((string)$article['content']) : '';
if (($cleanKeyword !== '' && strpos($title, $cleanKeyword) !== false) || if (($cleanKeyword !== '' && strpos($title, $cleanKeyword) !== false) ||
($cleanKeyword !== '' && strpos($content, $cleanKeyword) !== false)) { ($cleanKeyword !== '' && strpos($content, $cleanKeyword) !== false)) {
$filteredArticles[] = new Article( $filteredArticles[] = new Article(
intval($article['id'] ?? 0), intval($article['id'] ?? 0),
$article['title'] ?? '', $article['title'] ?? '',
@@ -208,7 +208,7 @@ class LocalArticleManager implements ArticleManagerDAO {
} }
} }
return $filteredArticles; return $filteredArticles;
} }
public function getArticlesByCategory($category) public function getArticlesByCategory($category)
-2
View File
@@ -162,8 +162,6 @@ class LocalUserManager implements UserManagerDAO {
/** /**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse. * Löscht einen Benutzer anhand seiner E-Mail-Adresse.
* *
* TODO: wenn ein Benutzer gelöscht wird, sollten dann auch seine Beiträge gelöscht werden?
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers * @param string $email E-Mail-Adresse des zu löschenden Benutzers
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false * @return bool true, wenn der Benutzer gelöscht wurde, sonst false
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
+27 -5
View File
@@ -1,10 +1,32 @@
<?php <?php
require_once "UserManagerDAO.php";
class UserManager extends LocalUserManager{ require_once "LocalUserManager.php";
require_once "DatabaseUserManager.php";
public static function getInstance(){ /**
// TODO: implement this. * Zentrale Klasse für den Zugriff auf Benutzerdaten.
// TODO: dummy-user anlegen: - `max.mustermann, test123, mustermann@web.de` (analog zu ArticleManager) *
* Hier kann zwischen lokaler Speicherung und Datenbankspeicherung
* gewechselt werden.
*/
class UserManager {
public static function getInstance() {
$userManager = DatabaseUserManager::getInstance();
/*
* Dummy-User anlegen, falls er noch nicht existiert.
* Passwort: test123
*/
if ($userManager->findUser("mustermann@web.de") == null) {
$userManager->addUser(
"mustermann@web.de",
"Max",
"Mustermann",
password_hash("test12345", PASSWORD_DEFAULT)
);
}
return $userManager;
} }
} }
+44 -2
View File
@@ -1,13 +1,33 @@
<?php <?php
/**
* Prüft, ob ein Vor- oder Nachname gültig ist.
*
* Erlaubt werden Buchstaben, Umlaute, Leerzeichen und Bindestriche.
* Die Länge muss zwischen 2 und 20 Zeichen liegen.
*
* @param string $name Zu prüfender Name
*
* @return bool true wenn der Name gültig ist, sonst false
*/
function userNameValidator($name) function userNameValidator($name)
{ {
$name = trim($name); $name = trim($name);
$namePattern = '/^[a-zA-ZäöüÄÖÜß\s-]{2,50}$/u'; $namePattern = '/^[a-zA-ZäöüÄÖÜß\s-]{2,20}$/u';
return preg_match($namePattern, $name) === 1; return preg_match($namePattern, $name) === 1;
} }
/**
* Prüft, ob eine E-Mail-Adresse gültig ist.
*
* Die E-Mail-Adresse muss dem Standardformat entsprechen
* und darf höchstens 100 Zeichen lang sein.
*
* @param string $email Zu prüfende E-Mail-Adresse
*
* @return bool true wenn die E-Mail-Adresse gültig ist, sonst false
*/
function userEmailValidator($email) function userEmailValidator($email)
{ {
$email = trim($email); $email = trim($email);
@@ -16,13 +36,35 @@ function userEmailValidator($email)
&& mb_strlen($email) <= 100; && mb_strlen($email) <= 100;
} }
/**
* Prüft, ob ein Passwort die Längenanforderungen erfüllt.
*
* Das Passwort muss zwischen 5 und 12 Zeichen lang sein.
*
* @param string $password Zu prüfendes Passwort
*
* @return bool true wenn das Passwort gültig ist, sonst false
*/
function userPasswordValidator($password) function userPasswordValidator($password)
{ {
$zeichenAnzahl = mb_strlen($password); $zeichenAnzahl = mb_strlen($password);
return $zeichenAnzahl >= 8 && $zeichenAnzahl <= 72; return $zeichenAnzahl >= 5 && $zeichenAnzahl <= 12;
} }
/**
* Prüft ein optionales Passwort.
*
* Ein leeres Passwort ist erlaubt und bedeutet,
* dass das bestehende Passwort unverändert bleibt.
* Falls ein Passwort angegeben wurde, wird es
* mit den normalen Passwortregeln geprüft.
*
* @param string|null $password Zu prüfendes Passwort
*
* @return bool true wenn das Passwort gültig oder leer ist,
* sonst false
*/
function userOptionalPasswordValidator($password) function userOptionalPasswordValidator($password)
{ {
if (!isset($password) || $password === '') { if (!isset($password) || $password === '') {