login.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. declare(strict_types=1);
  3. require_once __DIR__ . "/../includes/auth.php";
  4. manageStartSession();
  5. $errors = [];
  6. $messages = [];
  7. $next = basename((string) ($_GET["next"] ?? "index.php"));
  8. if (!array_key_exists($next, manageNavItemsSafe())) {
  9. $next = "index.php";
  10. }
  11. function manageNavItemsSafe(): array
  12. {
  13. // Only ever redirect to a known admin page, never to a caller-supplied URL.
  14. return [
  15. "index.php" => true,
  16. "instances.php" => true,
  17. "releases.php" => true,
  18. "backups.php" => true,
  19. "settings.php" => true,
  20. ];
  21. }
  22. if (manageIsLoggedIn()) {
  23. header("Location: " . $next);
  24. exit;
  25. }
  26. if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
  27. if (!managePasswordConfigured()) {
  28. $errors[] = "Es ist kein Admin-Passwort konfiguriert. Bitte MANAGE_ADMIN_PASSWORD_HASH in config.php setzen.";
  29. } elseif (manageLoginIsRateLimited()) {
  30. $errors[] = "Zu viele Fehlversuche. Bitte später erneut versuchen.";
  31. } elseif (managePasswordMatches((string) ($_POST["password"] ?? ""))) {
  32. manageLoginClearRateLimit();
  33. manageLogin();
  34. manageLogAccess("Admin login succeeded");
  35. header("Location: " . $next);
  36. exit;
  37. } else {
  38. manageLoginRecordFailure();
  39. manageLogError("Admin login failed", [], "WARNING");
  40. $errors[] = "Falsches Passwort.";
  41. }
  42. }
  43. ?>
  44. <!DOCTYPE html>
  45. <html lang="de">
  46. <head>
  47. <meta charset="UTF-8">
  48. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  49. <title>Anmeldung – Manage</title>
  50. <link rel="stylesheet" href="../assets/css/style.css">
  51. </head>
  52. <body class="login-body">
  53. <main class="login-panel">
  54. <h1>Manage</h1>
  55. <p class="muted"><?php echo manageEscape(manageProductName()); ?></p>
  56. <?php foreach ($messages as $message): ?>
  57. <p class="alert alert-success"><?php echo manageEscape($message); ?></p>
  58. <?php endforeach; ?>
  59. <?php foreach ($errors as $error): ?>
  60. <p class="alert alert-error"><?php echo manageEscape($error); ?></p>
  61. <?php endforeach; ?>
  62. <form method="POST">
  63. <div class="form-group">
  64. <label for="password">Passwort</label>
  65. <input type="password" id="password" name="password" required autofocus autocomplete="current-password">
  66. </div>
  67. <button type="submit" class="btn">Anmelden</button>
  68. </form>
  69. </main>
  70. </body>
  71. </html>