Blob


1 /*
2 * Copyright (c) 2019 Martijn van Duren <martijn@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16 #include <sys/socket.h>
18 #ifndef __dead
19 #define __dead __attribute__((__noreturn__))
20 #endif
21 #ifndef __unused
22 #define __unused __attribute__((unused))
23 #endif
25 enum osmtpd_status {
26 OSMTPD_STATUS_OK,
27 OSMTPD_STATUS_TEMPFAIL,
28 OSMTPD_STATUS_PERMFAIL
29 };
31 enum osmtpd_auth_status {
32 OSMTPD_AUTH_PASS,
33 OSMTPD_AUTH_FAIL,
34 OSMTPD_AUTH_ERROR,
35 };
37 enum osmtpd_type {
38 OSMTPD_TYPE_FILTER,
39 OSMTPD_TYPE_REPORT
40 };
42 enum osmtpd_phase {
43 OSMTPD_PHASE_CONNECT,
44 OSMTPD_PHASE_HELO,
45 OSMTPD_PHASE_EHLO,
46 OSMTPD_PHASE_STARTTLS,
47 OSMTPD_PHASE_AUTH,
48 OSMTPD_PHASE_MAIL_FROM,
49 OSMTPD_PHASE_RCPT_TO,
50 OSMTPD_PHASE_DATA,
51 OSMTPD_PHASE_DATA_LINE,
52 OSMTPD_PHASE_RSET,
53 OSMTPD_PHASE_QUIT,
54 OSMTPD_PHASE_NOOP,
55 OSMTPD_PHASE_HELP,
56 OSMTPD_PHASE_WIZ,
57 OSMTPD_PHASE_COMMIT,
58 OSMTPD_PHASE_LINK_CONNECT,
59 OSMTPD_PHASE_LINK_DISCONNECT,
60 OSMTPD_PHASE_LINK_GREETING,
61 OSMTPD_PHASE_LINK_IDENTIFY,
62 OSMTPD_PHASE_LINK_TLS,
63 OSMTPD_PHASE_LINK_AUTH,
64 OSMTPD_PHASE_TX_RESET,
65 OSMTPD_PHASE_TX_BEGIN,
66 OSMTPD_PHASE_TX_MAIL,
67 OSMTPD_PHASE_TX_RCPT,
68 OSMTPD_PHASE_TX_ENVELOPE,
69 OSMTPD_PHASE_TX_DATA,
70 OSMTPD_PHASE_TX_COMMIT,
71 OSMTPD_PHASE_TX_ROLLBACK,
72 OSMTPD_PHASE_PROTOCOL_CLIENT,
73 OSMTPD_PHASE_PROTOCOL_SERVER,
74 OSMTPD_PHASE_FILTER_RESPONSE,
75 OSMTPD_PHASE_TIMEOUT
76 };
78 #define OSMTPD_NEED_SRC 1 << 0
79 #define OSMTPD_NEED_DST 1 << 1
80 #define OSMTPD_NEED_RDNS 1 << 2
81 #define OSMTPD_NEED_FCRDNS 1 << 3
82 #define OSMTPD_NEED_IDENTITY 1 << 4
83 #define OSMTPD_NEED_GREETING 1 << 5
84 #define OSMTPD_NEED_CIPHERS 1 << 6
85 #define OSMTPD_NEED_MSGID 1 << 7
86 #define OSMTPD_NEED_USERNAME 1 << 8
87 #define OSMTPD_NEED_MAILFROM 1 << 9
88 #define OSMTPD_NEED_RCPTTO 1 << 10
89 #define OSMTPD_NEED_EVPID 1 << 11
91 struct osmtpd_ctx {
92 enum osmtpd_type type;
93 enum osmtpd_phase phase;
94 int version_major;
95 int version_minor;
96 struct timespec tm;
97 int incoming;
98 uint64_t reqid;
99 uint64_t token;
100 struct sockaddr_storage src;
101 struct sockaddr_storage dst;
102 char *rdns;
103 enum osmtpd_status fcrdns;
104 /* HELO/EHLO identity */
105 char *identity;
106 struct greeting {
107 char *identity;
108 /* textstring not supplied by smtpd */
109 } greeting;
110 char *ciphers;
111 uint32_t msgid;
112 char *username;
113 char *mailfrom;
114 char **rcptto;
115 uint64_t evpid;
116 void *local_session;
117 void *local_message;
118 };
120 void osmtpd_register_conf(void (*)(const char *, const char *));
121 void osmtpd_register_filter_connect(int (*)(struct osmtpd_ctx *, const char *,
122 struct sockaddr_storage *));
123 void osmtpd_register_filter_helo(int (*)(struct osmtpd_ctx *, const char *));
124 void osmtpd_register_filter_ehlo(int (*)(struct osmtpd_ctx *, const char *));
125 void osmtpd_register_filter_starttls(int (*)(struct osmtpd_ctx *));
126 void osmtpd_register_filter_auth(int (*)(struct osmtpd_ctx *, const char *));
127 void osmtpd_register_filter_mailfrom(int (*)(struct osmtpd_ctx *,
128 const char *));
129 void osmtpd_register_filter_rcptto(int (*)(struct osmtpd_ctx *, const char *));
130 void osmtpd_register_filter_data(int (*)(struct osmtpd_ctx *));
131 void osmtpd_register_filter_dataline(int (*)(struct osmtpd_ctx *,
132 const char *));
133 void osmtpd_register_filter_rset(int (*)(struct osmtpd_ctx *));
134 void osmtpd_register_filter_quit(int (*)(struct osmtpd_ctx *));
135 void osmtpd_register_filter_noop(int (*)(struct osmtpd_ctx *));
136 void osmtpd_register_filter_help(int (*)(struct osmtpd_ctx *));
137 void osmtpd_register_filter_wiz(int (*)(struct osmtpd_ctx *));
138 void osmtpd_register_filter_commit(int (*)(struct osmtpd_ctx *));
139 void osmtpd_register_report_connect(int, int (*)(struct osmtpd_ctx *,
140 const char *, enum osmtpd_status, struct sockaddr_storage *,
141 struct sockaddr_storage *));
142 void osmtpd_register_report_disconnect(int, int (*)(struct osmtpd_ctx *));
143 void osmtpd_register_report_greeting(int, int (*)(struct osmtpd_ctx *,
144 const char *));
145 void osmtpd_register_report_identify(int, int (*)(struct osmtpd_ctx *,
146 const char *));
147 void osmtpd_register_report_tls(int, int (*)(struct osmtpd_ctx *,
148 const char *));
149 void osmtpd_register_report_auth(int, int (*)(struct osmtpd_ctx *,
150 const char *, enum osmtpd_auth_status));
151 void osmtpd_register_report_reset(int, int (*)(struct osmtpd_ctx *, uint32_t));
152 void osmtpd_register_report_begin(int, int (*)(struct osmtpd_ctx *, uint32_t));
153 void osmtpd_register_report_mail(int, int (*)(struct osmtpd_ctx *, uint32_t,
154 const char *, enum osmtpd_status));
155 void osmtpd_register_report_rcpt(int, int (*)(struct osmtpd_ctx *, uint32_t,
156 const char *, enum osmtpd_status));
157 void osmtpd_register_report_envelope(int, int (*)(struct osmtpd_ctx *, uint32_t,
158 uint64_t));
159 void osmtpd_register_report_data(int, int (*)(struct osmtpd_ctx *, uint32_t,
160 enum osmtpd_status));
161 void osmtpd_register_report_commit(int, int (*)(struct osmtpd_ctx *, uint32_t,
162 size_t));
163 void osmtpd_register_report_rollback(int, int (*)(struct osmtpd_ctx *,
164 uint32_t));
165 void osmtpd_register_report_client(int, int (*)(struct osmtpd_ctx *,
166 const char *));
167 void osmtpd_register_report_server(int, int (*)(struct osmtpd_ctx *,
168 const char *));
169 void osmtpd_register_report_response(int, int (*)(struct osmtpd_ctx *,
170 const char *));
171 void osmtpd_register_report_timeout(int, int (*)(struct osmtpd_ctx *));
172 void osmtpd_local_session(void *(*)(struct osmtpd_ctx *),
173 void (*)(struct osmtpd_ctx *, void *));
174 void osmtpd_local_message(void *(*)(struct osmtpd_ctx *),
175 void (*)(struct osmtpd_ctx *, void *));
176 void osmtpd_need(int);
178 void osmtpd_filter_proceed(struct osmtpd_ctx *);
179 void osmtpd_filter_reject(struct osmtpd_ctx *, int, const char *, ...)
180 __attribute__((__format__ (printf, 3, 4)));
181 void osmtpd_filter_reject_enh(struct osmtpd_ctx *, int, int, int, int,
182 const char *, ...)
183 __attribute__((__format__ (printf, 6, 7)));
184 void osmtpd_filter_disconnect(struct osmtpd_ctx *, const char *, ...)
185 __attribute__((__format__ (printf, 2, 3)));
186 void osmtpd_filter_disconnect_enh(struct osmtpd_ctx *, int, int, int,
187 const char *, ...)
188 __attribute__((__format__ (printf, 5, 6)));
189 void osmtpd_filter_rewrite(struct osmtpd_ctx *, const char *, ...)
190 __attribute__((__format__ (printf, 2, 3)));
191 void osmtpd_filter_dataline(struct osmtpd_ctx *, const char *, ...)
192 __attribute__((__format__ (printf, 2, 3)));
193 void osmtpd_run(void);
194 void osmtpd_warn(struct osmtpd_ctx *, const char *fmt, ...);
195 void osmtpd_warnx(struct osmtpd_ctx *, const char *fmt, ...);
196 __dead void osmtpd_err(int eval, const char *fmt, ...);
197 __dead void osmtpd_errx(int eval, const char *fmt, ...);