]> git.proxmox.com Git - pmg-api.git/blame - PMG/RuleDB/MatchFilename.pm
add more ruledb classes
[pmg-api.git] / PMG / RuleDB / MatchFilename.pm
CommitLineData
f4fe6fc4
DM
1package PMG::RuleDB::MatchFilename;
2
3use strict;
4use warnings;
5use Carp;
6use DBI;
7use Digest::SHA;
8use MIME::Words;
9
10use PMG::Utils;
11use PMG::RuleDB::Object;
12
13use base qw(PMG::RuleDB::Object);
14
15sub otype {
16 return 3004;
17}
18
19sub oclass {
20 return 'what';
21}
22
23sub otype_text {
24 return 'Match Filename';
25}
26
27sub oicon {
28 return 'matchfile.gif';
29}
30
31sub oinfo {
32 return 'Filter attachments based on filenames or extensions';
33}
34
35sub new {
36 my ($type, $fname, $ogroup) = @_;
37
38 my $class = ref($type) || $type;
39
40 my $self = $class->SUPER::new(otype(), $ogroup);
41
42 $self->{fname} = $fname;
43
44 return $self;
45}
46
47sub load_attr {
48 my ($type, $ruledb, $id, $ogroup, $value) = @_;
49
50 my $class = ref($type) || $type;
51
52 defined($value) || croak "undefined value: ERROR";;
53
54 my $obj = $class->new($value, $ogroup);
55 $obj->{id} = $id;
56
57 $obj->{digest} = Digest::SHA::sha1_hex($id, $value, $ogroup);
58
59 return $obj;
60}
61
62sub save {
63 my ($self, $ruledb) = @_;
64
65 defined($self->{ogroup}) || croak "undefined ogroup: ERROR";
66
67 my $new_value = $self->{fname};
68 $new_value =~ s/\\/\\\\/g;
69
70 if (defined($self->{id})) {
71 # update
72
73 $ruledb->{dbh}->do("UPDATE Object SET Value = ? WHERE ID = ?",
74 undef, $new_value, $self->{id});
75
76 } else {
77 # insert
78
79 my $sth = $ruledb->{dbh}->prepare(
80 "INSERT INTO Object (Objectgroup_ID, ObjectType, Value) " .
81 "VALUES (?, ?, ?);");
82
83 $sth->execute($self->ogroup, $self->otype, $new_value);
84
85 $self->{id} = PMG::Utils::lastid($ruledb->{dbh}, 'object_id_seq');
86 }
87
88 return $self->{id};
89}
90
91sub parse_entity {
92 my ($self, $entity) = @_;
93
94 my $res;
95
96 if (my $id = $entity->head->mime_attr('x-proxmox-tmp-aid')) {
97 chomp $id;
98
99 if (my $value = PMG::Utils::extract_filename($entity->head)) {
100 if ($value =~ m|^$self->{fname}$|i) {
101 push @$res, $id;
102 }
103 }
104 }
105
106 foreach my $part ($entity->parts) {
107 if (my $match = $self->parse_entity ($part)) {
108 push @$res, @$match;
109 }
110 }
111
112 return $res;
113}
114
115sub what_match {
116 my ($self, $queue, $entity, $msginfo) = @_;
117
118 return $self->parse_entity($entity);
119}
120
121sub short_desc {
122 my $self = shift;
123
124 return "filename=$self->{fname}";
125}
126
1271;
128__END__
129
130=head1 PMG::RuleDB::MatchFilename
131
132Match Header Filename