X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fsmtp_in.c;h=58ca02dbe3496cc9de40441f19e9e002333859d9;hb=3d1451ea26e96e63a22d96a08dcfe2e80701c75c;hp=4ea6cd404db668e3ebde2185dd21cb6ee226477f;hpb=6c1c3d1dbe1a62ffd24ad9b3cd9efdfe275c74c5;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c index 4ea6cd404..58ca02dbe 100644 --- a/src/src/smtp_in.c +++ b/src/src/smtp_in.c @@ -121,9 +121,7 @@ static BOOL auth_advertised; #ifdef SUPPORT_TLS static BOOL tls_advertised; #endif -#ifdef EXPERIMENTAL_DSN static BOOL dsn_advertised; -#endif static BOOL esmtp; static BOOL helo_required = FALSE; static BOOL helo_verify = FALSE; @@ -220,9 +218,7 @@ enum { #ifndef DISABLE_PRDR ENV_MAIL_OPT_PRDR, #endif -#ifdef EXPERIMENTAL_DSN ENV_MAIL_OPT_RET, ENV_MAIL_OPT_ENVID, -#endif ENV_MAIL_OPT_NULL }; typedef struct { @@ -238,10 +234,8 @@ static env_mail_type_t env_mail_type_list[] = { #ifndef DISABLE_PRDR { US"PRDR", ENV_MAIL_OPT_PRDR, FALSE }, #endif -#ifdef EXPERIMENTAL_DSN { US"RET", ENV_MAIL_OPT_RET, TRUE }, { US"ENVID", ENV_MAIL_OPT_ENVID, TRUE }, -#endif { US"NULL", ENV_MAIL_OPT_NULL, FALSE } }; @@ -1317,7 +1311,8 @@ for (i = 0; i < smtp_ch_index; i++) if (s != NULL) s[ptr] = 0; else s = US""; log_write(0, LOG_MAIN, "no MAIL in SMTP connection from %s D=%s%s", host_and_ident(FALSE), - readconf_printtime(time(NULL) - smtp_connection_start), s); + readconf_printtime( (int) ((long)time(NULL) - (long)smtp_connection_start)), + s); } @@ -1499,11 +1494,9 @@ sender_verified_list = NULL; /* No senders verified */ memset(sender_address_cache, 0, sizeof(sender_address_cache)); memset(sender_domain_cache, 0, sizeof(sender_domain_cache)); -#ifdef EXPERIMENTAL_DSN /* Reset the DSN flags */ dsn_ret = 0; dsn_envid = NULL; -#endif authenticated_sender = NULL; #ifdef EXPERIMENTAL_BRIGHTMAIL @@ -1854,9 +1847,7 @@ tls_in.sni = NULL; tls_in.ocsp = OCSP_NOT_REQ; tls_advertised = FALSE; #endif -#ifdef EXPERIMENTAL_DSN dsn_advertised = FALSE; -#endif /* Reset ACL connection variables */ @@ -2138,6 +2129,19 @@ if (!sender_host_unknown) set_process_info("handling incoming connection from %s", host_and_ident(FALSE)); + /* Expand smtp_receive_timeout, if needed */ + + if (smtp_receive_timeout_s) + { + uschar * exp; + if ( !(exp = expand_string(smtp_receive_timeout_s)) + || !(*exp) + || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0 + ) + log_write(0, LOG_MAIN|LOG_PANIC, + "bad value for smtp_receive_timeout: '%s'", exp ? exp : US""); + } + /* Start up TLS if tls_on_connect is set. This is for supporting the legacy smtps port for use with older style SSL MTAs. */ @@ -3128,7 +3132,7 @@ value. The values are 2 larger than the required yield of the function. */ while (done <= 0) { - uschar **argv; + const uschar **argv; uschar *etrn_command; uschar *etrn_serialize_key; uschar *errmess; @@ -3136,7 +3140,7 @@ while (done <= 0) uschar *user_msg = NULL; uschar *recipient = NULL; uschar *hello = NULL; - uschar *set_id = NULL; + const uschar *set_id = NULL; uschar *s, *ss; BOOL was_rej_mail = FALSE; BOOL was_rcpt = FALSE; @@ -3146,10 +3150,8 @@ while (done <= 0) int ptr, size, rc; int c, i; auth_instance *au; -#ifdef EXPERIMENTAL_DSN uschar *orcpt = NULL; int flags; -#endif switch(smtp_read_command(TRUE)) { @@ -3422,7 +3424,7 @@ while (done <= 0) if (sender_host_name == NULL && (deliver_domain = sender_helo_name, /* set $domain */ - match_isinlist(sender_helo_name, &helo_lookup_domains, 0, + match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0, &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL)) == OK) (void)host_name_lookup(); @@ -3494,9 +3496,7 @@ while (done <= 0) #ifdef SUPPORT_TLS tls_advertised = FALSE; #endif - #ifdef EXPERIMENTAL_DSN dsn_advertised = FALSE; - #endif smtp_code = US"250 "; /* Default response code plus space*/ if (user_msg == NULL) @@ -3580,7 +3580,6 @@ while (done <= 0) s = string_cat(s, &size, &ptr, US"-8BITMIME\r\n", 11); } - #ifdef EXPERIMENTAL_DSN /* Advertise DSN support if configured to do so. */ if (verify_check_host(&dsn_advertise_hosts) != FAIL) { @@ -3588,7 +3587,6 @@ while (done <= 0) s = string_cat(s, &size, &ptr, US"-DSN\r\n", 6); dsn_advertised = TRUE; } - #endif /* Advertise ETRN if there's an ACL checking whether a host is permitted to issue it; a check is made when any host actually tries. */ @@ -3845,8 +3843,6 @@ while (done <= 0) arg_error = TRUE; break; - #ifdef EXPERIMENTAL_DSN - /* Handle the two DSN options, but only if configured to do so (which will have caused "DSN" to be given in the EHLO response). The code itself is included only if configured in at build time. */ @@ -3882,7 +3878,6 @@ while (done <= 0) DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid); } break; - #endif /* Handle the AUTH extension. If the value given is not "<>" and either the ACL says "yes" or there is no ACL but the sending host is @@ -4160,26 +4155,23 @@ while (done <= 0) rcpt_fail_count++; break; } - - #ifdef EXPERIMENTAL_DSN + /* Set the DSN flags orcpt and dsn_flags from the session*/ orcpt = NULL; flags = 0; if (esmtp) for(;;) { - uschar *name, *value, *end; - int size; + uschar *name, *value; if (!extract_option(&name, &value)) - { break; - } if (dsn_advertised && strcmpic(name, US"ORCPT") == 0) { /* Check whether orcpt has been already set */ - if (orcpt != NULL) { + if (orcpt) + { synprot_error(L_smtp_syntax_error, 501, NULL, US"ORCPT can be specified once only"); goto COMMAND_LOOP; @@ -4191,32 +4183,39 @@ while (done <= 0) else if (dsn_advertised && strcmpic(name, US"NOTIFY") == 0) { /* Check if the notify flags have been already set */ - if (flags > 0) { + if (flags > 0) + { synprot_error(L_smtp_syntax_error, 501, NULL, US"NOTIFY can be specified once only"); goto COMMAND_LOOP; } - if (strcmpic(value, US"NEVER") == 0) flags |= rf_notify_never; else + if (strcmpic(value, US"NEVER") == 0) + flags |= rf_notify_never; + else { uschar *p = value; while (*p != 0) { uschar *pp = p; while (*pp != 0 && *pp != ',') pp++; - if (*pp == ',') *pp++ = 0; - if (strcmpic(p, US"SUCCESS") == 0) { - DEBUG(D_receive) debug_printf("DSN: Setting notify success\n"); - flags |= rf_notify_success; + if (*pp == ',') *pp++ = 0; + if (strcmpic(p, US"SUCCESS") == 0) + { + DEBUG(D_receive) debug_printf("DSN: Setting notify success\n"); + flags |= rf_notify_success; } - else if (strcmpic(p, US"FAILURE") == 0) { - DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n"); - flags |= rf_notify_failure; + else if (strcmpic(p, US"FAILURE") == 0) + { + DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n"); + flags |= rf_notify_failure; } - else if (strcmpic(p, US"DELAY") == 0) { - DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n"); - flags |= rf_notify_delay; + else if (strcmpic(p, US"DELAY") == 0) + { + DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n"); + flags |= rf_notify_delay; } - else { + else + { /* Catch any strange values */ synprot_error(L_smtp_syntax_error, 501, NULL, US"Invalid value for NOTIFY parameter"); @@ -4239,7 +4238,6 @@ while (done <= 0) break; } } - #endif /* Apply SMTP rewriting then extract the working address. Don't allow "<>" as a recipient address */ @@ -4354,8 +4352,7 @@ while (done <= 0) if (user_msg == NULL) smtp_printf("250 Accepted\r\n"); else smtp_user_msg(US"250", user_msg); receive_add_recipient(recipient, -1); - - #ifdef EXPERIMENTAL_DSN + /* Set the dsn flags in the recipients_list */ if (orcpt != NULL) recipients_list[recipients_count-1].orcpt = orcpt; @@ -4367,8 +4364,6 @@ while (done <= 0) else recipients_list[recipients_count-1].dsn_flags = 0; DEBUG(D_receive) debug_printf("DSN: orcpt: %s flags: %d\n", recipients_list[recipients_count-1].orcpt, recipients_list[recipients_count-1].dsn_flags); - #endif - } /* The recipient was discarded */ @@ -4453,7 +4448,7 @@ while (done <= 0) ACL may have delayed. To handle cutthrough delivery enforce a dummy call to get the DATA command sent. */ - if (acl_smtp_predata == NULL && cutthrough_fd < 0) rc = OK; else + if (acl_smtp_predata == NULL && cutthrough.fd < 0) rc = OK; else { uschar * acl= acl_smtp_predata ? acl_smtp_predata : US"accept"; enable_dollar_recipients = TRUE; @@ -4855,7 +4850,7 @@ while (done <= 0) break; } etrn_command = US"exim -R"; - argv = child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE, 2, US"-R", + argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE, 2, US"-R", smtp_cmd_data); }