currentDateTime(), "action"=>$action, "exam_id"=>$exam_id, "ip"=>$_SERVER["REMOTE_ADDR"]??"", "browser"=>$_SERVER["HTTP_USER_AGENT"]??"" ],$extra); write_json(SYSTEM_LOG,$log); } function writeLog($action,$exam_id=null,$extra=[]){ system_log($action,$exam_id,$extra); } /* ========================================================= LOGGING FUNCTIONS ========================================================= */ function writeLog($action, $exam_id = null, $extra = []) { system_log($action, $exam_id, $extra); } function writeAuditLog($action, $details = []) { $log = read_json(AUDIT_LOG); $log[] = [ "date" => currentDate(), "time" => currentTime(), "datetime" => currentDateTime(), "action" => $action, "details" => $details, "ip_address" => $_SERVER["REMOTE_ADDR"] ?? "", "browser" => $_SERVER["HTTP_USER_AGENT"] ?? "" ]; write_json(AUDIT_LOG, $log); } function writeErrorLog($message, $details = []) { $log = read_json(ERROR_LOG); $log[] = [ "date" => currentDate(), "time" => currentTime(), "datetime" => currentDateTime(), "message" => $message, "details" => $details ]; write_json(ERROR_LOG, $log); } /* ========================================================= EXAM ID GENERATORS ========================================================= */ function generate_question_id() { return "Q" . str_pad((string) random_int(1, 999999), 6, "0", STR_PAD_LEFT); } function generate_answer_id() { return "ANS-" . date("YmdHis") . "-" . random_int(1000, 9999); } function generate_session_token() { return bin2hex(random_bytes(32)); } /* ========================================================= FILE HELPERS ========================================================= */ function fileExistsSafe($file) { return is_file($file); } function loadExam($examFile) { return read_json($examFile); } function saveExam($examFile, array $examData) { return write_json($examFile, $examData); } /* ========================================================= REQUEST HELPERS ========================================================= */ function post($key, $default = "") { return isset($_POST[$key]) ? sanitize($_POST[$key]) : $default; } function get($key, $default = "") { return isset($_GET[$key]) ? sanitize($_GET[$key]) : $default; } /* ========================================================= CLIENT INFORMATION ========================================================= */ function getIPAddress() { return $_SERVER["REMOTE_ADDR"] ?? ""; } function getBrowser() { return $_SERVER["HTTP_USER_AGENT"] ?? ""; } function getDeviceType() { $agent = strtolower($_SERVER["HTTP_USER_AGENT"] ?? ""); if (strpos($agent, "mobile") !== false) { return "Phone"; } if (strpos($agent, "tablet") !== false) { return "Tablet"; } return "Computer"; } function getDeviceModel() { return DEFAULT_DEVICE_MODEL; } /* ========================================================= END OF PART 2 ========================================================= */ /* ========================================================= VALIDATION ENGINE ========================================================= */ function isEmpty($value) { return trim($value) === ""; } function isValidEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } function isValidExamID($examID) { return preg_match( '/^EXAM-\d{4}-\d{6}$/', trim($examID) ) === 1; } function isValidQuestionID($questionID) { return preg_match( '/^Q\d{6}$/', trim($questionID) ) === 1; } function isValidPassword($password) { return strlen(trim($password)) >= 6; } function isPositiveInteger($number) { return filter_var( $number, FILTER_VALIDATE_INT ) !== false && $number > 0; } /* ========================================================= STRING UTILITIES ========================================================= */ function toUpper($text) { return strtoupper(trim($text)); } function toLower($text) { return strtolower(trim($text)); } function titleCase($text) { return ucwords(strtolower(trim($text))); } function randomString($length = 10) { $characters = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; $string = ""; for($i = 0; $i < $length; $i++) { $string .= $characters[ random_int( 0, strlen($characters)-1 ) ]; } return $string; } /* ========================================================= DATE UTILITIES ========================================================= */ function today() { return date("Y-m-d"); } function now() { return date("Y-m-d H:i:s"); } function currentTimestamp() { return time(); } /* ========================================================= END OF PART 3 ========================================================= */ /* ========================================================= EXAM ENGINE ========================================================= */ function examExists(string $examID): bool { return is_dir(EXAMS_PATH . "/" . $examID); } function getExamFolder(string $examID): string { return EXAMS_PATH . "/" . $examID; } function getExamFile(string $examID): string { return getExamFolder($examID) . "/exam.json"; } function loadExamByID(string $examID): array { $file = getExamFile($examID); if (!file_exists($file)) { return []; } return read_json($file); } function saveExamByID(string $examID, array $examData): bool { $folder = getExamFolder($examID); ensure_directory($folder); $file = getExamFile($examID); return write_json($file, $examData); } function deleteExamByID(string $examID): bool { $folder = getExamFolder($examID); if (!is_dir($folder)) { return false; } deleteDirectory($folder); return true; } /* ========================================================= QUESTION ENGINE ========================================================= */ function getQuestionFolder(string $examID): string { return getExamFolder($examID) . "/QUESTIONS-" . $examID; } function questionExists(string $examID, string $questionID): bool { return file_exists( getQuestionFolder($examID) . "/" . $questionID . ".json" ); } function getQuestionFile(string $examID, string $questionID): string { return getQuestionFolder($examID) . "/" . $questionID . ".json"; } function loadQuestion(string $examID, string $questionID): array { $file = getQuestionFile($examID, $questionID); if (!file_exists($file)) { return []; } return read_json($file); } function saveQuestion( string $examID, string $questionID, array $question ): bool { ensure_directory(getQuestionFolder($examID)); return write_json( getQuestionFile($examID, $questionID), $question ); } /* ========================================================= ANSWER ENGINE ========================================================= */ function getAnswerFolder(string $examID): string { return ANSWERS_PATH . "/ANSWER-" . $examID; } function getAnswerFile( string $examID, string $studentID ): string { return getAnswerFolder($examID) . "/" . $studentID . ".json"; } function loadStudentAnswers( string $examID, string $studentID ): array { $file = getAnswerFile($examID, $studentID); if (!file_exists($file)) { return []; } return read_json($file); } function saveStudentAnswers( string $examID, string $studentID, array $answers ): bool { ensure_directory(getAnswerFolder($examID)); return write_json( getAnswerFile($examID, $studentID), $answers ); } /* ========================================================= END OF PART 4 ========================================================= */ /* ========================================================= DIRECTORY ENGINE --------------------------------------------------------- Enterprise Directory Management ========================================================= */ /* --------------------------------------------------------- CREATE DIRECTORY --------------------------------------------------------- */ function ensure_directory(string $directory): bool { if (is_dir($directory)) { return true; } return mkdir($directory, 0777, true); } /* --------------------------------------------------------- DELETE DIRECTORY --------------------------------------------------------- */ function deleteDirectory(string $directory): bool { if (!is_dir($directory)) { return false; } $items = scandir($directory); foreach ($items as $item) { if ($item == "." || $item == "..") { continue; } $path = $directory . DIRECTORY_SEPARATOR . $item; if (is_dir($path)) { deleteDirectory($path); } else { unlink($path); } } return rmdir($directory); } /* --------------------------------------------------------- EMPTY DIRECTORY --------------------------------------------------------- */ function emptyDirectory(string $directory): bool { if (!is_dir($directory)) { return false; } $items = scandir($directory); foreach ($items as $item) { if ($item == "." || $item == "..") { continue; } $path = $directory . DIRECTORY_SEPARATOR . $item; if (is_dir($path)) { deleteDirectory($path); } else { unlink($path); } } return true; } /* --------------------------------------------------------- COPY DIRECTORY --------------------------------------------------------- */ function copyDirectory(string $source, string $destination): bool { if (!is_dir($source)) { return false; } ensure_directory($destination); $items = scandir($source); foreach ($items as $item) { if ($item == "." || $item == "..") { continue; } $src = $source . DIRECTORY_SEPARATOR . $item; $dst = $destination . DIRECTORY_SEPARATOR . $item; if (is_dir($src)) { copyDirectory($src, $dst); } else { copy($src, $dst); } } return true; } /* --------------------------------------------------------- LIST FILES --------------------------------------------------------- */ function listFiles(string $directory): array { if (!is_dir($directory)) { return []; } return array_values( array_filter( scandir($directory), function($file) { return $file != "." && $file != ".."; } ) ); } /* --------------------------------------------------------- LIST SUBDIRECTORIES --------------------------------------------------------- */ function listDirectories(string $directory): array { if (!is_dir($directory)) { return []; } $folders = []; foreach (scandir($directory) as $item) { if ($item == "." || $item == "..") { continue; } if (is_dir($directory . DIRECTORY_SEPARATOR . $item)) { $folders[] = $item; } } return $folders; } /* ========================================================= END OF DIRECTORY ENGINE ========================================================= */ /* ========================================================= EXAM-GATE ENTERPRISE --------------------------------------------------------- File: config/core.php Version: 3.0.0 Description: Core Library - Security Engine Compatible: JSON Edition Author: Zamex Link Limited ========================================================= */ /* ========================================================= SECURITY ENGINE ========================================================= */ /* --------------------------------------------------------- ESCAPE HTML --------------------------------------------------------- */ function e($value) { return htmlspecialchars( (string)$value, ENT_QUOTES, "UTF-8" ); } /* --------------------------------------------------------- CSRF TOKEN --------------------------------------------------------- */ function generateCSRFToken() { if (empty($_SESSION["csrf_token"])) { $_SESSION["csrf_token"] = bin2hex(random_bytes(32)); } return $_SESSION["csrf_token"]; } function getCSRFToken() { return generateCSRFToken(); } function verifyCSRFToken($token) { if (!isset($_SESSION["csrf_token"])) { return false; } return hash_equals( $_SESSION["csrf_token"], $token ); } /* --------------------------------------------------------- REQUEST TYPE --------------------------------------------------------- */ function isPost() { return $_SERVER["REQUEST_METHOD"] === "POST"; } function isGet() { return $_SERVER["REQUEST_METHOD"] === "GET"; } /* --------------------------------------------------------- AJAX REQUEST --------------------------------------------------------- */ function isAjax() { return isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower( $_SERVER["HTTP_X_REQUESTED_WITH"] ) === "xmlhttprequest"; } /* --------------------------------------------------------- CLIENT IP --------------------------------------------------------- */ function clientIP() { if (!empty($_SERVER["HTTP_CLIENT_IP"])) { return $_SERVER["HTTP_CLIENT_IP"]; } if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) { return trim( explode( ",", $_SERVER["HTTP_X_FORWARDED_FOR"] )[0] ); } return $_SERVER["REMOTE_ADDR"] ?? ""; } /* --------------------------------------------------------- BROWSER INFORMATION --------------------------------------------------------- */ function browserInfo() { return $_SERVER["HTTP_USER_AGENT"] ?? ""; } /* --------------------------------------------------------- DEVICE INFORMATION --------------------------------------------------------- */ function deviceInformation() { return [ "device_type" => getDeviceType(), "device_model" => getDeviceModel(), "browser" => browserInfo(), "ip_address" => clientIP() ]; } /* ========================================================= SESSION ENGINE ========================================================= */ function loginUser($username) { $_SESSION["logged_in"] = true; $_SESSION["username"] = $username; $_SESSION["login_time"] = time(); $_SESSION["session_token"] = generate_session_token(); } function logoutUser() { $_SESSION = []; if (session_status() === PHP_SESSION_ACTIVE) { session_destroy(); } } function currentUser() { return $_SESSION["username"] ?? ""; } /* ========================================================= END OF PART 6 ========================================================= */ /* ========================================================= EXAM-GATE ENTERPRISE --------------------------------------------------------- File: config/core.php Version: 3.0.0 Description: Core Library - Response Engine & Framework Initialization Compatible: JSON Edition Author: Zamex Link Limited ========================================================= */ /* ========================================================= RESPONSE ENGINE ========================================================= */ function jsonResponse(array $data, int $statusCode = 200) { http_response_code($statusCode); header("Content-Type: application/json; charset=UTF-8"); echo json_encode( $data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE ); exit; } function successResponse($message, array $extra = []) { jsonResponse(array_merge([ "success" => true, "message" => $message ], $extra)); } function errorResponse($message, int $statusCode = 400) { jsonResponse([ "success" => false, "message" => $message ], $statusCode); } /* ========================================================= FRAMEWORK INFORMATION ========================================================= */ function appName() { return APP_NAME; } function appVersion() { return APP_VERSION; } function systemTimezone() { return date_default_timezone_get(); } /* ========================================================= SYSTEM HEALTH CHECK ========================================================= */ function systemHealth(): array { return [ "application" => APP_NAME, "version" => APP_VERSION, "php_version" => PHP_VERSION, "timezone" => date_default_timezone_get(), "json_extension" => extension_loaded("json"), "session_status" => session_status(), "data_directory" => is_dir(DATA_PATH), "exam_directory" => is_dir(EXAMS_PATH), "answer_directory" => is_dir(ANSWERS_PATH), "backup_directory" => is_dir(BACKUP_PATH), "log_directory" => is_dir(LOG_PATH) ]; } /* ========================================================= ERROR HANDLER ========================================================= */ set_error_handler(function( $severity, $message, $file, $line ) { writeErrorLog( $message, [ "file" => $file, "line" => $line, "severity" => $severity ] ); return false; }); /* ========================================================= SHUTDOWN HANDLER ========================================================= */ register_shutdown_function(function() { $error = error_get_last(); if( $error && in_array( $error["type"], [ E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR ] ) ) { writeErrorLog( $error["message"], [ "file" => $error["file"], "line" => $error["line"] ] ); } }); /* ========================================================= FRAMEWORK INITIALIZATION ========================================================= */ ensure_directory(DATA_PATH); ensure_directory(EXAMS_PATH); ensure_directory(ANSWERS_PATH); ensure_directory(BACKUP_PATH); ensure_directory(TEMP_PATH); ensure_directory(LOG_PATH); if (!file_exists(SYSTEM_LOG)) { write_json(SYSTEM_LOG, []); } if (defined("AUDIT_LOG") && !file_exists(AUDIT_LOG)) { write_json(AUDIT_LOG, []); } if (defined("ERROR_LOG") && !file_exists(ERROR_LOG)) { write_json(ERROR_LOG, []); } /* ========================================================= END OF FILE ========================================================= */