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