@@ -41,7 +41,6 @@ | |||
"no-negated-condition": "off", | |||
"no-plusplus": "off", | |||
"no-ternary": "off", | |||
"no-var": "off", | |||
"object-curly-newline": ["error", { "consistent": true }], | |||
"object-property-newline": ["error", { "allowAllPropertiesOnSameLine": true }], | |||
"object-shorthand": "off", |
@@ -27,16 +27,16 @@ | |||
define(["jquery", "app/rspamd"], | |||
function ($, rspamd) { | |||
"use strict"; | |||
var ui = {}; | |||
const ui = {}; | |||
ui.getActions = function getActions(checked_server) { | |||
rspamd.query("actions", { | |||
success: function (data) { | |||
$("#actionsFormField").empty(); | |||
var items = []; | |||
const items = []; | |||
$.each(data[0].data, function (i, item) { | |||
var actionsOrder = ["greylist", "add header", "rewrite subject", "reject"]; | |||
var idx = actionsOrder.indexOf(item.action); | |||
const actionsOrder = ["greylist", "add header", "rewrite subject", "reject"]; | |||
const idx = actionsOrder.indexOf(item.action); | |||
if (idx >= 0) { | |||
items.push({ | |||
idx: idx, | |||
@@ -67,11 +67,11 @@ define(["jquery", "app/rspamd"], | |||
ui.saveActions = function (server) { | |||
function descending(arr) { | |||
var desc = true; | |||
var filtered = arr.filter(function (el) { | |||
let desc = true; | |||
const filtered = arr.filter(function (el) { | |||
return el !== null; | |||
}); | |||
for (var i = 0; i < filtered.length - 1; i++) { | |||
for (let i = 0; i < filtered.length - 1; i++) { | |||
if (filtered[i + 1] >= filtered[i]) { | |||
desc = false; | |||
break; | |||
@@ -80,9 +80,9 @@ define(["jquery", "app/rspamd"], | |||
return desc; | |||
} | |||
var elts = (function () { | |||
var values = []; | |||
var inputs = $("#actionsForm :input[data-id=\"action\"]"); | |||
const elts = (function () { | |||
const values = []; | |||
const inputs = $("#actionsForm :input[data-id=\"action\"]"); | |||
// Rspamd order: [spam, rewrite_subject, probable_spam, greylist] | |||
values[0] = parseFloat(inputs[3].value); | |||
values[1] = parseFloat(inputs[2].value); | |||
@@ -92,7 +92,7 @@ define(["jquery", "app/rspamd"], | |||
return JSON.stringify(values); | |||
}()); | |||
// String to array for comparison | |||
var eltsArray = JSON.parse(elts); | |||
const eltsArray = JSON.parse(elts); | |||
if (eltsArray[0] < 0) { | |||
rspamd.alertMessage("alert-modal alert-error", "Spam can not be negative"); | |||
} else if (eltsArray[1] < 0) { | |||
@@ -116,23 +116,23 @@ define(["jquery", "app/rspamd"], | |||
}; | |||
ui.getMaps = function (checked_server) { | |||
var $listmaps = $("#listMaps"); | |||
const $listmaps = $("#listMaps"); | |||
$listmaps.closest(".card").hide(); | |||
rspamd.query("maps", { | |||
success: function (json) { | |||
var data = json[0].data; | |||
const data = json[0].data; | |||
$listmaps.empty(); | |||
$("#modalBody").empty(); | |||
var $tbody = $("<tbody>"); | |||
const $tbody = $("<tbody>"); | |||
$.each(data, function (i, item) { | |||
var $td = '<td><span class="badge text-bg-secondary">Read</span></td>'; | |||
let $td = '<td><span class="badge text-bg-secondary">Read</span></td>'; | |||
if (!(item.editable === false || rspamd.read_only)) { | |||
$td = $($td).append(' <span class="badge text-bg-success">Write</span>'); | |||
} | |||
var $tr = $("<tr>").append($td); | |||
const $tr = $("<tr>").append($td); | |||
var $span = $('<span class="map-link" data-bs-toggle="modal" data-bs-target="#modalDialog">' + item.uri + "</span>").data("item", item); | |||
const $span = $('<span class="map-link" data-bs-toggle="modal" data-bs-target="#modalDialog">' + item.uri + "</span>").data("item", item); | |||
$span.wrap("<td>").parent().appendTo($tr); | |||
$("<td>" + item.description + "</td>").appendTo($tr); | |||
$tr.appendTo($tbody); | |||
@@ -145,7 +145,7 @@ define(["jquery", "app/rspamd"], | |||
}; | |||
var jar = {}; | |||
let jar = {}; | |||
const editor = { | |||
advanced: { | |||
codejar: true, | |||
@@ -163,8 +163,8 @@ define(["jquery", "app/rspamd"], | |||
// Modal form for maps | |||
$(document).on("click", "[data-bs-toggle=\"modal\"]", function () { | |||
var checked_server = rspamd.getSelector("selSrv"); | |||
var item = $(this).data("item"); | |||
const checked_server = rspamd.getSelector("selSrv"); | |||
const item = $(this).data("item"); | |||
rspamd.query("getmap", { | |||
headers: { | |||
Map: item.map | |||
@@ -188,7 +188,7 @@ define(["jquery", "app/rspamd"], | |||
document.querySelector("#editor").innerHTML = rspamd.escapeHTML(data[0].data); | |||
} | |||
var icon = "fa-edit"; | |||
let icon = "fa-edit"; | |||
if (item.editable === false || rspamd.read_only) { | |||
$("#editor").attr(editor[mode].readonly_attr); | |||
icon = "fa-eye"; |
@@ -29,7 +29,7 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
function ($, rspamd, D3Evolution, D3Pie, d3) { | |||
"use strict"; | |||
var rrd_pie_config = { | |||
const rrd_pie_config = { | |||
cornerRadius: 2, | |||
size: { | |||
canvasWidth: 400, | |||
@@ -56,11 +56,11 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
}, | |||
}; | |||
var ui = {}; | |||
var prevUnit = "msg/s"; | |||
const ui = {}; | |||
let prevUnit = "msg/s"; | |||
ui.draw = function (graphs, neighbours, checked_server, type) { | |||
var graph_options = { | |||
const graph_options = { | |||
title: "Rspamd throughput", | |||
width: 1060, | |||
height: 370, | |||
@@ -73,7 +73,7 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
}; | |||
function initGraph() { | |||
var graph = new D3Evolution("graph", $.extend({}, graph_options, { | |||
const graph = new D3Evolution("graph", $.extend({}, graph_options, { | |||
yScale: rspamd.getSelector("selYScale"), | |||
type: rspamd.getSelector("selType"), | |||
interpolate: rspamd.getSelector("selInterpolate"), | |||
@@ -96,16 +96,16 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
} | |||
function getRrdSummary(json, scaleFactor) { | |||
var xExtents = d3.extent(d3.merge(json), function (d) { return d.x; }); | |||
var timeInterval = xExtents[1] - xExtents[0]; | |||
const xExtents = d3.extent(d3.merge(json), function (d) { return d.x; }); | |||
const timeInterval = xExtents[1] - xExtents[0]; | |||
var total = 0; | |||
var rows = json.map(function (curr, i) { | |||
let total = 0; | |||
const rows = json.map(function (curr, i) { | |||
// Time intervals that don't have data are excluded from average calculation as d3.mean()ignores nulls | |||
var avg = d3.mean(curr, function (d) { return d.y; }); | |||
const avg = d3.mean(curr, function (d) { return d.y; }); | |||
// To find an integral on the whole time interval we need to convert nulls to zeroes | |||
var value = d3.mean(curr, function (d) { return Number(d.y); }) * timeInterval / scaleFactor ^ 0; // eslint-disable-line no-bitwise | |||
var yExtents = d3.extent(curr, function (d) { return d.y; }); | |||
const value = d3.mean(curr, function (d) { return Number(d.y); }) * timeInterval / scaleFactor ^ 0; // eslint-disable-line no-bitwise | |||
const yExtents = d3.extent(curr, function (d) { return d.y; }); | |||
total += value; | |||
return { | |||
@@ -162,13 +162,13 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
} | |||
function updateWidgets(data) { | |||
var rrd_summary = {rows:[]}; | |||
var unit = "msg/s"; | |||
let rrd_summary = {rows:[]}; | |||
let unit = "msg/s"; | |||
if (data) { | |||
// Autoranging | |||
var scaleFactor = 1; | |||
var yMax = d3.max(d3.merge(data), function (d) { return d.y; }); | |||
let scaleFactor = 1; | |||
const yMax = d3.max(d3.merge(data), function (d) { return d.y; }); | |||
if (yMax < 1) { | |||
scaleFactor = 60; | |||
unit = "msg/min"; | |||
@@ -202,15 +202,15 @@ define(["jquery", "app/rspamd", "d3evolution", "d3pie", "d3", "footable"], | |||
rspamd.query("graph", { | |||
success: function (req_data) { | |||
var data = null; | |||
var neighbours_data = req_data | |||
let data = null; | |||
const neighbours_data = req_data | |||
.filter(function (d) { return d.status; }) // filter out unavailable neighbours | |||
.map(function (d) { return d.data; }); | |||
if (neighbours_data.length === 1) { | |||
data = neighbours_data[0]; | |||
} else { | |||
var time_match = true; | |||
let time_match = true; | |||
neighbours_data.reduce(function (res, curr, _, arr) { | |||
if ((curr[0][0].x !== res[0][0].x) || | |||
(curr[0][curr[0].length - 1].x !== res[0][res[0].length - 1].x)) { |
@@ -27,13 +27,13 @@ | |||
define(["jquery", "app/rspamd", "d3", "footable"], | |||
function ($, rspamd, d3) { | |||
"use strict"; | |||
var ui = {}; | |||
var prevVersion = null; | |||
const ui = {}; | |||
let prevVersion = null; | |||
function process_history_legacy(data) { | |||
var items = []; | |||
const items = []; | |||
var compare = function (e1, e2) { | |||
const compare = function (e1, e2) { | |||
return e1.name.localeCompare(e2.name); | |||
}; | |||
@@ -287,20 +287,20 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
}]; | |||
} | |||
var columns = { | |||
const columns = { | |||
2: columns_v2, | |||
legacy: columns_legacy | |||
}; | |||
function process_history_data(data) { | |||
var process_functions = { | |||
const process_functions = { | |||
2: rspamd.process_history_v2, | |||
legacy: process_history_legacy | |||
}; | |||
var pf = process_functions.legacy; | |||
let pf = process_functions.legacy; | |||
if (data.version) { | |||
var strkey = data.version.toString(); | |||
const strkey = data.version.toString(); | |||
if (process_functions[strkey]) { | |||
pf = process_functions[strkey]; | |||
} | |||
@@ -310,10 +310,10 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
} | |||
function get_history_columns(data) { | |||
var func = columns.legacy; | |||
let func = columns.legacy; | |||
if (data.version) { | |||
var strkey = data.version.toString(); | |||
const strkey = data.version.toString(); | |||
if (columns[strkey]) { | |||
func = columns[strkey]; | |||
} | |||
@@ -326,7 +326,7 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
rspamd.query("history", { | |||
success: function (req_data) { | |||
function differentVersions(neighbours_data) { | |||
var dv = neighbours_data.some(function (e) { | |||
const dv = neighbours_data.some(function (e) { | |||
return e.version !== neighbours_data[0].version; | |||
}); | |||
if (dv) { | |||
@@ -337,12 +337,12 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
return false; | |||
} | |||
var neighbours_data = req_data | |||
const neighbours_data = req_data | |||
.filter(function (d) { return d.status; }) // filter out unavailable neighbours | |||
.map(function (d) { return d.data; }); | |||
if (neighbours_data.length && !differentVersions(neighbours_data)) { | |||
var data = {}; | |||
var version = neighbours_data[0].version; | |||
let data = {}; | |||
const version = neighbours_data[0].version; | |||
if (version) { | |||
data.rows = [].concat.apply([], neighbours_data | |||
.map(function (e) { | |||
@@ -355,8 +355,8 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
data = [].concat.apply([], neighbours_data); | |||
$("#legacy-history-badge").show(); | |||
} | |||
var o = process_history_data(data); | |||
var items = o.items; | |||
const o = process_history_data(data); | |||
const items = o.items; | |||
rspamd.symbols.history = o.symbols; | |||
if (Object.prototype.hasOwnProperty.call(rspamd.tables, "history") && | |||
@@ -418,14 +418,14 @@ define(["jquery", "app/rspamd", "d3", "footable"], | |||
rspamd.query("errors", { | |||
success: function (data) { | |||
var neighbours_data = data | |||
const neighbours_data = data | |||
.filter(function (d) { | |||
return d.status; | |||
}) // filter out unavailable neighbours | |||
.map(function (d) { | |||
return d.data; | |||
}); | |||
var rows = [].concat.apply([], neighbours_data); | |||
const rows = [].concat.apply([], neighbours_data); | |||
$.each(rows, function (i, item) { | |||
item.ts = { | |||
value: rspamd.unix_time_format(item.ts), |
@@ -29,7 +29,7 @@ define(["jquery", "nprogress", "stickytabs", "visibility", | |||
"bootstrap", "fontawesome"], | |||
function ($, NProgress) { | |||
"use strict"; | |||
var ui = { | |||
const ui = { | |||
chartLegend: [ | |||
{label: "reject", color: "#FF0000"}, | |||
{label: "soft reject", color: "#BF8040"}, | |||
@@ -52,14 +52,14 @@ function ($, NProgress) { | |||
const defaultAjaxTimeout = 20000; | |||
const ajaxTimeoutBox = ".popover #settings-popover #ajax-timeout"; | |||
var graphs = {}; | |||
var tables = {}; | |||
var neighbours = []; // list of clusters | |||
var checked_server = "All SERVERS"; | |||
var timer_id = []; | |||
const graphs = {}; | |||
const tables = {}; | |||
let neighbours = []; // list of clusters | |||
let checked_server = "All SERVERS"; | |||
const timer_id = []; | |||
let pageSizeTimerId = null; | |||
let pageSizeInvocationCounter = 0; | |||
var locale = (localStorage.getItem("selected_locale") === "custom") ? localStorage.getItem("custom_locale") : null; | |||
let locale = (localStorage.getItem("selected_locale") === "custom") ? localStorage.getItem("custom_locale") : null; | |||
NProgress.configure({ | |||
minimum: 0.01, | |||
@@ -85,7 +85,7 @@ function ($, NProgress) { | |||
} | |||
function stopTimers() { | |||
for (var key in timer_id) { | |||
for (const key in timer_id) { | |||
if (!{}.hasOwnProperty.call(timer_id, key)) continue; | |||
Visibility.stop(timer_id[key]); | |||
} | |||
@@ -110,14 +110,14 @@ function ($, NProgress) { | |||
// Get selectors' current state | |||
function getSelector(id) { | |||
var e = document.getElementById(id); | |||
const e = document.getElementById(id); | |||
return e.options[e.selectedIndex].value; | |||
} | |||
function tabClick(id) { | |||
var tab_id = id; | |||
let tab_id = id; | |||
if ($(id).attr("disabled")) return; | |||
var navBarControls = $("#selSrv, #navBar li, #navBar a, #navBar button"); | |||
let navBarControls = $("#selSrv, #navBar li, #navBar a, #navBar button"); | |||
if (id !== "#autoRefresh") navBarControls.attr("disabled", true).addClass("disabled", true); | |||
stopTimers(); | |||
@@ -137,7 +137,7 @@ function ($, NProgress) { | |||
return; | |||
} | |||
var timeLeft = interval; | |||
let timeLeft = interval; | |||
$("#countdown").text("00:00"); | |||
timer_id.countdown = Visibility.every(1000, 1000, function () { | |||
timeLeft -= 1000; | |||
@@ -168,7 +168,7 @@ function ($, NProgress) { | |||
switch (tab_id) { | |||
case "#status_nav": | |||
require(["app/stats"], (module) => { | |||
var refreshInterval = $(".dropdown-menu a.active.preset").data("value"); | |||
const refreshInterval = $(".dropdown-menu a.active.preset").data("value"); | |||
setAutoRefresh(refreshInterval, "status", | |||
function () { return module.statWidgets(graphs, checked_server); }); | |||
if (id !== "#autoRefresh") module.statWidgets(graphs, checked_server); | |||
@@ -181,11 +181,11 @@ function ($, NProgress) { | |||
case "#throughput_nav": | |||
require(["app/graph"], (module) => { | |||
const selData = getSelector("selData"); // Graph's dataset selector state | |||
var step = { | |||
const step = { | |||
day: 60000, | |||
week: 300000 | |||
}; | |||
var refreshInterval = step[selData] || 3600000; | |||
let refreshInterval = step[selData] || 3600000; | |||
$("#dynamic-item").text((refreshInterval / 60000) + " min"); | |||
if (!$(".dropdown-menu a.active.dynamic").data("value")) { | |||
@@ -221,7 +221,7 @@ function ($, NProgress) { | |||
module.getHistory(); | |||
module.getErrors(); | |||
} | |||
var refreshInterval = $(".dropdown-menu a.active.history").data("value"); | |||
const refreshInterval = $(".dropdown-menu a.active.history").data("value"); | |||
setAutoRefresh(refreshInterval, "history", | |||
function () { return getHistoryAndErrors(); }); | |||
if (id !== "#autoRefresh") getHistoryAndErrors(); | |||
@@ -250,7 +250,7 @@ function ($, NProgress) { | |||
} | |||
function get_compare_function(table) { | |||
var compare_functions = { | |||
const compare_functions = { | |||
magnitude: function (e1, e2) { | |||
return Math.abs(e2.score) - Math.abs(e1.score); | |||
}, | |||
@@ -270,7 +270,7 @@ function ($, NProgress) { | |||
} | |||
function set_page_size(table, page_size, changeTablePageSize) { | |||
var n = parseInt(page_size, 10); // HTML Input elements return string representing a number | |||
const n = parseInt(page_size, 10); // HTML Input elements return string representing a number | |||
if (n > 0) { | |||
ui.page_size[table] = n; | |||
@@ -302,7 +302,7 @@ function ($, NProgress) { | |||
} | |||
function unix_time_format(tm) { | |||
var date = new Date(tm ? tm * 1000 : 0); | |||
const date = new Date(tm ? tm * 1000 : 0); | |||
return (locale) | |||
? date.toLocaleString(locale) | |||
: date.toLocaleString(); | |||
@@ -347,7 +347,7 @@ function ($, NProgress) { | |||
} | |||
function alertMessage(alertClass, alertText) { | |||
var a = $("<div class=\"alert " + alertClass + " alert-dismissible fade in show\">" + | |||
const a = $("<div class=\"alert " + alertClass + " alert-dismissible fade in show\">" + | |||
"<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" title=\"Dismiss\"></button>" + | |||
"<strong>" + alertText + "</strong>"); | |||
$(".notification-area").append(a); | |||
@@ -363,19 +363,19 @@ function ($, NProgress) { | |||
neighbours_status[ind].checked = false; | |||
neighbours_status[ind].data = {}; | |||
neighbours_status[ind].status = false; | |||
var req_params = { | |||
const req_params = { | |||
jsonp: false, | |||
data: o.data, | |||
headers: $.extend({Password:getPassword()}, o.headers), | |||
url: neighbours_status[ind].url + req_url, | |||
xhr: function () { | |||
var xhr = $.ajaxSettings.xhr(); | |||
const xhr = $.ajaxSettings.xhr(); | |||
// Download progress | |||
if (req_url !== "neighbours") { | |||
xhr.addEventListener("progress", function (e) { | |||
if (e.lengthComputable) { | |||
neighbours_status[ind].percentComplete = e.loaded / e.total; | |||
var percentComplete = neighbours_status.reduce(function (prev, curr) { | |||
const percentComplete = neighbours_status.reduce(function (prev, curr) { | |||
return curr.percentComplete ? curr.percentComplete + prev : prev; | |||
}, 0); | |||
NProgress.set(percentComplete / neighbours_status.length); | |||
@@ -400,7 +400,7 @@ function ($, NProgress) { | |||
o.error(neighbours_status[ind], | |||
jqXHR, textStatus, errorThrown); | |||
} else if (o.errorOnceId) { | |||
var alert_status = o.errorOnceId + neighbours_status[ind].name; | |||
const alert_status = o.errorOnceId + neighbours_status[ind].name; | |||
if (!(alert_status in sessionStorage)) { | |||
sessionStorage.setItem(alert_status, true); | |||
errorMessage(); | |||
@@ -473,7 +473,7 @@ function ($, NProgress) { | |||
$("#connectForm").off("submit").on("submit", function (e) { | |||
e.preventDefault(); | |||
var password = $("#connectPassword").val(); | |||
const password = $("#connectPassword").val(); | |||
function invalidFeedback(tooltip) { | |||
$("#connectPassword") | |||
@@ -493,7 +493,7 @@ function ($, NProgress) { | |||
Password: password | |||
}, | |||
success: function (json) { | |||
var data = json[0].data; | |||
const data = json[0].data; | |||
$("#connectPassword").val(""); | |||
if (data.auth === "ok") { | |||
sessionStorage.setItem("read_only", data.read_only); | |||
@@ -546,7 +546,7 @@ function ($, NProgress) { | |||
*/ | |||
ui.query = function (url, options) { | |||
// Force options to be an object | |||
var o = options || {}; | |||
const o = options || {}; | |||
Object.keys(o).forEach(function (option) { | |||
if (["complete", "data", "error", "errorMessage", "errorOnceId", "headers", "method", "params", "server", "statusCode", | |||
"success"] | |||
@@ -555,7 +555,7 @@ function ($, NProgress) { | |||
} | |||
}); | |||
var neighbours_status = [{ | |||
let neighbours_status = [{ | |||
name: "local", | |||
host: "local", | |||
url: "", | |||
@@ -564,7 +564,7 @@ function ($, NProgress) { | |||
if (o.server === "All SERVERS") { | |||
queryServer(neighbours_status, 0, "neighbours", { | |||
success: function (json) { | |||
var data = json[0].data; | |||
const data = json[0].data; | |||
if (jQuery.isEmptyObject(data)) { | |||
neighbours = { | |||
local: { | |||
@@ -610,20 +610,20 @@ function ($, NProgress) { | |||
ui.bindHistoryTableEventHandlers = function (table, symbolsCol) { | |||
function change_symbols_order(order) { | |||
$(".btn-sym-" + table + "-" + order).addClass("active").siblings().removeClass("active"); | |||
var compare_function = get_compare_function(table); | |||
const compare_function = get_compare_function(table); | |||
$.each(tables[table].rows.all, function (i, row) { | |||
var cell_val = sort_symbols(ui.symbols[table][i], compare_function); | |||
const cell_val = sort_symbols(ui.symbols[table][i], compare_function); | |||
row.cells[symbolsCol].val(cell_val, false, true); | |||
}); | |||
} | |||
$("#selSymOrder_" + table).unbind().change(function () { | |||
var order = this.value; | |||
const order = this.value; | |||
change_symbols_order(order); | |||
}); | |||
$("#" + table + "_page_size").change((e) => set_page_size(table, e.target.value, true)); | |||
$(document).on("click", ".btn-sym-order-" + table + " input", function () { | |||
var order = this.value; | |||
const order = this.value; | |||
$("#selSymOrder_" + table).val(order); | |||
change_symbols_order(order); | |||
}); | |||
@@ -739,8 +739,8 @@ function ($, NProgress) { | |||
on: { | |||
"expand.ft.row": function (e, ft, row) { | |||
setTimeout(function () { | |||
var detail_row = row.$el.next(); | |||
var order = getSelector("selSymOrder_" + table); | |||
const detail_row = row.$el.next(); | |||
const order = getSelector("selSymOrder_" + table); | |||
detail_row.find(".btn-sym-" + table + "-" + order) | |||
.addClass("active").siblings().removeClass("active"); | |||
}, 5); | |||
@@ -750,8 +750,8 @@ function ($, NProgress) { | |||
}; | |||
ui.escapeHTML = function (string) { | |||
var htmlEscaper = /[&<>"'/`=]/g; | |||
var htmlEscapes = { | |||
const htmlEscaper = /[&<>"'/`=]/g; | |||
const htmlEscapes = { | |||
"&": "&", | |||
"<": "<", | |||
">": ">", | |||
@@ -771,7 +771,7 @@ function ($, NProgress) { | |||
arr.forEach(function (d, i) { arr[i] = ui.escapeHTML(d); }); | |||
} | |||
for (var prop in item) { | |||
for (const prop in item) { | |||
if (!{}.hasOwnProperty.call(item, prop)) continue; | |||
switch (prop) { | |||
case "rcpt_mime": | |||
@@ -780,7 +780,7 @@ function ($, NProgress) { | |||
break; | |||
case "symbols": | |||
Object.keys(item.symbols).forEach(function (key) { | |||
var sym = item.symbols[key]; | |||
const sym = item.symbols[key]; | |||
if (!sym.name) { | |||
sym.name = key; | |||
} | |||
@@ -811,7 +811,7 @@ function ($, NProgress) { | |||
item.action = "<div style='font-size:11px' class='badge text-bg-info'>" + item.action + "</div>"; | |||
} | |||
var score_content = (item.score < item.required_score) | |||
const score_content = (item.score < item.required_score) | |||
? "<span class='text-success'>" + item.score.toFixed(2) + " / " + item.required_score + "</span>" | |||
: "<span class='text-danger'>" + item.score.toFixed(2) + " / " + item.required_score + "</span>"; | |||
@@ -825,22 +825,22 @@ function ($, NProgress) { | |||
ui.process_history_v2 = function (data, table) { | |||
// Display no more than rcpt_lim recipients | |||
var rcpt_lim = 3; | |||
var items = []; | |||
var unsorted_symbols = []; | |||
var compare_function = get_compare_function(table); | |||
const rcpt_lim = 3; | |||
const items = []; | |||
const unsorted_symbols = []; | |||
const compare_function = get_compare_function(table); | |||
$("#selSymOrder_" + table + ", label[for='selSymOrder_" + table + "']").show(); | |||
$.each(data.rows, | |||
function (i, item) { | |||
function more(p) { | |||
var l = item[p].length; | |||
const l = item[p].length; | |||
return (l > rcpt_lim) ? " … (" + l + ")" : ""; | |||
} | |||
function format_rcpt(smtp, mime) { | |||
var full = ""; | |||
var shrt = ""; | |||
let full = ""; | |||
let shrt = ""; | |||
if (smtp) { | |||
full = "[" + item.rcpt_smtp.join(", ") + "] "; | |||
shrt = "[" + item.rcpt_smtp.slice(0, rcpt_lim).join(",​") + more("rcpt_smtp") + "]"; | |||
@@ -899,7 +899,7 @@ function ($, NProgress) { | |||
item.id = item["message-id"]; | |||
if (table === "history") { | |||
var rcpt = {}; | |||
let rcpt = {}; | |||
if (!item.rcpt_mime.length) { | |||
rcpt = format_rcpt(true, false); | |||
} else if ($(item.rcpt_mime).not(item.rcpt_smtp).length !== 0 || $(item.rcpt_smtp).not(item.rcpt_mime).length !== 0) { | |||
@@ -921,8 +921,8 @@ function ($, NProgress) { | |||
}; | |||
ui.waitForRowsDisplayed = function (table, rows_total, callback, iteration) { | |||
var i = (typeof iteration === "undefined") ? 10 : iteration; | |||
var num_rows = $("#historyTable_" + table + " > tbody > tr:not(.footable-detail-row)").length; | |||
let i = (typeof iteration === "undefined") ? 10 : iteration; | |||
const num_rows = $("#historyTable_" + table + " > tbody > tr:not(.footable-detail-row)").length; | |||
if (num_rows === ui.page_size[table] || | |||
num_rows === rows_total) { | |||
return callback(); | |||
@@ -936,8 +936,8 @@ function ($, NProgress) { | |||
(function initSettings() { | |||
var selected_locale = null; | |||
var custom_locale = null; | |||
let selected_locale = null; | |||
let custom_locale = null; | |||
const localeTextbox = ".popover #settings-popover #locale"; | |||
function validateLocale(saveToLocalStorage) { | |||
@@ -945,7 +945,7 @@ function ($, NProgress) { | |||
$(localeTextbox).removeClass("is-" + remove).addClass("is-" + add); | |||
} | |||
var now = new Date(); | |||
const now = new Date(); | |||
if (custom_locale.length) { | |||
try { | |||
@@ -1050,8 +1050,8 @@ function ($, NProgress) { | |||
}); | |||
$(".dropdown-menu a").click(function (e) { | |||
e.preventDefault(); | |||
var classList = $(this).attr("class"); | |||
var menuClass = (/\b(?:dynamic|history|preset)\b/).exec(classList)[0]; | |||
const classList = $(this).attr("class"); | |||
const menuClass = (/\b(?:dynamic|history|preset)\b/).exec(classList)[0]; | |||
$(".dropdown-menu a.active." + menuClass).removeClass("active"); | |||
$(this).addClass("active"); | |||
tabClick("#autoRefresh"); |
@@ -1,7 +1,7 @@ | |||
define(["jquery", "app/rspamd"], | |||
function ($, rspamd) { | |||
"use strict"; | |||
var ui = {}; | |||
const ui = {}; | |||
function enable_disable_check_btn() { | |||
$("#selectorsChkMsgBtn").prop("disabled", ( | |||
@@ -11,17 +11,17 @@ define(["jquery", "app/rspamd"], | |||
} | |||
function get_server() { | |||
var checked_server = rspamd.getSelector("selSrv"); | |||
const checked_server = rspamd.getSelector("selSrv"); | |||
return (checked_server === "All SERVERS") ? "local" : checked_server; | |||
} | |||
function checkMsg(data) { | |||
var selector = $("#selectorsSelArea").val(); | |||
const selector = $("#selectorsSelArea").val(); | |||
rspamd.query("plugins/selectors/check_message?selector=" + encodeURIComponent(selector), { | |||
data: data, | |||
method: "POST", | |||
success: function (neighbours_status) { | |||
var json = neighbours_status[0].data; | |||
const json = neighbours_status[0].data; | |||
if (json.success) { | |||
rspamd.alertMessage("alert-success", "Message successfully processed"); | |||
$("#selectorsResArea") | |||
@@ -39,7 +39,7 @@ define(["jquery", "app/rspamd"], | |||
$("#selectorsSelArea").removeClass("is-" + remove).addClass("is-" + add); | |||
enable_disable_check_btn(); | |||
} | |||
var selector = $("#selectorsSelArea").val(); | |||
const selector = $("#selectorsSelArea").val(); | |||
if (selector.length && !rspamd.read_only ) { | |||
rspamd.query("plugins/selectors/check_selector?selector=" + encodeURIComponent(selector), { | |||
method: "GET", | |||
@@ -61,8 +61,8 @@ define(["jquery", "app/rspamd"], | |||
function buildLists() { | |||
function build_table_from_json(json, table_id) { | |||
Object.keys(json).forEach(function (key) { | |||
var td = $("<td/>"); | |||
var tr = $("<tr/>") | |||
const td = $("<td/>"); | |||
const tr = $("<tr/>") | |||
.append(td.clone().html("<code>" + key + "</code>")) | |||
.append(td.clone().html(json[key].description)); | |||
$(table_id + " tbody").append(tr); | |||
@@ -73,7 +73,7 @@ define(["jquery", "app/rspamd"], | |||
rspamd.query("plugins/selectors/list_" + list, { | |||
method: "GET", | |||
success: function (neighbours_status) { | |||
var json = neighbours_status[0].data; | |||
const json = neighbours_status[0].data; | |||
build_table_from_json(json, "#selectorsTable-" + list); | |||
}, | |||
server: get_server() | |||
@@ -94,8 +94,8 @@ define(["jquery", "app/rspamd"], | |||
function toggleSidebar(side) { | |||
$("#sidebar-" + side).toggleClass("collapsed"); | |||
var contentClass = "col-lg-6"; | |||
var openSidebarsCount = $("#sidebar-left").hasClass("collapsed") + | |||
let contentClass = "col-lg-6"; | |||
const openSidebarsCount = $("#sidebar-left").hasClass("collapsed") + | |||
$("#sidebar-right").hasClass("collapsed"); | |||
switch (openSidebarsCount) { | |||
case 1: |
@@ -29,13 +29,13 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
function msToTime(seconds) { | |||
if (!Number.isFinite(seconds)) return "???"; | |||
/* eslint-disable no-bitwise */ | |||
var years = seconds / 31536000 >> 0; // 3600*24*365 | |||
var months = seconds % 31536000 / 2628000 >> 0; // 3600*24*365/12 | |||
var days = seconds % 31536000 % 2628000 / 86400 >> 0; // 24*3600 | |||
var hours = seconds % 31536000 % 2628000 % 86400 / 3600 >> 0; | |||
var minutes = seconds % 31536000 % 2628000 % 86400 % 3600 / 60 >> 0; | |||
const years = seconds / 31536000 >> 0; // 3600*24*365 | |||
const months = seconds % 31536000 / 2628000 >> 0; // 3600*24*365/12 | |||
const days = seconds % 31536000 % 2628000 / 86400 >> 0; // 24*3600 | |||
const hours = seconds % 31536000 % 2628000 % 86400 / 3600 >> 0; | |||
const minutes = seconds % 31536000 % 2628000 % 86400 % 3600 / 60 >> 0; | |||
/* eslint-enable no-bitwise */ | |||
var out = null; | |||
let out = null; | |||
if (years > 0) { | |||
if (months > 0) { | |||
out = years + "yr " + months + "mth"; | |||
@@ -55,20 +55,20 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
} | |||
function displayStatWidgets(checked_server) { | |||
var servers = JSON.parse(sessionStorage.getItem("Credentials")); | |||
var data = {}; | |||
const servers = JSON.parse(sessionStorage.getItem("Credentials")); | |||
let data = {}; | |||
if (servers && servers[checked_server]) { | |||
data = servers[checked_server].data; | |||
} | |||
var stat_w = []; | |||
const stat_w = []; | |||
$("#statWidgets").empty().hide(); | |||
$.each(data, function (i, item) { | |||
var widgetsOrder = ["scanned", "no action", "greylist", "add header", "rewrite subject", "reject", "learned"]; | |||
const widgetsOrder = ["scanned", "no action", "greylist", "add header", "rewrite subject", "reject", "learned"]; | |||
function widget(k, v, cls) { | |||
var c = (typeof cls === "undefined") ? "" : cls; | |||
var titleAtt = d3.format(",")(v) + " " + k; | |||
const c = (typeof cls === "undefined") ? "" : cls; | |||
const titleAtt = d3.format(",")(v) + " " + k; | |||
return '<div class="card stat-box d-inline-block text-center shadow-sm me-3 px-3">' + | |||
'<div class="widget overflow-hidden p-2' + c + '" title="' + titleAtt + | |||
'"><strong class="d-block mt-2 mb-1 fw-bold">' + | |||
@@ -77,8 +77,8 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
if (i === "auth" || i === "error") return; // Skip to the next iteration | |||
if (i === "uptime" || i === "version") { | |||
var cls = "border-end "; | |||
var val = item; | |||
let cls = "border-end "; | |||
let val = item; | |||
if (i === "uptime") { | |||
cls = ""; | |||
val = msToTime(item); | |||
@@ -106,11 +106,11 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
$("#clusterTable tbody").empty(); | |||
$("#selSrv").empty(); | |||
$.each(servers, function (key, val) { | |||
var row_class = "danger"; | |||
var glyph_status = "fas fa-times"; | |||
var version = "???"; | |||
var uptime = "???"; | |||
var short_id = "???"; | |||
let row_class = "danger"; | |||
let glyph_status = "fas fa-times"; | |||
let version = "???"; | |||
let uptime = "???"; | |||
let short_id = "???"; | |||
let scan_times = { | |||
data: "???", | |||
title: "" | |||
@@ -176,7 +176,7 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
function addStatfiles(server, statfiles) { | |||
$.each(statfiles, function (i, statfile) { | |||
var cls = ""; | |||
let cls = ""; | |||
switch (statfile.symbol) { | |||
case "BAYES_SPAM": | |||
cls = "symbol-positive"; | |||
@@ -196,7 +196,7 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
} | |||
function addFuzzyStorage(server, storages) { | |||
var i = 0; | |||
let i = 0; | |||
$.each(storages, function (storage, hashes) { | |||
$("#fuzzyTable tbody").append("<tr>" + | |||
(i === 0 ? '<td rowspan="' + Object.keys(storages).length + '">' + server + "</td>" : "") + | |||
@@ -242,11 +242,11 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
}); | |||
} | |||
var data = []; | |||
var creds = JSON.parse(sessionStorage.getItem("Credentials")); | |||
const data = []; | |||
const creds = JSON.parse(sessionStorage.getItem("Credentials")); | |||
// Controller doesn't return the 'actions' object until at least one message is scanned | |||
if (creds && creds[checked_server] && creds[checked_server].data.scanned) { | |||
var actions = creds[checked_server].data.actions; | |||
const actions = creds[checked_server].data.actions; | |||
["no action", "soft reject", "add header", "rewrite subject", "greylist", "reject"] | |||
.forEach(function (action) { | |||
@@ -261,11 +261,11 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
} | |||
// Public API | |||
var ui = { | |||
const ui = { | |||
statWidgets: function (graphs, checked_server) { | |||
rspamd.query("stat", { | |||
success: function (neighbours_status) { | |||
var neighbours_sum = { | |||
const neighbours_sum = { | |||
version: neighbours_status[0].data.version, | |||
uptime: 0, | |||
scanned: 0, | |||
@@ -279,9 +279,9 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
"soft reject": 0, | |||
} | |||
}; | |||
var status_count = 0; | |||
var promises = []; | |||
var to_Credentials = { | |||
let status_count = 0; | |||
const promises = []; | |||
const to_Credentials = { | |||
"All SERVERS": { | |||
name: "All SERVERS", | |||
url: "", | |||
@@ -292,10 +292,10 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
}; | |||
function process_node_stat(e) { | |||
var data = neighbours_status[e].data; | |||
const data = neighbours_status[e].data; | |||
// Controller doesn't return the 'actions' object until at least one message is scanned | |||
if (data.scanned) { | |||
for (var action in neighbours_sum.actions) { | |||
for (const action in neighbours_sum.actions) { | |||
if ({}.hasOwnProperty.call(neighbours_sum.actions, action)) { | |||
neighbours_sum.actions[action] += data.actions[action]; | |||
} | |||
@@ -309,7 +309,7 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
// Get config_id, version and uptime using /auth query for Rspamd 2.5 and earlier | |||
function get_legacy_stat(e) { | |||
var alerted = "alerted_stats_legacy_" + neighbours_status[e].name; | |||
const alerted = "alerted_stats_legacy_" + neighbours_status[e].name; | |||
promises.push($.ajax({ | |||
url: neighbours_status[e].url + "auth", | |||
headers: {Password:rspamd.getPassword()}, | |||
@@ -331,7 +331,7 @@ define(["jquery", "app/rspamd", "d3pie", "d3"], | |||
})); | |||
} | |||
for (var e in neighbours_status) { | |||
for (const e in neighbours_status) { | |||
if ({}.hasOwnProperty.call(neighbours_status, e)) { | |||
to_Credentials[neighbours_status[e].name] = neighbours_status[e]; | |||
if (neighbours_status[e].status === true) { |
@@ -27,12 +27,12 @@ | |||
define(["jquery", "app/rspamd", "footable"], | |||
function ($, rspamd) { | |||
"use strict"; | |||
var ui = {}; | |||
const ui = {}; | |||
function saveSymbols(action, id, server) { | |||
var inputs = $("#" + id + " :input[data-role=\"numerictextbox\"]"); | |||
var url = action; | |||
var values = []; | |||
const inputs = $("#" + id + " :input[data-role=\"numerictextbox\"]"); | |||
const url = action; | |||
const values = []; | |||
$(inputs).each(function () { | |||
values.push({ | |||
name: $(this).attr("id").substring(5), | |||
@@ -54,20 +54,20 @@ define(["jquery", "app/rspamd", "footable"], | |||
}); | |||
} | |||
function decimalStep(number) { | |||
var digits = Number(number).toFixed(20).replace(/^-?\d*\.?|0+$/g, "").length; | |||
const digits = Number(number).toFixed(20).replace(/^-?\d*\.?|0+$/g, "").length; | |||
return (digits === 0 || digits > 4) ? 0.1 : 1.0 / Math.pow(10, digits); | |||
} | |||
function process_symbols_data(data) { | |||
var items = []; | |||
var lookup = {}; | |||
var freqs = []; | |||
var distinct_groups = []; | |||
var selected_server = rspamd.getSelector("selSrv"); | |||
const items = []; | |||
const lookup = {}; | |||
const freqs = []; | |||
const distinct_groups = []; | |||
const selected_server = rspamd.getSelector("selSrv"); | |||
data.forEach(function (group) { | |||
group.rules.forEach(function (item) { | |||
var max = 20; | |||
var min = -20; | |||
let max = 20; | |||
let min = -20; | |||
if (item.weight > max) { | |||
max = item.weight * 2; | |||
} | |||
@@ -75,7 +75,7 @@ define(["jquery", "app/rspamd", "footable"], | |||
if (item.weight < min) { | |||
min = item.weight * 2; | |||
} | |||
var label_class = ""; | |||
let label_class = ""; | |||
if (item.weight < 0) { | |||
label_class = "scorebar-ham"; | |||
} else if (item.weight > 0) { | |||
@@ -112,13 +112,13 @@ define(["jquery", "app/rspamd", "footable"], | |||
}); | |||
// For better mean calculations | |||
var avg_freq = freqs.sort(function (a, b) { | |||
const avg_freq = freqs.sort(function (a, b) { | |||
return Number(a) < Number(b); | |||
}).reduce(function (f1, acc) { | |||
return f1 + acc; | |||
}) / (freqs.length !== 0 ? freqs.length : 1.0); | |||
var mult = 1.0; | |||
var exp = 0.0; | |||
let mult = 1.0; | |||
let exp = 0.0; | |||
if (avg_freq > 0.0) { | |||
while (mult * avg_freq < 1.0) { | |||
@@ -141,8 +141,8 @@ define(["jquery", "app/rspamd", "footable"], | |||
ui.getSymbols = function (checked_server) { | |||
rspamd.query("symbols", { | |||
success: function (json) { | |||
var data = json[0].data; | |||
var items = process_symbols_data(data); | |||
const data = json[0].data; | |||
const items = process_symbols_data(data); | |||
/* eslint-disable consistent-this, no-underscore-dangle, one-var-declaration-per-line */ | |||
FooTable.groupFilter = FooTable.Filtering.extend({ | |||
@@ -154,7 +154,7 @@ define(["jquery", "app/rspamd", "footable"], | |||
}, | |||
$create: function () { | |||
this._super(); | |||
var self = this, $form_grp = $("<div/>", { | |||
const self = this, $form_grp = $("<div/>", { | |||
class: "form-group" | |||
}).append($("<label/>", { | |||
class: "sr-only", | |||
@@ -175,7 +175,7 @@ define(["jquery", "app/rspamd", "footable"], | |||
}); | |||
}, | |||
_onStatusDropdownChanged: function (e) { | |||
var self = e.data.self, selected = $(this).val(); | |||
const self = e.data.self, selected = $(this).val(); | |||
if (selected !== self.def) { | |||
self.addFilter("group", selected, ["group"]); | |||
} else { | |||
@@ -185,7 +185,7 @@ define(["jquery", "app/rspamd", "footable"], | |||
}, | |||
draw: function () { | |||
this._super(); | |||
var group = this.find("group"); | |||
const group = this.find("group"); | |||
if (group instanceof FooTable.Filter) { | |||
this.$group.val(group.query.val()); | |||
} else { | |||
@@ -236,7 +236,7 @@ define(["jquery", "app/rspamd", "footable"], | |||
$("#symbolsTable") | |||
.off("click", ":button") | |||
.on("click", ":button", function () { | |||
var value = $(this).data("save"); | |||
const value = $(this).data("save"); | |||
if (!value) return; | |||
saveSymbols("./savesymbols", "symbolsTable", value); | |||
}); | |||
@@ -245,10 +245,10 @@ define(["jquery", "app/rspamd", "footable"], | |||
$("#updateSymbols").on("click", function (e) { | |||
e.preventDefault(); | |||
var checked_server = rspamd.getSelector("selSrv"); | |||
const checked_server = rspamd.getSelector("selSrv"); | |||
rspamd.query("symbols", { | |||
success: function (data) { | |||
var items = process_symbols_data(data[0].data)[0]; | |||
const items = process_symbols_data(data[0].data)[0]; | |||
rspamd.tables.symbols.rows.load(items); | |||
}, | |||
server: (checked_server === "All SERVERS") ? "local" : checked_server |
@@ -27,7 +27,7 @@ | |||
define(["jquery", "app/rspamd"], | |||
function ($, rspamd) { | |||
"use strict"; | |||
var ui = {}; | |||
const ui = {}; | |||
function cleanTextUpload(source) { | |||
$("#" + source + "TextSource").val(""); | |||
@@ -35,7 +35,7 @@ define(["jquery", "app/rspamd"], | |||
// @upload text | |||
function uploadText(data, source, headers) { | |||
var url = null; | |||
let url = null; | |||
if (source === "spam") { | |||
url = "learnspam"; | |||
} else if (source === "ham") { | |||
@@ -142,7 +142,7 @@ define(["jquery", "app/rspamd"], | |||
} | |||
function get_server() { | |||
var checked_server = rspamd.getSelector("selSrv"); | |||
const checked_server = rspamd.getSelector("selSrv"); | |||
return (checked_server === "All SERVERS") ? "local" : checked_server; | |||
} | |||
@@ -166,13 +166,13 @@ define(["jquery", "app/rspamd"], | |||
}); | |||
} | |||
var json = neighbours_status[0].data; | |||
const json = neighbours_status[0].data; | |||
if (json.action) { | |||
rspamd.alertMessage("alert-success", "Data successfully scanned"); | |||
var rows_total = $("#historyTable_scan > tbody > tr:not(.footable-detail-row)").length + 1; | |||
var o = rspamd.process_history_v2({rows:[json]}, "scan"); | |||
var items = o.items; | |||
const rows_total = $("#historyTable_scan > tbody > tr:not(.footable-detail-row)").length + 1; | |||
const o = rspamd.process_history_v2({rows:[json]}, "scan"); | |||
const items = o.items; | |||
rspamd.symbols.scan.push(o.symbols[0]); | |||
if (Object.prototype.hasOwnProperty.call(rspamd.tables, "scan")) { | |||
@@ -228,7 +228,7 @@ define(["jquery", "app/rspamd"], | |||
}, | |||
method: "POST", | |||
success: function (neighbours_status) { | |||
var json = neighbours_status[0].data; | |||
const json = neighbours_status[0].data; | |||
if (json.success) { | |||
rspamd.alertMessage("alert-success", "Message successfully processed"); | |||
fillHashTable(json.hashes); | |||
@@ -277,13 +277,13 @@ define(["jquery", "app/rspamd"], | |||
}); | |||
$("[data-upload]").on("click", function () { | |||
var source = $(this).data("upload"); | |||
var data = $("#scanMsgSource").val(); | |||
var headers = {}; | |||
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(function (o, header) { | |||
var value = $("#scan-opt-" + header.toLowerCase()).val(); | |||
const value = $("#scan-opt-" + header.toLowerCase()).val(); | |||
if (value !== "") o[header] = value; | |||
return o; | |||
}, {}); |