64 #define SMTP_ITER_INIT(iter, _dest, _host, _addr, _port, state) do { \
65 vstring_strcpy((iter)->dest, (_dest)); \
66 vstring_strcpy((iter)->host, (_host)); \
67 vstring_strcpy((iter)->addr, (_addr)); \
68 (iter)->port = (_port); \
69 (iter)->mx = (iter)->rr = 0; \
70 vstring_strcpy((iter)->saved_dest, ""); \
71 (iter)->parent = (state); \
74 #define SMTP_ITER_CLOBBER(iter, _dest, _host, _addr) do { \
75 vstring_strcpy((iter)->dest, (_dest)); \
76 vstring_strcpy((iter)->host, (_host)); \
77 vstring_strcpy((iter)->addr, (_addr)); \
80 #define SMTP_ITER_SAVE_DEST(iter) do { \
81 vstring_strcpy((iter)->saved_dest, STR((iter)->dest)); \
84 #define SMTP_ITER_RESTORE_DEST(iter) do { \
85 vstring_strcpy((iter)->dest, STR((iter)->saved_dest)); \
93 typedef struct SMTP_TLS_POLICY {
106 extern void smtp_tls_list_init(
void);
108 extern void smtp_tls_policy_cache_flush(
void);
119 #define smtp_tls_policy_dummy(t) do { \
120 SMTP_TLS_POLICY *_tls_policy_dummy_tmp = (t); \
121 smtp_tls_policy_init(_tls_policy_dummy_tmp, (DSN_BUF *) 0); \
122 _tls_policy_dummy_tmp->level = TLS_LEV_NONE; \
126 #define smtp_tls_policy_init(t, w) do { \
127 SMTP_TLS_POLICY *_tls_policy_init_tmp = (t); \
128 _tls_policy_init_tmp->protocols = 0; \
129 _tls_policy_init_tmp->grade = 0; \
130 _tls_policy_init_tmp->exclusions = 0; \
131 _tls_policy_init_tmp->matchargv = 0; \
132 _tls_policy_init_tmp->why = (w); \
133 _tls_policy_init_tmp->dane = 0; \
160 SMTP_TLS_POLICY tls[1];
190 #define SET_NEXTHOP_STATE(state, nexthop) { \
191 vstring_strcpy((state)->iterator->request_nexthop, nexthop); \
194 #define FREE_NEXTHOP_STATE(state) { \
195 STR((state)->iterator->request_nexthop)[0] = 0; \
198 #define HAVE_NEXTHOP_STATE(state) (STR((state)->iterator->request_nexthop)[0] != 0)
204 #define SMTP_FEATURE_ESMTP (1<<0)
205 #define SMTP_FEATURE_8BITMIME (1<<1)
206 #define SMTP_FEATURE_PIPELINING (1<<2)
207 #define SMTP_FEATURE_SIZE (1<<3)
208 #define SMTP_FEATURE_STARTTLS (1<<4)
209 #define SMTP_FEATURE_AUTH (1<<5)
210 #define SMTP_FEATURE_XFORWARD_NAME (1<<7)
211 #define SMTP_FEATURE_XFORWARD_ADDR (1<<8)
212 #define SMTP_FEATURE_XFORWARD_PROTO (1<<9)
213 #define SMTP_FEATURE_XFORWARD_HELO (1<<10)
214 #define SMTP_FEATURE_XFORWARD_DOMAIN (1<<11)
215 #define SMTP_FEATURE_BEST_MX (1<<12)
216 #define SMTP_FEATURE_RSET_REJECTED (1<<13)
217 #define SMTP_FEATURE_FROM_CACHE (1<<14)
218 #define SMTP_FEATURE_DSN (1<<15)
219 #define SMTP_FEATURE_PIX_NO_ESMTP (1<<16)
220 #define SMTP_FEATURE_PIX_DELAY_DOTCRLF (1<<17)
221 #define SMTP_FEATURE_XFORWARD_PORT (1<<18)
222 #define SMTP_FEATURE_EARLY_TLS_MAIL_REPLY (1<<19)
223 #define SMTP_FEATURE_XFORWARD_IDENT (1<<20)
224 #define SMTP_FEATURE_SMTPUTF8 (1<<21)
229 #define SMTP_FEATURE_ENDPOINT_MASK \
230 (~(SMTP_FEATURE_BEST_MX | SMTP_FEATURE_RSET_REJECTED \
231 | SMTP_FEATURE_FROM_CACHE))
236 #define SMTP_FEATURE_DESTINATION_MASK (SMTP_FEATURE_BEST_MX)
241 #define SMTP_MISC_FLAG_LOOP_DETECT (1<<0)
242 #define SMTP_MISC_FLAG_IN_STARTTLS (1<<1)
243 #define SMTP_MISC_FLAG_FIRST_NEXTHOP (1<<2)
244 #define SMTP_MISC_FLAG_FINAL_NEXTHOP (1<<3)
245 #define SMTP_MISC_FLAG_FINAL_SERVER (1<<4)
246 #define SMTP_MISC_FLAG_CONN_LOAD (1<<5)
247 #define SMTP_MISC_FLAG_CONN_STORE (1<<6)
248 #define SMTP_MISC_FLAG_COMPLETE_SESSION (1<<7)
249 #define SMTP_MISC_FLAG_PREF_IPV6 (1<<8)
250 #define SMTP_MISC_FLAG_PREF_IPV4 (1<<9)
252 #define SMTP_MISC_FLAG_CONN_CACHE_MASK \
253 (SMTP_MISC_FLAG_CONN_LOAD | SMTP_MISC_FLAG_CONN_STORE)
258 #define SMTP_HAS_DSN(why) (STR((why)->status)[0] != 0)
259 #define SMTP_HAS_SOFT_DSN(why) (STR((why)->status)[0] == '4')
260 #define SMTP_HAS_HARD_DSN(why) (STR((why)->status)[0] == '5')
261 #define SMTP_HAS_LOOP_DSN(why) \
262 (SMTP_HAS_DSN(why) && strcmp(STR((why)->status) + 1, ".4.6") == 0)
264 #define SMTP_SET_SOFT_DSN(why) (STR((why)->status)[0] = '4')
265 #define SMTP_SET_HARD_DSN(why) (STR((why)->status)[0] = '5')
269 #define SMTP_HOST_FLAG_DNS (1<<0)
270 #define SMTP_HOST_FLAG_NATIVE (1<<1)
274 #define SMTP_DNS_INVALID (-1)
275 #define SMTP_DNS_DISABLED 0
276 #define SMTP_DNS_ENABLED 1
277 #define SMTP_DNS_DNSSEC 2
292 extern TLS_APPL_STATE *smtp_tls_ctx;
293 extern int smtp_tls_insecure_mx_policy;
330 char *sasl_mechanism_list;
341 TLS_SESS_STATE *tls_context;
359 #define SMTP_HNAME(rr) (var_smtp_cname_overr ? (rr)->rname : (rr)->qname)
420 #define THIS_SESSION_IS_CACHED \
421 (!THIS_SESSION_IS_FORBIDDEN && session->expire_time > 0)
423 #define THIS_SESSION_IS_EXPIRED \
424 (THIS_SESSION_IS_CACHED \
425 && (session->expire_time < vstream_ftime(session->stream) \
426 || (var_smtp_reuse_count > 0 \
427 && session->reuse_count >= var_smtp_reuse_count)))
429 #define THIS_SESSION_IS_THROTTLED \
430 (!THIS_SESSION_IS_FORBIDDEN && session->expire_time < 0)
432 #define THIS_SESSION_IS_FORBIDDEN \
433 (session->forbidden != 0)
437 #define DONT_CACHE_THIS_SESSION \
438 (session->expire_time = 0)
440 #define DONT_CACHE_THROTTLED_SESSION \
441 (session->expire_time = -1)
443 #define DONT_USE_FORBIDDEN_SESSION \
444 (session->forbidden = 1)
448 #define USE_NEWBORN_SESSION \
449 (session->forbidden = 0)
451 #define CACHE_THIS_SESSION_UNTIL(when) \
452 (session->expire_time = (when))
459 #define HAVE_SASL_CREDENTIALS \
460 (var_smtp_sasl_enable \
461 && *var_smtp_sasl_passwd \
462 && smtp_sasl_passwd_lookup(session))
464 #define HAVE_SASL_CREDENTIALS (0)
467 #define PREACTIVE_DELAY \
468 (session->state->request->msg_stats.active_arrival.tv_sec - \
469 session->state->request->msg_stats.incoming_arrival.tv_sec)
471 #define PLAINTEXT_FALLBACK_OK_AFTER_STARTTLS_FAILURE \
472 (session->tls_context == 0 \
473 && state->tls->level == TLS_LEV_MAY \
474 && PREACTIVE_DELAY >= var_min_backoff_time \
475 && !HAVE_SASL_CREDENTIALS)
477 #define PLAINTEXT_FALLBACK_OK_AFTER_TLS_SESSION_FAILURE \
478 (session->tls_context != 0 \
479 && SMTP_RCPT_LEFT(state) > SMTP_RCPT_MARK_COUNT(state) \
480 && state->tls->level == TLS_LEV_MAY \
481 && PREACTIVE_DELAY >= var_min_backoff_time \
482 && !HAVE_SASL_CREDENTIALS)
489 #define RETRY_AS_PLAINTEXT do { \
490 session->tls_retry_plain = 1; \
491 state->misc_flags &= ~SMTP_MISC_FLAG_FINAL_SERVER; \
512 #define SMTP_RESP_FAKE(resp, _dsn) \
514 (resp)->dsn = (_dsn), \
515 (resp)->str = DSN_BY_LOCAL_MTA, \
518 #define DSN_BY_LOCAL_MTA ((char *) 0)
520 #define SMTP_RESP_SET_DSN(resp, _dsn) do { \
521 vstring_strcpy((resp)->dsn_buf, (_dsn)); \
522 (resp)->dsn = STR((resp)->dsn_buf); \
544 #define SMTP_RCPT_STATE_KEEP 1
545 #define SMTP_RCPT_STATE_DROP 2
546 #define SMTP_RCPT_INIT(state) do { \
547 (state)->rcpt_drop = (state)->rcpt_keep = 0; \
548 (state)->rcpt_left = state->request->rcpt_list.len; \
551 #define SMTP_RCPT_DROP(state, rcpt) do { \
552 (rcpt)->u.status = SMTP_RCPT_STATE_DROP; (state)->rcpt_drop++; \
555 #define SMTP_RCPT_KEEP(state, rcpt) do { \
556 (rcpt)->u.status = SMTP_RCPT_STATE_KEEP; (state)->rcpt_keep++; \
559 #define SMTP_RCPT_ISMARKED(rcpt) ((rcpt)->u.status != 0)
561 #define SMTP_RCPT_LEFT(state) (state)->rcpt_left
563 #define SMTP_RCPT_MARK_COUNT(state) ((state)->rcpt_drop + (state)->rcpt_keep)
571 #define SMTP_THROTTLE 1
572 #define SMTP_NOTHROTTLE 0
577 const
char *, SMTP_RESP *,
581 #define smtp_site_fail(state, mta, resp, ...) \
582 smtp_misc_fail((state), SMTP_THROTTLE, (mta), (resp), __VA_ARGS__)
583 #define smtp_mesg_fail(state, mta, resp, ...) \
584 smtp_misc_fail((state), SMTP_NOTHROTTLE, (mta), (resp), __VA_ARGS__)
610 #define SMTP_KEY_FLAG_SERVICE (1<<0)
611 #define SMTP_KEY_FLAG_SENDER (1<<1)
612 #define SMTP_KEY_FLAG_REQ_NEXTHOP (1<<2)
613 #define SMTP_KEY_FLAG_NEXTHOP (1<<3)
614 #define SMTP_KEY_FLAG_HOSTNAME (1<<4)
615 #define SMTP_KEY_FLAG_ADDR (1<<5)
616 #define SMTP_KEY_FLAG_PORT (1<<6)
618 #define SMTP_KEY_MASK_ALL \
619 (SMTP_KEY_FLAG_SERVICE | SMTP_KEY_FLAG_SENDER | \
620 SMTP_KEY_FLAG_REQ_NEXTHOP | \
621 SMTP_KEY_FLAG_NEXTHOP | SMTP_KEY_FLAG_HOSTNAME | \
622 SMTP_KEY_FLAG_ADDR | SMTP_KEY_FLAG_PORT)
631 #define COND_SASL_SMTP_KEY_FLAG_SENDER \
632 ((var_smtp_sender_auth && *var_smtp_sasl_passwd) ? \
633 SMTP_KEY_FLAG_SENDER : 0)
635 #define COND_SASL_SMTP_KEY_FLAG_NEXTHOP \
636 (*var_smtp_sasl_passwd ? SMTP_KEY_FLAG_NEXTHOP : 0)
638 #define COND_SASL_SMTP_KEY_FLAG_HOSTNAME \
639 (*var_smtp_sasl_passwd ? SMTP_KEY_FLAG_HOSTNAME : 0)
648 #define SMTP_KEY_MASK_SCACHE_DEST_LABEL \
649 (SMTP_KEY_FLAG_SERVICE | COND_SASL_SMTP_KEY_FLAG_SENDER \
650 | SMTP_KEY_FLAG_REQ_NEXTHOP)
658 #define SMTP_KEY_MASK_SCACHE_ENDP_LABEL \
659 (SMTP_KEY_FLAG_SERVICE | COND_SASL_SMTP_KEY_FLAG_SENDER \
660 | COND_SASL_SMTP_KEY_FLAG_NEXTHOP | COND_SASL_SMTP_KEY_FLAG_HOSTNAME \
661 | SMTP_KEY_FLAG_ADDR | SMTP_KEY_FLAG_PORT)
666 #define STR(s) vstring_str(s)
667 #define LEN(s) VSTRING_LEN(s)
671 #define VAR_LMTP_SMTP(x) (smtp_mode ? VAR_SMTP_##x : VAR_LMTP_##x)
672 #define LMTP_SMTP_SUFFIX(x) (smtp_mode ? x##_SMTP : x##_LMTP)
STRING_LIST * smtp_cache_dest
SMTP_SESSION * smtp_session_activate(int, SMTP_ITERATOR *, VSTRING *, VSTRING *)
SMTP_ITERATOR iterator[1]
struct SMTP_STATE * parent
struct SMTP_SESSION * session
int smtp_map11_external(VSTRING *, MAPS *, int)
VSTRING * request_nexthop
unsigned smtp_dns_res_opt
int smtp_helo(SMTP_STATE *)
DELIVER_REQUEST * request
int smtp_rset(SMTP_STATE *)
int smtp_sess_fail(SMTP_STATE *)
SMTP_SESSION * smtp_session_alloc(VSTREAM *, SMTP_ITERATOR *, time_t, int)
MAPS * smtp_ehlo_dis_maps
void smtp_chat_init(SMTP_SESSION *)
void smtp_chat_notify(SMTP_SESSION *)
HBC_CALL_BACKS smtp_hbc_callbacks[]
int smtp_map11_tree(TOK822 *, MAPS *, int)
struct SMTP_RESP SMTP_RESP
int smtp_misc_fail(SMTP_STATE *state, int throttle, const char *mta_name, SMTP_RESP *resp, const char *format,...)
void smtp_vrfy_init(void)
struct SMTP_STATE SMTP_STATE
SMTP_STATE * smtp_state_alloc(void)
struct SMTP_ITERATOR SMTP_ITERATOR
void smtp_state_free(SMTP_STATE *)
HBC_CHECKS * smtp_header_checks
int smtp_map11_internal(VSTRING *, MAPS *, int)
const char * smtp_unalias_name(const char *)
int smtp_xfer(SMTP_STATE *)
struct MIME_STATE * mime_state
void smtp_session_new_stream(SMTP_SESSION *, VSTREAM *, time_t, int)
void PRINTFLIKE(2, 3) smtp_chat_cmd(SMTP_SESSION *
VSTRING * smtp_unalias_addr(VSTRING *, const char *)
int const char SMTP_RESP const char void RECIPIENT const char SMTP_RESP const char int smtp_stream_except(SMTP_STATE *, int, const char *)
void smtp_rcpt_cleanup(SMTP_STATE *)
void smtp_chat_cmd(SMTP_SESSION *session, const char *fmt,...)
HBC_CHECKS * smtp_body_checks
void const char DICT * smtp_chat_resp_filter
int smtp_connect(SMTP_STATE *)
SMTP_RESP * smtp_chat_resp(SMTP_SESSION *)
int smtp_session_passivate(SMTP_SESSION *, VSTRING *, VSTRING *)
int smtp_sess_plaintext_ok(SMTP_ITERATOR *, int)
void smtp_rcpt_done(SMTP_STATE *, SMTP_RESP *, RECIPIENT *)
void smtp_chat_reset(SMTP_SESSION *)
void smtp_rcpt_fail(SMTP_STATE *state, RECIPIENT *rcpt, const char *mta_name, SMTP_RESP *resp, const char *format,...)
void smtp_session_free(SMTP_SESSION *)
int smtp_host_lookup_mask
char * smtp_key_prefix(VSTRING *, const char *, SMTP_ITERATOR *, int)
int smtp_quit(SMTP_STATE *)
struct SMTP_SESSION SMTP_SESSION