diff --git a/data/conf/rspamd/local.d/metadata_exporter.conf b/data/conf/rspamd/local.d/metadata_exporter.conf index 47373d99..daaa79b4 100644 --- a/data/conf/rspamd/local.d/metadata_exporter.conf +++ b/data/conf/rspamd/local.d/metadata_exporter.conf @@ -16,8 +16,7 @@ rules { backend = "http"; url = "http://nginx:9081/pushover.php"; selector = "mailcow_rcpt"; - # Only return msgid, do not parse the full message - formatter = "msgid"; + formatter = "json"; meta_headers = true; } } diff --git a/data/conf/rspamd/meta_exporter/pushover.php b/data/conf/rspamd/meta_exporter/pushover.php index a5e83343..4c8092d1 100644 --- a/data/conf/rspamd/meta_exporter/pushover.php +++ b/data/conf/rspamd/meta_exporter/pushover.php @@ -47,6 +47,7 @@ if (!function_exists('getallheaders')) { } $headers = getallheaders(); +$json_body = json_decode(file_get_contents('php://input')); $qid = $headers['X-Rspamd-Qid']; $rcpts = $headers['X-Rspamd-Rcpt']; @@ -65,6 +66,20 @@ if (is_array($symbols_array)) { } } +$sender_address = $json_body->header_from[0]; +$sender_name = '-'; +if (preg_match('/(?.*?)<(?
.*?)>/i', $sender_address, $matches)) { + $sender_address = $matches['address']; + $sender_name = trim($matches['name'], '"\' '); +} + +$to_address = $json_body->header_to[0]; +$to_name = '-'; +if (preg_match('/(?.*?)<(?
.*?)>/i', $to_address, $matches)) { + $to_address = $matches['address']; + $to_name = trim($matches['name'], '"\' '); +} + $rcpt_final_mailboxes = array(); // Loop through all rcpts @@ -229,9 +244,16 @@ foreach ($rcpt_final_mailboxes as $rcpt_final) { $post_fields = array( "token" => $api_data['token'], "user" => $api_data['key'], - "title" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $title)), + "title" => sprintf("%s", str_replace( + array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}'), + array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address), $title) + ), "priority" => $priority, - "message" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $text)) + "message" => sprintf("%s", str_replace( + array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}', '\n'), + array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address, PHP_EOL), $text) + ), + "sound" => $attributes['sound'] ?? "pushover" ); if ($attributes['evaluate_x_prio'] == "1" && $priority == 1) { $post_fields['expire'] = 600; diff --git a/data/web/api/openapi.yaml b/data/web/api/openapi.yaml index c23380f1..6310aa58 100644 --- a/data/web/api/openapi.yaml +++ b/data/web/api/openapi.yaml @@ -3349,6 +3349,7 @@ paths: evaluate_x_prio: "0" key: 21e8918e1jksdjcpis712 only_x_prio: "0" + sound: "pushover" senders: "" senders_regex: "" text: "" @@ -3392,6 +3393,7 @@ paths: evaluate_x_prio: "0" key: 21e8918e1jksdjcpis712 only_x_prio: "0" + sound: "pushover" senders: "" senders_regex: "" text: "" @@ -3413,6 +3415,9 @@ paths: only_x_prio: description: Only send push for prio mails type: number + sound: + description: Set notification sound + type: string senders: description: Only send push for emails from these senders type: string diff --git a/data/web/inc/functions.pushover.inc.php b/data/web/inc/functions.pushover.inc.php index 74e8bb1c..5393c0d5 100644 --- a/data/web/inc/functions.pushover.inc.php +++ b/data/web/inc/functions.pushover.inc.php @@ -51,6 +51,7 @@ function pushover($_action, $_data = null) { $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $evaluate_x_prio = (isset($_data['evaluate_x_prio'])) ? intval($_data['evaluate_x_prio']) : $is_now['evaluate_x_prio']; $only_x_prio = (isset($_data['only_x_prio'])) ? intval($_data['only_x_prio']) : $is_now['only_x_prio']; + $sound = (isset($_data['sound'])) ? $_data['sound'] : $is_now['sound']; } else { $_SESSION['return'][] = array( @@ -101,7 +102,8 @@ function pushover($_action, $_data = null) { $po_attributes = json_encode( array( 'evaluate_x_prio' => strval(intval($evaluate_x_prio)), - 'only_x_prio' => strval(intval($only_x_prio)) + 'only_x_prio' => strval(intval($only_x_prio)), + 'sound' => strval($sound) ) ); $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `attributes`, `senders_regex`, `senders`, `token`, `title`, `text`, `active`) diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index b47bd5c2..9abd4485 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 = "25072022_2300"; + $db_version = "17112022_2115"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -1264,6 +1264,7 @@ function init_db_schema() { $pdo->query("UPDATE `pushover` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); $pdo->query("UPDATE `pushover` SET `attributes` = JSON_SET(`attributes`, '$.evaluate_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.evaluate_x_prio') IS NULL;"); $pdo->query("UPDATE `pushover` SET `attributes` = JSON_SET(`attributes`, '$.only_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.only_x_prio') IS NULL;"); + $pdo->query("UPDATE `pushover` SET `attributes` = JSON_SET(`attributes`, '$.sound', \"pushover\") WHERE JSON_VALUE(`attributes`, '$.sound') IS NULL;"); // mailbox $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.passwd_update', \"0\") WHERE JSON_VALUE(`attributes`, '$.passwd_update') IS NULL;"); diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 0a384071..260997de 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -574,6 +574,7 @@ "pushover_sender_regex": "Consider the following sender regex", "pushover_text": "Notification text", "pushover_title": "Notification title", + "pushover_sound": "Sound", "pushover_vars": "When no sender filter is defined, all mails will be considered.
Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.
Useable variables for text and title (please take note of data protection policies)", "pushover_verify": "Verify credentials", "quota_mb": "Quota (MiB)", @@ -1097,6 +1098,7 @@ "pushover_sender_regex": "Match senders by the following regex", "pushover_text": "Notification text", "pushover_title": "Notification title", + "pushover_sound": "Sound", "pushover_vars": "When no sender filter is defined, all mails will be considered.
Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.
Useable variables for text and title (please take note of data protection policies)", "pushover_verify": "Verify credentials", "q_add_header": "Junk folder", diff --git a/data/web/lang/lang.nl-nl.json b/data/web/lang/lang.nl-nl.json index ecfee43d..af8e9834 100644 --- a/data/web/lang/lang.nl-nl.json +++ b/data/web/lang/lang.nl-nl.json @@ -536,6 +536,7 @@ "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", "pushover_title": "Meldingstitel", + "pushover_sound": "Geluid", "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.
Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.
Bruikbare variabelen voor tekst en titel (neem het gegevensbeschermingsbeleid in acht)", "pushover_verify": "Verifieer aanmeldingsgegevens", "quota_mb": "Quota (MiB)", @@ -1002,6 +1003,7 @@ "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", "pushover_title": "Meldingstitel", + "pushover_sound": "Geluid", "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.
Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.
Bruikbare variabelen voor tekst en titel (let op het gegevensbeschermingsbeleid)", "pushover_verify": "Verifieer aanmeldingsgegevens", "q_add_header": "Spamfolder", diff --git a/data/web/templates/edit/mailbox.twig b/data/web/templates/edit/mailbox.twig index e1c3e883..9eb7c951 100644 --- a/data/web/templates/edit/mailbox.twig +++ b/data/web/templates/edit/mailbox.twig @@ -275,7 +275,7 @@

{{ lang.user.pushover_info|format(mailbox)|raw }}

-

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}

+

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}

@@ -308,6 +308,36 @@
+
+
+
+ +
+
diff --git a/data/web/templates/user/Pushover.twig b/data/web/templates/user/Pushover.twig index 096655cb..5bd6b1a4 100644 --- a/data/web/templates/user/Pushover.twig +++ b/data/web/templates/user/Pushover.twig @@ -9,7 +9,7 @@

{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}

-

{{ lang.user.pushover_vars|raw }}: {SUBJECT}, {SENDER}

+

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}

@@ -42,6 +42,36 @@
+
+
+
+ +
+