36 #define PSC_READ_BUF_SIZE 1024
42 #define PSC_TINDX_PREGR 0
43 #define PSC_TINDX_DNSBL 1
44 #define PSC_TINDX_PIPEL 2
45 #define PSC_TINDX_NSMTP 3
46 #define PSC_TINDX_BARLF 4
47 #define PSC_TINDX_COUNT 5
49 #define PSC_TNAME_PREGR "pregreet"
50 #define PSC_TNAME_DNSBL "dnsbl"
51 #define PSC_TNAME_PIPEL "pipelining"
52 #define PSC_TNAME_NSMTP "non-smtp command"
53 #define PSC_TNAME_BARLF "bare newline"
55 #define PSC_TINDX_BYTNAME(tname) (PSC_TINDX_ ## tname)
81 struct timeval start_time;
105 #define PSC_TIME_STAMP_NEW (0)
106 #define PSC_TIME_STAMP_DISABLED (1)
107 #define PSC_TIME_STAMP_INVALID (-1)
112 #define PSC_STATE_FLAG_NOFORWARD (1<<0)
113 #define PSC_STATE_FLAG_USING_TLS (1<<1)
114 #define PSC_STATE_FLAG_UNUSED2 (1<<2)
115 #define PSC_STATE_FLAG_NEW (1<<3)
116 #define PSC_STATE_FLAG_BLIST_FAIL (1<<4)
117 #define PSC_STATE_FLAG_HANGUP (1<<5)
118 #define PSC_STATE_FLAG_SMTPD_X21 (1<<6)
119 #define PSC_STATE_FLAG_WLIST_FAIL (1<<7)
120 #define PSC_STATE_FLAG_TEST_BASE (8)
146 #define PSC_STATE_FLAGS_TODO_TO_PASS(todo_flags) ((todo_flags) >> 1)
147 #define PSC_STATE_FLAGS_TODO_TO_DONE(todo_flags) ((todo_flags) << 1)
149 #define PSC_STATE_FLAG_SHIFT_FAIL (0)
150 #define PSC_STATE_FLAG_SHIFT_PASS (1)
151 #define PSC_STATE_FLAG_SHIFT_TODO (2)
152 #define PSC_STATE_FLAG_SHIFT_DONE (3)
153 #define PSC_STATE_FLAG_SHIFT_SKIP (3)
154 #define PSC_STATE_FLAG_SHIFT_STRIDE (4)
156 #define PSC_STATE_FLAG_SHIFT_BYFNAME(fname) (PSC_STATE_FLAG_SHIFT_ ## fname)
162 #define PSC_STATE_FLAG_BYTINDX_FNAME(tindx, fname) \
163 (1U << (PSC_STATE_FLAG_TEST_BASE \
164 + PSC_STATE_FLAG_SHIFT_STRIDE * (tindx) \
165 + PSC_STATE_FLAG_SHIFT_BYFNAME(fname)))
167 #define PSC_STATE_FLAG_BYTINDX_FAIL(tindx) \
168 PSC_STATE_FLAG_BYTINDX_FNAME((tindx), FAIL)
169 #define PSC_STATE_FLAG_BYTINDX_PASS(tindx) \
170 PSC_STATE_FLAG_BYTINDX_FNAME((tindx), PASS)
171 #define PSC_STATE_FLAG_BYTINDX_TODO(tindx) \
172 PSC_STATE_FLAG_BYTINDX_FNAME((tindx), TODO)
173 #define PSC_STATE_FLAG_BYTINDX_DONE(tindx) \
174 PSC_STATE_FLAG_BYTINDX_FNAME((tindx), DONE)
175 #define PSC_STATE_FLAG_BYTINDX_SKIP(tindx) \
176 PSC_STATE_FLAG_BYTINDX_FNAME((tindx), SKIP)
181 #define PSC_STATE_FLAG_BYTNAME_FNAME(tname, fname) \
182 (1U << (PSC_STATE_FLAG_TEST_BASE \
183 + PSC_STATE_FLAG_SHIFT_STRIDE * PSC_TINDX_BYTNAME(tname) \
184 + PSC_STATE_FLAG_SHIFT_BYFNAME(fname)))
186 #define PSC_STATE_FLAG_PREGR_FAIL PSC_STATE_FLAG_BYTNAME_FNAME(PREGR, FAIL)
187 #define PSC_STATE_FLAG_PREGR_PASS PSC_STATE_FLAG_BYTNAME_FNAME(PREGR, PASS)
188 #define PSC_STATE_FLAG_PREGR_TODO PSC_STATE_FLAG_BYTNAME_FNAME(PREGR, TODO)
189 #define PSC_STATE_FLAG_PREGR_DONE PSC_STATE_FLAG_BYTNAME_FNAME(PREGR, DONE)
191 #define PSC_STATE_FLAG_DNSBL_FAIL PSC_STATE_FLAG_BYTNAME_FNAME(DNSBL, FAIL)
192 #define PSC_STATE_FLAG_DNSBL_PASS PSC_STATE_FLAG_BYTNAME_FNAME(DNSBL, PASS)
193 #define PSC_STATE_FLAG_DNSBL_TODO PSC_STATE_FLAG_BYTNAME_FNAME(DNSBL, TODO)
194 #define PSC_STATE_FLAG_DNSBL_DONE PSC_STATE_FLAG_BYTNAME_FNAME(DNSBL, DONE)
196 #define PSC_STATE_FLAG_PIPEL_FAIL PSC_STATE_FLAG_BYTNAME_FNAME(PIPEL, FAIL)
197 #define PSC_STATE_FLAG_PIPEL_PASS PSC_STATE_FLAG_BYTNAME_FNAME(PIPEL, PASS)
198 #define PSC_STATE_FLAG_PIPEL_TODO PSC_STATE_FLAG_BYTNAME_FNAME(PIPEL, TODO)
199 #define PSC_STATE_FLAG_PIPEL_SKIP PSC_STATE_FLAG_BYTNAME_FNAME(PIPEL, SKIP)
201 #define PSC_STATE_FLAG_NSMTP_FAIL PSC_STATE_FLAG_BYTNAME_FNAME(NSMTP, FAIL)
202 #define PSC_STATE_FLAG_NSMTP_PASS PSC_STATE_FLAG_BYTNAME_FNAME(NSMTP, PASS)
203 #define PSC_STATE_FLAG_NSMTP_TODO PSC_STATE_FLAG_BYTNAME_FNAME(NSMTP, TODO)
204 #define PSC_STATE_FLAG_NSMTP_SKIP PSC_STATE_FLAG_BYTNAME_FNAME(NSMTP, SKIP)
206 #define PSC_STATE_FLAG_BARLF_FAIL PSC_STATE_FLAG_BYTNAME_FNAME(BARLF, FAIL)
207 #define PSC_STATE_FLAG_BARLF_PASS PSC_STATE_FLAG_BYTNAME_FNAME(BARLF, PASS)
208 #define PSC_STATE_FLAG_BARLF_TODO PSC_STATE_FLAG_BYTNAME_FNAME(BARLF, TODO)
209 #define PSC_STATE_FLAG_BARLF_SKIP PSC_STATE_FLAG_BYTNAME_FNAME(BARLF, SKIP)
214 #define PSC_STATE_MASK_PREGR_TODO_FAIL \
215 (PSC_STATE_FLAG_PREGR_TODO | PSC_STATE_FLAG_PREGR_FAIL)
216 #define PSC_STATE_MASK_DNSBL_TODO_FAIL \
217 (PSC_STATE_FLAG_DNSBL_TODO | PSC_STATE_FLAG_DNSBL_FAIL)
218 #define PSC_STATE_MASK_PIPEL_TODO_FAIL \
219 (PSC_STATE_FLAG_PIPEL_TODO | PSC_STATE_FLAG_PIPEL_FAIL)
220 #define PSC_STATE_MASK_NSMTP_TODO_FAIL \
221 (PSC_STATE_FLAG_NSMTP_TODO | PSC_STATE_FLAG_NSMTP_FAIL)
222 #define PSC_STATE_MASK_BARLF_TODO_FAIL \
223 (PSC_STATE_FLAG_BARLF_TODO | PSC_STATE_FLAG_BARLF_FAIL)
225 #define PSC_STATE_MASK_PREGR_TODO_DONE \
226 (PSC_STATE_FLAG_PREGR_TODO | PSC_STATE_FLAG_PREGR_DONE)
227 #define PSC_STATE_MASK_PIPEL_TODO_SKIP \
228 (PSC_STATE_FLAG_PIPEL_TODO | PSC_STATE_FLAG_PIPEL_SKIP)
229 #define PSC_STATE_MASK_NSMTP_TODO_SKIP \
230 (PSC_STATE_FLAG_NSMTP_TODO | PSC_STATE_FLAG_NSMTP_SKIP)
231 #define PSC_STATE_MASK_BARLF_TODO_SKIP \
232 (PSC_STATE_FLAG_BARLF_TODO | PSC_STATE_FLAG_BARLF_SKIP)
234 #define PSC_STATE_MASK_PREGR_FAIL_DONE \
235 (PSC_STATE_FLAG_PREGR_FAIL | PSC_STATE_FLAG_PREGR_DONE)
237 #define PSC_STATE_MASK_PIPEL_TODO_PASS_FAIL \
238 (PSC_STATE_MASK_PIPEL_TODO_FAIL | PSC_STATE_FLAG_PIPEL_PASS)
239 #define PSC_STATE_MASK_NSMTP_TODO_PASS_FAIL \
240 (PSC_STATE_MASK_NSMTP_TODO_FAIL | PSC_STATE_FLAG_NSMTP_PASS)
241 #define PSC_STATE_MASK_BARLF_TODO_PASS_FAIL \
242 (PSC_STATE_MASK_BARLF_TODO_FAIL | PSC_STATE_FLAG_BARLF_PASS)
247 #define PSC_STATE_MASK_EARLY_DONE \
248 (PSC_STATE_FLAG_PREGR_DONE | PSC_STATE_FLAG_DNSBL_DONE)
249 #define PSC_STATE_MASK_EARLY_TODO \
250 (PSC_STATE_FLAG_PREGR_TODO | PSC_STATE_FLAG_DNSBL_TODO)
251 #define PSC_STATE_MASK_EARLY_PASS \
252 (PSC_STATE_FLAG_PREGR_PASS | PSC_STATE_FLAG_DNSBL_PASS)
253 #define PSC_STATE_MASK_EARLY_FAIL \
254 (PSC_STATE_FLAG_PREGR_FAIL | PSC_STATE_FLAG_DNSBL_FAIL)
256 #define PSC_STATE_MASK_SMTPD_TODO \
257 (PSC_STATE_FLAG_PIPEL_TODO | PSC_STATE_FLAG_NSMTP_TODO | \
258 PSC_STATE_FLAG_BARLF_TODO)
259 #define PSC_STATE_MASK_SMTPD_PASS \
260 (PSC_STATE_FLAG_PIPEL_PASS | PSC_STATE_FLAG_NSMTP_PASS | \
261 PSC_STATE_FLAG_BARLF_PASS)
262 #define PSC_STATE_MASK_SMTPD_FAIL \
263 (PSC_STATE_FLAG_PIPEL_FAIL | PSC_STATE_FLAG_NSMTP_FAIL | \
264 PSC_STATE_FLAG_BARLF_FAIL)
269 #define PSC_STATE_MASK_ANY_FAIL \
270 (PSC_STATE_FLAG_BLIST_FAIL | \
271 PSC_STATE_MASK_EARLY_FAIL | PSC_STATE_MASK_SMTPD_FAIL | \
272 PSC_STATE_FLAG_WLIST_FAIL)
274 #define PSC_STATE_MASK_ANY_PASS \
275 (PSC_STATE_MASK_EARLY_PASS | PSC_STATE_MASK_SMTPD_PASS)
277 #define PSC_STATE_MASK_ANY_TODO \
278 (PSC_STATE_MASK_EARLY_TODO | PSC_STATE_MASK_SMTPD_TODO)
280 #define PSC_STATE_MASK_ANY_TODO_FAIL \
281 (PSC_STATE_MASK_ANY_TODO | PSC_STATE_MASK_ANY_FAIL)
283 #define PSC_STATE_MASK_ANY_UPDATE \
284 (PSC_STATE_MASK_ANY_PASS)
290 #define PSC_SMTPD_CMD_CONNECT "CONNECT"
291 #define PSC_SMTPD_CMD_UNIMPL "UNIMPLEMENTED"
301 #define PSC_CALC_DELTA(x, y, z) \
303 (x).dt_sec = (y).tv_sec - (z).tv_sec; \
304 (x).dt_usec = (y).tv_usec - (z).tv_usec; \
305 while ((x).dt_usec < 0) { \
306 (x).dt_usec += 1000000; \
309 while ((x).dt_usec >= 1000000) { \
310 (x).dt_usec -= 1000000; \
313 if ((x).dt_sec < 0) \
314 (x).dt_sec = (x).dt_usec = 0; \
325 #define PSC_READ_EVENT_REQUEST(fd, action, context, timeout) do { \
326 if (msg_verbose > 1) \
327 msg_info("%s: read-request fd=%d", myname, (fd)); \
328 event_enable_read((fd), (action), (context)); \
329 event_request_timer((action), (context), (timeout)); \
332 #define PSC_READ_EVENT_REQUEST2(fd, read_act, time_act, context, timeout) do { \
333 if (msg_verbose > 1) \
334 msg_info("%s: read-request fd=%d", myname, (fd)); \
335 event_enable_read((fd), (read_act), (context)); \
336 event_request_timer((time_act), (context), (timeout)); \
341 #define PSC_CLEAR_EVENT_REQUEST(fd, time_act, context) do { \
342 if (msg_verbose > 1) \
343 msg_info("%s: clear-request fd=%d", myname, (fd)); \
344 event_disable_readwrite(fd); \
345 event_cancel_timer((time_act), (context)); \
351 #define PSC_NAME_ACT_DROP "drop"
352 #define PSC_NAME_ACT_ENFORCE "enforce"
353 #define PSC_NAME_ACT_IGNORE "ignore"
354 #define PSC_NAME_ACT_CONT "continue"
356 #define PSC_ACT_DROP 1
357 #define PSC_ACT_ENFORCE 2
358 #define PSC_ACT_IGNORE 3
385 #define PSC_EFF_GREET_WAIT \
386 (psc_stress ? psc_stress_greet_wait : psc_normal_greet_wait)
387 #define PSC_EFF_CMD_TIME_LIMIT \
388 (psc_stress ? psc_stress_cmd_time_limit : psc_normal_cmd_time_limit)
393 #define PSC_STRING_UPDATE(str, text) do { \
394 if (str) myfree(str); \
395 (str) = ((text) ? mystrdup(text) : 0); \
398 #define PSC_STRING_RESET(str) do { \
408 #define STR(x) vstring_str(x)
409 #define LEN(x) VSTRING_LEN(x)
414 #define PSC_CLIENT_ADDR_PORT(state) \
415 (state)->smtp_client_addr, (state)->smtp_client_port
417 #define PSC_PASS_SESSION_STATE(state, what, bits) do { \
419 msg_info("PASS %s [%s]:%s", (what), PSC_CLIENT_ADDR_PORT(state)); \
420 (state)->flags |= (bits); \
422 #define PSC_FAIL_SESSION_STATE(state, bits) do { \
424 msg_info("FAIL [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
425 (state)->flags |= (bits); \
427 #define PSC_SKIP_SESSION_STATE(state, what, bits) do { \
429 msg_info("SKIP %s [%s]:%s", (what), PSC_CLIENT_ADDR_PORT(state)); \
430 (state)->flags |= (bits); \
432 #define PSC_DROP_SESSION_STATE(state, reply) do { \
434 msg_info("DROP [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
435 (state)->flags |= PSC_STATE_FLAG_NOFORWARD; \
436 (state)->final_reply = (reply); \
437 psc_conclude(state); \
439 #define PSC_ENFORCE_SESSION_STATE(state, reply) do { \
441 msg_info("ENFORCE [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
442 (state)->rcpt_reply = (reply); \
443 (state)->flags |= PSC_STATE_FLAG_NOFORWARD; \
445 #define PSC_UNPASS_SESSION_STATE(state, bits) do { \
447 msg_info("UNPASS [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
448 (state)->flags &= ~(bits); \
450 #define PSC_UNFAIL_SESSION_STATE(state, bits) do { \
452 msg_info("UNFAIL [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
453 (state)->flags &= ~(bits); \
455 #define PSC_ADD_SERVER_STATE(state, fd) do { \
456 (state)->smtp_server_fd = (fd); \
457 psc_post_queue_length++; \
459 #define PSC_DEL_CLIENT_STATE(state) do { \
460 event_server_disconnect((state)->smtp_client_stream); \
461 (state)->smtp_client_stream = 0; \
462 psc_check_queue_length--; \
487 #define PSC_INIT_TESTS(dst) do { \
488 time_t *_it_stamp_p; \
490 for (_it_stamp_p = (dst)->client_info->expire_time; \
491 _it_stamp_p < (dst)->client_info->expire_time + PSC_TINDX_COUNT; \
493 *_it_stamp_p = PSC_TIME_STAMP_INVALID; \
495 #define PSC_INIT_TEST_FLAGS_ONLY(dst) do { \
498 #define PSC_BEGIN_TESTS(state, name) do { \
499 (state)->test_name = (name); \
500 GETTIMEOFDAY(&(state)->start_time); \
507 const char *,
const char *);
510 #define PSC_MIN(x, y) ((x) < (y) ? (x) : (y))
511 #define PSC_MAX(x, y) ((x) > (y) ? (x) : (y))
526 #define PSC_SMTPD_X21(state, reply) do { \
527 (state)->flags |= PSC_STATE_FLAG_SMTPD_X21; \
528 (state)->final_reply = (reply); \
529 psc_smtpd_tests(state); \
542 #define PSC_SEND_REPLY psc_send_reply
563 MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *);
569 #define PSC_ACL_ACT_WHITELIST SERVER_ACL_ACT_PERMIT
570 #define PSC_ACL_ACT_DUNNO SERVER_ACL_ACT_DUNNO
571 #define PSC_ACL_ACT_BLACKLIST SERVER_ACL_ACT_REJECT
572 #define PSC_ACL_ACT_ERROR SERVER_ACL_ACT_ERROR
574 #define psc_acl_pre_jail_init server_acl_pre_jail_init
575 #define psc_acl_parse server_acl_parse
576 #define psc_acl_eval(s,a,p) server_acl_eval((s)->smtp_client_addr, (a), (p))
PSC_CLIENT_INFO * client_info
char * psc_print_tests(VSTRING *, PSC_STATE *)
int psc_stress_greet_wait
int psc_check_queue_length
void psc_send_socket(PSC_STATE *)
int psc_normal_cmd_time_limit
void psc_starttls_open(PSC_STATE *, EVENT_NOTIFY_FN)
void(* PSC_ENDPT_LOOKUP_FN)(int, VSTREAM *, MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *, MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *)
void psc_expand_init(void)
char * psc_print_grey_key(VSTRING *, const char *, const char *, const char *, const char *)
int psc_dnsbl_request(const char *, void(*)(int, void *), void *)
int psc_send_reply(PSC_STATE *, const char *)
void psc_smtpd_init(void)
void psc_early_tests(PSC_STATE *)
void psc_smtpd_pre_jail_init(void)
const char * psc_cache_lookup(DICT_CACHE *, const char *)
int psc_lowat_check_queue_length
void psc_early_init(void)
PSC_STATE * psc_new_session_state(VSTREAM *, const char *, const char *, const char *, const char *)
const char * psc_maps_find(MAPS *, const char *, int)
void psc_conclude(PSC_STATE *)
int psc_dnsbl_retrieve(const char *, const char **, int, int *)
void psc_hangup_event(PSC_STATE *)
void psc_new_tests(PSC_STATE *)
void psc_todo_tests(PSC_STATE *, time_t)
int psc_hiwat_check_queue_length
void(* EVENT_NOTIFY_FN)(int, void *)
int psc_stress_cmd_time_limit
int psc_normal_greet_wait
char * psc_format_delta_time(VSTRING *, struct timeval, DELTA_TIME *)
const char * psc_expand_lookup(const char *, int, void *)
VSTRING * psc_expand_filter
void psc_smtpd_tests(PSC_STATE *)
void psc_endpt_lookup(VSTREAM *, PSC_ENDPT_LOOKUP_FN)
DICT_CACHE * psc_cache_map
const char * psc_test_name(int)
char * psc_smtpd_service_name
STRING_LIST * psc_forbid_cmds
void psc_dnsbl_init(void)
void psc_free_session_state(PSC_STATE *)
void psc_cache_update(DICT_CACHE *, const char *, const char *)
const char * psc_dict_get(DICT *, const char *)
int psc_addr_match_list_match(ADDR_MATCH_LIST *, const char *)
const char * psc_print_state_flags(int, const char *)
int psc_post_queue_length
VSTREAM * smtp_client_stream
void psc_parse_tests(PSC_STATE *, const char *, time_t)
HTABLE * psc_client_concurrency