Upload via GUI (258 Dateien)

This commit is contained in:
2026-10-16 19:12:18 +00:00
parent 56deade877
commit 6cced3beda
50 changed files with 11148 additions and 0 deletions
+153
View File
@@ -0,0 +1,153 @@
<?php
require_once __DIR__ . '/includes/bootstrap.php';
if (current_user()) { redirect('/home.php'); }
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verify_csrf();
$email = trim($_POST['email'] ?? '');
$pass = $_POST['password'] ?? '';
if (!rate_limit_check('login_attempt', client_ip(), 10, 15)) {
$errors[] = 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in einigen Minuten erneut.';
} elseif ($email && !rate_limit_check('login_email', $email, 5, 15)) {
$errors[] = 'Zu viele Anmeldeversuche für dieses Konto. Bitte warten Sie einige Minuten.';
} else {
$stmt = get_db()->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();
if ($user && password_verify($pass, $user['password_hash'])) {
rate_limit_reset('login_email', $email);
customer_login($user);
redirect('/home.php');
}
$errors[] = 'E-Mail-Adresse oder Passwort ist falsch.';
}
}
$logo = get_setting('logo_path');
$banner = get_setting('banner_path');
$displayName = get_setting('display_name', config()['site']['name']);
$kbEnabled = get_setting('kb_enabled', '1') === '1';
$privacyLabel = get_setting('footer_privacy_label', 'Datenschutz');
$privacyUrl = get_setting('footer_privacy_url', '');
$privacyHtml = get_setting('footer_privacy_html', '');
$imprintLabel = get_setting('footer_imprint_label', 'Impressum');
$imprintUrl = get_setting('footer_imprint_url', '');
$imprintHtml = get_setting('footer_imprint_html', '');
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Anmelden – <?= e($displayName) ?></title>
<link rel="stylesheet" href="/assets/css/style.css?v=<?= @filemtime(__DIR__ . "/assets/css/style.css") ?: time() ?>">
<?php $customThemeStylesheet = active_custom_theme_stylesheet(); ?>
<?php if ($customThemeStylesheet): ?>
<link rel="stylesheet" href="<?= e($customThemeStylesheet) ?>">
<?php endif; ?>
<link rel="manifest" href="/manifest.php">
<meta name="theme-color" content="#0f6f6a">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href="/assets/icons/icon-192.png">
<?php if ($logo): ?><link rel="icon" href="<?= e($logo) ?>"><?php endif; ?>
<script>if('serviceWorker'in navigator){navigator.serviceWorker.register('/sw.js').catch(function(){});}</script>
<?php if (!$banner && !$customThemeStylesheet): ?>
<style>
.login-bg { background: linear-gradient(135deg, #16202a 0%, #20303d 55%, #16202a 100%); }
</style>
<?php endif; ?>
</head>
<body class="login-page" style="margin:0; display:flex; flex-direction:column; min-height:100vh">
<!-- Header -->
<header class="site-header">
<div class="topbar-thin">
<span class="welcome">Willkommen, Gast</span>
<nav>
<a href="/home.php">Supportcenter-Startseite</a>
<a href="/ticket_new.php">Neues Ticket eröffnen</a>
<a href="/ticket_lookup.php">Ticketstatus überprüfen</a>
<?php if ($kbEnabled): ?><a href="/kb.php">Wissensdatenbank</a><?php endif; ?>
<a href="/login.php" class="active">Anmelden</a>
</nav>
</div>
<div class="logo-row" style="display:flex; align-items:center; gap:12px">
<a href="/home.php" style="line-height:0; flex-shrink:0">
<?php if ($logo): ?>
<img src="<?= e($logo) ?>" alt="<?= e($displayName) ?>">
<?php else: ?>
<span class="text-brand">Desk<span>Hub</span></span>
<?php endif; ?>
</a>
<?php if ($logo && $displayName): ?>
<span style="font-size:1.15rem; font-weight:700; color:var(--ink); letter-spacing:-.01em"><?= e($displayName) ?></span>
<?php endif; ?>
</div>
</header>
<!-- Login-Bereich: volle Breite, dunkler Hintergrund -->
<div class="login-bg login-screen<?= $banner ? ' has-image' : '' ?>"<?php if ($banner): ?> style="background-image:url('<?= e($banner) ?>');"<?php endif; ?>>
<div class="auth-card login-card">
<div class="brand-block brand-block-lg">
<?php if ($logo): ?>
<img src="<?= e($logo) ?>" alt="<?= e($displayName) ?>">
<?php else: ?>
<span class="brand-block-text">Desk<span>Hub</span></span>
<?php endif; ?>
</div>
<h1>Anmelden</h1>
<p class="sub">Melden Sie sich an, um alle Ihre Tickets im Überblick zu sehen.</p>
<?php foreach ($errors as $err): ?>
<div class="flash error"><?= e($err) ?></div>
<?php endforeach; ?>
<?php foreach (get_flashes() as $f): ?>
<div class="flash <?= e($f['type']) ?>"><?= e($f['message']) ?></div>
<?php endforeach; ?>
<form method="post">
<?= csrf_field() ?>
<label for="email">E-Mail-Adresse</label>
<input type="email" id="email" name="email" required autofocus autocomplete="email">
<label for="password">Passwort</label>
<input type="password" id="password" name="password" required autocomplete="current-password">
<div style="text-align:right; margin-top:6px">
<a href="/forgot_password.php" class="login-forgot">Passwort vergessen?</a>
</div>
<div class="btn-row">
<button type="submit" class="btn login-submit">Anmelden</button>
</div>
</form>
<div class="login-links">
<span>Noch kein Konto? <a href="/register.php">Jetzt registrieren</a></span>
<span class="login-guest-links">Kein Konto nötig: <a href="/ticket_new.php">Ticket erstellen</a> · <a href="/ticket_lookup.php">Status prüfen</a></span>
<a href="/staff/login.php" class="login-staff-link">Mitarbeiter-Login →</a>
</div>
</div>
</div>
<!-- Footer -->
<footer class="public-footer">
<?php if ($privacyUrl || $privacyHtml || $imprintUrl || $imprintHtml): ?>
<nav style="margin-bottom:8px; display:flex; gap:20px; justify-content:center; flex-wrap:wrap">
<?php if ($privacyUrl || $privacyHtml): ?>
<a href="<?= $privacyUrl ? e($privacyUrl) : '#' ?>" style="color:#6b7280; font-size:.78rem"><?= e($privacyLabel) ?></a>
<?php endif; ?>
<?php if ($imprintUrl || $imprintHtml): ?>
<a href="<?= $imprintUrl ? e($imprintUrl) : '#' ?>" style="color:#6b7280; font-size:.78rem"><?= e($imprintLabel) ?></a>
<?php endif; ?>
</nav>
<?php endif; ?>
Copyright &copy; <?= date('Y') ?> <?= e($displayName) ?> &ndash; Alle Rechte vorbehalten.
</footer>
</body>
</html>