[pmg-devel] [PATCH pmg-api 2/2] add new What Object 'Match Archive Filename'

Stoiko Ivanov s.ivanov at proxmox.com
Wed Apr 15 17:11:01 CEST 2020


On Tue, 14 Apr 2020 14:54:40 +0200
Dominik Csapak <d.csapak at proxmox.com> wrote:

> This behaves like the 'ArchiveFilter' to 'ContentTypeFilter',
> in that it matches the filenames in archives, as well as outside.
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  src/Makefile                           |   1 +
>  src/PMG/API2/What.pm                   |   2 +
>  src/PMG/RuleCache.pm                   |   4 +-
>  src/PMG/RuleDB.pm                      |   4 +
>  src/PMG/RuleDB/MatchArchiveFilename.pm | 115 +++++++++++++++++++++++++
>  5 files changed, 125 insertions(+), 1 deletion(-)
>  create mode 100644 src/PMG/RuleDB/MatchArchiveFilename.pm
> 
> diff --git a/src/Makefile b/src/Makefile
> index b5e4c9f..05d9598 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -87,6 +87,7 @@ LIBSOURCES =				\
>  	PMG/RuleDB/IPNet.pm		\
>  	PMG/RuleDB/ModField.pm		\
>  	PMG/RuleDB/MatchFilename.pm	\
> +	PMG/RuleDB/MatchArchiveFilename.pm	\
>  	PMG/RuleDB/ReceiverRegex.pm	\
>  	PMG/RuleDB/EMail.pm		\
>  	PMG/RuleDB/Receiver.pm		\
> diff --git a/src/PMG/API2/What.pm b/src/PMG/API2/What.pm
> index 14b9053..bba3003 100644
> --- a/src/PMG/API2/What.pm
> +++ b/src/PMG/API2/What.pm
> @@ -55,6 +55,7 @@ __PACKAGE__->register_method ({
>  	    { subdir => 'archivefilter' },
>  	    { subdir => 'filenamefilter' },
>  	    { subdir => 'virusfilter' },
> +	    { subdir => 'archivefilenamefilter' },
>  	];
>  
>      }});
> @@ -69,5 +70,6 @@ PMG::RuleDB::Spam->register_api(__PACKAGE__, 'spamfilter');
>  PMG::RuleDB::ArchiveFilter->register_api(__PACKAGE__, 'archivefilter');
>  PMG::RuleDB::MatchFilename->register_api(__PACKAGE__, 'filenamefilter');
>  PMG::RuleDB::Virus->register_api(__PACKAGE__, 'virusfilter');
> +PMG::RuleDB::MatchArchiveFilename->register_api(__PACKAGE__, 'archivefilenamefilter');
>  
>  1;
> diff --git a/src/PMG/RuleCache.pm b/src/PMG/RuleCache.pm
> index 9b18e7e..655f4a2 100644
> --- a/src/PMG/RuleCache.pm
> +++ b/src/PMG/RuleCache.pm
> @@ -98,7 +98,9 @@ sub new {
>  			push @$when,  $obj;
>  		    } elsif ($gtype == 3) { # what
>  			push @$what,  $obj;
> -			if ($obj->otype == PMG::RuleDB::ArchiveFilter->otype) {
> +			if ($obj->otype == PMG::RuleDB::ArchiveFilter->otype ||
> +			    $obj->otype == PMG::RuleDB::MatchArchiveFilename->otype)
> +			{
>  			    if ($rule->{direction} == 0) {
>  				$self->{archivefilter_in} = 1;
>  			    } elsif ($rule->{direction} == 1) {
> diff --git a/src/PMG/RuleDB.pm b/src/PMG/RuleDB.pm
> index 9b8abd0..8b38ac0 100644
> --- a/src/PMG/RuleDB.pm
> +++ b/src/PMG/RuleDB.pm
> @@ -34,6 +34,7 @@ use PMG::RuleDB::Remove;
>  use PMG::RuleDB::ModField;
>  use PMG::RuleDB::MatchField;
>  use PMG::RuleDB::MatchFilename;
> +use PMG::RuleDB::MatchArchiveFilename;
>  use PMG::RuleDB::Attach;
>  use PMG::RuleDB::Disclaimer;
>  use PMG::RuleDB::BCC;
> @@ -338,6 +339,9 @@ sub get_object {
>      elsif ($otype == PMG::RuleDB::MatchFilename::otype) {
>          $obj = PMG::RuleDB::MatchFilename->new();
>      }
> +    elsif ($otype == PMG::RuleDB::MatchArchiveFilename::otype) {
> +        $obj = PMG::RuleDB::MatchArchiveFilename->new();
> +    }
>      elsif ($otype == PMG::RuleDB::ContentTypeFilter::otype) {
>          $obj = PMG::RuleDB::ContentTypeFilter->new();
>      }
> diff --git a/src/PMG/RuleDB/MatchArchiveFilename.pm b/src/PMG/RuleDB/MatchArchiveFilename.pm
> new file mode 100644
> index 0000000..defc51e
> --- /dev/null
> +++ b/src/PMG/RuleDB/MatchArchiveFilename.pm
> @@ -0,0 +1,115 @@
> +package PMG::RuleDB::MatchArchiveFilename;
> +
> +use strict;
> +use warnings;
> +
> +use PMG::Utils;
> +use PMG::RuleDB::MatchFilename;
> +
> +use base qw(PMG::RuleDB::MatchFilename);
> +
> +sub otype {
> +    return 3006;
> +}
> +
> +sub oclass {
> +    return 'what';
> +}
> +
> +sub otype_text {
> +    return 'Match Archive Filename';
> +}
> +
> +sub new {
> +    my ($type, $fname, $ogroup) = @_;
> +
> +    my $class = ref($type) || $type;
> +
> +    my $self = $class->SUPER::new($fname, $ogroup);
> +
> +    return $self;
> +}
> +
> +sub load_attr {
> +    my ($type, $ruledb, $id, $ogroup, $value) = @_;
> +
> +    my $class = ref($type) || $type;
> +
> +    my $obj = $class->SUPER::load_attr($ruledb, $id, $ogroup, $value);
> +
> +    return $obj;
> +}
I think (and a quick test seems to agree) that we could simply drop
the 'new' and 'load_attr' methods (they fall back to the superclass, which
also does the '$class' name mangling) ?


> +
> +sub parse_entity {
> +    my ($self, $entity) = @_;
> +
> +    my $res;
> +
> +    if (my $id = $entity->head->mime_attr('x-proxmox-tmp-aid')) {
> +	chomp $id;
> +
> +	my $fn = PMG::Utils::extract_filename($entity->head);
> +	if (defined($fn) && $fn =~ m|^$self->{fname}$|i) {
> +	    push @$res, $id;
> +	} elsif (my $filenames = $entity->{PMX_filenames}) {
> +	    # Match inside archives
> +	    for my $fn (keys %$filenames) {
> +		if ($fn =~ m|^$self->{fname}$|i) {
> +		    push @$res, $id;
> +		    last;
> +		}
> +	    }
> +	}
> +    }
> +
> +    foreach my $part ($entity->parts)  {
> +	if (my $match = $self->parse_entity ($part)) {
> +	    push @$res, @$match;
> +	}
> +    }
> +
> +    return $res;
> +}
> +
> +sub what_match {
> +    my ($self, $queue, $entity, $msginfo) = @_;
> +
> +    return $self->parse_entity($entity);
> +}
> +
> +sub short_desc {
> +    my $self = shift;
> +
> +    return "filename=$self->{fname}";
> +}
> +
> +sub properties {
> +    my ($class) = @_;
> +
> +    return {
> +	filename => {
> +	    description => "Filename filter",
> +	    type => 'string',
> +	    maxLength => 1024,
> +	},
> +    };
> +}
> +
> +sub get {
> +    my ($self) = @_;
> +
> +    return { filename => $self->{fname} };
> +}
> +
> +sub update {
> +    my ($self, $param) = @_;
> +
> +    $self->{fname} = $param->{filename};
> +}
> +
> +1;
> +__END__
> +
> +=head1 PMG::RuleDB::MatchArchiveFilename
> +
> +Match Archive Filename




More information about the pmg-devel mailing list