aboutsummaryrefslogtreecommitdiffstats
path: root/interface/js
diff options
context:
space:
mode:
authormoisseev <moiseev@mezonplus.ru>2024-03-01 17:33:07 +0300
committermoisseev <moiseev@mezonplus.ru>2024-03-01 17:33:07 +0300
commit62b136a336e589efadc513418641ff526f5bb996 (patch)
treef292c226400a42a669ca6d72a494a70bdc16e1f6 /interface/js
parent642ca8c3a410d0fcd53d756534c22ea4c3b9013e (diff)
downloadrspamd-62b136a336e589efadc513418641ff526f5bb996.tar.gz
rspamd-62b136a336e589efadc513418641ff526f5bb996.zip
[WebUI] Add file input and drop area to scan tab
Diffstat (limited to 'interface/js')
-rw-r--r--interface/js/app/libft.js7
-rw-r--r--interface/js/app/upload.js95
2 files changed, 86 insertions, 16 deletions
diff --git a/interface/js/app/libft.js b/interface/js/app/libft.js
index 1e9cbf9a1..b8febbc1c 100644
--- a/interface/js/app/libft.js
+++ b/interface/js/app/libft.js
@@ -63,6 +63,11 @@ define(["jquery", "app/common", "footable"],
whiteSpace: "normal"
}
}, {
+ name: "file",
+ title: "File name",
+ breakpoints: "xs",
+ sortValue: (val) => ((typeof val === "undefined") ? "" : val)
+ }, {
name: "ip",
title: "IP address",
breakpoints: "xs sm md",
@@ -171,7 +176,7 @@ define(["jquery", "app/common", "footable"],
}].filter((col) => {
switch (table) {
case "history":
- return true;
+ return (col.name !== "file");
case "scan":
return ["ip", "sender_mime", "rcpt_mime_short", "rcpt_mime", "subject", "size", "user"]
.every((name) => col.name !== name);
diff --git a/interface/js/app/upload.js b/interface/js/app/upload.js
index a27dc8a88..c464ef30f 100644
--- a/interface/js/app/upload.js
+++ b/interface/js/app/upload.js
@@ -28,6 +28,9 @@ define(["jquery", "app/common", "app/libft"],
($, common, libft) => {
"use strict";
const ui = {};
+ let files = null;
+ let filesIdx = null;
+ let scanTextHeaders = {};
function cleanTextUpload(source) {
$("#" + source + "TextSource").val("");
@@ -77,7 +80,19 @@ define(["jquery", "app/common", "app/libft"],
.prop("disabled", (disable || $.trim($("textarea").val()).length === 0));
}
- function scanText(data, headers) {
+ function setFileInputFiles(i) {
+ const dt = new DataTransfer();
+ if (arguments.length) dt.items.add(files[i]);
+ $("#formFile").prop("files", dt.files);
+ }
+
+ function readFile(callback, i) {
+ const reader = new FileReader();
+ reader.readAsText(files[(arguments.length === 1) ? 0 : i]);
+ reader.onload = () => callback(reader.result);
+ }
+
+ function scanText(data) {
enable_disable_scan_btn(true);
common.query("checkv2", {
data: data,
@@ -85,7 +100,7 @@ define(["jquery", "app/common", "app/libft"],
processData: false,
},
method: "POST",
- headers: headers,
+ headers: scanTextHeaders,
success: function (neighbours_status) {
const json = neighbours_status[0].data;
if (json.action) {
@@ -95,17 +110,29 @@ define(["jquery", "app/common", "app/libft"],
const {items} = o;
common.symbols.scan.push(o.symbols[0]);
+ if (files) items[0].file = files[filesIdx].name;
+
if (Object.prototype.hasOwnProperty.call(common.tables, "scan")) {
common.tables.scan.rows.load(items, true);
} else {
require(["footable"], () => {
libft.initHistoryTable(data, items, "scan", libft.columns_v2("scan"), true,
() => {
- enable_disable_scan_btn();
- $("#cleanScanHistory").removeAttr("disabled");
- $("html, body").animate({
- scrollTop: $("#scanResult").offset().top
- }, 1000);
+ if (files && filesIdx < files.length - 1) {
+ readFile((result) => {
+ if (filesIdx === files.length - 1) {
+ $("#scanMsgSource").val(result);
+ setFileInputFiles(filesIdx);
+ }
+ scanText(result);
+ }, ++filesIdx);
+ } else {
+ enable_disable_scan_btn();
+ $("#cleanScanHistory").removeAttr("disabled");
+ $("html, body").animate({
+ scrollTop: $("#scanResult").offset().top
+ }, 1000);
+ }
});
});
}
@@ -180,6 +207,10 @@ define(["jquery", "app/common", "app/libft"],
enable_disable_scan_btn();
$("textarea").on("input", () => {
enable_disable_scan_btn();
+ if (files) {
+ files = null;
+ setFileInputFiles();
+ }
});
$("#scanClean").on("click", () => {
@@ -193,22 +224,26 @@ define(["jquery", "app/common", "app/libft"],
$(this).closest(".card").slideUp();
});
+ function getScanTextHeaders() {
+ scanTextHeaders = ["IP", "User", "From", "Rcpt", "Helo", "Hostname"].reduce((o, header) => {
+ const value = $("#scan-opt-" + header.toLowerCase()).val();
+ if (value !== "") o[header] = value;
+ return o;
+ }, {});
+ if ($("#scan-opt-pass-all").prop("checked")) scanTextHeaders.Pass = "all";
+ }
+
$("[data-upload]").on("click", function () {
const source = $(this).data("upload");
const data = $("#scanMsgSource").val();
- let headers = {};
if ($.trim(data).length > 0) {
if (source === "scan") {
- headers = ["IP", "User", "From", "Rcpt", "Helo", "Hostname"].reduce((o, header) => {
- const value = $("#scan-opt-" + header.toLowerCase()).val();
- if (value !== "") o[header] = value;
- return o;
- }, {});
- if ($("#scan-opt-pass-all").prop("checked")) headers.Pass = "all";
- scanText(data, headers);
+ getScanTextHeaders();
+ scanText(data);
} else if (source === "compute-fuzzy") {
getFuzzyHashes(data);
} else {
+ let headers = {};
if (source === "fuzzy") {
headers = {
flag: $("#fuzzyFlagText").val(),
@@ -223,5 +258,35 @@ define(["jquery", "app/common", "app/libft"],
return false;
});
+ const dragoverClassList = "outline-dashed-primary bg-primary-subtle";
+ $("#scanMsgSource")
+ .on("dragenter dragover dragleave drop", (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ })
+ .on("dragenter dragover", () => {
+ $("#scanMsgSource").addClass(dragoverClassList);
+ })
+ .on("dragleave drop", () => {
+ $("#scanMsgSource").removeClass(dragoverClassList);
+ })
+ .on("drop", (e) => {
+ ({files} = e.originalEvent.dataTransfer);
+ filesIdx = 0;
+
+ if (files.length === 1) {
+ setFileInputFiles(0);
+ enable_disable_scan_btn();
+ readFile((result) => {
+ $("#scanMsgSource").val(result);
+ enable_disable_scan_btn();
+ });
+ // eslint-disable-next-line no-alert
+ } else if (files.length < 10 || confirm("Are you sure you want to scan " + files.length + " files?")) {
+ getScanTextHeaders();
+ readFile((result) => scanText(result));
+ }
+ });
+
return ui;
});