2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 21:55:20 +00:00

postfix-2.2-20040616

This commit is contained in:
Wietse Venema
2004-06-16 00:00:00 -05:00
committed by Viktor Dukhovni
parent 92655d1f64
commit 015fdf16e8
15 changed files with 280 additions and 160 deletions

View File

@@ -9398,6 +9398,22 @@ Apologies for any names omitted.
Documentation: typo fixes by IKEDA Nozomu. Documentation: typo fixes by IKEDA Nozomu.
20040616
Bugfix: one missed variadic argument list fix. Victor
Duchovni, Morgan Stanley. File: global/verify.c.
Bugfix: the resolver client cache should be context dependent
because address verification probes may use a different
route than normal mail deliveries. File: global/resolve_clnt.c.
Safety: added similar context dependence to the address
rewriting client in order to avoid trouble when Postfix is
changed. File: global/rewrite_clnt.c.
Bugfix: space in HELO commands could end up in XFORWARD
commands. File: smtpd/smtpd.c.
Open problems: Open problems:
Low: make sure CCARGS -I options come at the end. Low: make sure CCARGS -I options come at the end.

View File

@@ -116,8 +116,8 @@ small site, you probably want to change that into $mydomain, which defaults to
the parent domain of the machine name. the parent domain of the machine name.
For the sake of consistency between sender and recipient addresses, myorigin For the sake of consistency between sender and recipient addresses, myorigin
also specifies the default domain name that is appended to an unqualified also specifies the domain name that is appended to an unqualified recipient
recipient address. address.
Examples (specify only one of the following): Examples (specify only one of the following):

View File

@@ -187,7 +187,7 @@ want to change that into $<a href="postconf.5.html#mydomain">mydomain</a>, which
domain of the machine name. </p> domain of the machine name. </p>
<p> For the sake of consistency between sender and recipient addresses, <p> For the sake of consistency between sender and recipient addresses,
<a href="postconf.5.html#myorigin">myorigin</a> also specifies the <a href="ADDRESS_CLASS_README.html#default_domain_class">default domain</a> name that is appended <a href="postconf.5.html#myorigin">myorigin</a> also specifies the domain name that is appended
to an unqualified recipient address. </p> to an unqualified recipient address. </p>
<p> Examples (specify only one of the following): </p> <p> Examples (specify only one of the following): </p>

View File

@@ -3335,7 +3335,7 @@ What addresses are subject to address masquerading.
</p> </p>
<p> <p>
By default, address masquerading is limited to envelope recipient By default, address masquerading is limited to envelope sender
addresses, and to header sender and header recipient addresses. addresses, and to header sender and header recipient addresses.
This allows you to use address masquerading on a mail gateway while This allows you to use address masquerading on a mail gateway while
still being able to forward mail to users on individual machines. still being able to forward mail to users on individual machines.

View File

@@ -1670,7 +1670,7 @@ Do not change this unless you have a complete understanding of RFC 821.
.SH masquerade_classes (default: envelope_sender, header_sender, header_recipient) .SH masquerade_classes (default: envelope_sender, header_sender, header_recipient)
What addresses are subject to address masquerading. What addresses are subject to address masquerading.
.PP .PP
By default, address masquerading is limited to envelope recipient By default, address masquerading is limited to envelope sender
addresses, and to header sender and header recipient addresses. addresses, and to header sender and header recipient addresses.
This allows you to use address masquerading on a mail gateway while This allows you to use address masquerading on a mail gateway while
still being able to forward mail to users on individual machines. still being able to forward mail to users on individual machines.

View File

@@ -187,7 +187,7 @@ want to change that into $mydomain, which defaults to the parent
domain of the machine name. </p> domain of the machine name. </p>
<p> For the sake of consistency between sender and recipient addresses, <p> For the sake of consistency between sender and recipient addresses,
myorigin also specifies the default domain name that is appended myorigin also specifies the domain name that is appended
to an unqualified recipient address. </p> to an unqualified recipient address. </p>
<p> Examples (specify only one of the following): </p> <p> Examples (specify only one of the following): </p>

View File

@@ -2064,7 +2064,7 @@ What addresses are subject to address masquerading.
</p> </p>
<p> <p>
By default, address masquerading is limited to envelope recipient By default, address masquerading is limited to envelope sender
addresses, and to header sender and header recipient addresses. addresses, and to header sender and header recipient addresses.
This allows you to use address masquerading on a mail gateway while This allows you to use address masquerading on a mail gateway while
still being able to forward mail to users on individual machines. still being able to forward mail to users on individual machines.

View File

@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the * Patches change the patchlevel and the release date. Snapshots change the
* release date only. * release date only.
*/ */
#define MAIL_RELEASE_DATE "20040615" #define MAIL_RELEASE_DATE "20040616"
#define MAIL_VERSION_NUMBER "2.2" #define MAIL_VERSION_NUMBER "2.2"
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"

View File

@@ -91,6 +91,17 @@ const char *mynetworks(void)
mask_style = name_mask("mynetworks mask style", mask_styles, mask_style = name_mask("mynetworks mask style", mask_styles,
var_mynetworks_style); var_mynetworks_style);
/*
* XXX Workaround: name_mask() needs a flags argument so that we can
* require exactly one value, or we need to provide an API that is
* dedicated for single-valued flags.
*/
for (i = 0, junk = mask_style; junk != 0; junk >>= 1)
i += (junk & 1);
if (i != 1)
msg_fatal("bad %s value: %s; specify exactly one value",
VAR_MYNETWORKS_STYLE, var_mynetworks_style);
result = vstring_alloc(20); result = vstring_alloc(20);
my_addr_list = own_inet_addr_list(); my_addr_list = own_inet_addr_list();
my_mask_list = own_inet_mask_list(); my_mask_list = own_inet_mask_list();

View File

@@ -127,6 +127,7 @@
*/ */
extern CLNT_STREAM *rewrite_clnt_stream; extern CLNT_STREAM *rewrite_clnt_stream;
static VSTRING *last_class;
static VSTRING *last_addr; static VSTRING *last_addr;
static RESOLVE_REPLY last_reply; static RESOLVE_REPLY last_reply;
@@ -151,6 +152,7 @@ void resolve_clnt(const char *class, const char *addr, RESOLVE_REPLY *reply)
* One-entry cache. * One-entry cache.
*/ */
if (last_addr == 0) { if (last_addr == 0) {
last_class = vstring_alloc(10);
last_addr = vstring_alloc(100); last_addr = vstring_alloc(100);
resolve_clnt_init(&last_reply); resolve_clnt_init(&last_reply);
} }
@@ -169,7 +171,8 @@ void resolve_clnt(const char *class, const char *addr, RESOLVE_REPLY *reply)
*/ */
#define IFSET(flag, text) ((reply->flags & (flag)) ? (text) : "") #define IFSET(flag, text) ((reply->flags & (flag)) ? (text) : "")
if (*addr && strcmp(addr, STR(last_addr)) == 0) { if (*addr && strcmp(addr, STR(last_addr)) == 0
&& strcmp(class, STR(last_class)) == 0) {
vstring_strcpy(reply->transport, STR(last_reply.transport)); vstring_strcpy(reply->transport, STR(last_reply.transport));
vstring_strcpy(reply->nexthop, STR(last_reply.nexthop)); vstring_strcpy(reply->nexthop, STR(last_reply.nexthop));
vstring_strcpy(reply->recipient, STR(last_reply.recipient)); vstring_strcpy(reply->recipient, STR(last_reply.recipient));
@@ -246,6 +249,7 @@ void resolve_clnt(const char *class, const char *addr, RESOLVE_REPLY *reply)
/* /*
* Update the cache. * Update the cache.
*/ */
vstring_strcpy(last_class, class);
vstring_strcpy(last_addr, addr); vstring_strcpy(last_addr, addr);
vstring_strcpy(last_reply.transport, STR(reply->transport)); vstring_strcpy(last_reply.transport, STR(reply->transport));
vstring_strcpy(last_reply.nexthop, STR(reply->nexthop)); vstring_strcpy(last_reply.nexthop, STR(reply->nexthop));
@@ -267,6 +271,7 @@ void resolve_clnt_free(RESOLVE_REPLY *reply)
#include <stdlib.h> #include <stdlib.h>
#include <msg_vstream.h> #include <msg_vstream.h>
#include <vstring_vstream.h> #include <vstring_vstream.h>
#include <split_at.h>
#include <mail_conf.h> #include <mail_conf.h>
static NORETURN usage(char *myname) static NORETURN usage(char *myname)
@@ -274,7 +279,7 @@ static NORETURN usage(char *myname)
msg_fatal("usage: %s [-v] [address...]", myname); msg_fatal("usage: %s [-v] [address...]", myname);
} }
static void resolve(char *addr, RESOLVE_REPLY *reply) static void resolve(char *class, char *addr, RESOLVE_REPLY *reply)
{ {
struct RESOLVE_FLAG_TABLE { struct RESOLVE_FLAG_TABLE {
int flag; int flag;
@@ -294,10 +299,11 @@ static void resolve(char *addr, RESOLVE_REPLY *reply)
}; };
struct RESOLVE_FLAG_TABLE *fp; struct RESOLVE_FLAG_TABLE *fp;
resolve_clnt_query(addr, reply); resolve_clnt(class, addr, reply);
if (reply->flags & RESOLVE_FLAG_FAIL) { if (reply->flags & RESOLVE_FLAG_FAIL) {
vstream_printf("request failed\n"); vstream_printf("request failed\n");
} else { } else {
vstream_printf("%-10s %s\n", "class", class);
vstream_printf("%-10s %s\n", "address", addr); vstream_printf("%-10s %s\n", "address", addr);
vstream_printf("%-10s %s\n", "transport", STR(reply->transport)); vstream_printf("%-10s %s\n", "transport", STR(reply->transport));
vstream_printf("%-10s %s\n", "nexthop", *STR(reply->nexthop) ? vstream_printf("%-10s %s\n", "nexthop", *STR(reply->nexthop) ?
@@ -320,6 +326,7 @@ static void resolve(char *addr, RESOLVE_REPLY *reply)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
RESOLVE_REPLY reply; RESOLVE_REPLY reply;
char *addr;
int ch; int ch;
msg_vstream_init(argv[0], VSTREAM_ERR); msg_vstream_init(argv[0], VSTREAM_ERR);
@@ -341,15 +348,17 @@ int main(int argc, char **argv)
resolve_clnt_init(&reply); resolve_clnt_init(&reply);
if (argc > optind) { if (argc > optind) {
while (argv[optind]) { while (argv[optind] && argv[optind + 1]) {
resolve(argv[optind], &reply); resolve(argv[optind], argv[optind + 1], &reply);
optind++; optind += 2;
} }
} else { } else {
VSTRING *buffer = vstring_alloc(1); VSTRING *buffer = vstring_alloc(1);
while (vstring_fgets_nonl(buffer, VSTREAM_IN)) { while (vstring_fgets_nonl(buffer, VSTREAM_IN)) {
resolve(STR(buffer), &reply); if ((addr = split_at(STR(buffer), ' ')) == 0 || *STR(buffer) == 0)
msg_fatal("need as input: class address");
resolve(STR(buffer), addr, &reply);
} }
vstring_free(buffer); vstring_free(buffer);
} }

View File

@@ -1,45 +1,49 @@
resolve
@ resolve @
@@ resolve @@
@a. resolve @a.
@.. resolve @..
@.@. resolve @.@.
! resolve !
a! resolve a!
!b resolve !b
a!b resolve a!b
!@ resolve !@
a!@ resolve a!@
!b@ resolve !b@
a!b@ resolve a!b@
% resolve %
a% resolve a%
%b resolve %b
a%b resolve a%b
%@ resolve %@
a%@ resolve a%@
%b@ resolve %b@
@@ resolve @@
a@@ resolve a@@
@b@ resolve @b@
a@b@ resolve a@b@
a%b@ resolve a%b@
a%b@MYHOSTNAME resolve a%b@MYHOSTNAME
a!b@MYHOSTNAME resolve a!b@MYHOSTNAME
a@b@MYHOSTNAME resolve a@b@MYHOSTNAME
a[b]@MYHOSTNAME@MYHOSTNAME resolve a[b]@MYHOSTNAME@MYHOSTNAME
a[b]%MYHOSTNAME@MYHOSTNAME resolve a[b]%MYHOSTNAME@MYHOSTNAME
a[b]%MYHOSTNAME%MYHOSTNAME resolve a[b]%MYHOSTNAME%MYHOSTNAME
MYHOSTNAME!a[b]@MYHOSTNAME resolve MYHOSTNAME!a[b]@MYHOSTNAME
MYHOSTNAME!a[b]%MYHOSTNAME resolve MYHOSTNAME!a[b]%MYHOSTNAME
MYHOSTNAME!MYHOSTNAME!a[b] resolve MYHOSTNAME!MYHOSTNAME!a[b]
user@dom.ain1@dom.ain2 resolve user@dom.ain1@dom.ain2
user%dom.ain1@dom.ain2 resolve user%dom.ain1@dom.ain2
dom.ain1!user@dom.ain2 resolve dom.ain1!user@dom.ain2
user@[1.2.3.4]@dom.ain2 resolve user@[1.2.3.4]@dom.ain2
user%[1.2.3.4]@dom.ain2 resolve user%[1.2.3.4]@dom.ain2
[1.2.3.4]!user@dom.ain2 resolve [1.2.3.4]!user@dom.ain2
user@localhost.MYDOMAIN resolve user@localhost.MYDOMAIN
user@[321.1.2.3] resolve user@[321.1.2.3]
user@1.2.3 resolve user@1.2.3
user@host:port resolve user@host:port
resolve user@host
resolve user@host
verify user@host
verify user@host

View File

@@ -1,270 +1,343 @@
class resolve
address address
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address @ address @
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address @@ address @@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address @a. address @a.
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @a recipient @a
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address @.. address @..
transport smtp transport CHANNEL NOT UPDATED
nexthop RELAYHOST nexthop NEXTHOP NOT UPDATED
recipient @.. recipient @..
flags FLAG_ERROR CLASS_DEFAULT flags FLAG_ERROR CLASS_DEFAULT
class resolve
address @.@. address @.@.
transport smtp transport CHANNEL NOT UPDATED
nexthop RELAYHOST nexthop NEXTHOP NOT UPDATED
recipient @.@. recipient @.@.
flags FLAG_ROUTED FLAG_ERROR CLASS_DEFAULT flags FLAG_ERROR CLASS_DEFAULT
class resolve
address ! address !
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a! address a!
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @a.MYDOMAIN recipient @a.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address !b address !b
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient b@MYHOSTNAME recipient b@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a!b address a!b
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient b@a.MYDOMAIN recipient b@a.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address !@ address !@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a!@ address a!@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @a.MYDOMAIN recipient @a.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address !b@ address !b@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient b@MYHOSTNAME recipient b@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a!b@ address a!b@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient b@a.MYDOMAIN recipient b@a.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address % address %
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a% address a%
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a@MYHOSTNAME recipient a@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address %b address %b
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @b.MYDOMAIN recipient @b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address a%b address a%b
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient a@b.MYDOMAIN recipient a@b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address %@ address %@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a%@ address a%@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a@MYHOSTNAME recipient a@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address %b@ address %b@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @b.MYDOMAIN recipient @b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address @@ address @@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient MAILER-DAEMON@MYHOSTNAME recipient MAILER-DAEMON@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address a@@ address a@@
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a@MYHOSTNAME recipient a@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address @b@ address @b@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient @b.MYDOMAIN recipient @b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address a@b@ address a@b@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient a@b.MYDOMAIN recipient a@b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address a%b@ address a%b@
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient a@b.MYDOMAIN recipient a@b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
address a%b@MYHOSTNAME class resolve
address a%b@tail.porcupine.org
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient a@b.MYDOMAIN recipient a@b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
address a!b@MYHOSTNAME class resolve
address a!b@tail.porcupine.org
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient b@a.MYDOMAIN recipient b@a.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
address a@b@MYHOSTNAME class resolve
address a@b@tail.porcupine.org
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient a@b.MYDOMAIN recipient a@b.porcupine.org
flags CLASS_DEFAULT flags CLASS_DEFAULT
address a[b]@MYHOSTNAME@MYHOSTNAME class resolve
address a[b]@tail.porcupine.org@tail.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a[b]@MYHOSTNAME recipient a[b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
address a[b]%MYHOSTNAME@MYHOSTNAME class resolve
address a[b]%tail.porcupine.org@tail.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a[b]@MYHOSTNAME recipient a[b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
address a[b]%MYHOSTNAME%MYHOSTNAME class resolve
address a[b]%tail.porcupine.org%tail.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a[b]@MYHOSTNAME recipient a[b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
address MYHOSTNAME!a[b]@MYHOSTNAME class resolve
address tail.porcupine.org!a[b]@tail.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a [b]@MYHOSTNAME recipient a [b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
address MYHOSTNAME!a[b]%MYHOSTNAME class resolve
address tail.porcupine.org!a[b]%tail.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a [b]@MYHOSTNAME recipient a [b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
address MYHOSTNAME!MYHOSTNAME!a[b] class resolve
address tail.porcupine.org!tail.porcupine.org!a[b]
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient a [b]@MYHOSTNAME recipient a [b]@tail.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address user@dom.ain1@dom.ain2 address user@dom.ain1@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient user@dom.ain1@dom.ain2 recipient user@dom.ain1@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
class resolve
address user%dom.ain1@dom.ain2 address user%dom.ain1@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient user%dom.ain1@dom.ain2 recipient user%dom.ain1@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
class resolve
address dom.ain1!user@dom.ain2 address dom.ain1!user@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient dom.ain1!user@dom.ain2 recipient dom.ain1!user@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
class resolve
address user@[1.2.3.4]@dom.ain2 address user@[1.2.3.4]@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient user@[1.2.3.4]@dom.ain2 recipient user@[1.2.3.4]@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
class resolve
address user%[1.2.3.4]@dom.ain2 address user%[1.2.3.4]@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient user%[1.2.3.4]@dom.ain2 recipient user%[1.2.3.4]@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
class resolve
address [1.2.3.4]!user@dom.ain2 address [1.2.3.4]!user@dom.ain2
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient [1.2.3.4]!user@dom.ain2 recipient [1.2.3.4]!user@dom.ain2
flags FLAG_ROUTED CLASS_DEFAULT flags FLAG_ROUTED CLASS_DEFAULT
address user@localhost.MYDOMAIN class resolve
address user@localhost.porcupine.org
transport local transport local
nexthop MYHOSTNAME nexthop tail.porcupine.org
recipient user@localhost.MYDOMAIN recipient user@localhost.porcupine.org
flags CLASS_LOCAL flags CLASS_LOCAL
class resolve
address user@[321.1.2.3] address user@[321.1.2.3]
transport smtp transport CHANNEL NOT UPDATED
nexthop RELAYHOST nexthop NEXTHOP NOT UPDATED
recipient user@[321.1.2.3] recipient user@[321.1.2.3]
flags FLAG_ERROR CLASS_DEFAULT flags FLAG_ERROR CLASS_DEFAULT
class resolve
address user@1.2.3 address user@1.2.3
transport smtp transport smtp
nexthop RELAYHOST nexthop porcupine.org
recipient user@1.2.3 recipient user@1.2.3
flags CLASS_DEFAULT flags CLASS_DEFAULT
class resolve
address user@host:port address user@host:port
transport smtp transport CHANNEL NOT UPDATED
nexthop RELAYHOST nexthop NEXTHOP NOT UPDATED
recipient user@host:port recipient user@host:port
flags FLAG_ERROR CLASS_DEFAULT flags FLAG_ERROR CLASS_DEFAULT
class resolve
address user@host
transport smtp
nexthop porcupine.org
recipient user@host
flags CLASS_DEFAULT
class resolve
address user@host
transport smtp
nexthop porcupine.org
recipient user@host
flags CLASS_DEFAULT
class verify
address user@host
transport smtp
nexthop porcupine.org
recipient user@host
flags CLASS_DEFAULT
class verify
address user@host
transport smtp
nexthop porcupine.org
recipient user@host
flags CLASS_DEFAULT

View File

@@ -72,6 +72,7 @@
*/ */
CLNT_STREAM *rewrite_clnt_stream = 0; CLNT_STREAM *rewrite_clnt_stream = 0;
static VSTRING *last_rule;
static VSTRING *last_addr; static VSTRING *last_addr;
static VSTRING *last_result; static VSTRING *last_result;
@@ -85,6 +86,7 @@ VSTRING *rewrite_clnt(const char *rule, const char *addr, VSTRING *result)
* One-entry cache. * One-entry cache.
*/ */
if (last_addr == 0) { if (last_addr == 0) {
last_rule = vstring_alloc(10);
last_addr = vstring_alloc(100); last_addr = vstring_alloc(100);
last_result = vstring_alloc(100); last_result = vstring_alloc(100);
} }
@@ -102,10 +104,9 @@ VSTRING *rewrite_clnt(const char *rule, const char *addr, VSTRING *result)
/* /*
* Peek at the cache. * Peek at the cache.
*
* XXX Must be made "rule" specific.
*/ */
if (strcmp(addr, STR(last_addr)) == 0) { if (strcmp(addr, STR(last_addr)) == 0
&& strcmp(rule, STR(last_rule)) == 0) {
vstring_strcpy(result, STR(last_result)); vstring_strcpy(result, STR(last_result));
if (msg_verbose) if (msg_verbose)
msg_info("rewrite_clnt: cached: %s: %s -> %s", msg_info("rewrite_clnt: cached: %s: %s -> %s",
@@ -152,6 +153,7 @@ VSTRING *rewrite_clnt(const char *rule, const char *addr, VSTRING *result)
/* /*
* Update the cache. * Update the cache.
*/ */
vstring_strcpy(last_rule, rule);
vstring_strcpy(last_addr, addr); vstring_strcpy(last_addr, addr);
vstring_strcpy(last_result, STR(result)); vstring_strcpy(last_result, STR(result));

View File

@@ -142,7 +142,8 @@ int vverify_append(const char *queue_id, const char *orig_rcpt,
*/ */
vstring_vsprintf(text, fmt, ap); vstring_vsprintf(text, fmt, ap);
if (var_verify_neg_cache || rcpt_stat == DEL_RCPT_STAT_OK) { if (var_verify_neg_cache || rcpt_stat == DEL_RCPT_STAT_OK) {
req_stat = verify_clnt_vupdate(orig_rcpt, rcpt_stat, fmt, ap); req_stat = verify_clnt_update(orig_rcpt, rcpt_stat,
"%s", vstring_str(text));
if (req_stat == VRFY_STAT_OK && strcasecmp(recipient, orig_rcpt) != 0) if (req_stat == VRFY_STAT_OK && strcasecmp(recipient, orig_rcpt) != 0)
req_stat = verify_clnt_update(recipient, rcpt_stat, req_stat = verify_clnt_update(recipient, rcpt_stat,
"%s", vstring_str(text)); "%s", vstring_str(text));

View File

@@ -811,6 +811,11 @@ static void mail_reset(SMTPD_STATE *);
static void rcpt_reset(SMTPD_STATE *); static void rcpt_reset(SMTPD_STATE *);
static void chat_reset(SMTPD_STATE *, int); static void chat_reset(SMTPD_STATE *, int);
/*
* This filter is applied after printable().
*/
#define NEUTER_CHARACTERS " <>()\\\";:@"
#ifdef USE_SASL_AUTH #ifdef USE_SASL_AUTH
/* /*
@@ -882,7 +887,7 @@ static int helo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
mail_reset(state); mail_reset(state);
rcpt_reset(state); rcpt_reset(state);
state->helo_name = mystrdup(printable(argv[1].strval, '?')); state->helo_name = mystrdup(printable(argv[1].strval, '?'));
neuter(state->helo_name, "<>()\\\";:@", '?'); neuter(state->helo_name, NEUTER_CHARACTERS, '?');
/* Downgrading the protocol name breaks the unauthorized pipelining test. */ /* Downgrading the protocol name breaks the unauthorized pipelining test. */
if (strcasecmp(state->protocol, MAIL_PROTO_ESMTP) != 0 if (strcasecmp(state->protocol, MAIL_PROTO_ESMTP) != 0
&& strcasecmp(state->protocol, MAIL_PROTO_SMTP) != 0) { && strcasecmp(state->protocol, MAIL_PROTO_SMTP) != 0) {
@@ -923,7 +928,7 @@ static int ehlo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
mail_reset(state); mail_reset(state);
rcpt_reset(state); rcpt_reset(state);
state->helo_name = mystrdup(printable(argv[1].strval, '?')); state->helo_name = mystrdup(printable(argv[1].strval, '?'));
neuter(state->helo_name, "<>()\\\";:@", '?'); neuter(state->helo_name, NEUTER_CHARACTERS, '?');
if (strcasecmp(state->protocol, MAIL_PROTO_ESMTP) != 0) { if (strcasecmp(state->protocol, MAIL_PROTO_ESMTP) != 0) {
myfree(state->protocol); myfree(state->protocol);
state->protocol = mystrdup(MAIL_PROTO_ESMTP); state->protocol = mystrdup(MAIL_PROTO_ESMTP);
@@ -2012,7 +2017,6 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
if (s) myfree(s); \ if (s) myfree(s); \
s = (v) ? mystrdup(v) : 0; \ s = (v) ? mystrdup(v) : 0; \
} while(0) } while(0)
#define NEUTER_CHARACTERS "<>()\\\";:@"
/* /*
* Iterate over all attribute=value elements. * Iterate over all attribute=value elements.