diff --git a/data/web/css/site/quarantine.css b/data/web/css/site/quarantine.css
index 7e46b814..7a127498 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 74898c64..5eca2319 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 5369ab74..0ca2253b 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 3518fc6f..b240587f 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 a2e48ef6..0e7eeb9c 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 2690ce44..a0534804 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 685b8861..5728c885 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 6c85b9b0..1301177f 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 0a624315..dccdc22d 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 64ca78fb..a16d3f93 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 af7bb2af..1906cd15 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 b98921d0..4e78b6fb 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 12f70ee1..f7624018 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 fb801bbc..3e7e9b2d 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 02e9b521..57b69511 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 f5fff508..5c7ffc8d 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 f78418af..317bf7e2 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 19e1637f..7fe3e137 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 027f8a5f..ea3c7d57 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 31724ba0..51c4ff55 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 67003091..2cdf7375 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 bb42c585..657d88e5 100644
--- a/data/web/mailbox.php
+++ b/data/web/mailbox.php
@@ -10,6 +10,14 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];