1 |
stephdl |
1.1 |
diff -Nur -x '*.orig' -x '*.rej' qpsmtpd-plugins-openfusion-20050429/plugins/check_goodrcptto mezzanine_patched_qpsmtpd-plugins-openfusion-20050429/plugins/check_goodrcptto |
2 |
|
|
--- qpsmtpd-plugins-openfusion-20050429/plugins/check_goodrcptto 2007-04-12 09:49:31.000000000 -0600 |
3 |
|
|
+++ mezzanine_patched_qpsmtpd-plugins-openfusion-20050429/plugins/check_goodrcptto 2007-04-12 09:49:13.000000000 -0600 |
4 |
|
|
@@ -1,95 +1,95 @@ |
5 |
|
|
-=head1 NAME |
6 |
|
|
- |
7 |
|
|
-check_goodrcptto |
8 |
|
|
- |
9 |
|
|
-=head1 DESCRIPTION |
10 |
|
|
- |
11 |
|
|
-This plugin denies all recipients except those in the goodrcptto config file |
12 |
|
|
-(i.e. like badrcptto, but whitelisting). It supports recipient username |
13 |
|
|
-extension stripping, and both domain ('@domain.com') and username (bare |
14 |
|
|
-'postmaster') wildcard entries in the config file. |
15 |
|
|
- |
16 |
|
|
-Useful where something like check_delivery is overkill or not an option |
17 |
|
|
-(e.g. relays, bastion hosts). |
18 |
|
|
- |
19 |
|
|
-=head1 CONFIG |
20 |
|
|
- |
21 |
|
|
-The following parameters can be passed to check_goodrcptto: |
22 |
|
|
- |
23 |
|
|
-=over 4 |
24 |
|
|
- |
25 |
|
|
-=item extn <char> |
26 |
|
|
- |
27 |
|
|
-If set, check_goodrcptto does its checks using both the username as given and |
28 |
|
|
-the username stripped of any extensions beginning with <char>. |
29 |
|
|
- |
30 |
|
|
-=item deny_note <name> |
31 |
|
|
- |
32 |
|
|
-If set, check_goodrcptto will set a connection note with the given name when |
33 |
|
|
-denying a recipient. If <name> is of the form 'name=value', then the specified |
34 |
|
|
-value will be used instead of the default '1'. If the connection note already |
35 |
|
|
-exists, the value will be incremented (if numeric), instead of set. |
36 |
|
|
- |
37 |
|
|
- |
38 |
|
|
-=back |
39 |
|
|
- |
40 |
|
|
-=cut |
41 |
|
|
- |
42 |
|
|
-my $VERSION = 0.03; |
43 |
|
|
- |
44 |
|
|
-sub register { |
45 |
|
|
- my ($self, $qp, %arg) = @_; |
46 |
|
|
- $self->register_hook("rcpt", "check_goodrcptto"); |
47 |
|
|
- $self->{_extn} = $arg{extn} if $arg{extn}; |
48 |
|
|
- $self->{_deny_note} = $arg{deny_note} if $arg{deny_note}; |
49 |
|
|
-} |
50 |
|
|
- |
51 |
|
|
-sub check_goodrcptto { |
52 |
|
|
- my ($self, $transaction, $recipient) = @_; |
53 |
|
|
- return (DECLINED) if $self->qp->connection->relay_client; |
54 |
|
|
- $self->log(LOGINFO, "stripping '$self->{_extn}' extensions") if $self->{_extn}; |
55 |
|
|
- my @goodrcptto = $self->qp->config("goodrcptto") or return (DECLINED); |
56 |
|
|
- my $host = lc $recipient->host; |
57 |
|
|
- my $user = lc $recipient->user; |
58 |
|
|
- return (DECLINED) unless $host && $user; |
59 |
|
|
- # Setup users and address stripped of extensions |
60 |
|
|
- my (@parts, @users, @addresses); |
61 |
|
|
- my $extn = $self->{_extn}; |
62 |
|
|
- if ($extn) { |
63 |
|
|
- @parts = split /$extn/, $user; |
64 |
|
|
- foreach (0..$#parts) { |
65 |
|
|
- push @users, join $extn, @parts[0..$_]; |
66 |
|
|
- } |
67 |
|
|
- $self->log(LOGDEBUG, "address includes extn '$extn', checking users: " . (join ' ', @users)); |
68 |
|
|
- } else { |
69 |
|
|
- push @users, $user; |
70 |
|
|
- } |
71 |
|
|
- @addresses = map { $_ . "@" . $host } @users; |
72 |
|
|
- for my $good (@goodrcptto) { |
73 |
|
|
- $good =~ s/^\s*(\S+).*/\L$1/; |
74 |
|
|
- foreach (@addresses) { |
75 |
|
|
- return (DECLINED) if $good eq $_; |
76 |
|
|
- } |
77 |
|
|
- # Allow wildcard '@domain.com' entries |
78 |
|
|
- return (DECLINED) if substr($good,0,1) eq '@' && $good eq "\@$host"; |
79 |
|
|
- # Allow wildcard bare 'username' entries e.g. 'postmaster' |
80 |
|
|
- if (index($good,'@') < 0) { |
81 |
|
|
- foreach (@users) { |
82 |
|
|
- return (DECLINED) if $good eq $_; |
83 |
|
|
- } |
84 |
|
|
- } |
85 |
|
|
- } |
86 |
|
|
- $self->log(LOGWARN, "recipient $addresses[$#addresses] denied"); |
87 |
|
|
- # Set/increment the specified deny_note, if applicable |
88 |
|
|
- if ($self->{_deny_note}) { |
89 |
|
|
- my ($name, $value) = ($self->{_deny_note} =~ m/^([-\w]+)(?:=([\d.]+))?/); |
90 |
|
|
- $value ||= 1; |
91 |
|
|
- $self->qp->connection->notes($name, ($self->qp->connection->notes($name) || 0) + $value) |
92 |
|
|
- if $name; |
93 |
|
|
- $self->log(LOGDEBUG, "deny_note: $name=" . $self->qp->connection->notes($name)); |
94 |
|
|
- } |
95 |
|
|
- return (DENY, "invalid recipient $addresses[$#addresses]"); |
96 |
|
|
-} |
97 |
|
|
- |
98 |
|
|
-# arch-tag: 2d2195a5-27b0-465d-a68f-f425efae2cc0 |
99 |
|
|
- |
100 |
|
|
+=head1 NAME |
101 |
|
|
+ |
102 |
|
|
+check_goodrcptto |
103 |
|
|
+ |
104 |
|
|
+=head1 DESCRIPTION |
105 |
|
|
+ |
106 |
|
|
+This plugin denies all recipients except those in the goodrcptto config file |
107 |
|
|
+(i.e. like badrcptto, but whitelisting). It supports recipient username |
108 |
|
|
+extension stripping, and both domain ('@domain.com') and username (bare |
109 |
|
|
+'postmaster') wildcard entries in the config file. |
110 |
|
|
+ |
111 |
|
|
+Useful where something like check_delivery is overkill or not an option |
112 |
|
|
+(e.g. relays, bastion hosts). |
113 |
|
|
+ |
114 |
|
|
+=head1 CONFIG |
115 |
|
|
+ |
116 |
|
|
+The following parameters can be passed to check_goodrcptto: |
117 |
|
|
+ |
118 |
|
|
+=over 4 |
119 |
|
|
+ |
120 |
|
|
+=item extn <char> |
121 |
|
|
+ |
122 |
|
|
+If set, check_goodrcptto does its checks using both the username as given and |
123 |
|
|
+the username stripped of any extensions beginning with <char>. |
124 |
|
|
+ |
125 |
|
|
+=item deny_note <name> |
126 |
|
|
+ |
127 |
|
|
+If set, check_goodrcptto will set a connection note with the given name when |
128 |
|
|
+denying a recipient. If <name> is of the form 'name=value', then the specified |
129 |
|
|
+value will be used instead of the default '1'. If the connection note already |
130 |
|
|
+exists, the value will be incremented (if numeric), instead of set. |
131 |
|
|
+ |
132 |
|
|
+ |
133 |
|
|
+=back |
134 |
|
|
+ |
135 |
|
|
+=cut |
136 |
|
|
+ |
137 |
|
|
+my $VERSION = 0.03; |
138 |
|
|
+ |
139 |
|
|
+sub register { |
140 |
|
|
+ my ($self, $qp, %arg) = @_; |
141 |
|
|
+ $self->register_hook("rcpt", "check_goodrcptto"); |
142 |
|
|
+ $self->{_extn} = $arg{extn} if $arg{extn}; |
143 |
|
|
+ $self->{_deny_note} = $arg{deny_note} if $arg{deny_note}; |
144 |
|
|
+} |
145 |
|
|
+ |
146 |
|
|
+sub check_goodrcptto { |
147 |
|
|
+ my ($self, $transaction, $recipient) = @_; |
148 |
|
|
+ return (DECLINED) if $self->qp->connection->relay_client; |
149 |
|
|
+ $self->log(LOGINFO, "stripping '$self->{_extn}' extensions") if $self->{_extn}; |
150 |
|
|
+ my @goodrcptto = $self->qp->config("goodrcptto") or return (DECLINED); |
151 |
|
|
+ my $host = lc $recipient->host; |
152 |
|
|
+ my $user = lc $recipient->user; |
153 |
|
|
+ return (DECLINED) unless $host && $user; |
154 |
|
|
+ # Setup users and address stripped of extensions |
155 |
|
|
+ my (@parts, @users, @addresses); |
156 |
|
|
+ my $extn = $self->{_extn}; |
157 |
|
|
+ if ($extn) { |
158 |
|
|
+ @parts = split /$extn/, $user; |
159 |
|
|
+ foreach (0..$#parts) { |
160 |
|
|
+ push @users, join $extn, @parts[0..$_]; |
161 |
|
|
+ } |
162 |
|
|
+ $self->log(LOGDEBUG, "address includes extn '$extn', checking users: " . (join ' ', @users)); |
163 |
|
|
+ } else { |
164 |
|
|
+ push @users, $user; |
165 |
|
|
+ } |
166 |
|
|
+ @addresses = map { $_ . "@" . $host } @users; |
167 |
|
|
+ for my $good (@goodrcptto) { |
168 |
|
|
+ $good =~ s/^\s*(\S+).*/\L$1/; |
169 |
|
|
+ foreach (@addresses) { |
170 |
|
|
+ return (DECLINED) if $good eq $_; |
171 |
|
|
+ } |
172 |
|
|
+ # Allow wildcard '@domain.com' entries |
173 |
|
|
+ return (DECLINED) if substr($good,0,1) eq '@' && $good eq "\@$host"; |
174 |
|
|
+ # Allow wildcard bare 'username' entries e.g. 'postmaster' |
175 |
|
|
+ if (index($good,'@') < 0) { |
176 |
|
|
+ foreach (@users) { |
177 |
|
|
+ return (DECLINED) if $good eq $_; |
178 |
|
|
+ } |
179 |
|
|
+ } |
180 |
|
|
+ } |
181 |
|
|
+ $self->log(LOGWARN, "recipient $addresses[$#addresses] denied"); |
182 |
|
|
+ # Set/increment the specified deny_note, if applicable |
183 |
|
|
+ if ($self->{_deny_note}) { |
184 |
|
|
+ my ($name, $value) = ($self->{_deny_note} =~ m/^([-\w]+)(?:=([\d.]+))?/); |
185 |
|
|
+ $value ||= 1; |
186 |
|
|
+ $self->qp->connection->notes($name, ($self->qp->connection->notes($name) || 0) + $value) |
187 |
|
|
+ if $name; |
188 |
|
|
+ $self->log(LOGDEBUG, "deny_note: $name=" . $self->qp->connection->notes($name)); |
189 |
|
|
+ } |
190 |
|
|
+ return (DENY, "invalid recipient $addresses[$#addresses]"); |
191 |
|
|
+} |
192 |
|
|
+ |
193 |
|
|
+# arch-tag: 2d2195a5-27b0-465d-a68f-f425efae2cc0 |
194 |
|
|
+ |