From 58445b2a48bf6e5746d540727453f4fec0ae60fc Mon Sep 17 00:00:00 2001 From: root Date: Tue, 24 Mar 2026 01:02:36 -0400 Subject: [PATCH] fix all issues --- .env | 2 +- app/Config/Database.php | 84 ++++---- app/Config/Routes.php | 4 + app/Controllers/AuthController.php | 3 +- .../View/AuthorizedUsersController.php | 158 ++++++++++++-- app/Controllers/View/FlagController.php | 30 ++- app/Controllers/View/GradingController.php | 46 ++++- app/Controllers/View/ParentController.php | 3 +- app/Controllers/View/RegisterController.php | 17 +- .../View/SubjectCurriculumController.php | 1 + app/Controllers/View/UserController.php | 194 +++++++++++++++--- app/Models/ConfigurationModel.php | 10 +- app/Models/SubjectCurriculumModel.php | 1 + .../daily_attendance_analysis.php | 86 ++++++++ app/Views/flags/flags_management.php | 13 +- app/Views/grading/below_sixty.php | 2 +- .../user/set_authorized_user_password.php | 142 +++++++++++++ quran_surahs_by_grade.csv | 45 ---- test_output.txt | Bin 2138396 -> 0 bytes 19 files changed, 674 insertions(+), 167 deletions(-) create mode 100644 app/Views/user/set_authorized_user_password.php delete mode 100644 quran_surahs_by_grade.csv delete mode 100644 test_output.txt diff --git a/.env b/.env index 6443556..1e48905 100644 --- a/.env +++ b/.env @@ -63,7 +63,7 @@ session.expiration = 43200 database.default.hostname = 127.0.0.1 database.default.database = school database.default.username = root -database.default.password = +database.default.password = rootpassword database.default.DBDriver = MySQLi database.default.DBPrefix = database.default.port = 3306 diff --git a/app/Config/Database.php b/app/Config/Database.php index 78561d0..0af3e90 100644 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -9,43 +9,51 @@ class Database extends Config public string $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR; public string $defaultGroup = 'default'; - public array $default = [ - 'DSN' => '', - 'hostname' => 'localhost', - 'username' => 'u280815660_melabidi', - 'password' => '>tNxlRzP/W8', - 'database' => 'u280815660_school', - 'DBDriver' => 'MySQLi', - 'DBPrefix' => '', - 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'development'), - 'charset' => 'utf8', - 'DBCollat' => 'utf8_general_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, - ]; + public array $default = []; + public array $tests = []; - public array $tests = [ - 'DSN' => '', - 'hostname' => 'localhost', - 'username' => 'u280815660_melabidi', - 'password' => '>tNxlRzP/W8', - 'database' => 'u280815660_school', - 'DBDriver' => 'MySQLi', - 'DBPrefix' => 'db_', - 'pConnect' => false, - 'DBDebug' => true, - 'charset' => 'utf8', - 'DBCollat' => 'utf8_general_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, - ]; + public function __construct() + { + parent::__construct(); + + $this->default = [ + 'DSN' => '', + 'hostname' => env('database.default.hostname'), + 'username' => env('database.default.username'), + 'password' => env('database.default.password'), + 'database' => env('database.default.database'), + 'DBDriver' => env('database.default.DBDriver', 'MySQLi'), + 'DBPrefix' => '', + 'pConnect' => false, + 'DBDebug' => (ENVIRONMENT !== 'development'), + 'charset' => 'utf8', + 'DBCollat' => 'utf8_general_ci', + 'swapPre' => '', + 'encrypt' => false, + 'compress' => false, + 'strictOn' => false, + 'failover' => [], + 'port' => (int) env('database.default.port', 3306), + ]; + + $this->tests = [ + 'DSN' => '', + 'hostname' => env('database.tests.hostname', env('database.default.hostname')), + 'username' => env('database.tests.username', env('database.default.username')), + 'password' => env('database.tests.password', env('database.default.password')), + 'database' => env('database.tests.database', env('database.default.database')), + 'DBDriver' => env('database.tests.DBDriver', env('database.default.DBDriver', 'MySQLi')), + 'DBPrefix' => env('database.tests.DBPrefix', 'db_'), + 'pConnect' => false, + 'DBDebug' => true, + 'charset' => 'utf8', + 'DBCollat' => 'utf8_general_ci', + 'swapPre' => '', + 'encrypt' => false, + 'compress' => false, + 'strictOn' => false, + 'failover' => [], + 'port' => (int) env('database.tests.port', env('database.default.port', 3306)), + ]; + } } diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 113b887..1b3eb7c 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -230,6 +230,10 @@ $routes->get('reset_password', 'View\UserController::resetPassword'); //$routes->get('/blocked', 'View\UserController::blocked'); +$routes->get('confirm_authorized_user', 'View\AuthorizedUsersController::confirm'); +$routes->get('set_authorized_user_password/(:num)', 'View\AuthorizedUsersController::setPassword/$1'); +$routes->post('set_authorized_user_password/(:num)', 'View\AuthorizedUsersController::savePassword/$1'); + $routes->post('assign_class_student', 'View\StudentController::assignClassStudent'); $routes->post('remove_class_student', 'View\StudentController::removeClassStudent'); $routes->post('administrator/remove_class_student', 'View\StudentController::removeClassStudent'); // alias to avoid 404s diff --git a/app/Controllers/AuthController.php b/app/Controllers/AuthController.php index 96aa341..aee212d 100644 --- a/app/Controllers/AuthController.php +++ b/app/Controllers/AuthController.php @@ -469,6 +469,7 @@ class AuthController extends Controller // Generate a secure token for the password reset helper('text'); $token = bin2hex(random_bytes(48)); + $tokenHash = hash('sha256', $token); // Calculate the expiration time for the token (1 hour from now) $expires_at = Time::now()->addHours(1); @@ -477,7 +478,7 @@ class AuthController extends Controller $passwordResetModel = new PasswordResetModel(); $passwordResetModel->insert([ 'email' => $email, - 'token' => $token, + 'token' => $tokenHash, 'created_at' => Time::now(), 'expires_at' => $expires_at, ]); diff --git a/app/Controllers/View/AuthorizedUsersController.php b/app/Controllers/View/AuthorizedUsersController.php index 5e9ae4a..a6cc46c 100644 --- a/app/Controllers/View/AuthorizedUsersController.php +++ b/app/Controllers/View/AuthorizedUsersController.php @@ -10,6 +10,8 @@ use CodeIgniter\I18n\Time; class AuthorizedUsersController extends ResourceController { + private const TOKEN_TTL_HOURS = 24; + protected $userModel; protected $authorizedUserModel; @@ -18,6 +20,30 @@ class AuthorizedUsersController extends ResourceController $this->userModel = new UserModel(); $this->authorizedUserModel = new AuthorizedUserModel(); } + + private function requireLogin() + { + if (!session()->get('is_logged_in')) { + return $this->failUnauthorized('Authentication required.'); + } + + return null; + } + + private function requireOwnership(array $authorizedUser) + { + $userId = (int) session()->get('user_id'); + if ($userId <= 0 || (int) ($authorizedUser['user_id'] ?? 0) !== $userId) { + return $this->failForbidden('You do not have access to this resource.'); + } + + return null; + } + + private function hashToken(string $token): string + { + return hash('sha256', $token); + } /** * Return a list of authorized users for the logged-in main user. * @@ -25,7 +51,10 @@ class AuthorizedUsersController extends ResourceController */ public function index() { - + if ($resp = $this->requireLogin()) { + return $resp; + } + $userId = session()->get('user_id'); $authorizedUsers = $this->authorizedUserModel->where('user_id', $userId)->findAll(); @@ -40,12 +69,20 @@ class AuthorizedUsersController extends ResourceController */ public function show($id = null) { + if ($resp = $this->requireLogin()) { + return $resp; + } + $authorizedUser = $this->authorizedUserModel->find($id); if (!$authorizedUser) { return $this->failNotFound('Authorized user not found.'); } + if ($resp = $this->requireOwnership($authorizedUser)) { + return $resp; + } + return $this->respond($authorizedUser); } @@ -56,6 +93,10 @@ class AuthorizedUsersController extends ResourceController */ public function create() { + if ($resp = $this->requireLogin()) { + return $resp; + } + $email = strtolower($this->request->getPost('email')); // Validate email @@ -66,19 +107,20 @@ class AuthorizedUsersController extends ResourceController $user = $this->userModel->where('email', $email)->first(); if (!$user) { - return $this->failNotFound('No user found with this email.'); + return $this->respondCreated(['message' => 'Authorized user added. A confirmation email has been sent.']); } // Generate a token for confirmation helper('text'); $token = bin2hex(random_bytes(48)); + $tokenHash = $this->hashToken($token); // Add entry to the authorized_users table $this->authorizedUserModel->insert([ 'user_id' => session()->get('user_id'), // Main user ID 'authorized_user_id' => $user['id'], 'email' => $email, - 'token' => $token, + 'token' => $tokenHash, 'status' => 'Pending' ]); @@ -96,6 +138,10 @@ class AuthorizedUsersController extends ResourceController */ public function update($id = null) { + if ($resp = $this->requireLogin()) { + return $resp; + } + // Fetch the authorized user $authorizedUser = $this->authorizedUserModel->find($id); @@ -103,6 +149,10 @@ class AuthorizedUsersController extends ResourceController return $this->failNotFound('Authorized user not found.'); } + if ($resp = $this->requireOwnership($authorizedUser)) { + return $resp; + } + // Update the authorized user’s information (e.g., email) $email = strtolower($this->request->getPost('email')); if ($email && filter_var($email, FILTER_VALIDATE_EMAIL)) { @@ -122,12 +172,20 @@ class AuthorizedUsersController extends ResourceController */ public function delete($id = null) { + if ($resp = $this->requireLogin()) { + return $resp; + } + $authorizedUser = $this->authorizedUserModel->find($id); if (!$authorizedUser) { return $this->failNotFound('Authorized user not found.'); } + if ($resp = $this->requireOwnership($authorizedUser)) { + return $resp; + } + // Delete the authorized user record $this->authorizedUserModel->delete($id); @@ -147,16 +205,28 @@ class AuthorizedUsersController extends ResourceController return $this->fail('Invalid confirmation link.'); } - $authorizedUser = $this->authorizedUserModel->where('token', $token)->first(); + $tokenHash = $this->hashToken($token); + $authorizedUser = $this->authorizedUserModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('created_at >=', Time::now()->subHours(self::TOKEN_TTL_HOURS)->toDateTimeString()) + ->first(); if (!$authorizedUser) { return $this->fail('Invalid or expired confirmation link.'); } - // Mark the authorized user as active - $this->authorizedUserModel->update($authorizedUser['id'], ['status' => 'Active', 'token' => null]); + // Mark the authorized user as active and rotate token for password setup + $nextToken = bin2hex(random_bytes(48)); + $nextTokenHash = $this->hashToken($nextToken); + $this->authorizedUserModel->update($authorizedUser['id'], [ + 'status' => 'Active', + 'token' => $nextTokenHash, + ]); - return redirect()->to('/set_authorized_user_password/' . $authorizedUser['authorized_user_id']); + return redirect()->to('/set_authorized_user_password/' . $authorizedUser['authorized_user_id'] . '?token=' . $nextToken); } /** @@ -167,13 +237,36 @@ class AuthorizedUsersController extends ResourceController */ public function setPassword($authorizedUserId) { + $token = (string) $this->request->getGet('token'); + if ($token === '') { + return $this->fail('Invalid confirmation link.'); + } + + $tokenHash = $this->hashToken($token); + $authorizedUser = $this->authorizedUserModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('authorized_user_id', $authorizedUserId) + ->where('status', 'Active') + ->where('updated_at >=', Time::now()->subHours(self::TOKEN_TTL_HOURS)->toDateTimeString()) + ->first(); + + if (!$authorizedUser) { + return $this->fail('Invalid or expired confirmation link.'); + } + $user = $this->userModel->find($authorizedUserId); if (!$user) { return $this->failNotFound('User not found.'); } - return view('user/set_authorized_user_password', ['userId' => $authorizedUserId]); + return view('user/set_authorized_user_password', [ + 'userId' => $authorizedUserId, + 'token' => $token, + ]); } /** @@ -181,38 +274,59 @@ class AuthorizedUsersController extends ResourceController * * @return ResponseInterface */ - /* - public function savePassword() + public function savePassword($authorizedUserId = null) { - // Validate the request $validation = \Config\Services::validation(); $validation->setRules([ - 'password' => 'required|min_length[6]', + 'password' => [ + 'label' => 'Password', + 'rules' => 'required|min_length[8]|regex_match[/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@\\-=\\+*#$%&!?])[A-Za-z\\d@\\-=\\+*#$%&!?]{8,}$/]', + ], 'password_confirm' => 'required|matches[password]', - 'user_id' => 'required|integer' + 'user_id' => 'required|integer', + 'token' => 'required', ]); if (!$this->validate($validation->getRules())) { return $this->failValidationErrors($validation->getErrors()); } - // Get the validated input - $userId = $this->request->getPost('user_id'); - $password = $this->request->getPost('password'); + $userId = (int) $this->request->getPost('user_id'); + $token = (string) $this->request->getPost('token'); + $authorizedUserId = $authorizedUserId !== null ? (int) $authorizedUserId : $userId; - $model = new UserModel(); - $user = $model->find($userId); + if ($userId <= 0 || $authorizedUserId <= 0 || $userId !== $authorizedUserId) { + return $this->fail('Invalid request.'); + } + $tokenHash = $this->hashToken($token); + $authorizedUser = $this->authorizedUserModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('authorized_user_id', $authorizedUserId) + ->where('status', 'Active') + ->where('updated_at >=', Time::now()->subHours(self::TOKEN_TTL_HOURS)->toDateTimeString()) + ->first(); + + if (!$authorizedUser) { + return $this->fail('Invalid or expired confirmation link.'); + } + + $user = $this->userModel->find($authorizedUserId); if (!$user) { return $this->failNotFound('User not found.'); } - // Save the password - $model->update($userId, ['password' => password_hash($password, PASSWORD_DEFAULT)]); + $password = (string) $this->request->getPost('password'); + $hashedPassword = pbkdf2_hash($password); + + $this->userModel->update($authorizedUserId, ['password' => $hashedPassword]); + $this->authorizedUserModel->update($authorizedUser['id'], ['token' => null]); return $this->respond(['message' => 'Password has been successfully set.']); } -*/ /** * Sends a confirmation email to the authorized user. * @@ -242,4 +356,4 @@ class AuthorizedUsersController extends ResourceController log_message('error', 'Failed to send authorized user confirmation email to ' . $email); } } -} \ No newline at end of file +} diff --git a/app/Controllers/View/FlagController.php b/app/Controllers/View/FlagController.php index 6e6e7ef..6a62edc 100644 --- a/app/Controllers/View/FlagController.php +++ b/app/Controllers/View/FlagController.php @@ -421,17 +421,45 @@ class FlagController extends Controller log_message('debug', 'Flag state: ' . $this->request->getPost('flag_state')); $currentFlagModel = new CurrentFlagModel(); + $userId = session()->get('user_id'); // Get the new flag state from the form $newState = $this->request->getPost('flag_state'); + $stateDescription = (string) ($this->request->getPost('state_description') ?? ''); + $actionTaken = (string) ($this->request->getPost('action_taken') ?? ''); if (!$newState) { session()->setFlashdata('error', 'incident state not provided.'); return $this->index(); } + $update = ['flag_state' => $newState]; + if ($newState === 'Closed') { + $update['updated_by_closed'] = $userId; + if ($stateDescription !== '') { + $update['close_description'] = $stateDescription; + } + if ($actionTaken !== '') { + $update['action_taken'] = $actionTaken; + } + } elseif ($newState === 'Canceled') { + $update['updated_by_canceled'] = $userId; + if ($stateDescription !== '') { + $update['cancel_description'] = $stateDescription; + } + if ($actionTaken !== '') { + $update['action_taken'] = $actionTaken; + } + } + // Update the flag state in the database - if ($currentFlagModel->update($id, ['flag_state' => $newState])) { + if ($currentFlagModel->update($id, $update)) { + if ($newState === 'Closed' || $newState === 'Canceled') { + $flagData = $currentFlagModel->find($id); + if ($flagData) { + return $this->moveToHistory($flagData); + } + } session()->setFlashdata('success', 'Incident state updated successfully!'); } else { $errors = $currentFlagModel->errors(); diff --git a/app/Controllers/View/GradingController.php b/app/Controllers/View/GradingController.php index f323d6e..6aa2480 100644 --- a/app/Controllers/View/GradingController.php +++ b/app/Controllers/View/GradingController.php @@ -1216,6 +1216,14 @@ class GradingController extends Controller $flagModel = new CurrentFlagModel(); $semKey = strtolower(trim($semester)); + $redirectUrl = base_url('grading/below-60'); + $query = http_build_query([ + 'semester' => $semester, + 'school_year' => $schoolYear, + ]); + if ($query !== '') { + $redirectUrl .= '?' . $query; + } $existing = $flagModel ->where('student_id', $studentId) @@ -1226,11 +1234,14 @@ class GradingController extends Controller $userId = (int)(session()->get('user_id') ?? 0) ?: null; $now = utc_now(); + $ok = true; if ($existing) { $data = [ 'flag_state' => $status, 'flag_datetime' => $now, + 'semester' => $semester, + 'school_year' => $schoolYear, 'updated_at' => $now, ]; if ($status === 'Open') { @@ -1246,7 +1257,7 @@ class GradingController extends Controller $data['close_description'] = trim($prev . PHP_EOL . $note); } } - $flagModel->update((int)$existing['id'], $data); + $ok = (bool) $flagModel->update((int)$existing['id'], $data); } else { $row = $this->fetchBelowSixtyEmailRow($studentId, $schoolYear, $semester); $studentName = trim((string)($row['firstname'] ?? '') . ' ' . (string)($row['lastname'] ?? '')); @@ -1269,10 +1280,21 @@ class GradingController extends Controller $data['updated_by_closed'] = $userId; if ($note !== '') $data['close_description'] = $note; } - $flagModel->insert($data); + $ok = (bool) $flagModel->insert($data); } - return redirect()->back()->with('status', 'Status updated.'); + if (!$ok) { + log_message('error', 'updateBelowSixtyStatus failed', [ + 'student_id' => $studentId, + 'semester' => $semester, + 'school_year' => $schoolYear, + 'status' => $status, + 'errors' => $flagModel->errors(), + ]); + return redirect()->to($redirectUrl)->with('error', 'Failed to update status.'); + } + + return redirect()->to($redirectUrl)->with('status', 'Status updated.'); } public function scheduleBelowSixty() @@ -1797,9 +1819,10 @@ class GradingController extends Controller } $statusMap = []; + $noteMap = []; if (!empty($studentIds)) { $flagRows = $this->db->table('current_flag') - ->select('student_id, flag_state') + ->select('student_id, flag_state, open_description, close_description') ->where('flag', 'grade') ->where('school_year', $schoolYear) ->where("LOWER(TRIM(semester))", $semesterKey) @@ -1810,6 +1833,12 @@ class GradingController extends Controller $sid = (int)($row['student_id'] ?? 0); if ($sid <= 0) continue; $statusMap[$sid] = (string)($row['flag_state'] ?? ''); + $openNote = trim((string)($row['open_description'] ?? '')); + $closeNote = trim((string)($row['close_description'] ?? '')); + $noteMap[$sid] = [ + 'open' => $openNote, + 'closed' => $closeNote, + ]; } } @@ -1818,6 +1847,15 @@ class GradingController extends Controller $row['comment'] = $commentMap[$sid] ?? ''; $flagState = strtolower(trim((string)($statusMap[$sid] ?? ''))); $row['status'] = ($flagState === 'closed' || $flagState === 'canceled') ? 'Closed' : 'Open'; + $noteBag = $noteMap[$sid] ?? ['open' => '', 'closed' => '']; + $rawNote = $row['status'] === 'Closed' ? (string)$noteBag['closed'] : (string)$noteBag['open']; + if ($rawNote !== '') { + $lines = preg_split('/\R/', $rawNote); + $lines = array_values(array_filter(array_map('trim', $lines), static fn($val) => $val !== '')); + $row['note'] = $lines ? end($lines) : ''; + } else { + $row['note'] = ''; + } } unset($row); diff --git a/app/Controllers/View/ParentController.php b/app/Controllers/View/ParentController.php index d563aa7..027d08f 100644 --- a/app/Controllers/View/ParentController.php +++ b/app/Controllers/View/ParentController.php @@ -717,6 +717,7 @@ class ParentController extends BaseController // Step 1: Generate a secure token for email verification $token = bin2hex(random_bytes(48)); + $tokenHash = hash('sha256', $token); // Step 2: Determine user type based on relationship $userType = in_array(strtolower($relationToStudent), ['wife', 'husband']) ? 'Secondary' : 'Tertiary'; @@ -776,7 +777,7 @@ class ParentController extends BaseController 'state' => strtoupper($userData['state']), 'zip' => $userData['zip'], 'accept_school_policy' => $userData['accept_school_policy'] ?? 0, - 'token' => $token, + 'token' => $tokenHash, 'is_verified' => 0, 'status' => 'Inactive', 'user_type' => $userType, diff --git a/app/Controllers/View/RegisterController.php b/app/Controllers/View/RegisterController.php index fe22344..4970690 100644 --- a/app/Controllers/View/RegisterController.php +++ b/app/Controllers/View/RegisterController.php @@ -173,16 +173,8 @@ class RegisterController extends Controller $existingUser = $this->userModel->where('email', $post['email'])->first(); if ($existingUser) { - // Step 2: Check if the user has a token (i.e., not verified yet) - if (!empty($existingUser['token']) && $existingUser['is_verified'] == 0) { - // User exists and is unverified - return redirect()->back()->withInput()->with('error', - 'This email address is already registered and is pending activation. Please check your email to activate your account.'); - } else { - // User exists and is already active or has no token - return redirect()->back()->withInput()->with('error', - 'The email address you entered is already in use. Please try a different one.'); - } + return redirect()->back()->withInput()->with('error', + 'This email address is already registered. Please check your email or log in.'); } /* ───────────── 6. Determine role ───────────── */ @@ -194,6 +186,7 @@ class RegisterController extends Controller /* ───────────── 7. Build & insert user ───────────── */ $token = bin2hex(random_bytes(48)); + $tokenHash = hash('sha256', $token); $userData = [ 'firstname' => $post['firstname'], 'lastname' => $post['lastname'], @@ -205,7 +198,7 @@ class RegisterController extends Controller 'city' => $post['city'], 'state' => $post['state'], 'zip' => $post['zip'], - 'token' => $token, + 'token' => $tokenHash, 'is_verified'=> 0, 'accept_school_policy' => (int) $post['accept_school_policy'], 'status' => 'Inactive', @@ -357,4 +350,4 @@ class RegisterController extends Controller -} \ No newline at end of file +} diff --git a/app/Controllers/View/SubjectCurriculumController.php b/app/Controllers/View/SubjectCurriculumController.php index adcb695..2273b72 100644 --- a/app/Controllers/View/SubjectCurriculumController.php +++ b/app/Controllers/View/SubjectCurriculumController.php @@ -99,6 +99,7 @@ class SubjectCurriculumController extends BaseController ->orderBy('classes.class_name', 'ASC') ->orderBy('subject', 'ASC') ->orderBy('unit_number', 'ASC') + ->orderBy("CAST(SUBSTRING_INDEX(subject_curriculum_items.chapter_name, '.', 1) AS UNSIGNED)", 'ASC', false) ->orderBy('chapter_name', 'ASC') ->get() ->getResultArray(); diff --git a/app/Controllers/View/UserController.php b/app/Controllers/View/UserController.php index f8d1c6f..2f7e64e 100644 --- a/app/Controllers/View/UserController.php +++ b/app/Controllers/View/UserController.php @@ -21,6 +21,7 @@ require_once APPPATH . 'Helpers/pbkdf2_helper.php'; class UserController extends BaseController { + private const ACTIVATION_TTL_HOURS = 48; protected $userModel; protected $roleModel; protected $userRoleModel; @@ -49,6 +50,37 @@ class UserController extends BaseController $this->resetRequestModel = new PasswordResetRequestModel(); } + private function denyAccess(string $message) + { + if ($this->request->isAJAX() || $this->request->getHeaderLine('Accept') === 'application/json') { + return service('response') + ->setStatusCode(403) + ->setJSON(['status' => 'error', 'message' => $message]); + } + + session()->setFlashdata('error', $message); + return redirect()->to('/access_denied'); + } + + private function requirePermission(string $permission) + { + if (!session()->get('is_logged_in')) { + return redirect()->to('/login'); + } + + $userId = (int) session()->get('user_id'); + if ($userId <= 0 || !has_permission($userId, $permission)) { + return $this->denyAccess("You don't have permission to use this feature."); + } + + return null; + } + + private function hashToken(string $token): string + { + return hash('sha256', $token); + } + // Method to show the home page public function home() { @@ -75,6 +107,10 @@ class UserController extends BaseController public function userList() { + if ($resp = $this->requirePermission('read_user')) { + return $resp; + } + helper('url'); return view('user/user_list', [ @@ -85,6 +121,10 @@ class UserController extends BaseController // Method to show the list of users public function index() { + if ($resp = $this->requirePermission('read_user')) { + return $resp; + } + // Fetch users along with their assigned roles $builder = $this->db->table('users'); $builder->select('users.id, users.firstname, users.lastname, users.email, user_roles.role_id, roles.name as role, users.status, users.updated_at'); @@ -122,6 +162,10 @@ class UserController extends BaseController public function userListData() { + if ($resp = $this->requirePermission('read_user')) { + return $resp; + } + return $this->response->setJSON([ 'users' => $this->buildUsersWithRoles(), ]); @@ -253,6 +297,10 @@ class UserController extends BaseController // Method to store a new user public function store() { + if ($resp = $this->requirePermission('edit_user')) { + return $resp; + } + // Validate input data $validation = \Config\Services::validation(); $validation->setRules([ @@ -315,6 +363,10 @@ class UserController extends BaseController // Method to show the form for editing an existing user public function edit($id) { + if ($resp = $this->requirePermission('edit_user')) { + return $resp; + } + $data['user'] = $this->userModel->find($id); $data['roles'] = $this->roleModel->findAll(); $userRoles = $this->userRoleModel->where('user_id', $id)->findAll(); @@ -327,6 +379,10 @@ class UserController extends BaseController // Method to delete an existing user public function delete($id) { + if ($resp = $this->requirePermission('edit_user')) { + return $resp; + } + $this->userModel->delete($id); // Delete the user's roles from the user_roles table @@ -369,27 +425,21 @@ class UserController extends BaseController $email = strtolower($this->request->getPost('email')); $user = $this->userModel->where('email', $email)->first(); - // --- Handle unknown email --- - if (!$user) { - session()->setFlashdata('error', 'If this email is registered, you will receive a reset link.'); - log_message('info', "Password reset requested for non-existing user {$email}"); - return redirect()->back(); - } - - // --- Handle unverified accounts --- - if ((int) $user['is_verified'] === 0) { - session()->setFlashdata('error', 'Please check your email and complete the account activation process before resetting your password.'); - log_message('info', "Password reset blocked for unverified user {$email}"); + // --- Handle unknown or unverified email --- + if (!$user || (int) $user['is_verified'] === 0) { + session()->setFlashdata('success', 'If this email is registered, you will receive a reset link.'); + log_message('info', "Password reset requested for {$email} (user missing or unverified)."); return redirect()->back(); } // --- Verified user: continue with reset --- $token = bin2hex(random_bytes(48)); + $tokenHash = $this->hashToken($token); $expires_at = Time::now()->addHours(1); $this->passwordResetModel->insert([ 'email' => $email, - 'token' => $token, + 'token' => $tokenHash, 'created_at' => Time::now(), 'expires_at' => $expires_at, ]); @@ -447,7 +497,12 @@ class UserController extends BaseController } // You may want to validate the token here - $resetEntry = $this->passwordResetModel->where('token', $token) + $tokenHash = $this->hashToken($token); + $resetEntry = $this->passwordResetModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() ->where('expires_at >=', Time::now()) ->first(); @@ -462,6 +517,10 @@ class UserController extends BaseController //This function processes the new password submission, validating the token, updating the user's password, and cleaning up the reset entry. public function processResetPassword() { + if (strtolower($this->request->getMethod()) !== 'post') { + return redirect()->to('/')->with('error', 'Invalid request.'); + } + $token = $this->request->getPost('token'); $newPassword = $this->request->getPost('password'); $passConfirm = $this->request->getPost('pass_confirm'); @@ -490,7 +549,12 @@ class UserController extends BaseController } // Find the password reset entry - $resetEntry = $this->passwordResetModel->where('token', $token) + $tokenHash = $this->hashToken($token); + $resetEntry = $this->passwordResetModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() ->where('expires_at >=', Time::now()) ->first(); @@ -519,7 +583,12 @@ class UserController extends BaseController ]); // Delete the used token from the password reset table - $this->passwordResetModel->where('token', $token)->delete(); + $this->passwordResetModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->delete(); // Retrieve the user's IP address from the request $ipAddress = $this->request->getIPAddress(); @@ -546,10 +615,16 @@ class UserController extends BaseController public function confirm($token) { - log_message('info', 'Processing email confirmation with token: ' . $token); + log_message('info', 'Processing email confirmation.'); - - $user = $this->userModel->where('token', $token)->first(); + $tokenHash = $this->hashToken($token); + $user = $this->userModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('created_at >=', Time::now()->subHours(self::ACTIVATION_TTL_HOURS)->toDateTimeString()) + ->first(); if (!$user || $user['is_verified'] == 1) { return redirect()->to('/invalid_token'); @@ -570,7 +645,14 @@ class UserController extends BaseController { //echo "Reached setPassword with token: " . esc($token); //echo "Token received: " . $token; - $user = $this->userModel->where('token', $token)->first(); + $tokenHash = $this->hashToken($token); + $user = $this->userModel + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('created_at >=', Time::now()->subHours(self::ACTIVATION_TTL_HOURS)->toDateTimeString()) + ->first(); if (!$user || $user['is_verified'] == 1) { return redirect()->to('/invalid_token'); @@ -584,6 +666,10 @@ class UserController extends BaseController public function savePassword() { + if (strtolower($this->request->getMethod()) !== 'post') { + return redirect()->to('/')->with('error', 'Invalid request.'); + } + $validation = \Config\Services::validation(); $validation->setRules([ 'password' => [ @@ -615,9 +701,17 @@ class UserController extends BaseController $token = $this->request->getPost('token'); $password = $this->request->getPost('password'); - $user = $this->userModel->where('id', $userId)->where('token', $token)->first(); + $tokenHash = $this->hashToken($token); + $user = $this->userModel + ->where('id', $userId) + ->groupStart() + ->where('token', $tokenHash) + ->orWhere('token', $token) + ->groupEnd() + ->where('created_at >=', Time::now()->subHours(self::ACTIVATION_TTL_HOURS)->toDateTimeString()) + ->first(); - log_message('debug', "Attempting to set password for user $userId with token $token"); + log_message('debug', "Attempting to set password for user $userId"); if (!$user || $user['is_verified'] == 1) { return redirect()->to('/invalid_token'); @@ -670,20 +764,39 @@ class UserController extends BaseController $roleKey = (string) $this->request->getPost('role'); log_message('info', 'Role selected: ' . $roleKey); - $roleModel = new RoleModel(); - $route = $roleModel->getRouteByNameOrSlug($roleKey); - - if ($route === null) { - log_message('error', 'Invalid or inactive role selected: ' . $roleKey); - return redirect()->back()->with('error', 'Invalid role selected.'); - } - $userId = (int) session()->get('user_id'); log_message('info', 'User ID: ' . $userId); + if ($userId <= 0) { + return $this->denyAccess("You don't have permission to use this feature."); + } + + $roleRow = $this->db->table('user_roles ur') + ->join('roles r', 'r.id = ur.role_id', 'inner') + ->select('r.name, r.slug, r.dashboard_route') + ->where('ur.user_id', $userId) + ->where('r.is_active', 1) + ->groupStart() + ->where('LOWER(r.name)', strtolower($roleKey)) + ->orWhere('LOWER(r.slug)', strtolower($roleKey)) + ->groupEnd() + ->get() + ->getRowArray(); + + if (empty($roleRow)) { + log_message('error', 'Invalid or unassigned role selected: ' . $roleKey); + return redirect()->back()->with('error', 'Invalid role selected.'); + } + + $route = $roleRow['dashboard_route'] ?? null; + if ($route === null) { + log_message('error', 'No dashboard route configured for role: ' . $roleKey); + return redirect()->back()->with('error', 'Invalid role selected.'); + } + // Persist the *exact* role name or slug—choose your convention. - // If you want to store the canonical name, fetch the row and use $row['name']. - $this->userModel->update($userId, ['role' => $roleKey]); + // Store the canonical name to avoid arbitrary role strings. + $this->userModel->update($userId, ['role' => $roleRow['name']]); log_message('info', 'Role updated in database.'); log_message('info', 'Redirecting to role dashboard: ' . $route); @@ -702,6 +815,10 @@ class UserController extends BaseController public function delete_role($roleId) { + if ($resp = $this->requirePermission('edit_user')) { + return $resp; + } + // Fetch the role to be deleted $role = $this->roleModel->find($roleId); if (!$role) { @@ -731,6 +848,10 @@ class UserController extends BaseController public function loginActivity() { + if ($resp = $this->requirePermission('view_login_activity')) { + return $resp; + } + helper('url'); $perPage = (int) ($this->request->getGet('per_page') ?? 25); @@ -743,6 +864,10 @@ class UserController extends BaseController public function loginActivityData() { + if ($resp = $this->requirePermission('view_login_activity')) { + return $resp; + } + $perPage = (int) ($this->request->getGet('per_page') ?? 25); $page = (int) ($this->request->getGet('page') ?? 1); @@ -752,6 +877,10 @@ class UserController extends BaseController // Method to update an existing user public function updateUser() { + if ($resp = $this->requirePermission('edit_user')) { + return $resp; + } + if (strtolower($this->request->getMethod()) !== 'post') { return redirect()->to(site_url('user/user_list'))->with('error', 'Invalid request.'); } @@ -800,9 +929,6 @@ class UserController extends BaseController 'status' => trim((string)$this->request->getPost('status')), 'is_suspended' => $toBool('is_suspended'), 'is_verified' => $toBool('is_verified'), - 'token' => trim((string)$this->request->getPost('token')), - 'updated_at' => $toDT('updated_at'), - 'created_at' => $toDT('created_at'), ]; // Validation diff --git a/app/Models/ConfigurationModel.php b/app/Models/ConfigurationModel.php index 86ca89b..0a6463d 100644 --- a/app/Models/ConfigurationModel.php +++ b/app/Models/ConfigurationModel.php @@ -22,11 +22,13 @@ class ConfigurationModel extends Model */ public function getConfigValueByKey(string $key) { - // Deterministic read in case historical duplicates exist - $result = $this->where('config_key', $key) + // Use a fresh builder to avoid stale state from shared model builder. + $builder = $this->db->table($this->table); + $result = $builder->where('config_key', $key) ->orderBy('id', 'DESC') - ->first(); - return $result ? $result['config_value'] : null; + ->get(1) + ->getRowArray(); + return $result['config_value'] ?? null; } /** diff --git a/app/Models/SubjectCurriculumModel.php b/app/Models/SubjectCurriculumModel.php index 24a5196..d83e308 100644 --- a/app/Models/SubjectCurriculumModel.php +++ b/app/Models/SubjectCurriculumModel.php @@ -27,6 +27,7 @@ class SubjectCurriculumModel extends Model return $this->where('class_id', $classId) ->where('subject', $subject) ->orderBy('unit_number', 'ASC') + ->orderBy("CAST(SUBSTRING_INDEX(chapter_name, '.', 1) AS UNSIGNED)", 'ASC', false) ->orderBy('chapter_name', 'ASC') ->findAll(); } diff --git a/app/Views/administrator/daily_attendance_analysis.php b/app/Views/administrator/daily_attendance_analysis.php index b0ca7a7..4036c39 100644 --- a/app/Views/administrator/daily_attendance_analysis.php +++ b/app/Views/administrator/daily_attendance_analysis.php @@ -250,6 +250,54 @@ $analysisSectionTotals[] = (int)($s['total_students'] ?? 0); } + // ---- Student absences/late list ---- + $sectionLabelByKey = []; + foreach ($grades as $classId => $sections) { + foreach ($sections as $section) { + $sectionKey = (string)($section['class_section_id'] ?? ($section['id'] ?? '')); + if ($sectionKey === '') continue; + $secNameRaw = trim((string)($section['class_section_name'] ?? '')); + $sectionLabelByKey[$sectionKey] = $secNameRaw !== '' ? $secNameRaw : ('Section ' . $sectionKey); + } + } + + $studentIssueRows = []; + foreach ($studentsBySection as $sectionKey => $students) { + foreach ($students as $stu) { + $sid = (int)($stu['id'] ?? 0); + if ($sid <= 0) continue; + $entries = $attendanceData[$sectionKey][$sid] ?? []; + if (!is_array($entries)) continue; + $abs = 0; + $late = 0; + foreach ($entries as $e) { + $d = substr((string)($e['date'] ?? ''), 0, 10); + if ($d === '') continue; + if ($filterStart !== '' && $d < $filterStart) continue; + if ($filterEnd !== '' && $d > $filterEnd) continue; + $st = strtolower(trim((string)($e['status'] ?? ''))); + if ($st === 'absent') { + $abs++; + } elseif ($st === 'late') { + $late++; + } + } + if (($abs + $late) <= 0) continue; + $studentIssueRows[] = [ + 'name' => trim((string)($stu['firstname'] ?? '') . ' ' . (string)($stu['lastname'] ?? '')), + 'section' => $sectionLabelByKey[(string)$sectionKey] ?? ('Section ' . $sectionKey), + 'absent' => $abs, + 'late' => $late, + ]; + } + } + + usort($studentIssueRows, static function ($a, $b) { + $sec = strcmp($a['section'], $b['section']); + if ($sec !== 0) return $sec; + return strcmp($a['name'], $b['name']); + }); + $totalDaysForPercent = 0; if ($filterStart === '' && $filterEnd === '' && !empty($totalPassedDays)) { $totalDaysForPercent = (int)$totalPassedDays; @@ -373,6 +421,37 @@ +
+
Students With Absences / Late
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Student NameClass SectionNbr of ABSNbr of LATE
No absences or late records in the selected range.
+
+
@@ -480,6 +559,13 @@ info: false, order: [[0, 'asc']] }); + $('#studentIssueTable').DataTable({ + paging: true, + searching: true, + info: true, + order: [[1, 'asc'], [0, 'asc']], + pageLength: 25 + }); } }); diff --git a/app/Views/flags/flags_management.php b/app/Views/flags/flags_management.php index 6911fdc..3c5877a 100644 --- a/app/Views/flags/flags_management.php +++ b/app/Views/flags/flags_management.php @@ -107,7 +107,10 @@ -
+ - +
diff --git a/app/Views/user/set_authorized_user_password.php b/app/Views/user/set_authorized_user_password.php new file mode 100644 index 0000000..9fddda8 --- /dev/null +++ b/app/Views/user/set_authorized_user_password.php @@ -0,0 +1,142 @@ +extend('layout/register_layout') ?> +section('content') ?> + +
+
+ +
+ + + +
+ +

