Compare commits
8 Commits
frontendba
...
feature/lo
Author | SHA1 | Date | |
---|---|---|---|
415d8120e5 | |||
a4eef4e4e3 | |||
37ee931954 | |||
c6358b5ea6 | |||
cc4bc791c9 | |||
586322a189 | |||
1416fd7fa0 | |||
16a91cc028 |
6
.idea/sqldialects.xml
generated
6
.idea/sqldialects.xml
generated
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="SqlDialectMappings">
|
||||
<file url="file://$PROJECT_DIR$/contact.sql" dialect="GenericSQL" />
|
||||
</component>
|
||||
</project>
|
291
CSS/style.css
291
CSS/style.css
@@ -4,9 +4,22 @@ body {
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
#wrapper {
|
||||
|
||||
flex: 1 0 auto;
|
||||
min-height: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
margin-bottom: 20px;
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
}
|
||||
|
||||
a {
|
||||
@@ -16,6 +29,11 @@ a {
|
||||
#navigation {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1000;
|
||||
background: #BAC8D4;
|
||||
width: 100vw;
|
||||
}
|
||||
.link-container {
|
||||
display: grid;
|
||||
@@ -38,17 +56,19 @@ a {
|
||||
background-size: contain;
|
||||
}
|
||||
#footer {
|
||||
position: absolute;
|
||||
position: relative;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 240px;
|
||||
width: 100vw;
|
||||
height: 180px;
|
||||
background-color: #BAC8D4;
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: 6% 5% 43% 32% 14%;
|
||||
grid-template-rows: 45% 10% 45%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
z-index: 999;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.container-zahlungsmittel {
|
||||
@@ -61,11 +81,16 @@ a {
|
||||
}
|
||||
|
||||
.inhalt {
|
||||
flex: 1 1 auto;
|
||||
display: flex;
|
||||
height: 10px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
width: 100vw;
|
||||
min-height: 0;
|
||||
min-width: 0;
|
||||
margin: 0;
|
||||
padding: 0 2vw;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.zahlungsmittel-img {
|
||||
@@ -102,27 +127,26 @@ a {
|
||||
padding-right: 30px;
|
||||
}
|
||||
.container-welcome-inhalt {
|
||||
grid-template-columns: 39% 61%;
|
||||
display: grid;
|
||||
width: 110em;
|
||||
min-height: 80%;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
width: 100%;
|
||||
max-width: 900px;
|
||||
min-height: 200px;
|
||||
border-radius: 10px;
|
||||
background: white;
|
||||
box-shadow: 0 2px 16px rgba(0,0,0,0.08);
|
||||
justify-items: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.beispiel-austellung1-img {
|
||||
height: 480px;
|
||||
width: 670px;
|
||||
background-image: url("../images/beispiel-austellung1.png");
|
||||
.beispiel-austellung1-img, .beispiel-austellung2-img {
|
||||
height: 200px;
|
||||
width: 90vw;
|
||||
max-width: 320px;
|
||||
background-position: center;
|
||||
background-size: contain;
|
||||
justify-self: right;
|
||||
border-radius: 10px;
|
||||
}
|
||||
.beispiel-austellung2-img {
|
||||
background-image: url("../images/beispiel-austellung2.png");
|
||||
background-position: center;
|
||||
background-size: contain;
|
||||
justify-self: right;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
@@ -133,4 +157,221 @@ a {
|
||||
width: 900px;
|
||||
height: 450px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.tickets-container {
|
||||
position: absolute;
|
||||
top: 200px;
|
||||
background-color: #BAC8D4;
|
||||
width: 900px;
|
||||
height: 450px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
body {
|
||||
font-size: 14px;
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
#wrapper {
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
}
|
||||
#navigation {
|
||||
width: 100vw;
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.link-container {
|
||||
width: 100vw;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
row-gap: 8px;
|
||||
border-radius: 0;
|
||||
padding: 0 4px;
|
||||
}
|
||||
.links {
|
||||
font-size: 18px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 6px 0;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
#logo {
|
||||
width: 120px;
|
||||
height: 40px;
|
||||
margin: 0 auto 8px auto;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.container-welcome-inhalt {
|
||||
grid-template-columns: 1fr;
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
min-height: 0;
|
||||
padding: 8px 0;
|
||||
}
|
||||
.beispiel-austellung1-img, .beispiel-austellung2-img {
|
||||
width: 90vw;
|
||||
max-width: 98vw;
|
||||
height: 120px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.inhalt {
|
||||
width: 100vw;
|
||||
min-width: 0;
|
||||
max-width: 100vw;
|
||||
padding: 0 2vw;
|
||||
box-sizing: border-box;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
#footer {
|
||||
width: 100vw;
|
||||
height: auto;
|
||||
min-height: 120px;
|
||||
padding: 10px 0 10px 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
.container-zahlungsmittel {
|
||||
width: 100vw;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
}
|
||||
.header-zahlungsarten {
|
||||
font-size: 1.1em;
|
||||
padding-right: 0;
|
||||
text-align: center;
|
||||
}
|
||||
.zahlungsmittel-img {
|
||||
width: 90vw;
|
||||
max-width: 200px;
|
||||
height: 30px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.line {
|
||||
width: 95vw;
|
||||
}
|
||||
.link-impressum, .link-datenschutz, .link-nutzungsbedingungen {
|
||||
display: block;
|
||||
padding: 2px 0;
|
||||
text-align: center;
|
||||
}
|
||||
.text-bib {
|
||||
display: block;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
}
|
||||
.desktop-only {
|
||||
display: none !important;
|
||||
}
|
||||
.mobile-only {
|
||||
display: block !important;
|
||||
}
|
||||
.login-container {
|
||||
position: static;
|
||||
width: 95vw;
|
||||
max-width: 400px;
|
||||
height: auto;
|
||||
margin: 24px auto;
|
||||
padding: 16px 8px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.tickets-container {
|
||||
position: static;
|
||||
width: 95vw;
|
||||
max-width: 400px;
|
||||
height: auto;
|
||||
margin: 24px auto;
|
||||
padding: 16px 8px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.login-container h1 {
|
||||
font-size: 1.5em;
|
||||
text-align: center;
|
||||
}
|
||||
.tickets-container h1 {
|
||||
font-size: 1.5em;
|
||||
text-align: center;
|
||||
}
|
||||
.login-container form,
|
||||
.login-container label,
|
||||
.login-container input {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.login-container button,
|
||||
.login-container a {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin-top: 8px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#nav-toggle-btn {
|
||||
display: block;
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 2em;
|
||||
cursor: pointer;
|
||||
margin: 0 auto 8px auto;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
.nav-links {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
transition: max-height 0.3s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
.nav-links.open {
|
||||
display: flex;
|
||||
}
|
||||
#nav-toggle-btn.open {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 601px) {
|
||||
.mobile-only {
|
||||
display: none !important;
|
||||
}
|
||||
.desktop-only {
|
||||
display: block !important;
|
||||
}
|
||||
#nav-toggle-btn {
|
||||
display: none;
|
||||
}
|
||||
.nav-links {
|
||||
display: flex !important;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
width: auto;
|
||||
gap: 32px;
|
||||
}
|
||||
.nav-links .links {
|
||||
margin: 0 12px;
|
||||
}
|
||||
}
|
151
Controller/AuthController.php
Normal file
151
Controller/AuthController.php
Normal file
@@ -0,0 +1,151 @@
|
||||
<?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 showLoginForm() {
|
||||
$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']);
|
||||
}
|
||||
|
||||
public function showRegistrationForm() {
|
||||
$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']);
|
||||
}
|
||||
|
||||
public function login() {
|
||||
$email = $_POST['email'];
|
||||
$password = $_POST['password'];
|
||||
|
||||
$result = $this->model->login($email, $password);
|
||||
|
||||
if ($result === true) {
|
||||
$_SESSION['user'] = $email;
|
||||
header('Location: /bibarts/?controller=News&do=showNews');
|
||||
exit();
|
||||
} else {
|
||||
$this->view->setVars([
|
||||
'errors' => ['login' => is_string($result) ? $result : "Login fehlgeschlagen."],
|
||||
'validData' => ['email' => $email],
|
||||
'loginSuccess' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function register() {
|
||||
$data = [
|
||||
'first_name' => $_POST['vorname'] ?? '',
|
||||
'last_name' => $_POST['nachname'] ?? '',
|
||||
'street' => $_POST['strasse'] ?? '',
|
||||
'house_number' => $_POST['hausnr'] ?? '',
|
||||
'postal_code' => $_POST['plz'] ?? '',
|
||||
'city' => $_POST['ort'] ?? '',
|
||||
'country' => $_POST['land'] ?? '',
|
||||
'phone' => $_POST['tel'] ?? '',
|
||||
'email' => $_POST['email'] ?? '',
|
||||
'password' => $_POST['password'] ?? '',
|
||||
'password_repeat' => $_POST['password_repeat'] ?? '',
|
||||
'is_admin' => $_POST['isAdmin'] ?? false,
|
||||
];
|
||||
|
||||
$result = $this->model->register($data);
|
||||
|
||||
if ($result === true) {
|
||||
$this->view->setVars(['success' => 'Registrierung erfolgreich!']);
|
||||
$this->view->render('Auth/showLoginForm');
|
||||
exit;
|
||||
} else {
|
||||
$errors['register'] = is_string($result) ? $result : "Registrierung fehlgeschlagen.";
|
||||
$this->view->setVars(['errors' => $errors, 'validData' => $data]);
|
||||
$this->view->render('Auth/showRegistrationForm');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
public function logout() {
|
||||
unset($_SESSION['user']);
|
||||
session_destroy();
|
||||
header('Location: /bibarts/?controller=Auth&do=showLoginForm');
|
||||
exit();
|
||||
}
|
||||
}
|
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
namespace Blog\Controller;
|
||||
|
||||
class LoginController {
|
||||
function showLoginPage()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
10
Controller/ProfileController.php
Normal file
10
Controller/ProfileController.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace Blog\Controller;
|
||||
|
||||
class ProfileController {
|
||||
function showProfile()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
10
Controller/TicketsController.php
Normal file
10
Controller/TicketsController.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace Blog\Controller;
|
||||
|
||||
class TicketsController {
|
||||
function showTickets()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
239
Model/AuthModel.php
Normal file
239
Model/AuthModel.php
Normal file
@@ -0,0 +1,239 @@
|
||||
<?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, valid_until 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['valid_until']);
|
||||
|
||||
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) {
|
||||
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
||||
return "Bitte geben Sie eine gültige E-Mail ein.";
|
||||
}
|
||||
|
||||
$requiredFields = [
|
||||
'email', 'password', 'street', 'house_number', 'city', 'postal_code',
|
||||
'country', 'first_name', 'last_name', 'phone'
|
||||
];
|
||||
|
||||
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.";
|
||||
}
|
||||
|
||||
// Passwort-Validierung
|
||||
if (!$this->checkDoublePw($data['password'], $data['password_repeat'])) {
|
||||
return "Passwörter stimmen nicht überein.";
|
||||
}
|
||||
|
||||
if ($this->pwRequirementCheck($data['password']) !== true) {
|
||||
return "Passwort muss mindestens 8 Zeichen lang sein und mindestens ein Großbuchstabe, ein Kleinbuchstabe, eine Zahl und ein Sonderzeichen enthalten.";
|
||||
}
|
||||
|
||||
$hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT);
|
||||
|
||||
$sql = "INSERT INTO user (email, password, street, house_number, city, postal_code, country, first_name, last_name, phone, is_admin)
|
||||
VALUES (:email, :password, :street, :house_number, :city, :postal_code, :country, :first_name, :last_name, :phone, :is_admin)";
|
||||
|
||||
$params = [
|
||||
':email' => $data['email'],
|
||||
':password' => $hashedPassword,
|
||||
':street' => $data['street'],
|
||||
':house_number' => $data['house_number'],
|
||||
':city' => $data['city'],
|
||||
':postal_code'=> $data['postal_code'],
|
||||
':country'=> $data['country'],
|
||||
':first_name' => $data['first_name'],
|
||||
':last_name'=> $data['last_name'],
|
||||
':phone' => $data['phone'],
|
||||
':is_admin' => $data['is_admin'] ? 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 user_id 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, valid_until = :valid_until
|
||||
WHERE email = :email";
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$params = [
|
||||
':email' => $email,
|
||||
':password' => $hashedPassword,
|
||||
':valid_until' => $validUntil
|
||||
];
|
||||
return $stmt->execute($params);
|
||||
} 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 = "UPDATE user SET password = :password WHERE email = :email";
|
||||
|
||||
try{
|
||||
$pdo = $this->linkDB();
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$params = [
|
||||
':email' => $email,
|
||||
':password' => $hashedPassword,
|
||||
];
|
||||
return $stmt->execute($params);
|
||||
} 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;
|
||||
}
|
||||
|
||||
public 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;
|
||||
}
|
||||
}
|
@@ -1,15 +1,3 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="HTML-5">
|
||||
<head>
|
||||
<title>VR Contact</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="../../CSS/style.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
include dirname(__DIR__) . '/header.phtml';
|
||||
?>
|
||||
<div class="inhalt">
|
||||
<div class="login-container">
|
||||
<h1>Anmelden</h1>
|
||||
@@ -24,14 +12,9 @@ include dirname(__DIR__) . '/header.phtml';
|
||||
</label>
|
||||
</form>
|
||||
<button class="button-loggin">Login</button>
|
||||
<a class="link-passwort-vergessen">Passwort vergessen?</a>
|
||||
<a class="link-konto-erstellen">Konto erstellen</a>
|
||||
<a class="link-passwort-vergessen" href="?controller=Login&do=showPasswortVergessen">Passwort vergessen?</a>
|
||||
<a class="link-konto-erstellen" href="?controller=Register&do=showRegisterPage">Konto erstellen</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include dirname(__DIR__) . '/footer.phtml';
|
||||
?>
|
||||
<body>
|
||||
</html>
|
||||
|
0
Views/Auth/showPasswortVergessen.phtml
Normal file
0
Views/Auth/showPasswortVergessen.phtml
Normal file
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
include dirname(__DIR__).'/header.phtml';
|
||||
?>
|
||||
|
||||
<div class="msg">
|
||||
<p>Ihre Anfrage wurde erfolgreich versendet.</p>
|
||||
<a href="?controller=Welcome&do=showWelcome">Weiter</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
include dirname(__DIR__).'/header.phtml';
|
||||
?>
|
||||
|
||||
|
||||
|
||||
<h2>Ihre Anfrage an uns</h2>
|
||||
<form method="post">
|
||||
|
||||
<?php foreach ($labels as $index => $value) {
|
||||
echo '<label for="' . $index . '">' . $value . '</label>';
|
||||
if ($index == "content") {
|
||||
echo "<textarea id=\"$index\" name=\"$index\" >";
|
||||
if (isset($validData[$index])) { echo $validData[$index]; }
|
||||
echo "</textarea><br>";
|
||||
} else {
|
||||
echo '<input type="text" name="' . $index . '" value="' . (isset($validData[$index]) ? $validData[$index] : '') . '"><br>';
|
||||
}
|
||||
if (isset($errors[$index])) {
|
||||
echo '<label class="errorMsg">' . $errors[$index] . '</label><br>';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input type="hidden" name="controller" value="contact">
|
||||
<input type="hidden" name="do" value="validateForm">
|
||||
<input type="submit" name="submit" value="Absenden"></form>
|
||||
|
||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
0
Views/Profile/showProfile.phtml
Normal file
0
Views/Profile/showProfile.phtml
Normal file
@@ -1,15 +1,3 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="HTML-5">
|
||||
<head>
|
||||
<title>VR Contact</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="../../CSS/style.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
include dirname(__DIR__) . '/header.phtml';
|
||||
?>
|
||||
<div class="inhalt">
|
||||
<div class="login-container">
|
||||
<h1>Registrieren</h1>
|
||||
@@ -69,13 +57,8 @@ include dirname(__DIR__) . '/header.phtml';
|
||||
</label>
|
||||
</form>
|
||||
<button class="button-register">Registrieren</button>
|
||||
<a class="link-konto-erstellen">Login</a>
|
||||
<a class="link-konto-erstellen" href="?controller=Login&do=showLoginPage">Login</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include dirname(__DIR__) . '/footer.phtml';
|
||||
?>
|
||||
<body>
|
||||
</html>
|
||||
|
||||
|
8
Views/Tickets/showTickets.phtml
Normal file
8
Views/Tickets/showTickets.phtml
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="inhalt">
|
||||
<div class="tickets-container">
|
||||
<h1>Tickets</h1>
|
||||
<div class="tickets-container-inhalt">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
include dirname(__DIR__).'/header.phtml';
|
||||
?>
|
||||
|
||||
<article>
|
||||
<h2>Virtuelles Museum</h2>
|
||||
<span class="articleInfo">John Doe | 12.08.2018 um 10:18 Uhr</span>
|
||||
|
||||
<p>
|
||||
<img class="articleImg" src="images/museum.jpg" alt="my Oculus Rift">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio.
|
||||
</p>
|
||||
<p>
|
||||
Proin nonummy, lacus eget pulvinar lacinia, pede felis dignissim leo, vitae tristique magna lacus sit amet eros. Nullam ornare. Praesent odio ligula, dapibus sed, tincidunt eget, dictum ac, nibh. Nam quis lacus. Nunc eleifend molestie velit. Morbi lobortis quam eu velit. Donec euismod vestibulum massa. Donec non lectus. Aliquam commodo lacus sit amet nulla. Cras dignissim elit et augue. Nullam non diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Aenean vestibulum. Sed lobortis elit quis lectus. Nunc sed lacus at augue bibendum dapibus.
|
||||
</p>
|
||||
<p>
|
||||
Aliquam vehicula sem ut pede. Cras purus lectus, egestas eu, vehicula at, imperdiet sed, nibh. Morbi consectetuer luctus felis. Donec vitae nisi. Aliquam tincidunt feugiat elit. Duis sed elit ut turpis ullamcorper feugiat. Praesent pretium, mauris sed fermentum hendrerit, nulla lorem iaculis magna, pulvinar scelerisque urna tellus a justo. Suspendisse pulvinar massa in metus. Duis quis quam. Proin justo. Curabitur ac sapien. Nam erat.
|
||||
Praesent ut quam.
|
||||
</p>
|
||||
</article>
|
||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
include dirname(__DIR__).'/header.phtml';
|
||||
?>
|
||||
|
||||
<article>
|
||||
<h2>Implement Controller</h2>
|
||||
<span class="articleInfo">John Doe | 18.07.2018 um 18:43 Uhr</span>
|
||||
|
||||
<p>
|
||||
<img class="articleImg" src="images/controller.jpg" alt="my Oculus Rift">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio.
|
||||
</p>
|
||||
<p>
|
||||
Proin nonummy, lacus eget pulvinar lacinia, pede felis dignissim leo, vitae tristique magna lacus sit amet eros. Nullam ornare. Praesent odio ligula, dapibus sed, tincidunt eget, dictum ac, nibh. Nam quis lacus. Nunc eleifend molestie velit. Morbi lobortis quam eu velit. Donec euismod vestibulum massa. Donec non lectus. Aliquam commodo lacus sit amet nulla. Cras dignissim elit et augue. Nullam non diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Aenean vestibulum. Sed lobortis elit quis lectus. Nunc sed lacus at augue bibendum dapibus.
|
||||
</p>
|
||||
<p>
|
||||
Aliquam vehicula sem ut pede. Cras purus lectus, egestas eu, vehicula at, imperdiet sed, nibh. Morbi consectetuer luctus felis. Donec vitae nisi. Aliquam tincidunt feugiat elit. Duis sed elit ut turpis ullamcorper feugiat. Praesent pretium, mauris sed fermentum hendrerit, nulla lorem iaculis magna, pulvinar scelerisque urna tellus a justo. Suspendisse pulvinar massa in metus. Duis quis quam. Proin justo. Curabitur ac sapien. Nam erat.
|
||||
Praesent ut quam.
|
||||
</p>
|
||||
</article>
|
||||
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
@@ -1,16 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="HTML-5">
|
||||
<?php
|
||||
include dirname(__DIR__).'/header.phtml';
|
||||
?>
|
||||
<div class="inhalt">
|
||||
<div class="container-welcome-inhalt">
|
||||
<div class="beispiel-austellung1-img"></div>
|
||||
<div class="beispiel-austellung2-img"></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include dirname(__DIR__).'/footer.phtml';
|
||||
?>
|
||||
</html>
|
||||
|
@@ -1,19 +1,13 @@
|
||||
<head>
|
||||
<title>VR Contact</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="CSS/style.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="footer">
|
||||
<div class="container-zahlungsmittel">
|
||||
<h2 class="header-zahlungsarten">Mögliche Zahlungsarten</h2>
|
||||
<div class="zahlungsmittel-img"></div>
|
||||
</div>
|
||||
<div class="line"></div>
|
||||
<a class="link-impressum">Impressum</a>
|
||||
<a class="link-datenschutz">Datenschutz</a>
|
||||
<a class="link-nutzungsbedingungen">Nutzungsbedingungen</a>
|
||||
<span class="text-bib">© bib arts GmbH</span>
|
||||
<div id="footer">
|
||||
<div class="container-zahlungsmittel">
|
||||
<h2 class="header-zahlungsarten">Mögliche Zahlungsarten</h2>
|
||||
<div class="zahlungsmittel-img"></div>
|
||||
</div>
|
||||
</body>
|
||||
<div class="line"></div>
|
||||
<a class="link-impressum">Impressum</a>
|
||||
<a class="link-datenschutz">Datenschutz</a>
|
||||
<a class="link-nutzungsbedingungen">Nutzungsbedingungen</a>
|
||||
<span class="text-bib">© bib arts GmbH</span>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -7,15 +7,30 @@
|
||||
<link href="CSS/style.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="wrapper">
|
||||
<nav id="navigation">
|
||||
<div class="link-container">
|
||||
<div id="logo" ><a class="link-logo" href="#"></a></div>
|
||||
<a id="link-tickets" class="links" href="#">Tickets</a>
|
||||
<nav id="navigation">
|
||||
<div class="link-container">
|
||||
<div id="logo" ><a class="link-logo" href="#"></a></div>
|
||||
<button id="nav-toggle-btn" aria-label="Menü ein-/ausklappen">▼</button>
|
||||
<div class="nav-links">
|
||||
<a id="link-tickets" class="links" href="?controller=Tickets&do=showTickets">Tickets</a>
|
||||
<a id="link-infos" class="links" href="?controller=Welcome&do=showWelcome">Infos</a>
|
||||
<a id="link-profil" class="links" href="?controller=Contact&do=showContactForm">Profil</a>
|
||||
<a id="link-profil" class="links" href="?controller=Profile&do=showProfile">Profil</a>
|
||||
<a id="link-login" class="links" href="?controller=Login&do=showLoginPage">Login</a>
|
||||
<a id="link-register" class="links" href="?controller=Register&do=showRegisterPage">Register</a>
|
||||
<div id="profile-picture"></div>
|
||||
</div>
|
||||
</nav>
|
||||
</body>
|
||||
</html>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var btn = document.getElementById('nav-toggle-btn');
|
||||
var links = document.querySelector('.nav-links');
|
||||
if (btn && links) {
|
||||
btn.addEventListener('click', function() {
|
||||
links.classList.toggle('open');
|
||||
btn.classList.toggle('open');
|
||||
btn.innerHTML = links.classList.contains('open') ? '▲' : '▼';
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
79
index.php
79
index.php
@@ -1,45 +1,50 @@
|
||||
<?php
|
||||
<?php
|
||||
session_start();
|
||||
include 'Views/header.phtml';
|
||||
?>
|
||||
<div id="wrapper">
|
||||
<?php
|
||||
spl_autoload_register(function ($className) {
|
||||
if (substr($className, 0, 5) !== 'Blog\\') {
|
||||
// not our business
|
||||
return;
|
||||
}
|
||||
|
||||
session_start();;;
|
||||
$fileName = __DIR__.'/'.str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 5)).'.php';
|
||||
|
||||
spl_autoload_register(function ($className) {
|
||||
if (substr($className, 0, 5) !== 'Blog\\') {
|
||||
// not our business
|
||||
return;
|
||||
}
|
||||
if (file_exists($fileName)) {
|
||||
include $fileName;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$controllerName = "";
|
||||
$doMethodName = "";
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
$controllerName = isset($_POST['controller']) && $_POST['controller'] ? $_POST['controller'] : "Welcome";
|
||||
$doMethodName = isset($_POST['do']) && $_POST['do'] ? $_POST['do'] : "showWelcome";
|
||||
} else {
|
||||
$controllerName = isset($_GET['controller']) && $_GET['controller'] ? $_GET['controller'] : "Welcome";
|
||||
$doMethodName = isset($_GET['do']) && $_GET['do'] ? $_GET['do'] : "showWelcome";
|
||||
}
|
||||
|
||||
$fileName = __DIR__.'/'.str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 5)).'.php';
|
||||
$controllerClassName = 'Blog\\Controller\\'.ucfirst($controllerName).'Controller';
|
||||
|
||||
if (file_exists($fileName)) {
|
||||
include $fileName;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$controllerName = "";
|
||||
$doMethodName = "";
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
$controllerName = isset($_POST['controller']) && $_POST['controller'] ? $_POST['controller'] : "Welcome";
|
||||
$doMethodName = isset($_POST['do']) && $_POST['do'] ? $_POST['do'] : "showWelcome";
|
||||
} else {
|
||||
$controllerName = isset($_GET['controller']) && $_GET['controller'] ? $_GET['controller'] : "Welcome";
|
||||
$doMethodName = isset($_GET['do']) && $_GET['do'] ? $_GET['do'] : "showWelcome";
|
||||
}
|
||||
if (method_exists($controllerClassName, $doMethodName)) {
|
||||
$view = new \Blog\Library\View(__DIR__.DIRECTORY_SEPARATOR.'Views'
|
||||
, ucfirst($controllerName), $doMethodName);
|
||||
|
||||
$controller = new $controllerClassName($view);
|
||||
$controller->$doMethodName();
|
||||
|
||||
$controllerClassName = 'Blog\\Controller\\'.ucfirst($controllerName).'Controller';
|
||||
$view->render();
|
||||
|
||||
if (method_exists($controllerClassName, $doMethodName)) {
|
||||
$view = new \Blog\Library\View(__DIR__.DIRECTORY_SEPARATOR.'Views'
|
||||
, ucfirst($controllerName), $doMethodName);
|
||||
|
||||
$controller = new $controllerClassName($view);
|
||||
$controller->$doMethodName();
|
||||
|
||||
$view->render();
|
||||
|
||||
} else {
|
||||
new \Blog\Library\ErrorMsg('Page not found: '.$controllerClassName.'::'.$doMethodName);
|
||||
}
|
||||
|
||||
} else {
|
||||
new \Blog\Library\ErrorMsg('Page not found: '.$controllerClassName.'::'.$doMethodName);
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<?php
|
||||
include 'Views/footer.phtml';
|
||||
?>
|
||||
|
||||
|
Reference in New Issue
Block a user