mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-01 06:35:27 +00:00
snapshot-19991216
This commit is contained in:
1
postfix/.indent.pro
vendored
1
postfix/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -3369,3 +3369,44 @@ Apologies for any names omitted.
|
|||||||
Bugfix: address rewriting would panic on a lone \ at the
|
Bugfix: address rewriting would panic on a lone \ at the
|
||||||
end of a line where an address was expected. Jason Hoos @
|
end of a line where an address was expected. Jason Hoos @
|
||||||
thwack.net. File: global/rewrite_clnt.c.
|
thwack.net. File: global/rewrite_clnt.c.
|
||||||
|
|
||||||
|
19991215
|
||||||
|
|
||||||
|
Bugfix: the strict RFC821 envelope address check should
|
||||||
|
not be applied to VRFY commands. File: smtpd/smtpd.c.
|
||||||
|
|
||||||
|
Cleanup: permit_recipient_maps is gone, because that could
|
||||||
|
only be used inside UCE restrictions.
|
||||||
|
|
||||||
|
19991216
|
||||||
|
|
||||||
|
Feature: allow an empty inet_interfaces parameter, just
|
||||||
|
like an empty mydestination parameter. It's needed for a
|
||||||
|
true null client that delivers no mail locally at all.
|
||||||
|
|
||||||
|
Feature: "disable_vrfy_command = yes" disables some forms
|
||||||
|
of address harvesting used by spammers.
|
||||||
|
|
||||||
|
Workaround: added the alias map parameter definition to
|
||||||
|
the smtpd code. This is a symptom of a general problem
|
||||||
|
with parameters that have non-empty default values: unless
|
||||||
|
a program explicitly defines such a parameter, the parameter
|
||||||
|
defaults to the empty string when used in other parameters.
|
||||||
|
There's also a problem with evaluation order.
|
||||||
|
|
||||||
|
Feature: the SMTP server rejects mail for unknown users in
|
||||||
|
virtual domains that are defined by Postfix virtual domain
|
||||||
|
files. File: smtpd/smtpd_check.c.
|
||||||
|
|
||||||
|
Feature: reject mail for unknown local users at the SMTP
|
||||||
|
port. The local_recipient_maps configuration parameter
|
||||||
|
specifies maps with all addresses that are local with
|
||||||
|
respect to $mydestination or $inet_interfaces. Example:
|
||||||
|
"local_recipient_maps = $alias_maps unix:passwd.byname".
|
||||||
|
This feature is disabled by default. You may have to copy
|
||||||
|
the passwd file into the chroot jail. File: smtpd/smtpd_check.c.
|
||||||
|
|
||||||
|
Feature: the sendmail -f option now understands '<user>'
|
||||||
|
and even understands address forms with RFC 822-style
|
||||||
|
comments.
|
||||||
|
|
||||||
|
@@ -108,7 +108,10 @@ directory of the source tree and type:
|
|||||||
To build with a non-default compiler, you need to specify the name
|
To build with a non-default compiler, you need to specify the name
|
||||||
of the compiler:
|
of the compiler:
|
||||||
|
|
||||||
% make makefiles CC=/opt/SUNWspro/bin/cc
|
% make makefiles CC=/opt/SUNWspro/bin/cc (Solaris)
|
||||||
|
% make
|
||||||
|
|
||||||
|
% make makefiles CC="/opt/ansic/bin/cc -Ae" (HP-UX)
|
||||||
% make
|
% make
|
||||||
|
|
||||||
% make makefiles CC="purify cc"
|
% make makefiles CC="purify cc"
|
||||||
|
@@ -199,7 +199,8 @@ test -d $COMMAND_DIRECTORY || mkdir -p $COMMAND_DIRECTORY || exit 1
|
|||||||
test -d $QUEUE_DIRECTORY || mkdir -p $QUEUE_DIRECTORY || exit 1
|
test -d $QUEUE_DIRECTORY || mkdir -p $QUEUE_DIRECTORY || exit 1
|
||||||
for path in $SENDMAIL_PATH $NEWALIASES_PATH $MAILQ_PATH
|
for path in $SENDMAIL_PATH $NEWALIASES_PATH $MAILQ_PATH
|
||||||
do
|
do
|
||||||
mkdir -p `echo $path|sed 's/[^/]*[/]*$//'`
|
dir=`echo $path|sed 's/[^/]*[/]*$//'`
|
||||||
|
test -d $dir || mkdir -p $dir || exit 1
|
||||||
done
|
done
|
||||||
|
|
||||||
# Install files. Be careful to not copy over running programs.
|
# Install files. Be careful to not copy over running programs.
|
||||||
@@ -285,7 +286,7 @@ no) ;;
|
|||||||
*) (
|
*) (
|
||||||
cd man || exit 1
|
cd man || exit 1
|
||||||
for dir in man?
|
for dir in man?
|
||||||
do mkdir -p $MANPAGES/$dir || exit 1
|
do test -d $MANPAGES/$dir || mkdir -p $MANPAGES/$dir || exit 1
|
||||||
done
|
done
|
||||||
for file in man?/*
|
for file in man?/*
|
||||||
do
|
do
|
||||||
|
@@ -17,7 +17,7 @@ makefiles Makefiles:
|
|||||||
|
|
||||||
update printfck:
|
update printfck:
|
||||||
set -e; for i in $(DIRS); do \
|
set -e; for i in $(DIRS); do \
|
||||||
(set -e; echo "[$$i]"; cd $$i; $(MAKE) $(OPTS) $@) || exit 1; \
|
(set -e; echo "[$$i]"; cd $$i; $(MAKE) $(OPTS) $@ MAKELEVEL=) || exit 1; \
|
||||||
done
|
done
|
||||||
|
|
||||||
printfck: update
|
printfck: update
|
||||||
|
@@ -1,6 +1,11 @@
|
|||||||
Incompatible changes with snapshot 19991211
|
Incompatible changes with snapshot 19991216
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
|
- The experimental permit_recipient_map feature is gone. It was
|
||||||
|
never part of an official release. It is replaced by a
|
||||||
|
"local_recipient_map" parameter that allows the SMTP server to
|
||||||
|
reject mail for unknown local users (see below).
|
||||||
|
|
||||||
- In an SMTPD access map, an all-numeric right-hand side now means
|
- In an SMTPD access map, an all-numeric right-hand side now means
|
||||||
OK. This is for better cooperation with out-of-band authentication
|
OK. This is for better cooperation with out-of-band authentication
|
||||||
mechanisms such as POP before SMTP etc.
|
mechanisms such as POP before SMTP etc.
|
||||||
@@ -13,8 +18,8 @@ reinstate the old behavior, specify "allow_min_user = yes" in
|
|||||||
main.cf.
|
main.cf.
|
||||||
|
|
||||||
- You can no longer use virtual, canonical or aliases tables as
|
- You can no longer use virtual, canonical or aliases tables as
|
||||||
SMTPD access control tables. Use the permit_recipient_map feature
|
SMTPD access control tables. Use the local_recipient_maps feature
|
||||||
instead. The loss is compensated for (see below).
|
instead.
|
||||||
|
|
||||||
- transport_maps entries override mydestination. For every
|
- transport_maps entries override mydestination. For every
|
||||||
$mydestination domain that matches a transport map entry, or a
|
$mydestination domain that matches a transport map entry, or a
|
||||||
@@ -22,13 +27,27 @@ parent domain of a transport map entry, you must now add a
|
|||||||
corresponding "domain.name local:" entry in your transport_maps.
|
corresponding "domain.name local:" entry in your transport_maps.
|
||||||
See the html/faq.html sections for firewalls and intranets.
|
See the html/faq.html sections for firewalls and intranets.
|
||||||
|
|
||||||
Major changes with snapshot 19991211
|
Major changes with snapshot 19991216
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
- Updated LDAP client code (John Hensley).
|
- Updated LDAP client code (John Hensley).
|
||||||
|
|
||||||
- Updated mysql client code (Scott Cotton).
|
- Updated mysql client code (Scott Cotton).
|
||||||
|
|
||||||
|
- The SMTP server now rejects mail for unknown users in virtual
|
||||||
|
domains that are defined by Postfix virtual maps.
|
||||||
|
|
||||||
|
- The SMTP server optionally rejects mail for unknown local users.
|
||||||
|
Use "local_recipient_maps = $alias_maps, unix:passwd.byname" if
|
||||||
|
your local mail is delivered by a UNIX-style local delivery agent.
|
||||||
|
See example in conf/main.cf.
|
||||||
|
|
||||||
|
- Use "disable_vrfy_command = yes" to disable the SMTP VRFY command.
|
||||||
|
This prevents some forms of address harvesting.
|
||||||
|
|
||||||
|
- The sendmail "-f" option now understands <user> and even understands
|
||||||
|
forms with RFC 822-style comments.
|
||||||
|
|
||||||
- New "qmgr_fudge_factor" parameter allows you to balance mailing
|
- New "qmgr_fudge_factor" parameter allows you to balance mailing
|
||||||
list performance against response time for one-to-one mail. The
|
list performance against response time for one-to-one mail. The
|
||||||
fudge factor controls what percentage of delivery resources Postfix
|
fudge factor controls what percentage of delivery resources Postfix
|
||||||
@@ -50,26 +69,12 @@ regardless of what main.cf specifies.
|
|||||||
|
|
||||||
- The Postfix SMTP server now understands a wider range of illegal
|
- The Postfix SMTP server now understands a wider range of illegal
|
||||||
address forms in MAIL FROM and RCPT TO commands. In order to disable
|
address forms in MAIL FROM and RCPT TO commands. In order to disable
|
||||||
those forms, specify "strict_rfc821_envelopes = yes".
|
illegal forms, specify "strict_rfc821_envelopes = yes". This also
|
||||||
|
disables support for MAIL FROM and RCPT TO addresses without <>.
|
||||||
|
|
||||||
- Per-client/helo/sender/recipient UCE restrictions (fully-recursive
|
- Per-client/helo/sender/recipient UCE restrictions (fully-recursive
|
||||||
UCE restriction parser). See the RESTRICTION_CLASS file for details.
|
UCE restriction parser). See the RESTRICTION_CLASS file for details.
|
||||||
|
|
||||||
- Block mail for most non-existent users at the SMTP port. Example:
|
|
||||||
a non-relaying host could use the following to reject mail for
|
|
||||||
non-existent local users and for all non-local destinations.
|
|
||||||
|
|
||||||
smtpd_recipient_restrictions =
|
|
||||||
reject_unknown_sender_domain
|
|
||||||
permit_recipient_map unix:passwd.byname
|
|
||||||
permit_recipient_map hash:/etc/postfix/canonical
|
|
||||||
permit_recipient_map hash:/etc/postfix/virtual
|
|
||||||
permit_recipient_map hash:/etc/aliases
|
|
||||||
reject
|
|
||||||
|
|
||||||
I haven't figured out yet how to use this easily on hosts that must
|
|
||||||
relay mail for other systems.
|
|
||||||
|
|
||||||
- Use "postmap -q key" or "postalias -q key" for testing Postfix
|
- Use "postmap -q key" or "postalias -q key" for testing Postfix
|
||||||
lookup tables or alias files.
|
lookup tables or alias files.
|
||||||
|
|
||||||
|
1
postfix/bounce/.indent.pro
vendored
1
postfix/bounce/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/cleanup/.indent.pro
vendored
1
postfix/cleanup/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -116,6 +116,21 @@ mail_owner = postfix
|
|||||||
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
|
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
|
||||||
# mail.$mydomain, www.$mydomain, ftp.$mydomain
|
# mail.$mydomain, www.$mydomain, ftp.$mydomain
|
||||||
|
|
||||||
|
# REJECTING UNKNOWN LOCAL USERS
|
||||||
|
#
|
||||||
|
# The local_recipient_maps parameter specifies optional lookup tables
|
||||||
|
# with all users that are local with respect to $mydestination and
|
||||||
|
# $inet_interfaces. If this parameter is defined, then the SMTP server
|
||||||
|
# will reject mail for unknown local users.
|
||||||
|
#
|
||||||
|
# The local_recipient_maps parameter accepts tables with bare usernames
|
||||||
|
# such as unix:passwd.byname and alias maps.
|
||||||
|
#
|
||||||
|
# Beware: if the Postfix SMTP server runs chrooted, you may have to
|
||||||
|
# copy the passwd database into the jail. This is system dependent.
|
||||||
|
#
|
||||||
|
#local_recipient_maps = $alias_maps unix:passwd.byname
|
||||||
|
|
||||||
# INTERNET VERSUS INTRANET
|
# INTERNET VERSUS INTRANET
|
||||||
#
|
#
|
||||||
# The relayhost parameter specifies the default host to send mail to
|
# The relayhost parameter specifies the default host to send mail to
|
||||||
|
@@ -8,6 +8,12 @@
|
|||||||
# MISCELLANEOUS
|
# MISCELLANEOUS
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# The disable_vrfy_command parameter allows you to disable the SMTP
|
||||||
|
# VRFY command. This stops some techniques used by spammers to harvest
|
||||||
|
# email addresses.
|
||||||
|
#
|
||||||
|
#disable_vrfy_command = no
|
||||||
|
|
||||||
# The smtpd_banner parameter specifies the text that follows the 220
|
# The smtpd_banner parameter specifies the text that follows the 220
|
||||||
# status code in the SMTP greeting banner. Some people like to see
|
# status code in the SMTP greeting banner. Some people like to see
|
||||||
# the mail version advertised. By default, Postfix shows no version.
|
# the mail version advertised. By default, Postfix shows no version.
|
||||||
@@ -208,9 +214,6 @@ smtpd_sender_restrictions =
|
|||||||
# reject_non_fqdn_hostname: reject HELO hostname that is not in FQDN form
|
# reject_non_fqdn_hostname: reject HELO hostname that is not in FQDN form
|
||||||
# reject_non_fqdn_sender: reject sender address that is not in FQDN form
|
# reject_non_fqdn_sender: reject sender address that is not in FQDN form
|
||||||
# reject_non_fqdn_recipient: reject recipient address that is not in FQDN form
|
# reject_non_fqdn_recipient: reject recipient address that is not in FQDN form
|
||||||
# permit_recipient_map maptype:mapname: permit if the recipient matches
|
|
||||||
# the table. Matching is as with virtual/canonical tables.
|
|
||||||
# You can also use unix:passwd.byname or alias maps.
|
|
||||||
# reject: reject the request. Place this at the end of a restriction.
|
# reject: reject the request. Place this at the end of a restriction.
|
||||||
# permit: permit the request. Place this at the end of a restriction.
|
# permit: permit the request. Place this at the end of a restriction.
|
||||||
#
|
#
|
||||||
|
1
postfix/dns/.indent.pro
vendored
1
postfix/dns/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/error/.indent.pro
vendored
1
postfix/error/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/fsstone/.indent.pro
vendored
1
postfix/fsstone/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/global/.indent.pro
vendored
1
postfix/global/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -261,7 +261,7 @@ void mail_params_init()
|
|||||||
VAR_COMMAND_DIR, DEF_COMMAND_DIR, &var_command_dir, 1, 0,
|
VAR_COMMAND_DIR, DEF_COMMAND_DIR, &var_command_dir, 1, 0,
|
||||||
VAR_QUEUE_DIR, DEF_QUEUE_DIR, &var_queue_dir, 1, 0,
|
VAR_QUEUE_DIR, DEF_QUEUE_DIR, &var_queue_dir, 1, 0,
|
||||||
VAR_PID_DIR, DEF_PID_DIR, &var_pid_dir, 1, 0,
|
VAR_PID_DIR, DEF_PID_DIR, &var_pid_dir, 1, 0,
|
||||||
VAR_INET_INTERFACES, DEF_INET_INTERFACES, &var_inet_interfaces, 1, 0,
|
VAR_INET_INTERFACES, DEF_INET_INTERFACES, &var_inet_interfaces, 0, 0,
|
||||||
VAR_DOUBLE_BOUNCE, DEF_DOUBLE_BOUNCE, &var_double_bounce_sender, 1, 0,
|
VAR_DOUBLE_BOUNCE, DEF_DOUBLE_BOUNCE, &var_double_bounce_sender, 1, 0,
|
||||||
VAR_DEFAULT_PRIVS, DEF_DEFAULT_PRIVS, &var_default_privs, 1, 0,
|
VAR_DEFAULT_PRIVS, DEF_DEFAULT_PRIVS, &var_default_privs, 1, 0,
|
||||||
VAR_ALIAS_DB_MAP, DEF_ALIAS_DB_MAP, &var_alias_db_map, 1, 0,
|
VAR_ALIAS_DB_MAP, DEF_ALIAS_DB_MAP, &var_alias_db_map, 1, 0,
|
||||||
|
@@ -222,6 +222,13 @@ extern char *var_always_bcc;
|
|||||||
#define DEF_STRICT_RFC821_ENV 0
|
#define DEF_STRICT_RFC821_ENV 0
|
||||||
extern bool var_strict_rfc821_env;
|
extern bool var_strict_rfc821_env;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standards violation: disable VRFY.
|
||||||
|
*/
|
||||||
|
#define VAR_DISABLE_VRFY_CMD "disable_vrfy_command"
|
||||||
|
#define DEF_DISABLE_VRFY_CMD 0
|
||||||
|
extern bool var_disable_vrfy_cmd;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* trivial rewrite/resolve service: mapping tables.
|
* trivial rewrite/resolve service: mapping tables.
|
||||||
*/
|
*/
|
||||||
@@ -819,7 +826,12 @@ extern int var_smtpd_delay_reject;
|
|||||||
|
|
||||||
#define REJECT_UNAUTH_PIPE "reject_unauth_pipelining"
|
#define REJECT_UNAUTH_PIPE "reject_unauth_pipelining"
|
||||||
|
|
||||||
#define PERMIT_RCPT_MAP "permit_recipient_map"
|
/*
|
||||||
|
* Heuristic to reject most unknown recipients at the SMTP port.
|
||||||
|
*/
|
||||||
|
#define VAR_LOCAL_RCPT_MAPS "local_recipient_maps"
|
||||||
|
#define DEF_LOCAL_RCPT_MAPS ""
|
||||||
|
extern char *var_local_rcpt_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Other.
|
* Other.
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* Version of this program.
|
* Version of this program.
|
||||||
*/
|
*/
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "Snapshot-19991211"
|
#define DEF_MAIL_VERSION "Snapshot-19991216"
|
||||||
extern char *var_mail_version;
|
extern char *var_mail_version;
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
|
1
postfix/local/.indent.pro
vendored
1
postfix/local/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/master/.indent.pro
vendored
1
postfix/master/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/pickup/.indent.pro
vendored
1
postfix/pickup/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/pipe/.indent.pro
vendored
1
postfix/pipe/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postalias/.indent.pro
vendored
1
postfix/postalias/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postcat/.indent.pro
vendored
1
postfix/postcat/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postconf/.indent.pro
vendored
1
postfix/postconf/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postdrop/.indent.pro
vendored
1
postfix/postdrop/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postfix/.indent.pro
vendored
1
postfix/postfix/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postkick/.indent.pro
vendored
1
postfix/postkick/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postlock/.indent.pro
vendored
1
postfix/postlock/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postlog/.indent.pro
vendored
1
postfix/postlog/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postmap/.indent.pro
vendored
1
postfix/postmap/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/postsuper/.indent.pro
vendored
1
postfix/postsuper/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/qmgr/.indent.pro
vendored
1
postfix/qmgr/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -487,9 +487,9 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
|
|||||||
/*
|
/*
|
||||||
* Bounce mail to non-existent users in virtual domains.
|
* Bounce mail to non-existent users in virtual domains.
|
||||||
*/
|
*/
|
||||||
if (!match_def_local_transport(STR(reply.transport))
|
if (qmgr_virtual != 0
|
||||||
&& qmgr_virtual != 0
|
&& (at = strrchr(recipient->address, '@')) != 0
|
||||||
&& (at = strrchr(recipient->address, '@')) != 0) {
|
&& !resolve_local(at + 1)) {
|
||||||
domain = lowercase(mystrdup(at + 1));
|
domain = lowercase(mystrdup(at + 1));
|
||||||
junk = maps_find(qmgr_virtual, domain, 0);
|
junk = maps_find(qmgr_virtual, domain, 0);
|
||||||
myfree(domain);
|
myfree(domain);
|
||||||
|
1
postfix/sendmail/.indent.pro
vendored
1
postfix/sendmail/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -311,6 +311,7 @@ static void enqueue(const char *sender, const char *full_name, char **recipients
|
|||||||
uid_t uid = getuid();
|
uid_t uid = getuid();
|
||||||
int status;
|
int status;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
int naddr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize.
|
* Initialize.
|
||||||
@@ -323,10 +324,20 @@ static void enqueue(const char *sender, const char *full_name, char **recipients
|
|||||||
* pickup would not be able to run chrooted, and it may not be desirable
|
* pickup would not be able to run chrooted, and it may not be desirable
|
||||||
* to use login names at all.
|
* to use login names at all.
|
||||||
*/
|
*/
|
||||||
if (sender == 0)
|
if (sender != 0) {
|
||||||
|
tree = tok822_parse(sender);
|
||||||
|
for (naddr = 0, tp = tree; tp != 0; tp = tp->next)
|
||||||
|
if (tp->type == TOK822_ADDR)
|
||||||
|
naddr++, tok822_internalize(buf, tp->head, TOK822_STR_DEFL);
|
||||||
|
tok822_free_tree(tree);
|
||||||
|
saved_sender = mystrdup(STR(buf));
|
||||||
|
if (naddr > 1)
|
||||||
|
msg_warn("-f option specified malformed sender: %s", sender);
|
||||||
|
} else {
|
||||||
if ((sender = username()) == 0)
|
if ((sender = username()) == 0)
|
||||||
msg_fatal("unable to find out your login name");
|
msg_fatal("unable to find out your login name");
|
||||||
saved_sender = mystrdup(sender);
|
saved_sender = mystrdup(sender);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open the queue file. Save the queue file name, so the run-time error
|
* Open the queue file. Save the queue file name, so the run-time error
|
||||||
|
1
postfix/showq/.indent.pro
vendored
1
postfix/showq/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/smtp/.indent.pro
vendored
1
postfix/smtp/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/smtpd/.indent.pro
vendored
1
postfix/smtpd/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
@@ -79,6 +79,10 @@
|
|||||||
/* Limit the number of \fBReceived:\fR message headers.
|
/* Limit the number of \fBReceived:\fR message headers.
|
||||||
/* .IP \fBnotify_classes\fR
|
/* .IP \fBnotify_classes\fR
|
||||||
/* List of error classes. Of special interest are:
|
/* List of error classes. Of special interest are:
|
||||||
|
/* .IP \fBlocal_recipient_maps\fR
|
||||||
|
/* List of maps with user names that are local to \fB$myorigin\fR
|
||||||
|
/* or \fB$inet_interfaces\fR. If this parameter is defined,
|
||||||
|
/* then the SMTP server rejects mail for unknown local users.
|
||||||
/* .RS
|
/* .RS
|
||||||
/* .IP \fBpolicy\fR
|
/* .IP \fBpolicy\fR
|
||||||
/* When a client violates any policy, mail a transcript of the
|
/* When a client violates any policy, mail a transcript of the
|
||||||
@@ -290,6 +294,12 @@ char *var_error_rcpt;
|
|||||||
int var_smtpd_delay_reject;
|
int var_smtpd_delay_reject;
|
||||||
char *var_rest_classes;
|
char *var_rest_classes;
|
||||||
int var_strict_rfc821_env;
|
int var_strict_rfc821_env;
|
||||||
|
bool var_disable_vrfy_cmd;
|
||||||
|
char *var_canonical_maps;
|
||||||
|
char *var_rcpt_canon_maps;
|
||||||
|
char *var_virtual_maps;
|
||||||
|
char *var_alias_maps;
|
||||||
|
char *var_local_rcpt_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global state, for stand-alone mode queue file cleanup. When this is
|
* Global state, for stand-alone mode queue file cleanup. When this is
|
||||||
@@ -442,7 +452,7 @@ static void mail_open_stream(SMTPD_STATE *state)
|
|||||||
/* extract_addr - extract address from rubble */
|
/* extract_addr - extract address from rubble */
|
||||||
|
|
||||||
static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
|
static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
|
||||||
int allow_empty_addr)
|
int allow_empty_addr, int strict_rfc821)
|
||||||
{
|
{
|
||||||
char *myname = "extract_addr";
|
char *myname = "extract_addr";
|
||||||
TOK822 *tree;
|
TOK822 *tree;
|
||||||
@@ -501,7 +511,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
|
|||||||
* Report trouble. Log a warning only if we are going to sleep+reject.
|
* Report trouble. Log a warning only if we are going to sleep+reject.
|
||||||
*/
|
*/
|
||||||
if (naddr != 1
|
if (naddr != 1
|
||||||
|| (var_strict_rfc821_env && (non_addr || *STR(arg->vstrval) != '<'))) {
|
|| (strict_rfc821 && (non_addr || *STR(arg->vstrval) != '<'))) {
|
||||||
msg_warn("Illegal address syntax from %s in %s command: %s",
|
msg_warn("Illegal address syntax from %s in %s command: %s",
|
||||||
state->namaddr, state->where, STR(arg->vstrval));
|
state->namaddr, state->where, STR(arg->vstrval));
|
||||||
err = "501 Bad address syntax";
|
err = "501 Bad address syntax";
|
||||||
@@ -562,7 +572,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
smtpd_chat_reply(state, "501 Bad address syntax");
|
smtpd_chat_reply(state, "501 Bad address syntax");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if ((err = extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR)) != 0) {
|
if ((err = extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "%s", err);
|
smtpd_chat_reply(state, "%s", err);
|
||||||
return (-1);
|
return (-1);
|
||||||
@@ -669,7 +679,7 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
smtpd_chat_reply(state, "501 Bad address syntax");
|
smtpd_chat_reply(state, "501 Bad address syntax");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if ((err = extract_addr(state, argv + 2, REJECT_EMPTY_ADDR)) != 0) {
|
if ((err = extract_addr(state, argv + 2, REJECT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "%s", err);
|
smtpd_chat_reply(state, "%s", err);
|
||||||
return (-1);
|
return (-1);
|
||||||
@@ -684,6 +694,10 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
smtpd_chat_reply(state, "%s", err);
|
smtpd_chat_reply(state, "%s", err);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if ((err = smtpd_check_rcptmap(state, argv[2].strval)) != 0) {
|
||||||
|
smtpd_chat_reply(state, "%s", err);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Store the recipient. Remember the first one.
|
* Store the recipient. Remember the first one.
|
||||||
@@ -929,6 +943,13 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
* stop doing recipient restriction checks and lose the opportunity to
|
* stop doing recipient restriction checks and lose the opportunity to
|
||||||
* say "user unknown" at the SMTP port.
|
* say "user unknown" at the SMTP port.
|
||||||
*/
|
*/
|
||||||
|
#define SLOPPY 0
|
||||||
|
|
||||||
|
if (var_disable_vrfy_cmd) {
|
||||||
|
state->error_mask |= MAIL_ERROR_POLICY;
|
||||||
|
smtpd_chat_reply(state, "502 VRFY command is disabled");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Syntax: VRFY address");
|
smtpd_chat_reply(state, "501 Syntax: VRFY address");
|
||||||
@@ -936,22 +957,21 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
}
|
}
|
||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
collapse_args(argc - 1, argv + 1);
|
collapse_args(argc - 1, argv + 1);
|
||||||
if ((err = extract_addr(state, argv + 1, REJECT_EMPTY_ADDR)) != 0) {
|
if ((err = extract_addr(state, argv + 1, REJECT_EMPTY_ADDR, SLOPPY)) != 0) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "%s", err);
|
smtpd_chat_reply(state, "%s", err);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (SMTPD_STAND_ALONE(state) == 0)
|
if (SMTPD_STAND_ALONE(state) == 0
|
||||||
err = smtpd_check_rcpt(state, argv[1].strval);
|
&& (err = smtpd_check_rcpt(state, argv[1].strval)) != 0) {
|
||||||
|
|
||||||
/*
|
|
||||||
* End untokenize.
|
|
||||||
*/
|
|
||||||
if (err != 0) {
|
|
||||||
smtpd_chat_reply(state, "%s", err);
|
smtpd_chat_reply(state, "%s", err);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
smtpd_chat_reply(state, "252 Send mail to find out");
|
if ((err = smtpd_check_rcptmap(state, argv[1].strval)) != 0) {
|
||||||
|
smtpd_chat_reply(state, "%s", err);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
smtpd_chat_reply(state, "250 <%s>", argv[1].strval);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1027,7 +1047,7 @@ static int quit_cmd(SMTPD_STATE *state, int unused_argc, SMTPD_TOKEN *unused_arg
|
|||||||
typedef struct SMTPD_CMD {
|
typedef struct SMTPD_CMD {
|
||||||
char *name;
|
char *name;
|
||||||
int (*action) (SMTPD_STATE *, int, SMTPD_TOKEN *);
|
int (*action) (SMTPD_STATE *, int, SMTPD_TOKEN *);
|
||||||
} SMTPD_CMD;
|
} SMTPD_CMD;
|
||||||
|
|
||||||
static SMTPD_CMD smtpd_cmd_table[] = {
|
static SMTPD_CMD smtpd_cmd_table[] = {
|
||||||
"HELO", helo_cmd,
|
"HELO", helo_cmd,
|
||||||
@@ -1304,6 +1324,7 @@ int main(int argc, char **argv)
|
|||||||
VAR_HELO_REQUIRED, DEF_HELO_REQUIRED, &var_helo_required,
|
VAR_HELO_REQUIRED, DEF_HELO_REQUIRED, &var_helo_required,
|
||||||
VAR_SMTPD_DELAY_REJECT, DEF_SMTPD_DELAY_REJECT, &var_smtpd_delay_reject,
|
VAR_SMTPD_DELAY_REJECT, DEF_SMTPD_DELAY_REJECT, &var_smtpd_delay_reject,
|
||||||
VAR_STRICT_RFC821_ENV, DEF_STRICT_RFC821_ENV, &var_strict_rfc821_env,
|
VAR_STRICT_RFC821_ENV, DEF_STRICT_RFC821_ENV, &var_strict_rfc821_env,
|
||||||
|
VAR_DISABLE_VRFY_CMD, DEF_DISABLE_VRFY_CMD, &var_disable_vrfy_cmd,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
static CONFIG_STR_TABLE str_table[] = {
|
static CONFIG_STR_TABLE str_table[] = {
|
||||||
@@ -1320,6 +1341,11 @@ int main(int argc, char **argv)
|
|||||||
VAR_ALWAYS_BCC, DEF_ALWAYS_BCC, &var_always_bcc, 0, 0,
|
VAR_ALWAYS_BCC, DEF_ALWAYS_BCC, &var_always_bcc, 0, 0,
|
||||||
VAR_ERROR_RCPT, DEF_ERROR_RCPT, &var_error_rcpt, 1, 0,
|
VAR_ERROR_RCPT, DEF_ERROR_RCPT, &var_error_rcpt, 1, 0,
|
||||||
VAR_REST_CLASSES, DEF_REST_CLASSES, &var_rest_classes, 0, 0,
|
VAR_REST_CLASSES, DEF_REST_CLASSES, &var_rest_classes, 0, 0,
|
||||||
|
VAR_LOCAL_RCPT_MAPS, DEF_LOCAL_RCPT_MAPS, &var_local_rcpt_maps, 0, 0,
|
||||||
|
VAR_CANONICAL_MAPS, DEF_CANONICAL_MAPS, &var_canonical_maps, 0, 0,
|
||||||
|
VAR_RCPT_CANON_MAPS, DEF_RCPT_CANON_MAPS, &var_rcpt_canon_maps, 0, 0,
|
||||||
|
VAR_VIRTUAL_MAPS, DEF_VIRTUAL_MAPS, &var_virtual_maps, 0, 0,
|
||||||
|
VAR_ALIAS_MAPS, DEF_ALIAS_MAPS, &var_alias_maps, 0, 0,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -138,10 +138,6 @@
|
|||||||
/* Allow the request when the local mail system is mail exchanger
|
/* Allow the request when the local mail system is mail exchanger
|
||||||
/* for the recipient domain (this includes the case where the local
|
/* for the recipient domain (this includes the case where the local
|
||||||
/* system is the final destination).
|
/* system is the final destination).
|
||||||
/* .IP permit_recipient_map maptype:mapname
|
|
||||||
/* Permit the request when the recipient address matches the named
|
|
||||||
/* table. Lookups are done in the same way as with virtual and
|
|
||||||
/* canonical maps.
|
|
||||||
/* .IP restriction_classes
|
/* .IP restriction_classes
|
||||||
/* Defines a list of parameter names, each parameter being a list
|
/* Defines a list of parameter names, each parameter being a list
|
||||||
/* of restrictions that can be used anywhere a restriction is legal.
|
/* of restrictions that can be used anywhere a restriction is legal.
|
||||||
@@ -302,24 +298,30 @@ static RESOLVE_REPLY reply;
|
|||||||
static VSTRING *query;
|
static VSTRING *query;
|
||||||
static VSTRING *error_text;
|
static VSTRING *error_text;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pre-opened SMTP recipient maps.
|
||||||
|
*/
|
||||||
|
static MAPS *local_rcpt_maps;
|
||||||
|
static MAPS *rcpt_canon_maps;
|
||||||
|
static MAPS *canonical_maps;
|
||||||
|
static MAPS *virtual_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pre-opened access control lists.
|
* Pre-opened access control lists.
|
||||||
*/
|
*/
|
||||||
static DOMAIN_LIST *relay_domains;
|
static DOMAIN_LIST *relay_domains;
|
||||||
static NAMADR_LIST *mynetworks;
|
static NAMADR_LIST *mynetworks;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pre-parsed restriction lists.
|
* Pre-parsed restriction lists.
|
||||||
*/
|
*/
|
||||||
static ARGV *client_restrctions;
|
static ARGV *client_restrctions;
|
||||||
static ARGV *helo_restrctions;
|
static ARGV *helo_restrctions;
|
||||||
static ARGV *mail_restrctions;
|
static ARGV *mail_restrctions;
|
||||||
static ARGV *rcpt_restrctions;
|
static ARGV *rcpt_restrctions;
|
||||||
static ARGV *etrn_restrctions;
|
static ARGV *etrn_restrctions;
|
||||||
|
|
||||||
static HTABLE *smtpd_rest_classes;
|
static HTABLE *smtpd_rest_classes;
|
||||||
|
|
||||||
static HTABLE *smtpd_rcpt_maps;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The routine that recursively applies restrictions.
|
* The routine that recursively applies restrictions.
|
||||||
@@ -383,6 +385,18 @@ void smtpd_check_init(void)
|
|||||||
mynetworks = namadr_list_init(var_mynetworks);
|
mynetworks = namadr_list_init(var_mynetworks);
|
||||||
relay_domains = domain_list_init(var_relay_domains);
|
relay_domains = domain_list_init(var_relay_domains);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pre-parse and pre-open the recipient maps.
|
||||||
|
*/
|
||||||
|
local_rcpt_maps = maps_create(VAR_LOCAL_RCPT_MAPS, var_local_rcpt_maps,
|
||||||
|
DICT_FLAG_LOCK);
|
||||||
|
rcpt_canon_maps = maps_create(VAR_RCPT_CANON_MAPS, var_rcpt_canon_maps,
|
||||||
|
DICT_FLAG_LOCK);
|
||||||
|
canonical_maps = maps_create(VAR_CANONICAL_MAPS, var_canonical_maps,
|
||||||
|
DICT_FLAG_LOCK);
|
||||||
|
virtual_maps = maps_create(VAR_VIRTUAL_MAPS, var_virtual_maps,
|
||||||
|
DICT_FLAG_LOCK);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reply is used as a cache for resolved addresses, and error_text is
|
* Reply is used as a cache for resolved addresses, and error_text is
|
||||||
* used for returning error responses.
|
* used for returning error responses.
|
||||||
@@ -424,16 +438,11 @@ void smtpd_check_init(void)
|
|||||||
htable_enter("check_relay_domains",
|
htable_enter("check_relay_domains",
|
||||||
smtpd_check_parse("permit_mydomain reject_unauth_destination"));
|
smtpd_check_parse("permit_mydomain reject_unauth_destination"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Other one-off initializations.
|
|
||||||
*/
|
|
||||||
smtpd_rcpt_maps = htable_create(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* smtpd_check_reject - do the boring things that must be done */
|
/* smtpd_check_reject - do the boring things that must be done */
|
||||||
|
|
||||||
static int smtpd_check_reject(SMTPD_STATE * state, int error_class,
|
static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
|
||||||
char *format,...)
|
char *format,...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -486,7 +495,7 @@ static int smtpd_check_reject(SMTPD_STATE * state, int error_class,
|
|||||||
|
|
||||||
/* reject_unknown_client - fail if client hostname is unknown */
|
/* reject_unknown_client - fail if client hostname is unknown */
|
||||||
|
|
||||||
static int reject_unknown_client(SMTPD_STATE * state)
|
static int reject_unknown_client(SMTPD_STATE *state)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unknown_client";
|
char *myname = "reject_unknown_client";
|
||||||
|
|
||||||
@@ -504,7 +513,7 @@ static int reject_unknown_client(SMTPD_STATE * state)
|
|||||||
|
|
||||||
/* permit_mynetworks - succeed if client is in a trusted network */
|
/* permit_mynetworks - succeed if client is in a trusted network */
|
||||||
|
|
||||||
static int permit_mynetworks(SMTPD_STATE * state)
|
static int permit_mynetworks(SMTPD_STATE *state)
|
||||||
{
|
{
|
||||||
char *myname = "permit_mynetworks";
|
char *myname = "permit_mynetworks";
|
||||||
|
|
||||||
@@ -537,7 +546,7 @@ static char *dup_if_truncate(char *name)
|
|||||||
|
|
||||||
/* reject_invalid_hostaddr - fail if host address is incorrect */
|
/* reject_invalid_hostaddr - fail if host address is incorrect */
|
||||||
|
|
||||||
static int reject_invalid_hostaddr(SMTPD_STATE * state, char *addr,
|
static int reject_invalid_hostaddr(SMTPD_STATE *state, char *addr,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_invalid_hostaddr";
|
char *myname = "reject_invalid_hostaddr";
|
||||||
@@ -574,7 +583,7 @@ static int reject_invalid_hostaddr(SMTPD_STATE * state, char *addr,
|
|||||||
|
|
||||||
/* reject_invalid_hostname - fail if host/domain syntax is incorrect */
|
/* reject_invalid_hostname - fail if host/domain syntax is incorrect */
|
||||||
|
|
||||||
static int reject_invalid_hostname(SMTPD_STATE * state, char *name,
|
static int reject_invalid_hostname(SMTPD_STATE *state, char *name,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_invalid_hostname";
|
char *myname = "reject_invalid_hostname";
|
||||||
@@ -610,7 +619,7 @@ static int reject_invalid_hostname(SMTPD_STATE * state, char *name,
|
|||||||
|
|
||||||
/* reject_non_fqdn_hostname - fail if host name is not in fqdn form */
|
/* reject_non_fqdn_hostname - fail if host name is not in fqdn form */
|
||||||
|
|
||||||
static int reject_non_fqdn_hostname(SMTPD_STATE * state, char *name,
|
static int reject_non_fqdn_hostname(SMTPD_STATE *state, char *name,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_non_fqdn_hostname";
|
char *myname = "reject_non_fqdn_hostname";
|
||||||
@@ -646,7 +655,7 @@ static int reject_non_fqdn_hostname(SMTPD_STATE * state, char *name,
|
|||||||
|
|
||||||
/* reject_unknown_hostname - fail if name has no A or MX record */
|
/* reject_unknown_hostname - fail if name has no A or MX record */
|
||||||
|
|
||||||
static int reject_unknown_hostname(SMTPD_STATE * state, char *name,
|
static int reject_unknown_hostname(SMTPD_STATE *state, char *name,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unknown_hostname";
|
char *myname = "reject_unknown_hostname";
|
||||||
@@ -668,7 +677,7 @@ static int reject_unknown_hostname(SMTPD_STATE * state, char *name,
|
|||||||
|
|
||||||
/* reject_unknown_mailhost - fail if name has no A or MX record */
|
/* reject_unknown_mailhost - fail if name has no A or MX record */
|
||||||
|
|
||||||
static int reject_unknown_mailhost(SMTPD_STATE * state, char *name,
|
static int reject_unknown_mailhost(SMTPD_STATE *state, char *name,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unknown_mailhost";
|
char *myname = "reject_unknown_mailhost";
|
||||||
@@ -690,7 +699,7 @@ static int reject_unknown_mailhost(SMTPD_STATE * state, char *name,
|
|||||||
|
|
||||||
/* check_relay_domains - OK/FAIL for message relaying */
|
/* check_relay_domains - OK/FAIL for message relaying */
|
||||||
|
|
||||||
static int check_relay_domains(SMTPD_STATE * state, char *recipient,
|
static int check_relay_domains(SMTPD_STATE *state, char *recipient,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "check_relay_domains";
|
char *myname = "check_relay_domains";
|
||||||
@@ -773,7 +782,7 @@ static int permit_auth_destination(char *recipient)
|
|||||||
|
|
||||||
/* reject_unauth_destination - FAIL for message relaying */
|
/* reject_unauth_destination - FAIL for message relaying */
|
||||||
|
|
||||||
static int reject_unauth_destination(SMTPD_STATE * state, char *recipient)
|
static int reject_unauth_destination(SMTPD_STATE *state, char *recipient)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unauth_destination";
|
char *myname = "reject_unauth_destination";
|
||||||
char *domain;
|
char *domain;
|
||||||
@@ -812,7 +821,7 @@ static int reject_unauth_destination(SMTPD_STATE * state, char *recipient)
|
|||||||
|
|
||||||
/* reject_unauth_pipelining - reject improper use of SMTP command pipelining */
|
/* reject_unauth_pipelining - reject improper use of SMTP command pipelining */
|
||||||
|
|
||||||
static int reject_unauth_pipelining(SMTPD_STATE * state)
|
static int reject_unauth_pipelining(SMTPD_STATE *state)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unauth_pipelining";
|
char *myname = "reject_unauth_pipelining";
|
||||||
|
|
||||||
@@ -872,7 +881,7 @@ static int has_my_addr(char *host)
|
|||||||
|
|
||||||
/* permit_mx_backup - permit use of me as MX backup for recipient domain */
|
/* permit_mx_backup - permit use of me as MX backup for recipient domain */
|
||||||
|
|
||||||
static int permit_mx_backup(SMTPD_STATE * unused_state, const char *recipient)
|
static int permit_mx_backup(SMTPD_STATE *unused_state, const char *recipient)
|
||||||
{
|
{
|
||||||
char *myname = "permit_mx_backup";
|
char *myname = "permit_mx_backup";
|
||||||
char *domain;
|
char *domain;
|
||||||
@@ -957,7 +966,7 @@ static int permit_mx_backup(SMTPD_STATE * unused_state, const char *recipient)
|
|||||||
|
|
||||||
/* reject_non_fqdn_address - fail if address is not in fqdn form */
|
/* reject_non_fqdn_address - fail if address is not in fqdn form */
|
||||||
|
|
||||||
static int reject_non_fqdn_address(SMTPD_STATE * state, char *addr,
|
static int reject_non_fqdn_address(SMTPD_STATE *state, char *addr,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_non_fqdn_address";
|
char *myname = "reject_non_fqdn_address";
|
||||||
@@ -1010,7 +1019,7 @@ static int reject_non_fqdn_address(SMTPD_STATE * state, char *addr,
|
|||||||
|
|
||||||
/* reject_unknown_address - fail if address does not resolve */
|
/* reject_unknown_address - fail if address does not resolve */
|
||||||
|
|
||||||
static int reject_unknown_address(SMTPD_STATE * state, char *addr,
|
static int reject_unknown_address(SMTPD_STATE *state, char *addr,
|
||||||
char *reply_name, char *reply_class)
|
char *reply_name, char *reply_class)
|
||||||
{
|
{
|
||||||
char *myname = "reject_unknown_address";
|
char *myname = "reject_unknown_address";
|
||||||
@@ -1043,70 +1052,16 @@ static int reject_unknown_address(SMTPD_STATE * state, char *addr,
|
|||||||
return (reject_unknown_mailhost(state, domain, reply_name, reply_class));
|
return (reject_unknown_mailhost(state, domain, reply_name, reply_class));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* permit_rcpt_map - permit if recipient address matches rewriting table */
|
|
||||||
|
|
||||||
static int permit_rcpt_map(char *table, char *reply_name)
|
|
||||||
{
|
|
||||||
char *myname = "permit_rcpt_map";
|
|
||||||
char *domain;
|
|
||||||
|
|
||||||
MAPS *map;
|
|
||||||
DICT *dict;
|
|
||||||
|
|
||||||
if (msg_verbose)
|
|
||||||
msg_info("%s: %s %s", myname, table, reply_name);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Resolve the address.
|
|
||||||
*/
|
|
||||||
canon_addr_internal(query, reply_name);
|
|
||||||
resolve_clnt_query(STR(query), &reply);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip non-DNS forms. Skip non-local numerical forms.
|
|
||||||
*/
|
|
||||||
if ((domain = strrchr(STR(reply.recipient), '@')) == 0)
|
|
||||||
return (SMTPD_CHECK_DUNNO);
|
|
||||||
domain += 1;
|
|
||||||
if (domain[0] == '#' || domain[0] == '[')
|
|
||||||
if (!match_any_local_transport(STR(reply.transport)))
|
|
||||||
return (SMTPD_CHECK_DUNNO);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Look up the name in the specified table, using the usual magic of
|
|
||||||
* canonical and virtual maps. Be sure this map was declared in a main.cf
|
|
||||||
* restriction or restriction class. The maps must be opened before the
|
|
||||||
* process enters a chroot jail.
|
|
||||||
*
|
|
||||||
* XXX What follows is a kludge to wrap up the recipient map in a form
|
|
||||||
* usable by mail_addr_find(). Perhaps we should have a mail_addr_find()
|
|
||||||
* interface that will search just one map instead of a list of maps.
|
|
||||||
*/
|
|
||||||
if ((map = (MAPS *) htable_find(smtpd_rcpt_maps, table)) == 0) {
|
|
||||||
if ((dict = dict_handle(table)) == 0)
|
|
||||||
msg_panic("%s: dictionary not found: %s", myname, table);
|
|
||||||
map = maps_create("rcpt_map", "", DICT_FLAG_LOCK);
|
|
||||||
maps_append(map, table, dict);
|
|
||||||
htable_enter(smtpd_rcpt_maps, table, (char *) map);
|
|
||||||
}
|
|
||||||
#define TOSS_THE_EXTENSION ((char **) 0)
|
|
||||||
|
|
||||||
if (mail_addr_find(map, STR(reply.recipient), TOSS_THE_EXTENSION) != 0)
|
|
||||||
return (SMTPD_CHECK_OK);
|
|
||||||
|
|
||||||
return (SMTPD_CHECK_DUNNO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check_table_result - translate table lookup result into pass/reject */
|
/* check_table_result - translate table lookup result into pass/reject */
|
||||||
|
|
||||||
static int check_table_result(SMTPD_STATE * state, char *table,
|
static int check_table_result(SMTPD_STATE *state, char *table,
|
||||||
const char *value, const char *datum,
|
const char *value, const char *datum,
|
||||||
char *reply_name, char *reply_class,
|
char *reply_name, char *reply_class,
|
||||||
char *def_acl)
|
char *def_acl)
|
||||||
{
|
{
|
||||||
char *myname = "check_table_result";
|
char *myname = "check_table_result";
|
||||||
int code;
|
int code;
|
||||||
ARGV *restrictions;
|
ARGV *restrictions;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
@@ -1189,7 +1144,7 @@ static int check_table_result(SMTPD_STATE * state, char *table,
|
|||||||
|
|
||||||
/* check_access - table lookup without substring magic */
|
/* check_access - table lookup without substring magic */
|
||||||
|
|
||||||
static int check_access(SMTPD_STATE * state, char *table, char *name, int flags,
|
static int check_access(SMTPD_STATE *state, char *table, char *name, int flags,
|
||||||
char *reply_name, char *reply_class, char *def_acl)
|
char *reply_name, char *reply_class, char *def_acl)
|
||||||
{
|
{
|
||||||
char *myname = "check_access";
|
char *myname = "check_access";
|
||||||
@@ -1219,7 +1174,7 @@ static int check_access(SMTPD_STATE * state, char *table, char *name, int flags,
|
|||||||
|
|
||||||
/* check_domain_access - domainname-based table lookup */
|
/* check_domain_access - domainname-based table lookup */
|
||||||
|
|
||||||
static int check_domain_access(SMTPD_STATE * state, char *table,
|
static int check_domain_access(SMTPD_STATE *state, char *table,
|
||||||
char *domain, int flags,
|
char *domain, int flags,
|
||||||
char *reply_name, char *reply_class,
|
char *reply_name, char *reply_class,
|
||||||
char *def_acl)
|
char *def_acl)
|
||||||
@@ -1259,7 +1214,7 @@ static int check_domain_access(SMTPD_STATE * state, char *table,
|
|||||||
|
|
||||||
/* check_addr_access - address-based table lookup */
|
/* check_addr_access - address-based table lookup */
|
||||||
|
|
||||||
static int check_addr_access(SMTPD_STATE * state, char *table,
|
static int check_addr_access(SMTPD_STATE *state, char *table,
|
||||||
char *address, int flags,
|
char *address, int flags,
|
||||||
char *reply_name, char *reply_class,
|
char *reply_name, char *reply_class,
|
||||||
char *def_acl)
|
char *def_acl)
|
||||||
@@ -1296,7 +1251,7 @@ static int check_addr_access(SMTPD_STATE * state, char *table,
|
|||||||
|
|
||||||
/* check_namadr_access - OK/FAIL based on host name/address lookup */
|
/* check_namadr_access - OK/FAIL based on host name/address lookup */
|
||||||
|
|
||||||
static int check_namadr_access(SMTPD_STATE * state, char *table,
|
static int check_namadr_access(SMTPD_STATE *state, char *table,
|
||||||
char *name, char *addr, int flags,
|
char *name, char *addr, int flags,
|
||||||
char *reply_name, char *reply_class,
|
char *reply_name, char *reply_class,
|
||||||
char *def_acl)
|
char *def_acl)
|
||||||
@@ -1332,7 +1287,7 @@ static int check_namadr_access(SMTPD_STATE * state, char *table,
|
|||||||
|
|
||||||
/* check_mail_access - OK/FAIL based on mail address lookup */
|
/* check_mail_access - OK/FAIL based on mail address lookup */
|
||||||
|
|
||||||
static int check_mail_access(SMTPD_STATE * state, char *table, char *addr,
|
static int check_mail_access(SMTPD_STATE *state, char *table, char *addr,
|
||||||
char *reply_name, char *reply_class,
|
char *reply_name, char *reply_class,
|
||||||
char *def_acl)
|
char *def_acl)
|
||||||
{
|
{
|
||||||
@@ -1392,7 +1347,7 @@ static int check_mail_access(SMTPD_STATE * state, char *table, char *addr,
|
|||||||
|
|
||||||
/* reject_maps_rbl - reject if client address in real-time blackhole list */
|
/* reject_maps_rbl - reject if client address in real-time blackhole list */
|
||||||
|
|
||||||
static int reject_maps_rbl(SMTPD_STATE * state)
|
static int reject_maps_rbl(SMTPD_STATE *state)
|
||||||
{
|
{
|
||||||
char *myname = "reject_maps_rbl";
|
char *myname = "reject_maps_rbl";
|
||||||
ARGV *octets = argv_split(state->addr, ".");
|
ARGV *octets = argv_split(state->addr, ".");
|
||||||
@@ -1488,7 +1443,7 @@ static int is_map_command(char *name, char *command, char ***argp)
|
|||||||
|
|
||||||
/* generic_checks - generic restrictions */
|
/* generic_checks - generic restrictions */
|
||||||
|
|
||||||
static int generic_checks(SMTPD_STATE * state, ARGV *restrictions,
|
static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
|
||||||
char *reply_name, char *reply_class, char *def_acl)
|
char *reply_name, char *reply_class, char *def_acl)
|
||||||
{
|
{
|
||||||
char *myname = "generic_checks";
|
char *myname = "generic_checks";
|
||||||
@@ -1646,9 +1601,6 @@ static int generic_checks(SMTPD_STATE * state, ARGV *restrictions,
|
|||||||
if (state->recipient)
|
if (state->recipient)
|
||||||
status = reject_non_fqdn_address(state, state->recipient,
|
status = reject_non_fqdn_address(state, state->recipient,
|
||||||
state->recipient, SMTPD_NAME_RECIPIENT);
|
state->recipient, SMTPD_NAME_RECIPIENT);
|
||||||
} else if (is_map_command(name, PERMIT_RCPT_MAP, &cpp)) {
|
|
||||||
if (state->recipient)
|
|
||||||
status = permit_rcpt_map(*cpp, state->recipient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1690,7 +1642,7 @@ static int generic_checks(SMTPD_STATE * state, ARGV *restrictions,
|
|||||||
|
|
||||||
/* smtpd_check_client - validate client name or address */
|
/* smtpd_check_client - validate client name or address */
|
||||||
|
|
||||||
char *smtpd_check_client(SMTPD_STATE * state)
|
char *smtpd_check_client(SMTPD_STATE *state)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
@@ -1714,7 +1666,7 @@ char *smtpd_check_client(SMTPD_STATE * state)
|
|||||||
|
|
||||||
/* smtpd_check_helo - validate HELO hostname */
|
/* smtpd_check_helo - validate HELO hostname */
|
||||||
|
|
||||||
char *smtpd_check_helo(SMTPD_STATE * state, char *helohost)
|
char *smtpd_check_helo(SMTPD_STATE *state, char *helohost)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
char *saved_helo;
|
char *saved_helo;
|
||||||
@@ -1760,7 +1712,7 @@ char *smtpd_check_helo(SMTPD_STATE * state, char *helohost)
|
|||||||
|
|
||||||
/* smtpd_check_mail - validate sender address, driver */
|
/* smtpd_check_mail - validate sender address, driver */
|
||||||
|
|
||||||
char *smtpd_check_mail(SMTPD_STATE * state, char *sender)
|
char *smtpd_check_mail(SMTPD_STATE *state, char *sender)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
char *saved_sender;
|
char *saved_sender;
|
||||||
@@ -1796,7 +1748,7 @@ char *smtpd_check_mail(SMTPD_STATE * state, char *sender)
|
|||||||
|
|
||||||
/* smtpd_check_rcpt - validate recipient address, driver */
|
/* smtpd_check_rcpt - validate recipient address, driver */
|
||||||
|
|
||||||
char *smtpd_check_rcpt(SMTPD_STATE * state, char *recipient)
|
char *smtpd_check_rcpt(SMTPD_STATE *state, char *recipient)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
char *saved_recipient;
|
char *saved_recipient;
|
||||||
@@ -1842,7 +1794,7 @@ char *smtpd_check_rcpt(SMTPD_STATE * state, char *recipient)
|
|||||||
|
|
||||||
/* smtpd_check_etrn - validate ETRN request */
|
/* smtpd_check_etrn - validate ETRN request */
|
||||||
|
|
||||||
char *smtpd_check_etrn(SMTPD_STATE * state, char *domain)
|
char *smtpd_check_etrn(SMTPD_STATE *state, char *domain)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
char *saved_etrn_name;
|
char *saved_etrn_name;
|
||||||
@@ -1885,9 +1837,78 @@ char *smtpd_check_etrn(SMTPD_STATE * state, char *domain)
|
|||||||
SMTPD_CHECK_ETRN_RETURN(status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
|
SMTPD_CHECK_ETRN_RETURN(status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* smtpd_check_rcptmap - permit if recipient address matches lookup table */
|
||||||
|
|
||||||
|
char *smtpd_check_rcptmap(SMTPD_STATE *state, char *recipient)
|
||||||
|
{
|
||||||
|
char *myname = "smtpd_check_rcptmap";
|
||||||
|
char *saved_recipient;
|
||||||
|
char *domain;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX This module does a lot of unnecessary guessing. The SMTP server
|
||||||
|
* (and presumably, pickup daemon) should run the envelopes through a
|
||||||
|
* rewriting service that does all the canonical and virtual mapping.
|
||||||
|
*/
|
||||||
|
if (msg_verbose)
|
||||||
|
msg_info("%s: %s", myname, recipient);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Minor kluge so that we can delegate work to the generic routine and so
|
||||||
|
* that we can syslog the recipient with the reject messages.
|
||||||
|
*/
|
||||||
|
SMTPD_CHECK_PUSH(saved_recipient, state->recipient, recipient);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Resolve the address.
|
||||||
|
*/
|
||||||
|
canon_addr_internal(query, recipient);
|
||||||
|
resolve_clnt_query(STR(query), &reply);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Skip non-DNS forms. Skip non-local numerical forms.
|
||||||
|
*/
|
||||||
|
if ((domain = strrchr(STR(reply.recipient), '@')) == 0)
|
||||||
|
SMTPD_CHECK_RCPT_RETURN(0);
|
||||||
|
domain += 1;
|
||||||
|
if (domain[0] == '#' || domain[0] == '[')
|
||||||
|
if (!resolve_local(domain))
|
||||||
|
SMTPD_CHECK_RCPT_RETURN(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reject mail to unknown addresses in domains that match $mydestination
|
||||||
|
* or $inet_interfaces (Postfix local). Reject mail to unknown addresses
|
||||||
|
* in Postfix virtual domains (Postfix virtual). Accept mail to other
|
||||||
|
* domains. Toss any extension information found by the lookup routines.
|
||||||
|
*/
|
||||||
|
#define NOP ((char **) 0)
|
||||||
|
|
||||||
|
if (resolve_local(domain)) {
|
||||||
|
if (*var_local_rcpt_maps
|
||||||
|
&& !mail_addr_find(rcpt_canon_maps, STR(reply.recipient), NOP)
|
||||||
|
&& !mail_addr_find(canonical_maps, STR(reply.recipient), NOP)
|
||||||
|
&& !mail_addr_find(local_rcpt_maps, STR(reply.recipient), NOP)) {
|
||||||
|
(void) smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
|
||||||
|
"550 <%s>: User unknown", recipient);
|
||||||
|
SMTPD_CHECK_RCPT_RETURN(STR(error_text));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (*var_virtual_maps
|
||||||
|
&& !mail_addr_find(rcpt_canon_maps, STR(reply.recipient), NOP)
|
||||||
|
&& !mail_addr_find(canonical_maps, STR(reply.recipient), NOP)
|
||||||
|
&& !mail_addr_find(virtual_maps, STR(reply.recipient), NOP)
|
||||||
|
&& maps_find(virtual_maps, domain, 0)) {
|
||||||
|
(void) smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
|
||||||
|
"550 <%s>: User unknown", recipient);
|
||||||
|
SMTPD_CHECK_RCPT_RETURN(STR(error_text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SMTPD_CHECK_RCPT_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
/* smtpd_check_size - check optional SIZE parameter value */
|
/* smtpd_check_size - check optional SIZE parameter value */
|
||||||
|
|
||||||
char *smtpd_check_size(SMTPD_STATE * state, off_t size)
|
char *smtpd_check_size(SMTPD_STATE *state, off_t size)
|
||||||
{
|
{
|
||||||
char *myname = "smtpd_check_size";
|
char *myname = "smtpd_check_size";
|
||||||
struct fsspace fsbuf;
|
struct fsspace fsbuf;
|
||||||
@@ -1963,7 +1984,7 @@ typedef struct {
|
|||||||
char *name;
|
char *name;
|
||||||
char *defval;
|
char *defval;
|
||||||
char **target;
|
char **target;
|
||||||
} STRING_TABLE;
|
} STRING_TABLE;
|
||||||
|
|
||||||
static STRING_TABLE string_table[] = {
|
static STRING_TABLE string_table[] = {
|
||||||
VAR_MAPS_RBL_DOMAINS, DEF_MAPS_RBL_DOMAINS, &var_maps_rbl_domains,
|
VAR_MAPS_RBL_DOMAINS, DEF_MAPS_RBL_DOMAINS, &var_maps_rbl_domains,
|
||||||
@@ -2008,7 +2029,7 @@ typedef struct {
|
|||||||
char *name;
|
char *name;
|
||||||
int defval;
|
int defval;
|
||||||
int *target;
|
int *target;
|
||||||
} INT_TABLE;
|
} INT_TABLE;
|
||||||
|
|
||||||
int var_unk_client_code;
|
int var_unk_client_code;
|
||||||
int var_bad_name_code;
|
int var_bad_name_code;
|
||||||
@@ -2118,7 +2139,7 @@ static void rest_class(char *class)
|
|||||||
|
|
||||||
/* resolve_clnt_init - initialize reply */
|
/* resolve_clnt_init - initialize reply */
|
||||||
|
|
||||||
void resolve_clnt_init(RESOLVE_REPLY * reply)
|
void resolve_clnt_init(RESOLVE_REPLY *reply)
|
||||||
{
|
{
|
||||||
reply->transport = vstring_alloc(100);
|
reply->transport = vstring_alloc(100);
|
||||||
reply->nexthop = vstring_alloc(100);
|
reply->nexthop = vstring_alloc(100);
|
||||||
@@ -2127,7 +2148,7 @@ void resolve_clnt_init(RESOLVE_REPLY * reply)
|
|||||||
|
|
||||||
/* canon_addr_internal - stub */
|
/* canon_addr_internal - stub */
|
||||||
|
|
||||||
VSTRING *canon_addr_internal(VSTRING * result, const char *addr)
|
VSTRING *canon_addr_internal(VSTRING *result, const char *addr)
|
||||||
{
|
{
|
||||||
if (addr == STR(result))
|
if (addr == STR(result))
|
||||||
msg_panic("canon_addr_internal: result clobbers input");
|
msg_panic("canon_addr_internal: result clobbers input");
|
||||||
@@ -2138,7 +2159,7 @@ VSTRING *canon_addr_internal(VSTRING * result, const char *addr)
|
|||||||
|
|
||||||
/* resolve_clnt_query - stub */
|
/* resolve_clnt_query - stub */
|
||||||
|
|
||||||
void resolve_clnt_query(const char *addr, RESOLVE_REPLY * reply)
|
void resolve_clnt_query(const char *addr, RESOLVE_REPLY *reply)
|
||||||
{
|
{
|
||||||
if (addr == STR(reply->recipient))
|
if (addr == STR(reply->recipient))
|
||||||
msg_panic("resolve_clnt_query: result clobbers input");
|
msg_panic("resolve_clnt_query: result clobbers input");
|
||||||
@@ -2151,7 +2172,7 @@ void resolve_clnt_query(const char *addr, RESOLVE_REPLY * reply)
|
|||||||
|
|
||||||
/* smtpd_chat_reset - stub */
|
/* smtpd_chat_reset - stub */
|
||||||
|
|
||||||
void smtpd_chat_reset(SMTPD_STATE * unused_state)
|
void smtpd_chat_reset(SMTPD_STATE *unused_state)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@ extern void smtpd_check_init(void);
|
|||||||
extern char *smtpd_check_client(SMTPD_STATE *);
|
extern char *smtpd_check_client(SMTPD_STATE *);
|
||||||
extern char *smtpd_check_helo(SMTPD_STATE *, char *);
|
extern char *smtpd_check_helo(SMTPD_STATE *, char *);
|
||||||
extern char *smtpd_check_mail(SMTPD_STATE *, char *);
|
extern char *smtpd_check_mail(SMTPD_STATE *, char *);
|
||||||
|
extern char *smtpd_check_rcptmap(SMTPD_STATE *, char *);
|
||||||
extern char *smtpd_check_size(SMTPD_STATE *, off_t);
|
extern char *smtpd_check_size(SMTPD_STATE *, off_t);
|
||||||
extern char *smtpd_check_rcpt(SMTPD_STATE *, char *);
|
extern char *smtpd_check_rcpt(SMTPD_STATE *, char *);
|
||||||
extern char *smtpd_check_etrn(SMTPD_STATE *, char *);
|
extern char *smtpd_check_etrn(SMTPD_STATE *, char *);
|
||||||
|
1
postfix/smtpstone/.indent.pro
vendored
1
postfix/smtpstone/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/trivial-rewrite/.indent.pro
vendored
1
postfix/trivial-rewrite/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
1
postfix/util/.indent.pro
vendored
1
postfix/util/.indent.pro
vendored
@@ -87,6 +87,7 @@
|
|||||||
-TSINGLE_SERVER
|
-TSINGLE_SERVER
|
||||||
-TSINK_COMMAND
|
-TSINK_COMMAND
|
||||||
-TSINK_STATE
|
-TSINK_STATE
|
||||||
|
-TSMTPD_CMD
|
||||||
-TSMTPD_STATE
|
-TSMTPD_STATE
|
||||||
-TSMTPD_TOKEN
|
-TSMTPD_TOKEN
|
||||||
-TSMTP_ADDR
|
-TSMTP_ADDR
|
||||||
|
Reference in New Issue
Block a user