Blame


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