|
1 | 1 | <?php |
2 | 2 |
|
3 | | -require_once '../../lib/boot.php'; |
| 3 | +require_once __DIR__ . '/../admin_boot.php'; |
4 | 4 |
|
5 | 5 | use Photobooth\FileUploader; |
6 | 6 | use Photobooth\Service\ApplicationService; |
7 | 7 | use Photobooth\Service\LanguageService; |
8 | 8 | use Photobooth\Utility\PathUtility; |
9 | 9 | use Photobooth\Service\LoggerService; |
10 | 10 |
|
11 | | -// Login / Authentication check |
12 | | -if (!( |
13 | | - !$config['login']['enabled'] || |
14 | | - (!$config['protect']['localhost_admin'] && isset($_SERVER['SERVER_ADDR']) && $_SERVER['REMOTE_ADDR'] === $_SERVER['SERVER_ADDR']) || |
15 | | - (isset($_SESSION['auth']) && $_SESSION['auth'] === true) || !$config['protect']['admin'] |
16 | | -)) { |
17 | | - header('location: ' . PathUtility::getPublicPath('login')); |
18 | | - exit(); |
| 11 | +// CSRF token helper |
| 12 | +if (!isset($_SESSION['csrf_token'])) { |
| 13 | + $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); |
19 | 14 | } |
| 15 | +$csrfToken = $_SESSION['csrf_token']; |
20 | 16 |
|
21 | 17 | $logger = LoggerService::getInstance()->getLogger('main'); |
22 | 18 | $logger->debug(basename($_SERVER['PHP_SELF'])); |
|
36 | 32 | $max_file_size = ini_get('upload_max_filesize'); |
37 | 33 |
|
38 | 34 | if (isset($_POST['submit'])) { |
| 35 | + if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { |
| 36 | + $errors['csrf'] = 'csrf'; |
| 37 | + } |
| 38 | + |
39 | 39 | $folderName = $_POST['folder_name']; |
40 | 40 | $uploadedFiles = $_FILES['files']; |
41 | 41 |
|
42 | | - $uploader = new FileUploader($folderName, $uploadedFiles, $logger); |
43 | | - $response = $uploader->uploadFiles(); |
44 | | - |
45 | | - list($success, $message, $errors, $uploadedFiles, $failedFiles) = [ |
46 | | - $response['success'], |
47 | | - $response['message'], |
48 | | - $response['errors'], |
49 | | - $response['uploadedFiles'], |
50 | | - $response['failedFiles'] |
51 | | - ]; |
| 42 | + if (!isset($errors['csrf'])) { |
| 43 | + $uploader = new FileUploader($folderName, $uploadedFiles, $logger); |
| 44 | + $response = $uploader->uploadFiles(); |
| 45 | + |
| 46 | + list($success, $message, $errors, $uploadedFiles, $failedFiles) = [ |
| 47 | + $response['success'], |
| 48 | + $response['message'], |
| 49 | + $response['errors'], |
| 50 | + $response['uploadedFiles'], |
| 51 | + $response['failedFiles'] |
| 52 | + ]; |
| 53 | + } |
52 | 54 | } |
53 | 55 | ?> |
54 | 56 |
|
55 | 57 | <div class="w-full h-screen grid place-items-center absolute bg-brand-2 px-6 py-12 overflow-x-hidden overflow-y-auto"> |
56 | 58 | <div class="w-full flex items-center justify-center flex-col"> |
57 | 59 | <div class="w-full max-w-xl rounded-lg p-8 bg-white flex flex-col shadow-xl"> |
58 | 60 | <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" enctype="multipart/form-data"> |
| 61 | + <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrfToken); ?>"> |
59 | 62 | <div class="w-full flex flex-col items-center justify-center text-2xl font-bold text-brand-1 mb-2"> |
60 | 63 | File uploader |
61 | 64 | </div> |
|
76 | 79 | <label class="<?= $labelClass ?>" for="files"><?=$languageService->translate('upload_selection')?></label> |
77 | 80 | <input class="<?= $labelClass ?>" type="file" name="files[]" id="files" multiple accept="image/*, video/*, .ttf" required> |
78 | 81 | <div class="my-2"><?= $languageService->translate('file_upload_max_size') ?> <?= $max_file_size ?></div> |
| 82 | + <?php |
| 83 | + if (isset($errors['csrf'])) { |
| 84 | + echo '<div class="flex flex-col justify-between p-2 rounded-sm bg-red-300 text-red-800 border-2 border-red-800">' . $languageService->translate('invalid_session') . '</div>'; |
| 85 | + } |
| 86 | +?> |
79 | 87 | </div> |
80 | 88 |
|
81 | 89 | <?php |
82 | | - if (count($failedFiles) > 0) { |
83 | | - echo '<div class="flex flex-col gap-2">'; |
84 | | - foreach ($failedFiles as $fileName => $reason) { |
85 | | - echo '<div class="flex flex-col justify-between p-2 rounded-sm bg-red-300 text-red-800 border-2 border-red-800"><div class="col-span-1">' . $fileName . '</div><div class="col-span-1">' . $languageService->translate($reason) . '</div></div>'; |
86 | | - } |
87 | | - echo '</div>'; |
88 | | - } |
| 90 | +if (count($failedFiles) > 0) { |
| 91 | + echo '<div class="flex flex-col gap-2">'; |
| 92 | + foreach ($failedFiles as $fileName => $reason) { |
| 93 | + echo '<div class="flex flex-col justify-between p-2 rounded-sm bg-red-300 text-red-800 border-2 border-red-800"><div class="col-span-1">' . $fileName . '</div><div class="col-span-1">' . $languageService->translate($reason) . '</div></div>'; |
| 94 | + } |
| 95 | + echo '</div>'; |
| 96 | +} |
89 | 97 | ?> |
90 | 98 |
|
91 | 99 | <div class="mt-6"> |
|
0 commit comments