Compare commits
4 Commits
feature/au
...
5bde268b89
Author | SHA1 | Date | |
---|---|---|---|
5bde268b89 | |||
5cef69ae81 | |||
f3699cb287 | |||
1f8e7dc67b |
193
.gitignore
vendored
Normal file
193
.gitignore
vendored
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/intellij,windows,macos,git
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=intellij,windows,macos,git
|
||||||
|
|
||||||
|
### Git ###
|
||||||
|
# Created by git for backups. To disable backups in Git:
|
||||||
|
# $ git config --global mergetool.keepBackup false
|
||||||
|
*.orig
|
||||||
|
|
||||||
|
# Created by git when using merge tools for conflicts
|
||||||
|
*.BACKUP.*
|
||||||
|
*.BASE.*
|
||||||
|
*.LOCAL.*
|
||||||
|
*.REMOTE.*
|
||||||
|
*_BACKUP_*.txt
|
||||||
|
*_BASE_*.txt
|
||||||
|
*_LOCAL_*.txt
|
||||||
|
*_REMOTE_*.txt
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/encodings.xml
|
||||||
|
.idea/php.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
### Intellij Patch ###
|
||||||
|
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||||
|
|
||||||
|
# *.iml
|
||||||
|
# modules.xml
|
||||||
|
# .idea/misc.xml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# Sonarlint plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7973-sonarlint
|
||||||
|
.idea/**/sonarlint/
|
||||||
|
|
||||||
|
# SonarQube Plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
|
||||||
|
.idea/**/sonarIssues.xml
|
||||||
|
|
||||||
|
# Markdown Navigator plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
|
||||||
|
.idea/**/markdown-navigator.xml
|
||||||
|
.idea/**/markdown-navigator-enh.xml
|
||||||
|
.idea/**/markdown-navigator/
|
||||||
|
|
||||||
|
# Cache file creation bug
|
||||||
|
# See https://youtrack.jetbrains.com/issue/JBR-2257
|
||||||
|
.idea/$CACHE_FILE$
|
||||||
|
|
||||||
|
# CodeStream plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/12206-codestream
|
||||||
|
.idea/codestream.xml
|
||||||
|
|
||||||
|
# Azure Toolkit for IntelliJ plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
|
||||||
|
.idea/**/azureSettings.xml
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### macOS Patch ###
|
||||||
|
# iCloud generated files
|
||||||
|
*.icloud
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/intellij,windows,macos,git
|
@@ -1,170 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
use Blog\Model\AuthModel;
|
|
||||||
|
|
||||||
class AuthController
|
|
||||||
{
|
|
||||||
private $model;
|
|
||||||
private $view;
|
|
||||||
|
|
||||||
public function __construct($view)
|
|
||||||
{
|
|
||||||
$this->model = new AuthModel();
|
|
||||||
$this->view = $view;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function showAuthForm()
|
|
||||||
{
|
|
||||||
$this->view->setVars([
|
|
||||||
'labels' => [
|
|
||||||
"email" => "E-Mail-Adresse",
|
|
||||||
"password" => "Passwort",
|
|
||||||
"password_repeat" => "Passwort wiederholen",
|
|
||||||
"old_password" => "Altes Passwort"
|
|
||||||
],
|
|
||||||
'errors' => $_SESSION['auth_errors'] ?? [],
|
|
||||||
'validData' => $_SESSION['auth_validData'] ?? []
|
|
||||||
]);
|
|
||||||
unset($_SESSION['auth_errors'], $_SESSION['auth_validData']);
|
|
||||||
$this->view->render('auth/form');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function login() {
|
|
||||||
$email = $_POST['email'];
|
|
||||||
$password = $_POST['password'];
|
|
||||||
|
|
||||||
$result = $this->model->login($email, $password);
|
|
||||||
|
|
||||||
if ($result === true) {
|
|
||||||
$_SESSION['user'] = $email;
|
|
||||||
|
|
||||||
$this->view->setVars([
|
|
||||||
'loginSuccess' => true,
|
|
||||||
'email' => $email
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
$this->view->setVars([
|
|
||||||
'errors' => ['login' => is_string($result) ? $result : "Login fehlgeschlagen."],
|
|
||||||
'validData' => ['email' => $email],
|
|
||||||
'loginSuccess' => false
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function register() {
|
|
||||||
$data = [
|
|
||||||
'vorname' => $_POST['vorname'] ?? '',
|
|
||||||
'nachname' => $_POST['nachname'] ?? '',
|
|
||||||
'straße' => $_POST['straße'] ?? '',
|
|
||||||
'hausnr' => $_POST['hausnr'] ?? '',
|
|
||||||
'postleitzahl' => $_POST['postleitzahl'] ?? '',
|
|
||||||
'ort' => $_POST['ort'] ?? '',
|
|
||||||
'land' => $_POST['land'] ?? '',
|
|
||||||
'tel' => $_POST['tel'] ?? '',
|
|
||||||
'email' => $_POST['email'] ?? '',
|
|
||||||
'password' => $_POST['password'] ?? '',
|
|
||||||
'password_repeat' => $_POST['password_repeat'] ?? '',
|
|
||||||
'isAdmin' => $_POST['isAdmin'] ?? false,
|
|
||||||
];
|
|
||||||
|
|
||||||
$errors = [];
|
|
||||||
|
|
||||||
if (!$this->model->checkDoublePw($data['password'], $data['password_repeat'])) {
|
|
||||||
$errors['password'] = "Passwörter stimmen nicht überein.";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->pwRequirementCheck($data['password'])) {
|
|
||||||
$errors
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($errors)) {
|
|
||||||
$result = $this->model->register($data);
|
|
||||||
|
|
||||||
if ($result === true) {
|
|
||||||
$this->view->setVars([
|
|
||||||
'success' => "Registrierung war erfolgreich."
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
$errors['register'] = is_string($result) ? $result : "Registrierung fehlgeschlagen.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->view->setVars([
|
|
||||||
'errors' => $errors,
|
|
||||||
'validData' => $data
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function pwRequirementCheck($password){
|
|
||||||
$error = [];
|
|
||||||
|
|
||||||
if(strlen($password) <= 8)
|
|
||||||
$error[] = "min 8 Charackter";
|
|
||||||
if(!preg_match("/[A-Z]/", $password))
|
|
||||||
$error[] = "min one large Character";
|
|
||||||
if(!preg_match("/[a-z]/", $password))
|
|
||||||
$error[] = "min one small charakter";
|
|
||||||
if(!preg_match("/[0-9]/", $password))
|
|
||||||
$error[] = "min one number";
|
|
||||||
if(!preg_match("[^a-zA-Z0-9\s]", $password));
|
|
||||||
$error[] = "min one special character";
|
|
||||||
|
|
||||||
if(empty($error))
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function forgotPassword() {
|
|
||||||
$email = $_POST['email'] ?? '';
|
|
||||||
if (empty($email)) {
|
|
||||||
$_SESSION['auth_errors']['email'] = "Bitte E-Mail-Adresse angeben.";
|
|
||||||
header("Location: /?controller=Auth&do=showAuthForm");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
$this->model->pwForgot($email);
|
|
||||||
header("Location: /?controller=Auth&do=showConfirmation&msg=pwforgot");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function changePassword()
|
|
||||||
{
|
|
||||||
$email = $_POST['email'] ?? '';
|
|
||||||
$oldpw = $_POST['old_password'] ?? '';
|
|
||||||
$newpw = $_POST['password'] ?? '';
|
|
||||||
$repeat = $_POST['password_repeat'] ?? '';
|
|
||||||
|
|
||||||
if (!$this->model->checkDoublePw($newpw, $repeat)) {
|
|
||||||
$_SESSION['auth_errors']['password'] = "Neue Passwörter stimmen nicht überein.";
|
|
||||||
header("Location: /?controller=Auth&do=showAuthForm");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = $this->model->updatePassword($email, $oldpw, $newpw);
|
|
||||||
|
|
||||||
if ($result === true) {
|
|
||||||
header("Location: /?controller=Auth&do=showConfirmation&msg=pwchange");
|
|
||||||
exit;
|
|
||||||
} else {
|
|
||||||
$_SESSION['auth_errors']['password'] = is_string($result) ? $result : "Fehler beim Aktualisieren des Passworts.";
|
|
||||||
header("Location: /?controller=Auth&do=showAuthForm");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function showConfirmation()
|
|
||||||
{
|
|
||||||
$messages = [
|
|
||||||
'login' => "Login erfolgreich.",
|
|
||||||
'register' => "Registrierung erfolgreich.",
|
|
||||||
'pwforgot' => "Ein temporäres Passwort wurde an Ihre E-Mail gesendet.",
|
|
||||||
'pwchange' => "Passwort erfolgreich geändert."
|
|
||||||
];
|
|
||||||
$msgKey = $_GET['msg'] ?? '';
|
|
||||||
$message = $messages[$msgKey] ?? "Aktion erfolgreich.";
|
|
||||||
$this->view->setVars(['message' => $message]);
|
|
||||||
$this->view->render('auth/confirmation');
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,216 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Blog\Model;
|
|
||||||
|
|
||||||
use DateTime;
|
|
||||||
use PDO;
|
|
||||||
use PDOException;
|
|
||||||
|
|
||||||
class AuthModel extends Database
|
|
||||||
{
|
|
||||||
public function login(string $email, string $password)
|
|
||||||
{
|
|
||||||
$pdo = $this->linkDB();
|
|
||||||
$sql = "SELECT email, password, validUntil FROM user WHERE email = :email";
|
|
||||||
$params = [":email" => $email];
|
|
||||||
|
|
||||||
try {
|
|
||||||
$sth = $pdo->prepare($sql);
|
|
||||||
$sth->execute($params);
|
|
||||||
$user = $sth->fetch(PDO::FETCH_ASSOC);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler beim Abrufen der Benutzerdaten.", $e);
|
|
||||||
return "Interner Datenbankfehler."; // Nur für Debug sichtbar machen, sonst besser allgemein halten
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$user) {
|
|
||||||
return "Benutzer mit dieser E-Mail wurde nicht gefunden.";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!password_verify($password, $user['password'])) {
|
|
||||||
return "Das eingegebene Passwort ist falsch.";
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$now = new DateTime();
|
|
||||||
$validUntil = new DateTime($user['validUntil']);
|
|
||||||
|
|
||||||
if ($now > $validUntil) {
|
|
||||||
return "Ihr Passwort ist abgelaufen. Bitte setzen Sie ein neues über \"Passwort vergessen\".";
|
|
||||||
}
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler beim Verarbeiten des Gültigkeitsdatums.", $e);
|
|
||||||
return "Fehler bei der Passwortprüfung.";
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function register($data)
|
|
||||||
{
|
|
||||||
$rtn = $this->pwRequirementCheck($data['password']);
|
|
||||||
if ($rtn !== true) {
|
|
||||||
return $rtn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
|
||||||
return "Bitte geben Sie eine gültige E-Mail ein.";
|
|
||||||
}
|
|
||||||
|
|
||||||
$requiredFields = [
|
|
||||||
'email', 'password', 'straße', 'hausnr', 'ort', 'postleitzahl',
|
|
||||||
'land', 'vorname', 'nachname', 'tel'
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($requiredFields as $field) {
|
|
||||||
if (empty($data[$field])) {
|
|
||||||
return "Bitte füllen Sie alle Felder aus.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->userExistsByEmail($data['email'])) {
|
|
||||||
return "Ein Account mit dieser E-Mail existiert bereits.";
|
|
||||||
}
|
|
||||||
|
|
||||||
$hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT);
|
|
||||||
|
|
||||||
$sql = "INSERT INTO user (email, password, straße, hausnr, ort, postleitzahl, land,vorname, nachname, tel, isAdmin)
|
|
||||||
VALUES (:email, :password, :straße, :hausnr, :ort, :postleitzahl, :land,:vorname, :nachname, :tel, :isAdmin)";
|
|
||||||
|
|
||||||
$params = [
|
|
||||||
':email' => $data['email'],
|
|
||||||
':password' => $hashedPassword,
|
|
||||||
':straße' => $data['straße'],
|
|
||||||
':hausnr' => $data['hausnr'],
|
|
||||||
':ort' => $data['ort'],
|
|
||||||
':postleitzahl'=> $data['postleitzahl'],
|
|
||||||
':land'=> $data['land'],
|
|
||||||
':vorname' => $data['vorname'],
|
|
||||||
':nachname'=> $data['nachname'],
|
|
||||||
':tel' => $data['tel'],
|
|
||||||
':isAdmin' => $data['isAdmin'] ? 1 : 0,
|
|
||||||
];
|
|
||||||
|
|
||||||
try {
|
|
||||||
$pdo = $this->linkDB();
|
|
||||||
$stmt = $pdo->prepare($sql);
|
|
||||||
$stmt->execute($params);
|
|
||||||
return true;
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function userExistsByEmail($email) {
|
|
||||||
try {
|
|
||||||
$pdo = $this->linkDB();
|
|
||||||
|
|
||||||
$sql = "SELECT userid FROM user WHERE email = :email";
|
|
||||||
$params = [':email' => $email];
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare($sql);
|
|
||||||
$stmt->execute($params);
|
|
||||||
|
|
||||||
return (bool) $stmt->fetch();
|
|
||||||
} catch (\PDOException $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler bei der E-Mail-Prüfung", $e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function pwForgot($email){
|
|
||||||
$randomPw = bin2hex(random_bytes(12 / 2));
|
|
||||||
$hashedPassword = password_hash($randomPw, PASSWORD_DEFAULT);
|
|
||||||
|
|
||||||
$this->forgottenPwUpdate($email, $hashedPassword);
|
|
||||||
|
|
||||||
$betreff = "Passwort zurücksetzen bei bibArts";
|
|
||||||
$nachricht = "Hallo,\n\nhier ihr temporäres Passwort:\n\n $randomPw \n\n Bitte beachten Sie, dass das Passwort nur 2 stunden Gülltig ist. \nViele Grüße,\nbibArts Team";
|
|
||||||
|
|
||||||
$header = "From: noreply@edu.bib.de\r\n";
|
|
||||||
$header .= "Content-Type: text/plain; charset=UTF-8\r\n";
|
|
||||||
|
|
||||||
$maxTries = 5;
|
|
||||||
$try = 0;
|
|
||||||
$success = false;
|
|
||||||
|
|
||||||
while ($try < $maxTries && !$success) {
|
|
||||||
$erfolg = mail($email, $betreff, $nachricht, $header);
|
|
||||||
$try++;
|
|
||||||
if (!$erfolg) {
|
|
||||||
error_log("Mailversuch $try an $email fehlgeschlagen.");
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function forgottenPwUpdate($email, $hashedPassword)
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
$pdo = $this->linkDB();
|
|
||||||
|
|
||||||
$sqlCheck = "SELECT COUNT(*) FROM user WHERE email = :email";
|
|
||||||
$stmt = $pdo->prepare($sqlCheck);
|
|
||||||
$stmt->execute([':email' => $email]);
|
|
||||||
if ($stmt->fetchColumn() == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$validUntil = (new DateTime())->add(new DateInterval('PT2H'))->format('Y-m-d H:i:s');
|
|
||||||
|
|
||||||
|
|
||||||
$sql = "UPDATE user
|
|
||||||
SET password = :password, validUntil = :validUntil
|
|
||||||
WHERE email = :email";
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare($sql);
|
|
||||||
return $stmt->execute([
|
|
||||||
':email' => $email,
|
|
||||||
':password' => $hashedPassword,
|
|
||||||
':validUntil' => $validUntil
|
|
||||||
]);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren der Daten.", $e);
|
|
||||||
die;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function updatePassword($email, $oldpw, $newpw){
|
|
||||||
if(!$this->login($email, $oldpw)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$requiredFields = [$email, $oldpw, $newpw];
|
|
||||||
foreach ($requiredFields as $field) {
|
|
||||||
if (empty($field)) {
|
|
||||||
return "Bitte füllen Sie alle Felder aus";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$hashedPassword = password_hash($newpw, PASSWORD_DEFAULT);
|
|
||||||
|
|
||||||
$sql = "INSERT INTO user (email, password)
|
|
||||||
VALUES (:email, :password)";
|
|
||||||
|
|
||||||
try{
|
|
||||||
$pdo = $this->linkDB();
|
|
||||||
$stmt = $pdo->prepare($sql);
|
|
||||||
return $stmt->execute([
|
|
||||||
':email' => $email,
|
|
||||||
':password' => $hashedPassword,
|
|
||||||
]);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e);
|
|
||||||
die;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function checkDoublePw($password1, $password2){
|
|
||||||
if($password1 === $password2){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
include dirname(__DIR__).'/header.phtml';
|
|
||||||
?>
|
|
||||||
|
|
||||||
<?php if (!empty($errors['login'])): ?>
|
|
||||||
<div class="error">
|
|
||||||
<?php echo htmlspecialchars($errors['login']); ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php elseif (!empty($loginSuccess)): ?>
|
|
||||||
<div class="msg">
|
|
||||||
<p>Login für Benutzer <?php echo htmlspecialchars($_SESSION["user"]); ?> erfolgreich</p>
|
|
||||||
<a href="?controller=Welcome&do=showWelcome">Weiter</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php else: ?>
|
|
||||||
<!-- Formular anzeigen -->
|
|
||||||
<form method="post">
|
|
||||||
<input type="hidden" name="controller" value="Auth">
|
|
||||||
<input type="hidden" name="do" value="login">
|
|
||||||
|
|
||||||
<label for="email">E-Mail:</label>
|
|
||||||
<input type="email" name="email" id="email" value="<?= htmlspecialchars($validData['email'] ?? '') ?>">
|
|
||||||
|
|
||||||
<label for="password">Passwort:</label>
|
|
||||||
<input type="password" name="password" id="password">
|
|
||||||
|
|
||||||
<button type="submit">Einloggen</button>
|
|
||||||
</form>
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
|
|
||||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
|
@@ -1,61 +0,0 @@
|
|||||||
<?php include dirname(__DIR__).'/header.phtml'; ?>
|
|
||||||
|
|
||||||
<?php if (!empty($success)) : ?>
|
|
||||||
<div class="success-message" style="color: green; margin-bottom: 1em;">
|
|
||||||
<p><?php echo htmlspecialchars($success); ?></p>
|
|
||||||
</div>
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<?php if (!empty($errors)) : ?>
|
|
||||||
<div class="error-messages" style="color: red; margin-bottom: 1em;">
|
|
||||||
<ul>
|
|
||||||
<?php foreach ($errors as $field => $error) : ?>
|
|
||||||
<li><?php echo htmlspecialchars($error); ?></li>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<form action="?controller=Auth&do=register" method="post">
|
|
||||||
<label for="vorname">Vorname:</label>
|
|
||||||
<input type="text" name="vorname" id="vorname" value="<?php echo htmlspecialchars($validData['vorname'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="nachname">Nachname:</label>
|
|
||||||
<input type="text" name="nachname" id="nachname" value="<?php echo htmlspecialchars($validData['nachname'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="straße">Straße:</label>
|
|
||||||
<input type="text" name="straße" id="straße" value="<?php echo htmlspecialchars($validData['straße'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="hausnr">Hausnummer:</label>
|
|
||||||
<input type="text" name="hausnr" id="hausnr" value="<?php echo htmlspecialchars($validData['hausnr'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="postleitzahl">Postleitzahl:</label>
|
|
||||||
<input type="text" name="postleitzahl" id="postleitzahl" value="<?php echo htmlspecialchars($validData['postleitzahl'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="ort">Ort:</label>
|
|
||||||
<input type="text" name="ort" id="ort" value="<?php echo htmlspecialchars($validData['ort'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="land">Land:</label>
|
|
||||||
<input type="text" name="land" id="land" value="<?php echo htmlspecialchars($validData['land'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="tel">Telefonnummer:</label>
|
|
||||||
<input type="text" name="tel" id="tel" value="<?php echo htmlspecialchars($validData['tel'] ?? ''); ?>">
|
|
||||||
|
|
||||||
<label for="email">E-Mail-Adresse:</label>
|
|
||||||
<input type="email" name="email" id="email" value="<?php echo htmlspecialchars($validData['email'] ?? ''); ?>" required>
|
|
||||||
|
|
||||||
<label for="password">Passwort:</label>
|
|
||||||
<input type="password" name="password" id="password" required>
|
|
||||||
|
|
||||||
<label for="password_repeat">Passwort wiederholen:</label>
|
|
||||||
<input type="password" name="password_repeat" id="password_repeat" required>
|
|
||||||
|
|
||||||
<label for="isAdmin">
|
|
||||||
<input type="checkbox" name="isAdmin" id="isAdmin" value="1" <?php echo (!empty($validData['isAdmin'])) ? 'checked' : ''; ?>>
|
|
||||||
Admin-Rechte
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<button type="submit">Registrieren</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
|
194
bibarts.sql
194
bibarts.sql
@@ -1,138 +1,124 @@
|
|||||||
CREATE TABLE user (
|
-- phpMyAdmin SQL Dump
|
||||||
userid INT AUTO_INCREMENT PRIMARY KEY,
|
-- version 4.5.1
|
||||||
vorname VARCHAR(50),
|
-- http://www.phpmyadmin.net
|
||||||
nachname VARCHAR(50),
|
--
|
||||||
straße VARCHAR(100),
|
-- Host: 127.0.0.1
|
||||||
hausnr VARCHAR(10),
|
-- Erstellungszeit: 24. Nov 2017 um 17:01
|
||||||
postleitzahl VARCHAR(10),
|
-- Server-Version: 10.1.16-MariaDB
|
||||||
ort VARCHAR(50),
|
-- PHP-Version: 7.0.9
|
||||||
land VARCHAR(50),
|
|
||||||
tel VARCHAR(20),
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
email VARCHAR(100) UNIQUE,
|
SET time_zone = "+00:00";
|
||||||
isAdmin BOOLEAN DEFAULT FALSE,
|
|
||||||
password VARCHAR(255)
|
--
|
||||||
|
-- Datenbank: `blog`
|
||||||
|
--
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE User (
|
||||||
|
userid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
vorname VARCHAR(50),
|
||||||
|
nachname VARCHAR(50),
|
||||||
|
straße VARCHAR(100),
|
||||||
|
hausnr VARCHAR(10),
|
||||||
|
postleitzahl VARCHAR(10),
|
||||||
|
ort VARCHAR(50),
|
||||||
|
land VARCHAR(50),
|
||||||
|
tel VARCHAR(20),
|
||||||
|
email VARCHAR(100) UNIQUE,
|
||||||
|
isAdmin BOOLEAN DEFAULT FALSE,
|
||||||
|
password VARCHAR(255)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE standort (
|
CREATE TABLE Standort (
|
||||||
standortid INT AUTO_INCREMENT PRIMARY KEY,
|
standortid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
straße VARCHAR(100),
|
straße VARCHAR(100),
|
||||||
hausnr VARCHAR(10),
|
hausnr VARCHAR(10),
|
||||||
postleitzahl VARCHAR(10),
|
postleitzahl VARCHAR(10),
|
||||||
ort VARCHAR(50),
|
ort VARCHAR(50),
|
||||||
land VARCHAR(50),
|
land VARCHAR(50),
|
||||||
tel VARCHAR(20),
|
tel VARCHAR(20),
|
||||||
email VARCHAR(100)
|
email VARCHAR(100)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE ausstellung (
|
CREATE TABLE Ausstellung (
|
||||||
austellungid INT AUTO_INCREMENT PRIMARY KEY,
|
austellungid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
standortid INT,
|
standortid INT,
|
||||||
datum_von DATE,
|
datum_von DATE,
|
||||||
datum_bis DATE,
|
datum_bis DATE,
|
||||||
name VARCHAR(100),
|
name VARCHAR(100),
|
||||||
beschreibung TEXT,
|
beschreibung TEXT,
|
||||||
max_tickets INT,
|
max_tickets INT,
|
||||||
FOREIGN KEY (standortid) REFERENCES Standort(standortid)
|
FOREIGN KEY (standortid) REFERENCES Standort(standortid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE ticket (
|
CREATE TABLE Ticket (
|
||||||
ticketid INT AUTO_INCREMENT PRIMARY KEY,
|
ticketid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
userid INT,
|
userid INT,
|
||||||
eventid INT,
|
eventid INT,
|
||||||
kaufdatum DATE,
|
kaufdatum DATE,
|
||||||
gültigkeitsdatum DATE,
|
gültigkeitsdatum DATE,
|
||||||
preis DECIMAL(10,2),
|
preis DECIMAL(10,2),
|
||||||
FOREIGN KEY (userid) REFERENCES User(userid),
|
FOREIGN KEY (userid) REFERENCES User(userid),
|
||||||
FOREIGN KEY (eventid) REFERENCES Ausstellung(austellungid)
|
FOREIGN KEY (eventid) REFERENCES Ausstellung(austellungid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE gutschein (
|
CREATE TABLE Gutschein (
|
||||||
gutscheinid INT AUTO_INCREMENT PRIMARY KEY,
|
gutscheinid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
code VARCHAR(50) UNIQUE,
|
code VARCHAR(50) UNIQUE,
|
||||||
rabatt INT CHECK (rabatt BETWEEN 0 AND 100),
|
rabatt INT CHECK (rabatt BETWEEN 0 AND 100),
|
||||||
eventid INT,
|
eventid INT,
|
||||||
gültigkeit DATE,
|
gültigkeit DATE,
|
||||||
FOREIGN KEY (eventid) REFERENCES Ausstellung(austellungid)
|
FOREIGN KEY (eventid) REFERENCES Ausstellung(austellungid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE news (
|
CREATE TABLE News (
|
||||||
newsid INT AUTO_INCREMENT PRIMARY KEY,
|
newsid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
name VARCHAR(100),
|
name VARCHAR(100),
|
||||||
beschreibung TEXT,
|
beschreibung TEXT,
|
||||||
datum DATE
|
datum DATE
|
||||||
);
|
);
|
||||||
|
|
||||||
--Testdaten
|
|
||||||
|
|
||||||
INSERT INTO user (vorname, nachname, straße, hausnr, postleitzahl, ort, land, tel, email, isAdmin, password)
|
|
||||||
|
|
||||||
|
INSERT INTO User (vorname, nachname, straße, hausnr, postleitzahl, ort, land, tel, email, isAdmin, password)
|
||||||
VALUES
|
VALUES
|
||||||
('Max', 'Muster', 'Musterstraße', '1', '12345', 'Musterstadt', 'Deutschland', '0123456789', 'max@muster.de', FALSE, 'passwort123'),
|
('Max', 'Muster', 'Musterstraße', '1', '12345', 'Musterstadt', 'Deutschland', '0123456789', 'max@muster.de', FALSE, 'passwort123'),
|
||||||
('Anna', 'Beispiel', 'Beispielweg', '5a', '54321', 'Beispielstadt', 'Deutschland', '0987654321', 'anna@beispiel.de', TRUE, 'adminpass');
|
('Anna', 'Beispiel', 'Beispielweg', '5a', '54321', 'Beispielstadt', 'Deutschland', '0987654321', 'anna@beispiel.de', TRUE, 'adminpass');
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO standort (straße, hausnr, postleitzahl, ort, land, tel, email)
|
INSERT INTO Standort (straße, hausnr, postleitzahl, ort, land, tel, email)
|
||||||
VALUES
|
VALUES
|
||||||
('Galeriestraße', '10', '10115', 'Berlin', 'Deutschland', '030123456', 'kontakt@galerie-berlin.de'),
|
('Galeriestraße', '10', '10115', 'Berlin', 'Deutschland', '030123456', 'kontakt@galerie-berlin.de'),
|
||||||
('Kunstallee', '22b', '50667', 'Köln', 'Deutschland', '0221123456', 'info@kunst-koeln.de');
|
('Kunstallee', '22b', '50667', 'Köln', 'Deutschland', '0221123456', 'info@kunst-koeln.de');
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO ausstellung (standortid, datum_von, datum_bis, name, beschreibung, max_tickets)
|
INSERT INTO Ausstellung (standortid, datum_von, datum_bis, name, beschreibung, max_tickets)
|
||||||
VALUES
|
VALUES
|
||||||
(1, '2025-07-01', '2025-08-31', 'Moderne Meisterwerke', 'Eine Sammlung moderner Kunstwerke aus Europa.', 200),
|
(1, '2025-07-01', '2025-08-31', 'Moderne Meisterwerke', 'Eine Sammlung moderner Kunstwerke aus Europa.', 200),
|
||||||
(2, '2025-09-10', '2025-10-20', 'Kunst der Antike', 'Ausstellung antiker Skulpturen und Gemälde.', 150);
|
(2, '2025-09-10', '2025-10-20', 'Kunst der Antike', 'Ausstellung antiker Skulpturen und Gemälde.', 150);
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO gutschein (code, rabatt, eventid, gültigkeit)
|
INSERT INTO Gutschein (code, rabatt, eventid, gültigkeit)
|
||||||
VALUES
|
VALUES
|
||||||
('SOMMER2025', 15, 1, '2025-08-31'),
|
('SOMMER2025', 15, 1, '2025-08-31'),
|
||||||
('HERBST25', 25, 2, '2025-10-15');
|
('HERBST25', 25, 2, '2025-10-15');
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO ticket (userid, eventid, kaufdatum, gültigkeitsdatum, preis)
|
INSERT INTO Ticket (userid, eventid, kaufdatum, gültigkeitsdatum, preis)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1, '2025-06-01', '2025-07-15', 12.50),
|
(1, 1, '2025-06-01', '2025-07-15', 12.50),
|
||||||
(2, 2, '2025-06-05', '2025-09-15', 10.00);
|
(2, 2, '2025-06-05', '2025-09-15', 10.00);
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO news (name, beschreibung, datum)
|
INSERT INTO News (name, beschreibung, datum)
|
||||||
VALUES
|
VALUES
|
||||||
('Neuer Standort eröffnet', 'Unsere Galerie in Köln ist jetzt geöffnet!', '2025-06-01'),
|
('Neuer Standort eröffnet', 'Unsere Galerie in Köln ist jetzt geöffnet!', '2025-06-01'),
|
||||||
('Frühbucher-Rabatt', 'Sichern Sie sich jetzt 15% Rabatt auf unsere Sommerausstellung.', '2025-05-20');
|
('Frühbucher-Rabatt', 'Sichern Sie sich jetzt 15% Rabatt auf unsere Sommerausstellung.', '2025-05-20');
|
||||||
|
|
||||||
--Änderungen:
|
|
||||||
|
|
||||||
ALTER TABLE austellung
|
|
||||||
ADD preis decimal NOT NULL
|
|
||||||
|
|
||||||
ALTER TABLE ticket
|
|
||||||
DROP COLUMN preis
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE user
|
|
||||||
MODIFY COLUMN userid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE ticket
|
|
||||||
MODIFY COLUMN ticketid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE standort
|
|
||||||
MODIFY COLUMN standortid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE news
|
|
||||||
MODIFY COLUMN newsid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE gutschein
|
|
||||||
MODIFY COLUMN gutscheinid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE ausstellung
|
|
||||||
MODIFY COLUMN austellungid INT NOT NULL AUTO_INCREMENT;
|
|
||||||
|
|
||||||
ALTER TABLE user
|
|
||||||
MODIFY COLUMN isAdmin BOOLEAN DEFAULT FALSE;
|
|
||||||
|
|
||||||
ALTER TABLE user
|
|
||||||
ADD validUntil DATETIME NOT NULL DEFAULT '3025-01-01 00:00:00';
|
|
30
contact.sql
30
contact.sql
@@ -1,30 +0,0 @@
|
|||||||
-- phpMyAdmin SQL Dump
|
|
||||||
-- version 4.5.1
|
|
||||||
-- http://www.phpmyadmin.net
|
|
||||||
--
|
|
||||||
-- Host: 127.0.0.1
|
|
||||||
-- Erstellungszeit: 24. Nov 2017 um 17:01
|
|
||||||
-- Server-Version: 10.1.16-MariaDB
|
|
||||||
-- PHP-Version: 7.0.9
|
|
||||||
|
|
||||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
|
||||||
SET time_zone = "+00:00";
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Datenbank: `blog`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
CREATE TABLE `contact` (
|
|
||||||
`id` varchar(36) NOT NULL,
|
|
||||||
`topicCode` tinyint(2) NULL,
|
|
||||||
`name` varchar(200) NOT NULL,
|
|
||||||
`email` varchar(300) NOT NULL,
|
|
||||||
`phone` varchar(16) NULL,
|
|
||||||
`content` varchar(500) NOT NULL,
|
|
||||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `contact`
|
|
||||||
ADD PRIMARY KEY (`id`)
|
|
Reference in New Issue
Block a user