diff --git a/data/web/css/site/quarantine.css b/data/web/css/site/quarantine.css
index 7e46b814f..7a1274982 100644
--- a/data/web/css/site/quarantine.css
+++ b/data/web/css/site/quarantine.css
@@ -42,22 +42,6 @@ table.footable>tbody>tr.footable-empty>td {
border-color: #FF4136;
}
-.dot-danger {
- height: 10px;
- width: 10px;
- background-color: #ff4136;
- border-radius: 50%;
- display: inline-block;
-}
-
-.dot-neutral {
- height: 10px;
- width: 10px;
- background-color: #d4d4d4;
- border-radius: 50%;
- display: inline-block;
-}
-
.modal#qidDetailModal p {
word-break: break-all;
}
@@ -112,3 +96,7 @@ table tbody tr {
table tbody tr td input[type="checkbox"] {
cursor: pointer;
}
+.label-rspamd-action {
+ font-size:110%;
+ margin:20px;
+}
diff --git a/data/web/inc/ajax/qitem_details.php b/data/web/inc/ajax/qitem_details.php
index 74898c64a..5eca23190 100644
--- a/data/web/inc/ajax/qitem_details.php
+++ b/data/web/inc/ajax/qitem_details.php
@@ -61,6 +61,8 @@ if (!empty($_GET['hash']) && ctype_alnum($_GET['hash'])) {
$data['env_from'] = $mailc['sender'];
// Get rspamd score
$data['score'] = $mailc['score'];
+ // Get rspamd action
+ $data['action'] = $mailc['action'];
// Get rspamd symbols
$data['symbols'] = json_decode($mailc['symbols']);
// Get fuzzy hashes
@@ -118,6 +120,8 @@ elseif (!empty($_GET['id']) && ctype_alnum($_GET['id'])) {
$data['env_from'] = $mailc['sender'];
// Get rspamd score
$data['score'] = $mailc['score'];
+ // Get rspamd action
+ $data['action'] = $mailc['action'];
// Get rspamd symbols
$data['symbols'] = json_decode($mailc['symbols']);
// Get fuzzy hashes
diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php
index 5369ab740..0ca2253bc 100644
--- a/data/web/inc/functions.mailbox.inc.php
+++ b/data/web/inc/functions.mailbox.inc.php
@@ -329,6 +329,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$mins_interval = $_data['mins_interval'];
$enc1 = $_data['enc1'];
$custom_params = (empty(trim($_data['custom_params']))) ? '' : trim($_data['custom_params']);
+ // Workaround, fixme
+ if (strpos($custom_params, 'pipemess')) {
+ $custom_params = '';
+ }
if (empty($subfolder2)) {
$subfolder2 = "";
}
@@ -1638,6 +1642,9 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
);
continue;
}
+ if (strpos($custom_params, 'pipemess')) {
+ $custom_params = '';
+ }
if (empty($subfolder2)) {
$subfolder2 = "";
}
diff --git a/data/web/inc/functions.quarantine.inc.php b/data/web/inc/functions.quarantine.inc.php
index 3518fc6f6..b240587f6 100644
--- a/data/web/inc/functions.quarantine.inc.php
+++ b/data/web/inc/functions.quarantine.inc.php
@@ -169,6 +169,7 @@ function quarantine($_action, $_data = null) {
}
}
elseif ($release_format == 'raw') {
+ $detail_row['msg'] = preg_replace('/^X-Spam-Flag: (.*)/', 'X-Pre-Release-Spam-Flag $1', $detail_row['msg']);
$postfix_talk = array(
array('220', 'HELO quarantine' . chr(10)),
array('250', 'MAIL FROM: ' . $sender . chr(10)),
@@ -375,12 +376,13 @@ function quarantine($_action, $_data = null) {
);
continue;
}
- $stmt = $pdo->prepare('SELECT `msg`, `qid`, `sender`, `rcpt` FROM `quarantine` WHERE `id` = :id');
+ $stmt = $pdo->prepare('SELECT `msg`, `action`, `qid`, `sender`, `rcpt` FROM `quarantine` WHERE `id` = :id');
$stmt->execute(array(':id' => $id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
- if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin') {
+ if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin' || empty($row['rcpt'])) {
$_SESSION['return'][] = array(
'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
'msg' => 'access_denied'
);
continue;
@@ -462,6 +464,7 @@ function quarantine($_action, $_data = null) {
}
}
elseif ($release_format == 'raw') {
+ $row['msg'] = preg_replace('/^X-Spam-Flag: (.*)/', 'X-Pre-Release-Spam-Flag $1', $row['msg']);
$postfix_talk = array(
array('220', 'HELO quarantine' . chr(10)),
array('250', 'MAIL FROM: ' . $sender . chr(10)),
@@ -633,12 +636,13 @@ function quarantine($_action, $_data = null) {
);
continue;
}
- $stmt = $pdo->prepare('SELECT `msg`, `rcpt` FROM `quarantine` WHERE `id` = :id');
+ $stmt = $pdo->prepare('SELECT `msg`, `rcpt`, `action` FROM `quarantine` WHERE `id` = :id');
$stmt->execute(array(':id' => $id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
- if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin') {
+ if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin' || empty($row['rcpt'])) {
$_SESSION['return'][] = array(
'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
'msg' => 'access_denied'
);
continue;
@@ -658,7 +662,7 @@ function quarantine($_action, $_data = null) {
if (stripos($response['error'], 'already learned') === false) {
$_SESSION['return'][] = array(
'type' => 'danger',
- 'log' => array(__FUNCTION__),
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
'msg' => array('spam_learn_error', $response['error'])
);
continue;
@@ -768,7 +772,7 @@ function quarantine($_action, $_data = null) {
break;
case 'get':
if ($_SESSION['mailcow_cc_role'] == "user") {
- $stmt = $pdo->prepare('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine` WHERE `rcpt` = :mbox');
+ $stmt = $pdo->prepare('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, `action`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine` WHERE `rcpt` = :mbox');
$stmt->execute(array(':mbox' => $_SESSION['mailcow_cc_username']));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
@@ -776,7 +780,7 @@ function quarantine($_action, $_data = null) {
}
}
elseif ($_SESSION['mailcow_cc_role'] == "admin") {
- $stmt = $pdo->query('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine`');
+ $stmt = $pdo->query('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, `action`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine`');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
$q_meta[] = $row;
@@ -785,7 +789,7 @@ function quarantine($_action, $_data = null) {
else {
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
foreach ($domains as $domain) {
- $stmt = $pdo->prepare('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine` WHERE `rcpt` REGEXP :domain');
+ $stmt = $pdo->prepare('SELECT `id`, `qid`, `subject`, LOCATE("VIRUS_FOUND", `symbols`) AS `virus_flag`, `score`, `rcpt`, `sender`, `action`, UNIX_TIMESTAMP(`created`) AS `created`, `notified` FROM `quarantine` WHERE `rcpt` REGEXP :domain');
$stmt->execute(array(':domain' => '@' . $domain . '$'));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php
index a2e48ef6a..0e7eeb9c2 100644
--- a/data/web/inc/init_db.inc.php
+++ b/data/web/inc/init_db.inc.php
@@ -3,7 +3,7 @@ function init_db_schema() {
try {
global $pdo;
- $db_version = "31102020_1810";
+ $db_version = "06112020_1010";
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -258,7 +258,6 @@ function init_db_schema() {
"subject" => "VARCHAR(500)",
"score" => "FLOAT(8,2)",
"ip" => "VARCHAR(50)",
- "type" => "ENUM('reject','header') DEFAULT 'reject'",
"action" => "CHAR(20) NOT NULL DEFAULT 'unknown'",
"symbols" => "JSON",
"fuzzy_hashes" => "JSON",
@@ -1130,6 +1129,9 @@ function init_db_schema() {
$pdo->query("DROP VIEW IF EXISTS `" . $view . "`;");
$pdo->query($create);
}
+
+ // Mitigate imapsync pipemess issue
+ $pdo->query("UPDATE `imapsync` SET `custom_params` = '' WHERE `custom_params` LIKE '%pipemess%';");
// Inject admin if not exists
$stmt = $pdo->query("SELECT NULL FROM `admin`");
diff --git a/data/web/js/site/qhandler.js b/data/web/js/site/qhandler.js
index 2690ce449..a05348043 100644
--- a/data/web/js/site/qhandler.js
+++ b/data/web/js/site/qhandler.js
@@ -16,10 +16,11 @@ jQuery(function($){
$('#qid_detail_subj').text(data.subject);
$('#qid_detail_hfrom').text(data.header_from);
$('#qid_detail_efrom').text(data.env_from);
- $('#qid_detail_score').text(data.score);
+ $('#qid_detail_score').html('');
$('#qid_detail_symbols').html('');
+ $('#qid_detail_recipients').html('');
$('#qid_detail_fuzzy').html('');
- if (data.fuzzy_hashes !== null) {
+ if (typeof data.fuzzy_hashes === 'object' && data.fuzzy_hashes !== null && data.fuzzy_hashes.length !== 0) {
$.each(data.fuzzy_hashes, function (index, value) {
$('#qid_detail_fuzzy').append('
' + value + '
');
});
@@ -47,7 +48,13 @@ jQuery(function($){
});
$('[data-toggle="tooltip"]').tooltip()
}
- $('#qid_detail_recipients').html('');
+ if (typeof data.score !== 'undefined' && typeof data.action !== 'undefined') {
+ if (data.action === "add header") {
+ $('#qid_detail_score').append('' + data.score + ' - ' + lang.junk_folder + '');
+ } else {
+ $('#qid_detail_score').append('' + data.score + ' - ' + lang.rejected + '');
+ }
+ }
if (typeof data.recipients !== 'undefined') {
$.each(data.recipients, function(index, value) {
var elem = $('');
diff --git a/data/web/js/site/quarantine.js b/data/web/js/site/quarantine.js
index 685b8861f..5728c8854 100644
--- a/data/web/js/site/quarantine.js
+++ b/data/web/js/site/quarantine.js
@@ -52,6 +52,7 @@ jQuery(function($){
{"name":"qid","breakpoints":"all","type":"text","title":lang.qid,"style":{"width":"125px"}},
{"name":"sender","title":lang.sender},
{"name":"subject","title":lang.subj, "type": "text"},
+ {"name":"rspamdaction","title":lang.rspamd_result, "type": "html"},
{"name":"rcpt","title":lang.rcpt, "breakpoints":"xs sm md", "type": "text"},
{"name":"virus","title":lang.danger, "type": "text"},
{"name":"score","title": lang.spam_score, "type": "text"},
@@ -77,9 +78,14 @@ jQuery(function($){
item.score = '-';
}
if (item.virus_flag > 0) {
- item.virus = '';
+ item.virus = '' + lang.high_danger + '';
} else {
- item.virus = '';
+ item.virus = '' + lang.neutral_danger + '';
+ }
+ if (item.action === "reject") {
+ item.rspamdaction = '' + lang.rejected + '';
+ } else if (item.action === "add header") {
+ item.rspamdaction = '' + lang.junk_folder + '';
}
if(item.notified > 0) {
item.notified = '✔';
@@ -142,11 +148,10 @@ jQuery(function($){
});
$('#qid_detail_subj').text(data.subject);
- $('#qid_detail_text').text(data.text_plain);
- $('#qid_detail_text_from_html').text(data.text_html);
$('#qid_detail_hfrom').text(data.header_from);
$('#qid_detail_efrom').text(data.env_from);
- $('#qid_detail_score').text(data.score);
+ $('#qid_detail_score').html('');
+ $('#qid_detail_recipients').html('');
$('#qid_detail_symbols').html('');
$('#qid_detail_fuzzy').html('');
if (typeof data.symbols !== 'undefined') {
@@ -170,14 +175,20 @@ jQuery(function($){
});
$('[data-toggle="tooltip"]').tooltip()
}
- if (data.fuzzy_hashes !== null) {
+ if (typeof data.fuzzy_hashes === 'object' && data.fuzzy_hashes !== null && data.fuzzy_hashes.length !== 0) {
$.each(data.fuzzy_hashes, function (index, value) {
$('#qid_detail_fuzzy').append('' + value + '
');
});
} else {
$('#qid_detail_fuzzy').append('-');
}
- $('#qid_detail_recipients').html('');
+ if (typeof data.score !== 'undefined' && typeof data.action !== 'undefined') {
+ if (data.action == "add header") {
+ $('#qid_detail_score').append('' + data.score + ' - ' + lang.junk_folder + '');
+ } else {
+ $('#qid_detail_score').append('' + data.score + ' - ' + lang.rejected + '');
+ }
+ }
if (typeof data.recipients !== 'undefined') {
$.each(data.recipients, function(index, value) {
var elem = $('');
@@ -185,7 +196,8 @@ jQuery(function($){
$('#qid_detail_recipients').append(elem);
});
}
-
+ $('#qid_detail_text').text(data.text_plain);
+ $('#qid_detail_text_from_html').text(data.text_html);
var qAtts = $("#qid_detail_atts");
if (typeof data.attachments !== 'undefined') {
qAtts.text('');
diff --git a/data/web/lang/lang.ca.json b/data/web/lang/lang.ca.json
index 6c85b9b05..1301177f9 100644
--- a/data/web/lang/lang.ca.json
+++ b/data/web/lang/lang.ca.json
@@ -376,7 +376,6 @@
"check_hash": "Comprovar el hash del fitxer a VT",
"empty": "No hi ha elements",
"qid": "Rspamd QID",
- "qinfo": "El sistema de quarantena desa a la base de dades els missatges que han estat refusats. El missatge, al emissor, li consta com a no lliurat.",
"qitem": "Element en quarantena",
"quarantine": "Quarantena",
"quick_actions": "Accions",
diff --git a/data/web/lang/lang.cs.json b/data/web/lang/lang.cs.json
index 0a6243155..dccdc22d5 100644
--- a/data/web/lang/lang.cs.json
+++ b/data/web/lang/lang.cs.json
@@ -748,7 +748,6 @@
"notified": "Oznámeno",
"qhandler_success": "Požadavek úspěšně přijat. Můžete nyní zavřít okno.",
"qid": "Rspamd QID",
- "qinfo": "Karanténní systém uloží odmítnutou poštu do databáze a odesílatel nebude informován o nedoručené poště.\r\n
\"Naučit jako spam a smazat\" naučí systém, že zpráva je spam, pomocí Bayes teorému a také vypočítá \"fuzzy hashes\" pro odmítnutí podobných zpráv v budoucnu.\r\n
Upozornění: Učení se vícera zpráv najednou může být v závislosti na výkonu systému časově náročné.",
"qitem": "Položka v karanténě",
"quarantine": "Karanténa",
"quick_actions": "Akce",
diff --git a/data/web/lang/lang.de.json b/data/web/lang/lang.de.json
index 64ca78fb0..a16d3f933 100644
--- a/data/web/lang/lang.de.json
+++ b/data/web/lang/lang.de.json
@@ -675,6 +675,8 @@
"mailbox_defquota": "Standard-Quota",
"mailbox_quota": "Max. Größe einer Mailbox",
"mailboxes": "Mailboxen",
+ "mailbox_defaults": "Standardeinstellungen",
+ "mailbox_defaults_info": "Steuert die Standardeinstellungen für neue Mailboxen.",
"mins_interval": "Intervall (min)",
"msg_num": "Anzahl Nachrichten",
"multiple_bookings": "Mehrfachbuchen",
@@ -751,20 +753,24 @@
"action": "Aktion",
"atts": "Anhänge",
"check_hash": "Checksumme auf VirusTotal suchen",
+ "confirm": "Bestätigen",
"confirm_delete": "Bestätigen Sie die Löschung dieses Elements.",
"danger": "Gefahr",
+ "deliver_inbox": "In Posteingang zustellen",
"disabled_by_config": "Die derzeitige Konfiguration deaktiviert die Funktion des Quarantäne-Systems. Zur Funktion muss eine Anzahl an Rückhaltungen pro Mailbox sowie ein Limit für die maximale Größe pro Element definiert werden.",
"download_eml": "Herunterladen (.eml)",
"empty": "Keine Einträge",
- "high_danger": "Hohe Gefahr",
+ "high_danger": "Hoch",
+ "info": "Information",
+ "junk_folder": "Junk-Ordner",
"learn_spam_delete": "Als Spam lernen und löschen",
- "low_danger": "Niedrige Gefahr",
- "medium_danger": "Mittlere Gefahr",
- "neutral_danger": "Neutral/ohne Bewertung",
+ "low_danger": "Niedrig",
+ "medium_danger": "Mittel",
+ "neutral_danger": "Neutral",
"notified": "Benachrichtigt",
"qhandler_success": "Aktion wurde an das System übergeben. Sie dürfen dieses Fenster nun schließen.",
"qid": "Rspamd QID",
- "qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird nicht signalisiert, dass seine E-Mail zugestellt wurde.\r\n
\"Als Spam lernen und löschen\" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.\r\n
Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.
Auf Blacklists vorkommende Elemente sind von der Quarantäne ausgeschlossen.",
+ "qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird nicht signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n
\"Als Spam lernen und löschen\" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.\r\n
Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.
Auf Blacklists vorkommende Elemente sind von der Quarantäne ausgeschlossen.",
"qitem": "Quarantäneeintrag",
"quarantine": "Quarantäne",
"quick_actions": "Aktionen",
@@ -772,6 +778,7 @@
"received": "Empfangen",
"recipients": "Empfänger",
"refresh": "Neu laden",
+ "rejected": "Abgelehnt",
"release": "Freigeben",
"release_body": "Die ursprüngliche Nachricht wurde als EML-Datei im Anhang hinterlegt.",
"release_subject": "Potentiell schädliche Nachricht aus Quarantäne: %s",
@@ -779,11 +786,14 @@
"rspamd_result": "Rspamd Ergebnis",
"quick_release_link": "Quick-Release Link öffnen",
"quick_delete_link": "Quick-Delete Link öffnen",
+ "quick_info_link": "Element-Info Link öffnen",
"sender": "Sender (SMTP)",
"sender_header": "Sender (\"From\"-Header)",
"show_item": "Details",
+ "spam": "Spam",
"spam_score": "Bewertung",
"subj": "Betreff",
+ "type": "Typ",
"table_size": "Tabellengröße",
"table_size_show_n": "Zeige %s Einträge",
"text_from_html_content": "Inhalt (html, konvertiert)",
@@ -984,7 +994,7 @@
"spamfilter": "Spamfilter",
"spamfilter_behavior": "Bewertung",
"spamfilter_bl": "Blacklist",
- "spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter immer als Spam erfasst und abgelehnt werden. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-\"Catch All\" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
+ "spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter immer als Spam erfasst und abgelehnt werden. Die Quarantäne-Funktion ist für diese Nachrichten deaktiviert. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-\"Catch All\" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
"spamfilter_default_score": "Standardwert",
"spamfilter_green": "Grün: Die Nachricht ist kein Spam",
"spamfilter_hint": "Der erste Wert beschreibt den \"low spam score\", der zweite Wert den \"high spam score\".",
diff --git a/data/web/lang/lang.en.json b/data/web/lang/lang.en.json
index af7bb2afa..1906cd15e 100644
--- a/data/web/lang/lang.en.json
+++ b/data/web/lang/lang.en.json
@@ -675,6 +675,8 @@
"mailbox_defquota": "Default mailbox size",
"mailbox_quota": "Max. size of a mailbox",
"mailboxes": "Mailboxes",
+ "mailbox_defaults": "Default settings",
+ "mailbox_defaults_info": "Define default settings for new mailboxes.",
"mins_interval": "Interval (min)",
"msg_num": "Message #",
"multiple_bookings": "Multiple bookings",
@@ -751,20 +753,24 @@
"action": "Action",
"atts": "Attachments",
"check_hash": "Search file hash @ VT",
+ "confirm": "Confirm",
"confirm_delete": "Confirm the deletion of this element.",
"danger": "Danger",
+ "deliver_inbox": "Deliver to inbox",
"disabled_by_config": "The current system configuration disables the quarantine functionality. Please set \"retentions per mailbox\" and a \"maximum size\" for quarantine elements.",
"download_eml": "Download (.eml)",
"empty": "No results",
"high_danger": "High",
+ "info": "Information",
+ "junk_folder": "Junk folder",
"learn_spam_delete": "Learn as spam and delete",
- "low_danger": "Low danger",
- "medium_danger": "Medium danger",
- "neutral_danger": "Neutral/no rating",
+ "low_danger": "Low",
+ "medium_danger": "Medium",
+ "neutral_danger": "Neutral",
"notified": "Notified",
"qhandler_success": "Request successfully sent to the system. You can now close the window.",
"qid": "Rspamd QID",
- "qinfo": "The quarantine system will save rejected mail to the database, while the sender will not be given the impression of a delivered mail.\r\n
\"Learn as spam and delete\" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.\r\n
Please be aware that learning multiple messages can be - depending on your system - time consuming.
Blacklisted elements are excluded from the quarantine.",
+ "qinfo": "The quarantine system will save rejected mail to the database (the sender will not be given the impression of a delivered mail) as well as mail, that is delivered as copy into the Junk folder of a mailbox.\r\n
\"Learn as spam and delete\" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.\r\n
Please be aware that learning multiple messages can be - depending on your system - time consuming.
Blacklisted elements are excluded from the quarantine.",
"qitem": "Quarantine item",
"quarantine": "Quarantine",
"quick_actions": "Actions",
@@ -772,6 +778,7 @@
"received": "Received",
"recipients": "Recipients",
"refresh": "Refresh",
+ "rejected": "Rejected",
"release": "Release",
"release_body": "We have attached your message as eml file to this message.",
"release_subject": "Potentially damaging quarantine item %s",
@@ -779,9 +786,12 @@
"rspamd_result": "Rspamd result",
"sender": "Sender (SMTP)",
"sender_header": "Sender (\"From\" header)",
+ "type": "Type",
"quick_release_link": "Open quick release link",
"quick_delete_link": "Open quick delete link",
+ "quick_info_link": "Open info link",
"show_item": "Show item",
+ "spam": "Spam",
"spam_score": "Score",
"subj": "Subject",
"table_size": "Table size",
@@ -984,7 +994,7 @@
"spamfilter": "Spam filter",
"spamfilter_behavior": "Rating",
"spamfilter_bl": "Blacklist",
- "spamfilter_bl_desc": "Blacklisted email addresses to always classify as spam and reject. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
+ "spamfilter_bl_desc": "Blacklisted email addresses to always classify as spam and reject. Rejected mail will not be copied to quarantine. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
"spamfilter_default_score": "Default values",
"spamfilter_green": "Green: this message is not spam",
"spamfilter_hint": "The first value describes the \"low spam score\", the second represents the \"high spam score\".",
diff --git a/data/web/lang/lang.es.json b/data/web/lang/lang.es.json
index b98921d0d..4e78b6fba 100644
--- a/data/web/lang/lang.es.json
+++ b/data/web/lang/lang.es.json
@@ -591,7 +591,6 @@
"neutral_danger": "Neutral",
"qhandler_success": "Solicitud enviada con éxito al sistema, puede cerrar la ventana",
"qid": "Rspamd QID",
- "qinfo": "El sistema de cuarentena guardará el correo rechazado en la base de datos, mientras que el remitente no tendrá la impresión de un correo entregado.\r\n
Aprender como spam y eliminar aprenderá un mensaje como correo no deseado a través del teorema bayesiano y también calculará hashes para rechazar mensajes similares en el futuro.\r\n Ten en cuenta que aprender varios mensajes puede ser lento, dependiendo de las especificaciones del servidor.",
"qitem": "Quarantine item",
"quarantine": "Cuarentena",
"quick_actions": "Acciones",
diff --git a/data/web/lang/lang.fi.json b/data/web/lang/lang.fi.json
index 12f70ee16..f76240188 100644
--- a/data/web/lang/lang.fi.json
+++ b/data/web/lang/lang.fi.json
@@ -665,7 +665,6 @@
"neutral_danger": "Neutraali/ei pisteystä",
"qhandler_success": "Pyyntö lähetettiin järjestelmään onnistuneesti. Voit nyt sulkea ikkunan.",
"qid": "Rspamd QID",
- "qinfo": "Karanteeni järjestelmä tallentaa hylätyn sähköpostin tieto kantaan, kun lähettäjä ei annetaan vaikutelma toimitetuksi sähköposti.\r\n
\"Opeta roska postiksi ja poista\" oppii viestin roska postiksi Bayes-teoreettilta ja laskee myös sumea hash kieltää samanlaisia viestejä tulevaisuudessa.\r\n
Huomaa, että useiden viestien oppiminen voi olla-riippuen järjestelmän ajasta.",
"qitem": "Laita karanteeniin",
"quarantine": "Karanteeni",
"quick_actions": "Toiminnot",
diff --git a/data/web/lang/lang.fr.json b/data/web/lang/lang.fr.json
index fb801bbcd..3e7e9b2db 100644
--- a/data/web/lang/lang.fr.json
+++ b/data/web/lang/lang.fr.json
@@ -755,7 +755,6 @@
"notified": "Notifié",
"qhandler_success": "Demande envoyée avec succès au système. Vous pouvez maintenant fermer la fenêtre.",
"qid": "Rspamd QID",
- "qinfo": "Le système de quarantaine enregistre le courrier rejeté dans la base de données, tandis que l’expéditeur ne reçoit l’impression d’un courrier livré.\r\n
\"Apprendre comme spam et supprimer\" apprendra un message comme spam via le théorème bayésien et calculera également des hachages flous pour refuser des messages similaires à l’avenir.\r\n
Veuillez noter que - selon votre système - l’apprentissage de plusieurs messages peut prendre beaucoup de temps.",
"qitem": "Élément de quarantaine",
"quarantine": "Quarantaine",
"quick_actions": "Actions",
diff --git a/data/web/lang/lang.lv.json b/data/web/lang/lang.lv.json
index 02e9b5217..57b69511e 100644
--- a/data/web/lang/lang.lv.json
+++ b/data/web/lang/lang.lv.json
@@ -377,7 +377,6 @@
"check_hash": "Meklēt faila hašu @ VT",
"empty": "Nav rezultātu",
"qid": "Rspamd QID",
- "qinfo": "Karantīnas sistēma saglabās noraidīto vēstuli datubāzē, kamēr sūtītājs nesaņems iespaidu par piegādāto pastu.",
"qitem": "Karantīnas vienumi",
"quarantine": "Karantīna",
"quick_actions": "Darbības",
diff --git a/data/web/lang/lang.nl.json b/data/web/lang/lang.nl.json
index f5fff508b..5c7ffc8d6 100644
--- a/data/web/lang/lang.nl.json
+++ b/data/web/lang/lang.nl.json
@@ -759,7 +759,6 @@
"notified": "Verwittigd",
"qhandler_success": "Aanvraag succesvol verzonden naar het systeem. Je kunt nu het venster sluiten.",
"qid": "Rspamd QID",
- "qinfo": "Het quarantainesysteem slaat geweigerde mail op, terwijl het voor de afzender lijkt alsof deze niet ontvangen is.
\"Markeer als spam en verwijder\" traint het systeem om soortgelijke mails in de toekomst opnieuw als spam te markeren.
Wanneer er op meerdere berichten tegelijkertijd wordt getraind kan dit mogelijk enige tijd duren.",
"qitem": "Quarantaine-item",
"quarantine": "Quarantaine",
"quick_actions": "Handelingen",
diff --git a/data/web/lang/lang.ro.json b/data/web/lang/lang.ro.json
index f78418af8..317bf7e23 100644
--- a/data/web/lang/lang.ro.json
+++ b/data/web/lang/lang.ro.json
@@ -744,7 +744,6 @@
"notified": "Notificat",
"qhandler_success": "Solicitare trimisă cu succes la sistem. Acum poți închide fereastra.",
"qid": "Rspamd QID",
- "qinfo": "Sistemul de carantină va salva emailurile respinse în baza de date, în timp ce expeditorului nu i se va da impresia unui email livrat.\n
\"Învață ca spam și șterge\" va învăța un mesaj ca spam prin teorema Bayesiană și va calcula, de asemenea, hash-uri fuzzy pentru a nega mesaje similare în viitor.\n
Reține că învățarea mai multor mesaje poate fi - în funcție de sistemul tău - consumatoare de timp.",
"qitem": "Pune în carantină elementul",
"quarantine": "Carantină",
"quick_actions": "Acţiuni",
diff --git a/data/web/lang/lang.ru.json b/data/web/lang/lang.ru.json
index 19e1637fd..7fe3e137f 100644
--- a/data/web/lang/lang.ru.json
+++ b/data/web/lang/lang.ru.json
@@ -754,7 +754,6 @@
"notified": "Увед.",
"qhandler_success": "Запрос успешно отправлен в систему. Теперь вы можете закрыть окно.",
"qid": "Rspamd QID",
- "qinfo": "Карантин сохраняет отклоненную почту в базу данных. Отправитель будет уверен что его письмо не было доставлено.\r\n
\"Восстановить\" изучит сообщение как хам по теореме Байеса.\r\n
\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечеткие хэши, чтобы запретить подобные сообщения в будущем.\r\n
Учтите, что в зависимости от вашей системы, изучение большого количества сообщений может занять много времени.",
"qitem": "Обьект карантина",
"quarantine": "Карантин",
"quick_actions": "Действия",
diff --git a/data/web/lang/lang.sk.json b/data/web/lang/lang.sk.json
index 027f8a5f6..ea3c7d570 100644
--- a/data/web/lang/lang.sk.json
+++ b/data/web/lang/lang.sk.json
@@ -759,7 +759,6 @@
"notified": "Notifikovaný",
"qhandler_success": "Požiadavka úspešne odoslaná systému. Môžete zavrieť okno.",
"qid": "Rspamd QID",
- "qinfo": "Karanténny systém uloží neprijatú poštu do databázy a odosielateľ nebude informovaný o jej nedoručení.\r\n
\"Naučiť ako spam a vymazať\" naučí správu ako spam pomocou Bayesian teorému a taktiež vypočíta \"fuzzy hashes\", aby sa v budúcnosti zabránilo prijímaní podobných správ.\r\n
Prosím majte na pamäti, že učenie viacerých správ naraz, môže byť – záleží na vašom systéme – časovo náročné.",
"qitem": "Karanténna položka",
"quarantine": "Karanténa",
"quick_actions": "Akcia",
diff --git a/data/web/lang/lang.sv.json b/data/web/lang/lang.sv.json
index 31724ba0c..51c4ff55a 100644
--- a/data/web/lang/lang.sv.json
+++ b/data/web/lang/lang.sv.json
@@ -764,7 +764,6 @@
"notified": "Anmält",
"qhandler_success": "Begäran skickas till systemet. Du kan nu stänga fönstret.",
"qid": "Rspamd QID",
- "qinfo": "Karantänssystemet sparar avvisade e-post meddelanden till databasen, avsändaren komer inte informeras om att e-postmeddelandet har levererats.\r\n
\"Markera och kom ihåg som skräppost och ta bort\" Kommer med hjälp av Bayes sats hitta skräppost och samtidigt kalkylera en kontrollsumma för att i framtiden kasta liknande meddelanden automatiskt.\r\n
Observera att det kan vara tidskrävande att processa dessa meddelanden, beroende på hur kraftfullt system är.
Svartlistade objekt undantas från karantän.",
"qitem": "Objekt i karantän",
"quarantine": "Karantän",
"quick_actions": "Åtgärder",
diff --git a/data/web/lang/lang.zh.json b/data/web/lang/lang.zh.json
index 670030916..2cdf73759 100644
--- a/data/web/lang/lang.zh.json
+++ b/data/web/lang/lang.zh.json
@@ -763,7 +763,6 @@
"notified": "已通知",
"qhandler_success": "成功向系统发送请求,现在你可以关闭窗口了。",
"qid": "Rspamd QID",
- "qinfo": "隔离系统会将已拒绝邮件保存到数据库,并且这些邮件的发件人不会收到拒收邮件。\r\n
\"学习为垃圾并删除\" 会根据贝叶斯定理将消息作为垃圾学习并计算其模糊特征以拒绝未来收到相似消息。\r\n
请注意,取决于你的系统资源,学习多个消息可能会花费较长时间。",
"qitem": "隔离项目",
"quarantine": "隔离",
"quick_actions": "操作",
diff --git a/data/web/mailbox.php b/data/web/mailbox.php
index bb42c5859..657d88e58 100644
--- a/data/web/mailbox.php
+++ b/data/web/mailbox.php
@@ -10,6 +10,14 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];