Postfix3.3.1
smtpd.h
[詳解]
1 /*++
2 /* NAME
3 /* smtpd 3h
4 /* SUMMARY
5 /* smtp server
6 /* SYNOPSIS
7 /* include "smtpd.h"
8 /* DESCRIPTION
9 /* .nf
10 
11  /*
12  * System library.
13  */
14 #include <sys/time.h>
15 #include <unistd.h>
16 
17  /*
18  * Utility library.
19  */
20 #include <vstream.h>
21 #include <vstring.h>
22 #include <argv.h>
23 #include <myaddrinfo.h>
24 
25  /*
26  * Global library.
27  */
28 #include <mail_stream.h>
29 
30  /*
31  * Postfix TLS library.
32  */
33 #include <tls.h>
34 
35  /*
36  * Milter library.
37  */
38 #include <milter.h>
39 
40  /*
41  * Variables that keep track of conversation state. There is only one SMTP
42  * conversation at a time, so the state variables can be made global. And
43  * some of this has to be global anyway, so that the run-time error handler
44  * can clean up in case of a fatal error deep down in some library routine.
45  */
46 typedef struct SMTPD_DEFER {
47  int active; /* is this active */
48  VSTRING *reason; /* reason for deferral */
49  VSTRING *dsn; /* DSN detail */
50  int code; /* SMTP reply code */
51  int class; /* error notification class */
52 } SMTPD_DEFER;
53 
54 typedef struct {
55  int flags; /* XFORWARD server state */
56  char *name; /* name for access control */
57  char *addr; /* address for access control */
58  char *port; /* port for logging */
59  char *namaddr; /* name[address]:port */
60  char *rfc_addr; /* address for RFC 2821 */
61  char *protocol; /* email protocol */
62  char *helo_name; /* helo/ehlo parameter */
63  char *ident; /* local message identifier */
64  char *domain; /* rewrite context */
66 
67 typedef struct {
68  int flags; /* see below */
69  int err; /* cleanup server/queue file errors */
70  VSTREAM *client; /* SMTP client handle */
71  VSTRING *buffer; /* SMTP client buffer */
72  VSTRING *addr_buf; /* internalized address buffer */
73  char *service; /* for event rate control */
74  struct timeval arrival_time; /* start of MAIL FROM transaction */
75  char *name; /* verified client hostname */
76  char *reverse_name; /* unverified client hostname */
77  char *addr; /* client host address string */
78  char *port; /* port for logging */
79  char *namaddr; /* name[address]:port */
80  char *rfc_addr; /* address for RFC 2821 */
81  int addr_family; /* address family */
82  char *dest_addr; /* Dovecot AUTH, Milter {daemon_addr} */
83  char *dest_port; /* Milter {daemon_port} */
84  struct sockaddr_storage sockaddr; /* binary client endpoint */
85  SOCKADDR_SIZE sockaddr_len; /* binary client endpoint */
86  struct sockaddr_storage dest_sockaddr; /* binary local endpoint */
87  SOCKADDR_SIZE dest_sockaddr_len; /* binary local endpoint */
88  int name_status; /* 2=ok 4=soft 5=hard 6=forged */
89  int reverse_name_status; /* 2=ok 4=soft 5=hard */
90  int conn_count; /* connections from this client */
91  int conn_rate; /* connection rate for this client */
92  int error_count; /* reset after DOT */
93  int error_mask; /* client errors */
94  int notify_mask; /* what to report to postmaster */
95  char *helo_name; /* client HELO/EHLO argument */
96  char *queue_id; /* from cleanup server/queue file */
97  VSTREAM *cleanup; /* cleanup server/queue file handle */
98  MAIL_STREAM *dest; /* another server/file handle */
99  int rcpt_count; /* number of accepted recipients */
100  char *access_denied; /* fixme */
101  ARGV *history; /* protocol transcript */
102  char *reason; /* cause of connection loss */
103  char *sender; /* sender address */
104  char *encoding; /* owned by mail_cmd() */
105  char *verp_delims; /* owned by mail_cmd() */
106  char *recipient; /* recipient address */
107  char *etrn_name; /* client ETRN argument */
108  char *protocol; /* SMTP or ESMTP */
109  char *where; /* protocol stage */
110  int recursion; /* Kellerspeicherpegelanzeiger */
111  off_t msg_size; /* MAIL FROM message size */
112  off_t act_size; /* END-OF-DATA message size */
113  int junk_cmds; /* counter */
114  int rcpt_overshoot; /* counter */
115  char *rewrite_context; /* address rewriting context */
116 
117  /*
118  * SASL specific.
119  */
120 #ifdef USE_SASL_AUTH
121  struct XSASL_SERVER *sasl_server;
122  VSTRING *sasl_reply;
123  char *sasl_mechanism_list;
124  char *sasl_method;
125  char *sasl_username;
126  char *sasl_sender;
127 #endif
128 
129  /*
130  * Specific to smtpd access checks.
131  */
132  int sender_rcptmap_checked; /* sender validated against maps */
133  int recipient_rcptmap_checked; /* recipient validated against maps */
134  int warn_if_reject; /* force reject into warning */
135  SMTPD_DEFER defer_if_reject; /* force reject into deferral */
136  SMTPD_DEFER defer_if_permit; /* force permit into deferral */
137  int defer_if_permit_client; /* force permit into warning */
138  int defer_if_permit_helo; /* force permit into warning */
139  int defer_if_permit_sender; /* force permit into warning */
140  int discard; /* discard message */
141  char *saved_filter; /* postponed filter action */
142  char *saved_redirect; /* postponed redirect action */
143  ARGV *saved_bcc; /* postponed bcc action */
144  int saved_flags; /* postponed hold/discard */
145 #ifdef DELAY_ACTION
146  int saved_delay; /* postponed deferred delay */
147 #endif
148  VSTRING *expand_buf; /* scratch space for $name expansion */
149  ARGV *prepend; /* prepended headers */
150  VSTRING *instance; /* policy query correlation */
151  int seqno; /* policy query correlation */
152  int ehlo_discard_mask; /* suppressed EHLO features */
153  char *dsn_envid; /* temporary MAIL FROM state */
154  int dsn_ret; /* temporary MAIL FROM state */
155  VSTRING *dsn_buf; /* scratch space for xtext expansion */
156  VSTRING *dsn_orcpt_buf; /* scratch space for ORCPT parsing */
157 
158  /*
159  * Pass-through proxy client.
160  */
162  char *proxy_mail; /* owned by mail_cmd() */
163 
164  /*
165  * XFORWARD server state.
166  */
167  SMTPD_XFORWARD_ATTR xforward; /* up-stream logging info */
168 
169  /*
170  * TLS related state.
171  */
172 #ifdef USE_TLS
173 #ifdef USE_TLSPROXY
174  VSTREAM *tlsproxy; /* tlsproxy(8) temp. handle */
175 #endif
176  TLS_SESS_STATE *tls_context; /* TLS session state */
177 #endif
178 
179  /*
180  * Milter support.
181  */
182  const char **milter_argv; /* SMTP command vector */
183  ssize_t milter_argc; /* SMTP command vector */
184  const char *milter_reject_text; /* input to call-back from Milter */
185  MILTERS *milters; /* Milter initialization status.*/
186 
187  /*
188  * EHLO temporary space.
189  */
192 } SMTPD_STATE;
193 
194 #define SMTPD_FLAG_HANGUP (1<<0) /* 421/521 disconnect */
195 #define SMTPD_FLAG_ILL_PIPELINING (1<<1) /* inappropriate pipelining */
196 #define SMTPD_FLAG_AUTH_USED (1<<2) /* don't reuse SASL state */
197 #define SMTPD_FLAG_SMTPUTF8 (1<<3) /* RFC 6531/2 transaction */
198 
199  /* Security: don't reset SMTPD_FLAG_AUTH_USED. */
200 #define SMTPD_MASK_MAIL_KEEP \
201  ~(SMTPD_FLAG_SMTPUTF8) /* Fix 20140706 */
202 
203 #define SMTPD_STATE_XFORWARD_INIT (1<<0) /* xforward preset done */
204 #define SMTPD_STATE_XFORWARD_NAME (1<<1) /* client name received */
205 #define SMTPD_STATE_XFORWARD_ADDR (1<<2) /* client address received */
206 #define SMTPD_STATE_XFORWARD_PROTO (1<<3) /* protocol received */
207 #define SMTPD_STATE_XFORWARD_HELO (1<<4) /* client helo received */
208 #define SMTPD_STATE_XFORWARD_IDENT (1<<5) /* message identifier */
209 #define SMTPD_STATE_XFORWARD_DOMAIN (1<<6) /* address context */
210 #define SMTPD_STATE_XFORWARD_PORT (1<<7) /* client port received */
211 
212 #define SMTPD_STATE_XFORWARD_CLIENT_MASK \
213  (SMTPD_STATE_XFORWARD_NAME | SMTPD_STATE_XFORWARD_ADDR \
214  | SMTPD_STATE_XFORWARD_PROTO | SMTPD_STATE_XFORWARD_HELO \
215  | SMTPD_STATE_XFORWARD_PORT)
216 
217 extern void smtpd_state_init(SMTPD_STATE *, VSTREAM *, const char *);
218 extern void smtpd_state_reset(SMTPD_STATE *);
219 
220  /*
221  * Conversation stages. This is used for "lost connection after XXX"
222  * diagnostics.
223  */
224 #define SMTPD_AFTER_CONNECT "CONNECT"
225 #define SMTPD_AFTER_DATA "DATA content"
226 #define SMTPD_AFTER_DOT "END-OF-MESSAGE"
227 
228  /*
229  * Other stages. These are sometimes used to change the way information is
230  * logged or what information will be available for access control.
231  */
232 #define SMTPD_CMD_HELO "HELO"
233 #define SMTPD_CMD_EHLO "EHLO"
234 #define SMTPD_CMD_STARTTLS "STARTTLS"
235 #define SMTPD_CMD_AUTH "AUTH"
236 #define SMTPD_CMD_MAIL "MAIL"
237 #define SMTPD_CMD_RCPT "RCPT"
238 #define SMTPD_CMD_DATA "DATA"
239 #define SMTPD_CMD_EOD SMTPD_AFTER_DOT /* XXX Was: END-OF-DATA */
240 #define SMTPD_CMD_RSET "RSET"
241 #define SMTPD_CMD_NOOP "NOOP"
242 #define SMTPD_CMD_VRFY "VRFY"
243 #define SMTPD_CMD_ETRN "ETRN"
244 #define SMTPD_CMD_QUIT "QUIT"
245 #define SMTPD_CMD_XCLIENT "XCLIENT"
246 #define SMTPD_CMD_XFORWARD "XFORWARD"
247 #define SMTPD_CMD_UNKNOWN "UNKNOWN"
248 
249  /*
250  * Representation of unknown and non-existent client information. Throughout
251  * Postfix, we use the "unknown" string value for unknown client information
252  * (e.g., unknown remote client hostname), and we use the empty string, null
253  * pointer or "no queue file record" for non-existent client information
254  * (e.g., no HELO command, or local submission).
255  *
256  * Inside the SMTP server, unknown real client attributes are represented by
257  * the string "unknown", and non-existent HELO is represented as a null
258  * pointer. The SMTP server uses this same representation internally for
259  * forwarded client attributes; the XFORWARD syntax makes no distinction
260  * between unknown (remote submission) and non-existent (local submission).
261  *
262  * The SMTP client sends forwarded client attributes only when upstream client
263  * attributes exist (i.e. remote submission). Thus, local submissions will
264  * appear to come from an SMTP-based content filter, which is acceptable.
265  *
266  * Known/unknown client attribute values use the SMTP server's internal
267  * representation in queue files, in queue manager delivery requests, and in
268  * delivery agent $name expansions.
269  *
270  * Non-existent attribute values are never present in queue files. Non-existent
271  * information is represented as empty strings in queue manager delivery
272  * requests and in delivery agent $name expansions.
273  */
274 #define CLIENT_ATTR_UNKNOWN "unknown"
275 
276 #define CLIENT_NAME_UNKNOWN CLIENT_ATTR_UNKNOWN
277 #define CLIENT_ADDR_UNKNOWN CLIENT_ATTR_UNKNOWN
278 #define CLIENT_PORT_UNKNOWN CLIENT_ATTR_UNKNOWN
279 #define CLIENT_NAMADDR_UNKNOWN CLIENT_ATTR_UNKNOWN
280 #define CLIENT_HELO_UNKNOWN 0
281 #define CLIENT_PROTO_UNKNOWN CLIENT_ATTR_UNKNOWN
282 #define CLIENT_IDENT_UNKNOWN 0
283 #define CLIENT_DOMAIN_UNKNOWN 0
284 #define CLIENT_LOGIN_UNKNOWN 0
285 
286 #define SERVER_ATTR_UNKNOWN "unknown"
287 
288 #define SERVER_ADDR_UNKNOWN SERVER_ATTR_UNKNOWN
289 #define SERVER_PORT_UNKNOWN SERVER_ATTR_UNKNOWN
290 
291 #define IS_AVAIL_CLIENT_ATTR(v) ((v) && strcmp((v), CLIENT_ATTR_UNKNOWN))
292 
293 #define IS_AVAIL_CLIENT_NAME(v) IS_AVAIL_CLIENT_ATTR(v)
294 #define IS_AVAIL_CLIENT_ADDR(v) IS_AVAIL_CLIENT_ATTR(v)
295 #define IS_AVAIL_CLIENT_PORT(v) IS_AVAIL_CLIENT_ATTR(v)
296 #define IS_AVAIL_CLIENT_NAMADDR(v) IS_AVAIL_CLIENT_ATTR(v)
297 #define IS_AVAIL_CLIENT_HELO(v) ((v) != 0)
298 #define IS_AVAIL_CLIENT_PROTO(v) IS_AVAIL_CLIENT_ATTR(v)
299 #define IS_AVAIL_CLIENT_IDENT(v) ((v) != 0)
300 #define IS_AVAIL_CLIENT_DOMAIN(v) ((v) != 0)
301 
302  /*
303  * If running in stand-alone mode, do not try to talk to Postfix daemons but
304  * write to queue file instead.
305  */
306 #define SMTPD_STAND_ALONE_STREAM(stream) \
307  (stream == VSTREAM_IN && getuid() != var_owner_uid)
308 
309 #define SMTPD_STAND_ALONE(state) \
310  (state->client == VSTREAM_IN && getuid() != var_owner_uid)
311 
312  /*
313  * If running as proxy front-end, disable actions that require communication
314  * with the cleanup server.
315  */
316 #define USE_SMTPD_PROXY(state) \
317  (SMTPD_STAND_ALONE(state) == 0 && *var_smtpd_proxy_filt)
318 
319  /*
320  * Are we in a MAIL transaction?
321  */
322 #define SMTPD_IN_MAIL_TRANSACTION(state) ((state)->sender != 0)
323 
324  /*
325  * SMTPD peer information lookup.
326  */
327 extern void smtpd_peer_init(SMTPD_STATE *state);
328 extern void smtpd_peer_reset(SMTPD_STATE *state);
329 extern int smtpd_peer_from_haproxy(SMTPD_STATE *state);
330 
331 #define SMTPD_PEER_CODE_OK 2
332 #define SMTPD_PEER_CODE_TEMP 4
333 #define SMTPD_PEER_CODE_PERM 5
334 #define SMTPD_PEER_CODE_FORGED 6
335 
336  /*
337  * Construct name[addr] or name[addr]:port as appropriate
338  */
339 #define SMTPD_BUILD_NAMADDRPORT(name, addr, port) \
340  concatenate((name), "[", (addr), "]", \
341  var_smtpd_client_port_log ? ":" : (char *) 0, \
342  (port), (char *) 0)
343 
344  /*
345  * Don't mix information from the current SMTP session with forwarded
346  * information from an up-stream session.
347  */
348 #define HAVE_FORWARDED_CLIENT_ATTR(s) \
349  ((s)->xforward.flags & SMTPD_STATE_XFORWARD_CLIENT_MASK)
350 
351 #define FORWARD_CLIENT_ATTR(s, a) \
352  (HAVE_FORWARDED_CLIENT_ATTR(s) ? \
353  (s)->xforward.a : (s)->a)
354 
355 #define FORWARD_ADDR(s) FORWARD_CLIENT_ATTR((s), rfc_addr)
356 #define FORWARD_NAME(s) FORWARD_CLIENT_ATTR((s), name)
357 #define FORWARD_NAMADDR(s) FORWARD_CLIENT_ATTR((s), namaddr)
358 #define FORWARD_PROTO(s) FORWARD_CLIENT_ATTR((s), protocol)
359 #define FORWARD_HELO(s) FORWARD_CLIENT_ATTR((s), helo_name)
360 #define FORWARD_PORT(s) FORWARD_CLIENT_ATTR((s), port)
361 
362  /*
363  * Mixing is not a problem with forwarded local message identifiers.
364  */
365 #define HAVE_FORWARDED_IDENT(s) \
366  ((s)->xforward.ident != 0)
367 
368 #define FORWARD_IDENT(s) \
369  (HAVE_FORWARDED_IDENT(s) ? \
370  (s)->xforward.ident : (s)->queue_id)
371 
372  /*
373  * Mixing is not a problem with forwarded address rewriting contexts.
374  */
375 #define FORWARD_DOMAIN(s) \
376  (((s)->xforward.flags & SMTPD_STATE_XFORWARD_DOMAIN) ? \
377  (s)->xforward.domain : (s)->rewrite_context)
378 
379 extern void smtpd_xforward_init(SMTPD_STATE *);
380 extern void smtpd_xforward_preset(SMTPD_STATE *);
381 extern void smtpd_xforward_reset(SMTPD_STATE *);
382 
383  /*
384  * Transparency: before mail is queued, do we check for unknown recipients,
385  * do we allow address mapping, automatic bcc, header/body checks?
386  */
387 extern int smtpd_input_transp_mask;
388 
389  /*
390  * More Milter support.
391  */
392 extern MILTERS *smtpd_milters;
393 
394  /*
395  * Message size multiplication factor for free space check.
396  */
397 extern double smtpd_space_multf;
398 
399 /* LICENSE
400 /* .ad
401 /* .fi
402 /* The Secure Mailer license must be distributed with this software.
403 /* AUTHOR(S)
404 /* Wietse Venema
405 /* IBM T.J. Watson Research
406 /* P.O. Box 704
407 /* Yorktown Heights, NY 10598, USA
408 /*
409 /* Wietse Venema
410 /* Google, Inc.
411 /* 111 8th Avenue
412 /* New York, NY 10011, USA
413 /*
414 /* TLS support originally by:
415 /* Lutz Jaenicke
416 /* BTU Cottbus
417 /* Allgemeine Elektrotechnik
418 /* Universitaetsplatz 3-4
419 /* D-03044 Cottbus, Germany
420 /*--*/
SMTPD_XFORWARD_ATTR xforward
Definition: smtpd.h:167
int defer_if_permit_sender
Definition: smtpd.h:139
VSTRING * ehlo_buf
Definition: smtpd.h:190
int rcpt_overshoot
Definition: smtpd.h:114
char * rfc_addr
Definition: smtpd.h:60
char * dest_port
Definition: smtpd.h:83
VSTRING * buffer
Definition: smtpd.h:71
Definition: argv.h:17
char * saved_redirect
Definition: smtpd.h:142
int junk_cmds
Definition: smtpd.h:113
off_t act_size
Definition: smtpd.h:112
void smtpd_peer_init(SMTPD_STATE *state)
Definition: smtpd_peer.c:573
MILTERS * smtpd_milters
char * queue_id
Definition: smtpd.h:96
char * name
Definition: smtpd.h:75
char * saved_filter
Definition: smtpd.h:141
int ehlo_discard_mask
Definition: smtpd.h:152
VSTREAM * cleanup
Definition: smtpd.h:97
int seqno
Definition: smtpd.h:151
VSTRING * reason
Definition: smtpd.h:48
char * encoding
Definition: smtpd.h:104
VSTRING * dsn
Definition: smtpd.h:49
ssize_t milter_argc
Definition: smtpd.h:183
char * rewrite_context
Definition: smtpd.h:115
char * dsn_envid
Definition: smtpd.h:153
VSTRING * expand_buf
Definition: smtpd.h:148
char * protocol
Definition: smtpd.h:61
char * helo_name
Definition: smtpd.h:95
int warn_if_reject
Definition: smtpd.h:134
char * proxy_mail
Definition: smtpd.h:162
#define SOCKADDR_SIZE
Definition: sys_defs.h:1411
int addr_family
Definition: smtpd.h:81
int code
Definition: smtpd.h:50
char * reason
Definition: smtpd.h:102
VSTREAM * client
Definition: smtpd.h:70
VSTRING * addr_buf
Definition: smtpd.h:72
int sender_rcptmap_checked
Definition: smtpd.h:132
MAIL_STREAM * dest
Definition: smtpd.h:98
char * domain
Definition: smtpd.h:64
struct SMTPD_DEFER SMTPD_DEFER
SMTPD_DEFER defer_if_permit
Definition: smtpd.h:136
const char * milter_reject_text
Definition: smtpd.h:184
char * access_denied
Definition: smtpd.h:100
int notify_mask
Definition: smtpd.h:94
VSTRING * dsn_orcpt_buf
Definition: smtpd.h:156
char * port
Definition: smtpd.h:78
ARGV * saved_bcc
Definition: smtpd.h:143
int smtpd_input_transp_mask
Definition: smtpd.c:1467
char * namaddr
Definition: smtpd.h:59
off_t msg_size
Definition: smtpd.h:111
void smtpd_peer_reset(SMTPD_STATE *state)
Definition: smtpd_peer.c:631
char * sender
Definition: smtpd.h:103
SOCKADDR_SIZE dest_sockaddr_len
Definition: smtpd.h:87
void smtpd_xforward_init(SMTPD_STATE *)
char * ident
Definition: smtpd.h:63
char * etrn_name
Definition: smtpd.h:107
SMTPD_DEFER defer_if_reject
Definition: smtpd.h:135
int dsn_ret
Definition: smtpd.h:154
ARGV * prepend
Definition: smtpd.h:149
char * where
Definition: smtpd.h:109
int error_mask
Definition: smtpd.h:93
int defer_if_permit_client
Definition: smtpd.h:137
char * reverse_name
Definition: smtpd.h:76
int defer_if_permit_helo
Definition: smtpd.h:138
const char ** milter_argv
Definition: smtpd.h:182
int name_status
Definition: smtpd.h:88
char * helo_name
Definition: smtpd.h:62
ARGV * ehlo_argv
Definition: smtpd.h:191
int reverse_name_status
Definition: smtpd.h:89
struct SMTPD_PROXY * proxy
Definition: smtpd.h:161
int active
Definition: smtpd.h:47
SOCKADDR_SIZE sockaddr_len
Definition: smtpd.h:85
void smtpd_xforward_reset(SMTPD_STATE *)
void smtpd_state_init(SMTPD_STATE *, VSTREAM *, const char *)
Definition: smtpd_state.c:78
char * dest_addr
Definition: smtpd.h:82
double smtpd_space_multf
Definition: smtpd_check.c:469
char * addr
Definition: smtpd.h:77
void smtpd_xforward_preset(SMTPD_STATE *)
int err
Definition: smtpd.h:69
int rcpt_count
Definition: smtpd.h:99
MILTERS * milters
Definition: smtpd.h:185
int discard
Definition: smtpd.h:140
char * recipient
Definition: smtpd.h:106
int flags
Definition: smtpd.h:68
VSTRING * dsn_buf
Definition: smtpd.h:155
int smtpd_peer_from_haproxy(SMTPD_STATE *state)
Definition: smtpd_haproxy.c:92
int conn_count
Definition: smtpd.h:90
int recipient_rcptmap_checked
Definition: smtpd.h:133
char * protocol
Definition: smtpd.h:108
char * rfc_addr
Definition: smtpd.h:80
int recursion
Definition: smtpd.h:110
int error_count
Definition: smtpd.h:92
int saved_flags
Definition: smtpd.h:144
char * service
Definition: smtpd.h:73
char * namaddr
Definition: smtpd.h:79
ARGV * history
Definition: smtpd.h:101
char * verp_delims
Definition: smtpd.h:105
VSTRING * instance
Definition: smtpd.h:150
void smtpd_state_reset(SMTPD_STATE *)
Definition: smtpd_state.c:190
int conn_rate
Definition: smtpd.h:91