1 /************************************************* 2 * Exim - an Internet mail transport agent * 3 *************************************************/ 4 5 /* Copyright (c) University of Cambridge 1995 - 2018 */ 6 /* Copyright (c) The Exim Maintainers 2020 */ 7 /* See the file NOTICE for conditions of use and distribution. */ 8 9 #define DELIVER_BUFFER_SIZE 4096 10 11 #define PENDING 256 12 #define PENDING_DEFER (PENDING + DEFER) 13 #define PENDING_OK (PENDING + OK) 14 15 16 #ifndef DISABLE_TLS 17 /* Flags structure for validity of TLS configuration */ 18 19 typedef struct { 20 BOOL conn_certs:1; /* certificates etc. loaded */ 21 BOOL cabundle:1; /* CA certificates loaded */ 22 BOOL crl:1; /* CRL loaded */ 23 BOOL pri_string:1; /* cipher priority-string cache loaded */ 24 BOOL dh:1; /* Diffie-Helman params loaded */ 25 BOOL ecdh:1; /* EC Diffie-Helman params loaded */ 26 27 BOOL ca_rdn_emulate:1; /* do not advertise usable-cert list */ 28 BOOL ocsp_hook:1; /* need hshake callback on session */ 29 30 void * libdata0; /* library-dependent preloaded data */ 31 void * libdata1; /* library-dependent preloaded data */ 32 } exim_tlslib_state; 33 #endif 34 35 36 /* Private structure for the private options and other private data. */ 37 38 typedef struct { 39 uschar *hosts; 40 uschar *fallback_hosts; 41 host_item *hostlist; 42 host_item *fallback_hostlist; 43 uschar *authenticated_sender; 44 uschar *helo_data; 45 uschar *interface; 46 uschar *port; 47 uschar *protocol; 48 uschar *dscp; 49 uschar *serialize_hosts; 50 uschar *hosts_try_auth; 51 uschar *hosts_require_alpn; 52 uschar *hosts_require_auth; 53 uschar *hosts_try_chunking; 54 #ifdef SUPPORT_DANE 55 uschar *hosts_try_dane; 56 uschar *hosts_require_dane; 57 uschar *dane_require_tls_ciphers; 58 #endif 59 uschar *hosts_try_fastopen; 60 #ifndef DISABLE_PRDR 61 uschar *hosts_try_prdr; 62 #endif 63 #ifndef DISABLE_OCSP 64 uschar *hosts_request_ocsp; 65 uschar *hosts_require_ocsp; 66 #endif 67 uschar *hosts_require_tls; 68 uschar *hosts_avoid_tls; 69 uschar *hosts_verify_avoid_tls; 70 uschar *hosts_avoid_pipelining; 71 #ifndef DISABLE_PIPE_CONNECT 72 uschar *hosts_pipe_connect; 73 #endif 74 uschar *hosts_avoid_esmtp; 75 #ifndef DISABLE_TLS 76 uschar *hosts_nopass_tls; 77 uschar *hosts_noproxy_tls; 78 #endif 79 int command_timeout; 80 int connect_timeout; 81 int data_timeout; 82 int final_timeout; 83 int size_addition; 84 int hosts_max_try; 85 int hosts_max_try_hardlimit; 86 int message_linelength_limit; 87 BOOL address_retry_include_sender; 88 BOOL allow_localhost; 89 BOOL authenticated_sender_force; 90 BOOL gethostbyname; 91 BOOL dns_qualify_single; 92 BOOL dns_search_parents; 93 dnssec_domains dnssec; 94 BOOL delay_after_cutoff; 95 BOOL hosts_override; 96 BOOL hosts_randomize; 97 BOOL keepalive; 98 BOOL lmtp_ignore_quota; 99 uschar *expand_retry_include_ip_address; 100 BOOL retry_include_ip_address; 101 #ifdef SUPPORT_SOCKS 102 uschar *socks_proxy; 103 #endif 104 #ifndef DISABLE_TLS 105 uschar *tls_alpn; 106 uschar *tls_certificate; 107 uschar *tls_crl; 108 uschar *tls_privatekey; 109 uschar *tls_require_ciphers; 110 # ifndef DISABLE_TLS_RESUME 111 uschar *tls_resumption_hosts; 112 # endif 113 const uschar *tls_sni; 114 uschar *tls_verify_certificates; 115 int tls_dh_min_bits; 116 BOOL tls_tempfail_tryclear; 117 uschar *tls_verify_hosts; 118 uschar *tls_try_verify_hosts; 119 uschar *tls_verify_cert_hostnames; 120 #endif 121 #ifdef SUPPORT_I18N 122 uschar *utf8_downconvert; 123 #endif 124 #ifndef DISABLE_DKIM 125 struct ob_dkim dkim; 126 #endif 127 #ifdef EXPERIMENTAL_ARC 128 uschar *arc_sign; 129 #endif 130 #ifndef DISABLE_TLS 131 exim_tlslib_state tls_preload; 132 #endif 133 } smtp_transport_options_block; 134 135 #define SOB (smtp_transport_options_block *) 136 137 138 /* smtp connect context */ 139 typedef struct { 140 uschar * from_addr; 141 address_item * addrlist; 142 143 smtp_connect_args conn_args; 144 int port; 145 146 BOOL verify:1; 147 BOOL lmtp:1; 148 BOOL smtps:1; 149 BOOL ok:1; 150 BOOL setting_up:1; 151 #ifndef DISABLE_PIPE_CONNECT 152 BOOL early_pipe_ok:1; 153 BOOL early_pipe_active:1; 154 #endif 155 BOOL esmtp:1; 156 BOOL esmtp_sent:1; 157 BOOL pipelining_used:1; 158 #ifndef DISABLE_PRDR 159 BOOL prdr_active:1; 160 #endif 161 #ifdef SUPPORT_I18N 162 BOOL utf8_needed:1; 163 #endif 164 BOOL dsn_all_lasthop:1; 165 #if !defined(DISABLE_TLS) && defined(SUPPORT_DANE) 166 BOOL dane_required:1; 167 #endif 168 #ifndef DISABLE_PIPE_CONNECT 169 BOOL pending_BANNER:1; 170 BOOL pending_EHLO:1; 171 #endif 172 BOOL pending_MAIL:1; 173 BOOL pending_BDAT:1; 174 BOOL RCPT_452:1; 175 BOOL good_RCPT:1; 176 #ifdef EXPERIMENTAL_ESMTP_LIMITS 177 BOOL single_rcpt_domain:1; 178 #endif 179 BOOL completed_addr:1; 180 BOOL send_rset:1; 181 BOOL send_quit:1; 182 BOOL send_tlsclose:1; 183 184 unsigned peer_offered; 185 #ifdef EXPERIMENTAL_ESMTP_LIMITS 186 unsigned peer_limit_mail; 187 unsigned peer_limit_rcpt; 188 unsigned peer_limit_rcptdom; 189 #endif 190 191 unsigned max_mail; 192 int max_rcpt; 193 int cmd_count; 194 195 unsigned avoid_option; 196 uschar * igquotstr; 197 uschar * helo_data; 198 #ifdef EXPERIMENTAL_DSN_INFO 199 uschar * smtp_greeting; 200 uschar * helo_response; 201 #endif 202 #ifndef DISABLE_PIPE_CONNECT 203 /* Info about the EHLO response stored to / retrieved from cache. When 204 operating early-pipe, we use the cached values. For each of plaintext and 205 crypted we store bitmaps for ESMTP features and AUTH methods. If the LIMITS 206 extension is built and usable them at least one of the limits values cached 207 is nonzero, and we use the values to constrain the connection. */ 208 ehlo_resp_precis ehlo_resp; 209 #endif 210 211 struct timeval delivery_start; 212 address_item * first_addr; 213 address_item * next_addr; 214 address_item * sync_addr; 215 216 client_conn_ctx cctx; 217 smtp_inblock inblock; 218 smtp_outblock outblock; 219 uschar buffer[DELIVER_BUFFER_SIZE]; 220 uschar inbuffer[4096]; 221 uschar outbuffer[4096]; 222 } smtp_context; 223 224 extern int smtp_setup_conn(smtp_context *, BOOL); 225 extern int smtp_write_mail_and_rcpt_cmds(smtp_context *, int *); 226 extern int smtp_reap_early_pipe(smtp_context *, int *); 227 228 229 /* Data for reading the private options. */ 230 231 extern optionlist smtp_transport_options[]; 232 extern int smtp_transport_options_count; 233 234 /* Block containing default values. */ 235 236 extern smtp_transport_options_block smtp_transport_option_defaults; 237 238 /* The main, init, and closedown entry points for the transport */ 239 240 extern BOOL smtp_transport_entry(transport_instance *, address_item *); 241 extern void smtp_transport_init(transport_instance *); 242 extern void smtp_transport_closedown(transport_instance *); 243 244 245 246 #ifdef SUPPORT_SOCKS 247 extern int socks_sock_connect(host_item *, int, int, uschar *, 248 transport_instance *, int); 249 #endif 250 251 /* End of transports/smtp.h */ 252