public inbox for pmg-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stoiko Ivanov <s.ivanov@proxmox.com>
To: pmg-devel@lists.proxmox.com
Subject: [pmg-devel] [PATCH pmg-api 1/1] fix #2709: ruledb: match-field: optionally restrict to top mime-part
Date: Tue, 18 Feb 2025 20:48:28 +0100	[thread overview]
Message-ID: <20250218194829.80095-2-s.ivanov@proxmox.com> (raw)
In-Reply-To: <20250218194829.80095-1-s.ivanov@proxmox.com>

The current Match Field (header) what-objects always traverse each
mime-part of a mail.
This can be inconvenient, and causes unexpected matches when you
forward a message as attachment(message/rfc822).

following the patches for adding a Disclaimer on top of a mail from an
implementation point of view, this simply adds an optional
top-level-only attribute for the MatchField object, which is disabled
by default for backwards-compatibility.

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
 src/PMG/RuleDB/ContentTypeFilter.pm |  2 +-
 src/PMG/RuleDB/MatchField.pm        | 47 +++++++++++++++++++++++++++--
 2 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/PMG/RuleDB/ContentTypeFilter.pm b/src/PMG/RuleDB/ContentTypeFilter.pm
index 550a880..507ff97 100644
--- a/src/PMG/RuleDB/ContentTypeFilter.pm
+++ b/src/PMG/RuleDB/ContentTypeFilter.pm
@@ -35,7 +35,7 @@ sub new {
 	$fvalue = $nt;
     }
 
-    my $self = $class->SUPER::new('content-type', $fvalue, $ogroup);
+    my $self = $class->SUPER::new('content-type', $fvalue, $ogroup, undef);
     $self->{only_content} = $only_content;
 
     return $self;
diff --git a/src/PMG/RuleDB/MatchField.pm b/src/PMG/RuleDB/MatchField.pm
index ee1851a..f6787e8 100644
--- a/src/PMG/RuleDB/MatchField.pm
+++ b/src/PMG/RuleDB/MatchField.pm
@@ -27,7 +27,7 @@ sub otype_text {
 }
 
 sub new {
-    my ($type, $field, $field_value, $ogroup) = @_;
+    my ($type, $field, $field_value, $ogroup, $top_part_only) = @_;
 
     my $class = ref($type) || $type;
 
@@ -35,6 +35,7 @@ sub new {
 
     $self->{field} = $field;
     $self->{field_value} = $field_value;
+    $self->{top_part_only} = $top_part_only;
 
     return $self;
 }
@@ -54,12 +55,28 @@ sub load_attr {
     my $decoded_field_value = PMG::Utils::try_decode_utf8($field_value);
     # use known constructor, bless afterwards (because sub class can have constructor
     # with other parameter signature).
-    my $obj =  PMG::RuleDB::MatchField->new($field, $decoded_field_value, $ogroup);
+    my $obj =  PMG::RuleDB::MatchField->new($field, $decoded_field_value, $ogroup, undef);
     bless $obj, $class;
 
+    my $sth = $ruledb->{dbh}->prepare(
+	"SELECT * FROM Attribut WHERE Object_ID = ?");
+
+    $sth->execute($id);
+
+    $obj->{top_part_only} = 0;
+
+    while (my $ref = $sth->fetchrow_hashref()) {
+	if ($ref->{name} eq 'top_part_only') {
+	    $obj->{top_part_only} = $ref->{value};
+	}
+    }
+
+    $sth->finish();
+
     $obj->{id} = $id;
 
-    $obj->{digest} = Digest::SHA::sha1_hex($id, $field, $field_value, $ogroup);
+    $obj->{digest} = Digest::SHA::sha1_hex(
+	$id, $field, $field_value, $ogroup, $obj->{top_part_only});
 
     return $obj;
 }
@@ -79,6 +96,9 @@ sub save {
 
     if (defined ($self->{id})) {
 	# update
+	$ruledb->{dbh}->do(
+	    "DELETE FROM Attribut WHERE Object_ID = ?",
+	    undef, $self->{id});
 
 	$ruledb->{dbh}->do(
 	    "UPDATE Object SET Value = ? WHERE ID = ?",
@@ -96,6 +116,12 @@ sub save {
 	$self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq');
     }
 
+    if (defined($self->{top_part_only})) {
+	$ruledb->{dbh}->do(
+	    "INSERT INTO Attribut (Value, Name, Object_ID) VALUES (?, 'top_part_only', ?)",
+	    undef, $self->{top_part_only}, $self->{id});
+    }
+
     return $self->{id};
 }
 
@@ -124,6 +150,8 @@ sub parse_entity {
 	}
     }
 
+    return $res if $self->{top_part_only};
+
     foreach my $part ($entity->parts)  {
 	if (my $match = $self->parse_entity($part)) {
 	    push @$res, @$match;
@@ -160,6 +188,12 @@ sub properties {
 	    type => 'string',
 	    maxLength => 1024,
 	},
+	'top-part-only' => {
+	    description => "only match the headers in the first MIME-Part",
+	    type => 'boolean',
+	    optional => 1,
+	    default => 0,
+	},
     };
 }
 
@@ -169,6 +203,7 @@ sub get {
     return {
 	field => $self->{field},
 	value => $self->{field_value},
+	'top-part-only' => $self->{top_part_only},
     };
 }
 
@@ -177,6 +212,12 @@ sub update {
 
     $self->{field_value} = $param->{value};
     $self->{field} = $param->{field};
+
+    if (defined($param->{'top-part-only'}) && $param->{'top-part-only'} == 1) {
+	$self->{top_part_only} = 1;
+    } else {
+	delete $self->{top_part_only};
+    }
 }
 
 1;
-- 
2.39.5



_______________________________________________
pmg-devel mailing list
pmg-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel


  reply	other threads:[~2025-02-18 19:48 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-18 19:48 [pmg-devel] [PATCH pmg-api/pmg-gui] fix #2709: optionally match only top-level headers Stoiko Ivanov
2025-02-18 19:48 ` Stoiko Ivanov [this message]
2025-02-18 19:48 ` [pmg-devel] [PATCH pmg-gui 1/1] fix #2709: rules: match-field: add top-level-only checkbox Stoiko Ivanov
2025-02-19 12:24 ` [pmg-devel] [PATCH pmg-api/pmg-gui] fix #2709: optionally match only top-level headers Stoiko Ivanov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250218194829.80095-2-s.ivanov@proxmox.com \
    --to=s.ivanov@proxmox.com \
    --cc=pmg-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal