From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id BAA29B7A0 for ; Thu, 24 Nov 2022 13:21:25 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 782732F187 for ; Thu, 24 Nov 2022 13:21:25 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Thu, 24 Nov 2022 13:21:21 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id EAE6A43B3B for ; Thu, 24 Nov 2022 13:21:13 +0100 (CET) From: Dominik Csapak To: pmg-devel@lists.proxmox.com Date: Thu, 24 Nov 2022 13:21:02 +0100 Message-Id: <20221124122112.666868-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221124122112.666868-1-d.csapak@proxmox.com> References: <20221124122112.666868-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.064 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [modfield.pm, notify.pm, utils.pm, bcc.pm] Subject: [pmg-devel] [PATCH pmg-api v4 02/12] ruledb: properly substitute prox_vars in headers X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Nov 2022 12:21:25 -0000 From: Stoiko Ivanov by storing the variables as perl-string (not mime-encoded, and not utf-8 encoded), and appropriately dealing with multi-line values to input (folding the headers and encoding as mime). This fixes another glitch not caught by d3d6b5dff9e4447d16cb92e0fdf26f67d9384423 the Subject was always displayed with a '?' in the end (due to the (quoted-printable encoded) \n added). Additionally adapt the other callsites of PMG::Utils::subst_values where applicable. Signed-off-by: Stoiko Ivanov Signed-off-by: Dominik Csapak --- src/PMG/RuleDB/BCC.pm | 2 +- src/PMG/RuleDB/ModField.pm | 13 +------------ src/PMG/RuleDB/Notify.pm | 4 ++-- src/PMG/Utils.pm | 17 +++++++++++++++++ src/bin/pmg-smtp-filter | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/PMG/RuleDB/BCC.pm b/src/PMG/RuleDB/BCC.pm index d364690..4867d83 100644 --- a/src/PMG/RuleDB/BCC.pm +++ b/src/PMG/RuleDB/BCC.pm @@ -117,7 +117,7 @@ sub execute { my $rulename = $vars->{RULE} // 'unknown'; - my $bcc_to = PMG::Utils::subst_values($self->{target}, $vars); + my $bcc_to = PMG::Utils::subst_values_for_header($self->{target}, $vars); if ($bcc_to =~ m/^\s*$/) { # this happens if a notification is triggered by bounce mails diff --git a/src/PMG/RuleDB/ModField.pm b/src/PMG/RuleDB/ModField.pm index 4ebb618..34108d1 100644 --- a/src/PMG/RuleDB/ModField.pm +++ b/src/PMG/RuleDB/ModField.pm @@ -5,7 +5,6 @@ use warnings; use DBI; use Digest::SHA; use Encode qw(encode decode); -use MIME::Words qw(encode_mimewords); use PMG::Utils; use PMG::ModGroup; @@ -98,17 +97,7 @@ sub execute { my ($self, $queue, $ruledb, $mod_group, $targets, $msginfo, $vars, $marks) = @_; - my $fvalue = ''; - - foreach my $line (split('\r?\n\s*',PMG::Utils::subst_values ($self->{field_value}, $vars))) { - $fvalue .= "\n" if $fvalue; - $fvalue .= encode_mimewords(encode('UTF-8', $line), 'Charset' => 'UTF-8'); - } - - # support for multiline values (i.e. __SPAM_INFO__) - $fvalue =~ s/\n/\n\t/sg; # indent content - $fvalue =~ s/\n\s*\n//sg; # remove empty line - $fvalue =~ s/\n?\s*$//s; # remove trailing spaces + my $fvalue = PMG::Utils::subst_values_for_header($self->{field_value}, $vars); my $subgroups = $mod_group->subgroups($targets); diff --git a/src/PMG/RuleDB/Notify.pm b/src/PMG/RuleDB/Notify.pm index d67221e..7b38e0d 100644 --- a/src/PMG/RuleDB/Notify.pm +++ b/src/PMG/RuleDB/Notify.pm @@ -211,8 +211,8 @@ sub execute { my $rulename = $vars->{RULE} // 'unknown'; my $body = PMG::Utils::subst_values($self->{body}, $vars); - my $subject = PMG::Utils::subst_values($self->{subject}, $vars); - my $to = PMG::Utils::subst_values($self->{to}, $vars); + my $subject = PMG::Utils::subst_values_for_header($self->{subject}, $vars); + my $to = PMG::Utils::subst_values_for_header($self->{to}, $vars); if ($to =~ m/^\s*$/) { # this happens if a notification is triggered by bounce mails diff --git a/src/PMG/Utils.pm b/src/PMG/Utils.pm index cfb8852..cc30e67 100644 --- a/src/PMG/Utils.pm +++ b/src/PMG/Utils.pm @@ -203,6 +203,23 @@ sub subst_values { return $body; } +sub subst_values_for_header { + my ($header, $dh) = @_; + + my $res = ''; + foreach my $line (split('\r?\n\s*', subst_values ($header, $dh))) { + $res .= "\n" if $res; + $res .= MIME::Words::encode_mimewords(encode('UTF-8', $line), 'Charset' => 'UTF-8'); + } + + # support for multiline values (i.e. __SPAM_INFO__) + $res =~ s/\n/\n\t/sg; # indent content + $res =~ s/\n\s*\n//sg; # remove empty line + $res =~ s/\n?\s*$//s; # remove trailing spaces + + return $res; +} + sub reinject_mail { my ($entity, $sender, $targets, $xforward, $me, $params) = @_; diff --git a/src/bin/pmg-smtp-filter b/src/bin/pmg-smtp-filter index 35a6ac6..45e68a7 100755 --- a/src/bin/pmg-smtp-filter +++ b/src/bin/pmg-smtp-filter @@ -152,7 +152,7 @@ sub get_prox_vars { } if !$spaminfo; my $vars = { - 'SUBJECT' => mime_to_perl_string($entity->head->get ('subject', 0) || 'No Subject'), + 'SUBJECT' => PMG::Utils::decode_rfc1522($entity->head->get ('subject', 0) || 'No Subject'), 'RULE' => $rule->{name}, 'RULE_INFO' => $msginfo->{rule_info}, 'SENDER' => $msginfo->{sender}, -- 2.30.2