2ed6cfd51fc9270897cca362d9e91de4cea746ec
[exim.git] / src / src / transports / smtp.h
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 - 2021 */
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 */