From d6b6769f056d4d6fe2580664a75eb919783f192a Mon Sep 17 00:00:00 2001 From: Alexander Moisseev Date: Mon, 27 Jul 2026 16:31:11 +0300 Subject: [PATCH] [Feature] WebUI: read-only access to selectors tab Open list_extractors, list_transforms and check_selector to read-only users (enable = false, matching maps.lua). These only return static catalogs or parse the selector without executing it. check_message stays privileged (enable = true): it runs a user-supplied selector against a user-supplied message, so it remains denied to read-only users (HTTP 401) --- interface/index.html | 11 ++++++----- interface/js/app/rspamd.js | 2 ++ interface/js/app/selectors.js | 5 ++--- rules/controller/selectors.lua | 6 +++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/interface/index.html b/interface/index.html index 01943e410d..6e0ad19d01 100644 --- a/interface/index.html +++ b/interface/index.html @@ -48,7 +48,7 @@ - + @@ -619,7 +619,8 @@
Test Rspamd selectors -
+ Read-only +
@@ -647,7 +648,7 @@
-
+
@@ -662,11 +663,11 @@
- +
-
+
diff --git a/interface/js/app/rspamd.js b/interface/js/app/rspamd.js index 698bc96c92..7c2fadc9e2 100644 --- a/interface/js/app/rspamd.js +++ b/interface/js/app/rspamd.js @@ -279,8 +279,10 @@ define(["app/common", "app/icons", "bootstrap", document.querySelectorAll(".ro-disable").forEach((el) => { el.disabled = common.read_only; }); if (common.read_only) { common.hide(".ro-hide"); + common.show(".ro-show"); } else { common.show(".ro-hide"); + common.hide(".ro-show"); } document.getElementById("preloader").classList.add("d-none"); diff --git a/interface/js/app/selectors.js b/interface/js/app/selectors.js index d16c75eee3..ba6a59fa80 100644 --- a/interface/js/app/selectors.js +++ b/interface/js/app/selectors.js @@ -38,7 +38,7 @@ define(["app/common"], enable_disable_check_btn(); } const selector = selArea.value; - if (selector.length && !common.read_only) { + if (selector.length) { common.query("plugins/selectors/check_selector?selector=" + encodeURIComponent(selector), { method: "GET", success: function (json) { @@ -83,8 +83,7 @@ define(["app/common"], } ui.displayUI = function () { - if (!common.read_only && - !document.querySelector("#selectorsTable-extractors>tbody>tr") && + if (!document.querySelector("#selectorsTable-extractors>tbody>tr") && !document.querySelector("#selectorsTable-transforms>tbody>tr")) buildLists(); if (!document.getElementById("selectorsSelArea").matches(".is-valid, .is-invalid")) checkSelectors(); }; diff --git a/rules/controller/selectors.lua b/rules/controller/selectors.lua index 7fc2894d7a..8046436ca1 100644 --- a/rules/controller/selectors.lua +++ b/rules/controller/selectors.lua @@ -55,15 +55,15 @@ end return { list_extractors = { handler = handle_list_extractors, - enable = true, + enable = false, }, list_transforms = { handler = handle_list_transforms, - enable = true, + enable = false, }, check_selector = { handler = handle_check_selector, - enable = true, + enable = false, }, check_message = { handler = handle_check_message, -- 2.47.3