2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 13:48:06 +00:00

postfix-3.10-20250109-nonprod

This commit is contained in:
Wietse Z Venema 2025-01-09 00:00:00 -05:00 committed by Viktor Dukhovni
parent a98bc4ee9b
commit fec200a2ab
73 changed files with 852 additions and 272 deletions

View File

@ -28780,3 +28780,80 @@ Apologies for any names omitted.
Cleanup: the netstring client sets or clears errno to improve
error messages from its callers. File: util/netstring.c.
20250109
Bugfix (defect introduced: Postfix 2.6): fixed the parsing
of multiple commas in a multi_instance_directories parameter
value. Michael Tokarev. Files: conf/postfix-script,
conf/post-install, conf/postfix-wrapper, proto/postfix-wrapper.
Cleanup: replace static result buffer with per-instance buffer.
Michael Tokarev. File: util/dict_cdb.c.
Feature: first/next iterator support for cdb: tables, if
built with tinycdb. Michael Tokarev. Wietse added a test
and documentation. Files: util/dict_cdb.c proto/CDB_README.html,
postmap/Makefile.in.
20241111
Zero code change baseline for new features. Code base is
20241027.
This renames symbols that are part of the Postfix SMTPUTF8
implementation. The result still uses the same bitflags,
but the unused bitflags can now officially be used to
implement other Postfix features. The only change is that
in three debug messages, "smtputf8" becomes "sendopts".
Otherwise, the compiler output is bit-for-bit identical.
This change makes it possible to propagate new bitflags
from Postfix mail receiving programs through queue files
into delivery agents without having to rip up internal APIs
like when we implemented SMTPUTF8 support.
There is some SMTPUTF8-related code that will need to be
updated to read only specific bitflags instead of testing
an entire integer for (non)zero. Older Postfix implementations
will not do evil things when they encounter queue file with
new flags from a newer Postfix version. They will correctly
handle SMTPUTF8 messages and ignore the new flags. Some
programs may falsely claim that a non-SMTPUTF8 message with
a non-ASCII envelope address has an UTF8 envelope address.
Although such messages violate SMTP, Postfix will do no
harm.
20250109
No intentional behavior change.
Code cleanup: in SMTPUTF8 support, set and read the sender
options flags more selectively, instead of assuming that
all bits are used exclusively for SMTPUTF8 support. Files:
bounce/bounce_notify_util.c, cleanup/cleanup_api.c,
cleanup/cleanup_envelope.c, smtp/smtp_proto.c.
TODO: in smtp_proto.c, add valid_utf8_stringz() check when
sending a DSN ORCPT address. Better: reuse IS_UTF8_ADDRESS()
(it's currently defined in bounce_notify_util.c).
TODO: take a cue from Arnt Gulbrandsen's qmail patch. In the SMTP
client, enforce SMTPUTF8 if the message headers or envelope
require SMTPUTF8, or if the sender requested it. Ditto for
bounces. The qmail patch does not look for UTF8 text in headers,
but Exim will reject UTF8 headers unless the client requests
SMTPUTF8.
TODO: If we don't auto-generate the "SMTPUTF8 requested"
flag we may need to update the bounce daemon. Maybe it can
use similar logic as the SMTP client.
TODO: in the bounce daemon consider replacing
(bounce_info->smtputf8 & SMTPUTF8_FLAG_REQUESTED) with
(bounce_info->smtputf8 & SMTPUTF8_FLAG_ALL): message/global
should be selected if a message has 8bit header or envelope.
TODO: in stable releases in the queue managers "and" the
queue file's smtputf8 value with SMTPUTF8_FLAG_ALL, for
forward compatibility.

View File

@ -17,8 +17,25 @@ temporarily while a CDB file is under construction). CDB databases are
maintained with the postmap(1) or postalias(1) command. The DATABASE_README
document has general information about Postfix databases.
CDB support is available with Postfix 2.2 and later releases. This document
describes how to build Postfix with CDB support.
You can use "cdb:" tables wherever you can use read-only "hash", "btree" or
"lmdb" tables with the following limitations:
* CDB databases cannot be larger than 4GB on LP64 and ILP32 systems, because
the CDB library API uses unsigned integers for file offsets.
* The "ppoossttmmaapp --ii" (incremental record insertion) and "ppoossttmmaapp --dd"
(incremental record deletion) command-line options are not available. For
the same reason the "cdb:" map type cannot be used to for persistent
caches, such as the address verification cache for the verify(8) service,
the TLS session cache for the tlsmgr(8) service, or the dynamic allowlist
for postscreen(8).
* The "sequence" operation ("ppoossttmmaapp --ss" or "ppoossttaalliiaass --ss") is available only
wen Postfix is built with tinycdb by Michael Tokarev, not with the original
cdb library by Daniel Bernstein.
CDB support is available with Postfix 2.2 and later releases. The remainder of
this document describes how to build Postfix with CDB support.
BBuuiillddiinngg PPoossttffiixx wwiitthh CCDDBB ssuuppppoorrtt
@ -64,11 +81,3 @@ building a dynamically-loaded or statically-loaded CDB database client.
database library dependencies. And that was exactly what dynamic database
client loading was meant to avoid.
After Postfix has been built with cdb support, you can use "cdb" tables
wherever you can use read-only "hash", "btree" or "dbm" tables. However, the
"ppoossttmmaapp --ii" (incremental record insertion) and "ppoossttmmaapp --dd" (incremental
record deletion) command-line options are not available. For the same reason
the "cdb" map type cannot be used to store the persistent address verification
cache for the verify(8) service, or to store TLS session information for the
tlsmgr(8) service.

View File

@ -19,6 +19,9 @@ Wish list:
relay_recipient_maps empty should default to 'no valid
recipients'. Subject to compatibility level.
Replace static result buffers with per-instance buffers in
dict_unix.c, dict_ni*c.
The Milter 'quarantine' action should be reported with a
call-back function, instead of setting the Milter default
reply. However, we still need the existing 'reply' based

View File

