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 E5F7DC1357 for ; Mon, 15 Jan 2024 12:12:44 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C3C501A136 for ; Mon, 15 Jan 2024 12:12:44 +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 ; Mon, 15 Jan 2024 12:12:44 +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 E452C49124 for ; Mon, 15 Jan 2024 12:12:43 +0100 (CET) From: Dominik Csapak To: pmg-devel@lists.proxmox.com Date: Mon, 15 Jan 2024 12:12:38 +0100 Message-Id: <20240115111242.2781994-2-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20240115111242.2781994-1-d.csapak@proxmox.com> References: <20240115111242.2781994-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 v2 1/2] fix #2606: ruledb disclaimer: add ability to set position 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: Mon, 15 Jan 2024 11:12:44 -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 'position' parameter for the disclaimer that does exactly that. internally this will get saved as `top` only if it is not the default of '0'. We save it in the `Attribut` table in that case. Signed-off-by: Dominik Csapak --- changes from v1: * rename public property to 'position' * change default handling in 'update' so that we only ever save the non-default value to the database src/PMG/RuleDB/Disclaimer.pm | 56 ++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/PMG/RuleDB/Disclaimer.pm b/src/PMG/RuleDB/Disclaimer.pm index 24efa8a..421a0dd 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,13 @@ sub properties { type => 'string', maxLength => 2048, }, + position => { + description => "Put the disclaimer at the specified position.", + type => 'string', + enum => ['start', 'end'], + optional => 1, + default => 'end', + }, }; } @@ -240,6 +280,7 @@ sub get { return { disclaimer => $self->{value}, + position => $self->{top} ? 'start' : 'end', }; } @@ -247,6 +288,11 @@ sub update { my ($self, $param) = @_; $self->{value} = $param->{disclaimer}; + if (defined($param->{position}) && $param->{position} eq 'start') { + $self->{top} = 1; + } else { + delete $self->{top}; + } } 1; -- 2.30.2