login.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. require_once __DIR__ . '/../config/database.php';
  3. require_once __DIR__ . '/../lib/auth.php';
  4. require_once __DIR__ . '/../lib/csrf.php';
  5. // Already logged in → go to dashboard
  6. if (isLoggedIn()) {
  7. header('Location: /dashboard/dashboard.php');
  8. exit;
  9. }
  10. $error = '';
  11. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  12. if (!verifyCsrfToken($_POST['csrf_token'] ?? '')) {
  13. $error = 'Invalid request. Please try again.';
  14. } else {
  15. $email = trim($_POST['email'] ?? '');
  16. $password = trim($_POST['password'] ?? '');
  17. if ($email === '' || $password === '') {
  18. $error = 'Please enter your email and password.';
  19. } else {
  20. $user = loginUser($email, $password);
  21. if ($user) {
  22. $redirect = $_GET['redirect'] ?? '/dashboard/dashboard.php';
  23. // Sanitise redirect to prevent open redirect
  24. if (!str_starts_with($redirect, '/')) {
  25. $redirect = '/dashboard/dashboard.php';
  26. }
  27. header('Location: ' . $redirect);
  28. exit;
  29. } else {
  30. $error = 'Invalid email or password.';
  31. }
  32. }
  33. }
  34. }
  35. $pageTitle = 'Login';
  36. include __DIR__ . '/_head.php';
  37. ?>
  38. <div class="container">
  39. <div class="row justify-content-center">
  40. <div class="col-xl-10 col-lg-12 col-md-9">
  41. <div class="card o-hidden border-0 shadow-lg my-5">
  42. <div class="card-body p-0">
  43. <div class="row">
  44. <div class="col-lg-6 d-none d-lg-block bg-login-image"></div>
  45. <div class="col-lg-6">
  46. <div class="p-5">
  47. <div class="text-center mb-4">
  48. <h1 class="h4 text-gray-900">Welcome Back!</h1>
  49. </div>
  50. <?php if ($error !== ''): ?>
  51. <div class="alert alert-danger" role="alert">
  52. <?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?>
  53. </div>
  54. <?php endif; ?>
  55. <?php if (isset($_GET['registered'])): ?>
  56. <div class="alert alert-success" role="alert">
  57. Account created! You can now log in.
  58. </div>
  59. <?php endif; ?>
  60. <?php if (isset($_GET['reset'])): ?>
  61. <div class="alert alert-success" role="alert">
  62. Password reset successfully. Please log in.
  63. </div>
  64. <?php endif; ?>
  65. <form method="POST" action="/login/login.php" novalidate>
  66. <input type="hidden" name="csrf_token" value="<?= generateCsrfToken() ?>">
  67. <div class="mb-3">
  68. <input type="email" name="email" class="form-control form-control-user"
  69. placeholder="Email Address"
  70. value="<?= htmlspecialchars($_POST['email'] ?? '', ENT_QUOTES, 'UTF-8') ?>"
  71. required autofocus>
  72. </div>
  73. <div class="mb-3">
  74. <input type="password" name="password" class="form-control form-control-user"
  75. placeholder="Password" required>
  76. </div>
  77. <button type="submit" class="btn btn-success btn-user w-100 mb-3">
  78. Log In
  79. </button>
  80. </form>
  81. <hr>
  82. <div class="text-center">
  83. <a class="small" href="/login/forgot-password.php">Forgot Password?</a>
  84. </div>
  85. <div class="text-center">
  86. <a class="small" href="/login/register.php">Create an Account!</a>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. <?php include __DIR__ . '/_foot.php'; ?>