mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-01 14:45:32 +00:00
postfix-2.4-20061015
This commit is contained in:
committed by
Viktor Dukhovni
parent
8496eb5cae
commit
220fa5cc40
@@ -12789,8 +12789,26 @@ Apologies for any names omitted.
|
|||||||
multiple (x)inetd.conf entries. Victor Duchovni. Files:
|
multiple (x)inetd.conf entries. Victor Duchovni. Files:
|
||||||
smtpd/smtpd.c, tls/tls_server.c.
|
smtpd/smtpd.c, tls/tls_server.c.
|
||||||
|
|
||||||
|
20061015
|
||||||
|
|
||||||
|
Cleanup: convert the Milter {mail_addr} and {rcpt_addr}
|
||||||
|
macro values to external form. File: smtpd/smtpd_milter.c.
|
||||||
|
|
||||||
|
Cleanup: the Milter {mail_addr} and {rcpt_addr} macros are
|
||||||
|
now available with non-SMTP mail. File: cleanup/cleanup_milter.c.
|
||||||
|
|
||||||
|
Cleanup: convert addresses in Milter recipient add/delete
|
||||||
|
requests to internal form. File: cleanup/cleanup_milter.c.
|
||||||
|
|
||||||
|
Cleanup: with non-SMTP mail, convert addresses in simulated
|
||||||
|
MAIL FROM and RCPT TO events to external form. File:
|
||||||
|
cleanup/cleanup_milter.c.
|
||||||
|
|
||||||
Wish list:
|
Wish list:
|
||||||
|
|
||||||
|
Find out if with Sendmail, a Milter "add recipient" request
|
||||||
|
results in NOTIFY=NONE as Postfix does now.
|
||||||
|
|
||||||
Update FILTER_README with mailing list suggestions to tag
|
Update FILTER_README with mailing list suggestions to tag
|
||||||
with a badness indicator and then filter down-stream.
|
with a badness indicator and then filter down-stream.
|
||||||
|
|
||||||
@@ -12836,11 +12854,6 @@ Wish list:
|
|||||||
|
|
||||||
Do or don't introduce unknown_reverse_client_reject_code.
|
Do or don't introduce unknown_reverse_client_reject_code.
|
||||||
|
|
||||||
In Milter events, mail_addr/rcpt_addr should be externalized
|
|
||||||
as they are in Sendmail. Likewise, addresses in add/delete
|
|
||||||
requests should be internalized before updating the queue
|
|
||||||
file.
|
|
||||||
|
|
||||||
Check that "UINT32 == unsigned int" choice is ok (i.e. LP64
|
Check that "UINT32 == unsigned int" choice is ok (i.e. LP64
|
||||||
UNIX).
|
UNIX).
|
||||||
|
|
||||||
|
@@ -46,7 +46,7 @@ LOCAL(8) LOCAL(8)
|
|||||||
local delivery agent tries each pathname in the list until
|
local delivery agent tries each pathname in the list until
|
||||||
a file is found.
|
a file is found.
|
||||||
|
|
||||||
Delivery via ~/.<b>.forward</b> files is done with the privileges
|
Delivery via ~/.<b>forward</b> files is done with the privileges
|
||||||
of the recipient. Thus, ~/.<b>forward</b> like files must be
|
of the recipient. Thus, ~/.<b>forward</b> like files must be
|
||||||
readable by the recipient, and their parent directory
|
readable by the recipient, and their parent directory
|
||||||
needs to have "execute" permission for the recipient.
|
needs to have "execute" permission for the recipient.
|
||||||
|
@@ -49,7 +49,7 @@ of ~\fR/.\fBforward\fR like files through the \fBforward_path\fR
|
|||||||
configuration parameter. Upon delivery, the local delivery agent
|
configuration parameter. Upon delivery, the local delivery agent
|
||||||
tries each pathname in the list until a file is found.
|
tries each pathname in the list until a file is found.
|
||||||
|
|
||||||
Delivery via ~/.\fB.forward\fR files is done with the privileges
|
Delivery via ~/.\fBforward\fR files is done with the privileges
|
||||||
of the recipient.
|
of the recipient.
|
||||||
Thus, ~/.\fBforward\fR like files must be readable by the
|
Thus, ~/.\fBforward\fR like files must be readable by the
|
||||||
recipient, and their parent directory needs to have "execute"
|
recipient, and their parent directory needs to have "execute"
|
||||||
|
@@ -577,6 +577,8 @@ cleanup_milter.o: ../../include/msg.h
|
|||||||
cleanup_milter.o: ../../include/mymalloc.h
|
cleanup_milter.o: ../../include/mymalloc.h
|
||||||
cleanup_milter.o: ../../include/nvtable.h
|
cleanup_milter.o: ../../include/nvtable.h
|
||||||
cleanup_milter.o: ../../include/off_cvt.h
|
cleanup_milter.o: ../../include/off_cvt.h
|
||||||
|
cleanup_milter.o: ../../include/quote_821_local.h
|
||||||
|
cleanup_milter.o: ../../include/quote_flags.h
|
||||||
cleanup_milter.o: ../../include/rec_attr_map.h
|
cleanup_milter.o: ../../include/rec_attr_map.h
|
||||||
cleanup_milter.o: ../../include/rec_type.h
|
cleanup_milter.o: ../../include/rec_type.h
|
||||||
cleanup_milter.o: ../../include/record.h
|
cleanup_milter.o: ../../include/record.h
|
||||||
|
@@ -95,6 +95,8 @@ typedef struct CLEANUP_STATE {
|
|||||||
const char *client_addr; /* real or ersatz client */
|
const char *client_addr; /* real or ersatz client */
|
||||||
int client_af; /* real or ersatz client */
|
int client_af; /* real or ersatz client */
|
||||||
const char *client_port; /* real or ersatz client */
|
const char *client_port; /* real or ersatz client */
|
||||||
|
VSTRING *milter_ext_from; /* externalized sender */
|
||||||
|
VSTRING *milter_ext_rcpt; /* externalized recipient */
|
||||||
} CLEANUP_STATE;
|
} CLEANUP_STATE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -104,6 +104,7 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <lex_822.h>
|
#include <lex_822.h>
|
||||||
#include <is_header.h>
|
#include <is_header.h>
|
||||||
|
#include <quote_821_local.h>
|
||||||
|
|
||||||
/* Application-specific. */
|
/* Application-specific. */
|
||||||
|
|
||||||
@@ -968,15 +969,19 @@ static const char *cleanup_del_header(void *context, ssize_t index,
|
|||||||
|
|
||||||
/* cleanup_add_rcpt - append recipient address */
|
/* cleanup_add_rcpt - append recipient address */
|
||||||
|
|
||||||
static const char *cleanup_add_rcpt(void *context, char *rcpt)
|
static const char *cleanup_add_rcpt(void *context, char *ext_rcpt)
|
||||||
{
|
{
|
||||||
const char *myname = "cleanup_add_rcpt";
|
const char *myname = "cleanup_add_rcpt";
|
||||||
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
|
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
|
||||||
off_t new_rcpt_offset;
|
off_t new_rcpt_offset;
|
||||||
off_t reverse_ptr_offset;
|
off_t reverse_ptr_offset;
|
||||||
|
int addr_count;
|
||||||
|
TOK822 *tree;
|
||||||
|
TOK822 *tp;
|
||||||
|
VSTRING *int_rcpt_buf;
|
||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: \"%s\"", myname, rcpt);
|
msg_info("%s: \"%s\"", myname, ext_rcpt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To simplify implementation, the cleanup server writes a dummy
|
* To simplify implementation, the cleanup server writes a dummy
|
||||||
@@ -1006,7 +1011,35 @@ static const char *cleanup_add_rcpt(void *context, char *rcpt)
|
|||||||
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
|
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
|
||||||
return (cleanup_milter_error(state, errno));
|
return (cleanup_milter_error(state, errno));
|
||||||
}
|
}
|
||||||
cleanup_addr_bcc(state, rcpt);
|
|
||||||
|
/*
|
||||||
|
* Transform recipient from external form to internal form. This also
|
||||||
|
* removes the enclosing <>, if present.
|
||||||
|
*
|
||||||
|
* XXX vstring_alloc() rejects zero-length requests.
|
||||||
|
*/
|
||||||
|
int_rcpt_buf = vstring_alloc(strlen(ext_rcpt) + 1);
|
||||||
|
tree = tok822_parse(ext_rcpt);
|
||||||
|
for (addr_count = 0, tp = tree; tp != 0; tp = tp->next) {
|
||||||
|
if (tp->type == TOK822_ADDR) {
|
||||||
|
if (addr_count == 0) {
|
||||||
|
tok822_internalize(int_rcpt_buf, tp->head, TOK822_STR_DEFL);
|
||||||
|
addr_count += 1;
|
||||||
|
} else {
|
||||||
|
msg_warn("%s: Milter request to add multi-recipient: \"%s\"",
|
||||||
|
state->queue_id, ext_rcpt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tok822_free_tree(tree);
|
||||||
|
cleanup_addr_bcc(state, STR(int_rcpt_buf));
|
||||||
|
vstring_free(int_rcpt_buf);
|
||||||
|
if (addr_count == 0) {
|
||||||
|
msg_warn("%s: ignoring attempt from Milter to add null recipient",
|
||||||
|
state->queue_id);
|
||||||
|
return (CLEANUP_OUT_OK(state) ? 0 : cleanup_milter_error(state, 0));
|
||||||
|
}
|
||||||
if ((reverse_ptr_offset = vstream_ftell(state->dst)) < 0) {
|
if ((reverse_ptr_offset = vstream_ftell(state->dst)) < 0) {
|
||||||
msg_warn("%s: vstream_ftell file %s: %m", myname, cleanup_path);
|
msg_warn("%s: vstream_ftell file %s: %m", myname, cleanup_path);
|
||||||
return (cleanup_milter_error(state, errno));
|
return (cleanup_milter_error(state, errno));
|
||||||
@@ -1042,7 +1075,7 @@ static const char *cleanup_add_rcpt(void *context, char *rcpt)
|
|||||||
|
|
||||||
/* cleanup_del_rcpt - remove recipient and all its expansions */
|
/* cleanup_del_rcpt - remove recipient and all its expansions */
|
||||||
|
|
||||||
static const char *cleanup_del_rcpt(void *context, char *rcpt)
|
static const char *cleanup_del_rcpt(void *context, char *ext_rcpt)
|
||||||
{
|
{
|
||||||
const char *myname = "cleanup_del_rcpt";
|
const char *myname = "cleanup_del_rcpt";
|
||||||
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
|
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
|
||||||
@@ -1057,9 +1090,13 @@ static const char *cleanup_del_rcpt(void *context, char *rcpt)
|
|||||||
int rec_type;
|
int rec_type;
|
||||||
int junk;
|
int junk;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
TOK822 *tree;
|
||||||
|
TOK822 *tp;
|
||||||
|
VSTRING *int_rcpt_buf;
|
||||||
|
int addr_count;
|
||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: \"%s\"", myname, rcpt);
|
msg_info("%s: \"%s\"", myname, ext_rcpt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Virtual aliasing and other address rewriting happens after the mail
|
* Virtual aliasing and other address rewriting happens after the mail
|
||||||
@@ -1091,9 +1128,32 @@ static const char *cleanup_del_rcpt(void *context, char *rcpt)
|
|||||||
if (dsn_orcpt != 0) \
|
if (dsn_orcpt != 0) \
|
||||||
myfree(dsn_orcpt); \
|
myfree(dsn_orcpt); \
|
||||||
vstring_free(buf); \
|
vstring_free(buf); \
|
||||||
|
vstring_free(int_rcpt_buf); \
|
||||||
return (ret); \
|
return (ret); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transform recipient from external form to internal form. This also
|
||||||
|
* removes the enclosing <>, if present.
|
||||||
|
*
|
||||||
|
* XXX vstring_alloc() rejects zero-length requests.
|
||||||
|
*/
|
||||||
|
int_rcpt_buf = vstring_alloc(strlen(ext_rcpt) + 1);
|
||||||
|
tree = tok822_parse(ext_rcpt);
|
||||||
|
for (addr_count = 0, tp = tree; tp != 0; tp = tp->next) {
|
||||||
|
if (tp->type == TOK822_ADDR) {
|
||||||
|
if (addr_count == 0) {
|
||||||
|
tok822_internalize(int_rcpt_buf, tp->head, TOK822_STR_DEFL);
|
||||||
|
addr_count += 1;
|
||||||
|
} else {
|
||||||
|
msg_warn("%s: Milter request to drop multi-recipient: \"%s\"",
|
||||||
|
state->queue_id, ext_rcpt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tok822_free_tree(tree);
|
||||||
|
|
||||||
buf = vstring_alloc(100);
|
buf = vstring_alloc(100);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (CLEANUP_OUT_OK(state) == 0)
|
if (CLEANUP_OUT_OK(state) == 0)
|
||||||
@@ -1154,7 +1214,7 @@ static const char *cleanup_del_rcpt(void *context, char *rcpt)
|
|||||||
orig_rcpt = mystrdup(start);
|
orig_rcpt = mystrdup(start);
|
||||||
break;
|
break;
|
||||||
case REC_TYPE_RCPT: /* rewritten RCPT TO address */
|
case REC_TYPE_RCPT: /* rewritten RCPT TO address */
|
||||||
if (strcmp(orig_rcpt ? orig_rcpt : start, rcpt) == 0) {
|
if (strcmp(orig_rcpt ? orig_rcpt : start, STR(int_rcpt_buf)) == 0) {
|
||||||
if (vstream_fseek(state->dst, curr_offset, SEEK_SET) < 0) {
|
if (vstream_fseek(state->dst, curr_offset, SEEK_SET) < 0) {
|
||||||
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
|
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
|
||||||
CLEANUP_DEL_RCPT_RETURN(cleanup_milter_error(state, errno));
|
CLEANUP_DEL_RCPT_RETURN(cleanup_milter_error(state, errno));
|
||||||
@@ -1183,7 +1243,7 @@ static const char *cleanup_del_rcpt(void *context, char *rcpt)
|
|||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: deleted %d records for recipient \"%s\"",
|
msg_info("%s: deleted %d records for recipient \"%s\"",
|
||||||
myname, count, rcpt);
|
myname, count, ext_rcpt);
|
||||||
|
|
||||||
CLEANUP_DEL_RCPT_RETURN(0);
|
CLEANUP_DEL_RCPT_RETURN(0);
|
||||||
}
|
}
|
||||||
@@ -1260,18 +1320,14 @@ static const char *cleanup_milter_eval(const char *name, void *ptr)
|
|||||||
if (strcmp(name, S8_MAC_AUTH_AUTHOR) == 0)
|
if (strcmp(name, S8_MAC_AUTH_AUTHOR) == 0)
|
||||||
return (nvtable_find(state->attr, MAIL_ATTR_SASL_SENDER));
|
return (nvtable_find(state->attr, MAIL_ATTR_SASL_SENDER));
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
|
||||||
if (strcmp(name, S8_MAC_MAIL_ADDR) == 0)
|
if (strcmp(name, S8_MAC_MAIL_ADDR) == 0)
|
||||||
return (state->sender);
|
return (state->milter_ext_from ? STR(state->milter_ext_from) : 0);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RCPT TO macros.
|
* RCPT TO macros.
|
||||||
*/
|
*/
|
||||||
#if 0
|
|
||||||
if (strcmp(name, S8_MAC_RCPT_ADDR) == 0)
|
if (strcmp(name, S8_MAC_RCPT_ADDR) == 0)
|
||||||
return (state->recipient);
|
return (state->milter_ext_rcpt ? STR(state->milter_ext_rcpt) : 0);
|
||||||
#endif
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1485,7 +1541,14 @@ void cleanup_milter_emul_mail(CLEANUP_STATE *state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CLEANUP_MILTER_OK(state)) {
|
if (CLEANUP_MILTER_OK(state)) {
|
||||||
argv[0] = addr;
|
if (state->milter_ext_from == 0)
|
||||||
|
state->milter_ext_from = vstring_alloc(100);
|
||||||
|
/* Sendmail 8.13 does not externalize the null address. */
|
||||||
|
if (*addr)
|
||||||
|
quote_821_local(state->milter_ext_from, addr);
|
||||||
|
else
|
||||||
|
vstring_strcpy(state->milter_ext_from, addr);
|
||||||
|
argv[0] = STR(state->milter_ext_from);
|
||||||
argv[1] = 0;
|
argv[1] = 0;
|
||||||
if ((resp = milter_mail_event(milters, argv)) != 0) {
|
if ((resp = milter_mail_event(milters, argv)) != 0) {
|
||||||
cleanup_milter_apply(state, "MAIL", resp);
|
cleanup_milter_apply(state, "MAIL", resp);
|
||||||
@@ -1515,7 +1578,14 @@ void cleanup_milter_emul_rcpt(CLEANUP_STATE *state,
|
|||||||
* attribute, but CLEANUP_STAT_DEFER takes precedence. It terminates
|
* attribute, but CLEANUP_STAT_DEFER takes precedence. It terminates
|
||||||
* queue record processing, and prevents bounces from being sent.
|
* queue record processing, and prevents bounces from being sent.
|
||||||
*/
|
*/
|
||||||
argv[0] = addr;
|
if (state->milter_ext_rcpt == 0)
|
||||||
|
state->milter_ext_rcpt = vstring_alloc(100);
|
||||||
|
/* Sendmail 8.13 does not externalize the null address. */
|
||||||
|
if (*addr)
|
||||||
|
quote_821_local(state->milter_ext_rcpt, addr);
|
||||||
|
else
|
||||||
|
vstring_strcpy(state->milter_ext_rcpt, addr);
|
||||||
|
argv[0] = STR(state->milter_ext_rcpt);
|
||||||
argv[1] = 0;
|
argv[1] = 0;
|
||||||
if ((resp = milter_rcpt_event(milters, argv)) != 0
|
if ((resp = milter_rcpt_event(milters, argv)) != 0
|
||||||
&& cleanup_milter_apply(state, "RCPT", resp) != 0) {
|
&& cleanup_milter_apply(state, "RCPT", resp) != 0) {
|
||||||
|
@@ -113,6 +113,8 @@ CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src)
|
|||||||
state->client_addr = 0;
|
state->client_addr = 0;
|
||||||
state->client_af = 0;
|
state->client_af = 0;
|
||||||
state->client_port = 0;
|
state->client_port = 0;
|
||||||
|
state->milter_ext_from = 0;
|
||||||
|
state->milter_ext_rcpt = 0;
|
||||||
return (state);
|
return (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,5 +161,9 @@ void cleanup_state_free(CLEANUP_STATE *state)
|
|||||||
myfree(state->verp_delims);
|
myfree(state->verp_delims);
|
||||||
if (state->milters)
|
if (state->milters)
|
||||||
milter_free(state->milters);
|
milter_free(state->milters);
|
||||||
|
if (state->milter_ext_from)
|
||||||
|
vstring_free(state->milter_ext_from);
|
||||||
|
if (state->milter_ext_rcpt)
|
||||||
|
vstring_free(state->milter_ext_rcpt);
|
||||||
myfree((char *) state);
|
myfree((char *) state);
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
* Patches change both the patchlevel and the release date. Snapshots have no
|
* Patches change both the patchlevel and the release date. Snapshots have no
|
||||||
* patchlevel; they change the release date only.
|
* patchlevel; they change the release date only.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20061006"
|
#define MAIL_RELEASE_DATE "20061015"
|
||||||
#define MAIL_VERSION_NUMBER "2.4"
|
#define MAIL_VERSION_NUMBER "2.4"
|
||||||
|
|
||||||
#ifdef SNAPSHOT
|
#ifdef SNAPSHOT
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
/* configuration parameter. Upon delivery, the local delivery agent
|
/* configuration parameter. Upon delivery, the local delivery agent
|
||||||
/* tries each pathname in the list until a file is found.
|
/* tries each pathname in the list until a file is found.
|
||||||
/*
|
/*
|
||||||
/* Delivery via ~/.\fB.forward\fR files is done with the privileges
|
/* Delivery via ~/.\fBforward\fR files is done with the privileges
|
||||||
/* of the recipient.
|
/* of the recipient.
|
||||||
/* Thus, ~/.\fBforward\fR like files must be readable by the
|
/* Thus, ~/.\fBforward\fR like files must be readable by the
|
||||||
/* recipient, and their parent directory needs to have "execute"
|
/* recipient, and their parent directory needs to have "execute"
|
||||||
|
@@ -200,6 +200,7 @@ smtpd.o: smtpd_token.h
|
|||||||
smtpd_chat.o: ../../include/argv.h
|
smtpd_chat.o: ../../include/argv.h
|
||||||
smtpd_chat.o: ../../include/attr.h
|
smtpd_chat.o: ../../include/attr.h
|
||||||
smtpd_chat.o: ../../include/cleanup_user.h
|
smtpd_chat.o: ../../include/cleanup_user.h
|
||||||
|
smtpd_chat.o: ../../include/int_filt.h
|
||||||
smtpd_chat.o: ../../include/iostuff.h
|
smtpd_chat.o: ../../include/iostuff.h
|
||||||
smtpd_chat.o: ../../include/line_wrap.h
|
smtpd_chat.o: ../../include/line_wrap.h
|
||||||
smtpd_chat.o: ../../include/mail_addr.h
|
smtpd_chat.o: ../../include/mail_addr.h
|
||||||
@@ -303,6 +304,8 @@ smtpd_milter.o: ../../include/milter.h
|
|||||||
smtpd_milter.o: ../../include/myaddrinfo.h
|
smtpd_milter.o: ../../include/myaddrinfo.h
|
||||||
smtpd_milter.o: ../../include/name_code.h
|
smtpd_milter.o: ../../include/name_code.h
|
||||||
smtpd_milter.o: ../../include/name_mask.h
|
smtpd_milter.o: ../../include/name_mask.h
|
||||||
|
smtpd_milter.o: ../../include/quote_821_local.h
|
||||||
|
smtpd_milter.o: ../../include/quote_flags.h
|
||||||
smtpd_milter.o: ../../include/sys_defs.h
|
smtpd_milter.o: ../../include/sys_defs.h
|
||||||
smtpd_milter.o: ../../include/tls.h
|
smtpd_milter.o: ../../include/tls.h
|
||||||
smtpd_milter.o: ../../include/vbuf.h
|
smtpd_milter.o: ../../include/vbuf.h
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
|
#include <quote_821_local.h>
|
||||||
|
|
||||||
/* Milter library. */
|
/* Milter library. */
|
||||||
|
|
||||||
@@ -148,14 +149,33 @@ const char *smtpd_milter_eval(const char *name, void *ptr)
|
|||||||
if (strcmp(name, S8_MAC_AUTH_AUTHOR) == 0)
|
if (strcmp(name, S8_MAC_AUTH_AUTHOR) == 0)
|
||||||
return (IF_SASL_ENABLED(state->sasl_sender));
|
return (IF_SASL_ENABLED(state->sasl_sender));
|
||||||
#endif
|
#endif
|
||||||
if (strcmp(name, S8_MAC_MAIL_ADDR) == 0)
|
if (strcmp(name, S8_MAC_MAIL_ADDR) == 0) {
|
||||||
return (state->sender);
|
if (state->sender == 0)
|
||||||
|
return (0);
|
||||||
|
if (state->expand_buf == 0)
|
||||||
|
state->expand_buf = vstring_alloc(10);
|
||||||
|
/* Sendmail 8.13 does not externalize the null string. */
|
||||||
|
if (state->sender[0])
|
||||||
|
quote_821_local(state->expand_buf, state->sender);
|
||||||
|
else
|
||||||
|
vstring_strcpy(state->expand_buf, state->sender);
|
||||||
|
return (STR(state->expand_buf));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RCPT TO macros.
|
* RCPT TO macros.
|
||||||
*/
|
*/
|
||||||
if (strcmp(name, S8_MAC_RCPT_ADDR) == 0)
|
if (strcmp(name, S8_MAC_RCPT_ADDR) == 0) {
|
||||||
return (state->recipient);
|
if (state->recipient == 0)
|
||||||
|
return (0);
|
||||||
|
if (state->expand_buf == 0)
|
||||||
|
state->expand_buf = vstring_alloc(10);
|
||||||
|
/* Sendmail 8.13 does not externalize the null string. */
|
||||||
|
if (state->recipient[0])
|
||||||
|
quote_821_local(state->expand_buf, state->recipient);
|
||||||
|
else
|
||||||
|
vstring_strcpy(state->expand_buf, state->recipient);
|
||||||
|
return (STR(state->expand_buf));
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user