()
| 3827 | } |
| 3828 | |
| 3829 | public function snippet(): void |
| 3830 | { |
| 3831 | header('Content-Type: application/json; charset=utf-8'); |
| 3832 | if (!$this->requireAuth()) { |
| 3833 | return; |
| 3834 | } |
| 3835 | |
| 3836 | $storage = StorageRegistry::getAdapter(); |
| 3837 | |
| 3838 | // Session -> snapshot user + perms -> release lock |
| 3839 | if (session_status() !== PHP_SESSION_ACTIVE) { |
| 3840 | @session_start(); |
| 3841 | } |
| 3842 | |
| 3843 | $user = (string)($_SESSION['username'] ?? ''); |
| 3844 | $perms = loadUserPermissions($user) ?: []; |
| 3845 | $perms['role'] = $_SESSION['role'] ?? ($perms['role'] ?? null); |
| 3846 | $perms['admin'] = $_SESSION['admin'] ?? ($perms['admin'] ?? null); |
| 3847 | $perms['isAdmin'] = $_SESSION['isAdmin'] ?? ($perms['isAdmin'] ?? null); |
| 3848 | |
| 3849 | @session_write_close(); |
| 3850 | |
| 3851 | // ---- Input ---- |
| 3852 | $folder = isset($_GET['folder']) ? (string)$_GET['folder'] : 'root'; |
| 3853 | $folder = str_replace('\\', '/', trim($folder)); |
| 3854 | $folder = ($folder === '' || $folder === 'root') ? 'root' : trim($folder, '/'); |
| 3855 | |
| 3856 | $file = isset($_GET['file']) ? (string)$_GET['file'] : ''; |
| 3857 | $file = trim($file); |
| 3858 | |
| 3859 | if ($file === '') { |
| 3860 | http_response_code(400); |
| 3861 | echo json_encode(['error' => 'Missing file parameter.']); |
| 3862 | return; |
| 3863 | } |
| 3864 | |
| 3865 | // ---- ACL ---- |
| 3866 | if (class_exists('ACL')) { |
| 3867 | $folderNorm = ACL::normalizeFolder($folder); |
| 3868 | $accessErr = $this->enforceSingleFileReadAccess($folderNorm, $file, $user, $perms); |
| 3869 | if ($accessErr !== null) { |
| 3870 | http_response_code(403); |
| 3871 | echo json_encode(['error' => $accessErr]); |
| 3872 | return; |
| 3873 | } |
| 3874 | $folder = $folderNorm; |
| 3875 | } |
| 3876 | |
| 3877 | // ---- Resolve file via model ---- |
| 3878 | try { |
| 3879 | $info = FileModel::getDownloadInfo($folder, $file); |
| 3880 | } catch (\Throwable $e) { |
| 3881 | http_response_code(500); |
| 3882 | echo json_encode(['error' => 'Internal error.']); |
| 3883 | return; |
| 3884 | } |
| 3885 | |
| 3886 | if (!is_array($info) || !empty($info['error'] ?? null)) { |
no test coverage detected