Create Your Password

+
+ + + +
+
+ + + + +
+ + Password must be at least 8 characters long, contain a number, an uppercase letter, a lowercase letter, and one special character: @, -, =, +, *, #, $, %, &, ! + + + Copy and paste are disabled for security reasons. + +
+ +
+
+ + + + +
+ + Passwords do not match. + + + Copy and paste are disabled for security reasons. + +
+ +
+ +
+
+
+ +endSection() ?> + +section('scripts') ?> + +endSection() ?> diff --git a/quran_surahs_by_grade.csv b/quran_surahs_by_grade.csv deleted file mode 100644 index 7adf2d8..0000000 --- a/quran_surahs_by_grade.csv +++ /dev/null @@ -1,45 +0,0 @@ -Grade,Surah -1,Al-Fatihah -1,An-Nas -1,Al-Falaq -1,Al-Ikhlas -2,Al-Masad -2,An-Nasr -2,Al-Kafirun -2,Al-Kawthar -2,Al-Ma'un -3,Quraysh -3,Al-Fil -3,Al-Humazah -3,Al-'Asr -3,At-Takathur -4,Al-Qari'ah -4,Al-'Adiyat -4,Az-Zalzalah -4,Al-Bayyinah -4,Al-Qadr -5,Al-'Alaq -5,At-Tin -5,Ash-Sharh -5,Ad-Duhaa -5,Al-Layl -6,Ash-Shams -6,Al-Balad -6,Al-Fajr -6,Al-Ghashiyah -6,Al-A'la -7,At-Tariq -7,Al-Buruj -7,Al-Inshiqaq -7,Al-Mutaffifin -7,Al-Infitar -8,At-Takwir -8,Abasa -8,Al-Mursalat -8,An-Naba -9,Al-Mulk -9,Al-Qalam -9,Al-Haqqah -9,Al-Ma'arij -9,Nuh -9,Al-Jinn diff --git a/test_output.txt b/test_output.txt deleted file mode 100644 index 543cd4a945dfeceb3dd3b4ee12c24781387982fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138396 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 p@BN|sck;!bNOqP~_lwwq&U