Postfix3.3.1
postscreen.h
[詳解]
1 /*++
2 /* NAME
3 /* postscreen 3h
4 /* SUMMARY
5 /* postscreen internal interfaces
6 /* SYNOPSIS
7 /* #include <postscreen.h>
8 /* DESCRIPTION
9 /* .nf
10 
11  /*
12  * System library.
13  */
14 
15  /*
16  * Utility library.
17  */
18 #include <dict_cache.h>
19 #include <vstream.h>
20 #include <vstring.h>
21 #include <events.h>
22 #include <htable.h>
23 #include <myaddrinfo.h>
24 
25  /*
26  * Global library.
27  */
28 #include <addr_match_list.h>
29 #include <string_list.h>
30 #include <maps.h>
31 #include <server_acl.h>
32 
33  /*
34  * Preliminary stuff, to be fixed.
35  */
36 #define PSC_READ_BUF_SIZE 1024
37 
38  /*
39  * Numeric indices and symbolic names for tests whose time stamps and status
40  * flags can be accessed by numeric index.
41  */
42 #define PSC_TINDX_PREGR 0 /* pregreet */
43 #define PSC_TINDX_DNSBL 1 /* dnsbl */
44 #define PSC_TINDX_PIPEL 2 /* pipelining */
45 #define PSC_TINDX_NSMTP 3 /* non-smtp command */
46 #define PSC_TINDX_BARLF 4 /* bare newline */
47 #define PSC_TINDX_COUNT 5 /* number of tests */
48 
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"
54 
55 #define PSC_TINDX_BYTNAME(tname) (PSC_TINDX_ ## tname)
56 
57  /*
58  * Per-client shared state.
59  */
60 typedef struct {
61  int concurrency; /* per-client */
62  int pass_new_count; /* per-client */
63  time_t expire_time[PSC_TINDX_COUNT]; /* per-test expiration */
65 
66  /*
67  * Per-session state.
68  */
69 typedef struct {
70  int flags; /* see below */
71  /* Socket state. */
72  VSTREAM *smtp_client_stream; /* remote SMTP client */
73  int smtp_server_fd; /* real SMTP server */
74  char *smtp_client_addr; /* client address */
75  char *smtp_client_port; /* client port */
76  char *smtp_server_addr; /* server address */
77  char *smtp_server_port; /* server port */
78  const char *final_reply; /* cause for hanging up */
79  VSTRING *send_buf; /* pending output */
80  /* Test context. */
81  struct timeval start_time; /* start of current test */
82  const char *test_name; /* name of current test */
83  PSC_CLIENT_INFO *client_info; /* shared client state */
84  VSTRING *dnsbl_reply; /* dnsbl reject text */
85  int dnsbl_score; /* saved DNSBL score */
86  int dnsbl_ttl; /* saved DNSBL TTL */
87  const char *dnsbl_name; /* DNSBL name with largest weight */
88  int dnsbl_index; /* dnsbl request index */
89  const char *rcpt_reply; /* how to reject recipients */
90  int command_count; /* error + junk command count */
91  const char *protocol; /* SMTP or ESMTP */
92  char *helo_name; /* SMTP helo/ehlo */
93  char *sender; /* MAIL FROM */
94  VSTRING *cmd_buffer; /* command read buffer */
95  int read_state; /* command read state machine */
96  /* smtpd(8) compatibility */
97  int ehlo_discard_mask; /* EHLO filter */
98  VSTRING *expand_buf; /* macro expansion */
99  const char *where; /* SMTP protocol state */
100 } PSC_STATE;
101 
102  /*
103  * Special expiration time values.
104  */
105 #define PSC_TIME_STAMP_NEW (0) /* test was never passed */
106 #define PSC_TIME_STAMP_DISABLED (1) /* never passed but disabled */
107 #define PSC_TIME_STAMP_INVALID (-1) /* must not be cached */
108 
109  /*
110  * Status flags.
111  */
112 #define PSC_STATE_FLAG_NOFORWARD (1<<0) /* don't forward this session */
113 #define PSC_STATE_FLAG_USING_TLS (1<<1) /* using the TLS proxy */
114 #define PSC_STATE_FLAG_UNUSED2 (1<<2) /* use me! */
115 #define PSC_STATE_FLAG_NEW (1<<3) /* some test was never passed */
116 #define PSC_STATE_FLAG_BLIST_FAIL (1<<4) /* blacklisted */
117 #define PSC_STATE_FLAG_HANGUP (1<<5) /* NOT a test failure */
118 #define PSC_STATE_FLAG_SMTPD_X21 (1<<6) /* hang up after command */
119 #define PSC_STATE_FLAG_WLIST_FAIL (1<<7) /* do not whitelist */
120 #define PSC_STATE_FLAG_TEST_BASE (8) /* start of indexable flags */
121 
122  /*
123  * Tests whose flags and expiration time can be accessed by numerical index.
124  *
125  * Important: every MUMBLE_TODO flag must have a MUMBLE_PASS flag, such that
126  * MUMBLE_PASS == PSC_STATE_FLAGS_TODO_TO_PASS(MUMBLE_TODO).
127  *
128  * MUMBLE_TODO flags must not be cleared once raised. The _TODO_TO_PASS and
129  * _TODO_TO_DONE macros depend on this to decide that a group of tests is
130  * passed or completed.
131  *
132  * MUMBLE_DONE flags are used for "early" tests that have final results.
133  *
134  * MUMBLE_SKIP flags are used for "deep" tests where the client messed up.
135  * These flags look like MUMBLE_DONE but they are different. Deep tests can
136  * tentatively pass, but can still fail later in a session. The "ignore"
137  * action introduces an additional complication. MUMBLE_PASS indicates
138  * either that a deep test passed tentatively, or that the test failed but
139  * the result was ignored. MUMBLE_FAIL, on the other hand, is always final.
140  * We use MUMBLE_SKIP to indicate that a decision was either "fail" or
141  * forced "pass".
142  *
143  * The difference between DONE and SKIP is in the beholder's eye. These flags
144  * share the same bit.
145  */
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)
148 
149 #define PSC_STATE_FLAG_SHIFT_FAIL (0) /* failed test */
150 #define PSC_STATE_FLAG_SHIFT_PASS (1) /* passed test */
151 #define PSC_STATE_FLAG_SHIFT_TODO (2) /* expired test */
152 #define PSC_STATE_FLAG_SHIFT_DONE (3) /* decision is final */
153 #define PSC_STATE_FLAG_SHIFT_SKIP (3) /* action is already logged */
154 #define PSC_STATE_FLAG_SHIFT_STRIDE (4) /* nr of flags per test */
155 
156 #define PSC_STATE_FLAG_SHIFT_BYFNAME(fname) (PSC_STATE_FLAG_SHIFT_ ## fname)
157 
158  /*
159  * Indexable per-test flags. These are used for DNS whitelisting multiple
160  * tests, without needing per-test ad-hoc code.
161  */
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)))
166 
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)
177 
178  /*
179  * Flags with distinct names. These are used in the per-test ad-hoc code.
180  */
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)))
185 
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)
190 
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)
195 
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)
200 
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)
205 
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)
210 
211  /*
212  * Aggregates for individual tests.
213  */
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)
224 
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)
233 
234 #define PSC_STATE_MASK_PREGR_FAIL_DONE \
235  (PSC_STATE_FLAG_PREGR_FAIL | PSC_STATE_FLAG_PREGR_DONE)
236 
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)
243 
244  /*
245  * Separate aggregates for early tests and deep tests.
246  */
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)
255 
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)
265 
266  /*
267  * Super-aggregates for all tests combined.
268  */
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)
273 
274 #define PSC_STATE_MASK_ANY_PASS \
275  (PSC_STATE_MASK_EARLY_PASS | PSC_STATE_MASK_SMTPD_PASS)
276 
277 #define PSC_STATE_MASK_ANY_TODO \
278  (PSC_STATE_MASK_EARLY_TODO | PSC_STATE_MASK_SMTPD_TODO)
279 
280 #define PSC_STATE_MASK_ANY_TODO_FAIL \
281  (PSC_STATE_MASK_ANY_TODO | PSC_STATE_MASK_ANY_FAIL)
282 
283 #define PSC_STATE_MASK_ANY_UPDATE \
284  (PSC_STATE_MASK_ANY_PASS)
285 
286  /*
287  * Meta-commands for state->where that reflect the initial command processor
288  * state and commands that aren't implemented.
289  */
290 #define PSC_SMTPD_CMD_CONNECT "CONNECT"
291 #define PSC_SMTPD_CMD_UNIMPL "UNIMPLEMENTED"
292 
293  /*
294  * See log_adhoc.c for discussion.
295  */
296 typedef struct {
297  int dt_sec; /* make sure it's signed */
298  int dt_usec; /* make sure it's signed */
299 } DELTA_TIME;
300 
301 #define PSC_CALC_DELTA(x, y, z) \
302  do { \
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; \
307  (x).dt_sec -= 1; \
308  } \
309  while ((x).dt_usec >= 1000000) { \
310  (x).dt_usec -= 1000000; \
311  (x).dt_sec += 1; \
312  } \
313  if ((x).dt_sec < 0) \
314  (x).dt_sec = (x).dt_usec = 0; \
315  } while (0)
316 
317 #define SIG_DIGS 2
318 
319  /*
320  * Event management.
321  */
322 
323 /* PSC_READ_EVENT_REQUEST - prepare for transition to next state */
324 
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)); \
330  } while (0)
331 
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)); \
337  } while (0)
338 
339 /* PSC_CLEAR_EVENT_REQUEST - complete state transition */
340 
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)); \
346  } while (0)
347 
348  /*
349  * Failure enforcement policies.
350  */
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"
355 
356 #define PSC_ACT_DROP 1
357 #define PSC_ACT_ENFORCE 2
358 #define PSC_ACT_IGNORE 3
359 
360  /*
361  * Global variables.
362  */
363 extern int psc_check_queue_length; /* connections being checked */
364 extern int psc_post_queue_length; /* being sent to real SMTPD */
365 extern DICT_CACHE *psc_cache_map; /* cache table handle */
366 extern VSTRING *psc_temp; /* scratchpad */
367 extern char *psc_smtpd_service_name; /* path to real SMTPD */
368 extern int psc_pregr_action; /* PSC_ACT_DROP etc. */
369 extern int psc_dnsbl_action; /* PSC_ACT_DROP etc. */
370 extern int psc_pipel_action; /* PSC_ACT_DROP etc. */
371 extern int psc_nsmtp_action; /* PSC_ACT_DROP etc. */
372 extern int psc_barlf_action; /* PSC_ACT_DROP etc. */
373 extern int psc_min_ttl; /* Update with new tests! */
374 extern STRING_LIST *psc_forbid_cmds; /* CONNECT GET POST */
375 extern int psc_stress_greet_wait; /* stressed greet wait */
376 extern int psc_normal_greet_wait; /* stressed greet wait */
377 extern int psc_stress_cmd_time_limit; /* stressed command limit */
378 extern int psc_normal_cmd_time_limit; /* normal command time limit */
379 extern int psc_stress; /* stress level */
380 extern int psc_lowat_check_queue_length;/* stress low-water mark */
381 extern int psc_hiwat_check_queue_length;/* stress high-water mark */
382 extern DICT *psc_dnsbl_reply; /* DNSBL name mapper */
383 extern HTABLE *psc_client_concurrency; /* per-client concurrency */
384 
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)
389 
390  /*
391  * String plumbing macros.
392  */
393 #define PSC_STRING_UPDATE(str, text) do { \
394  if (str) myfree(str); \
395  (str) = ((text) ? mystrdup(text) : 0); \
396  } while (0)
397 
398 #define PSC_STRING_RESET(str) do { \
399  if (str) { \
400  myfree(str); \
401  (str) = 0; \
402  } \
403  } while (0)
404 
405  /*
406  * SLMs.
407  */
408 #define STR(x) vstring_str(x)
409 #define LEN(x) VSTRING_LEN(x)
410 
411  /*
412  * postscreen_state.c
413  */
414 #define PSC_CLIENT_ADDR_PORT(state) \
415  (state)->smtp_client_addr, (state)->smtp_client_port
416 
417 #define PSC_PASS_SESSION_STATE(state, what, bits) do { \
418  if (msg_verbose) \
419  msg_info("PASS %s [%s]:%s", (what), PSC_CLIENT_ADDR_PORT(state)); \
420  (state)->flags |= (bits); \
421  } while (0)
422 #define PSC_FAIL_SESSION_STATE(state, bits) do { \
423  if (msg_verbose) \
424  msg_info("FAIL [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
425  (state)->flags |= (bits); \
426  } while (0)
427 #define PSC_SKIP_SESSION_STATE(state, what, bits) do { \
428  if (msg_verbose) \
429  msg_info("SKIP %s [%s]:%s", (what), PSC_CLIENT_ADDR_PORT(state)); \
430  (state)->flags |= (bits); \
431  } while (0)
432 #define PSC_DROP_SESSION_STATE(state, reply) do { \
433  if (msg_verbose) \
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); \
438  } while (0)
439 #define PSC_ENFORCE_SESSION_STATE(state, reply) do { \
440  if (msg_verbose) \
441  msg_info("ENFORCE [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
442  (state)->rcpt_reply = (reply); \
443  (state)->flags |= PSC_STATE_FLAG_NOFORWARD; \
444  } while (0)
445 #define PSC_UNPASS_SESSION_STATE(state, bits) do { \
446  if (msg_verbose) \
447  msg_info("UNPASS [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
448  (state)->flags &= ~(bits); \
449  } while (0)
450 #define PSC_UNFAIL_SESSION_STATE(state, bits) do { \
451  if (msg_verbose) \
452  msg_info("UNFAIL [%s]:%s", PSC_CLIENT_ADDR_PORT(state)); \
453  (state)->flags &= ~(bits); \
454  } while (0)
455 #define PSC_ADD_SERVER_STATE(state, fd) do { \
456  (state)->smtp_server_fd = (fd); \
457  psc_post_queue_length++; \
458  } while (0)
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--; \
463  } while (0)
464 extern PSC_STATE *psc_new_session_state(VSTREAM *, const char *, const char *, const char *, const char *);
465 extern void psc_free_session_state(PSC_STATE *);
466 extern const char *psc_print_state_flags(int, const char *);
467 
468  /*
469  * postscreen_dict.c
470  */
471 extern int psc_addr_match_list_match(ADDR_MATCH_LIST *, const char *);
472 extern const char *psc_cache_lookup(DICT_CACHE *, const char *);
473 extern void psc_cache_update(DICT_CACHE *, const char *, const char *);
474 const char *psc_dict_get(DICT *, const char *);
475 const char *psc_maps_find(MAPS *, const char *, int);
476 
477  /*
478  * postscreen_dnsbl.c
479  */
480 extern void psc_dnsbl_init(void);
481 extern int psc_dnsbl_retrieve(const char *, const char **, int, int *);
482 extern int psc_dnsbl_request(const char *, void (*) (int, void *), void *);
483 
484  /*
485  * postscreen_tests.c
486  */
487 #define PSC_INIT_TESTS(dst) do { \
488  time_t *_it_stamp_p; \
489  (dst)->flags = 0; \
490  for (_it_stamp_p = (dst)->client_info->expire_time; \
491  _it_stamp_p < (dst)->client_info->expire_time + PSC_TINDX_COUNT; \
492  _it_stamp_p++) \
493  *_it_stamp_p = PSC_TIME_STAMP_INVALID; \
494  } while (0)
495 #define PSC_INIT_TEST_FLAGS_ONLY(dst) do { \
496  (dst)->flags = 0; \
497  } while (0)
498 #define PSC_BEGIN_TESTS(state, name) do { \
499  (state)->test_name = (name); \
500  GETTIMEOFDAY(&(state)->start_time); \
501  } while (0)
502 extern void psc_new_tests(PSC_STATE *);
503 extern void psc_parse_tests(PSC_STATE *, const char *, time_t);
504 extern void psc_todo_tests(PSC_STATE *, time_t);
505 extern char *psc_print_tests(VSTRING *, PSC_STATE *);
506 extern char *psc_print_grey_key(VSTRING *, const char *, const char *,
507  const char *, const char *);
508 extern const char *psc_test_name(int);
509 
510 #define PSC_MIN(x, y) ((x) < (y) ? (x) : (y))
511 #define PSC_MAX(x, y) ((x) > (y) ? (x) : (y))
512 
513  /*
514  * postscreen_early.c
515  */
516 extern void psc_early_tests(PSC_STATE *);
517 extern void psc_early_init(void);
518 
519  /*
520  * postscreen_smtpd.c
521  */
522 extern void psc_smtpd_tests(PSC_STATE *);
523 extern void psc_smtpd_init(void);
524 extern void psc_smtpd_pre_jail_init(void);
525 
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); \
530  } while (0)
531 
532  /*
533  * postscreen_misc.c
534  */
535 extern char *psc_format_delta_time(VSTRING *, struct timeval, DELTA_TIME *);
536 extern void psc_conclude(PSC_STATE *);
537 extern void psc_hangup_event(PSC_STATE *);
538 
539  /*
540  * postscreen_send.c
541  */
542 #define PSC_SEND_REPLY psc_send_reply /* legacy macro */
543 extern int psc_send_reply(PSC_STATE *, const char *);
544 extern void psc_send_socket(PSC_STATE *);
545 
546  /*
547  * postscreen_starttls.c
548  */
550 
551  /*
552  * postscreen_expand.c
553  */
554 extern VSTRING *psc_expand_filter;
555 extern void psc_expand_init(void);
556 extern const char *psc_expand_lookup(const char *, int, void *);
557 
558  /*
559  * postscreen_endpt.c
560  */
561 typedef void (*PSC_ENDPT_LOOKUP_FN) (int, VSTREAM *,
563  MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *);
564 extern void psc_endpt_lookup(VSTREAM *, PSC_ENDPT_LOOKUP_FN);
565 
566  /*
567  * postscreen_access emulation.
568  */
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
573 
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))
577 
578 /* LICENSE
579 /* .ad
580 /* .fi
581 /* The Secure Mailer license must be distributed with this software.
582 /* AUTHOR(S)
583 /* Wietse Venema
584 /* IBM T.J. Watson Research
585 /* P.O. Box 704
586 /* Yorktown Heights, NY 10598, USA
587 /*
588 /* Wietse Venema
589 /* Google, Inc.
590 /* 111 8th Avenue
591 /* New York, NY 10011, USA
592 /*--*/
PSC_CLIENT_INFO * client_info
Definition: postscreen.h:83
#define PSC_TINDX_COUNT
Definition: postscreen.h:47
VSTRING * cmd_buffer
Definition: postscreen.h:94
char * psc_print_tests(VSTRING *, PSC_STATE *)
int command_count
Definition: postscreen.h:90
const char * rcpt_reply
Definition: postscreen.h:89
char * helo_name
Definition: postscreen.h:92
int psc_stress_greet_wait
Definition: postscreen.c:539
int ehlo_discard_mask
Definition: postscreen.h:97
char * sender
Definition: postscreen.h:93
int psc_check_queue_length
Definition: postscreen.c:527
int dnsbl_score
Definition: postscreen.h:85
const char * test_name
Definition: postscreen.h:82
#define STRING_LIST
Definition: string_list.h:22
void psc_send_socket(PSC_STATE *)
char * smtp_client_port
Definition: postscreen.h:75
int psc_pregr_action
Definition: postscreen.c:532
Definition: maps.h:22
int psc_dnsbl_action
Definition: postscreen.c:533
int psc_normal_cmd_time_limit
Definition: postscreen.c:542
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 *)
Definition: postscreen.h:561
void psc_expand_init(void)
int flags
Definition: postscreen.h:70
char * psc_print_grey_key(VSTRING *, const char *, const char *, const char *, const char *)
Definition: htable.h:25
int psc_dnsbl_request(const char *, void(*)(int, void *), void *)
int psc_send_reply(PSC_STATE *, const char *)
DICT * psc_dnsbl_reply
Definition: postscreen.c:546
void psc_smtpd_init(void)
int psc_barlf_action
Definition: postscreen.c:536
Definition: dict.h:78
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
Definition: postscreen.c:544
void psc_early_init(void)
#define ADDR_MATCH_LIST
const char * final_reply
Definition: postscreen.h:78
const char * where
Definition: postscreen.h:99
int dnsbl_ttl
Definition: postscreen.h:86
PSC_STATE * psc_new_session_state(VSTREAM *, const char *, const char *, const char *, const char *)
const char * psc_maps_find(MAPS *, const char *, int)
char * smtp_client_addr
Definition: postscreen.h:74
void psc_conclude(PSC_STATE *)
int psc_dnsbl_retrieve(const char *, const char **, int, int *)
int psc_nsmtp_action
Definition: postscreen.c:535
VSTRING * dnsbl_reply
Definition: postscreen.h:84
void psc_hangup_event(PSC_STATE *)
void psc_new_tests(PSC_STATE *)
void psc_todo_tests(PSC_STATE *, time_t)
char * smtp_server_addr
Definition: postscreen.h:76
const char * dnsbl_name
Definition: postscreen.h:87
int psc_hiwat_check_queue_length
Definition: postscreen.c:545
void(* EVENT_NOTIFY_FN)(int, void *)
Definition: events.h:22
int psc_stress
Definition: postscreen.c:543
int psc_stress_cmd_time_limit
Definition: postscreen.c:541
int psc_normal_greet_wait
Definition: postscreen.c:540
char * psc_format_delta_time(VSTRING *, struct timeval, DELTA_TIME *)
int smtp_server_fd
Definition: postscreen.h:73
const char * psc_expand_lookup(const char *, int, void *)
VSTRING * psc_expand_filter
void psc_smtpd_tests(PSC_STATE *)
VSTRING * send_buf
Definition: postscreen.h:79
int int
Definition: smtpd_proxy.h:21
void psc_endpt_lookup(VSTREAM *, PSC_ENDPT_LOOKUP_FN)
int psc_pipel_action
Definition: postscreen.c:534
VSTRING * psc_temp
Definition: postscreen.c:530
const char * protocol
Definition: postscreen.h:91
int dnsbl_index
Definition: postscreen.h:88
VSTRING * expand_buf
Definition: postscreen.h:98
DICT_CACHE * psc_cache_map
Definition: postscreen.c:529
const char * psc_test_name(int)
char * psc_smtpd_service_name
Definition: postscreen.c:531
STRING_LIST * psc_forbid_cmds
Definition: postscreen.c:538
void psc_dnsbl_init(void)
void psc_free_session_state(PSC_STATE *)
void psc_cache_update(DICT_CACHE *, const char *, const char *)
char * smtp_server_port
Definition: postscreen.h:77
int read_state
Definition: postscreen.h:95
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
Definition: postscreen.c:528
VSTREAM * smtp_client_stream
Definition: postscreen.h:72
void psc_parse_tests(PSC_STATE *, const char *, time_t)
HTABLE * psc_client_concurrency
Definition: postscreen.c:547
int psc_min_ttl
Definition: postscreen.c:537