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}';