From 8c75b0f9f62c3dc294f9771277f1ebf33e511f93 Mon Sep 17 00:00:00 2001 From: Repellent Date: Thu, 8 Jan 2026 20:43:07 +0500 Subject: [PATCH] =?UTF-8?q?++++++=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/comment.php | 24 ++++++++- js/comment.js | 99 +++++++++++++++++++++++++++++-------- templates/comments_tree.tpl | 1 + 3 files changed, 103 insertions(+), 21 deletions(-) diff --git a/class/comment.php b/class/comment.php index ad551e2..a652a7e 100644 --- a/class/comment.php +++ b/class/comment.php @@ -744,7 +744,9 @@ function commentPostEdit($comment_id) cmnt.comment_edit_time, cmnt.comment_allowed_extensions, cmnt.comment_max_file_size, - cmnt.comment_max_files + cmnt.comment_max_files, + cmnt.comment_allow_files, + cmnt.comment_allow_files_anon FROM " . PREFIX . "_module_comment_info AS msg JOIN " . PREFIX . "_module_comments AS cmnt ON cmnt.Id = 1 WHERE msg.Id = '" . $comment_id . "' @@ -787,6 +789,26 @@ function commentPostEdit($comment_id) // 5. Работа с изображениями (МУЛЬТИЗАГРУЗКА И УДАЛЕНИЕ) + + // ПРОВЕРКА ПРАВ НА ЗАГРУЗКУ (Защита от взлома через POST) +$allow_files = (int)($row['comment_allow_files'] ?? 0); +$allow_anon = (int)($row['comment_allow_files_anon'] ?? 0); + +// Определяем, имеет ли право текущий пользователь загружать файлы +$can_upload = false; +if ($allow_files === 1) { + if ($user_group == 2) { // Если гость + if ($allow_anon === 1) $can_upload = true; + } else { // Если зарегистрирован + $can_upload = true; + } +} + +// Если файлы пытаются загрузить, но прав нет — просто очищаем массив файлов +if (!$can_upload && isset($_FILES['comment_image'])) { + unset($_FILES['comment_image']); +} + $upload_dir = BASE_DIR . '/uploads/comments/'; // Получаем текущие файлы из БД в массив $current_files = !empty($row['comment_file']) ? explode(',', $row['comment_file']) : []; diff --git a/js/comment.js b/js/comment.js index 3f92c44..2299354 100644 --- a/js/comment.js +++ b/js/comment.js @@ -586,19 +586,43 @@ if ($foundItems.length > 0) { } // --- СБОРКА ФОРМЫ --- + + // --- ПРОВЕРКА ПРАВ НА ЗАГРУЗКУ --- + var canUploadFiles = false; + if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') { + if (typeof UGROUP !== 'undefined' && UGROUP == '2') { + if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFiles = true; + } else { + canUploadFiles = true; + } + } + + var uploadBlockHtml = ''; +if (canUploadFiles) { + uploadBlockHtml = ` +
+ + + +
+ ${ALLOWED_EXTENSIONS.replace(/,/g, ', ')} | до ${MAX_FILE_SIZE_KB} KB +
+
`; + } + + var editHtml = `
${starsEditBlock} -

${COMMENT_JS_LOADED_FILES}

- ${existingImagesHtml} + ${existingImagesHtml !== '' ? ` +

${COMMENT_JS_LOADED_FILES}

+ ${existingImagesHtml} + ` : ''} + + ${uploadBlockHtml} -
- - - -
@@ -624,6 +648,9 @@ $wrapper.find('.mod_comment_attached_images, .comment-files').hide(); $wrapper.find('.edit-form-container').data('pendingFiles', pendingFiles); + +// Проверяем права, прежде чем вешать обработчик +if (canUploadFiles) { $('#new_file_' + cid).on('change', function() { var files = this.files; var $input = $(this); @@ -678,6 +705,8 @@ $('#new_file_' + cid).on('change', function() { }); } }); +} + // Обработчик удаления НОВОГО файла из превью (до сохранения) $doc.off('click', '.remove-new-file').on('click', '.remove-new-file', function() { @@ -789,12 +818,24 @@ $doc.on('click', '.cancelButton', function() { $container.remove(); }); -$doc.on('click', '.saveButton', function() { + // Кнопка сохранить редактирование + +$doc.off('click', '.saveButton').on('click', '.saveButton', function() { var $btn = $(this); var cid = $btn.data('id'); var $container = $btn.closest('.edit-form-container'); - // Достаем накопительный массив файлов + // 1. Повторно определяем права внутри кнопки (чтобы избежать undefined) + var canUploadFilesLocal = false; + if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') { + if (typeof UGROUP !== 'undefined' && UGROUP == '2') { + if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFilesLocal = true; + } else { + canUploadFilesLocal = true; + } + } + + // 2. Достаем накопительный массив файлов var pendingFiles = $container.data('pendingFiles') || []; var fd = new FormData(); @@ -808,13 +849,14 @@ $doc.on('click', '.saveButton', function() { fd.append('delete_files', $('#delete_files_' + cid).val()); - // --- берем файлы из массива --- - pendingFiles.forEach(function(file) { - if (file !== null) { // Проверяем, что файл не был удален крестиком - fd.append('comment_image[]', file); - } - }); - // ------------------------------------ + // 3. Добавляем файлы из массива (используем локальную проверку прав) + if (canUploadFilesLocal && pendingFiles.length > 0) { + pendingFiles.forEach(function(file) { + if (file !== null) { + fd.append('comment_image[]', file); + } + }); + } $.ajax({ url: aveabspath + 'index.php?ajax=1', @@ -827,14 +869,31 @@ $doc.on('click', '.saveButton', function() { xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var pct = Math.round((evt.loaded / evt.total) * 100); - $('#edit_progress_container_' + cid).removeClass('d-none'); - $('#edit_progress_bar_' + cid).css('width', pct + '%'); + // Проверяем наличие контейнера прогресса, если его нет в HTML — создаем или пропускаем + var $pBar = $('#edit_progress_bar_' + cid); + if ($pBar.length) { + $('#edit_progress_container_' + cid).removeClass('d-none'); + $pBar.css('width', pct + '%'); + } } }, false); return xhr; }, - beforeSend: function() { $btn.prop('disabled', true).text('...'); }, - success: function() { location.reload(); } + beforeSend: function() { + $btn.prop('disabled', true).text('...'); + }, + success: function(response) { + // Если PHP вернул ошибку лимита, выведем её вместо перезагрузки + if (response === 'MAX_FILES_LIMIT_EXCEEDED') { + alert('Превышен лимит количества файлов!'); + $btn.prop('disabled', false).text('Сохранить'); + } else { + location.reload(); + } + }, + error: function() { + $btn.prop('disabled', false).text('Ошибка'); + } }); }); diff --git a/templates/comments_tree.tpl b/templates/comments_tree.tpl index 4475599..b1cde6c 100644 --- a/templates/comments_tree.tpl +++ b/templates/comments_tree.tpl @@ -320,6 +320,7 @@ var ALLOWED_EXTENSIONS = '{$comment_allowed_extensions|default:"jpg,jpeg,png,gif,webp"}'; var MAX_FILE_SIZE_KB = '{$comment_max_file_size|default:2048}'; var MAX_FILES_COUNT = '{$comment_max_files|default:5}'; + var ALLOW_FILES = '{$comment_allow_files|default:0}';