Pārlūkot izejas kodu

[Rspamd] More pushover options

andryyy 5 gadi atpakaļ
vecāks
revīzija
c67bb75071

+ 35 - 7
data/conf/rspamd/meta_exporter/pushover.php

@@ -51,8 +51,20 @@ $headers = getallheaders();
 
 
 $qid      = $headers['X-Rspamd-Qid'];
 $qid      = $headers['X-Rspamd-Qid'];
 $rcpts    = $headers['X-Rspamd-Rcpt'];
 $rcpts    = $headers['X-Rspamd-Rcpt'];
+$sender   = $headers['X-Rspamd-From'];
 $ip       = $headers['X-Rspamd-Ip'];
 $ip       = $headers['X-Rspamd-Ip'];
 $subject  = $headers['X-Rspamd-Subject'];
 $subject  = $headers['X-Rspamd-Subject'];
+$priority = 0;
+
+$symbols_array = json_decode($headers['X-Rspamd-Symbols'], true);
+if (is_array($symbols_array)) {
+  foreach ($symbols_array as $symbol) {
+    if ($symbol['name'] == 'HAS_X_PRIO_ONE') {
+      $priority = 2;
+      break;
+    }
+  }
+}
 
 
 $rcpt_final_mailboxes = array();
 $rcpt_final_mailboxes = array();
 
 
