瀏覽代碼

[Web] More custom_params

andryyy 4 年之前
父節點
當前提交
b9a8b8a3e7

+ 4 - 16
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;
+}

+ 4 - 0
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

+ 7 - 0
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 = "";
             }

+ 12 - 8
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)) {

+ 4 - 2
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`"); 

+ 10 - 3
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('<p style="font-family:monospace">' + value + '</p>');
         });
@@ -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('<span class="label-rspamd-action label label-warning"><b>' + data.score + '</b> - ' + lang.junk_folder + '</span>');
+        } else {
+          $('#qid_detail_score').append('<span class="label-rspamd-action label label-danger"><b>' + data.score + '</b> - ' + lang.rejected + '</span>');
+        }
+      }
       if (typeof data.recipients !== 'undefined') {
         $.each(data.recipients, function(index, value) {
           var elem = $('<span class="mail-address-item"></span>');

+ 20 - 8
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 = '<span class="dot-danger"></span>';
+              item.virus = '<span class="label label-danger">' + lang.high_danger + '</span>';
             } else {
-              item.virus = '<span class="dot-neutral"></span>';
+              item.virus = '<span class="label label-default">' + lang.neutral_danger + '</span>';
+            }
+            if (item.action === "reject") {
+              item.rspamdaction = '<span class="label label-danger">' + lang.rejected + '</span>';
+            } else if (item.action === "add header") {
+              item.rspamdaction = '<span class="label label-warning">' + lang.junk_folder + '</span>';
             }
             if(item.notified > 0) {
               item.notified = '&#10004;';
@@ -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('<p style="font-family:monospace">' + value + '</p>');
           });
         } 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('<span class="label-rspamd-action label label-warning"><b>' + data.score + '</b> - ' + lang.junk_folder + '</span>');
+          } else {
+            $('#qid_detail_score').append('<span class="label-rspamd-action label label-danger"><b>' + data.score + '</b> - ' + lang.rejected + '</span>');
+          }
+        }
         if (typeof data.recipients !== 'undefined') {
           $.each(data.recipients, function(index, value) {
             var elem = $('<span class="mail-address-item"></span>');
@@ -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('');

+ 0 - 1
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 <em>no</em> lliurat.",
         "qitem": "Element en quarantena",
         "quarantine": "Quarantena",
         "quick_actions": "Accions",

+ 0 - 1
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 <em>nebude</em> informován o nedoručené poště.\r\n  <br>\"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  <br>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",

+ 16 - 6
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 <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.\r\n  <br>\"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  <br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.<br>Auf Blacklists vorkommende Elemente sind von der Quarantäne ausgeschlossen.",
+        "qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n  <br>\"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  <br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.<br>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 <b>immer</b> 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 <b>immer</b> 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\".",

+ 15 - 5
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 <em>not</em> be given the impression of a delivered mail.\r\n  <br>\"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  <br>Please be aware that learning multiple messages can be - depending on your system - time consuming.<br>Blacklisted elements are excluded from the quarantine.",
+        "qinfo": "The quarantine system will save rejected mail to the database (the sender will <em>not</em> 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  <br>\"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  <br>Please be aware that learning multiple messages can be - depending on your system - time consuming.<br>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 <b>always</b> 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 <b>always</b> classify as spam and reject. Rejected mail will <b>not</b> 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\".",

+ 0 - 1
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 <em>no</em> tendrá la impresión de un correo entregado.\r\n  <br><b>Aprender como spam y eliminar</b> 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",

+ 0 - 1
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ä <em>ei</em> annetaan vaikutelma toimitetuksi sähköposti.\r\n  <br>\"Opeta roska postiksi ja poista\" oppii viestin roska postiksi Bayes-teoreettilta ja laskee myös sumea hash kieltää samanlaisia viestejä tulevaisuudessa.\r\n  <br>Huomaa, että useiden viestien oppiminen voi olla-riippuen järjestelmän ajasta.",
         "qitem": "Laita karanteeniin",
         "quarantine": "Karanteeni",
         "quick_actions": "Toiminnot",

+ 0 - 1
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 <em>ne</em> reçoit l’impression d’un courrier livré.\r\n  <br>\"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  <br>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",

+ 0 - 1
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 <em> nesaņems </em> iespaidu par piegādāto pastu.",
         "qitem": "Karantīnas vienumi",
         "quarantine": "Karantīna",
         "quick_actions": "Darbības",

+ 0 - 1
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 <em>niet</em> ontvangen is.<br>\"Markeer als spam en verwijder\" traint het systeem om soortgelijke mails in de toekomst opnieuw als spam te markeren.<br>Wanneer er op meerdere berichten tegelijkertijd wordt getraind kan dit mogelijk enige tijd duren.",
         "qitem": "Quarantaine-item",
         "quarantine": "Quarantaine",
         "quick_actions": "Handelingen",

+ 0 - 1
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 <em>nu</em> i se va da impresia unui email livrat.\n  <br>\"Î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  <br>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",

+ 0 - 1
data/web/lang/lang.ru.json

@@ -754,7 +754,6 @@
         "notified": "Увед.",
         "qhandler_success": "Запрос успешно отправлен в систему. Теперь вы можете закрыть окно.",
         "qid": "Rspamd QID",
-        "qinfo": "Карантин сохраняет отклоненную почту в базу данных. Отправитель будет уверен что его письмо <b>не</b> было доставлено.\r\n  <br>\"Восстановить\" изучит сообщение как хам по теореме Байеса.\r\n  <br>\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечеткие хэши, чтобы запретить подобные сообщения в будущем.\r\n  <br>Учтите, что в зависимости от вашей системы, изучение большого количества сообщений может занять много времени.",
         "qitem": "Обьект карантина",
         "quarantine": "Карантин",
         "quick_actions": "Действия",

+ 0 - 1
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ľ <em>nebude</em> informovaný o jej nedoručení.\r\n  <br>\"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  <br>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",

+ 0 - 1
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 <b>inte</b> informeras om att e-postmeddelandet har levererats.\r\n  <br>\"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<br>Observera att det kan vara tidskrävande att processa dessa meddelanden, beroende på hur kraftfullt system är.<br>Svartlistade objekt undantas från karantän.",
         "qitem": "Objekt i karantän",
         "quarantine": "Karantän",
         "quick_actions": "Åtgärder",

+ 0 - 1
data/web/lang/lang.zh.json

@@ -763,7 +763,6 @@
         "notified": "已通知",
         "qhandler_success": "成功向系统发送请求,现在你可以关闭窗口了。",
         "qid": "Rspamd QID",
-        "qinfo": "隔离系统会将已拒绝邮件保存到数据库,并且这些邮件的发件人<em>不会</em>收到拒收邮件。\r\n  <br>\"学习为垃圾并删除\" 会根据贝叶斯定理将消息作为垃圾学习并计算其模糊特征以拒绝未来收到相似消息。\r\n  <br>请注意,取决于你的系统资源,学习多个消息可能会花费较长时间。",
         "qitem": "隔离项目",
         "quarantine": "隔离",
         "quick_actions": "操作",

+ 19 - 0
data/web/mailbox.php

@@ -10,6 +10,14 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
   <ul class="nav nav-tabs" role="tablist">
     <li role="presentation" class="active"><a href="#tab-domains" aria-controls="tab-domains" role="tab" data-toggle="tab"><?=$lang['mailbox']['domains'];?></a></li>
     <li role="presentation"><a href="#tab-mailboxes" aria-controls="tab-mailboxes" role="tab" data-toggle="tab"><?=$lang['mailbox']['mailboxes'];?></a></li>
+    <?php /* <li class="dropdown">
+      <a class="dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['mailbox']['mailboxes'];?>
+      <span class="caret"></span></a>
+      <ul class="dropdown-menu">
+        <li role="presentation"><a href="#tab-mailboxes" aria-controls="tab-mailboxes" role="tab" data-toggle="tab"><?=$lang['mailbox']['mailboxes'];?></a></li>
+        <li role="presentation"><a href="#tab-mailbox-defaults" aria-controls="tab-mailbox-defaults" role="tab" data-toggle="tab"><?=$lang['mailbox']['mailbox_defaults'];?></a></li>
+      </ul>
+    </li> */ ?>
     <li role="presentation"><a href="#tab-resources" aria-controls="tab-resources" role="tab" data-toggle="tab"><?=$lang['mailbox']['resources'];?></a></li>
     <li class="dropdown">
       <a class="dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['mailbox']['aliases'];?>
@@ -72,6 +80,17 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
           </div>
         </div>
 
+        <div role="tabpanel" class="tab-pane" id="tab-mailbox-defaults">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <?=$lang['mailbox']['mailbox_defaults'];?>
+            </div>
+            <div class="panel-body help-block">
+            <?=$lang['mailbox']['mailbox_defaults_info'];?>
+            </div>
+          </div>
+        </div>
+
         <div role="tabpanel" class="tab-pane" id="tab-mailboxes">
           <div class="panel panel-default">
             <div class="panel-heading">

+ 9 - 8
data/web/modals/quarantine.php

@@ -16,6 +16,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
         <div class="form-group">
           <label for="qid_detail_symbols"><h4><?=$lang['quarantine']['rspamd_result'];?>:</h4></label>
           <p><?=$lang['quarantine']['spam_score'];?>: <span id="qid_detail_score"></span></p>
+          <hr>
           <p id="qid_detail_symbols"></p>
         </div>
         <div class="form-group">
@@ -26,10 +27,6 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
           <label for="qid_detail_recipients"><h4><?=$lang['quarantine']['recipients'];?>:</h4></label>
           <p id="qid_detail_recipients"></p>
         </div>
-        <div class="form-group">
-          <label for="qid_detail_fuzzy"><h4>Fuzzy Hashes:</h4></label>
-          <p id="qid_detail_fuzzy"></p>
-        </div>
         <div class="form-group">
           <label for="qid_detail_hfrom"><h4><?=$lang['quarantine']['sender_header'];?>:</h4></label>
           <p><span class="mail-address-item" id="qid_detail_hfrom"></span></p>
@@ -39,27 +36,31 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
           <p><span class="mail-address-item" id="qid_detail_efrom"></span></p>
         </div>
         <div class="form-group">
+          <label for="qid_detail_fuzzy"><h4>Fuzzy Hashes:</h4></label>
+          <p id="qid_detail_fuzzy"></p>
+        </div>
+        <div class="form-group" id="qTextPlain">
           <label for="qid_detail_text"><h4><?=$lang['quarantine']['text_plain_content'];?>:</h4></label>
           <pre id="qid_detail_text"></pre>
         </div>
-        <div class="form-group">
+        <div class="form-group" id="qTextHtml">
           <label for="qid_detail_text_from_html"><h4><?=$lang['quarantine']['text_from_html_content'];?>:</h4></label>
           <pre id="qid_detail_text_from_html"></pre>
         </div>
         <?php
-        if ($_SESSION['acl']['quarantine_attachments'] == 1):
+        if ($_SESSION['acl']['quarantine_attachments'] == 1) {
         ?>
         <div class="form-group">
           <label for="qid_detail_atts"><h4><?=$lang['quarantine']['atts'];?>:</h4></label>
           <div id="qid_detail_atts">-</div>
         </div>
         <?php
-        endif;
+        }
         ?>
         <div class="btn-group dropup" data-acl="<?=$_SESSION['acl']['quarantine'];?>">
           <a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['quarantine']['quick_actions'];?> <span class="caret"></span></a>
           <ul class="dropdown-menu">
-            <li><a data-action="edit_selected" data-id="qitems_single" data-item="" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['release'];?></a></li>
+            <li><a data-action="edit_selected" data-id="qitems_single" data-item="" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['deliver_inbox'];?></a></li>
             <li role="separator" class="divider"></li>
             <li><a data-action="edit_selected" data-id="qitems_single" data-item="" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#"><?=$lang['quarantine']['learn_spam_delete'];?></a></li>
             <li role="separator" class="divider"></li>

+ 35 - 47
data/web/qhandler.php

@@ -25,7 +25,6 @@ if (preg_match("/^([a-f0-9]{64})$/", $_POST['quick_release']) || preg_match("/^(
 }
 elseif (in_array($_GET['action'], array('release', 'delete'))) {
   if (preg_match("/^([a-f0-9]{64})$/", $_GET['hash'])) {
-    if ($_GET['action'] == "release"):
 ?>
 <div class="container">
   <div class="row">
@@ -33,7 +32,18 @@ elseif (in_array($_GET['action'], array('release', 'delete'))) {
       <div class="panel panel-default">
         <div class="panel-heading"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> <?= $lang['header']['quarantine']; ?></div>
         <div class="panel-body">
-          <legend data-hash="<?=$_GET['hash'];?>"><?=$lang['quarantine']['release'];?></legend>
+<?php
+if ($_GET['action'] == "release") {
+?>
+          <legend id="qtitle" data-hash="<?=$_GET['hash'];?>"><?=$lang['quarantine']['release'];?></legend>
+<?php
+}
+elseif ($_GET['action'] == "delete") {
+?>
+          <legend id="qtitle" data-hash="<?=$_GET['hash'];?>"><?=$lang['quarantine']['remove'];?></legend>
+<?php
+}
+?>
             <div id="qid_error" style="display:none" class="alert alert-danger"></div>
             <div class="form-group">
               <label for="qid_detail_symbols"><h4><?=$lang['quarantine']['rspamd_result'];?>:</h4></label>
@@ -60,62 +70,40 @@ elseif (in_array($_GET['action'], array('release', 'delete'))) {
               <label for="qid_detail_fuzzy"><h4>Fuzzy Hashes:</h4></label>
               <p id="qid_detail_fuzzy"></p>
             </div>
-            <form method="post" autofill="off">
-            <div class="form-group">
-              <button type="submit" class="btn btn-success" name="quick_release" value="<?=$_GET['hash'];?>"><?= $lang['tfa']['confirm']; ?></button>
-            </div>
-            </form>
-        </div>
-      </div>
-    </div>
-  </div> <!-- /row -->
-</div> <!-- /container -->
+            <div id="qactions">
+              <form method="post" autofill="off">
+                <div class="form-group">
 <?php
-    elseif ($_GET['action'] == "delete"):
+if ($_GET['action'] == "release") {
 ?>
-<div class="container">
-  <div class="row">
-    <div class="col-md-offset-2 col-md-8">
-      <div class="panel panel-default">
-        <div class="panel-heading"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> <?= $lang['header']['quarantine']; ?></div>
-        <div class="panel-body">
-          <legend data-hash="<?=$_GET['hash'];?>"><?=$lang['quarantine']['remove'];?></legend>
-            <div id="qid_error" style="display:none" class="alert alert-danger"></div>
-            <div class="form-group">
-              <label for="qid_detail_symbols"><h4><?=$lang['quarantine']['rspamd_result'];?>:</h4></label>
-              <p><?=$lang['quarantine']['spam_score'];?>: <span id="qid_detail_score"></span></p>
-              <p id="qid_detail_symbols"></p>
-            </div>
-            <div class="form-group">
-              <label for="qid_detail_subj"><h4><?=$lang['quarantine']['subj'];?>:</h4></label>
-              <p id="qid_detail_subj"></p>
-            </div>
-            <div class="form-group">
-              <label for="qid_detail_hfrom"><h4><?=$lang['quarantine']['sender_header'];?>:</h4></label>
-              <p><span class="mail-address-item" id="qid_detail_hfrom"></span></p>
-            </div>
-            <div class="form-group">
-              <label for="qid_detail_efrom"><h4><?=$lang['quarantine']['sender'];?>:</h4></label>
-              <p><span class="mail-address-item" id="qid_detail_efrom"></span></p>
-            </div>
-            <div class="form-group">
-              <label for="qid_detail_recipients"><h4><?=$lang['quarantine']['recipients'];?>:</h4></label>
-              <p id="qid_detail_recipients"></p>
-            </div>
-            <form method="post" autofill="off">
-            <div class="form-group">
-              <button type="submit" class="btn btn-success" name="quick_delete" value="<?=$_GET['hash'];?>"><?= $lang['tfa']['confirm']; ?></button>
+                  <button type="submit" class="btn btn-success" name="quick_release" value="<?=$_GET['hash'];?>"><?= $lang['quarantine']['confirm']; ?></button>
+<?php
+}
+elseif ($_GET['action'] == "delete") {
+?>
+                  <button type="submit" class="btn btn-success" name="quick_delete" value="<?=$_GET['hash'];?>"><?= $lang['quarantine']['confirm']; ?></button>
+<?php
+}
+?>
+                </div>
+              </form>
             </div>
-            </form>
         </div>
       </div>
     </div>
   </div> <!-- /row -->
 </div> <!-- /container -->
 <?php
-    endif;
   }
 }
+?>
+<script type='text/javascript'>
+<?php
+$lang_quarantine = json_encode($lang['quarantine']);
+echo "var lang = ". $lang_quarantine . ";\n";
+?>
+</script>
+<?php
 $js_minifier->add('/web/js/site/qhandler.js');
 require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php';
 ?>

+ 3 - 8
data/web/quarantine.php

@@ -45,7 +45,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
             <a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="qitems" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['quarantine']['toggle_all'];?></a>
             <a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['quarantine']['quick_actions'];?> <span class="caret"></span></a>
             <ul class="dropdown-menu">
-              <li><a data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['release'];?></a></li>
+              <li><a data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['deliver_inbox'];?></a></li>
               <li role="separator" class="divider"></li>
               <li><a data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#"><?=$lang['quarantine']['learn_spam_delete'];?></a></li>
               <li role="separator" class="divider"></li>
@@ -53,11 +53,6 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
             </ul>
           </div>
         </div>
-        <hr>
-        <div class="panel-body help-block">
-        <p><span class="dot-danger"></span> <?=$lang['quarantine']['high_danger'];?></p>
-        <p><span class="dot-neutral"></span> <?=$lang['quarantine']['neutral_danger'];?></p>
-        </div>
       </div>
     </div> <!-- /col-md-12 -->
   </div> <!-- /row -->
@@ -67,9 +62,9 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/quarantine.php';
 ?>
 <script type='text/javascript'>
 <?php
-$lang_mailbox = json_encode($lang['quarantine']);
+$lang_quarantine = json_encode($lang['quarantine']);
 echo "var acl = '". json_encode($_SESSION['acl']) . "';\n";
-echo "var lang = ". $lang_mailbox . ";\n";
+echo "var lang = ". $lang_quarantine . ";\n";
 echo "var csrf_token = '". $_SESSION['CSRF']['TOKEN'] . "';\n";
 $role = ($_SESSION['mailcow_cc_role'] == "admin") ? 'admin' : 'domainadmin';
 echo "var role = '". $role . "';\n";