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 ECD9FBFD67 for ; Tue, 9 Jan 2024 14:59:08 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D38E818014 for ; Tue, 9 Jan 2024 14:59:08 +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 ; Tue, 9 Jan 2024 14:59:07 +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 9AAFB4903F for ; Tue, 9 Jan 2024 14:59:07 +0100 (CET) From: Dominik Csapak To: pmg-devel@lists.proxmox.com Date: Tue, 9 Jan 2024 14:59:03 +0100 Message-Id: <20240109135906.66200-4-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20240109135906.66200-1-d.csapak@proxmox.com> References: <20240109135906.66200-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.020 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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 T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pmg-devel] [PATCH pmg-api 3/4] fix #2606: ruledb disclaimer: add ability to add on top 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: Tue, 09 Jan 2024 13:59:09 -0000 there are usecases, where one wants to embed a disclaimer (or similar) text or html at the beginning of the mail content, not at the end. so introduce a 'top' parameter for the disclaimer that does exactly that. we save it in the `Attribut` table when set. Signed-off-by: Dominik Csapak --- src/PMG/RuleDB/Disclaimer.pm | 51 ++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/src/PMG/RuleDB/Disclaimer.pm b/src/PMG/RuleDB/Disclaimer.pm index 24efa8a..95e8b31 100644 --- a/src/PMG/RuleDB/Disclaimer.pm +++ b/src/PMG/RuleDB/Disclaimer.pm @@ -49,7 +49,7 @@ If this e-mail or attached files contain information which do not relate to our _EOD_ sub new { - my ($type, $value, $ogroup) = @_; + my ($type, $value, $ogroup, $top) = @_; my $class = ref($type) || $type; @@ -58,6 +58,7 @@ sub new { my $self = $class->SUPER::new($class->otype(), $ogroup); $self->{value} = $value; + $self->{top} = $top; return $self; } @@ -69,7 +70,20 @@ sub load_attr { defined($value) || die "undefined object attribute: ERROR"; - my $obj = $class->new(decode('UTF-8', $value), $ogroup); + my $sth = $ruledb->{dbh}->prepare( + "SELECT * FROM Attribut WHERE Object_ID = ?"); + + $sth->execute($id); + + my $top = 0; + + while (my $ref = $sth->fetchrow_hashref()) { + $top = $ref->{value} if $ref->{name} eq 'top'; + } + + $sth->finish(); + + my $obj = $class->new(decode('UTF-8', $value), $ogroup, $top); $obj->{id} = $id; @@ -96,6 +110,9 @@ sub save { "UPDATE Object SET Value = ? WHERE ID = ?", undef, $value, $self->{id}); + $ruledb->{dbh}->do( + "DELETE FROM Attribut WHERE Name = ? and Object_ID = ?", + undef, 'top', $self->{id}); } else { # insert @@ -108,6 +125,12 @@ sub save { $self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq'); } + if (defined($self->{top})) { + $ruledb->{dbh}->do( + "INSERT INTO Attribut (Value, Name, Object_ID) VALUES (?, ?, ?)", + undef, $self->{top}, 'top', $self->{id}); + } + return $self->{id}; } @@ -134,13 +157,19 @@ sub add_data { my $newfh = $body->open ("w") || return undef; + if ($self->{top}) { + $newfh->print($data); + } + while (defined($_ = $fh->getline())) { $newfh->print($_); # copy contents } $newfh->print("\n"); # add final \n - $newfh->print($data); + if (!$self->{top}) { + $newfh->print($data); + } $newfh->close || return undef; @@ -197,8 +226,12 @@ sub execute { foreach my $ta (@$subgroups) { my ($tg, $entity) = (@$ta[0], @$ta[1]); - - my $html = "
--
" . PMG::Utils::subst_values ($self->{value}, $vars); + my $html; + if ($self->{top}) { + $html = PMG::Utils::subst_values ($self->{value}, $vars) . "
--
"; + } else { + $html = "
--
" . PMG::Utils::subst_values ($self->{value}, $vars); + } my $text = ""; my $parser = HTML::Parser->new( @@ -232,6 +265,12 @@ sub properties { type => 'string', maxLength => 2048, }, + top => { + description => "Put the disclaimer on top of the mail body, instead of the bottom.", + type => 'boolean', + optional => 1, + default => 0, + }, }; } @@ -240,6 +279,7 @@ sub get { return { disclaimer => $self->{value}, + top => $self->{top}, }; } @@ -247,6 +287,7 @@ sub update { my ($self, $param) = @_; $self->{value} = $param->{disclaimer}; + $self->{top} = $param->{top}; } 1; -- 2.30.2