login.php 5.0 KB

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