fix redirect page
This commit is contained in:
@@ -539,7 +539,7 @@ $routes->post('administrator/event-charges/remove/(:num)', 'View\EventController
|
|||||||
$routes->post('administrator/event-charges/payment/(:num)', 'View\EventController::toggleEventPayment/$1');
|
$routes->post('administrator/event-charges/payment/(:num)', 'View\EventController::toggleEventPayment/$1');
|
||||||
$routes->get('administrator/get-students-with-charges', 'View\EventController::getStudentsWithCharges');
|
$routes->get('administrator/get-students-with-charges', 'View\EventController::getStudentsWithCharges');
|
||||||
|
|
||||||
$routes->get('parent/events', 'View\ParentController::parentEventPage');
|
$routes->get('parent/events', 'View\ParentController::parentEventPage', ['filter' => 'auth:parent']);
|
||||||
// parent event participation page
|
// parent event participation page
|
||||||
$routes->post('parent/updateParticipation', 'View\ParentController::updateParticipation'); // handle parent participation updates
|
$routes->post('parent/updateParticipation', 'View\ParentController::updateParticipation'); // handle parent participation updates
|
||||||
|
|
||||||
|
|||||||
@@ -56,13 +56,32 @@ class AuthController extends Controller
|
|||||||
|
|
||||||
public function loginMask()
|
public function loginMask()
|
||||||
{
|
{
|
||||||
// Serve the login view directly here
|
$redirectTo = $this->sanitizeRedirectTarget((string) ($this->request->getGet('redirect_to') ?? ''));
|
||||||
return view('user/login'); // Adjust the view path as needed
|
|
||||||
|
if (session()->get('is_logged_in')) {
|
||||||
|
if ($redirectTo !== null) {
|
||||||
|
return redirect()->to($redirectTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
$roles = session()->get('roles') ?? [];
|
||||||
|
if (empty($roles) && session()->get('role')) {
|
||||||
|
$roles = [session()->get('role')];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($roles)) {
|
||||||
|
return $this->redirectToDashboard($roles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('user/login', [
|
||||||
|
'redirect_to' => $redirectTo ?? '',
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function login()
|
public function login()
|
||||||
{
|
{
|
||||||
log_message('info', 'Processing login form submission.');
|
log_message('info', 'Processing login form submission.');
|
||||||
|
$redirectTo = $this->sanitizeRedirectTarget((string) ($this->request->getPost('redirect_to') ?? $this->request->getGet('redirect_to') ?? ''));
|
||||||
|
|
||||||
// Step 1: Get email, password, and IP from the request
|
// Step 1: Get email, password, and IP from the request
|
||||||
$email = $this->request->getPost('email');
|
$email = $this->request->getPost('email');
|
||||||
@@ -98,7 +117,7 @@ class AuthController extends Controller
|
|||||||
$this->logLoginAttempt($user['id'], $user['email'], $ip, $this->request->getUserAgent());
|
$this->logLoginAttempt($user['id'], $user['email'], $ip, $this->request->getUserAgent());
|
||||||
|
|
||||||
// ✅ Step 7: Call loginUser() to set session and redirect
|
// ✅ Step 7: Call loginUser() to set session and redirect
|
||||||
return $this->loginUser($user);
|
return $this->loginUser($user, $redirectTo);
|
||||||
} else {
|
} else {
|
||||||
// Step 8: Password mismatch — log failed attempt
|
// Step 8: Password mismatch — log failed attempt
|
||||||
$this->handleFailedLogin($user['id'], $user['email'], $ip);
|
$this->handleFailedLogin($user['id'], $user['email'], $ip);
|
||||||
@@ -491,7 +510,7 @@ class AuthController extends Controller
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function loginUser($user)
|
private function loginUser($user, ?string $redirectTo = null)
|
||||||
{
|
{
|
||||||
$userRoleModel = new UserRoleModel();
|
$userRoleModel = new UserRoleModel();
|
||||||
$roles = $userRoleModel->select('roles.name')
|
$roles = $userRoleModel->select('roles.name')
|
||||||
@@ -525,9 +544,17 @@ class AuthController extends Controller
|
|||||||
if (count($roleNames) === 1) {
|
if (count($roleNames) === 1) {
|
||||||
// One role → set and redirect directly
|
// One role → set and redirect directly
|
||||||
session()->set('role', $roleNames[0]);
|
session()->set('role', $roleNames[0]);
|
||||||
|
if ($redirectTo !== null) {
|
||||||
|
return redirect()->to($redirectTo);
|
||||||
|
}
|
||||||
return $this->redirectToDashboard([$roleNames[0]]);
|
return $this->redirectToDashboard([$roleNames[0]]);
|
||||||
} else {
|
} else {
|
||||||
// Multiple roles → redirect to role selection view
|
// Multiple roles → redirect to role selection view
|
||||||
|
if ($redirectTo !== null) {
|
||||||
|
session()->set('post_login_redirect', $redirectTo);
|
||||||
|
} else {
|
||||||
|
session()->remove('post_login_redirect');
|
||||||
|
}
|
||||||
return redirect()->to('/select-role');
|
return redirect()->to('/select-role');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,12 +619,17 @@ private function redirectToDashboard(array $roles)
|
|||||||
{
|
{
|
||||||
$selectedRole = $this->request->getPost('selected_role');
|
$selectedRole = $this->request->getPost('selected_role');
|
||||||
$availableRoles = session()->get('roles');
|
$availableRoles = session()->get('roles');
|
||||||
|
$redirectTo = $this->sanitizeRedirectTarget((string) ($this->request->getPost('redirect_to') ?? session()->get('post_login_redirect') ?? ''));
|
||||||
|
|
||||||
if (!$selectedRole || !in_array($selectedRole, $availableRoles)) {
|
if (!$selectedRole || !in_array($selectedRole, $availableRoles)) {
|
||||||
return redirect()->to('/select-role')->with('error', 'Invalid role selected.');
|
return redirect()->to('/select-role')->with('error', 'Invalid role selected.');
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->set('role', $selectedRole);
|
session()->set('role', $selectedRole);
|
||||||
|
session()->remove('post_login_redirect');
|
||||||
|
if ($redirectTo !== null) {
|
||||||
|
return redirect()->to($redirectTo);
|
||||||
|
}
|
||||||
return $this->redirectToDashboard([$selectedRole]);
|
return $this->redirectToDashboard([$selectedRole]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,7 +641,44 @@ private function redirectToDashboard(array $roles)
|
|||||||
return redirect()->to('/login')->with('error', 'No roles available.');
|
return redirect()->to('/login')->with('error', 'No roles available.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('auth/select_role', ['roles' => $roles]);
|
return view('auth/select_role', [
|
||||||
|
'roles' => $roles,
|
||||||
|
'redirect_to' => (string) (session()->get('post_login_redirect') ?? ''),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sanitizeRedirectTarget(string $redirectTo): ?string
|
||||||
|
{
|
||||||
|
$redirectTo = trim($redirectTo);
|
||||||
|
if ($redirectTo === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('#^https?://#i', $redirectTo)) {
|
||||||
|
$appHost = (string) parse_url(base_url('/'), PHP_URL_HOST);
|
||||||
|
$targetHost = (string) parse_url($redirectTo, PHP_URL_HOST);
|
||||||
|
$targetPath = (string) parse_url($redirectTo, PHP_URL_PATH);
|
||||||
|
$targetQuery = (string) parse_url($redirectTo, PHP_URL_QUERY);
|
||||||
|
|
||||||
|
if ($appHost === '' || $targetHost === '' || strcasecmp($appHost, $targetHost) !== 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$redirectTo = $targetPath !== '' ? $targetPath : '/';
|
||||||
|
if ($targetQuery !== '') {
|
||||||
|
$redirectTo .= '?' . $targetQuery;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!str_starts_with($redirectTo, '/')) {
|
||||||
|
$redirectTo = '/' . ltrim($redirectTo, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_starts_with($redirectTo, '//')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $redirectTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,13 @@ class AuthFilter implements FilterInterface
|
|||||||
|
|
||||||
// Must be logged in
|
// Must be logged in
|
||||||
if (empty($userRoles) || empty($userId)) {
|
if (empty($userRoles) || empty($userId)) {
|
||||||
return redirect()->to('/login');
|
$target = ltrim($request->getUri()->getPath(), '/');
|
||||||
|
$query = $request->getUri()->getQuery();
|
||||||
|
if ($query !== '') {
|
||||||
|
$target .= '?' . $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to('/login?redirect_to=' . rawurlencode('/' . ltrim($target, '/')));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce 12-hour session lifetime
|
// Enforce 12-hour session lifetime
|
||||||
@@ -110,7 +116,14 @@ class AuthFilter implements FilterInterface
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->to('/login')->with('error', 'Your session has expired. Please log in again.');
|
$target = ltrim($request->getUri()->getPath(), '/');
|
||||||
|
$query = $request->getUri()->getQuery();
|
||||||
|
if ($query !== '') {
|
||||||
|
$target .= '?' . $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to('/login?redirect_to=' . rawurlencode('/' . ltrim($target, '/')))
|
||||||
|
->with('error', 'Your session has expired. Please log in again.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
|
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
<input type="hidden" name="selected_role" id="selected_role">
|
<input type="hidden" name="selected_role" id="selected_role">
|
||||||
|
<input type="hidden" name="redirect_to" value="<?= esc((string) ($redirect_to ?? '')) ?>">
|
||||||
|
|
||||||
<div class="d-flex flex-wrap justify-content-center gap-3 mt-3">
|
<div class="d-flex flex-wrap justify-content-center gap-3 mt-3">
|
||||||
<?php foreach ($roles as $role): ?>
|
<?php foreach ($roles as $role): ?>
|
||||||
|
|||||||
@@ -1,25 +1,10 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use CodeIgniter\Exceptions\PageNotFoundException;
|
|
||||||
|
|
||||||
if (!function_exists('base_url')) {
|
|
||||||
throw new PageNotFoundException('base_url function not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
$session = session();
|
|
||||||
|
|
||||||
if ($session->get('isLoggedIn')) {
|
|
||||||
header('Location: ' . base_url('/dashboard'));
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
<?= $this->extend('layout/register_layout') ?>
|
<?= $this->extend('layout/register_layout') ?>
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
<div class="registration-form container mt-5 mb-5">
|
<div class="registration-form container mt-5 mb-5">
|
||||||
|
|
||||||
<form id="loginForm" method="post" action="<?= base_url('/user/login') ?>">
|
<form id="loginForm" method="post" action="<?= base_url('/user/login') ?>">
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
<input type="hidden" name="redirect_to" value="<?= esc(old('redirect_to', $redirect_to ?? '')) ?>">
|
||||||
<div class="text-center mb-4">
|
<div class="text-center mb-4">
|
||||||
<a href="<?= base_url('/') ?>">
|
<a href="<?= base_url('/') ?>">
|
||||||
<img src="<?= base_url('assets/images/alrahma_logo.png') ?>" alt=""
|
<img src="<?= base_url('assets/images/alrahma_logo.png') ?>" alt=""
|
||||||
@@ -60,9 +45,9 @@ if ($session->get('isLoggedIn')) {
|
|||||||
<button type="submit" class="btn btn-success item">Login</button>
|
<button type="submit" class="btn btn-success item">Login</button>
|
||||||
</div>
|
</div>
|
||||||
<!-- Flash Error Message -->
|
<!-- Flash Error Message -->
|
||||||
<?php if ($session->getFlashdata('error')): ?>
|
<?php if (session()->getFlashdata('error')): ?>
|
||||||
<div class="alert alert-danger mt-3 text-center" role="alert">
|
<div class="alert alert-danger mt-3 text-center" role="alert">
|
||||||
<?= esc($session->getFlashdata('error')) ?>
|
<?= esc(session()->getFlashdata('error')) ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<!-- Forgot Password -->
|
<!-- Forgot Password -->
|
||||||
|
|||||||
Reference in New Issue
Block a user