@ -296,7 +296,7 @@ test -d "$config_directory" || {
instances=`test ! -f $def_config_directory/main.cf ||
$POSTCONF -qc $def_config_directory -h multi_instance_directories |
sed 's/,/ /'` || exit 1
sed 'y/,/ /'` || exit 1
update_shared_files=1
for name in $instances

View File

@ -97,7 +97,7 @@ def_config_directory=`$command_directory/postconf -dh config_directory` || {
instances=`test ! -f $def_config_directory/main.cf ||
$command_directory/postconf -qc $def_config_directory \
-h multi_instance_directories | sed 's/,/ /'` || {
-h multi_instance_directories | sed 'y/,/ /'` || {
$FATAL cannot execute $command_directory/postconf!
exit 1
}

View File

@ -188,7 +188,7 @@ POSTFIX=$command_directory/postfix
# Canonicalize the instance directory list. The list is specified
# in startup order.
instance_dirs=`$POSTCONF -h multi_instance_directories | sed 's/,/ /'` ||
instance_dirs=`$POSTCONF -h multi_instance_directories | sed 'y/,/ /'` ||
exit 1
case "$1" in

View File

@ -35,8 +35,33 @@ under construction). CDB databases are maintained with the <a href="postmap.1.h
or <a href="postalias.1.html">postalias(1)</a> command. The <a href="DATABASE_README.html">DATABASE_README</a> document has general
information about Postfix databases. </p>
<p> You can use "<a href="CDB_README.html">cdb</a>:" tables wherever you can use read-only "hash",
"btree" or "lmdb" tables with the following limitations: </p>
<ul>
<li> <p> CDB databases cannot be larger than 4GB on LP64 and ILP32
systems, because the CDB library API uses unsigned integers for
file offsets. </p>
<li> <p> The "<b>postmap -i</b>" (incremental record insertion) and
"<b>postmap -d</b>" (incremental record deletion) command-line
options are not available. For the same reason the "<a href="CDB_README.html">cdb</a>:" map type
cannot be used to for persistent caches, such as the address
verification cache for the <a href="verify.8.html">verify(8)</a> service, the TLS session cache
for the <a href="tlsmgr.8.html">tlsmgr(8)</a> service, or the dynamic allowlist for <a href="postscreen.8.html">postscreen(8)</a>.
</p>
<li> <p> The "sequence" operation ("<b>postmap -s</b>" or "<b>postalias
-s</b>") is available only wen Postfix is built with tinycdb by
Michael Tokarev, not with the original cdb library by Daniel Bernstein.
</p>
</ul>
<p> CDB support is available with Postfix 2.2 and later releases.
This document describes how to build Postfix with CDB support. </p>
The remainder of this document describes how to build Postfix with
CDB support. </p>
<h2>Building Postfix with CDB support</h2>
@ -99,12 +124,3 @@ will have CDB database library dependencies. And that was exactly
what dynamic database client loading was meant to avoid. </p>
</blockquote>
<p> After Postfix has been built with cdb support, you can use
"cdb" tables wherever you can use read-only "hash", "btree" or
"dbm" tables. However, the "<b>postmap -i</b>" (incremental record
insertion) and "<b>postmap -d</b>" (incremental record deletion)
command-line options are not available. For the same reason the
"cdb" map type cannot be used to store the persistent address
verification cache for the <a href="verify.8.html">verify(8)</a> service, or to store
TLS session information for the <a href="tlsmgr.8.html">tlsmgr(8)</a> service. </p>

View File

@ -194,5 +194,8 @@ BOUNCE(8) BOUNCE(8)
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org
BOUNCE(8)
</pre> </body> </html>

View File

@ -194,5 +194,8 @@ BOUNCE(8) BOUNCE(8)
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org
BOUNCE(8)
</pre> </body> </html>

View File

@ -524,7 +524,7 @@ LOCAL(8) LOCAL(8)
<b><a href="postconf.5.html#delay_logging_resolution_limit">delay_logging_resolution_limit</a> (2)</b>
The maximal number of digits after the decimal point when log-
ging sub-second delay values.
ging delay values.
<b><a href="postconf.5.html#export_environment">export_environment</a> (see 'postconf -d' output)</b>
The list of environment variables that a Postfix process will
@ -632,5 +632,8 @@ LOCAL(8) LOCAL(8)
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org
LOCAL(8)
</pre> </body> </html>

View File

@ -106,7 +106,7 @@ POSTFIX-WRAPPER(5) POSTFIX-WRAPPER(5)
POSTCONF=$<a href="postconf.5.html#command_directory">command_directory</a>/postconf
POSTFIX=$<a href="postconf.5.html#command_directory">command_directory</a>/postfix
instance_dirs=`$POSTCONF -h <a href="postconf.5.html#multi_instance_directories">multi_instance_directories</a> |
sed 's/,/ /'` || exit 1
sed 'y/,/ /'` || exit 1
err=0
for dir in $<a href="postconf.5.html#config_directory">config_directory</a> $instance_dirs

View File

@ -194,5 +194,8 @@ BOUNCE(8) BOUNCE(8)
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org
BOUNCE(8)
</pre> </body> </html>

View File

@ -979,7 +979,7 @@ CCARGS="$CCARGS -DSNAPSHOT"
# Non-production: needs thorough testing, or major changes are still
# needed before the code stabilizes.
#CCARGS="$CCARGS -DNONPROD"
CCARGS="$CCARGS -DNONPROD"
# Workaround: prepend Postfix include files before other include files.
CCARGS="-I. -I../../include $CCARGS"

View File

@ -123,7 +123,7 @@ manager implementation:
POSTCONF=$command_directory/postconf
POSTFIX=$command_directory/postfix
instance_dirs=\`$POSTCONF \-h multi_instance_directories |
sed 's/,/ /'\` || exit 1
sed 'y/,/ /'\` || exit 1
err=0
for dir in $config_directory $instance_dirs

View File

@ -180,3 +180,6 @@ Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org

View File

@ -574,7 +574,7 @@ How much time a Postfix daemon process may take to handle a
request before it is terminated by a built\-in watchdog timer.
.IP "\fBdelay_logging_resolution_limit (2)\fR"
The maximal number of digits after the decimal point when logging
sub\-second delay values.
delay values.
.IP "\fBexport_environment (see 'postconf -d' output)\fR"
The list of environment variables that a Postfix process will export
to non\-Postfix processes.
@ -673,3 +673,6 @@ Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA
Wietse Venema
porcupine.org

View File

@ -35,8 +35,33 @@ under construction). CDB databases are maintained with the postmap(1)
or postalias(1) command. The DATABASE_README document has general
information about Postfix databases. </p>
<p> You can use "cdb:" tables wherever you can use read-only "hash",
"btree" or "lmdb" tables with the following limitations: </p>
<ul>
<li> <p> CDB databases cannot be larger than 4GB on LP64 and ILP32
systems, because the CDB library API uses unsigned integers for
file offsets. </p>
<li> <p> The "<b>postmap -i</b>" (incremental record insertion) and
"<b>postmap -d</b>" (incremental record deletion) command-line
options are not available. For the same reason the "cdb:" map type
cannot be used to for persistent caches, such as the address
verification cache for the verify(8) service, the TLS session cache
for the tlsmgr(8) service, or the dynamic allowlist for postscreen(8).
</p>
<li> <p> The "sequence" operation ("<b>postmap -s</b>" or "<b>postalias
-s</b>") is available only wen Postfix is built with tinycdb by
Michael Tokarev, not with the original cdb library by Daniel Bernstein.
</p>
</ul>
<p> CDB support is available with Postfix 2.2 and later releases.
This document describes how to build Postfix with CDB support. </p>
The remainder of this document describes how to build Postfix with
CDB support. </p>
<h2>Building Postfix with CDB support</h2>
@ -99,12 +124,3 @@ will have CDB database library dependencies. And that was exactly
what dynamic database client loading was meant to avoid. </p>
</blockquote>
<p> After Postfix has been built with cdb support, you can use
"cdb" tables wherever you can use read-only "hash", "btree" or
"dbm" tables. However, the "<b>postmap -i</b>" (incremental record
insertion) and "<b>postmap -d</b>" (incremental record deletion)
command-line options are not available. For the same reason the
"cdb" map type cannot be used to store the persistent address
verification cache for the verify(8) service, or to store
TLS session information for the tlsmgr(8) service. </p>

View File

@ -113,7 +113,7 @@
# POSTCONF=$command_directory/postconf
# POSTFIX=$command_directory/postfix
# instance_dirs=\`$POSTCONF -h multi_instance_directories |
# sed 's/,/ /'\` || exit 1
# sed 'y/,/ /'\` || exit 1
#
# err=0
# for dir in $config_directory $instance_dirs

View File

@ -1659,3 +1659,8 @@ GECOS
iso
ORCPT
RET
ILP
REQUIRETLS
RequireTLS
requiretls
sendopts

View File

@ -1854,3 +1854,6 @@ Charset
atext
qp
cntrl
TINYCDB
getdata
XXXSENDOPTS

View File

@ -97,3 +97,4 @@ roff
diffs
CLOSEFROM
Roessner
bitflags

View File

@ -279,6 +279,7 @@ bounce_notify_service.o: ../../include/post_mail.h
bounce_notify_service.o: ../../include/rcpt_buf.h
bounce_notify_service.o: ../../include/rec_type.h
bounce_notify_service.o: ../../include/recipient_list.h
bounce_notify_service.o: ../../include/sendopts.h
bounce_notify_service.o: ../../include/smtputf8.h
bounce_notify_service.o: ../../include/stringops.h
bounce_notify_service.o: ../../include/sys_defs.h
@ -322,6 +323,7 @@ bounce_notify_util.o: ../../include/rcpt_buf.h
bounce_notify_util.o: ../../include/rec_type.h
bounce_notify_util.o: ../../include/recipient_list.h
bounce_notify_util.o: ../../include/record.h
bounce_notify_util.o: ../../include/sendopts.h
bounce_notify_util.o: ../../include/smtputf8.h
bounce_notify_util.o: ../../include/stringops.h
bounce_notify_util.o: ../../include/sys_defs.h
@ -382,6 +384,7 @@ bounce_notify_verp.o: ../../include/post_mail.h
bounce_notify_verp.o: ../../include/rcpt_buf.h
bounce_notify_verp.o: ../../include/rec_type.h
bounce_notify_verp.o: ../../include/recipient_list.h
bounce_notify_verp.o: ../../include/sendopts.h
bounce_notify_verp.o: ../../include/smtputf8.h
bounce_notify_verp.o: ../../include/stringops.h
bounce_notify_verp.o: ../../include/sys_defs.h
@ -417,6 +420,7 @@ bounce_one_service.o: ../../include/post_mail.h
bounce_one_service.o: ../../include/rcpt_buf.h
bounce_one_service.o: ../../include/rec_type.h
bounce_one_service.o: ../../include/recipient_list.h
bounce_one_service.o: ../../include/sendopts.h
bounce_one_service.o: ../../include/smtputf8.h
bounce_one_service.o: ../../include/stringops.h
bounce_one_service.o: ../../include/sys_defs.h
@ -497,6 +501,7 @@ bounce_trace_service.o: ../../include/post_mail.h
bounce_trace_service.o: ../../include/rcpt_buf.h
bounce_trace_service.o: ../../include/rec_type.h
bounce_trace_service.o: ../../include/recipient_list.h
bounce_trace_service.o: ../../include/sendopts.h
bounce_trace_service.o: ../../include/smtputf8.h
bounce_trace_service.o: ../../include/stringops.h
bounce_trace_service.o: ../../include/sys_defs.h
@ -529,6 +534,7 @@ bounce_warn_service.o: ../../include/post_mail.h
bounce_warn_service.o: ../../include/rcpt_buf.h
bounce_warn_service.o: ../../include/rec_type.h
bounce_warn_service.o: ../../include/recipient_list.h
bounce_warn_service.o: ../../include/sendopts.h
bounce_warn_service.o: ../../include/smtputf8.h
bounce_warn_service.o: ../../include/stringops.h
bounce_warn_service.o: ../../include/sys_defs.h

View File

@ -160,6 +160,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -313,7 +316,7 @@ static int bounce_notify_proto(char *service_name, VSTREAM *client,
{
const char *myname = "bounce_notify_proto";
int flags;
int smtputf8;
int sendopts;
int dsn_ret;
/*
@ -324,7 +327,7 @@ static int bounce_notify_proto(char *service_name, VSTREAM *client,
RECV_ATTR_STR(MAIL_ATTR_QUEUE, queue_name),
RECV_ATTR_STR(MAIL_ATTR_QUEUEID, queue_id),
RECV_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
RECV_ATTR_INT(MAIL_ATTR_SMTPUTF8, &smtputf8),
RECV_ATTR_INT(MAIL_ATTR_SENDOPTS, &sendopts),
RECV_ATTR_STR(MAIL_ATTR_SENDER, sender),
RECV_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
RECV_ATTR_INT(MAIL_ATTR_DSN_RET, &dsn_ret),
@ -348,9 +351,9 @@ static int bounce_notify_proto(char *service_name, VSTREAM *client,
VS_NEUTER(sender);
VS_NEUTER(dsn_envid);
if (msg_verbose)
msg_info("%s: flags=0x%x service=%s queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s ret=0x%x",
msg_info("%s: flags=0x%x service=%s queue=%s id=%s encoding=%s sendopts=%d sender=%s envid=%s ret=0x%x",
myname, flags, service_name, STR(queue_name), STR(queue_id),
STR(encoding), smtputf8, STR(sender), STR(dsn_envid),
STR(encoding), sendopts, STR(sender), STR(dsn_envid),
dsn_ret);
/*
@ -364,7 +367,7 @@ static int bounce_notify_proto(char *service_name, VSTREAM *client,
* Execute the request.
*/
return (service(flags, service_name, STR(queue_name),
STR(queue_id), STR(encoding), smtputf8,
STR(queue_id), STR(encoding), sendopts,
STR(sender), STR(dsn_envid), dsn_ret,
bounce_templates));
}
@ -375,7 +378,7 @@ static int bounce_verp_proto(char *service_name, VSTREAM *client)
{
const char *myname = "bounce_verp_proto";
int flags;
int smtputf8;
int sendopts;
int dsn_ret;
/*
@ -386,7 +389,7 @@ static int bounce_verp_proto(char *service_name, VSTREAM *client)
RECV_ATTR_STR(MAIL_ATTR_QUEUE, queue_name),
RECV_ATTR_STR(MAIL_ATTR_QUEUEID, queue_id),
RECV_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
RECV_ATTR_INT(MAIL_ATTR_SMTPUTF8, &smtputf8),
RECV_ATTR_INT(MAIL_ATTR_SENDOPTS, &sendopts),
RECV_ATTR_STR(MAIL_ATTR_SENDER, sender),
RECV_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
RECV_ATTR_INT(MAIL_ATTR_DSN_RET, &dsn_ret),
@ -416,9 +419,9 @@ static int bounce_verp_proto(char *service_name, VSTREAM *client)
return (-1);
}
if (msg_verbose)
msg_info("%s: flags=0x%x service=%s queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s ret=0x%x delim=%s",
msg_info("%s: flags=0x%x service=%s queue=%s id=%s encoding=%s sendopts=%d sender=%s envid=%s ret=0x%x delim=%s",
myname, flags, service_name, STR(queue_name),
STR(queue_id), STR(encoding), smtputf8, STR(sender),
STR(queue_id), STR(encoding), sendopts, STR(sender),
STR(dsn_envid), dsn_ret, STR(verp_delims));
/*
@ -436,12 +439,12 @@ static int bounce_verp_proto(char *service_name, VSTREAM *client)
mail_addr_double_bounce())) {
msg_warn("request to send VERP-style notification of bounced mail");
return (bounce_notify_service(flags, service_name, STR(queue_name),
STR(queue_id), STR(encoding), smtputf8,
STR(queue_id), STR(encoding), sendopts,
STR(sender), STR(dsn_envid), dsn_ret,
bounce_templates));
} else
return (bounce_notify_verp(flags, service_name, STR(queue_name),
STR(queue_id), STR(encoding), smtputf8,
STR(queue_id), STR(encoding), sendopts,
STR(sender), STR(dsn_envid), dsn_ret,
STR(verp_delims), bounce_templates));
}
@ -452,7 +455,7 @@ static int bounce_one_proto(char *service_name, VSTREAM *client)
{
const char *myname = "bounce_one_proto";
int flags;
int smtputf8;
int sendopts;
int dsn_ret;
/*
@ -463,7 +466,7 @@ static int bounce_one_proto(char *service_name, VSTREAM *client)
RECV_ATTR_STR(MAIL_ATTR_QUEUE, queue_name),
RECV_ATTR_STR(MAIL_ATTR_QUEUEID, queue_id),
RECV_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
RECV_ATTR_INT(MAIL_ATTR_SMTPUTF8, &smtputf8),
RECV_ATTR_INT(MAIL_ATTR_SENDOPTS, &sendopts),
RECV_ATTR_STR(MAIL_ATTR_SENDER, sender),
RECV_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
RECV_ATTR_INT(MAIL_ATTR_DSN_RET, &dsn_ret),
@ -512,9 +515,9 @@ static int bounce_one_proto(char *service_name, VSTREAM *client)
* RECIPIENT_FROM_RCPT_BUF().
*/
if (msg_verbose)
msg_info("%s: flags=0x%x queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s dsn_ret=0x%x orig_to=%s to=%s off=%ld dsn_orig=%s notif=0x%x stat=%s act=%s why=%s",
msg_info("%s: flags=0x%x queue=%s id=%s encoding=%s sendopts=%d sender=%s envid=%s dsn_ret=0x%x orig_to=%s to=%s off=%ld dsn_orig=%s notif=0x%x stat=%s act=%s why=%s",
myname, flags, STR(queue_name), STR(queue_id),
STR(encoding), smtputf8, STR(sender), STR(dsn_envid),
STR(encoding), sendopts, STR(sender), STR(dsn_envid),
dsn_ret, STR(rcpt_buf->orig_addr), STR(rcpt_buf->address),
rcpt_buf->offset, STR(rcpt_buf->dsn_orcpt),
rcpt_buf->dsn_notify, STR(dsn_buf->status),
@ -524,7 +527,7 @@ static int bounce_one_proto(char *service_name, VSTREAM *client)
* Execute the request.
*/
return (bounce_one_service(flags, STR(queue_name), STR(queue_id),
STR(encoding), smtputf8, STR(sender),
STR(encoding), sendopts, STR(sender),
STR(dsn_envid), dsn_ret, rcpt_buf,
dsn_buf, bounce_templates));
}

View File

@ -7,14 +7,14 @@
/* #include "bounce_service.h"
/*
/* int bounce_notify_service(flags, service, queue_name, queue_id,
/* encoding, smtputf8, sender, dsn_envid,
/* encoding, sendopts, sender, dsn_envid,
/* dsn_ret, templates)
/* int flags;
/* char *service;
/* char *queue_name;
/* char *queue_id;
/* char *encoding;
/* int smtputf8;
/* int sendopts;
/* char *sender;
/* char *dsn_envid;
/* int dsn_ret;
@ -84,7 +84,7 @@
int bounce_notify_service(int flags, char *service, char *queue_name,
char *queue_id, char *encoding,
int smtputf8, char *recipient,
int sendopts, char *recipient,
char *dsn_envid, int dsn_ret,
BOUNCE_TEMPLATES *ts)
{
@ -131,7 +131,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
* notification is enabled.
*/
bounce_info = bounce_mail_init(service, queue_name, queue_id,
encoding, smtputf8, dsn_envid,
encoding, sendopts, dsn_envid,
ts->failure);
#define NULL_SENDER MAIL_ADDR_EMPTY /* special address */
@ -179,7 +179,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
postmaster,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -219,7 +219,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -274,7 +274,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
postmaster,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
count = -1;
if (bounce_header(bounce, bounce_info, postmaster,

View File

@ -13,22 +13,22 @@
/* } BOUNCE_INFO;
/*
/* BOUNCE_INFO *bounce_mail_init(service, queue_name, queue_id, encoding,
/* smtputf8, dsn_envid, template)
/* sendopts, dsn_envid, template)
/* const char *service;
/* const char *queue_name;
/* const char *queue_id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *dsn_envid;
/* const BOUNCE_TEMPLATE *template;
/*
/* BOUNCE_INFO *bounce_mail_one_init(queue_name, queue_id, encoding,
/* smtputf8, dsn_envid, dsn_notify,
/* sendopts, dsn_envid, dsn_notify,
/* rcpt_buf, dsn_buf, template)
/* const char *queue_name;
/* const char *queue_id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* int dsn_notify;
/* const char *dsn_envid;
/* RCPT_BUF *rcpt_buf;
@ -160,6 +160,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -221,7 +224,7 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
const char *queue_name,
const char *queue_id,
const char *encoding,
int smtputf8,
int sendopts,
const char *dsn_envid,
RCPT_BUF *rcpt_buf,
DSN_BUF *dsn_buf,
@ -244,7 +247,7 @@ static BOUNCE_INFO *bounce_mail_alloc(const char *service,
bounce_info->service = service;
bounce_info->queue_name = queue_name;
bounce_info->queue_id = queue_id;
bounce_info->smtputf8 = smtputf8;
bounce_info->sendopts = sendopts;
/* Fix 20140708: override MIME encoding: addresses may be 8bit. */
/* Fix 20140718: override MIME encoding: 8bit $myhostname expansion. */
if (var_smtputf8_enable /* was: bounce_info->smtputf8 */ ) {
@ -422,7 +425,7 @@ BOUNCE_INFO *bounce_mail_init(const char *service,
const char *queue_name,
const char *queue_id,
const char *encoding,
int smtputf8,
int sendopts,
const char *dsn_envid,
BOUNCE_TEMPLATE *template)
{
@ -449,7 +452,7 @@ BOUNCE_INFO *bounce_mail_init(const char *service,
dsn_buf = dsb_create();
}
bounce_info = bounce_mail_alloc(service, queue_name, queue_id, encoding,
smtputf8, dsn_envid, rcpt_buf, dsn_buf,
sendopts, dsn_envid, rcpt_buf, dsn_buf,
template, log_handle);
return (bounce_info);
}
@ -459,7 +462,7 @@ BOUNCE_INFO *bounce_mail_init(const char *service,
BOUNCE_INFO *bounce_mail_one_init(const char *queue_name,
const char *queue_id,
const char *encoding,
int smtputf8,
int sendopts,
const char *dsn_envid,
RCPT_BUF *rcpt_buf,
DSN_BUF *dsn_buf,
@ -471,7 +474,7 @@ BOUNCE_INFO *bounce_mail_one_init(const char *queue_name,
* Initialize the bounce_info structure for just one recipient.
*/
bounce_info = bounce_mail_alloc("none", queue_name, queue_id, encoding,
smtputf8, dsn_envid, rcpt_buf, dsn_buf,
sendopts, dsn_envid, rcpt_buf, dsn_buf,
template, (BOUNCE_LOG *) 0);
return (bounce_info);
}
@ -694,12 +697,12 @@ int bounce_header_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
"Delivery report");
/* Generate *global* only if the original requested SMTPUTF8 support. */
post_mail_fprintf(bounce, "Content-Type: message/%sdelivery-status",
(bounce_info->smtputf8 & SMTPUTF8_FLAG_REQUESTED) ?
(bounce_info->sendopts & SMTPUTF8_FLAG_REQUESTED) ?
"global-" : "");
/* Fix 20140709: addresses may be 8bit. */
if (NOT_7BIT_MIME(bounce_info)
/* BC Fix 20170610: prevent MIME downgrade of message/delivery-status. */
&& (bounce_info->smtputf8 & SMTPUTF8_FLAG_REQUESTED))
&& (bounce_info->sendopts & SMTPUTF8_FLAG_REQUESTED))
post_mail_fprintf(bounce, "Content-Transfer-Encoding: %s",
bounce_info->mime_encoding);
@ -727,7 +730,8 @@ int bounce_header_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
/* Fix 20140708: use "utf-8" or "rfc822" as appropriate. */
if (VSTRING_LEN(bounce_info->sender) > 0)
post_mail_fprintf(bounce, "X-%s-Sender: %s; %s",
bounce_info->mail_name, bounce_info->smtputf8
bounce_info->mail_name,
(bounce_info->sendopts & SMTPUTF8_FLAG_ALL)
&& IS_UTF8_ADDRESS(STR(bounce_info->sender)) ?
"utf-8" : "rfc822", STR(bounce_info->sender));
if (bounce_info->arrival_time > 0)
@ -746,7 +750,7 @@ int bounce_recipient_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
post_mail_fputs(bounce, "");
/* Fix 20140708: Don't send "utf-8" type with non-UTF8 address. */
post_mail_fprintf(bounce, "Final-Recipient: %s; %s",
bounce_info->smtputf8
(bounce_info->sendopts & SMTPUTF8_FLAG_ALL)
&& IS_UTF8_ADDRESS(rcpt->address) ?
"utf-8" : "rfc822", rcpt->address);
@ -774,7 +778,7 @@ int bounce_recipient_dsn(VSTREAM *bounce, BOUNCE_INFO *bounce_info)
} else if (NON_NULL_EMPTY(rcpt->orig_addr)) {
/* Fix 20140708: Don't send "utf-8" type with non-UTF8 address. */
post_mail_fprintf(bounce, "Original-Recipient: %s; %s",
bounce_info->smtputf8
(bounce_info->sendopts & SMTPUTF8_FLAG_ALL)
&& IS_UTF8_ADDRESS(rcpt->orig_addr) ?
"utf-8" : "rfc822", rcpt->orig_addr);
}
@ -869,7 +873,7 @@ int bounce_original(VSTREAM *bounce, BOUNCE_INFO *bounce_info,
headers_only == DSN_RET_HDRS ?
"Message Headers" : "Message");
/* Generate *global* only if the original requested SMTPUTF8 support. */
if (bounce_info->smtputf8 & SMTPUTF8_FLAG_REQUESTED)
if (bounce_info->sendopts & SMTPUTF8_FLAG_REQUESTED)
post_mail_fprintf(bounce, "Content-Type: message/%s",
headers_only == DSN_RET_HDRS ?
"global-headers" : "global");

View File

@ -7,7 +7,7 @@
/* #include "bounce_service.h"
/*
/* int bounce_notify_verp(flags, service, queue_name, queue_id,
/* encoding, smtputf8, sender,
/* encoding, sendopts, sender,
/* dsn_envid, dsn_ret, verp_delims,
/* templates)
/* int flags;
@ -15,7 +15,7 @@
/* char *queue_name;
/* char *queue_id;
/* char *encoding;
/* int smtputf8;
/* int sendopts;
/* char *sender;
/* char *dsn_envid;
/* int dsn_ret;
@ -87,7 +87,7 @@
int bounce_notify_verp(int flags, char *service, char *queue_name,
char *queue_id, char *encoding,
int smtputf8, char *recipient,
int sendopts, char *recipient,
char *dsn_envid, int dsn_ret,
char *verp_delims, BOUNCE_TEMPLATES *ts)
{
@ -115,7 +115,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
* Initialize. Open queue file, bounce log, etc.
*/
bounce_info = bounce_mail_init(service, queue_name, queue_id,
encoding, smtputf8, dsn_envid,
encoding, sendopts, dsn_envid,
ts->failure);
/*
@ -131,7 +131,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
vstring_strcpy(rcpt_buf->address, "(recipient address unavailable)");
(void) RECIPIENT_FROM_RCPT_BUF(rcpt_buf);
bounce_status = bounce_one_service(flags, queue_name, queue_id,
encoding, smtputf8, recipient,
encoding, sendopts, recipient,
dsn_envid, dsn_ret, rcpt_buf,
dsn_buf, ts);
rcpb_free(rcpt_buf);
@ -166,7 +166,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, STR(verp_buf),
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -226,7 +226,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
postmaster,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
if (bounce_header(bounce, bounce_info, postmaster,
POSTMASTER_COPY) == 0

View File

@ -7,13 +7,13 @@
/* #include "bounce_service.h"
/*
/* int bounce_one_service(flags, queue_name, queue_id, encoding,
/* smtputf8, orig_sender, envid, ret,
/* sendopts, orig_sender, envid, ret,
/* rcpt_buf, dsn_buf, templates)
/* int flags;
/* char *queue_name;
/* char *queue_id;
/* char *encoding;
/* int smtputf8;
/* int sendopts;
/* char *orig_sender;
/* char *envid;
/* int ret;
@ -83,7 +83,7 @@
/* bounce_one_service - send a bounce for one recipient */
int bounce_one_service(int flags, char *queue_name, char *queue_id,
char *encoding, int smtputf8,
char *encoding, int sendopts,
char *orig_sender, char *dsn_envid,
int dsn_ret, RCPT_BUF *rcpt_buf,
DSN_BUF *dsn_buf, BOUNCE_TEMPLATES *ts)
@ -100,7 +100,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
* Initialize. Open queue file, bounce log, etc.
*/
bounce_info = bounce_mail_one_init(queue_name, queue_id, encoding,
smtputf8, dsn_envid, rcpt_buf,
sendopts, dsn_envid, rcpt_buf,
dsn_buf, ts->failure);
#define NULL_SENDER MAIL_ADDR_EMPTY /* special address */
@ -148,7 +148,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
var_2bounce_rcpt,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -185,7 +185,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, orig_sender,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -231,7 +231,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
var_bounce_rcpt,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
if (bounce_header(bounce, bounce_info, var_bounce_rcpt,
POSTMASTER_COPY) == 0

View File

@ -90,7 +90,7 @@ typedef struct {
DSN_BUF *dsn_buf; /* delivery status info */
BOUNCE_LOG *log_handle; /* open logfile */
char *mail_name; /* $mail_name, cooked */
int smtputf8; /* SMTPUTF8 requested */
int sendopts; /* smtputf8, requiretls, etc. */
} BOUNCE_INFO;
/* */

View File

@ -7,14 +7,14 @@
/* #include "bounce_service.h"
/*
/* int bounce_trace_service(flags, service, queue_name, queue_id,
/* encoding, smtputf8, sender, envid,
/* encoding, sendopts, sender, envid,
/* ret, templates)
/* int flags;
/* char *service;
/* char *queue_name;
/* char *queue_id;
/* char *encoding;
/* int smtputf8;
/* int sendopts;
/* char *sender;
/* char *envid;
/* int ret;
@ -81,7 +81,7 @@
int bounce_trace_service(int flags, char *service, char *queue_name,
char *queue_id, char *encoding,
int smtputf8,
int sendopts,
char *recipient, char *dsn_envid,
int unused_dsn_ret,
BOUNCE_TEMPLATES *ts)
@ -140,7 +140,7 @@ int bounce_trace_service(int flags, char *service, char *queue_name,
#define NON_DSN_FLAGS (DEL_REQ_FLAG_USR_VRFY | DEL_REQ_FLAG_RECORD)
bounce_info = bounce_mail_init(service, queue_name, queue_id,
encoding, smtputf8, dsn_envid,
encoding, sendopts, dsn_envid,
flags & NON_DSN_FLAGS ?
ts->verify : ts->success);
@ -179,7 +179,7 @@ int bounce_trace_service(int flags, char *service, char *queue_name,
if ((bounce = post_mail_fopen_nowait(sender, recipient,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
count = -1;
if (bounce_header(bounce, bounce_info, recipient,

View File

@ -7,14 +7,14 @@
/* #include "bounce_service.h"
/*
/* int bounce_warn_service(flags, service, queue_name, queue_id,
/* encoding, smtputf8, sender, envid,
/* encoding, sendopts, sender, envid,
/* dsn_ret, templates)
/* int flags;
/* char *service;
/* char *queue_name;
/* char *queue_id;
/* char *encoding;
/* int smtputf8;
/* int sendopts;
/* char *sender;
/* char *envid;
/* int dsn_ret;
@ -84,7 +84,7 @@
int bounce_warn_service(int unused_flags, char *service, char *queue_name,
char *queue_id, char *encoding,
int smtputf8, char *recipient,
int sendopts, char *recipient,
char *dsn_envid, int dsn_ret,
BOUNCE_TEMPLATES *ts)
{
@ -121,7 +121,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
* notify_classes restrictions.
*/
bounce_info = bounce_mail_init(service, queue_name, queue_id,
encoding, smtputf8, dsn_envid, ts->delay);
encoding, sendopts, dsn_envid, ts->delay);
#define NULL_SENDER MAIL_ADDR_EMPTY /* special address */
#define NULL_TRACE_FLAGS 0
@ -168,7 +168,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
postmaster,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -207,7 +207,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
/*
@ -258,7 +258,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
postmaster,
MAIL_SRC_MASK_BOUNCE,
NULL_TRACE_FLAGS,
smtputf8,
sendopts,
new_id)) != 0) {
count = -1;
if (bounce_header(bounce, bounce_info, postmaster,

View File

@ -778,6 +778,7 @@ cleanup_addr.o: ../../include/nvtable.h
cleanup_addr.o: ../../include/rec_type.h
cleanup_addr.o: ../../include/record.h
cleanup_addr.o: ../../include/resolve_clnt.h
cleanup_addr.o: ../../include/sendopts.h
cleanup_addr.o: ../../include/smtputf8.h
cleanup_addr.o: ../../include/string_list.h
cleanup_addr.o: ../../include/stringops.h
@ -821,6 +822,7 @@ cleanup_api.o: ../../include/nvtable.h
cleanup_api.o: ../../include/rec_type.h
cleanup_api.o: ../../include/recipient_list.h
cleanup_api.o: ../../include/resolve_clnt.h
cleanup_api.o: ../../include/sendopts.h
cleanup_api.o: ../../include/smtputf8.h
cleanup_api.o: ../../include/string_list.h
cleanup_api.o: ../../include/sys_defs.h
@ -937,6 +939,7 @@ cleanup_envelope.o: ../../include/rec_type.h
cleanup_envelope.o: ../../include/recipient_list.h
cleanup_envelope.o: ../../include/record.h
cleanup_envelope.o: ../../include/resolve_clnt.h
cleanup_envelope.o: ../../include/sendopts.h
cleanup_envelope.o: ../../include/smtputf8.h
cleanup_envelope.o: ../../include/string_list.h
cleanup_envelope.o: ../../include/stringops.h
@ -1276,6 +1279,7 @@ cleanup_out.o: ../../include/nvtable.h
cleanup_out.o: ../../include/rec_type.h
cleanup_out.o: ../../include/record.h
cleanup_out.o: ../../include/resolve_clnt.h
cleanup_out.o: ../../include/sendopts.h
cleanup_out.o: ../../include/smtputf8.h
cleanup_out.o: ../../include/split_at.h
cleanup_out.o: ../../include/string_list.h

View File

@ -129,9 +129,9 @@ typedef struct CLEANUP_STATE {
struct CLEANUP_REGION *curr_body_region;
/*
* Internationalization.
* Internationalization, RequireTLS, etc.
*/
int smtputf8; /* what support is desired */
int sendopts; /* what support is desired */
} CLEANUP_STATE;
/*
@ -369,4 +369,7 @@ extern int cleanup_hfrom_format;
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/

View File

@ -68,6 +68,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -149,10 +152,10 @@ off_t cleanup_addr_sender(CLEANUP_STATE *state, const char *buf)
/* Fix 20140711: Auto-detect an UTF8 sender. */
if (var_smtputf8_enable && *STR(clean_addr) && !allascii(STR(clean_addr))
&& valid_utf8_stringz(STR(clean_addr))) {
state->smtputf8 |= SMTPUTF8_FLAG_SENDER;
state->sendopts |= SMTPUTF8_FLAG_SENDER;
/* Fix 20140713: request SMTPUTF8 support selectively. */
if (state->flags & CLEANUP_FLAG_AUTOUTF8)
state->smtputf8 |= SMTPUTF8_FLAG_REQUESTED;
state->sendopts |= SMTPUTF8_FLAG_REQUESTED;
}
CLEANUP_OUT_BUF(state, REC_TYPE_FROM, clean_addr);
if (state->sender) /* XXX Can't happen */
@ -219,12 +222,12 @@ void cleanup_addr_recipient(CLEANUP_STATE *state, const char *buf)
&& valid_utf8_stringz(STR(clean_addr))) {
/* Fix 20140713: request SMTPUTF8 support selectively. */
if (state->flags & CLEANUP_FLAG_AUTOUTF8)
state->smtputf8 |= SMTPUTF8_FLAG_REQUESTED;
state->sendopts |= SMTPUTF8_FLAG_REQUESTED;
}
/* Fix 20141024: Don't fake up a "bare" DSN original rcpt in smtp(8). */
if (state->dsn_orcpt == 0 && *STR(clean_addr) != 0)
state->dsn_orcpt = concatenate((!allascii(STR(clean_addr))
&& (state->smtputf8 & SMTPUTF8_FLAG_REQUESTED)) ?
&& (state->sendopts & SMTPUTF8_FLAG_REQUESTED)) ?
"utf-8" : "rfc822", ";", STR(clean_addr), (char *) 0);
cleanup_out_recipient(state, state->dsn_orcpt, state->dsn_notify,
state->orig_rcpt, STR(clean_addr));
@ -278,7 +281,7 @@ void cleanup_addr_bcc_dsn(CLEANUP_STATE *state, const char *bcc,
&& valid_utf8_stringz(STR(clean_addr))) {
/* Fix 20140713: request SMTPUTF8 support selectively. */
if (state->flags & CLEANUP_FLAG_AUTOUTF8)
state->smtputf8 |= SMTPUTF8_FLAG_REQUESTED;
state->sendopts |= SMTPUTF8_FLAG_REQUESTED;
}
cleanup_out_recipient(state, dsn_orcpt, dsn_notify,
STR(clean_addr), STR(clean_addr));

View File

@ -100,6 +100,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -206,7 +209,8 @@ void cleanup_control(CLEANUP_STATE *state, int flags)
state->err_mask = ~0;
}
if (state->flags & CLEANUP_FLAG_SMTPUTF8)
state->smtputf8 = SMTPUTF8_FLAG_REQUESTED;
state->sendopts |= SMTPUTF8_FLAG_REQUESTED;
/* TODO: REQUIRETLS */
}
/* cleanup_flush - finish queue file */

View File

@ -229,13 +229,13 @@ int cleanup_bounce(CLEANUP_STATE *state)
bounce_err =
bounce_flush(BOUNCE_FLAG_CLEAN,
state->queue_name, state->queue_id,
encoding, state->smtputf8, state->sender,
encoding, state->sendopts, state->sender,
dsn_envid, dsn_ret);
} else {
bounce_err =
bounce_flush_verp(BOUNCE_FLAG_CLEAN,
state->queue_name, state->queue_id,
encoding, state->smtputf8, state->sender,
encoding, state->sendopts, state->sender,
dsn_envid, dsn_ret, state->verp_delims);
}
if (bounce_err != 0) {

View File

@ -42,6 +42,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -350,16 +353,17 @@ static void cleanup_envelope_process(CLEANUP_STATE *state, int type,
/*
* Initial envelope non-recipient record processing.
*
* If the message was requeued with "postsuper -r" use their
* SMTPUTF8_REQUESTED flag.
* If this message was requeued with "postsuper -r", use their sender
* options flags, excluding flags derived from headers or envelopes.
* Those flags may be derived again, depending on Postfix configuration.
*/
if (state->flags & CLEANUP_FLAG_INRCPT)
/* Tell qmgr that recipient records are mixed with other information. */
state->qmgr_opts |= QMGR_READ_FLAG_MIXED_RCPT_OTHER;
if (type == REC_TYPE_SIZE) {
/* Use our own SIZE record, except for the SMTPUTF8_REQUESTED flag. */
(void) sscanf(buf, "%*s $*s %*s %*s %*s %d", &state->smtputf8);
state->smtputf8 &= SMTPUTF8_FLAG_REQUESTED;
/* Ignore their SIZE record, but keep the non-derived sender options. */
(void) sscanf(buf, "%*s $*s %*s %*s %*s %d", &state->sendopts);
state->sendopts &= ~SOPT_FLAG_DERIVED;
return;
}
if (mapped_type == REC_TYPE_CTIME)

View File

@ -74,5 +74,5 @@ void cleanup_final(CLEANUP_STATE *state)
(REC_TYPE_SIZE_CAST3) state->rcpt_count,
(REC_TYPE_SIZE_CAST4) state->qmgr_opts,
(REC_TYPE_SIZE_CAST5) state->cont_length,
(REC_TYPE_SIZE_CAST6) state->smtputf8);
(REC_TYPE_SIZE_CAST6) state->sendopts);
}

View File

@ -69,6 +69,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -186,10 +189,10 @@ void cleanup_out_header(CLEANUP_STATE *state, VSTRING *header_buf)
* Fix 20140711: Auto-detect the presence of a non-ASCII header.
*/
if (var_smtputf8_enable && *STR(header_buf) && !allascii(STR(header_buf))) {
state->smtputf8 |= SMTPUTF8_FLAG_HEADER;
state->sendopts |= SMTPUTF8_FLAG_HEADER;
/* Fix 20140713: request SMTPUTF8 support selectively. */
if (state->flags & CLEANUP_FLAG_AUTOUTF8)
state->smtputf8 |= SMTPUTF8_FLAG_REQUESTED;
state->sendopts |= SMTPUTF8_FLAG_REQUESTED;
}
/*

View File

@ -140,7 +140,7 @@ CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src)
state->milter_err_text = 0;
state->milter_dsn_buf = 0;
state->free_regions = state->body_regions = state->curr_body_region = 0;
state->smtputf8 = 0;
state->sendopts = 0;
return (state);
}

View File

@ -37,7 +37,7 @@ SRCS = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
normalize_mailhost_addr.c map_search.c reject_deliver_request.c \
info_log_addr_form.c sasl_mech_filter.c login_sender_match.c \
test_main.c compat_level.c config_known_tcp_ports.c \
hfrom_format.c rfc2047_code.c ascii_header_text.c
hfrom_format.c rfc2047_code.c ascii_header_text.c sendopts.c
OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
@ -76,7 +76,7 @@ OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
normalize_mailhost_addr.o map_search.o reject_deliver_request.o \
info_log_addr_form.o sasl_mech_filter.o login_sender_match.o \
test_main.o compat_level.o config_known_tcp_ports.o \
hfrom_format.o rfc2047_code.o ascii_header_text.o
hfrom_format.o rfc2047_code.o ascii_header_text.o sendopts.o
# MAP_OBJ is for maps that may be dynamically loaded with dynamicmaps.cf.
# When hard-linking these maps, makedefs sets NON_PLUGIN_MAP_OBJ=$(MAP_OBJ),
# otherwise it sets the PLUGIN_* macros.
@ -113,7 +113,7 @@ HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
maillog_client.h normalize_mailhost_addr.h map_search.h \
info_log_addr_form.h sasl_mech_filter.h login_sender_match.h \
test_main.h compat_level.h config_known_tcp_ports.h \
hfrom_format.h rfc2047_code.h ascii_header_text.h
hfrom_format.h rfc2047_code.h ascii_header_text.h sendopts.h
TESTSRC = rec2stream.c stream2rec.c recdump.c
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
@ -131,7 +131,7 @@ TESTPROG= domain_list dot_lockfile mail_addr_crunch mail_addr_find \
fold_addr smtp_reply_footer mail_addr_map normalize_mailhost_addr \
haproxy_srvr map_search delivered_hdr login_sender_match \
compat_level config_known_tcp_ports hfrom_format rfc2047_code \
ascii_header_text
ascii_header_text sendopts
LIBS = ../../lib/lib$(LIB_PREFIX)util$(LIB_SUFFIX)
LIB_DIR = ../../lib
@ -405,6 +405,9 @@ rfc2047_code: rfc2047_code.c $(LIB) $(LIBS)
ascii_header_text: ascii_header_text.c $(LIB) $(LIBS)
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
sendopts: sendopts.c $(LIB) $(LIBS)
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
config_known_tcp_ports: config_known_tcp_ports.c $(LIB) $(LIBS)
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
@ -418,7 +421,7 @@ tests: tok822_test mime_tests strip_addr_test tok822_limit_test \
normalize_mailhost_addr_test haproxy_srvr_test map_search_test \
delivered_hdr_test login_sender_match_test compat_level_test \
config_known_tcp_ports_test hfrom_format_test rfc2047_code_test \
ascii_header_text_test
ascii_header_text_test sendopts_test
mime_tests: mime_test mime_nest mime_8bit mime_dom mime_trunc mime_cvt \
mime_cvt2 mime_cvt3 mime_garb1 mime_garb2 mime_garb3 mime_garb4
@ -790,6 +793,9 @@ rfc2047_code_test: update rfc2047_code
ascii_header_text_test: update ascii_header_text
$(SHLIB_ENV) $(VALGRIND) ./ascii_header_text
sendopts_test: update sendopts
-$(SHLIB_ENV) $(VALGRIND) ./sendopts
clean:
rm -f *.o $(LIB) *core $(TESTPROG) junk $(MAPS)
@ -2399,6 +2405,7 @@ post_mail.o: post_mail.c
post_mail.o: post_mail.h
post_mail.o: rec_type.h
post_mail.o: record.h
post_mail.o: sendopts.h
post_mail.o: smtputf8.h
quote_821_local.o: ../../include/check_arg.h
quote_821_local.o: ../../include/sys_defs.h
@ -2752,6 +2759,7 @@ smtputf8.o: ../../include/vstring.h
smtputf8.o: cleanup_user.h
smtputf8.o: mail_params.h
smtputf8.o: mail_proto.h
smtputf8.o: sendopts.h
smtputf8.o: smtputf8.c
smtputf8.o: smtputf8.h
split_addr.o: ../../include/check_arg.h

View File

@ -6,26 +6,26 @@
/* SYNOPSIS
/* #include <abounce.h>
/*
/* void abounce_flush(flags, queue, id, encoding, smtputf8, sender,
/* void abounce_flush(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/* void (*callback)(int status, void *context);
/* void *context;
/*
/* void abounce_flush_verp(flags, queue, id, encoding, smtputf8, sender,
/* void abounce_flush_verp(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, verp, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -33,26 +33,26 @@
/* void (*callback)(int status, void *context);
/* void *context;
/*
/* void adefer_flush(flags, queue, id, encoding, smtputf8, sender,
/* void adefer_flush(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/* void (*callback)(int status, void *context);
/* void *context;
/*
/* void adefer_flush_verp(flags, queue, id, encoding, smtputf8, sender,
/* void adefer_flush_verp(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, verp, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -60,26 +60,26 @@
/* void (*callback)(int status, void *context);
/* void *context;
/*
/* void adefer_warn(flags, queue, id, encoding, smtputf8, sender,
/* void adefer_warn(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/* void (*callback)(int status, void *context);
/* void *context;
/*
/* void atrace_flush(flags, queue, id, encoding, smtputf8, sender,
/* void atrace_flush(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret, callback, context)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -138,8 +138,8 @@
/* file has the same name as the original message file.
/* .IP encoding
/* The body content encoding: MAIL_ATTR_ENC_{7BIT,8BIT,NONE}.
/* .IP smtputf8
/* The level of SMTPUTF8 support (to be defined).
/* .IP sendopts
/* Sender-requested SMTPUTF8 or RequireTLS support.
/* .IP sender
/* The sender envelope address.
/* .IP dsn_envid
@ -174,6 +174,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -320,7 +323,7 @@ static void abounce_send(int event, void *context)
static void abounce_connect(const char *class, const char *service,
int command, int flags,
const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender,
const char *dsn_envid, int dsn_ret,
const char *verp, ABOUNCE_FN callback,
@ -363,7 +366,7 @@ static void abounce_connect(const char *class, const char *service,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),
@ -390,77 +393,77 @@ static void abounce_connect(const char *class, const char *service,
/* abounce_flush_verp - asynchronous bounce flush */
void abounce_flush_verp(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, const char *verp,
ABOUNCE_FN callback,
void *context)
{
abounce_connect(MAIL_CLASS_PRIVATE, var_bounce_service,
BOUNCE_CMD_VERP, flags, queue, id, encoding, smtputf8,
BOUNCE_CMD_VERP, flags, queue, id, encoding, sendopts,
sender, dsn_envid, dsn_ret, verp, callback, context);
}
/* adefer_flush_verp - asynchronous defer flush */
void adefer_flush_verp(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, const char *verp,
ABOUNCE_FN callback, void *context)
{
flags |= BOUNCE_FLAG_DELRCPT;
abounce_connect(MAIL_CLASS_PRIVATE, var_defer_service,
BOUNCE_CMD_VERP, flags, queue, id, encoding, smtputf8,
BOUNCE_CMD_VERP, flags, queue, id, encoding, sendopts,
sender, dsn_envid, dsn_ret, verp, callback, context);
}
/* abounce_flush - asynchronous bounce flush */
void abounce_flush(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, ABOUNCE_FN callback,
void *context)
{
abounce_connect(MAIL_CLASS_PRIVATE, var_bounce_service, BOUNCE_CMD_FLUSH,
flags, queue, id, encoding, smtputf8, sender, dsn_envid,
flags, queue, id, encoding, sendopts, sender, dsn_envid,
dsn_ret, ABOUNCE_NO_VERP, callback, context);
}
/* adefer_flush - asynchronous defer flush */
void adefer_flush(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, ABOUNCE_FN callback, void *context)
{
flags |= BOUNCE_FLAG_DELRCPT;
abounce_connect(MAIL_CLASS_PRIVATE, var_defer_service, BOUNCE_CMD_FLUSH,
flags, queue, id, encoding, smtputf8, sender, dsn_envid,
flags, queue, id, encoding, sendopts, sender, dsn_envid,
dsn_ret, ABOUNCE_NO_VERP, callback, context);
}
/* adefer_warn - send copy of defer log to sender as warning bounce */
void adefer_warn(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, ABOUNCE_FN callback, void *context)
{
abounce_connect(MAIL_CLASS_PRIVATE, var_defer_service, BOUNCE_CMD_WARN,
flags, queue, id, encoding, smtputf8, sender, dsn_envid,
flags, queue, id, encoding, sendopts, sender, dsn_envid,
dsn_ret, ABOUNCE_NO_VERP, callback, context);
}
/* atrace_flush - asynchronous trace flush */
void atrace_flush(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, ABOUNCE_FN callback, void *context)
{
abounce_connect(MAIL_CLASS_PRIVATE, var_trace_service, BOUNCE_CMD_TRACE,
flags, queue, id, encoding, smtputf8, sender, dsn_envid,
flags, queue, id, encoding, sendopts, sender, dsn_envid,
dsn_ret, ABOUNCE_NO_VERP, callback, context);
}

View File

@ -14,36 +14,36 @@
/* const char *relay;
/* DSN *dsn;
/*
/* int bounce_flush(flags, queue, id, encoding, smtputf8, sender,
/* int bounce_flush(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/*
/* int bounce_flush_verp(flags, queue, id, encoding, smtputf8,
/* int bounce_flush_verp(flags, queue, id, encoding, sendopts,
/* sender, dsn_envid, dsn_ret, verp_delims)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/* const char *verp_delims;
/*
/* int bounce_one(flags, queue, id, encoding, smtputf8, sender,
/* int bounce_one(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, ret, stats, recipient, relay, dsn)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -65,13 +65,13 @@
/* RECIPIENT *rcpt;
/* const char *relay;
/*
/* int bounce_one_intern(flags, queue, id, encoding, smtputf8, sender,
/* int bounce_one_intern(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, ret, stats, recipient, relay, dsn)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -151,8 +151,8 @@
/* This information is used for syslogging only.
/* .IP encoding
/* The body content encoding: MAIL_ATTR_ENC_{7BIT,8BIT,NONE}.
/* .IP smtputf8
/* The level of SMTPUTF8 support (to be defined).
/* .IP sendopts
/* Sender-requested SMTPUTF8 or RequireTLS support.
/* .IP sender
/* The sender envelope address.
/* .IP dsn_envid
@ -191,6 +191,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -347,7 +350,7 @@ int bounce_append_intern(int flags, const char *id, MSG_STATS *stats,
/* bounce_flush - flush the bounce log and deliver to the sender */
int bounce_flush(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret)
{
@ -365,7 +368,7 @@ int bounce_flush(int flags, const char *queue, const char *id,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),
@ -382,7 +385,7 @@ int bounce_flush(int flags, const char *queue, const char *id,
/* bounce_flush_verp - verpified notification */
int bounce_flush_verp(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, const char *verp_delims)
{
@ -400,7 +403,7 @@ int bounce_flush_verp(int flags, const char *queue, const char *id,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),
@ -418,7 +421,7 @@ int bounce_flush_verp(int flags, const char *queue, const char *id,
/* bounce_one - send notice for one recipient */
int bounce_one(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, MSG_STATS *stats, RECIPIENT *rcpt,
const char *relay, DSN *dsn)
@ -443,14 +446,14 @@ int bounce_one(int flags, const char *queue, const char *id,
return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res));
my_dsn = *dsn_res;
}
return (bounce_one_intern(flags, queue, id, encoding, smtputf8, sender,
return (bounce_one_intern(flags, queue, id, encoding, sendopts, sender,
dsn_envid, dsn_ret, stats, rcpt, relay, &my_dsn));
}
/* bounce_one_intern - send notice for one recipient */
int bounce_one_intern(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, MSG_STATS *stats,
RECIPIENT *rcpt, const char *relay,
@ -508,7 +511,7 @@ int bounce_one_intern(int flags, const char *queue, const char *id,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),

View File

@ -14,35 +14,35 @@
/* const char *relay;
/* DSN *dsn;
/*
/* int defer_flush(flags, queue, id, encoding, smtputf8, sender,
/* int defer_flush(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, dsn_ret)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/*
/* int defer_warn(flags, queue, id, encoding, smtputf8, sender,
/* int defer_warn(flags, queue, id, encoding, sendopts, sender,
dsn_envid, dsn_ret)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
/*
/* int defer_one(flags, queue, id, encoding, smtputf8, sender,
/* int defer_one(flags, queue, id, encoding, sendopts, sender,
/* dsn_envid, ret, stats, recipient, relay, dsn)
/* int flags;
/* const char *queue;
/* const char *id;
/* const char *encoding;
/* int smtputf8;
/* int sendopts;
/* const char *sender;
/* const char *dsn_envid;
/* int dsn_ret;
@ -128,8 +128,8 @@
/* Delivery status. See dsn(3). The specified action is ignored.
/* .IP encoding
/* The body content encoding: MAIL_ATTR_ENC_{7BIT,8BIT,NONE}.
/* .IP smtputf8
/* The level of SMTPUTF8 support (to be defined).
/* .IP sendopts
/* Sender-requested SMTPUTF8 or RequireTLS support.
/* .IP sender
/* The sender envelope address.
/* .IP dsn_envid
@ -158,6 +158,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -300,7 +303,7 @@ int defer_append_intern(int flags, const char *id, MSG_STATS *stats,
/* defer_flush - flush the defer log and deliver to the sender */
int defer_flush(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret)
{
@ -313,7 +316,7 @@ int defer_flush(int flags, const char *queue, const char *id,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),
@ -328,7 +331,7 @@ int defer_flush(int flags, const char *queue, const char *id,
* do not flush the log */
int defer_warn(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *envid, int dsn_ret)
{
if (mail_command_client(MAIL_CLASS_PRIVATE, var_defer_service,
@ -338,7 +341,7 @@ int defer_warn(int flags, const char *queue, const char *id,
SEND_ATTR_STR(MAIL_ATTR_QUEUE, queue),
SEND_ATTR_STR(MAIL_ATTR_QUEUEID, id),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, dsn_ret),
@ -352,7 +355,7 @@ int defer_warn(int flags, const char *queue, const char *id,
/* defer_one - defer mail for one recipient */
int defer_one(int flags, const char *queue, const char *id,
const char *encoding, int smtputf8,
const char *encoding, int sendopts,
const char *sender, const char *dsn_envid,
int dsn_ret, MSG_STATS *stats, RECIPIENT *rcpt,
const char *relay, DSN *dsn)
@ -374,7 +377,7 @@ int defer_one(int flags, const char *queue, const char *id,
if (delivery_status_filter != 0
&& (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
if (dsn_res->status[0] == '5')
return (bounce_one_intern(flags, queue, id, encoding, smtputf8,
return (bounce_one_intern(flags, queue, id, encoding, sendopts,
sender, dsn_envid, dsn_ret, stats,
rcpt, relay, dsn_res));
my_dsn = *dsn_res;

View File

@ -54,6 +54,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -109,7 +112,7 @@ static int deliver_pass_send_request(VSTREAM *stream, DELIVER_REQUEST *request,
SEND_ATTR_LONG(MAIL_ATTR_SIZE, request->data_size),
SEND_ATTR_STR(MAIL_ATTR_NEXTHOP, nexthop),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, request->encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, request->smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, request->sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, request->sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, request->dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, request->dsn_ret),

View File

@ -16,6 +16,7 @@
/* long data_size;
/* char *nexthop;
/* char *encoding;
/* int sendopts;
/* char *sender;
/* MSG_STATS msg_stats;
/* RECIPIENT_LIST rcpt_list;
@ -97,6 +98,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -213,7 +217,7 @@ static int deliver_request_get(VSTREAM *stream, DELIVER_REQUEST *request)
static VSTRING *dsn_envid;
static RCPT_BUF *rcpt_buf;
int rcpt_count;
int smtputf8;
int sendopts;
int dsn_ret;
/*
@ -253,7 +257,7 @@ static int deliver_request_get(VSTREAM *stream, DELIVER_REQUEST *request)
RECV_ATTR_LONG(MAIL_ATTR_SIZE, &request->data_size),
RECV_ATTR_STR(MAIL_ATTR_NEXTHOP, nexthop),
RECV_ATTR_STR(MAIL_ATTR_ENCODING, encoding),
RECV_ATTR_INT(MAIL_ATTR_SMTPUTF8, &smtputf8),
RECV_ATTR_INT(MAIL_ATTR_SENDOPTS, &sendopts),
RECV_ATTR_STR(MAIL_ATTR_SENDER, address),
RECV_ATTR_STR(MAIL_ATTR_DSN_ENVID, dsn_envid),
RECV_ATTR_INT(MAIL_ATTR_DSN_RET, &dsn_ret),
@ -288,8 +292,8 @@ static int deliver_request_get(VSTREAM *stream, DELIVER_REQUEST *request)
request->queue_id = mystrdup(vstring_str(queue_id));
request->nexthop = mystrdup(vstring_str(nexthop));
request->encoding = mystrdup(vstring_str(encoding));
/* Fix 20140708: dedicated smtputf8 attribute with its own flags. */
request->smtputf8 = smtputf8;
/* Fix 20140708: dedicated sendopts attribute with its own flags. */
request->sendopts = sendopts;
request->sender = mystrdup(vstring_str(address));
request->client_name = mystrdup(vstring_str(client_name));
request->client_addr = mystrdup(vstring_str(client_addr));

View File

@ -42,7 +42,7 @@ typedef struct DELIVER_REQUEST {
long data_size; /* message size */
char *nexthop; /* next hop name */
char *encoding; /* content encoding */
int smtputf8; /* SMTPUTF8 level */
int sendopts; /* smtputf8, requiretls, etc. */
char *sender; /* envelope sender */
MSG_STATS msg_stats; /* time profile */
RECIPIENT_LIST rcpt_list; /* envelope recipients */
@ -151,6 +151,9 @@ extern int PRINTFLIKE(4, 5) reject_deliver_request(const char *,
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
#endif

View File

@ -308,7 +308,7 @@ extern char *mail_pathname(const char *, const char *);
#define MAIL_ATTR_DSN_RET "ret_flags" /* dsn full/headers */
#define MAIL_ATTR_DSN_NOTIFY "notify_flags" /* dsn notify flags */
#define MAIL_ATTR_DSN_ORCPT "dsn_orig_rcpt" /* dsn original recipient */
#define MAIL_ATTR_SMTPUTF8 "smtputf8" /* RFC6531 support */
#define MAIL_ATTR_SENDOPTS "sendopts" /* RFC6531 etc. support */
/*
* SMTP reply footer support.
@ -329,6 +329,9 @@ extern char *mail_pathname(const char *, const char *);
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
#endif

View File

@ -20,7 +20,7 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
#define MAIL_RELEASE_DATE "20250107"
#define MAIL_RELEASE_DATE "20250109"
#define MAIL_VERSION_NUMBER "3.10"
#ifdef SNAPSHOT

View File

@ -0,0 +1,161 @@
/*++
/* NAME
/* sendopts 3
/* SUMMARY
/* Support for SMTPUTF8, REQUIRETLS, etc.
/* SYNOPSIS
/* #include <sendopts.h>
/*
/* const char *sendopts_strflags(code)
/* int code;
/* DESCRIPTION
/* Postfix queue files and IPC messages contain a sendopts field
/* with flags that control SMTPUTF8, REQUIRETLS, etc. support. The
/* flags are documented in sendopts(3h), and are based on information
/* received with ESMTP requests or with message content.
/*
/* The SMTPUTF8 flags life cycle is documented in smtputf8(3h).
/*
/* sendopts_strflags() maps a sendopts flag value to printable
/* string. The result is overwritten upon each call.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
#include <sys_defs.h>
/*
* Utility library.
*/
#include <msg.h>
#include <vstring.h>
#include <name_mask.h>
/*
* Global library.
*/
#include <sendopts.h>
/*
* Mapping from flags code to printable string.
*/
static NAME_MASK sendopts_flag_map[] = {
"smtputf8_requested", SOPT_SMTPUTF8_REQUESTED,
"smtputf8_header", SOPT_SMTPUTF8_HEADER,
"smtputf8_sender", SOPT_SMTPUTF8_SENDER,
"smtputf8_recipient", SOPT_SMTPUTF8_RECIPIENT,
"requiretls_header", SOPT_REQUIRETLS_HEADER,
"requiretls_esmtp", SOPT_REQUIRETLS_ESMTP,
0,
};
/* sendopts_strflags - map flags code to printable string */
const char *sendopts_strflags(unsigned flags)
{
static VSTRING *result;
if (flags == 0)
return ("none");
if (result == 0)
result = vstring_alloc(20);
else
VSTRING_RESET(result);
return (str_name_mask_opt(result, "sendopts_strflags", sendopts_flag_map,
flags, NAME_MASK_FATAL));
}
#ifdef TEST
#include <stdlib.h>
#include <string.h>
#include <stringops.h>
#include <msg_vstream.h>
/*
* Tests and test cases.
*/
typedef struct TEST_CASE {
const char *label; /* identifies test case */
int mask;
const char *want;
} TEST_CASE;
static const TEST_CASE test_cases[] = {
{"SOPT_SMTPUTF8_ALL",
SOPT_SMTPUTF8_ALL,
"smtputf8_requested smtputf8_header smtputf8_sender smtputf8_recipient"
},
{"SOPT_SMTPUTF8_DERIVED",
SOPT_SMTPUTF8_DERIVED,
"smtputf8_header smtputf8_sender smtputf8_recipient"
},
{"SOPT_SMTPUTF8_REQUESTED",
SOPT_SMTPUTF8_REQUESTED,
"smtputf8_requested"
},
{"SOPT_SMTPUTF8_HEADER",
SOPT_SMTPUTF8_HEADER,
"smtputf8_header"
},
{"SOPT_SMTPUTF8_SENDER",
SOPT_SMTPUTF8_SENDER,
"smtputf8_sender"
},
{"SOPT_SMTPUTF8_RECIPIENT",
SOPT_SMTPUTF8_RECIPIENT,
"smtputf8_recipient"
},
{"SOPT_REQUIRETLS_ALL",
SOPT_REQUIRETLS_ALL,
"requiretls_header requiretls_esmtp"
},
{"SOPT_REQUIRETLS_DERIVED",
SOPT_REQUIRETLS_DERIVED,
"requiretls_header"
},
{"SOPT_REQUIRETLS_HEADER",
SOPT_REQUIRETLS_HEADER,
"requiretls_header"
},
{"SOPT_REQUIRETLS_ESMTP",
SOPT_REQUIRETLS_ESMTP,
"requiretls_esmtp"
},
{0},
};
int main(int argc, char **argv)
{
const TEST_CASE *tp;
int pass = 0;
int fail = 0;
const char *got;
msg_vstream_init(sane_basename((VSTRING *) 0, argv[0]), VSTREAM_ERR);
for (tp = test_cases; tp->label != 0; tp++) {
msg_info("RUN %s", tp->label);
got = sendopts_strflags(tp->mask);
if (strcmp(got, tp->want) != 0) {
msg_warn("got result '%s', want: '%s'", got, tp->want);
fail++;
msg_info("FAIL %s", tp->label);
} else {
msg_info("PASS %s", tp->label);
pass++;
}
}
msg_info("PASS=%d FAIL=%d", pass, fail);
exit(fail != 0);
}
#endif

View File

@ -0,0 +1,63 @@
#ifndef _SENDOPTS_H_INCLUDED_
#define _SENDOPTS_H_INCLUDED_
/*++
/* NAME
/* sendopts 3h
/* SUMMARY
/* Support for SMTPUTF8, REQUIRETLS, etc.
/* SYNOPSIS
/* #include <sendopts.h>
/* DESCRIPTION
/* .nf
/*
* Support for SMTPUTF8 (RFC 6531, RFC 6532, RFC 6533). These flags were
* migrated from <smtputf8.h> and MUST NOT be changed, to maintain queue
* file compatibility.
*/
#define SOPT_SMTPUTF8_NONE (0)
#define SOPT_SMTPUTF8_REQUESTED (1<<0) /* queue file/delivery/bounce request */
#define SOPT_SMTPUTF8_HEADER (1<<1) /* queue file/delivery/bounce request */
#define SOPT_SMTPUTF8_SENDER (1<<2) /* queue file/delivery/bounce request */
#define SOPT_SMTPUTF8_RECIPIENT (1<<3) /* delivery request only */
#define SOPT_SMTPUTF8_ALL (SOPT_SMTPUTF8_REQUESTED | \
SOPT_SMTPUTF8_HEADER | \
SOPT_SMTPUTF8_SENDER | \
SOPT_SMTPUTF8_RECIPIENT)
#define SOPT_SMTPUTF8_DERIVED \
(SOPT_SMTPUTF8_ALL & ~SOPT_SMTPUTF8_REQUESTED)
/*
* Support for REQUIRETLS (RFC 8689). At this time only the TLS-Required:
* header is implemented, but we reserve the flag that would support it.
*/
#define SOPT_REQUIRETLS_HEADER (1<<4) /* TLS-Required: no */
#define SOPT_REQUIRETLS_ESMTP (1<<5) /* MAIL FROM ... REQUIRETLS */
#define SOPT_REQUIRETLS_ALL (SOPT_REQUIRETLS_HEADER | \
SOPT_REQUIRETLS_ESMTP)
#define SOPT_REQUIRETLS_DERIVED SOPT_REQUIRETLS_HEADER
#define SOPT_FLAG_ALL (SOPT_SMTPUTF8_ALL | SOPT_REQUIRETLS_ALL)
#define SOPT_FLAG_DERIVED (SOPT_SMTPUTF8_DERIVED | SOPT_REQUIRETLS_DERIVED)
/*
* Debug helper.
*/
extern const char *sendopts_strflags(unsigned flags);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
#endif

View File

@ -11,24 +11,29 @@
/* DESCRIPTION
/* .nf
/*
* Global library.
*/
#include <sendopts.h>
/*
* Avoiding chicken-and-egg problems during the initial SMTPUTF8 roll-out in
* environments with pre-existing mail flows that contain UTF8.
*
*
* Prior to SMTPUTF8, mail flows that contain UTF8 worked because the vast
* majority of MTAs is perfectly capable of handling UTF8 in address
* localparts (and in headers), even if pre-SMTPUTF8 standards do not
* support this practice.
*
*
* When turning on Postfix SMTPUTF8 support for the first time, we don't want
* to suddenly break pre-existing mail flows that contain UTF8 because 1) a
* client does not request SMTPUTF8 support, and because 2) a down-stream
* MTA does not announce SMTPUTF8 support.
*
*
* While 1) is easy enough to avoid (keep accepting UTF8 in address localparts
* just like Postfix has always done), 2) presents a thornier problem. The
* root cause of that problem is the need for SMTPUTF8 autodetection.
*
*
* What is SMTPUTF8 autodetection? Postfix cannot rely solely on the sender's
* declaration that a message requires SMTPUTF8 support, because UTF8 may be
* introduced during local processing (for example, the client hostname in
@ -36,21 +41,21 @@
* incomplete address, address rewriting, alias expansion, automatic BCC
* recipients, local forwarding, and changes made by header checks or Milter
* applications).
*
*
* In summary, after local processing has happened, Postfix may decide that a
* message requires SMTPUTF8 support, even when that message initially did
* not require SMTPUTF8 support. This could make the message undeliverable
* to destinations that do not support SMTPUTF8. In an environment with
* pre-existing mail flows that contain UTF8, we want to avoid disrupting
* those mail flows when rolling out SMTPUTF8 support.
*
*
* For the vast majority of sites, the simplest solution is to autodetect
* SMTPUTF8 support only for Postfix sendmail command-line submissions, at
* least as long as SMTPUTF8 support has not yet achieved wold domination.
*
*
* However, sites that add UTF8 content via local processing (see above) should
* autodetect SMTPUTF8 support for all email.
*
*
* smtputf8_autodetect() uses the setting of the smtputf8_autodetect_classes
* parameter, and the mail source classes defined in mail_params.h.
*/
@ -58,31 +63,39 @@ extern int smtputf8_autodetect(int);
/*
* The flag SMTPUTF8_FLAG_REQUESTED is raised on request by the sender, or
* when a queue file contains at least one UTF8 envelope recipient. One this
* flag is raised it is preserved when mail is forwarded or bounced.
* when SMTPUTF8 auto-detection is enabled and a queue file contains at
* least one UTF8 envelope sender, envelope recipient, or message header.
* Once this flag is raised, it is preserved when mail is forwarded or
* bounced.
*
* The flag SMTPUTF8_FLAG_HEADER is raised when a queue file contains at least
* one UTF8 message header.
* one UTF8 message header even if SMTPUTF8_FLAG_REQUESTED is disabled.
*
* The flag SMTPUTF8_FLAG_SENDER is raised when a queue file contains an UTF8
* envelope sender.
* envelope sender, even if SMTPUTF8_FLAG_REQUESTED is disabled.
*
* The three flags SMTPUTF8_FLAG_REQUESTED/HEADER/SENDER are stored in the
* queue file, are sent with delivery requests to Postfix delivery agents,
* and are sent with "flush" requests to the bounce daemon to ensure that
* the resulting notification message will have a content-transfer-encoding
* of 8bit.
* of 8bit. The derived flags SMTPUTF8_FLAG_HEADER/SENDER are ignored when a
* message is re-queued with "postsuper -r". They may be regenerated by the
* cleanup daemon.
*
* In the future, mailing lists will have a mix of UTF8 and non-UTF8
* subscribers. With the following flag, Postfix can avoid requiring
* SMTPUTF8 delivery when it isn't really needed.
*
* The flag SMTPUTF8_FLAG_RECIPIENT is raised when a delivery request (NOT:
* message) contains at least one UTF8 envelope recipient. The flag is NOT
* stored in the queue file. The flag sent in requests to the bounce daemon
* ONLY when bouncing a single recipient. The flag is used ONLY in requests
* to Postfix delivery agents, to give Postfix flexibility when delivering
* messages to non-SMTPUTF8 servers.
* The fourth flag, SMTPUTF8_FLAG_RECIPIENT, is raised when a delivery request
* (NOT: message) contains at least one UTF8 envelope recipient. This flag
* is NOT stored in the queue file. The flag is used ONLY in requests to
* Postfix delivery agents, to give delivery agents flexibility when
* delivering messages to non-SMTPUTF8 servers. Delivery agents may then
* pass the flag to the bounce daemon.
*
* XXXSENDOPTS Verify that the flag is sent for only one recipient. What
* problem would that solve? The recipient becomes message content in the
* delivery status notification; it is just data.
*
* If a delivery request has none of the flags SMTPUTF8_FLAG_RECIPIENT,
* SMTPUTF8_FLAG_SENDER, or SMTPUTF8_FLAG_HEADER, then the message can
@ -94,10 +107,15 @@ extern int smtputf8_autodetect(int);
* the SMTP client protocol engine.
*/
#define SMTPUTF8_FLAG_NONE (0)
#define SMTPUTF8_FLAG_REQUESTED (1<<0) /* queue file/delivery/bounce request */
#define SMTPUTF8_FLAG_HEADER (1<<1) /* queue file/delivery/bounce request */
#define SMTPUTF8_FLAG_SENDER (1<<2) /* queue file/delivery/bounce request */
#define SMTPUTF8_FLAG_RECIPIENT (1<<3) /* delivery request only */
/* In queue file, delivery request, or bounce request. */
#define SMTPUTF8_FLAG_REQUESTED SOPT_SMTPUTF8_REQUESTED
#define SMTPUTF8_FLAG_HEADER SOPT_SMTPUTF8_HEADER
#define SMTPUTF8_FLAG_SENDER SOPT_SMTPUTF8_SENDER
/* In delivery or bounce request only. */
#define SMTPUTF8_FLAG_RECIPIENT SOPT_SMTPUTF8_RECIPIENT
#define SMTPUTF8_FLAG_ALL SOPT_SMTPUTF8_ALL
#define SMTPUTF8_FLAG_DERIVED SOPT_SMTPUTF8_DERIVED
/* LICENSE
/* .ad
@ -108,6 +126,9 @@ extern int smtputf8_autodetect(int);
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
#endif

View File

@ -302,6 +302,7 @@ forward.o: ../../include/rec_type.h
forward.o: ../../include/recipient_list.h
forward.o: ../../include/record.h
forward.o: ../../include/resolve_clnt.h
forward.o: ../../include/sendopts.h
forward.o: ../../include/sent.h
forward.o: ../../include/smtputf8.h
forward.o: ../../include/stringops.h

View File

@ -53,6 +53,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -160,7 +163,7 @@ static FORWARD_INFO *forward_open(DELIVER_REQUEST *request, const char *sender)
#define FORWARD_CLEANUP_FLAGS \
(CLEANUP_FLAG_BOUNCE | CLEANUP_FLAG_MASK_INTERNAL \
| smtputf8_autodetect(MAIL_SRC_MASK_FORWARD) \
| ((request->smtputf8 & SMTPUTF8_FLAG_REQUESTED) ? \
| ((request->sendopts & SMTPUTF8_FLAG_REQUESTED) ? \
CLEANUP_FLAG_SMTPUTF8 : 0))
attr_print(cleanup, ATTR_FLAG_NONE,

View File

@ -530,7 +530,7 @@
/* request before it is terminated by a built-in watchdog timer.
/* .IP "\fBdelay_logging_resolution_limit (2)\fR"
/* The maximal number of digits after the decimal point when logging
/* sub-second delay values.
/* delay values.
/* .IP "\fBexport_environment (see 'postconf -d' output)\fR"
/* The list of environment variables that a Postfix process will export
/* to non-Postfix processes.
@ -619,6 +619,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -747,7 +750,7 @@ static int local_deliver(DELIVER_REQUEST *rqst, char *service)
state.msg_attr.fp = rqst->fp;
state.msg_attr.offset = rqst->data_offset;
state.msg_attr.encoding = rqst->encoding;
state.msg_attr.smtputf8 = rqst->smtputf8;
state.msg_attr.sendopts = rqst->sendopts;
state.msg_attr.sender = rqst->sender;
state.msg_attr.dsn_envid = rqst->dsn_envid;
state.msg_attr.dsn_ret = rqst->dsn_ret;

View File

@ -72,7 +72,7 @@ typedef struct DELIVER_ATTR {
char *queue_id; /* mail queue id */
long offset; /* data offset */
char *encoding; /* MIME encoding */
int smtputf8; /* from delivery request */
int sendopts; /* from delivery request */
const char *sender; /* taken from envelope */
char *dsn_envid; /* DSN envelope ID */
int dsn_ret; /* DSN headers/full */
@ -135,7 +135,7 @@ typedef struct LOCAL_STATE {
attr.queue_id, &attr.msg_stats, &attr.rcpt, attr.relay, \
DSN_FROM_DSN_BUF(attr.why)
#define BOUNCE_ONE_ATTR(attr) \
attr.queue_name, attr.queue_id, attr.encoding, attr.smtputf8, \
attr.queue_name, attr.queue_id, attr.encoding, attr.sendopts, \
attr.sender, attr.dsn_envid, attr.dsn_ret, \
&attr.msg_stats, &attr.rcpt, attr.relay, \
DSN_FROM_DSN_BUF(attr.why)

View File

@ -175,6 +175,7 @@ qmgr_deliver.o: ../../include/nvtable.h
qmgr_deliver.o: ../../include/rcpt_print.h
qmgr_deliver.o: ../../include/recipient_list.h
qmgr_deliver.o: ../../include/scan_dir.h
qmgr_deliver.o: ../../include/sendopts.h
qmgr_deliver.o: ../../include/smtputf8.h
qmgr_deliver.o: ../../include/stringops.h
qmgr_deliver.o: ../../include/sys_defs.h
@ -272,6 +273,7 @@ qmgr_message.o: ../../include/record.h
qmgr_message.o: ../../include/resolve_clnt.h
qmgr_message.o: ../../include/rewrite_clnt.h
qmgr_message.o: ../../include/scan_dir.h
qmgr_message.o: ../../include/sendopts.h
qmgr_message.o: ../../include/sent.h
qmgr_message.o: ../../include/split_addr.h
qmgr_message.o: ../../include/split_at.h

View File

@ -300,7 +300,7 @@ struct QMGR_MESSAGE {
char *sender; /* complete address */
char *dsn_envid; /* DSN envelope ID */
int dsn_ret; /* DSN headers/full */
int smtputf8; /* requires unicode */
int sendopts; /* smtputf8, requiretls, etc. */
char *verp_delims; /* VERP delimiters */
char *filter_xport; /* filtering transport */
char *inspect_xport; /* inspecting transport */
@ -429,4 +429,7 @@ extern char *qmgr_error_nexthop(DSN *);
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/

View File

@ -75,6 +75,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -307,7 +310,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -318,7 +321,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -403,7 +406,7 @@ static void qmgr_active_done_2_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -465,7 +468,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -476,7 +479,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -492,7 +495,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,

View File

@ -45,6 +45,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -147,7 +150,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
MSG_STATS stats;
char *sender;
int flags;
int smtputf8 = message->smtputf8;
int sendopts = message->sendopts;
const char *addr;
/*
@ -156,9 +159,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
for (recipient = list.info; recipient < list.info + list.len; recipient++)
if (var_smtputf8_enable && (addr = recipient->address)[0]
&& !allascii(addr) && valid_utf8_stringz(addr)) {
smtputf8 |= SMTPUTF8_FLAG_RECIPIENT;
sendopts |= SMTPUTF8_FLAG_RECIPIENT;
if (message->verp_delims)
smtputf8 |= SMTPUTF8_FLAG_SENDER;
sendopts |= SMTPUTF8_FLAG_SENDER;
}
/*
@ -187,7 +190,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
SEND_ATTR_LONG(MAIL_ATTR_SIZE, message->cont_length),
SEND_ATTR_STR(MAIL_ATTR_NEXTHOP, entry->queue->nexthop),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, message->encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, message->dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, message->dsn_ret),

View File

@ -94,6 +94,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -137,6 +140,7 @@
#include <split_addr.h>
#include <dsn_mask.h>
#include <rec_attr_map.h>
#include <sendopts.h>
/* Client stubs. */
@ -178,7 +182,7 @@ static QMGR_MESSAGE *qmgr_message_create(const char *queue_name,
message->sender = 0;
message->dsn_envid = 0;
message->dsn_ret = 0;
message->smtputf8 = 0;
message->sendopts = 0;
message->filter_xport = 0;
message->inspect_xport = 0;
message->redirect_addr = 0;
@ -548,7 +552,7 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
&message->data_size, &message->data_offset,
&nrcpt, &message->rflags,
&message->cont_length,
&message->smtputf8)) >= 3) {
&message->sendopts)) >= 3) {
/* Postfix >= 1.0 (a.k.a. 20010228). */
if (message->data_offset <= 0 || message->data_size <= 0) {
msg_warn("%s: invalid size record: %.100s",
@ -562,6 +566,8 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
rec_type = REC_TYPE_ERROR;
break;
}
/* Forward compatibility. */
message->sendopts &= SOPT_FLAG_ALL;
} else if (count == 1) {
/* Postfix < 1.0 (a.k.a. 20010228). */
qmgr_message_oldstyle_scan(message);

View File

@ -72,6 +72,7 @@ pickup.o: ../../include/rec_type.h
pickup.o: ../../include/record.h
pickup.o: ../../include/safe_open.h
pickup.o: ../../include/scan_dir.h
pickup.o: ../../include/sendopts.h
pickup.o: ../../include/set_ugid.h
pickup.o: ../../include/smtputf8.h
pickup.o: ../../include/stringops.h

View File

@ -27,7 +27,7 @@ update: ../../bin/$(PROG)
cp $(PROG) ../../bin
tests: test1 test2 fail_test quote_test file_test lmdb_abb_test \
lmdb_bulk_test lmdb_incr_test
lmdb_bulk_test lmdb_incr_test cdb_bulk_test
root_tests:
@ -74,6 +74,17 @@ file_test: $(PROG) file_test.in file_test.ref
diff file_test.ref file_test.tmp
rm -f file_test.tmp file_test_map.* postmap-file-1 postmap-file-2
cdb_bulk_test: $(PROG)
rm -f cdb_bulk.cdb main.cf
tr A-Z a-z < /usr/share/dict/words| \
sed -e 's/.*/& &/' -e 10000q| LANG=C sort -u >cdb_bulk
touch -t 197101010000 main.cf
($(SHLIB_ENV) $(VALGRIND) ./postmap -c . cdb:cdb_bulk; \
$(SHLIB_ENV) $(VALGRIND) ./postmap -s cdb:cdb_bulk | \
LANG=C sort > cdb_bulk.tmp)
cmp cdb_bulk cdb_bulk.tmp
rm -f cdb_bulk cdb_bulk.tmp cdb_bulk.cdb main.cf
lmdb_abb_test: $(PROG) lmdb_abb lmdb_abb.ref
rm -f lmdb_abb.lmdb
($(SHLIB_ENV) $(VALGRIND) ./postmap lmdb:lmdb_abb; \
@ -86,6 +97,7 @@ lmdb_bulk_test: $(PROG)
tr A-Z a-z < /usr/share/dict/words| \
sed -e 's/.*/& &/' -e 10000q| LANG=C sort -u >lmdb_retry
echo lmdb_map_size=10240 >main.cf
touch -t 197101010000 main.cf
($(SHLIB_ENV) $(VALGRIND) ./postmap -c . lmdb:lmdb_retry; \
$(SHLIB_ENV) $(VALGRIND) ./postmap -s lmdb:lmdb_retry | \
LANG=C sort > lmdb_retry.tmp)
@ -97,6 +109,7 @@ lmdb_incr_test: $(PROG)
tr A-Z a-z < /usr/share/dict/words| \
sed -e 's/.*/& &/' -e 1000q| LANG=C sort -u >lmdb_retry
echo lmdb_map_size=10240 >main.cf
touch -t 197101010000 main.cf
($(SHLIB_ENV) $(VALGRIND) ./postmap -ic . lmdb:lmdb_retry <lmdb_retry; \
$(SHLIB_ENV) $(VALGRIND) ./postmap -s lmdb:lmdb_retry | \
LANG=C sort > lmdb_retry.tmp)

View File

@ -177,6 +177,7 @@ qmgr_deliver.o: ../../include/nvtable.h
qmgr_deliver.o: ../../include/rcpt_print.h
qmgr_deliver.o: ../../include/recipient_list.h
qmgr_deliver.o: ../../include/scan_dir.h
qmgr_deliver.o: ../../include/sendopts.h
qmgr_deliver.o: ../../include/smtputf8.h
qmgr_deliver.o: ../../include/stringops.h
qmgr_deliver.o: ../../include/sys_defs.h
@ -288,6 +289,7 @@ qmgr_message.o: ../../include/resolve_clnt.h
qmgr_message.o: ../../include/rewrite_clnt.h
qmgr_message.o: ../../include/sane_time.h
qmgr_message.o: ../../include/scan_dir.h
qmgr_message.o: ../../include/sendopts.h
qmgr_message.o: ../../include/sent.h
qmgr_message.o: ../../include/split_addr.h
qmgr_message.o: ../../include/split_at.h

View File

@ -345,7 +345,7 @@ struct QMGR_MESSAGE {
char *sender; /* complete address */
char *dsn_envid; /* DSN envelope ID */
int dsn_ret; /* DSN headers/full */
int smtputf8; /* requires unicode */
int sendopts; /* smtputf8, requiretls, etc. */
char *verp_delims; /* VERP delimiters */
char *filter_xport; /* filtering transport */
char *inspect_xport; /* inspecting transport */
@ -539,6 +539,9 @@ extern char *qmgr_error_nexthop(DSN *);
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*
/* Preemptive scheduler enhancements:
/* Patrik Rak
/* Modra 6

View File

@ -75,6 +75,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -307,7 +310,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -318,7 +321,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -403,7 +406,7 @@ static void qmgr_active_done_2_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -465,7 +468,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -476,7 +479,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,
@ -492,7 +495,7 @@ static void qmgr_active_done_25_generic(QMGR_MESSAGE *message)
message->queue_name,
message->queue_id,
message->encoding,
message->smtputf8,
message->sendopts,
message->sender,
message->dsn_envid,
message->dsn_ret,

View File

@ -50,6 +50,9 @@
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*--*/
/* System library. */
@ -152,7 +155,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
MSG_STATS stats;
char *sender;
int flags;
int smtputf8 = message->smtputf8;
int sendopts = message->sendopts;
const char *addr;
/*
@ -161,9 +164,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
for (recipient = list.info; recipient < list.info + list.len; recipient++)
if (var_smtputf8_enable && (addr = recipient->address)[0]
&& !allascii(addr) && valid_utf8_stringz(addr)) {
smtputf8 |= SMTPUTF8_FLAG_RECIPIENT;
sendopts |= SMTPUTF8_FLAG_RECIPIENT;
if (message->verp_delims)
smtputf8 |= SMTPUTF8_FLAG_SENDER;
sendopts |= SMTPUTF8_FLAG_SENDER;
}
/*
@ -192,7 +195,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
SEND_ATTR_LONG(MAIL_ATTR_SIZE, message->cont_length),
SEND_ATTR_STR(MAIL_ATTR_NEXTHOP, entry->queue->nexthop),
SEND_ATTR_STR(MAIL_ATTR_ENCODING, message->encoding),
SEND_ATTR_INT(MAIL_ATTR_SMTPUTF8, smtputf8),
SEND_ATTR_INT(MAIL_ATTR_SENDOPTS, sendopts),
SEND_ATTR_STR(MAIL_ATTR_SENDER, sender),
SEND_ATTR_STR(MAIL_ATTR_DSN_ENVID, message->dsn_envid),
SEND_ATTR_INT(MAIL_ATTR_DSN_RET, message->dsn_ret),

View File

@ -98,6 +98,9 @@
/* 111 8th Avenue
/* New York, NY 10011, USA
/*
/* Wietse Venema
/* porcupine.org
/*
/* Preemptive scheduler enhancements:
/* Patrik Rak
/* Modra 6
@ -146,6 +149,7 @@
#include <split_addr.h>
#include <dsn_mask.h>
#include <rec_attr_map.h>
#include <sendopts.h>
/* Client stubs. */
@ -189,7 +193,7 @@ static QMGR_MESSAGE *qmgr_message_create(const char *queue_name,
message->sender = 0;
message->dsn_envid = 0;
message->dsn_ret = 0;
message->smtputf8 = 0;
message->sendopts = 0;
message->filter_xport = 0;
message->inspect_xport = 0;
message->redirect_addr = 0;
@ -589,7 +593,7 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
&message->data_size, &message->data_offset,
&message->rcpt_unread, &message->rflags,
&message->cont_length,
&message->smtputf8)) >= 3) {
&message->sendopts)) >= 3) {
/* Postfix >= 1.0 (a.k.a. 20010228). */
if (message->data_offset <= 0 || message->data_size <= 0) {
msg_warn("%s: invalid size record: %.100s",
@ -603,6 +607,8 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
rec_type = REC_TYPE_ERROR;
break;
}
/* Forward compatibility. */
message->sendopts &= SOPT_FLAG_ALL;
} else if (count == 1) {
/* Postfix < 1.0 (a.k.a. 20010228). */
qmgr_message_oldstyle_scan(message);

View File

@ -79,6 +79,7 @@ qmqpd.o: ../../include/quote_flags.h
qmqpd.o: ../../include/rec_type.h
qmqpd.o: ../../include/recipient_list.h
qmqpd.o: ../../include/record.h
qmqpd.o: ../../include/sendopts.h
qmqpd.o: ../../include/smtputf8.h
qmqpd.o: ../../include/sys_defs.h
qmqpd.o: ../../include/vbuf.h

View File

@ -207,6 +207,7 @@ smtp_chat.o: ../../include/post_mail.h
smtp_chat.o: ../../include/recipient_list.h
smtp_chat.o: ../../include/resolve_clnt.h
smtp_chat.o: ../../include/scache.h
smtp_chat.o: ../../include/sendopts.h
smtp_chat.o: ../../include/smtp_stream.h
smtp_chat.o: ../../include/smtputf8.h
smtp_chat.o: ../../include/sock_addr.h
@ -439,6 +440,7 @@ smtp_proto.o: ../../include/recipient_list.h
smtp_proto.o: ../../include/record.h
smtp_proto.o: ../../include/resolve_clnt.h
smtp_proto.o: ../../include/scache.h
smtp_proto.o: ../../include/sendopts.h
smtp_proto.o: ../../include/smtp_stream.h
smtp_proto.o: ../../include/smtputf8.h
smtp_proto.o: ../../include/sock_addr.h

View File

@ -650,8 +650,8 @@ int smtp_helo(SMTP_STATE *state)
* non-SMTPUTF8 server? That could make life easier for mailing lists.
*/
#define DELIVERY_REQUIRES_SMTPUTF8 \
((request->smtputf8 & SMTPUTF8_FLAG_REQUESTED) \
&& (request->smtputf8 & ~SMTPUTF8_FLAG_REQUESTED))
((request->sendopts & SMTPUTF8_FLAG_REQUESTED) \
&& (request->sendopts & SMTPUTF8_FLAG_DERIVED))
/*
* Require that the server supports SMTPUTF8 when delivery requires
@ -1776,7 +1776,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
* the SMTPUTF8 promise that was made to the sender.
*/
if ((session->features & SMTP_FEATURE_SMTPUTF8) != 0
&& (request->smtputf8 & SMTPUTF8_FLAG_REQUESTED) != 0)
&& (request->sendopts & SMTPUTF8_FLAG_REQUESTED) != 0)
vstring_strcat(next_command, " SMTPUTF8");
/*
@ -1841,7 +1841,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
quote_822_local(session->scratch, rcpt->orig_addr);
vstring_sprintf(session->scratch2, "%s;%s",
/* Fix 20140707: sender must request SMTPUTF8. */
(request->smtputf8 != 0
((request->sendopts & SMTPUTF8_FLAG_ALL)
&& !allascii(vstring_str(session->scratch))) ?
"utf-8" : "rfc822",
vstring_str(session->scratch));

View File

@ -227,6 +227,7 @@ smtpd.o: ../../include/rec_type.h
smtpd.o: ../../include/recipient_list.h
smtpd.o: ../../include/record.h
smtpd.o: ../../include/resolve_clnt.h
smtpd.o: ../../include/sendopts.h
smtpd.o: ../../include/smtp_stream.h
smtpd.o: ../../include/smtputf8.h
smtpd.o: ../../include/sock_addr.h
@ -288,6 +289,7 @@ smtpd_chat.o: ../../include/nvtable.h
smtpd_chat.o: ../../include/post_mail.h
smtpd_chat.o: ../../include/rec_type.h
smtpd_chat.o: ../../include/record.h
smtpd_chat.o: ../../include/sendopts.h
smtpd_chat.o: ../../include/smtp_reply_footer.h
smtpd_chat.o: ../../include/smtp_stream.h
smtpd_chat.o: ../../include/smtputf8.h

View File

@ -84,6 +84,11 @@
typedef struct {
DICT dict; /* generic members */
struct cdb cdb; /* cdb structure */
VSTRING *val_buf; /* value result */
#ifdef TINYCDB_VERSION
VSTRING *key_buf; /* key result */
unsigned seq_cptr; /* current sequence pointer */
#endif
} DICT_CDBQ; /* query interface */
typedef struct {
@ -93,15 +98,31 @@ typedef struct {
char *tmp_path; /* temporary pathname (.tmp) */
} DICT_CDBM; /* rebuild interface */
/* dict_cdbq_getdata - get data out of the cdb using given buffer */
static const char *dict_cdbq_get_data(DICT_CDBQ *dict_cdbq,
VSTRING **bufp, unsigned len, unsigned pos)
{
VSTRING *buf = *bufp;
if (!buf)
buf = *bufp = vstring_alloc(len < 20 ? 20 : len);
VSTRING_RESET(buf);
VSTRING_SPACE(buf, len);
if (cdb_read(&dict_cdbq->cdb, vstring_str(buf), len, pos) < 0)
msg_fatal("error reading %s: %m", dict_cdbq->dict.name);
vstring_set_payload_size(buf, len);
VSTRING_TERMINATE(buf);
return vstring_str(buf);
}
/* dict_cdbq_lookup - find database entry, query mode */
static const char *dict_cdbq_lookup(DICT *dict, const char *name)
{
DICT_CDBQ *dict_cdbq = (DICT_CDBQ *) dict;
unsigned vlen;
int status = 0;
static char *buf;
static unsigned len;
const char *result = 0;
dict->error = 0;
@ -141,25 +162,56 @@ static const char *dict_cdbq_lookup(DICT *dict, const char *name)
msg_fatal("error reading %s: %m", dict->name);
if (status) {
vlen = cdb_datalen(&dict_cdbq->cdb);
if (len < vlen) {
if (buf == 0)
buf = mymalloc(vlen + 1);
else
buf = myrealloc(buf, vlen + 1);
len = vlen;
}
if (cdb_read(&dict_cdbq->cdb, buf, vlen,
cdb_datapos(&dict_cdbq->cdb)) < 0)
msg_fatal("error reading %s: %m", dict->name);
buf[vlen] = '\0';
result = buf;
result = dict_cdbq_get_data(dict_cdbq, &dict_cdbq->val_buf,
cdb_datalen(&dict_cdbq->cdb), cdb_datapos(&dict_cdbq->cdb));
}
/* No locking so not release the lock. */
return (result);
}
#ifdef TINYCDB_VERSION
/* dict_cdbq_sequence - traverse the dictionary */
static int dict_cdbq_sequence(DICT *dict, int function,
const char **key, const char **value)
{
const char *myname = "dict_cdbq_sequence";
DICT_CDBQ *dict_cdbq = (DICT_CDBQ *) dict;
int status;
switch (function) {
case DICT_SEQ_FUN_FIRST:
cdb_seqinit(&dict_cdbq->seq_cptr, &dict_cdbq->cdb);
break;
case DICT_SEQ_FUN_NEXT:
if (!dict_cdbq->seq_cptr)
msg_panic("%s: %s: no cursor", myname, dict_cdbq->dict.name);
break;
default:
msg_panic("%s: invalid function %d", myname, function);
}
status = cdb_seqnext(&dict_cdbq->seq_cptr, &dict_cdbq->cdb);
if (status < 0)
msg_fatal("error seeking %s: %m", dict_cdbq->dict.name);
if (!status) {
dict_cdbq->seq_cptr = 0;
return -1; /* not found */
}
*key = dict_cdbq_get_data(dict_cdbq, &dict_cdbq->key_buf,
cdb_keylen(&dict_cdbq->cdb), cdb_keypos(&dict_cdbq->cdb));
*value = dict_cdbq_get_data(dict_cdbq, &dict_cdbq->val_buf,
cdb_datalen(&dict_cdbq->cdb), cdb_datapos(&dict_cdbq->cdb));
return 0;
}
#endif /* TINYCDB_VERSION */
/* dict_cdbq_close - close data base, query mode */
static void dict_cdbq_close(DICT *dict)
@ -170,6 +222,12 @@ static void dict_cdbq_close(DICT *dict)
close(dict->stat_fd);
if (dict->fold_buf)
vstring_free(dict->fold_buf);
if (dict_cdbq->val_buf)
vstring_free(dict_cdbq->val_buf);
#ifdef TINYCDB_VERSION
if (dict_cdbq->key_buf)
vstring_free(dict_cdbq->key_buf);
#endif
dict_free(dict);
}
@ -200,9 +258,13 @@ static DICT *dict_cdbq_open(const char *path, int dict_flags)
dict_cdbq = (DICT_CDBQ *) dict_alloc(DICT_TYPE_CDB,
cdb_path, sizeof(*dict_cdbq));
dict_cdbq->val_buf = 0;
#if defined(TINYCDB_VERSION)
dict_cdbq->key_buf = 0;
dict_cdbq->seq_cptr = 0;
if (cdb_init(&(dict_cdbq->cdb), fd) != 0)
msg_fatal("dict_cdbq_open: unable to init %s: %m", cdb_path);
dict_cdbq->dict.sequence = dict_cdbq_sequence;
#else
cdb_init(&(dict_cdbq->cdb), fd);
#endif

View File

@ -74,6 +74,7 @@ verify.o: ../../include/mymalloc.h
verify.o: ../../include/nvtable.h
verify.o: ../../include/post_mail.h
verify.o: ../../include/recipient_list.h
verify.o: ../../include/sendopts.h
verify.o: ../../include/set_eugid.h
verify.o: ../../include/smtputf8.h
verify.o: ../../include/split_at.h