Files
ponlork_1st/data_user/process_request_permission.php
2026-01-29 14:31:48 +07:00

148 lines
5.5 KiB
PHP

<?php
// data_user/process_request_permission.php
// This script handles the submission of data access permission requests.
// Enable detailed error reporting for debugging purposes
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Start a session if one is not already active
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Check if the request method is POST. If not, redirect to prevent direct access.
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
// Redirect to the home page or an error page
header('Location: ../index.php');
exit;
}
// Use __DIR__ to get the absolute path to this file's directory,
// ensuring the path to the required files is always correct.
require_once(__DIR__ . '/../config.php');
require_once(__DIR__ . '/../includes/auth.php'); // Not strictly needed, but good practice
require_once(__DIR__ . '/../classes/Permission.php');
require_once(__DIR__ . '/../classes/User.php');
/**
* Handles the upload of a proof document.
*
* @param array|null $file The uploaded file array from $_FILES.
* @param int $personId The requesting user's person ID to help namespace the file.
* @return string Relative path (within uploads) to the stored file.
*/
function handle_proof_upload(?array $file, int $personId): string {
if ($file === null || ($file['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
set_and_redirect('Please upload a PDF proof document for your request.', 'danger');
}
if ($file['error'] !== UPLOAD_ERR_OK) {
set_and_redirect('There was a problem uploading your proof document. Please try again.', 'danger');
}
$maxSize = 10 * 1024 * 1024; // 10 MB
if (($file['size'] ?? 0) > $maxSize) {
set_and_redirect('Proof files must be smaller than 10 MB.', 'danger');
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($file['tmp_name']) ?: '';
if ($mimeType !== 'application/pdf') {
set_and_redirect('Only PDF files are accepted as proof.', 'danger');
}
$uploadDir = __DIR__ . '/../uploads/permission_proofs';
if (!is_dir($uploadDir) && !mkdir($uploadDir, 0775, true)) {
set_and_redirect('Unable to create the proof upload directory. Contact an administrator.', 'danger');
}
if (!is_writable($uploadDir)) {
set_and_redirect('The proof upload directory is not writable. Contact an administrator.', 'danger');
}
$random = bin2hex(random_bytes(8));
$filename = sprintf('%d_%s.pdf', $personId, $random);
$destination = $uploadDir . '/' . $filename;
if (!move_uploaded_file($file['tmp_name'], $destination)) {
set_and_redirect('Failed to store your proof document. Please try again.', 'danger');
}
return 'permission_proofs/' . $filename;
}
// A helper function to set a session message and redirect
function set_and_redirect($message, $type, $page = 'browse_datasources.php') {
$_SESSION['message'] = $message;
$_SESSION['message_type'] = $type;
// Check if headers have already been sent.
// This is the most common reason for redirects to fail.
if (headers_sent()) {
echo "<div class='alert alert-danger'>Redirect failed. Headers already sent. Please go back to <a href='$page'>the previous page</a> to view the message.</div>";
echo "Message: " . htmlspecialchars($message);
exit;
} else {
header('Location: ' . $page);
exit;
}
}
// 1. Check if the user is logged in
if (!isset($_SESSION['person_id']) || !isset($_SESSION['user_id'])) {
set_and_redirect('You must be logged in to request permission.', 'danger');
}
$user_id = $_SESSION['user_id'];
$person_id = $_SESSION['person_id'];
// 2. Validate and sanitize POST data
$dataSourceId = filter_input(INPUT_POST, 'data_source_id', FILTER_VALIDATE_INT);
// Replace deprecated FILTER_SANITIZE_STRING
$permissionType = trim(filter_input(INPUT_POST, 'permission_type', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW));
$notes = trim(filter_input(INPUT_POST, 'notes', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW));
// Check if required fields are missing or invalid
if (!$dataSourceId || empty($permissionType) || empty($notes)) {
set_and_redirect('Invalid or missing request details. Please try again.', 'danger');
}
$proofPath = handle_proof_upload($_FILES['proof_file'] ?? null, $person_id);
// 3. Instantiate the Permission class and process the request
try {
$permissionManager = new Permission($pdo);
// Check if a similar request (for the same user, DS, and type) already exists.
$existingRequest = $permissionManager->getPendingRequest($person_id, $dataSourceId, $permissionType);
if ($existingRequest) {
set_and_redirect('A request for this permission type is already pending.', 'warning');
}
// Attempt to add the new permission request to the database.
$success = $permissionManager->addPermissionRequest(
$person_id,
$dataSourceId,
$permissionType,
'Pending', // Set status to Pending
$notes,
$proofPath
);
if ($success) {
set_and_redirect('Your request for ' . htmlspecialchars($permissionType) . ' access has been submitted successfully.', 'success');
} else {
set_and_redirect('Failed to submit your request. Please try again later.', 'danger');
}
} catch (Exception $e) {
// Log the detailed error for debugging, but show a generic message to the user.
error_log("Error submitting permission request: " . $e->getMessage());
set_and_redirect('An unexpected error occurred. Please try again.', 'danger');
}
?>