1124 #include <sys/socket.h>
1125 #include <sys/stat.h>
1126 #include <netinet/in.h>
1127 #include <arpa/inet.h>
1138 #ifdef STRCASECMP_IN_STRINGS_H
1139 #include <strings.h>
1422 #define STR(x) vstring_str(x)
1423 #define LEN(x) VSTRING_LEN(x)
1428 static MAPS *ehlo_discard_maps;
1433 static MAPS *smtpd_milter_maps;
1440 #define VERP_CMD "XVERP"
1441 #define VERP_CMD_LEN 5
1450 static int xclient_allowed;
1456 static int xforward_allowed;
1485 #define NEUTER_CHARACTERS " <>()\\\";@"
1490 #define REASON_TIMEOUT "timeout"
1491 #define REASON_LOST_CONNECTION "lost connection"
1492 #define REASON_ERROR_LIMIT "too many errors"
1499 static TLS_APPL_STATE *smtpd_tls_ctx;
1500 static int ask_client_cert;
1507 static DICT *smtpd_cmd_filter;
1509 #ifdef USE_SASL_AUTH
1518 static int sasl_client_exception(
SMTPD_STATE *state)
1527 if (sasl_exceptions_networks == 0)
1532 match = sasl_exceptions_networks->error;
1535 msg_info(
"sasl_exceptions: %s, match=%d",
1545 static const char *smtpd_whatsup(
SMTPD_STATE *state)
1561 #ifdef USE_SASL_AUTH
1562 if (state->sasl_username)
1564 state->sasl_username);
1571 static void collapse_args(
int argc,
SMTPD_TOKEN *argv)
1575 for (i = 1; i < argc; i++) {
1584 static const char *check_milter_reply(
SMTPD_STATE *state,
const char *reply)
1597 #define MILTER_SKIP_FLAGS (CLEANUP_FLAG_DISCARD)
1602 action =
"milter-hold";
1604 text =
"milter triggers HOLD action";
1608 action =
"milter-discard";
1610 text =
"milter triggers DISCARD action";
1614 action =
"milter-reject";
1615 reply =
"421 4.7.0 Server closing connection";
1621 action =
"milter-reject";
1627 reply =
"421 4.3.5 Server configuration error";
1631 msg_info(
"%s: %s: %s from %s: %s;%s", queue_id, action, state->
where,
1632 state->
namaddr, reply ? reply : text, smtpd_whatsup(state));
1653 collapse_args(argc - 1, argv + 1);
1667 #define PUSH_STRING(old, curr, new) { char *old = (curr); (curr) = (new);
1668 #define POP_STRING(old, curr) (curr) = old; }
1675 err = check_milter_reply(state, err);
1677 if (err != 0 && strncmp(err,
"421", 3) == 0) {
1703 msg_warn(
"don't know if EHLO feature %s should be announced to %s",
1712 msg_warn(
"don't know if command %s should be allowed from %s",
1740 collapse_args(argc - 1, argv + 1);
1760 err = check_milter_reply(state, err);
1762 if (err != 0 && strncmp(err,
"421", 3) == 0) {
1794 #define EHLO_APPEND(state, cmd) \
1796 vstring_sprintf((state)->ehlo_buf, (cmd)); \
1797 argv_add((state)->ehlo_argv, STR((state)->ehlo_buf), (char *) 0); \
1800 #define EHLO_APPEND1(state, cmd, arg) \
1802 vstring_sprintf((state)->ehlo_buf, (cmd), (arg)); \
1803 argv_add((state)->ehlo_argv, STR((state)->ehlo_buf), (char *) 0); \
1814 if (err != 0 && err[0] ==
'5')
1819 if (ehlo_discard_maps && ehlo_discard_maps->
error) {
1820 msg_warn(
"don't know what EHLO features to announce to %s",
1854 #ifdef USE_SASL_AUTH
1856 #define AUTH_CMD "AUTH"
1860 EHLO_APPEND1(state,
"AUTH %s", state->sasl_mechanism_list);
1862 EHLO_APPEND1(state,
"AUTH=%s", state->sasl_mechanism_list);
1863 }
else if (sasl_exceptions_networks && sasl_exceptions_networks->error)
1864 cant_announce_feature(state, AUTH_CMD);
1866 #define XCLIENT_LOGIN_KLUDGE " " XCLIENT_LOGIN
1868 #define XCLIENT_LOGIN_KLUDGE ""
1873 else if (verp_clients && verp_clients->error)
1874 cant_announce_feature(state,
VERP_CMD);
1878 if (xclient_allowed)
1886 else if (xclient_hosts && xclient_hosts->error)
1890 if (xforward_allowed)
1896 else if (xforward_hosts && xforward_hosts->error)
1899 if ((discard_mask & EHLO_MASK_ENHANCEDSTATUSCODES) == 0)
1945 #ifdef USE_SASL_AUTH
1949 static int smtpd_sasl_auth_cmd_wrapper(
SMTPD_STATE *state,
int argc,
1963 msg_warn(
"AUTH command rate limit exceeded: %d from %s for service %s",
1966 "450 4.7.1 Error: too many AUTH commands from %s",
2023 if (state->
dest == 0
2027 msg_fatal(
"unable to connect to the %s %s service",
2036 char *postdrop_command;
2041 if (state->
dest == 0)
2042 msg_fatal(
"unable to execute %s", postdrop_command);
2043 myfree(postdrop_command);
2077 #ifdef USE_SASL_AUTH
2079 if (state->sasl_method)
2082 if (state->sasl_username)
2085 if (state->sasl_sender)
2190 #define PRINT_OR_NULL(cond, str) \
2191 ((cond) ? (str) : "")
2192 #define PRINT2_OR_NULL(cond, name, value) \
2193 PRINT_OR_NULL((cond), (name)), PRINT_OR_NULL((cond), (value))
2195 msg_info(
"%s: client=%s%s%s%s%s%s%s%s%s%s%s",
2198 #ifdef USE_SASL_AUTH
2200 ", sasl_method=", state->sasl_method),
2202 ", sasl_username=", state->sasl_username),
2204 ", sasl_sender=", state->sasl_sender),
2206 "",
"",
"",
"",
"",
"",
2219 int allow_empty_addr,
int strict_rfc821,
2222 const char *myname =
"extract_addr";
2236 #define PERMIT_EMPTY_ADDR 1
2237 #define REJECT_EMPTY_ADDR 0
2262 if (*text ==
'@' && (colon = strchr(text,
':')) != 0)
2272 for (naddr = non_addr = 0, tp = tree; tp != 0; tp = tp->
next) {
2276 }
else if (tp->
type ==
'<' || tp->
type ==
'>') {
2292 || (strict_rfc821 && (non_addr || *
STR(arg->
vstrval) !=
'<'))) {
2293 msg_warn(
"Illegal address syntax from %s in %s command: %s",
2316 if ((
STR(state->
addr_buf)[0] == 0 && !allow_empty_addr)
2317 || (strict_rfc821 &&
STR(state->
addr_buf)[0] ==
'@')
2322 msg_warn(
"Illegal address syntax from %s in %s command: %s",
2343 ssize_t len = argc + 1;
2349 sizeof(
const char *) * len);
2352 mymalloc(
sizeof(
const char *) * len);
2355 for (n = 0; n < argc; n++)
2368 char *verp_delims = 0;
2395 ||
strcasecmp(argv[1].strval,
"from:") != 0) {
2417 msg_warn(
"Message delivery request rate limit exceeded: %d from %s for service %s",
2434 for (narg = 3; narg < argc; narg++) {
2450 for (narg = 3; narg < argc; narg++) {
2454 }
else if (
strcasecmp(arg,
"BODY=7BIT") == 0) {
2466 smtpd_chat_reply(state,
"552 5.3.4 Message size exceeds file system imposed limit");
2473 #ifdef USE_SASL_AUTH
2490 "501 5.5.4 Error: %s needs two characters from %s",
2506 "501 5.5.4 Bad RET parameter syntax");
2538 if (verp_delims &&
STR(state->
addr_buf)[0] == 0) {
2544 const char *verify_sender;
2555 if (verify_sender != 0)
2570 milter_argv(state, argc - 2, argv + 2));
2573 err = check_milter_reply(state, err);
2603 "send unicode address");
2613 msg_info(
"using backwards-compatible default setting "
2710 state->saved_delay = 0;
2712 #ifdef USE_SASL_AUTH
2713 if (state->sasl_sender)
2746 const char *dsn_orcpt_addr = 0;
2747 ssize_t dsn_orcpt_addr_len = 0;
2748 const char *dsn_orcpt_type = 0;
2750 const char *coded_addr;
2751 const char *milter_err;
2788 msg_warn(
"Recipient address rate limit exceeded: %d from %s for service %s",
2805 for (narg = 3; narg < argc; narg++) {
2817 "501 5.5.4 Error: Bad NOTIFY parameter syntax");
2831 || (
strcasecmp(dsn_orcpt_type,
"utf-8") == 0 ?
2836 "501 5.5.4 Error: Bad ORCPT parameter syntax");
2865 "send unicode address");
2875 msg_info(
"using backwards-compatible default setting "
2881 const char *verify_sender;
2892 if (verify_sender != 0) {
2905 milter_argv(state, argc - 2, argv + 2));
2906 if (err == 0 && milter_err != 0) {
2908 err = check_milter_reply(state, milter_err);
2922 if (state->
proxy == 0 && state->
cleanup == 0 && mail_open_stream(state) < 0)
2930 proxy = state->
proxy;
2982 if (dsn_orcpt_addr == 0) {
2983 dsn_orcpt_type =
"rfc822";
2984 dsn_orcpt_addr = argv[2].
strval;
2985 dsn_orcpt_addr_len = strlen(argv[2].strval);
2986 if (dsn_orcpt_addr[0] ==
'<'
2987 && dsn_orcpt_addr[dsn_orcpt_addr_len - 1] ==
'>') {
2988 dsn_orcpt_addr += 1;
2989 dsn_orcpt_addr_len -= 2;
2997 (
int) dsn_orcpt_addr_len, dsn_orcpt_addr);
3022 static VSTRING *rfc2047_comment_encode(
const char *str,
const char *charset)
3025 const unsigned char *cp;
3050 #define ESPECIALS "()<>@,;:\"/[]?.="
3051 #define QSPECIALS "_" ESPECIALS
3052 #define CSPECIALS "\\\"()"
3055 for (cp = (
unsigned char *) str; ; ++cp) {
3056 if ((ch = *cp) == 0) {
3060 if (!
ISPRINT(ch) || strchr(CSPECIALS, ch))
3068 for (cp = (
unsigned char *) str; (ch = *cp) != 0; ++cp) {
3069 if (!
ISPRINT(ch) || strchr(QSPECIALS CSPECIALS, ch)) {
3071 }
else if (ch ==
' ') {
3085 static void comment_sanitize(
VSTRING *comment_string)
3099 for (pc = 0, cp = (
unsigned char *)
STR(comment_string); (ch = *cp) != 0; cp++) {
3102 }
else if (ch ==
'(') {
3104 }
else if (ch ==
')') {
3135 const char *rfc3848_sess;
3136 const char *rfc3848_auth;
3145 #ifdef USE_SASL_AUTH
3176 && (err = check_milter_reply(state, err)) != 0) {
3180 proxy = state->
proxy;
3193 out_stream = proxy->
stream;
3239 "Received: from %s (%s [%s])",
3243 #define VSTRING_STRDUP(s) vstring_strcpy(vstring_alloc(strlen(s) + 1), (s))
3248 "\t(using %s with cipher %s (%d/%d bits))",
3250 state->tls_context->cipher_name,
3251 state->tls_context->cipher_usebits,
3252 state->tls_context->cipher_algbits);
3253 if (TLS_CERT_IS_PRESENT(state->tls_context)) {
3255 comment_sanitize(peer_CN);
3257 state->tls_context->issuer_CN :
"");
3258 comment_sanitize(issuer_CN);
3260 "\t(Client CN \"%s\", Issuer \"%s\" (%s))",
3261 STR(peer_CN),
STR(issuer_CN),
3262 TLS_CERT_IS_TRUSTED(state->tls_context) ?
3263 "verified OK" :
"not verified");
3268 "\t(Client did not present a certificate)");
3271 "\t(No client certificate requested)");
3274 if (state->tls_context != 0
3280 #ifdef USE_SASL_AUTH
3289 if (state->sasl_username
3297 state->
cleanup ?
"\tby %s (%s) with %s%s%s id %s" :
3298 "\tby %s (%s) with %s%s%s",
3300 with_protocol, rfc3848_sess,
3308 state->
cleanup ?
"\tby %s (%s) with %s%s%s id %s;" :
3309 "\tby %s (%s) with %s%s%s;",
3311 with_protocol, rfc3848_sess,
3316 #ifdef RECEIVED_ENVELOPE_FROM
3319 "\t(envelope-from %s)",
STR(state->
buffer));
3337 for (prev_rec_type = 0; ; prev_rec_type = curr_rec_type) {
3346 if (strncmp(start + strspn(start,
">"),
"From ", 5) == 0) {
3347 out_fprintf(out_stream, curr_rec_type,
3348 "X-Mailbox-Line: %s", start);
3356 && (proxy == 0 ? (++start, --len) == 0 : len == 1))
3361 msg_warn(
"%s: queue file size limit exceeded",
3365 if (out_record(out_stream, curr_rec_type, start, len) < 0)
3366 state->
err = out_error;
3427 if (state->saved_delay)
3429 state->saved_delay);
3438 if (state->
err == 0) {
3476 #define IS_SMTP_REJECT(s) \
3477 (((s)[0] == '4' || (s)[0] == '5') \
3478 && ISDIGIT((s)[1]) && ISDIGIT((s)[2]) \
3479 && ((s)[3] == '\0' || (s)[3] == ' ' || (s)[3] == '-'))
3489 "250 2.0.0 Ok: queued as %s", state->
queue_id);
3496 if (why &&
LEN(why) > 0) {
3523 }
else if (why &&
LEN(why) > 0) {
3556 saved_err = state->
err;
3601 #ifdef RFC821_SYNTAX
3620 const char *err = 0;
3657 && argc > 1 &&
strcasecmp(argv[argc - 1].strval,
"SMTPUTF8") == 0) {
3682 msg_warn(
"Recipient address rate limit exceeded: %d from %s for service %s",
3689 && (err[0] ==
'5' || err[0] ==
'4')) {
3695 collapse_args(argc - 1, argv + 1);
3705 smtpd_chat_reply(state,
"553 5.6.7 Must declare SMTPUTF8 to send unicode address");
3712 saved_flags = state->
flags;
3716 state->
flags = saved_flags;
3751 && (err[0] ==
'5' || err[0] ==
'4')) {
3766 if (argv[1].strval[0] ==
'@' || argv[1].strval[0] ==
'#')
3790 msg_warn(
"do not use ETRN in \"sendmail -bs\" mode");
3803 msg_warn(
"reject: ETRN %.100s... from %s",
3804 argv[1].strval, state->
namaddr);
3809 msg_warn(
"bad ETRN %.100s... from %s", argv[1].strval, state->
namaddr);
3813 msg_warn(
"unable to talk to fast flush service");
3838 if (out_pending > 0)
3850 const char *bare_value;
3852 int update_namaddr = 0;
3859 static const NAME_CODE proto_names[] = {
3867 #ifdef USE_SASL_AUTH
3869 char *saved_username;
3890 if (xclient_hosts && xclient_hosts->error)
3892 if (!xclient_allowed) {
3897 #define STREQ(x,y) (strcasecmp((x), (y)) == 0)
3898 #define UPDATE_STR(s, v) do { \
3899 const char *_v = (v); \
3901 s = (_v) ? mystrdup(_v) : 0; \
3913 for (argp = argv + 1; argp < argv + argc; argp++) {
3914 attr_name = argp->
strval;
3916 if ((raw_value =
split_at(attr_name,
'=')) == 0 || *raw_value == 0) {
3921 if (strlen(raw_value) > 255) {
3994 bare_value = attr_value;
4023 || strlen(attr_value) >
sizeof(
"65535") - 1) {
4073 #ifdef USE_SASL_AUTH
4088 bare_value = attr_value;
4109 || strlen(attr_value) >
sizeof(
"65535") - 1) {
4133 if (update_namaddr) {
4166 #ifdef USE_SASL_AUTH
4172 saved_username =
mystrdup(state->sasl_username);
4175 if (state->tls_context != 0)
4188 chat_reset(state, 0);
4194 teardown_milters(state);
4195 setup_milters(state);
4207 const char *bare_value;
4210 static const NAME_CODE xforward_flags[] = {
4220 static const char *context_name[] = {
4224 static const NAME_CODE xforward_to_context[] = {
4246 if (xforward_hosts && xforward_hosts->error)
4248 if (!xforward_allowed) {
4265 for (argp = argv + 1; argp < argv + argc; argp++) {
4266 attr_name = argp->
strval;
4268 if ((raw_value =
split_at(attr_name,
'=')) == 0 || *raw_value == 0) {
4273 if (strlen(raw_value) > 255) {
4323 bare_value = attr_value;
4345 || strlen(attr_value) >
sizeof(
"65535") - 1) {
4377 if (strlen(attr_value) > 64) {
4408 if ((context_code =
name_code(xforward_to_context,
4452 static void chat_reset(
SMTPD_STATE *state,
int threshold)
4501 state->tlsproxy = 0;
4510 state->tls_context = tls_proxy_context_receive(state->
client);
4520 TLS_SERVER_START_PROPS props;
4521 static char *cipher_grade;
4522 static VSTRING *cipher_exclusions;
4537 #define ADD_EXCLUDE(vstr, str) \
4540 vstring_sprintf_append((vstr), "%s%s", \
4541 VSTRING_LEN(vstr) ? " " : "", (str)); \
4544 if (cipher_grade == 0) {
4551 if (ask_client_cert)
4552 ADD_EXCLUDE(cipher_exclusions,
"aNULL");
4561 state->tls_context =
4562 TLS_SERVER_START(&props,
4563 ctx = smtpd_tls_ctx,
4567 requirecert = requirecert,
4570 cipher_grade = cipher_grade,
4571 cipher_exclusions =
STR(cipher_exclusions),
4589 && (state->tls_context == 0 || state->tls_context->session_reused == 0)
4598 msg_warn(
"New TLS session rate limit exceeded: %d from %s for service %s",
4600 if (state->tls_context)
4602 "421 4.7.0 %s Error: too many new TLS sessions from %s",
4612 if (state->tls_context == 0)
4620 if (requirecert && TLS_CERT_IS_TRUSTED(state->tls_context) == 0) {
4626 cert_present = TLS_CERT_IS_PRESENT(state->tls_context);
4627 msg_info(
"NOQUEUE: abort: TLS from %s: %s",
4628 state->
namaddr, cert_present ?
4629 "Client certificate not trusted" :
4630 "No client certificate presented");
4634 "Client certificate not trusted" :
4635 "No client certificate presented");
4647 #ifdef USE_SASL_AUTH
4675 if (err[0] ==
'5') {
4681 else if (err[0] ==
'4') {
4687 if (state->tls_context != 0) {
4704 #define PROXY_OPEN_FLAGS \
4705 (TLS_PROXY_FLAG_ROLE_SERVER | TLS_PROXY_FLAG_SEND_CONTEXT)
4710 if (state->tlsproxy == 0) {
4713 smtpd_chat_reply(state,
"454 4.7.0 TLS not available due to local problem");
4717 if (smtpd_tls_ctx == 0) {
4720 smtpd_chat_reply(state,
"454 4.7.0 TLS not available due to local problem");
4742 msg_warn(
"Refusing STARTTLS request from %s for service %s",
4745 "454 4.7.0 Error: too many new TLS sessions from %s",
4749 state->tlsproxy = 0;
4773 smtpd_start_tls(state);
4786 if (state->tls_context) {
4791 tls_proxy_context_free(state->tls_context);
4794 failure, state->tls_context);
4796 state->tls_context = 0;
4802 #if !defined(USE_TLS) || !defined(USE_SASL_AUTH)
4835 #define SMTPD_CMD_FLAG_LIMIT (1<<0)
4836 #define SMTPD_CMD_FLAG_PRE_TLS (1<<1)
4837 #define SMTPD_CMD_FLAG_LAST (1<<2)
4849 #ifdef USE_SASL_AUTH
4875 const char *ehlo_words;
4910 msg_panic(
"smtpd_proto: unknown error reading from %s",
4929 msg_info(
"%s: reject: %s from %s: "
4930 "421 4.3.0 %s Server local data error",
4944 for (cmdp = smtpd_cmd_table; ; cmdp++) {
4946 if (cmdp->
name == 0)
4970 if (state->tlsproxy == 0) {
4971 msg_warn(
"Wrapper-mode request dropped from %s for service %s."
4972 " TLS context initialization failed. For details see"
4973 " earlier warnings in your logs.",
4978 if (smtpd_tls_ctx == 0) {
4979 msg_warn(
"Wrapper-mode request dropped from %s for service %s."
4980 " TLS context initialization failed. For details see"
4981 " earlier warnings in your logs.",
4994 msg_warn(
"Refusing TLS service request from %s for service %s",
4998 smtpd_start_tls(state);
5023 msg_warn(
"Connection concurrency limit exceeded: %d from %s for service %s",
5025 smtpd_chat_reply(state,
"421 4.7.0 %s Error: too many connections from %s",
5031 msg_warn(
"Connection rate limit exceeded: %d from %s for service %s",
5033 smtpd_chat_reply(state,
"421 4.7.0 %s Error: too many connections from %s",
5044 if (ehlo_discard_maps == 0
5045 || (ehlo_words =
maps_find(ehlo_discard_maps, state->
addr, 0)) == 0)
5083 err = check_milter_reply(state, err);
5085 if (err && err[0] ==
'5') {
5090 }
else if (err && strncmp(err,
"421", 3) == 0) {
5109 #ifdef USE_SASL_AUTH
5145 if (smtpd_cmd_filter != 0) {
5148 if ((cp =
dict_get(smtpd_cmd_filter, cp)) != 0) {
5149 msg_info(
"%s: replacing command \"%.100s\" with \"%.100s\"",
5152 }
else if (smtpd_cmd_filter->
error != 0) {
5153 msg_warn(
"%s:%s lookup error for \"%.100s\"",
5154 smtpd_cmd_filter->
type, smtpd_cmd_filter->
name,
5173 for (cmdp = smtpd_cmd_table; cmdp->
name != 0; cmdp++)
5178 if (cmdp->
name == 0) {
5183 msg_warn(
"non-SMTP command from %s: %.100s",
5185 smtpd_chat_reply(state,
"221 2.7.0 Error: I can break rules, too. Goodbye.");
5202 if (cmdp->
name == 0) {
5206 && (err = check_milter_reply(state, err)) != 0) {
5216 !state->tls_context &&
5219 "530 5.7.0 Must issue a STARTTLS command first");
5236 msg_info(
"improper command pipelining after %s from %s: %s",
5240 if (cmdp->
action(state, argc, argv) != 0)
5247 if (cmdp->
action == quit_cmd)
5279 msg_info(
"%s after %s (%lu bytes) from %s",
5300 #ifdef USE_SASL_AUTH
5306 chat_reset(state, 0);
5315 static char *smtpd_format_cmd_stats(
VSTRING *buf)
5318 int all_success = 0;
5326 for (cmdp = smtpd_cmd_table; ; cmdp++) {
5329 cmdp->
name ? cmdp->
name :
"unknown",
5336 if (cmdp->
name == 0)
5347 if (all_success != all_total || all_total == 0)
5356 const char *milter_string;
5364 && ((smtpd_milter_maps
5410 static void smtpd_service(
VSTREAM *stream,
char *service,
char **argv)
5418 msg_fatal(
"unexpected command-line argument: %s", argv[0]);
5427 msg_fatal(
"all network protocols are disabled (%s = %s)",
5471 setup_milters(&state);
5477 smtpd_proto(&state);
5484 smtpd_format_cmd_stats(state.
buffer));
5485 teardown_milters(&state);
5492 static void pre_accept(
char *unused_name,
char **unused_argv)
5497 msg_info(
"table %s has changed -- restarting", table);
5504 static void pre_jail_init(
char *unused_name,
char **unused_argv)
5542 #ifdef USE_SASL_AUTH
5546 sasl_exceptions_networks =
5551 msg_warn(
"%s is true, but SASL support is not compiled in",
5576 msg_warn(
"%s: unsupported TLS level \"%s\", using \"encrypt\"",
5612 #ifndef USE_TLSPROXY
5613 TLS_SERVER_INIT_PROPS props;
5614 const char *cert_file;
5615 int have_server_cert;
5616 int no_server_cert_ok;
5617 int require_server_cert;
5625 ask_client_cert = require_server_cert =
5629 no_server_cert_ok = 1;
5632 no_server_cert_ok = 0;
5639 if (!have_server_cert && require_server_cert)
5640 msg_warn(
"Need a server cert to request client certs");
5642 msg_warn(
"Can't require client certs unless TLS is required");
5644 if (have_server_cert || (no_server_cert_ok && !require_server_cert))
5652 TLS_SERVER_INIT(&props,
5656 cache_type = TLS_MGR_SCACHE_SMTPD,
5658 cert_file = cert_file,
5674 ask_ccert = ask_client_cert,
5677 msg_warn(
"No server certs available. TLS won't be enabled");
5680 msg_warn(
"TLS has been selected, but TLS support is not compiled in");
5716 static void post_jail_init(
char *unused_name,
char **unused_argv)
5744 msg_warn(
"%s(%lu) should be at least 1.5*%s(%lu)",
int mail_stream_finish(MAIL_STREAM *info, VSTRING *why)
#define DEF_SMTPD_ENFORCE_TLS
#define DEF_UNK_ADDR_CODE
char * var_smtpd_tls_fpt_dgst
char * var_smtpd_proxy_filt
#define SMTPD_PROX_WANT_ANY
MAIL_VERSION_STAMP_DECLARE
#define VAR_CLIENT_CHECKS
#define MAIL_ATTR_ACT_CLIENT_AF
#define MAIL_ATTR_ACT_HELO_NAME
#define SMTPD_STAND_ALONE(state)
#define SMTPD_MASK_MAIL_KEEP
#define MAIL_ATTR_DSN_NOTIFY
#define VAR_SMTPD_TLS_MAND_PROTO
const char * valid_mailhost_addr(const char *addr, int gripe)
#define XCLIENT_UNAVAILABLE
const CLEANUP_STAT_DETAIL * cleanup_stat_detail(unsigned status)
SMTPD_XFORWARD_ATTR xforward
#define VAR_RELAY_RCPT_CODE
#define DEF_RBL_REPLY_MAPS
#define SMTPD_STATE_XFORWARD_PORT
#define MATCH_FLAG_RETURN
#define VAR_SMTPD_CNTLS_LIMIT
#define DEF_VERIFY_POLL_DELAY
#define VAR_SMTPD_POLICY_TRY_LIMIT
#define MAIL_ERROR_RESOURCE
#define DEF_UNV_FROM_RCODE
#define VAR_MILT_UNK_MACROS
int var_smtpd_policy_req_limit
#define CA_MAIL_SERVER_BOOL_TABLE(v)
#define VAR_UNK_ADDR_TF_ACT
#define VAR_SMTPD_TLS_MAND_EXCL
void smtpd_sasl_initialize(void)
int match_parent_style(const char *name)
char * var_smtpd_proxy_ehlo
#define DEF_SMTPD_TLS_CERT_FILE
int debug_peer_check(const char *name, const char *addr)
#define VAR_SMTPD_CLIENT_PORT_LOG
#define DEF_MAP_DEFER_CODE
#define SMTPD_PEER_CODE_PERM
#define VAR_DEF_RBL_REPLY
char * var_smtpd_policy_def_action
#define DEF_SMTPD_HOGGERS
#define HAVE_FORWARDED_CLIENT_ATTR(s)
#define CA_MAIL_SERVER_RAW_TABLE(v)
char * var_smtpd_tls_dh1024_param_file
#define VAR_SMTPD_TLS_ECCERT_FILE
#define VAR_SMTPD_NOOP_CMDS
char * mystrdup(const char *str)
#define CLEANUP_FLAG_SMTPUTF8
#define VAR_UNV_FROM_DCODE
char * var_cleanup_service
#define EHLO_MASK_XFORWARD
#define DEF_SMTPD_SOFT_ERLIM
bool var_smtpd_peername_lookup
#define EHLO_MASK_STARTTLS
#define DEF_VERIFY_SENDER_TTL
#define MAIL_ATTR_ENCODING
#define VAR_SMTPD_CMD_FILTER
int anvil_clnt_rcpt(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *rcpts)
#define DEF_MILT_MACRO_DEFLTS
#define DEF_XCLIENT_HOSTS
int smtputf8_autodetect(int class)
char * smtpd_check_mail(SMTPD_STATE *state, char *sender)
#define VAR_SMTPD_HOGGERS
#define VAR_MILT_DAEMON_NAME
void mail_stream_cleanup(MAIL_STREAM *info)
#define VAR_CYRUS_CONF_PATH
#define VAR_SMTPD_SASL_AUTH_HDR
char * smtpd_check_eod(SMTPD_STATE *state)
#define SMTPD_IN_MAIL_TRANSACTION(state)
#define EHLO_MASK_SMTPUTF8
char * var_smtpd_tls_eccert_file
ARGV * argv_free(ARGV *argvp)
#define VAR_MILT_MACRO_DEFLTS
const char * mail_date(time_t when)
#define CLEANUP_STAT_SIZE
#define USE_SMTPD_PROXY(state)
char * smtpd_check_etrn(SMTPD_STATE *state, char *domain)
int smtpd_sasl_auth_cmd(SMTPD_STATE *, int, SMTPD_TOKEN *)
#define VALID_HOSTNAME_LEN
#define VAR_SMTPD_CAUTH_LIMIT
#define VAR_XCLIENT_HOSTS
#define VAR_SMTPD_FORBID_CMDS
char * var_smtpd_tls_key_file
#define DEF_SHOW_UNK_RCPT_TABLE
char * var_smtpd_tls_dkey_file
NORETURN msg_panic(const char *fmt,...)
#define IS_AVAIL_CLIENT_ADDR(v)
#define CA_MAIL_SERVER_STR_TABLE(v)
void smtpd_expand_init(void)
char * var_smtpd_tls_proto
#define DEF_MAPS_RBL_CODE
struct timeval arrival_time
const char * milter_other_event(MILTERS *milters)
const char * vstream_peek_data(VSTREAM *vp)
#define VAR_SMTPD_SOFT_ERLIM
#define XFORWARD_DOM_LOCAL
#define VAR_SMTPD_MILTER_MAPS
#define VAR_SMTPD_TLS_EXCL_CIPH
#define SMTPD_STATE_XFORWARD_NAME
#define DEF_MILT_DEF_ACTION
SMTPD_PROXY_REC_PUT_FN rec_put
void * myrealloc(void *ptr, ssize_t len)
char * var_milt_eoh_macros
#define inet_proto_info()
#define DEF_SMTPD_DNS_RE_FILTER
#define VAR_SMTPUTF8_ENABLE
#define VAR_MILT_PROTOCOL
#define DEF_SMTPD_TLS_CCERT_VD
#define DEF_LOCAL_RCPT_MAPS
char * var_smtpd_tls_ciph
int valid_utf8_string(const char *, ssize_t)
VSTRING * escape(VSTRING *, const char *, ssize_t)
int var_verify_sender_ttl
#define DEF_SMTPD_RCPT_LIMIT
#define DEF_SMTPD_UPROXY_TMOUT
#define DEF_NON_FQDN_CODE
#define SMTPD_CMD_STARTTLS
void smtpd_proxy_close(SMTPD_STATE *state)
bool var_smtpd_tls_req_ccert
int smtpd_proxy_create(SMTPD_STATE *state, int flags, const char *service, int timeout, const char *ehlo_name, const char *mail_from)
#define VAR_SMTPD_TLS_CERT_FILE
#define VAR_MILT_HELO_MACROS
#define VAR_MAPS_RBL_DOMAINS
#define VAR_SMTPD_HIST_THRSH
off_t off_cvt_string(const char *str)
int smtpd_proxy_parse_opts(const char *param_name, const char *param_val)
bool var_smtpd_tls_received_header
int(* action)(SMTPD_STATE *, int, SMTPD_TOKEN *)
char * var_smtpd_sasl_tls_opts
#define VAR_UNV_RCPT_TF_ACT
#define PRINT2_OR_NULL(cond, name, value)
#define DEF_SMTPD_TLS_ECCERT_FILE
#define DEF_SMTPD_TLS_RCERT
#define DEF_STRICT_RFC821_ENV
void smtpd_sasl_mail_reset(SMTPD_STATE *)
char * var_smtpd_ehlo_dis_maps
int var_smtpd_cconn_limit
#define SMTPD_CMD_XCLIENT
char * neuter(char *string, const char *bad, int replacement)
#define DEF_BROKEN_AUTH_CLNTS
#define vstream_longjmp(stream, val)
#define DEF_SMTPD_REJ_FOOTER
char * var_cyrus_conf_path
#define DEF_SMTPD_STARTTLS_TMOUT
#define VAR_SMTPD_CCONN_LIMIT
#define DEF_SMTPD_TLS_LOGLEVEL
#define DEF_MILT_MSG_TIME
#define MAIL_ERROR_BOUNCE
#define DEF_BAD_NAME_CODE
#define VAR_SMTPD_NULL_KEY
int main(int argc, char **argv)
#define CA_VSTREAM_CTL_DOUBLE
char * var_smtpd_sasl_type
#define SMTPD_PROX_WANT_MORE
#define MAIL_ATTR_RWR_CONTEXT
#define DEF_MILT_CONN_TIME
#define DEF_VERIFY_SENDER
#define EHLO_MASK_8BITMIME
#define VAR_SMTPD_CMAIL_LIMIT
#define VAR_XFORWARD_HOSTS
#define DEF_MILT_CMD_TIME
#define DEF_MILT_MAIL_MACROS
int anvil_clnt_newtls_stat(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *newtls)
#define DEF_SMTPD_NULL_KEY
#define CLEANUP_FLAG_DISCARD
#define SMTPD_STATE_XFORWARD_ADDR
#define MAIL_ATTR_RWR_LOCAL
#define MAIL_ATTR_ACT_CLIENT_ADDR
int smtp_get(VSTRING *vp, VSTREAM *stream, ssize_t bound, int flags)
#define VAR_SMTPD_SASL_ENABLE
#define DEF_SMTPD_USE_TLS
#define MAIL_ATTR_ACT_SERVER_ADDR
#define DEF_SMTPD_TLS_LEVEL
int anvil_clnt_auth(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *auths)
#define DEF_SMTPD_TLS_MAND_CIPH
char * smtpd_check_helo(SMTPD_STATE *state, char *helohost)
DICT * dict_open(const char *, int, int)
#define VAR_SMTPD_REJ_UNL_FROM
#define VAR_SMTPD_MILTERS
#define VAR_SMTPD_CRCPT_LIMIT
#define DEF_SMTPD_TLS_AUTH_ONLY
#define MAIL_ATTR_SASL_METHOD
int var_smtpd_delay_reject
int var_smtpd_crcpt_limit
#define CLIENT_IDENT_UNKNOWN
#define MAIL_ATTR_RWR_REMOTE
char * var_milt_unk_macros
bool var_smtpd_sasl_enable
#define DEF_MILT_PROTOCOL
void smtpd_chat_reset(SMTPD_STATE *state)
#define SMTPD_STATE_XFORWARD_HELO
bool var_smtpd_rej_unl_rcpt
#define DEF_SMTPD_CAUTH_LIMIT
#define SMTPD_CMD_FLAG_LAST
int alldig(const char *string)
#define CLEANUP_STAT_HOPS
#define VAR_SMTPD_ERR_SLEEP
#define vstream_setjmp(stream)
char * var_smtpd_tls_CApath
#define DEF_SMTPD_REJ_UNL_FROM
#define MAIL_ERROR_POLICY
#define SMTPD_BUILD_NAMADDRPORT(name, addr, port)
ARGV * argv_alloc(ssize_t len)
#define EHLO_MASK_XCLIENT
#define IS_SMTP_REJECT(s)
#define SMTPD_CMD_XFORWARD
#define MAIL_ATTR_LOG_HELO_NAME
#define smtpd_sasl_is_active(s)
#define VAR_SEND_CANON_MAPS
#define SMTPD_PROXY_FLAG_SPEED_ADJUST
char * var_smtpd_null_key
#define VAR_SMTPD_SASL_PATH
char * var_milt_macro_deflts
char * var_smtpd_tls_eecdh
const char * valid_verify_sender_addr(const char *their_addr)
#define VAR_SMTPD_TLS_CA_PATH
char * var_notify_classes
#define VAR_SMTPD_POLICY_DEF_ACTION
#define SERVER_PORT_UNKNOWN
#define VAR_UNV_RCPT_DCODE
#define VAR_SMTPD_TLS_512_FILE
#define DEF_SMTPD_EHLO_DIS_MAPS
#define VAR_SMTPD_SASL_TYPE
#define DEF_SMTPD_POLICY_TRY_DELAY
#define CLEANUP_FLAG_HOLD
#define DICT_FLAG_FOLD_FIX
#define DEF_SMTPD_SASL_TLS_OPTS
bool var_smtpd_tls_ask_ccert
#define DEF_VERIFY_POLL_COUNT
char * smtpd_check_data(SMTPD_STATE *state)
#define MAIL_ATTR_LOG_PROTO_NAME
#define VAR_SMTPD_PEERNAME_LOOKUP
char * var_smtpd_acl_perm_log
#define MILTER_SKIP_FLAGS
#define DEF_MAPS_RBL_DOMAINS
char * var_milt_data_macros
#define DEF_DISABLE_VRFY_CMD
int strncasecmp(const char *s1, const char *s2, size_t n)
char * var_smtpd_uproxy_proto
int anvil_clnt_connect(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *count, int *rate)
#define VAR_MAP_REJECT_CODE
bool var_smtpd_rej_unl_from
const char * smtpd_milter_eval(const char *name, void *ptr)
#define VAR_SMTPD_TLS_RCERT
char * var_milt_eod_macros
#define DEF_SMTPD_TLS_CIPH
MAIL_STREAM * mail_stream_command(const char *command)
#define DEF_SMTPD_POLICY_TMOUT
#define VAR_VIRT_ALIAS_MAPS
#define DEF_SMTPD_TLS_PROTO
const char * milter_helo_event(MILTERS *milters, const char *helo_name, int esmtp_flag)
#define SERVER_ADDR_UNKNOWN
SMTPD_PROXY_REC_FPRINTF_FN rec_fprintf
#define DEF_SMTPD_SASL_EXCEPTIONS_NETWORKS
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
#define VAR_SMTPD_UPROXY_TMOUT
TOK822 * tok822_free_tree(TOK822 *)
#define VAR_UNK_ADDR_CODE
bool var_smtpd_sasl_auth_hdr
bool var_smtpd_rec_deadline
void smtpd_chat_notify(SMTPD_STATE *state)
#define EHLO_APPEND1(state, cmd, arg)
#define DEF_NOTIFY_CLASSES
#define VSTRING_TERMINATE(vp)
#define VAR_UNK_NAME_CODE
#define DEF_MILT_CONN_MACROS
#define VAR_UNV_FROM_TF_ACT
#define string_list_init(o, f, p)
#define DEF_SMTPD_ACL_PERM_LOG
#define DEF_HELO_REQUIRED
#define VAR_SMTPD_STARTTLS_TMOUT
#define VAR_SMTPD_HARD_ERLIM
const char * str_ehlo_mask(int mask_bits)
#define DEF_SMTPD_TLS_ACERT
#define DEF_SMTPD_POLICY_DEF_ACTION
#define VAR_SMTPD_TLS_CCERT_VD
#define DEF_MILT_RCPT_MACROS
#define VAR_VIRT_MAILBOX_MAPS
char * var_smtpd_tls_mand_ciph
#define DEF_SMTPD_MILTERS
int valid_hostname(const char *name, int gripe)
#define MAIL_CLASS_PUBLIC
#define CA_MAIL_SERVER_POST_INIT(v)
#define CA_MAIL_SERVER_INT_TABLE(v)
#define string_list_match
#define MILTER_FLAG_WANT_RCPT_REJ
char * var_reject_tmpf_act
char * var_smtpd_dns_re_filter
bool var_smtpd_delay_open
#define VAR_ALLOW_UNTRUST_ROUTE
const char * milter_unknown_event(MILTERS *milters, const char *command)
#define SMTPD_STAND_ALONE_STREAM(stream)
#define VAR_SMTPD_SASL_TLS_OPTS
#define VAR_CANONICAL_MAPS
char * var_smtpd_policy_context
#define VAR_LOCAL_RCPT_MAPS
void smtpd_sasl_auth_reset(SMTPD_STATE *)
int milter_dummy(MILTERS *milters, VSTREAM *stream)
#define DEF_SMTPD_PROXY_OPTS
char * var_smtpd_noop_cmds
char * var_rcpt_canon_maps
#define REASON_LOST_CONNECTION
#define VSTRING_ADDCH(vp, ch)
char * var_send_canon_maps
#define VAR_SMTPD_TLS_1024_FILE
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
#define DEF_SMTPD_POLICY_IDLE
int var_smtpd_policy_idle
#define VAR_SMTPD_REJ_FOOTER
bool var_allow_untrust_route
#define VAR_SMTPD_TLS_PROTO
#define VAR_SMTPD_TLS_LOGLEVEL
#define CLIENT_HELO_UNKNOWN
#define MAIL_ATTR_ACT_CLIENT_PORT
#define MAIL_ATTR_LOG_ORIGIN
#define VAR_SMTPD_TLS_CA_FILE
char * var_milt_rcpt_macros
#define DEF_RELAY_RCPT_CODE
#define VAR_UNV_RCPT_RCODE
char * var_smtpd_tls_mand_proto
const char * milter_mail_event(MILTERS *milters, const char **argv)
int var_virt_mailbox_code
int var_smtpd_tls_ccert_vd
#define VAR_MILT_DATA_MACROS
#define MAIL_ATTR_DSN_ORCPT
char * var_tlsproxy_service
#define DEF_SMTPD_SASL_PATH
#define DEF_CANONICAL_MAPS
#define REASON_ERROR_LIMIT
#define DEF_SMTPD_EHLO_DIS_WORDS
bool var_smtpd_client_port_log
int var_verify_poll_delay
char * var_virt_mailbox_maps
#define VAR_MESSAGE_LIMIT
#define CLIENT_PROTO_UNKNOWN
#define VAR_SMTPD_TLS_RECHEAD
#define VAR_MILT_CMD_TIME
#define DEF_SMTPD_SASL_SERVICE
char * var_smtpd_rej_footer
int valid_mailhost_literal(const char *addr, int gripe)
#define VAR_SMTPD_USE_TLS
#define DEF_SMTPD_SASL_ENABLE
int var_smtpd_cntls_limit
#define DEF_SMTPD_TLS_EXCL_CIPH
#define NEUTER_CHARACTERS
#define VAR_SMTPD_TLS_AUTH_ONLY
#define dict_get(dp, key)
#define DEF_SMTPD_TLS_MAND_PROTO
#define CLEANUP_STAT_PROXY
int anvil_clnt_disconnect(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr)
char * var_local_rwr_clients
#define VAR_MILT_CONN_MACROS
int dsn_notify_mask(const char *str)
#define SMTPD_MILTERS_DISABLE
MAPS * maps_create(const char *title, const char *map_names, int dict_flags)
char * var_local_rcpt_maps
#define VAR_SMTPD_TLS_FPT_DGST
const char * dict_changed_name(void)
#define VAR_MILT_MAIL_MACROS
#define DEF_SMTPD_DELAY_OPEN
char * var_smtpd_snd_auth_maps
void smtpd_sasl_deactivate(SMTPD_STATE *)
const char * milter_reject_text
#define SMTPD_CMD_FLAG_PRE_TLS
#define XCLIENT_TEMPORARY
#define VAR_SMTPD_TLS_EECDH
int vstream_fclose(VSTREAM *stream)
#define VAR_SMTPD_SASL_REALM
#define REC_TYPE_TIME_FORMAT
#define DEF_SMTPD_FORBID_CMDS
char * var_milt_helo_macros
bool var_smtpd_tls_set_sessid
#define DEF_SMTPD_TLS_WRAPPER
int var_smtpd_starttls_tmout
#define DEF_SMTPD_NOOP_CMDS
void milter_abort(MILTERS *milters)
#define DEF_VIRT_ALIAS_MAPS
#define smtpd_sasl_auth_extern
struct SMTPD_CMD SMTPD_CMD
char * var_smtpd_tls_dh512_param_file
#define VAR_SMTPD_EHLO_DIS_MAPS
#define POP_STRING(old, curr)
int smtpd_check_addr(const char *sender, const char *addr, int smtputf8)
#define VSTRING_RESET(vp)
#define SMTPD_PROX_WANT_OK
#define MAIL_ATTR_SASL_SENDER
#define VAR_SHOW_UNK_RCPT_TABLE
#define VAR_MILT_MSG_TIME
#define DEF_SMTPD_SND_AUTH_MAPS
#define DEF_SMTPD_SASL_AUTH_HDR
int rec_fputs(VSTREAM *stream, int type, const char *str)
#define VAR_SMTPD_EHLO_DIS_WORDS
int var_smtpd_policy_try_limit
#define VAR_MILT_CONN_TIME
#define VAR_PERM_MX_NETWORKS
char * var_unv_from_tf_act
#define VSTRING_STRDUP(s)
#define VSTREAM_PURGE_BOTH
char * var_milt_daemon_name
#define DEF_QUEUE_MINFREE
char * var_milt_def_action
#define VAR_SMTPD_RCPT_LIMIT
#define VAR_SMTPD_RCPT_OVERLIM
char * var_smtpd_sasl_service
void msg_warn(const char *fmt,...)
#define DEF_SMTPD_PEERNAME_LOOKUP
#define DEF_UNK_CLIENT_CODE
#define MAIL_ATTR_ACT_CLIENT_NAME
#define DEF_LOC_RWR_CLIENTS
#define DEF_SMTPD_SASL_OPTS
#define MAIL_ERROR_SOFTWARE
void smtp_stream_setup(VSTREAM *stream, int maxtime, int enable_deadline)
#define VAR_SMTPD_TLS_KEY_FILE
VSTRING * vstring_alloc(ssize_t len)
#define DEF_MILT_HELO_MACROS
#define XCLIENT_REVERSE_NAME
char * var_canonical_maps
#define DEF_SMTPD_TLS_CA_FILE
void milter_disc_event(MILTERS *milters)
#define VAR_RBL_REPLY_MAPS
#define VAR_MILT_RCPT_MACROS
#define MAIL_ATTR_DSN_RET
void smtpd_proxy_free(SMTPD_STATE *state)
#define SMTPD_FLAG_SMTPUTF8
const char * username(void)
#define NAME_CODE_FLAG_NONE
#define CA_MAIL_SERVER_NBOOL_TABLE(v)
#define DEF_SMTPD_RCPT_OVERLIM
#define DEF_MILT_EOH_MACROS
#define DEF_SMTPD_TLS_512_FILE
#define DEF_MILT_DATA_MACROS
#define DEF_SMTPD_REJ_UNL_RCPT
#define DEF_RCPT_CANON_MAPS
#define XCLIENT_LOGIN_KLUDGE
#define PUSH_STRING(old, curr, new)
void debug_peer_init(void)
#define MAIL_ATTR_ACT_REVERSE_CLIENT_NAME
const char * milter_rcpt_event(MILTERS *milters, int flags, const char **argv)
#define VAR_MAP_DEFER_CODE
#define HAVE_FORWARDED_IDENT(s)
#define MAIL_VERSION_STAMP_ALLOCATE
char * var_smtpd_forbid_cmds
#define VAR_VERIFY_SENDER_TTL
#define SMTPD_STATE_XFORWARD_IDENT
#define DEF_SMTPD_UPROXY_PROTO
#define DEF_SMTPD_PROXY_FILT
void smtpd_chat_reply(SMTPD_STATE *state, const char *format,...)
#define VAR_SMTPD_TLS_DKEY_FILE
#define VAR_INET_PROTOCOLS
void argv_truncate(ARGV *argvp, ssize_t len)
#define VAR_MAPS_RBL_CODE
void debug_peer_restore(void)
char * var_smtpd_tls_eckey_file
#define DEF_SMTPD_PROXY_EHLO
#define DEF_SMTPD_CLIENT_PORT_LOG
#define VAR_SMTPD_JUNK_CMD
#define VAR_NON_FQDN_CODE
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define DEF_SMTPD_CCONN_LIMIT
#define MAIL_ATTR_LOG_IDENT
#define VAR_UNV_FROM_RCODE
#define VAR_QUEUE_MINFREE
#define MAIL_ATTR_DSN_ENVID
#define DEF_UNV_RCPT_RCODE
#define MAIL_ATTR_LOG_CLIENT_ADDR
#define CA_MAIL_SERVER_TIME_TABLE(v)
#define DEF_ALLOW_UNTRUST_ROUTE
VSTRING * tok822_internalize(VSTRING *, TOK822 *, int)
char * lowercase(char *string)
char * var_smtpd_cmd_filter
int var_strict_rfc821_env
#define SEND_ATTR_INT(name, val)
#define DEF_TLSPROXY_SERVICE
#define INET_PROTO_NAME_IPV6
void milter_free(MILTERS *milters)
#define FORWARD_DOMAIN(s)
#define VAR_SMTPD_DELAY_REJECT
int rec_put(VSTREAM *stream, int type, const char *data, ssize_t len)
char * smtpd_check_size(SMTPD_STATE *state, off_t size)
#define MAIL_ATTR_ACT_SERVER_PORT
int name_code(const NAME_CODE *table, int flags, const char *name)
#define VAR_UNK_NAME_TF_ACT
#define VAR_RCPT_CANON_MAPS
char * var_maps_rbl_domains
const char * verp_delims_verify(const char *delims)
int var_smtpd_junk_cmd_limit
bool var_disable_vrfy_cmd
char * var_smtpd_milter_maps
NORETURN msg_fatal(const char *fmt,...)
#define VAR_SMTPD_DNS_RE_FILTER
#define XFORWARD_DOM_REMOTE
#define VAR_SMTPD_PROXY_FILT
#define CLIENT_NAME_UNKNOWN
void smtpd_chat_query(SMTPD_STATE *state)
#define DEF_SMTPD_HARD_ERLIM
char * var_unv_rcpt_tf_act
#define DEF_LOCAL_RCPT_CODE
#define VAR_LOCAL_RCPT_CODE
char * var_smtpd_relay_ccerts
MAIL_STREAM * mail_stream_service(const char *class, const char *name)
#define DEF_PLAINTEXT_CODE
char * smtpd_check_client(SMTPD_STATE *state)
#define VAR_VERIFY_POLL_COUNT
#define DEF_CYRUS_CONF_PATH
#define DEF_SMTPD_TLS_KEY_FILE
#define DEF_UNV_RCPT_TF_ACT
const char * milter_data_event(MILTERS *milters)
#define VAR_SMTPD_REJ_UNL_RCPT
#define VAR_NOTIFY_CLASSES
char * var_smtpd_tls_loglevel
#define VAR_TLSPROXY_SERVICE
#define VAR_SMTPD_POLICY_TTL
int vstream_fflush(VSTREAM *stream)
#define namadr_list_match
VSTRING * xtext_unquote(VSTRING *unquoted, const char *quoted)
#define CLEANUP_STAT_CONT
#define CLEANUP_FLAG_MASK_EXTERNAL
#define DEF_SMTPD_TLS_ECKEY_FILE
#define SMTPD_STATE_XFORWARD_DOMAIN
#define VAR_SMTPD_ACL_PERM_LOG
#define DEF_UNK_NAME_CODE
char * concatenate(const char *arg0,...)
struct ANVIL_CLNT ANVIL_CLNT
void smtp_flush(VSTREAM *stream)
char * var_smtpd_proxy_opts
char * mystrndup(const char *str, ssize_t len)
#define SMTPD_FLAG_ILL_PIPELINING
int var_verify_poll_count
int tls_level_lookup(const char *)
#define VAR_SMTPD_REC_DEADLINE
const char ** milter_argv
#define VAR_STRICT_RFC821_ENV
#define CA_MAIL_SERVER_NINT_TABLE(v)
char * var_smtpd_tls_excl_ciph
#define DEF_SMTPD_CRCPT_LIMIT
int dsn_ret_code(const char *str)
#define VAR_SMTPD_PROXY_EHLO
#define DEF_SMTPD_CRATE_LIMIT
char * var_unk_name_tf_act
#define VSTREAM_BST_OUT_PEND
int anvil_clnt_newtls(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *newtls)
struct SMTPD_PROXY * proxy
#define DEF_MUL_RCPT_CODE
char * smtpd_check_rcpt(SMTPD_STATE *state, char *recipient)
#define MAIL_ATTR_SASL_USERNAME
#define VAR_SMTPD_SASL_EXCEPTIONS_NETWORKS
#define DEF_SMTPD_ERR_SLEEP
int var_smtpd_uproxy_tmout
#define VAR_SMTPD_EXP_FILTER
#define VAR_SMTPD_POLICY_CONTEXT
#define SMTPD_CMD_FLAG_LIMIT
char * var_smtpd_tls_mand_excl
#define VAR_MILT_EOD_MACROS
char * smtpd_check_queue(SMTPD_STATE *state)
void smtpd_xforward_reset(SMTPD_STATE *)
#define VAR_SMTPD_TLS_LEVEL
void smtpd_state_init(SMTPD_STATE *, VSTREAM *, const char *)
bool var_smtpd_tls_wrappermode
#define DEF_SMTPD_DELAY_REJECT
#define quote_822_local(dst, src)
#define VAR_SMTPD_TLS_CIPH
#define VAR_HELO_REQUIRED
#define DEF_SMTPD_REC_DEADLINE
#define DEF_SMTPD_CMD_FILTER
#define DEF_MILT_DAEMON_NAME
#define VAR_SMTPD_POLICY_REQ_LIMIT
int strcasecmp(const char *s1, const char *s2)
#define DEF_SMTPD_MILTER_MAPS
#define VAR_SMTPD_SASL_SERVICE
#define VAR_SMTPD_TLS_ACERT
#define CLIENT_ADDR_UNKNOWN
char * var_perm_mx_networks
int anvil_clnt_mail(ANVIL_CLNT *anvil_clnt, const char *service, const char *addr, int *msgs)
#define DEF_PERM_MX_NETWORKS
#define DEF_SMTPD_POLICY_TRY_LIMIT
void smtpd_xforward_preset(SMTPD_STATE *)
#define DEF_UNV_FROM_DCODE
#define DEF_VIRT_MAILBOX_CODE
#define DEF_MILT_UNK_MACROS
#define VAR_DISABLE_VRFY_CMD
char * var_smtpd_sasl_opts
#define VAR_VERIFY_SENDER
int var_smtpd_policy_try_delay
#define VAR_REJECT_TMPF_ACT
#define MAIL_ERROR_PROTOCOL
#define DEF_MILT_EOD_MACROS
#define VAR_SMTPD_POLICY_TMOUT
#define MAIL_ATTR_LOG_CLIENT_NAME
VSTRING * vstring_free(VSTRING *vp)
#define DEF_SMTPD_HIST_THRSH
char * var_smtpd_tls_cert_file
#define DEF_SMTPD_CMAIL_LIMIT
int var_smtpd_crate_limit
#define REJECT_EMPTY_ADDR
NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...)
int allprint(const char *string)
char * split_at(char *string, int delimiter)
#define DEF_SMTPD_JUNK_CMD
#define vstream_fileno(vp)
const char * milter_conn_event(MILTERS *milters, const char *client_name, const char *client_addr, const char *client_port, unsigned addr_family)
int var_smtpd_cauth_limit
#define SMTPD_STATE_XFORWARD_PROTO
char * var_inet_protocols
char * var_smtpd_exp_filter
#define DEF_UNV_FROM_TF_ACT
#define DEF_SMTPD_TLS_1024_FILE
#define VAR_PLAINTEXT_CODE
#define VAR_MILT_DEF_ACTION
#define CA_VSTREAM_CTL_END
#define DEF_SMTPD_TLS_DKEY_FILE
#define DEF_UNK_ADDR_TF_ACT
#define DEF_SMTPD_PROXY_TMOUT
#define DEF_VIRT_ALIAS_CODE
#define VAR_SMTPD_UPROXY_PROTO
#define EHLO_MASK_ENHANCEDSTATUSCODES
char * var_smtpd_ehlo_dis_words
int var_show_unk_rcpt_table
#define VAR_SMTPD_POLICY_IDLE
#define DEF_SMTPD_TLS_SET_SESSID
#define CLEANUP_STAT_WRITE
#define VAR_BAD_NAME_CODE
#define VAR_SMTPD_TLS_DCERT_FILE
#define DEF_VIRT_MAILBOX_MAPS
#define MAIL_ATTR_ACT_PROTO_NAME
#define DEF_UNK_NAME_TF_ACT
#define DEF_SMTPD_SASL_TYPE
int var_smtpd_rcpt_overlim
int smtpd_token(char *cp, SMTPD_TOKEN **argvp)
char * var_smtpd_tls_level
int var_smtpd_policy_tmout
#define VAR_SMTPD_TLS_MAND_CIPH
#define VAR_SMTPD_TLS_SET_SESSID
#define CLEANUP_STAT_DEFER
#define CA_MAIL_SERVER_PRE_ACCEPT(v)
#define VAR_SMTPD_PROXY_OPTS
char * smtpd_check_rewrite(SMTPD_STATE *state)
char * printable(char *string, int replacement)
void vstream_control(VSTREAM *stream, int name,...)
char * var_rbl_reply_maps
void smtpd_sasl_activate(SMTPD_STATE *, const char *, const char *)
bool var_smtpd_enforce_tls
ssize_t vstream_bufstat(VSTREAM *vp, int command)
#define DEF_SMTPD_EXP_FILTER
#define SMTPD_PEER_CODE_TEMP
#define VAR_SMTPD_SASL_OPTS
#define DEF_SMTPD_CNTLS_LIMIT
#define VAR_UNK_CLIENT_CODE
#define DEF_MAP_REJECT_CODE
void smtpd_check_init(void)
char * var_smtpd_sasl_exceptions_networks
char * var_smtpd_tls_CAfile
#define CLIENT_PORT_UNKNOWN
#define MAIL_ATTR_ENC_8BIT
#define VAR_SMTPD_TLS_WRAPPER
#define DEF_SMTPD_TLS_RECHEAD
#define VAR_SMTPD_SND_AUTH_MAPS
#define EHLO_APPEND(state, cmd)
void milter_macro_callback(MILTERS *milters, const char *(*mac_lookup)(const char *, void *), void *mac_context)
int vstream_fpurge(VSTREAM *stream, int direction)
const char * maps_find(MAPS *maps, const char *name, int flags)
#define vstream_ferror(vp)
#define VAR_SMTPD_ENFORCE_TLS
#define VAR_MUL_RCPT_CODE
#define DEF_SMTPD_POLICY_REQ_LIMIT
#define VAR_VERIFY_POLL_DELAY
#define DEF_XFORWARD_HOSTS
int warn_compat_break_smtputf8_enable
#define DEF_SMTPD_TLS_CA_PATH
int rec_fprintf(VSTREAM *stream, int type, const char *format,...)
VSTRING * uxtext_unquote(VSTRING *unquoted, const char *quoted)
int smtpd_input_transp_mask
#define VAR_SMTPD_PROXY_TMOUT
#define DEF_SMTPD_POLICY_CONTEXT
#define PERMIT_EMPTY_ADDR
#define DEF_SMTPD_SASL_REALM
#define CA_VSTREAM_CTL_SWAP_FD(v)
#define DEF_SMTPD_TLS_FPT_DGST
#define VAR_SMTPD_POLICY_TRY_DELAY
char * var_smtpd_sasl_realm
char * var_milt_conn_macros
char * var_xforward_hosts
#define VAR_MILT_EOH_MACROS
char * var_relay_rcpt_maps
char * var_smtpd_sasl_path
char * smtpd_sasl_mail_opt(SMTPD_STATE *, const char *)
#define SMTPD_CMD_UNKNOWN
char * var_virt_alias_maps
#define DEF_UNV_RCPT_DCODE
#define DEF_REJECT_TMPF_ACT
#define DEF_RELAY_RCPT_MAPS
#define VAR_LOC_RWR_CLIENTS
#define DEF_SMTPD_TLS_MAND_EXCL
#define VAR_BROKEN_AUTH_CLNTS
int var_smtpd_cmail_limit
ANVIL_CLNT * anvil_clnt_create(void)
VSTRING * vstring_strcat(VSTRING *vp, const char *src)
bool var_broken_auth_clients
int var_smtpd_proxy_tmout
int flush_send_site(const char *site)
#define MAIL_ATTR_LOG_CLIENT_PORT
#define VAR_SMTPD_DELAY_OPEN
#define FORWARD_NAMADDR(s)
#define VAR_SMTPD_TLS_ECKEY_FILE
#define DEF_CLIENT_CHECKS
char * var_unk_addr_tf_act
#define DEF_DEF_RBL_REPLY
bool var_smtpd_tls_auth_only
#define DEF_SMTPD_TLS_EECDH
#define REC_TYPE_TIME_ARG(tv)
int milter_send(MILTERS *milters, VSTREAM *stream)
#define MAIL_ATTR_ENC_7BIT
#define VAR_RELAY_RCPT_MAPS
#define CLEANUP_FLAG_SMTP_REPLY
void dns_rr_filter_compile(const char *, const char *)
#define DEF_SEND_CANON_MAPS
#define MAIL_SRC_MASK_SMTPD
#define SMTPD_PEER_CODE_OK
#define EHLO_MASK_PIPELINING
#define XFORWARD_UNAVAILABLE
#define VAR_SMTPD_CRATE_LIMIT
#define CA_MAIL_SERVER_PRE_INIT(v)
int ehlo_mask(const char *mask_str)
char * var_milt_mail_macros
#define SMTP_GET_FLAG_NONE
void * mymalloc(ssize_t len)
char * var_smtpd_tls_dcert_file
#define DEF_SMTPD_POLICY_TTL
#define DEF_SMTPD_TLS_DCERT_FILE
void msg_info(const char *fmt,...)
#define SMTPD_FLAG_HANGUP
void smtpd_state_reset(SMTPD_STATE *)
#define VAR_VIRT_MAILBOX_CODE
#define namadr_list_init(o, f, p)
#define milter_create(milter_names, conn_timeout, cmd_timeout, msg_timeout, protocol, def_action, conn_macros, helo_macros, mail_macros, rcpt_macros, data_macros, eoh_macros, eod_macros, unk_macros, macro_deflts)
#define VAR_VIRT_ALIAS_CODE