1 |
From e2ee6f13e5d0e2f064143479193fbe4bbc8aeaf8 Mon Sep 17 00:00:00 2001 |
2 |
From: Johan Almqvist <johan@almqvist.net> |
3 |
Date: Sun, 11 Jul 2010 17:28:58 -0700 |
4 |
Subject: new plugin check_badmailfrom_patterns |
5 |
|
6 |
Signed-off-by: Robert <rspier@pobox.com> |
7 |
--- |
8 |
plugins/check_badmailfrom_patterns | 64 ++++++++++++++++++++++++++++++++++++ |
9 |
1 files changed, 64 insertions(+), 0 deletions(-) |
10 |
create mode 100644 plugins/check_badmailfrom_patterns |
11 |
|
12 |
diff --git a/plugins/check_badmailfrom_patterns b/plugins/check_badmailfrom_patterns |
13 |
new file mode 100644 |
14 |
index 0000000..528e49d |
15 |
--- /dev/null |
16 |
+++ b/plugins/check_badmailfrom_patterns |
17 |
@@ -0,0 +1,64 @@ |
18 |
+#!/usr/bin/perl |
19 |
+ |
20 |
+=pod |
21 |
+ |
22 |
+=head1 SYNOPSIS |
23 |
+ |
24 |
+This plugin checks the badmailfrom_patterns config. This allows |
25 |
+special patterns to be denied (e.g. FQDN-VERP, percent hack, bangs, |
26 |
+double ats). |
27 |
+ |
28 |
+=head1 CONFIG |
29 |
+ |
30 |
+Configuration is placed in the following file: |
31 |
+ |
32 |
+F<config/badmailfrom_patterns> |
33 |
+ |
34 |
+Patterns are stored in the format pattern\sresponse, where pattern |
35 |
+is a Perl pattern expression. Don't forget to anchor the pattern |
36 |
+(front ^ and back $) if you want to restrict it from matching |
37 |
+anywhere in the string. |
38 |
+ |
39 |
+ ^streamsendbouncer@.*\.mailengine1\.com$ Your right-hand side VERP doesn't fool me |
40 |
+ ^return.*@.*\.pidplate\.biz$ I don' want it regardless of subdomain |
41 |
+ ^admin.*\.ppoonn400\.com$ |
42 |
+ |
43 |
+=head1 AUTHOR |
44 |
+ |
45 |
+Johan Almqvist <johan-qpsmtpd@almqvist.net> based on L<check_badmailfrom> |
46 |
+ |
47 |
+This software is free software and may be distributed under the same |
48 |
+terms as qpsmtpd itself. |
49 |
+ |
50 |
+=cut |
51 |
+ |
52 |
+sub hook_mail { |
53 |
+ my ($self, $transaction, $sender, %param) = @_; |
54 |
+ |
55 |
+ my @badmailfrom = $self->qp->config("badmailfrom_patterns") |
56 |
+ or return (DECLINED); |
57 |
+ |
58 |
+ return (DECLINED) if ($sender->format eq "<>"); |
59 |
+ |
60 |
+ my $host = lc $sender->host; |
61 |
+ my $from = lc($sender->user) . '@' . $host; |
62 |
+ |
63 |
+ for (@badmailfrom) { |
64 |
+ my ($pattern, $response) = split /\s+/, $_, 2; |
65 |
+ next unless $from =~ /$pattern/; |
66 |
+ $response = "Your envelope sender is in my badmailfrom_patterns list" |
67 |
+ unless $response; |
68 |
+ $transaction->notes('badmailfrom_patterns', $response); |
69 |
+ } |
70 |
+ return (DECLINED); |
71 |
+} |
72 |
+ |
73 |
+sub hook_rcpt { |
74 |
+ my ($self, $transaction, $rcpt, %param) = @_; |
75 |
+ my $note = $transaction->notes('badmailfrom_patterns'); |
76 |
+ if ($note) { |
77 |
+ $self->log(LOGINFO, $note); |
78 |
+ return (DENY, $note); |
79 |
+ } |
80 |
+ return (DECLINED); |
81 |
+} |
82 |
-- |
83 |
1.7.2.2 |
84 |
|