[pmg-devel] [PATCH pmg-api v2 08/10] RuleDB/Remove: add attachment quarantine option

Dominik Csapak d.csapak at proxmox.com
Mon Sep 30 14:55:32 CEST 2019


So that users can choose to copy the mail to the attachment quarantine,
if they remove some (or all attachments)

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 src/PMG/RuleDB/Remove.pm | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/src/PMG/RuleDB/Remove.pm b/src/PMG/RuleDB/Remove.pm
index ee6e37b..248dad6 100644
--- a/src/PMG/RuleDB/Remove.pm
+++ b/src/PMG/RuleDB/Remove.pm
@@ -41,7 +41,7 @@ sub priority {
 }
 
 sub new {
-    my ($type, $all, $text, $ogroup) = @_;
+    my ($type, $all, $text, $ogroup, $quar) = @_;
 
     my $class = ref($type) || $type;
 
@@ -51,6 +51,7 @@ sub new {
 
     $self->{all} = $all;
     $self->{text} = $text;
+    $self->{quar} = $quar;
 
     return $self;
 }
@@ -64,7 +65,9 @@ sub load_attr {
 
     my $obj;
 
-    if ($value =~ m/^([01])(\:(.*))?$/s) {
+    if ($value =~ m/^([01])\,([01])(\:(.*))?$/s) {
+	$obj = $class->new($1, $4, $ogroup, $2);
+    } elsif ($value =~ m/^([01])(\:(.*))?$/s) {
 	$obj = $class->new($1, $3, $ogroup);
     } else {
 	$obj = $class->new(0, undef, $ogroup);
@@ -83,6 +86,7 @@ sub save {
     defined($self->{ogroup}) || die "undefined ogroup: ERROR";
 
     my $value = $self->{all} ? '1' : '0';
+    $value .= ','. ($self->{quar} ? '1' : '0');
 
     if ($self->{text}) {
 	$value .= ":$self->{text}";
@@ -188,7 +192,7 @@ sub delete_marked_parts {
 
 sub execute {
     my ($self, $queue, $ruledb, $mod_group, $targets,
-	$msginfo, $vars, $marks) = @_;
+	$msginfo, $vars, $marks, $ldap) = @_;
 
     my $rulename = $vars->{RULE} // 'unknown';
 
@@ -201,7 +205,10 @@ sub execute {
 
     my $html = PMG::Utils::subst_values($self->{text}, $vars);
 
-    $html = "This attachment was removed: __FILENAME__\n" if !$html;
+    if (!$html) {
+	$html = "This attachment was removed: __FILENAME__\n";
+	$html .= "It was put into the Attachment Quarantine, please contact your Administrator\n" if $self->{quar};
+    }
 
     my $rtype = "text/plain";
 
@@ -212,6 +219,17 @@ sub execute {
     foreach my $ta (@$subgroups) {
 	my ($tg, $entity) = (@$ta[0], @$ta[1]);
 
+	# move in attachment quarantine if configured
+	if ($self->{quar}) {
+	    my $quarentity = $entity->dup;
+	    PMG::Utils::remove_marks($quarentity);
+	    if (my $qid = $queue->quarantine_mail($ruledb, 'A', $quarentity, $tg, $msginfo, $vars, $ldap)) {
+		foreach (@$tg) {
+		    syslog ('info', "$queue->{logid}: moved mail for <%s> to attachment quarantine - %s (rule: %s)", $_, $qid, $rulename);
+		}
+	    }
+	}
+
 	# handle singlepart mails
 	my $ctype = $entity->head->mime_type;
 	if (!$entity->is_multipart && (!$self->{all} || $ctype !~ m|text/.*|i)) {
@@ -250,6 +268,12 @@ sub properties {
 	    type => 'boolean',
 	    optional => 1,
 	},
+	quar => {
+	    description => "Copy to attachement Quarantine.",
+	    type => 'boolean',
+	    default => 0,
+	    optional => 1,
+	},
 	text => {
 	    description => "The replacement text.",
 	    type => 'string',
@@ -264,6 +288,7 @@ sub get {
     return {
 	text => $self->{text},
 	all => $self->{all},
+	quar => $self->{quar},
     };
 }
 
@@ -272,6 +297,7 @@ sub update {
 
     $self->{text} = $param->{text};
     $self->{all} = $param->{all} ? 1 : 0;
+    $self->{quar} = $param->{quar} ? 1 : 0;
 }
 
 1;
-- 
2.20.1




More information about the pmg-devel mailing list