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 |
+ |