139 lines
3.7 KiB
PHP
139 lines
3.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
ini_set('display_errors', '1');
|
|
error_reporting(E_ALL);
|
|
session_start();
|
|
|
|
$config = require __DIR__ . '/../config/database.php';
|
|
|
|
$dsn = sprintf(
|
|
'mysql:host=%s;dbname=%s;charset=%s',
|
|
$config['host'],
|
|
$config['dbname'],
|
|
$config['charset'] ?? 'utf8mb4'
|
|
);
|
|
|
|
$pdo = new PDO(
|
|
$dsn,
|
|
$config['user'],
|
|
$config['pass'],
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]
|
|
);
|
|
|
|
$errors = [];
|
|
|
|
if (isset($_SESSION['user_id'])) {
|
|
header('Location: index.php');
|
|
exit;
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$login = trim($_POST['login'] ?? '');
|
|
$password = $_POST['password'] ?? '';
|
|
|
|
if ($login === '') {
|
|
$errors[] = 'Bitte Benutzername oder E-Mail eingeben.';
|
|
}
|
|
|
|
if ($password === '') {
|
|
$errors[] = 'Bitte das Passwort eingeben.';
|
|
}
|
|
|
|
if (empty($errors)) {
|
|
$stmt = $pdo->prepare("
|
|
SELECT
|
|
`id`,
|
|
`username`,
|
|
`email`,
|
|
`password_hash`,
|
|
`display_name`,
|
|
`role`,
|
|
`is_active`
|
|
FROM `app_users`
|
|
WHERE `username` = :login OR `email` = :login
|
|
LIMIT 1
|
|
");
|
|
$stmt->execute([
|
|
':login' => $login,
|
|
]);
|
|
|
|
$user = $stmt->fetch();
|
|
|
|
if (!$user) {
|
|
$errors[] = 'Die Anmeldedaten sind ungültig.';
|
|
} elseif (!password_verify($password, $user['password_hash'])) {
|
|
$errors[] = 'Die Anmeldedaten sind ungültig.';
|
|
} elseif ((int)$user['is_active'] !== 1) {
|
|
$errors[] = 'Dein Konto ist noch nicht freigeschaltet.';
|
|
} else {
|
|
session_regenerate_id(true);
|
|
|
|
$_SESSION['user_id'] = (int)$user['id'];
|
|
$_SESSION['username'] = $user['username'];
|
|
$_SESSION['display_name'] = $user['display_name'];
|
|
$_SESSION['role'] = $user['role'];
|
|
|
|
$stmtUpdateLogin = $pdo->prepare("
|
|
UPDATE `app_users`
|
|
SET `last_login_at` = NOW()
|
|
WHERE `id` = :id
|
|
");
|
|
$stmtUpdateLogin->execute([
|
|
':id' => $user['id'],
|
|
]);
|
|
|
|
header('Location: index.php');
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
$loggedIn = false;
|
|
?>
|
|
<?php require __DIR__ . '/header.php'; ?>
|
|
|
|
<div class="auth-wrap">
|
|
<div class="card auth-card">
|
|
<h2>Anmelden</h2>
|
|
|
|
<?php if (!empty($errors)): ?>
|
|
<ul class="msg-error">
|
|
<?php foreach ($errors as $error): ?>
|
|
<li><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
|
|
<form method="post" action="" class="form-stack">
|
|
<div class="form-group">
|
|
<label for="login">Benutzername oder E-Mail</label>
|
|
<input
|
|
type="text"
|
|
id="login"
|
|
name="login"
|
|
required
|
|
value="<?= htmlspecialchars($_POST['login'] ?? '', ENT_QUOTES, 'UTF-8') ?>"
|
|
>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="password">Passwort</label>
|
|
<input
|
|
type="password"
|
|
id="password"
|
|
name="password"
|
|
required
|
|
>
|
|
</div>
|
|
|
|
<button type="submit" class="btn btn-primary btn-full">Anmelden</button>
|
|
</form>
|
|
|
|
<p class="form-footer">Noch kein Konto? <a href="register.php">Jetzt registrieren</a></p>
|
|
</div>
|
|
</div>
|
|
|
|
<?php require __DIR__ . '/footer.php'; ?>
|