@@ -177,7 +189,7 @@ foreach (json_decode($rcpts, true) as $rcpt) {
 
 
 
 
 foreach ($rcpt_final_mailboxes as $rcpt_final) {
 foreach ($rcpt_final_mailboxes as $rcpt_final) {
-  error_log("NOTIFY: pushover pipe: processing pushover message for rcpt " . $rcpt_final . PHP_EOL);
+  error_log("NOTIFY: pushover pipe: processing pushover message for rcpt " . $rcpt_final . " with priority " . $priority . PHP_EOL);
   $stmt = $pdo->prepare("SELECT * FROM `pushover`
   $stmt = $pdo->prepare("SELECT * FROM `pushover`
     WHERE `username` = :username AND `active` = '1'");
     WHERE `username` = :username AND `active` = '1'");
   $stmt->execute(array(
   $stmt->execute(array(
@@ -187,14 +199,30 @@ foreach ($rcpt_final_mailboxes as $rcpt_final) {
   if (isset($api_data['key']) && isset($api_data['token'])) {
   if (isset($api_data['key']) && isset($api_data['token'])) {
     $title = (!empty($api_data['title'])) ? $api_data['title'] : 'Mail';
     $title = (!empty($api_data['title'])) ? $api_data['title'] : 'Mail';
     $text = (!empty($api_data['text'])) ? $api_data['text'] : 'You\'ve got mail 📧';
     $text = (!empty($api_data['text'])) ? $api_data['text'] : 'You\'ve got mail 📧';
+    $attributes = json_decode($api_data['attributes'], true);
+    $senders = explode(',', $api_data['senders']);
+    if (!empty($senders) && !in_array($sender, $senders)) {
+      error_log("NOTIFY: pushover pipe: skipping unwanted sender " . $sender);
+      continue;
+    }
+    if ($attributes['only_x_prio'] == "1" && $priority == 0) {
+      error_log("NOTIFY: pushover pipe: mail has no X-Priority: 1 header, skipping");
+      continue;
+    }
+    $post_fields = array(
+      "token" => $api_data['token'],
+      "user" => $api_data['key'],
+      "title" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $title)),
+      "priority" => $priority,
+      "message" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $text))
+    );
+    if ($attributes['evaluate_x_prio'] == "1" && $priority == 2) {
+      $post_fields['expire'] = 600;
+      $post_fields['retry'] = 120;
+    }
     curl_setopt_array($ch = curl_init(), array(
     curl_setopt_array($ch = curl_init(), array(
       CURLOPT_URL => "https://api.pushover.net/1/messages.json",
       CURLOPT_URL => "https://api.pushover.net/1/messages.json",
-      CURLOPT_POSTFIELDS => array(
-    "token" => $api_data['token'],
-    "user" => $api_data['key'],
-    "title" => $title,
-    "message" => sprintf("%s", str_replace('{SUBJECT}', $subject, $text))
-      ),
+      CURLOPT_POSTFIELDS => $post_fields,
       CURLOPT_SAFE_UPLOAD => true,
       CURLOPT_SAFE_UPLOAD => true,
       CURLOPT_RETURNTRANSFER => true,
       CURLOPT_RETURNTRANSFER => true,
     ));
     ));

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 0
data/web/edit.php


+ 8 - 0
data/web/inc/functions.mailbox.inc.php

@@ -3756,6 +3756,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $stmt->execute(array(
             $stmt->execute(array(
               ':domain' => '%@'.$domain,
               ':domain' => '%@'.$domain,
             ));
             ));
+            $stmt = $pdo->prepare("DELETE FROM `pushover` WHERE `username` LIKE :domain");
+            $stmt->execute(array(
+              ':domain' => '%@'.$domain,
+            ));
             $stmt = $pdo->prepare("DELETE FROM `quota2replica` WHERE `username` LIKE :domain");
             $stmt = $pdo->prepare("DELETE FROM `quota2replica` WHERE `username` LIKE :domain");
             $stmt->execute(array(
             $stmt->execute(array(
               ':domain' => '%@'.$domain,
               ':domain' => '%@'.$domain,
@@ -3954,6 +3958,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $stmt->execute(array(
             $stmt->execute(array(
               ':username' => $username
               ':username' => $username
             ));
             ));
+            $stmt = $pdo->prepare("DELETE FROM `pushover` WHERE `username` = :username");
+            $stmt->execute(array(
+              ':username' => $username
+            ));
             $stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `rcpt` = :username");
             $stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `rcpt` = :username");
             $stmt->execute(array(
             $stmt->execute(array(
               ':username' => $username
               ':username' => $username

+ 26 - 2
data/web/inc/functions.pushover.inc.php

@@ -43,6 +43,21 @@ function pushover($_action, $_data = null) {
         }
         }
         $key = $_data['key'];
         $key = $_data['key'];
         $token = $_data['token'];
         $token = $_data['token'];
+        $evaluate_x_prio = $_data['evaluate_x_prio'];
+        $only_x_prio = $_data['only_x_prio'];
+        $senders = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['senders']));
+        foreach ($senders as $i => &$sender) {
+          if (empty($sender)) {
+            continue;
+          }
+          if (!filter_var($sender, FILTER_VALIDATE_EMAIL) === true) {
+            unset($senders[$i]);
+            continue;
+          }
+        }
+        $senders = array_filter($senders);
+        if (empty($senders)) { $senders = ''; }
+        $senders = implode(",", $senders);
         if (!ctype_alnum($key) || strlen($key) != 30) {
         if (!ctype_alnum($key) || strlen($key) != 30) {
           $_SESSION['return'][] = array(
           $_SESSION['return'][] = array(
             'type' => 'danger',
             'type' => 'danger',
@@ -62,11 +77,19 @@ function pushover($_action, $_data = null) {
         $title = $_data['title'];
         $title = $_data['title'];
         $text = $_data['text'];
         $text = $_data['text'];
         $active = intval($_data['active']);
         $active = intval($_data['active']);
-        $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `token`, `title`, `text`, `active`)
-          VALUES (:username, :key, :token, :title, :text, :active)");
+        $po_attributes = json_encode(
+          array(
+            'evaluate_x_prio' => strval(intval($evaluate_x_prio)),
+            'only_x_prio' => strval(intval($only_x_prio))
+          )
+        );
+        $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `attributes`, `senders`, `token`, `title`, `text`, `active`)
+          VALUES (:username, :key, :po_attributes, :senders, :token, :title, :text, :active)");
         $stmt->execute(array(
         $stmt->execute(array(
           ':username' => $username,
           ':username' => $username,
           ':key' => $key,
           ':key' => $key,
+          ':po_attributes' => $po_attributes,
+          ':senders' => $senders,
           ':token' => $token,
           ':token' => $token,
           ':title' => $title,
           ':title' => $title,
           ':text' => $text,
           ':text' => $text,
@@ -93,6 +116,7 @@ function pushover($_action, $_data = null) {
         ':username' => $_data
         ':username' => $_data
       ));
       ));
       $data = $stmt->fetch(PDO::FETCH_ASSOC);
       $data = $stmt->fetch(PDO::FETCH_ASSOC);
+      $data['attributes'] = json_decode($data['attributes'], true);
       if (empty($data)) {
       if (empty($data)) {
         return false;
         return false;
       }
       }

+ 8 - 1
data/web/inc/init_db.inc.php

@@ -3,7 +3,7 @@ function init_db_schema() {
   try {
   try {
     global $pdo;
     global $pdo;
 
 
-    $db_version = "09042020_1403";
+    $db_version = "16042020_1004";
 
 
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -837,8 +837,10 @@ function init_db_schema() {
           "username" => "VARCHAR(255) NOT NULL",
           "username" => "VARCHAR(255) NOT NULL",
           "key" => "VARCHAR(255) NOT NULL",
           "key" => "VARCHAR(255) NOT NULL",
           "token" => "VARCHAR(255) NOT NULL",
           "token" => "VARCHAR(255) NOT NULL",
+          "attributes" => "JSON",
           "title" => "TEXT",
           "title" => "TEXT",
           "text" => "TEXT",
           "text" => "TEXT",
+          "senders" => "TEXT",
           "active" => "TINYINT(1) NOT NULL DEFAULT '1'"
           "active" => "TINYINT(1) NOT NULL DEFAULT '1'"
         ),
         ),
         "keys" => array(
         "keys" => array(
@@ -1142,6 +1144,11 @@ function init_db_schema() {
     $stmt = $pdo->query("DELETE FROM `da_acl` WHERE `username` NOT IN (SELECT `username`FROM `domain_admins`);");
     $stmt = $pdo->query("DELETE FROM `da_acl` WHERE `username` NOT IN (SELECT `username`FROM `domain_admins`);");
 
 
     // Migrate attributes
     // Migrate attributes
+    // pushover
+    $stmt = $pdo->query("UPDATE `pushover` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;");
+    $stmt = $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.evaluate_x_prio', \"0\") WHERE JSON_EXTRACT(`attributes`, '$.evaluate_x_prio') IS NULL;");
+    $stmt = $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.only_x_prio', \"0\") WHERE JSON_EXTRACT(`attributes`, '$.only_x_prio') IS NULL;");
+    // mailbox
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;");
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;");
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.force_pw_update', \"0\") WHERE JSON_EXTRACT(`attributes`, '$.force_pw_update') IS NULL;");
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.force_pw_update', \"0\") WHERE JSON_EXTRACT(`attributes`, '$.force_pw_update') IS NULL;");
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sogo_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.sogo_access') IS NULL;");
     $stmt = $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sogo_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.sogo_access') IS NULL;");

+ 8 - 2
data/web/lang/lang.de.json

@@ -236,7 +236,9 @@
         "title": "Title",
         "title": "Title",
         "pushover_title": "Notification Titel",
         "pushover_title": "Notification Titel",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Notification Text ({SUBJECT} entspricht dem Mail-Betreff)",
+        "pushover_text": "Notification Text",
+        "pushover_vars": "Verwendbare Variablen für Titel und Text (Datenschutzrichtlinien beachten)",
+        "pushover_sender_array": "Nur folgende Sender E-Mail-Adressen berücksichtigen <small>(getrennt durch Komma)</small>",
         "last_mail_login": "Letzter Mail-Login",
         "last_mail_login": "Letzter Mail-Login",
         "no_last_login": "Keine letzte UI Anmeldung gespeichert",
         "no_last_login": "Keine letzte UI Anmeldung gespeichert",
         "save": "Änderungen speichern",
         "save": "Änderungen speichern",
@@ -354,7 +356,9 @@
         "title": "Title",
         "title": "Title",
         "pushover_title": "Notification Titel",
         "pushover_title": "Notification Titel",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Notification Text ({SUBJECT} entspricht dem Mail-Betreff)",
+        "pushover_text": "Notification Text",
+        "pushover_vars": "Verwendbare Variablen für Titel und Text (Datenschutzrichtlinien beachten)",
+        "pushover_sender_array": "Nur folgende Sender E-Mail-Adressen berücksichtigen <small>(getrennt durch Komma)</small>",
         "spamfilter": "Spamfilter",
         "spamfilter": "Spamfilter",
         "domain_s": "Domain(s)",
         "domain_s": "Domain(s)",
         "rspamd-com_settings": "Ein Name wird automatisch generiert. Beispielinhalte zur Einsicht stehen nachstehend bereit. Siehe auch <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
         "rspamd-com_settings": "Ein Name wird automatisch generiert. Beispielinhalte zur Einsicht stehen nachstehend bereit. Siehe auch <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
@@ -721,6 +725,8 @@
         "sieve_preset_7": "Weiterleiten und behalten oder verwerfen"
         "sieve_preset_7": "Weiterleiten und behalten oder verwerfen"
     },
     },
     "edit": {
     "edit": {
+        "evaluate_x_prio": "Hohe Priorität eskalieren [<code>X-Priority: 1</code>]",
+        "only_x_prio": "Nur Mail mit hoher Priorität berücksichtigen [<code>X-Priority: 1</code>]",
         "generate": "generieren",
         "generate": "generieren",
         "app_name": "App Name",
         "app_name": "App Name",
         "app_passwd": "App Passwörter",
         "app_passwd": "App Passwörter",

+ 9 - 3
data/web/lang/lang.en.json

@@ -236,7 +236,9 @@
         "title": "Title",
         "title": "Title",
         "pushover_title": "Notification title",
         "pushover_title": "Notification title",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Notification text ({SUBJECT} will be replaced by mail subject)",
+        "pushover_text": "Notification text",
+        "pushover_vars": "Useable variables for text and title (please take note of data protection)",
+        "pushover_sender_array": "Only consider the following sender email addresses <small>(comma-separated)</small>",
         "no_last_login": "No last UI login information",
         "no_last_login": "No last UI login information",
         "last_mail_login": "Last mail login",
         "last_mail_login": "Last mail login",
         "save": "Save changes",
         "save": "Save changes",
@@ -354,7 +356,9 @@
         "title": "Title",
         "title": "Title",
         "pushover_title": "Notification title",
         "pushover_title": "Notification title",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Notification text ({SUBJECT} will be replaced by mail subject)",
+        "pushover_text": "Notification text",
+        "pushover_vars": "Useable variables for text and title (please take note of data protection)",
+        "pushover_sender_array": "Only consider the following sender email addresses <small>(comma-separated)</small>",
         "spamfilter": "Spam filter",
         "spamfilter": "Spam filter",
         "domain": "Domain",
         "domain": "Domain",
         "domain_s": "Domain/s",
         "domain_s": "Domain/s",
@@ -720,8 +724,10 @@
         "sieve_preset_7": "Redirect and keep/drop"
         "sieve_preset_7": "Redirect and keep/drop"
     },
     },
     "edit": {
     "edit": {
-        "generate": "generate",
+        "evaluate_x_prio": "Escalate high priority mail [<code>X-Priority: 1</code>]",
+        "only_x_prio": "Only consider high priority mail [<code>X-Priority: 1</code>]",
         "app_name": "App name",
         "app_name": "App name",
+        "generate": "generate",
         "app_passwd": "App password",
         "app_passwd": "App password",
         "sogo_visible": "Alias is visible in SOGo",
         "sogo_visible": "Alias is visible in SOGo",
         "sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
         "sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",

+ 2 - 2
data/web/lang/lang.ru.json

@@ -207,7 +207,7 @@
     "priority": "Приоритет",
     "priority": "Приоритет",
     "private_key": "Закрытый ключ",
     "private_key": "Закрытый ключ",
     "pushover_info": "Настройки Push-уведомления будут применяться ко всей не-спам почте доставляемой на <b>%s</b> включая псевдонимы (общие, не общие и с метками).",
     "pushover_info": "Настройки Push-уведомления будут применяться ко всей не-спам почте доставляемой на <b>%s</b> включая псевдонимы (общие, не общие и с метками).",
-    "pushover_text": "Текст уведомления ({SUBJECT} будет заменён на тему письма)",
+    "pushover_text": "Текст уведомления",
     "pushover_title": "Заголовок уведомления",
     "pushover_title": "Заголовок уведомления",
     "pushover_verify": "Проверить доступ",
     "pushover_verify": "Проверить доступ",
     "quarantine": "Карантин",
     "quarantine": "Карантин",
@@ -902,7 +902,7 @@
     "password_now": "Текущий пароль (подтверждение изменения)",
     "password_now": "Текущий пароль (подтверждение изменения)",
     "password_repeat": "Подтверждение пароля (повтор)",
     "password_repeat": "Подтверждение пароля (повтор)",
     "pushover_info": "Настройки Push-уведомления будут применяться ко всей не-спам почте доставляемой на <b>%s</b> включая псевдонимы (общие, не общие и с метками).",
     "pushover_info": "Настройки Push-уведомления будут применяться ко всей не-спам почте доставляемой на <b>%s</b> включая псевдонимы (общие, не общие и с метками).",
-    "pushover_text": "Текст уведомления ({SUBJECT} будет заменён на тему письма)",
+    "pushover_text": "Текст уведомления",
     "pushover_title": "Заголовок уведомления",
     "pushover_title": "Заголовок уведомления",
     "pushover_verify": "Проверить доступ",
     "pushover_verify": "Проверить доступ",
     "quarantine_notification": "Уведомления о спаме",
     "quarantine_notification": "Уведомления о спаме",

+ 2 - 2
data/web/lang/lang.sv.json

@@ -236,7 +236,7 @@
         "title": "Titel",
         "title": "Titel",
         "pushover_title": "Meddelande titel",
         "pushover_title": "Meddelande titel",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Meddelandetext ({SUBJECT} byts ut mot ämnesraden)",
+        "pushover_text": "Meddelandetext",
         "last_mail_login": "Senaste inloggningen",
         "last_mail_login": "Senaste inloggningen",
         "no_last_login": "Senaste inloggningen till UI saknas",
         "no_last_login": "Senaste inloggningen till UI saknas",
         "save": "Spara ändringarna",
         "save": "Spara ändringarna",
@@ -354,7 +354,7 @@
         "title": "Titel",
         "title": "Titel",
         "pushover_title": "Meddelandets titel",
         "pushover_title": "Meddelandets titel",
         "text": "Text",
         "text": "Text",
-        "pushover_text": "Meddelandetext ({SUBJECT} byts ut mot ämnesraden)",
+        "pushover_text": "Meddelandetext",
         "spamfilter": "Spamfilter",
         "spamfilter": "Spamfilter",
         "domain_s": "Domäner",
         "domain_s": "Domäner",
         "rspamd-com_settings": "Ett inställningsnamn kommer att genereras automatiskt, se exemplet nedan. För mer detaljer se <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd dokumentationen</a>",
         "rspamd-com_settings": "Ett inställningsnamn kommer att genereras automatiskt, se exemplet nedan. För mer detaljer se <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd dokumentationen</a>",

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 0
data/web/user.php


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels