smtpd.h revision 1.299
1/*	$OpenBSD: smtpd.h,v 1.299 2012/06/14 21:56:13 gilles Exp $	*/
2
3/*
4 * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef nitems
21#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
22#endif
23
24#include "filter_api.h"
25#include "ioev.h"
26#include "iobuf.h"
27
28#define IMSG_SIZE_CHECK(p) do {					\
29		if (IMSG_DATA_SIZE(&imsg) != sizeof(*p))	\
30			fatalx("bad length imsg received");	\
31	} while (0)
32#define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
33
34
35#define CONF_FILE		 "/etc/mail/smtpd.conf"
36#define MAX_LISTEN		 16
37#define PROC_COUNT		 9
38#define MAX_NAME_SIZE		 64
39
40#define MAX_HOPS_COUNT		 100
41
42#define MAX_TAG_SIZE		 32
43/* SYNC WITH filter.h		  */
44//#define MAX_LINE_SIZE		 1024
45//#define MAX_LOCALPART_SIZE	 128
46//#define MAX_DOMAINPART_SIZE	 MAXHOSTNAMELEN
47
48/* return and forward path size */
49#define	MAX_FILTER_NAME		 32
50#define MAX_PATH_SIZE		 256
51#define MAX_RULEBUFFER_LEN	 256
52
53#define SMTPD_QUEUE_INTERVAL	 (15 * 60)
54#define SMTPD_QUEUE_MAXINTERVAL	 (4 * 60 * 60)
55#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
56#define SMTPD_USER		 "_smtpd"
57#define SMTPD_FILTER_USER      	 "_smtpmfa"
58#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
59#define SMTPD_BANNER		 "220 %s ESMTP OpenSMTPD"
60#define SMTPD_SESSION_TIMEOUT	 300
61#define SMTPD_BACKLOG		 5
62
63#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
64
65#define	DIRHASH_BUCKETS		 4096
66
67#define PATH_SPOOL		"/var/spool/smtpd"
68#define PATH_OFFLINE		"/offline"
69#define PATH_PURGE		"/purge"
70
71/* number of MX records to lookup */
72#define MAX_MX_COUNT		10
73
74/* max response delay under flood conditions */
75#define MAX_RESPONSE_DELAY	60
76
77/* how many responses per state are undelayed */
78#define FAST_RESPONSES		2
79
80/* max len of any smtp line */
81#define	SMTP_LINE_MAX		1024
82
83#define F_STARTTLS		 0x01
84#define F_SMTPS			 0x02
85#define F_AUTH			 0x04
86#define F_SSL			(F_SMTPS|F_STARTTLS)
87
88#define F_SCERT			0x01
89#define F_CCERT			0x02
90
91#define ADVERTISE_TLS(s) \
92	((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE))
93
94#define ADVERTISE_AUTH(s) \
95	((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \
96	 !((s)->s_flags & F_AUTHENTICATED))
97
98
99
100typedef u_int32_t	objid_t;
101
102struct netaddr {
103	struct sockaddr_storage ss;
104	int bits;
105};
106
107struct relayhost {
108	u_int8_t flags;
109	char hostname[MAXHOSTNAMELEN];
110	u_int16_t port;
111	char cert[PATH_MAX];
112	char authmap[MAX_PATH_SIZE];
113};
114
115enum imsg_type {
116	IMSG_NONE,
117	IMSG_CTL_OK,		/* answer to smtpctl requests */
118	IMSG_CTL_FAIL,
119	IMSG_CTL_SHUTDOWN,
120	IMSG_CTL_VERBOSE,
121	IMSG_CONF_START,
122	IMSG_CONF_SSL,
123	IMSG_CONF_LISTENER,
124	IMSG_CONF_MAP,
125	IMSG_CONF_MAP_CONTENT,
126	IMSG_CONF_RULE,
127	IMSG_CONF_RULE_SOURCE,
128	IMSG_CONF_FILTER,
129	IMSG_CONF_END,
130	IMSG_LKA_MAIL,
131	IMSG_LKA_RCPT,
132	IMSG_LKA_SECRET,
133	IMSG_LKA_RULEMATCH,
134	IMSG_MDA_SESS_NEW,
135	IMSG_MDA_DONE,
136
137	IMSG_MFA_CONNECT,
138 	IMSG_MFA_HELO,
139 	IMSG_MFA_MAIL,
140 	IMSG_MFA_RCPT,
141 	IMSG_MFA_DATALINE,
142	IMSG_MFA_QUIT,
143	IMSG_MFA_CLOSE,
144	IMSG_MFA_RSET,
145
146	IMSG_QUEUE_CREATE_MESSAGE,
147	IMSG_QUEUE_SUBMIT_ENVELOPE,
148	IMSG_QUEUE_COMMIT_ENVELOPES,
149	IMSG_QUEUE_REMOVE_MESSAGE,
150	IMSG_QUEUE_COMMIT_MESSAGE,
151	IMSG_QUEUE_TEMPFAIL,
152	IMSG_QUEUE_PAUSE_MDA,
153	IMSG_QUEUE_PAUSE_MTA,
154	IMSG_QUEUE_RESUME_MDA,
155	IMSG_QUEUE_RESUME_MTA,
156
157	IMSG_QUEUE_DELIVERY_OK,
158	IMSG_QUEUE_DELIVERY_TEMPFAIL,
159	IMSG_QUEUE_DELIVERY_PERMFAIL,
160	IMSG_QUEUE_MESSAGE_FD,
161	IMSG_QUEUE_MESSAGE_FILE,
162	IMSG_QUEUE_SCHEDULE,
163	IMSG_QUEUE_REMOVE,
164
165	IMSG_RUNNER_REMOVE,
166	IMSG_RUNNER_SCHEDULE,
167
168	IMSG_BATCH_CREATE,
169	IMSG_BATCH_APPEND,
170	IMSG_BATCH_CLOSE,
171	IMSG_BATCH_DONE,
172
173	IMSG_PARENT_FORWARD_OPEN,
174	IMSG_PARENT_FORK_MDA,
175
176	IMSG_PARENT_AUTHENTICATE,
177	IMSG_PARENT_SEND_CONFIG,
178
179	IMSG_STATS,
180	IMSG_SMTP_ENQUEUE,
181	IMSG_SMTP_PAUSE,
182	IMSG_SMTP_RESUME,
183
184	IMSG_DNS_HOST,
185	IMSG_DNS_HOST_END,
186	IMSG_DNS_MX,
187	IMSG_DNS_PTR
188};
189
190enum blockmodes {
191	BM_NORMAL,
192	BM_NONBLOCK
193};
194
195struct imsgev {
196	struct imsgbuf		 ibuf;
197	void			(*handler)(int, short, void *);
198	struct event		 ev;
199	void			*data;
200	int			 proc;
201	short			 events;
202};
203
204struct ctl_conn {
205	TAILQ_ENTRY(ctl_conn)	 entry;
206	u_int8_t		 flags;
207#define CTL_CONN_NOTIFY		 0x01
208	struct imsgev		 iev;
209};
210TAILQ_HEAD(ctl_connlist, ctl_conn);
211
212struct ctl_id {
213	objid_t		 id;
214	char		 name[MAX_NAME_SIZE];
215};
216
217enum smtp_proc_type {
218	PROC_PARENT = 0,
219	PROC_SMTP,
220	PROC_MFA,
221	PROC_LKA,
222	PROC_QUEUE,
223	PROC_MDA,
224	PROC_MTA,
225	PROC_CONTROL,
226	PROC_RUNNER,
227} smtpd_process;
228
229struct peer {
230	enum smtp_proc_type	 id;
231	void			(*cb)(int, short, void *);
232};
233
234enum map_src {
235	S_NONE,
236	S_PLAIN,
237	S_DB
238};
239
240enum map_kind {
241	K_NONE,
242	K_ALIAS,
243	K_VIRTUAL,
244	K_CREDENTIALS,
245	K_NETADDR
246};
247
248enum mapel_type {
249	ME_STRING,
250	ME_NET,
251	ME_NETMASK
252};
253
254struct mapel {
255	TAILQ_ENTRY(mapel)		 me_entry;
256	union mapel_data {
257		char			 med_string[MAX_LINE_SIZE];
258	}				 me_key;
259	union mapel_data		 me_val;
260};
261
262struct map {
263	TAILQ_ENTRY(map)		 m_entry;
264	char				 m_name[MAX_LINE_SIZE];
265	objid_t				 m_id;
266	enum mapel_type			 m_eltype;
267	enum map_src			 m_src;
268	char				 m_config[MAXPATHLEN];
269	TAILQ_HEAD(mapel_list, mapel)	 m_contents;
270};
271
272
273struct map_backend {
274	void *(*open)(struct map *);
275	void (*close)(void *);
276	void *(*lookup)(void *, char *, enum map_kind);
277	int  (*compare)(void *, char *, enum map_kind, int (*)(char *, char *));
278};
279
280
281enum cond_type {
282	C_ALL,
283	C_NET,
284	C_DOM,
285	C_VDOM
286};
287
288struct cond {
289	TAILQ_ENTRY(cond)		 c_entry;
290	objid_t				 c_map;
291	enum cond_type			 c_type;
292};
293
294enum action_type {
295	A_INVALID,
296	A_RELAY,
297	A_RELAYVIA,
298	A_MAILDIR,
299	A_MBOX,
300	A_FILENAME,
301	A_MDA
302};
303
304#define IS_MAILBOX(x)	((x).r_action == A_MAILDIR || (x).r_action == A_MBOX || (x).r_action == A_FILENAME)
305#define IS_RELAY(x)	((x).r_action == A_RELAY || (x).r_action == A_RELAYVIA)
306#define IS_EXT(x)	((x).r_action == A_EXT)
307
308struct rule {
309	TAILQ_ENTRY(rule)		 r_entry;
310	char				 r_tag[MAX_TAG_SIZE];
311	int				 r_accept;
312	struct map			*r_sources;
313	struct cond			 r_condition;
314	enum action_type		 r_action;
315	union rule_dest {
316		char			 buffer[MAX_RULEBUFFER_LEN];
317		struct relayhost       	 relayhost;
318	}				 r_value;
319
320	char				*r_user;
321	struct mailaddr			*r_as;
322	objid_t				 r_amap;
323	time_t				 r_qexpire;
324};
325
326struct mailaddr {
327	char	user[MAX_LOCALPART_SIZE];
328	char	domain[MAX_DOMAINPART_SIZE];
329};
330
331enum delivery_type {
332	D_INVALID = 0,
333	D_MDA,
334	D_MTA,
335	D_BOUNCE
336};
337
338enum delivery_status {
339	DS_PERMFAILURE	= 0x1,
340	DS_TEMPFAILURE	= 0x2,
341};
342
343enum delivery_flags {
344	DF_AUTHENTICATED	= 0x1,
345	DF_ENQUEUED		= 0x2,
346	DF_BOUNCE		= 0x4,
347	DF_INTERNAL		= 0x8 /* internal expansion forward */
348};
349
350union delivery_data {
351	char user[MAXLOGNAME];
352	char buffer[MAX_RULEBUFFER_LEN];
353	struct mailaddr mailaddr;
354};
355
356struct delivery_mda {
357	enum action_type	method;
358	union delivery_data	to;
359	char			as_user[MAXLOGNAME];
360};
361
362struct delivery_mta {
363	struct relayhost relay;
364};
365
366enum expand_type {
367	EXPAND_INVALID,
368	EXPAND_USERNAME,
369	EXPAND_FILENAME,
370	EXPAND_FILTER,
371	EXPAND_INCLUDE,
372	EXPAND_ADDRESS
373};
374
375enum expand_flags {
376	F_EXPAND_NONE,
377	F_EXPAND_DONE
378};
379
380struct expandnode {
381	RB_ENTRY(expandnode)	entry;
382	size_t			refcnt;
383	enum expand_flags      	flags;
384	enum expand_type       	type;
385	char			as_user[MAXLOGNAME];
386	union delivery_data    	u;
387};
388
389RB_HEAD(expandtree, expandnode);
390
391#define	SMTPD_ENVELOPE_VERSION		1
392struct envelope {
393	TAILQ_ENTRY(envelope)		entry;
394
395	char				tag[MAX_TAG_SIZE];
396	struct rule			rule;
397
398	u_int64_t			session_id;
399	u_int64_t			batch_id;
400
401	u_int32_t			version;
402	u_int64_t			id;
403	enum delivery_type		type;
404
405	char				helo[MAXHOSTNAMELEN];
406	char				hostname[MAXHOSTNAMELEN];
407	char				errorline[MAX_LINE_SIZE + 1];
408	struct sockaddr_storage		ss;
409
410	struct mailaddr			sender;
411	struct mailaddr			rcpt;
412	struct mailaddr			dest;
413
414	union delivery_method {
415		struct delivery_mda	mda;
416		struct delivery_mta	mta;
417	} agent;
418
419	time_t				 creation;
420	time_t				 lasttry;
421	time_t				 expire;
422	u_int8_t			 retry;
423	enum delivery_flags		 flags;
424};
425TAILQ_HEAD(deliverylist, envelope);
426
427enum envelope_field {
428	EVP_VERSION,
429	EVP_ID,
430	EVP_MSGID,
431	EVP_TYPE,
432	EVP_HELO,
433	EVP_HOSTNAME,
434	EVP_ERRORLINE,
435	EVP_SOCKADDR,
436	EVP_SENDER,
437	EVP_RCPT,
438	EVP_DEST,
439	EVP_CTIME,
440	EVP_EXPIRE,
441	EVP_RETRY,
442	EVP_LASTTRY,
443	EVP_FLAGS,
444	EVP_MDA_METHOD,
445	EVP_MDA_BUFFER,
446	EVP_MDA_USER,
447	EVP_MTA_RELAY_HOST,
448	EVP_MTA_RELAY_PORT,
449	EVP_MTA_RELAY_FLAGS,
450	EVP_MTA_RELAY_CERT,
451	EVP_MTA_RELAY_AUTHMAP
452};
453
454
455enum child_type {
456	CHILD_INVALID,
457	CHILD_DAEMON,
458	CHILD_MDA,
459	CHILD_ENQUEUE_OFFLINE,
460};
461
462struct child {
463	SPLAY_ENTRY(child)	 entry;
464	pid_t			 pid;
465	enum child_type		 type;
466	enum smtp_proc_type	 title;
467	int			 mda_out;
468	u_int32_t		 mda_id;
469	char			*path;
470};
471
472enum session_state {
473	S_NEW = 0,
474	S_CONNECTED,
475	S_INIT,
476	S_GREETED,
477	S_TLS,
478	S_AUTH_INIT,
479	S_AUTH_USERNAME,
480	S_AUTH_PASSWORD,
481	S_AUTH_FINALIZE,
482	S_RSET,
483	S_HELO,
484	S_MAIL_MFA,
485	S_MAIL_QUEUE,
486	S_MAIL,
487	S_RCPT_MFA,
488	S_RCPT,
489	S_DATA,
490	S_DATA_QUEUE,
491	S_DATACONTENT,
492	S_DONE,
493	S_QUIT,
494	S_CLOSE
495};
496#define STATE_COUNT	22
497
498struct ssl {
499	SPLAY_ENTRY(ssl)	 ssl_nodes;
500	char			 ssl_name[PATH_MAX];
501	char			*ssl_ca;
502	off_t			 ssl_ca_len;
503	char			*ssl_cert;
504	off_t			 ssl_cert_len;
505	char			*ssl_key;
506	off_t			 ssl_key_len;
507	char			*ssl_dhparams;
508	off_t			 ssl_dhparams_len;
509	u_int8_t		 flags;
510};
511
512struct listener {
513	u_int8_t		 flags;
514	int			 fd;
515	struct sockaddr_storage	 ss;
516	in_port_t		 port;
517	struct timeval		 timeout;
518	struct event		 ev;
519	char			 ssl_cert_name[PATH_MAX];
520	struct ssl		*ssl;
521	void			*ssl_ctx;
522	char			 tag[MAX_TAG_SIZE];
523	TAILQ_ENTRY(listener)	 entry;
524};
525
526struct auth {
527	u_int64_t	 id;
528	char		 user[MAXLOGNAME];
529	char		 pass[MAX_LINE_SIZE + 1];
530	int		 success;
531};
532
533enum session_flags {
534	F_EHLO		= 0x01,
535	F_8BITMIME	= 0x02,
536	F_SECURE	= 0x04,
537	F_AUTHENTICATED	= 0x08,
538	F_WAITIMSG	= 0x10,
539	F_ZOMBIE	= 0x20,
540};
541
542struct session {
543	SPLAY_ENTRY(session)		 s_nodes;
544	u_int64_t			 s_id;
545
546	struct iobuf			 s_iobuf;
547	struct io			 s_io;
548
549	enum session_flags		 s_flags;
550	enum session_state		 s_state;
551	struct sockaddr_storage		 s_ss;
552	char				 s_hostname[MAXHOSTNAMELEN];
553	struct event			 s_ev;
554	struct listener			*s_l;
555	void				*s_ssl;
556	struct timeval			 s_tv;
557	struct envelope			 s_msg;
558	short				 s_nresp[STATE_COUNT];
559	size_t				 rcptcount;
560	long				 s_datalen;
561
562	struct auth			 s_auth;
563	int				 s_dstatus;
564
565	FILE				*datafp;
566};
567
568
569struct smtpd {
570	char					 sc_conffile[MAXPATHLEN];
571	size_t					 sc_maxsize;
572
573#define SMTPD_OPT_VERBOSE			 0x00000001
574#define SMTPD_OPT_NOACTION			 0x00000002
575	u_int32_t				 sc_opts;
576#define SMTPD_CONFIGURING			 0x00000001
577#define SMTPD_EXITING				 0x00000002
578#define SMTPD_MDA_PAUSED		       	 0x00000004
579#define SMTPD_MTA_PAUSED		       	 0x00000008
580#define SMTPD_SMTP_PAUSED		       	 0x00000010
581#define SMTPD_MDA_BUSY			       	 0x00000020
582#define SMTPD_MTA_BUSY			       	 0x00000040
583#define SMTPD_BOUNCE_BUSY      		       	 0x00000080
584	u_int32_t				 sc_flags;
585	struct timeval				 sc_qintval;
586	int					 sc_qexpire;
587	u_int32_t				 sc_maxconn;
588	struct event				 sc_ev;
589	int					 *sc_pipes[PROC_COUNT]
590							[PROC_COUNT];
591	struct imsgev				*sc_ievs[PROC_COUNT];
592	int					 sc_instances[PROC_COUNT];
593	int					 sc_instance;
594	char					*sc_title[PROC_COUNT];
595	struct passwd				*sc_pw;
596	char					 sc_hostname[MAXHOSTNAMELEN];
597	struct queue_backend			*sc_queue;
598	struct scheduler_backend		*sc_scheduler;
599
600	TAILQ_HEAD(filterlist, filter)		*sc_filters;
601
602	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
603	TAILQ_HEAD(maplist, map)		*sc_maps, *sc_maps_reload;
604	TAILQ_HEAD(rulelist, rule)		*sc_rules, *sc_rules_reload;
605	SPLAY_HEAD(sessiontree, session)	 sc_sessions;
606	SPLAY_HEAD(ssltree, ssl)		*sc_ssl;
607	SPLAY_HEAD(childtree, child)		 children;
608	SPLAY_HEAD(lkatree, lka_session)	 lka_sessions;
609	SPLAY_HEAD(mfatree, mfa_session)	 mfa_sessions;
610	SPLAY_HEAD(mtatree, mta_session)	 mta_sessions;
611	LIST_HEAD(mdalist, mda_session)		 mda_sessions;
612
613	struct stats				*stats;
614	u_int64_t				 filtermask;
615};
616
617#define	TRACE_VERBOSE	0x0001
618#define	TRACE_IMSG	0x0002
619#define	TRACE_IO	0x0004
620#define	TRACE_SMTP	0x0008
621#define	TRACE_MTA	0x0010
622#define	TRACE_BOUNCE	0x0020
623
624enum {
625	STATS_SMTP_SESSION = 0,
626	STATS_SMTP_SESSION_INET4,
627	STATS_SMTP_SESSION_INET6,
628	STATS_SMTP_SMTPS,
629	STATS_SMTP_STARTTLS,
630
631	STATS_MTA_SESSION,
632
633	STATS_MDA_SESSION,
634
635	STATS_CONTROL_SESSION,
636
637	STATS_LKA_SESSION,
638	STATS_LKA_SESSION_MX,
639	STATS_LKA_SESSION_HOST,
640	STATS_LKA_SESSION_CNAME,
641	STATS_LKA_FAILURE,
642
643	STATS_RUNNER,
644	STATS_RUNNER_BOUNCES,
645
646	STATS_QUEUE_LOCAL,
647	STATS_QUEUE_REMOTE,
648
649	STATS_RAMQUEUE_ENVELOPE,
650	STATS_RAMQUEUE_MESSAGE,
651	STATS_RAMQUEUE_BATCH,
652	STATS_RAMQUEUE_HOST,
653
654	STATS_MAX,
655};
656
657#define STAT_COUNT	0
658#define STAT_ACTIVE	1
659#define STAT_MAXACTIVE	2
660
661struct	stat_counter {
662	size_t	count;
663	size_t	active;
664	size_t	maxactive;
665};
666
667struct s_parent {
668	time_t		start;
669};
670
671struct s_session {
672	size_t		read_error;
673	size_t		read_timeout;
674	size_t		read_eof;
675	size_t		write_error;
676	size_t		write_timeout;
677	size_t		write_eof;
678	size_t		toofast;
679	size_t		tempfail;
680	size_t		linetoolong;
681	size_t		delays;
682};
683
684struct stats {
685	struct s_parent		 parent;
686	struct s_session	 mta;
687	struct s_session	 smtp;
688
689	struct stat_counter	 counters[STATS_MAX];
690};
691
692struct submit_status {
693	u_int64_t			 id;
694	int				 code;
695	union submit_path {
696		struct mailaddr		 maddr;
697		u_int32_t		 msgid;
698		u_int64_t		 evpid;
699		char			 errormsg[MAX_LINE_SIZE + 1];
700		char			 dataline[MAX_LINE_SIZE + 1];
701	}				 u;
702	enum delivery_flags		 flags;
703	struct sockaddr_storage		 ss;
704	struct envelope			 envelope;
705};
706
707struct forward_req {
708	u_int64_t			 id;
709	u_int8_t			 status;
710	char				 as_user[MAXLOGNAME];
711	struct envelope			 envelope;
712};
713
714enum dns_status {
715	DNS_OK = 0,
716	DNS_RETRY,
717	DNS_EINVAL,
718	DNS_ENONAME,
719	DNS_ENOTFOUND,
720};
721
722struct dns {
723	u_int64_t		 id;
724	char			 host[MAXHOSTNAMELEN];
725	int			 port;
726	int			 error;
727	int			 type;
728	struct imsgev		*asker;
729	struct sockaddr_storage	 ss;
730	struct dns		*next;
731};
732
733struct secret {
734	u_int64_t		 id;
735	char			 mapname[MAX_PATH_SIZE];
736	char			 host[MAXHOSTNAMELEN];
737	char			 secret[MAX_LINE_SIZE];
738};
739
740struct mda_session {
741	LIST_ENTRY(mda_session)	 entry;
742	struct envelope		 msg;
743	struct msgbuf		 w;
744	struct event		 ev;
745	u_int32_t		 id;
746	FILE			*datafp;
747};
748
749struct deliver {
750	char			to[PATH_MAX];
751	char			from[PATH_MAX];
752	char			user[MAXLOGNAME];
753	short			mode;
754};
755
756struct rulematch {
757	u_int64_t		 id;
758	struct submit_status	 ss;
759};
760
761enum lka_session_flags {
762	F_ERROR		= 0x1
763};
764
765struct lka_session {
766	SPLAY_ENTRY(lka_session)	 nodes;
767	u_int64_t			 id;
768
769	struct deliverylist		 deliverylist;
770	struct expandtree		 expandtree;
771
772	u_int8_t			 iterations;
773	u_int32_t			 pending;
774	enum lka_session_flags		 flags;
775	struct submit_status		 ss;
776};
777
778struct filter {
779	TAILQ_ENTRY(filter)     f_entry;
780	pid_t			pid;
781	struct event		ev;
782	struct imsgbuf		*ibuf;
783	char			name[MAX_FILTER_NAME];
784	char			path[MAXPATHLEN];
785};
786
787struct mfa_session {
788	SPLAY_ENTRY(mfa_session)	 nodes;
789	u_int64_t			 id;
790
791	enum session_state		 state;
792	struct submit_status		 ss;
793	struct filter			*filter;
794	struct filter_msg		 fm;
795};
796
797enum mta_state {
798	MTA_INIT,
799	MTA_SECRET,
800	MTA_DATA,
801	MTA_MX,
802	MTA_CONNECT,
803	MTA_DONE,
804	MTA_SMTP_READY,
805	MTA_SMTP_BANNER,
806	MTA_SMTP_EHLO,
807	MTA_SMTP_HELO,
808	MTA_SMTP_STARTTLS,
809	MTA_SMTP_AUTH,
810	MTA_SMTP_MAIL,
811	MTA_SMTP_RCPT,
812	MTA_SMTP_DATA,
813	MTA_SMTP_QUIT,
814	MTA_SMTP_BODY,
815	MTA_SMTP_DONE,
816	MTA_SMTP_RSET,
817};
818
819/* mta session flags */
820#define	MTA_FORCE_ANYSSL	0x01
821#define	MTA_FORCE_SMTPS		0x02
822#define	MTA_ALLOW_PLAIN		0x04
823#define	MTA_USE_AUTH		0x08
824#define	MTA_FORCE_MX		0x10
825#define	MTA_USE_CERT		0x20
826#define	MTA_TLS			0x40
827
828struct mta_relay {
829	TAILQ_ENTRY(mta_relay)	 entry;
830	struct sockaddr_storage	 sa;
831	char			 fqdn[MAXHOSTNAMELEN];
832	int			 used;
833};
834
835struct mta_task;
836
837#define MTA_EXT_STARTTLS     0x01
838#define MTA_EXT_AUTH         0x02
839#define MTA_EXT_PIPELINING   0x04
840
841struct mta_session {
842	SPLAY_ENTRY(mta_session) entry;
843	u_int64_t		 id;
844	enum mta_state		 state;
845	char			*host;
846	int			 port;
847	int			 flags;
848	TAILQ_HEAD(,mta_relay)	 relays;
849	char			*authmap;
850	char			*secret;
851	FILE			*datafp;
852
853	TAILQ_HEAD(,mta_task)	 tasks;
854
855	struct envelope		*currevp;
856	struct iobuf		 iobuf;
857	struct io		 io;
858	int			 ext; /* extension */
859	struct ssl		*ssl;
860};
861
862struct mta_batch {
863	u_int64_t		id;
864	struct relayhost	relay;
865
866	u_int32_t		msgid;
867};
868
869/* maps return structures */
870struct map_credentials {
871	char username[MAX_LINE_SIZE];
872	char password[MAX_LINE_SIZE];
873};
874
875struct map_alias {
876	size_t			nbnodes;
877	struct expandtree	expandtree;
878};
879
880struct map_virtual {
881	size_t			nbnodes;
882	struct expandtree	expandtree;
883};
884
885struct map_netaddr {
886	struct netaddr		netaddr;
887};
888
889/* queue structures */
890enum queue_type {
891	QT_INVALID=0,
892	QT_FS
893};
894
895enum queue_kind {
896	Q_INCOMING,
897	Q_QUEUE,
898	Q_CORRUPT
899};
900
901enum queue_op {
902	QOP_INVALID=0,
903	QOP_CREATE,
904	QOP_DELETE,
905	QOP_UPDATE,
906	QOP_COMMIT,
907	QOP_LOAD,
908	QOP_FD_R,
909	QOP_FD_RW,
910	QOP_CORRUPT,
911};
912
913struct queue_backend {
914	int (*init)(int);
915	int (*message)(enum queue_kind, enum queue_op, u_int32_t *);
916	int (*envelope)(enum queue_kind, enum queue_op, struct envelope *);
917
918	void *(*qwalk_new)(enum queue_kind, u_int32_t);
919	int   (*qwalk)(void *, u_int64_t *);
920	void  (*qwalk_close)(void *);
921};
922
923
924/* auth structures */
925enum auth_type {
926	AUTH_BSD,
927	AUTH_PWD,
928};
929
930struct auth_backend {
931	int (*authenticate)(char *, char *);
932};
933
934
935/* user structures */
936enum user_type {
937	USER_PWD,
938};
939
940#define	MAXPASSWORDLEN	128
941struct mta_user {
942	char username[MAXLOGNAME];
943	char directory[MAXPATHLEN];
944	char password[MAXPASSWORDLEN];
945	uid_t uid;
946	gid_t gid;
947};
948
949struct user_backend {
950	int (*getbyname)(struct mta_user *, char *);
951	int (*getbyuid)(struct mta_user *, uid_t);
952};
953
954
955/* delivery_backend */
956struct delivery_backend {
957	void	(*open)(struct deliver *);
958};
959
960
961/* scheduler_backend */
962enum scheduler_type {
963	SCHED_RAMQUEUE,
964};
965
966struct scheduler_backend {
967	void	(*init)(void);
968	int	(*setup)(time_t, time_t);
969
970	int	(*next)(u_int64_t *, time_t *);
971
972	void	(*insert)(struct envelope *);
973	void	(*schedule)(u_int64_t);
974	void	(*remove)(u_int64_t);
975
976	void	*(*host)(char *);
977	void	*(*message)(u_int32_t);
978	void	*(*batch)(u_int64_t);
979	void	*(*queue)(void);
980	void	 (*close)(void *);
981
982	int	 (*fetch)(void *, u_int64_t *);
983	int	 (*force)(u_int64_t);
984
985	void	 (*display)(void);	/* may be NULL */
986};
987
988
989
990extern struct smtpd	*env;
991extern void (*imsg_callback)(struct imsgev *, struct imsg *);
992
993
994/* aliases.c */
995int aliases_exist(objid_t, char *);
996int aliases_get(objid_t, struct expandtree *, char *);
997int aliases_vdomain_exists(objid_t, char *);
998int aliases_virtual_exist(objid_t, struct mailaddr *);
999int aliases_virtual_get(objid_t, struct expandtree *, struct mailaddr *);
1000int alias_parse(struct expandnode *, char *);
1001
1002
1003/* auth.c */
1004struct auth_backend *auth_backend_lookup(enum auth_type);
1005
1006
1007/* bounce.c */
1008int bounce_session(int, struct envelope *);
1009int bounce_session_switch(FILE *, enum session_state *, char *, struct envelope *);
1010void bounce_event(int, short, void *);
1011int bounce_record_message(struct envelope *, struct envelope *);
1012
1013/* config.c */
1014#define PURGE_LISTENERS		0x01
1015#define PURGE_MAPS		0x02
1016#define PURGE_RULES		0x04
1017#define PURGE_SSL		0x08
1018#define PURGE_EVERYTHING	0xff
1019void purge_config(u_int8_t);
1020void unconfigure(void);
1021void configure(void);
1022void init_pipes(void);
1023void config_pipes(struct peer *, u_int);
1024void config_peers(struct peer *, u_int);
1025
1026
1027/* control.c */
1028pid_t control(void);
1029void session_socket_blockmode(int, enum blockmodes);
1030void session_socket_no_linger(int);
1031int session_socket_error(int);
1032
1033
1034/* delivery.c */
1035struct delivery_backend *delivery_backend_lookup(enum action_type);
1036
1037
1038/* dns.c */
1039void dns_query_host(char *, int, u_int64_t);
1040void dns_query_mx(char *, int, u_int64_t);
1041void dns_query_ptr(struct sockaddr_storage *, u_int64_t);
1042void dns_async(struct imsgev *, int, struct dns *);
1043
1044
1045/* enqueue.c */
1046int		 enqueue(int, char **);
1047int		 enqueue_offline(int, char **);
1048
1049
1050/* envelope.c */
1051void envelope_set_errormsg(struct envelope *, char *, ...);
1052char *envelope_ascii_field_name(enum envelope_field);
1053int envelope_ascii_load(enum envelope_field, struct envelope *, char *);
1054int envelope_ascii_dump(enum envelope_field, struct envelope *, char *, size_t);
1055int envelope_load_file(struct envelope *, FILE *);
1056int envelope_dump_file(struct envelope *, FILE *);
1057
1058/* expand.c */
1059int expand_cmp(struct expandnode *, struct expandnode *);
1060void expandtree_increment_node(struct expandtree *, struct expandnode *);
1061void expandtree_decrement_node(struct expandtree *, struct expandnode *);
1062void expandtree_remove_node(struct expandtree *, struct expandnode *);
1063struct expandnode *expandtree_lookup(struct expandtree *, struct expandnode *);
1064void expandtree_free_nodes(struct expandtree *);
1065RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1066
1067
1068/* forward.c */
1069int forwards_get(int, struct expandtree *, char *);
1070
1071
1072/* lka.c */
1073pid_t lka(void);
1074int lka_session_cmp(struct lka_session *, struct lka_session *);
1075SPLAY_PROTOTYPE(lkatree, lka_session, nodes, lka_session_cmp);
1076
1077/* lka_session.c */
1078struct lka_session *lka_session_init(struct submit_status *);
1079void lka_session_fail(struct lka_session *);
1080void lka_session_destroy(struct lka_session *);
1081
1082
1083/* map.c */
1084void *map_lookup(objid_t, char *, enum map_kind);
1085int map_compare(objid_t, char *, enum map_kind, int (*)(char *, char *));
1086struct map *map_find(objid_t);
1087struct map *map_findbyname(const char *);
1088
1089
1090/* mda.c */
1091pid_t mda(void);
1092
1093
1094/* mfa.c */
1095pid_t mfa(void);
1096int mfa_session_cmp(struct mfa_session *, struct mfa_session *);
1097SPLAY_PROTOTYPE(mfatree, mfa_session, nodes, mfa_session_cmp);
1098
1099/* mta.c */
1100pid_t mta(void);
1101
1102/* mta_session.c */
1103void mta_session_imsg(struct imsgev *, struct imsg *);
1104
1105/* parse.y */
1106int parse_config(struct smtpd *, const char *, int);
1107int cmdline_symset(char *);
1108
1109
1110/* queue.c */
1111pid_t queue(void);
1112void queue_submit_envelope(struct envelope *);
1113void queue_commit_envelopes(struct envelope *);
1114
1115
1116/* queue_backend.c */
1117u_int32_t queue_generate_msgid(void);
1118u_int64_t queue_generate_evpid(u_int32_t msgid);
1119struct queue_backend *queue_backend_lookup(enum queue_type);
1120int queue_message_create(enum queue_kind, u_int32_t *);
1121int queue_message_delete(enum queue_kind, u_int32_t);
1122int queue_message_commit(enum queue_kind, u_int32_t);
1123int queue_message_fd_r(enum queue_kind, u_int32_t);
1124int queue_message_fd_rw(enum queue_kind, u_int32_t);
1125int queue_message_corrupt(enum queue_kind, u_int32_t);
1126int queue_envelope_create(enum queue_kind, struct envelope *);
1127int queue_envelope_delete(enum queue_kind, struct envelope *);
1128int queue_envelope_load(enum queue_kind, u_int64_t, struct envelope *);
1129int queue_envelope_update(enum queue_kind, struct envelope *);
1130void *qwalk_new(enum queue_kind, u_int32_t);
1131int   qwalk(void *, u_int64_t *);
1132void  qwalk_close(void *);
1133
1134
1135/* runner.c */
1136pid_t runner(void);
1137void message_reset_flags(struct envelope *);
1138
1139
1140/* scheduler.c */
1141struct scheduler_backend *scheduler_backend_lookup(enum scheduler_type);
1142
1143
1144/* smtp.c */
1145pid_t smtp(void);
1146void smtp_resume(void);
1147
1148
1149/* smtp_session.c */
1150void session_init(struct listener *, struct session *);
1151int session_cmp(struct session *, struct session *);
1152void session_io(struct io *, int);
1153void session_pickup(struct session *, struct submit_status *);
1154void session_destroy(struct session *, const char *);
1155void session_respond(struct session *, char *, ...)
1156	__attribute__ ((format (printf, 2, 3)));
1157
1158SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp);
1159
1160
1161/* smtpd.c */
1162int	 child_cmp(struct child *, struct child *);
1163void imsg_event_add(struct imsgev *);
1164void imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t,
1165    int, void *, u_int16_t);
1166void imsg_dispatch(int, short, void *);
1167const char * proc_to_str(int);
1168const char * imsg_to_str(int);
1169SPLAY_PROTOTYPE(childtree, child, entry, child_cmp);
1170
1171
1172/* ssl.c */
1173void ssl_init(void);
1174void ssl_transaction(struct session *);
1175void ssl_session_init(struct session *);
1176void ssl_session_destroy(struct session *);
1177int ssl_load_certfile(const char *, u_int8_t);
1178void ssl_setup(struct listener *);
1179int ssl_cmp(struct ssl *, struct ssl *);
1180void *ssl_mta_init(struct ssl *);
1181SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp);
1182
1183
1184/* ssl_privsep.c */
1185int	 ssl_ctx_use_private_key(void *, char *, off_t);
1186int	 ssl_ctx_use_certificate_chain(void *, char *, off_t);
1187
1188/* stats.c */
1189void	stat_init(struct stat_counter *, int);
1190size_t	stat_get(int, int);
1191size_t	stat_increment(int);
1192size_t	stat_decrement(int);
1193
1194
1195/* user.c */
1196struct user_backend *user_backend_lookup(enum user_type);
1197
1198
1199/* util.c */
1200typedef struct arglist arglist;
1201struct arglist {
1202	char    **list;
1203	u_int   num;
1204	u_int   nalloc;
1205};
1206void addargs(arglist *, char *, ...)
1207	__attribute__((format(printf, 2, 3)));
1208int bsnprintf(char *, size_t, const char *, ...)
1209	__attribute__ ((format (printf, 3, 4)));
1210int safe_fclose(FILE *);
1211int hostname_match(char *, char *);
1212int email_to_mailaddr(struct mailaddr *, char *);
1213int valid_localpart(char *);
1214int valid_domainpart(char *);
1215char *ss_to_text(struct sockaddr_storage *);
1216int valid_message_id(char *);
1217int valid_message_uid(char *);
1218char *time_to_text(time_t);
1219int secure_file(int, char *, char *, uid_t, int);
1220void lowercase(char *, char *, size_t);
1221void sa_set_port(struct sockaddr *, int);
1222u_int64_t generate_uid(void);
1223void fdlimit(double);
1224int availdesc(void);
1225u_int32_t evpid_to_msgid(u_int64_t);
1226u_int64_t msgid_to_evpid(u_int32_t);
1227void log_imsg(int, int, struct imsg*);
1228int ckdir(const char *, mode_t, uid_t, gid_t, int);
1229int rmtree(char *, int);
1230int mvpurge(char *, char *);
1231const char *parse_smtp_response(char *, size_t, char **, int *);
1232int text_to_netaddr(struct netaddr *, char *);
1233int text_to_relayhost(struct relayhost *, char *);
1234