1 /*        $NetBSD: mail_proto.h,v 1.6 2025/02/25 19:15:45 christos Exp $        */
2 
3 #ifndef _MAIL_PROTO_H_INCLUDED_
4 #define _MAIL_PROTO_H_INCLUDED_
5 
6 /*++
7 /* NAME
8 /*        mail_proto 3h
9 /* SUMMARY
10 /*        mail internal and external protocol support
11 /* SYNOPSIS
12 /*        #include <mail_proto.h>
13 /* DESCRIPTION
14 /* .nf
15 
16  /*
17   * System library.
18   */
19 #include <stdarg.h>
20 #include <string.h>
21 
22  /*
23   * Utility library.
24   */
25 #include <vstream.h>
26 #include <iostuff.h>
27 #include <attr.h>
28 
29  /*
30   * External protocols.
31   */
32 #define MAIL_PROTO_SMTP                 "SMTP"
33 #define MAIL_PROTO_ESMTP      "ESMTP"
34 #define MAIL_PROTO_QMQP                 "QMQP"
35 
36  /*
37   * Names of services: these are the names of the UNIX-domain socket or FIFO
38   * that a service listens on.
39   */
40 #define MAIL_SERVICE_BOUNCE   "bounce"
41 #define MAIL_SERVICE_CLEANUP  "cleanup"
42 #define MAIL_SERVICE_DEFER    "defer"
43 #define MAIL_SERVICE_FORWARD  "forward"
44 #define MAIL_SERVICE_LOCAL    "local"
45 #define MAIL_SERVICE_PICKUP   "pickup"
46 #define MAIL_SERVICE_QUEUE    "qmgr"
47 #define MAIL_SERVICE_TLSMGR   "tlsmgr"
48 #define MAIL_SERVICE_RESOLVE  "resolve"
49 #define MAIL_SERVICE_REWRITE  "rewrite"
50 #define MAIL_SERVICE_VIRTUAL  "virtual"
51 #define MAIL_SERVICE_SMTP     "smtp"
52 #define MAIL_SERVICE_SMTPD    "smtpd"
53 #define MAIL_SERVICE_SHOWQ    "showq"
54 #define MAIL_SERVICE_ERROR    "error"
55 #define MAIL_SERVICE_RETRY    "retry"
56 #define MAIL_SERVICE_FLUSH    "flush"
57 #define MAIL_SERVICE_VERIFY   "verify"
58 #define MAIL_SERVICE_TRACE    "trace"
59 #define MAIL_SERVICE_RELAY    "relay"
60 #define MAIL_SERVICE_PROXYMAP "proxymap"
61 #define MAIL_SERVICE_PROXYWRITE         "proxywrite"
62 #define MAIL_SERVICE_SCACHE   "scache"
63 #define MAIL_SERVICE_DNSBLOG  "dnsblog"
64 #define MAIL_SERVICE_TLSPROXY "tlsproxy"
65 #define MAIL_SERVICE_POSTLOG  "postlog"
66 
67  /*
68   * Process names: convention is to use the basename of an executable file,
69   * but there is nothing to enforce that.
70   */
71 #define MAIL_PROC_NAME_SMTP   "smtp"
72 #define MAIL_PROC_NAME_LMTP   "lmtp"
73 
74  /*
75   * Mail source classes. Used to specify policy decisions for content
76   * inspection and SMTPUTF8 detection.
77   */
78 #define MAIL_SRC_NAME_SENDMAIL          "sendmail"          /* sendmail(1) */
79 #define MAIL_SRC_NAME_SMTPD   "smtpd"   /* smtpd(8) */
80 #define MAIL_SRC_NAME_QMQPD   "qmqpd"   /* qmqpd(8) */
81 #define MAIL_SRC_NAME_FORWARD "forward" /* local(8) forward/alias */
82 #define MAIL_SRC_NAME_BOUNCE  "bounce"/* bounce(8) */
83 #define MAIL_SRC_NAME_NOTIFY  "notify"/* protocol etc. errors */
84 #define MAIL_SRC_NAME_VERIFY  "verify"/* protocol etc. errors */
85 #define MAIL_SRC_NAME_ALL     "all"     /* all sources */
86 
87 #define MAIL_SRC_MASK_SENDMAIL          (1<<0)    /* sendmail(1) */
88 #define MAIL_SRC_MASK_SMTPD   (1<<1)    /* smtpd(8) */
89 #define MAIL_SRC_MASK_QMQPD   (1<<2)    /* qmqpd(8) */
90 #define MAIL_SRC_MASK_FORWARD (1<<3)    /* local(8) forward/alias */
91 #define MAIL_SRC_MASK_BOUNCE  (1<<4)    /* bounce(8) */
92 #define MAIL_SRC_MASK_NOTIFY  (1<<5)    /* protocol etc. errors */
93 #define MAIL_SRC_MASK_VERIFY  (1<<6)    /* protocol etc. errors */
94 
95 #define MAIL_SRC_MASK_ALL \
96           ( MAIL_SRC_MASK_SENDMAIL | MAIL_SRC_MASK_SMTPD \
97           | MAIL_SRC_MASK_QMQPD |  MAIL_SRC_MASK_FORWARD \
98           | MAIL_SRC_MASK_BOUNCE | MAIL_SRC_MASK_NOTIFY \
99           | MAIL_SRC_MASK_VERIFY)
100 
101  /*
102   * Well-known socket or FIFO directories. The main difference is in file
103   * access permissions.
104   */
105 #define MAIL_CLASS_PUBLIC     "public"
106 #define MAIL_CLASS_PRIVATE    "private"
107 
108  /*
109   * Generic triggers.
110   */
111 #define TRIGGER_REQ_WAKEUP    'W'       /* wakeup */
112 
113  /*
114   * Queue manager requests.
115   */
116 #define QMGR_REQ_SCAN_DEFERRED          'D'       /* scan deferred queue */
117 #define QMGR_REQ_SCAN_INCOMING          'I'       /* scan incoming queue */
118 #define QMGR_REQ_FLUSH_DEAD   'F'       /* flush dead xport/site */
119 #define QMGR_REQ_SCAN_ALL     'A'       /* ignore time stamps */
120 
121  /*
122   * Functional interface.
123   */
124 extern VSTREAM *mail_connect(const char *, const char *, int);
125 extern VSTREAM *mail_connect_wait(const char *, const char *);
126 extern int mail_command_client(const char *, const char *, const char *,...);
127 extern int mail_command_server(VSTREAM *,...);
128 extern int mail_trigger(const char *, const char *, const char *, ssize_t);
129 extern char *mail_pathname(const char *, const char *);
130 
131  /*
132   * Each Postfix internal service identifies the protocol that it intends to
133   * use. On the receiver end, this information does not contribute to the
134   * reported number of received attributes (it is a constant).
135   */
136 #define MAIL_ATTR_PROTO                 "protocol"
137 
138 #define MAIL_ATTR_PROTO_ANVIL "anvil_protocol"
139 #define MAIL_ATTR_PROTO_BOUNCE          "delivery_status_protocol"
140 #define MAIL_ATTR_PROTO_CLEANUP         "cleanup_protocol"
141 #define MAIL_ATTR_PROTO_DELIVER         "delivery_request_protocol"
142 #define MAIL_ATTR_PROTO_FLUSH "queue_flush_protocol"
143 #define MAIL_ATTR_PROTO_POSTDROP "postdrop_protocol"
144 #define MAIL_ATTR_PROTO_PROXYMAP "proxymap_protocol"
145 #define MAIL_ATTR_PROTO_SCACHE          "connection_cache_protocol"
146 #define MAIL_ATTR_PROTO_SHOWQ "mail_queue_list_protocol"
147 #define MAIL_ATTR_PROTO_TLSMGR          "tlsmgr_protocol"
148 #define MAIL_ATTR_PROTO_TLSPROXY "tlsproxy_protocol"
149 #define MAIL_ATTR_PROTO_TRIVIAL         "trivial_rewrite_protocol"
150 #define MAIL_ATTR_PROTO_VERIFY          "address_verification_prrotocol"
151 
152  /*
153   * Attribute names in internal and policy delegation protocols.
154   */
155 #define MAIL_ATTR_REQ                   "request"
156 #define MAIL_ATTR_NREQ                  "nrequest"
157 #define MAIL_ATTR_STATUS      "status"
158 
159 #define MAIL_ATTR_FLAGS                 "flags"
160 #define MAIL_ATTR_QUEUE                 "queue_name"
161 #define MAIL_ATTR_QUEUEID     "queue_id"
162 #define MAIL_ATTR_SENDER      "sender"
163 #define MAIL_ATTR_RCPT_COUNT  "recipient_count"
164 #define MAIL_ATTR_ORCPT                 "original_recipient"
165 #define MAIL_ATTR_RECIP                 "recipient"
166 #define MAIL_ATTR_WHY                   "reason"
167 #define MAIL_ATTR_VERPDL      "verp_delimiters"
168 #define MAIL_ATTR_SITE                  "site"
169 #define MAIL_ATTR_OFFSET      "offset"
170 #define MAIL_ATTR_SIZE                  "size"
171 #define MAIL_ATTR_ERRTO                 "errors-to"
172 #define MAIL_ATTR_RRCPT                 "return-receipt"
173 #define MAIL_ATTR_TIME                  "time"
174 #define MAIL_ATTR_LOCALTIME   "localtime"
175 #define MAIL_ATTR_CREATE_TIME "create_time"
176 #define MAIL_ATTR_RULE                  "rule"
177 #define MAIL_ATTR_ADDR                  "address"
178 #define MAIL_ATTR_TRANSPORT   "transport"
179 #define MAIL_ATTR_NEXTHOP     "nexthop"
180 #define MAIL_ATTR_TRACE_FLAGS "trace_flags"
181 #define MAIL_ATTR_ADDR_STATUS "recipient_status"
182 #define MAIL_ATTR_ACTION      "action"
183 #define MAIL_ATTR_TABLE                 "table"
184 #define MAIL_ATTR_KEY                   "key"
185 #define MAIL_ATTR_VALUE                 "value"
186 #define MAIL_ATTR_INSTANCE    "instance"
187 #define MAIL_ATTR_SASL_METHOD "sasl_method"
188 #define MAIL_ATTR_SASL_USERNAME         "sasl_username"
189 #define MAIL_ATTR_SASL_SENDER "sasl_sender"
190 #define MAIL_ATTR_ETRN_DOMAIN "etrn_domain"
191 #define MAIL_ATTR_DUMMY                 "dummy"
192 #define MAIL_ATTR_STRESS      "stress"
193 #define MAIL_ATTR_LOG_IDENT   "log_ident"
194 #define MAIL_ATTR_RWR_CONTEXT "rewrite_context"
195 #define MAIL_ATTR_POL_CONTEXT "policy_context"
196 #define MAIL_ATTR_FORCED_EXPIRE         "forced_expire"
197 
198 #define MAIL_ATTR_RWR_LOCAL   "local"
199 #define MAIL_ATTR_RWR_REMOTE  "remote"
200 
201 #define MAIL_ATTR_TTL                   "ttl"
202 #define MAIL_ATTR_LABEL                 "label"
203 #define MAIL_ATTR_PROP                  "property"
204 #define MAIL_ATTR_FUNC                  "function"
205 #define MAIL_ATTR_CCERT_SUBJECT         "ccert_subject"
206 #define MAIL_ATTR_CCERT_ISSUER          "ccert_issuer"
207 #define MAIL_ATTR_CCERT_CERT_FPRINT "ccert_fingerprint"
208 #define MAIL_ATTR_CCERT_PKEY_FPRINT "ccert_pubkey_fingerprint"
209 #define MAIL_ATTR_CRYPTO_PROTOCOL "encryption_protocol"
210 #define MAIL_ATTR_CRYPTO_CIPHER         "encryption_cipher"
211 #define MAIL_ATTR_CRYPTO_KEYSIZE "encryption_keysize"
212 #define MAIL_ATTR_COMPAT_LEVEL          "compatibility_level"
213 #define MAIL_ATTR_MAIL_VERSION          "mail_version"
214 
215  /*
216   * Suffixes for sender_name, sender_domain etc.
217   */
218 #define MAIL_ATTR_S_NAME      "_name"
219 #define MAIL_ATTR_S_DOMAIN    "_domain"
220 
221  /*
222   * Special names for RBL results.
223   */
224 #define MAIL_ATTR_RBL_WHAT    "rbl_what"
225 #define MAIL_ATTR_RBL_DOMAIN  "rbl_domain"
226 #define MAIL_ATTR_RBL_REASON  "rbl_reason"
227 #define MAIL_ATTR_RBL_TXT     "rbl_txt" /* LaMont compatibility */
228 #define MAIL_ATTR_RBL_CLASS   "rbl_class"
229 #define MAIL_ATTR_RBL_CODE    "rbl_code"
230 #define MAIL_ATTR_RBL_ADDR    "rbl_addr"
231 
232  /*
233   * The following attribute names are stored in queue files. Changing this
234   * means lots of work to maintain backwards compatibility with queued mail.
235   */
236 #define MAIL_ATTR_ENCODING    "encoding"          /* internal encoding */
237 #define MAIL_ATTR_ENC_8BIT    "8bit"    /* 8BITMIME equivalent */
238 #define MAIL_ATTR_ENC_7BIT    "7bit"    /* 7BIT equivalent */
239 #define MAIL_ATTR_ENC_NONE    ""        /* encoding unknown */
240 
241 #define MAIL_ATTR_LOG_CLIENT_NAME "log_client_name"         /* client hostname */
242 #define MAIL_ATTR_LOG_CLIENT_ADDR "log_client_address"      /* client address */
243 #define MAIL_ATTR_LOG_CLIENT_PORT "log_client_port"         /* client port */
244 #define MAIL_ATTR_LOG_HELO_NAME         "log_helo_name"     /* SMTP helo name */
245 #define MAIL_ATTR_LOG_PROTO_NAME "log_protocol_name"        /* SMTP/ESMTP/QMQP */
246 #define MAIL_ATTR_LOG_ORIGIN  "log_message_origin"          /* name[addr]:port */
247 
248 #define MAIL_ATTR_ACT_CLIENT  "client"/* client name addr */
249 #define MAIL_ATTR_ACT_CLIENT_NAME "client_name"   /* client name */
250 #define MAIL_ATTR_ACT_CLIENT_ADDR "client_address"          /* client address */
251 #define MAIL_ATTR_ACT_CLIENT_PORT "client_port"   /* client TCP port */
252 #define MAIL_ATTR_ACT_CLIENT_AF         "client_address_type"         /* AF_INET etc. */
253 #define MAIL_ATTR_ACT_HELO_NAME         "helo_name"         /* SMTP helo name */
254 #define MAIL_ATTR_ACT_PROTO_NAME "protocol_name"  /* SMTP/ESMTP/QMQP */
255 #define MAIL_ATTR_ACT_REVERSE_CLIENT_NAME "reverse_client_name"
256 #define MAIL_ATTR_ACT_FORWARD_CLIENT_NAME "forward_client_name"
257 
258 #define MAIL_ATTR_ACT_SERVER_ADDR "server_address"          /* server address */
259 #define MAIL_ATTR_ACT_SERVER_PORT "server_port"   /* server TCP port */
260 
261 #define MAIL_ATTR_PROTO_STATE "protocol_state"    /* MAIL/RCPT/... */
262 #define MAIL_ATTR_ORG_NONE    "unknown" /* origin unknown */
263 #define MAIL_ATTR_ORG_LOCAL   "local"   /* local submission */
264 
265 #define MAIL_ATTR_MESSAGE_ID  "message_id"        /* Used for threaded bounce */
266 
267  /*
268   * XCLIENT/XFORWARD in SMTP.
269   */
270 #define XCLIENT_CMD           "XCLIENT" /* XCLIENT command */
271 #define XCLIENT_NAME                    "NAME"    /* client name */
272 #define XCLIENT_REVERSE_NAME  "REVERSE_NAME"      /* reverse client name */
273 #ifdef FORWARD_CLIENT_NAME
274 #define XCLIENT_FORWARD_NAME  "FORWARD_NAME"      /* forward client name */
275 #endif
276 #define XCLIENT_ADDR                    "ADDR"    /* client address */
277 #define XCLIENT_PORT                    "PORT"    /* client port */
278 #define XCLIENT_PROTO                   "PROTO"   /* client protocol */
279 #define XCLIENT_HELO                    "HELO"    /* client helo */
280 #define XCLIENT_LOGIN                   "LOGIN"   /* SASL login name */
281 #define XCLIENT_DESTADDR      "DESTADDR"          /* server address */
282 #define XCLIENT_DESTPORT      "DESTPORT"          /* server port */
283 
284 #define XCLIENT_UNAVAILABLE   "[UNAVAILABLE]"     /* permanently unavailable */
285 #define XCLIENT_TEMPORARY     "[TEMPUNAVAIL]"     /* temporarily unavailable */
286 
287 #define XFORWARD_CMD                    "XFORWARD"          /* XFORWARD command */
288 #define XFORWARD_NAME                   "NAME"    /* client name */
289 #define XFORWARD_ADDR                   "ADDR"    /* client address */
290 #define XFORWARD_PORT                   "PORT"    /* client port */
291 #define XFORWARD_PROTO                  "PROTO"   /* client protocol */
292 #define XFORWARD_HELO                   "HELO"    /* client helo */
293 #define XFORWARD_IDENT                  "IDENT"   /* message identifier */
294 #define XFORWARD_DOMAIN                 "SOURCE"/* origin type */
295 #define XFORWARD_DOM_LOCAL    "LOCAL"   /* local origin */
296 #define XFORWARD_DOM_REMOTE   "REMOTE"/* remote origin */
297 
298 #define XFORWARD_UNAVAILABLE  "[UNAVAILABLE]"     /* attribute unavailable */
299 
300  /*
301   * DSN support.
302   */
303 #define MAIL_ATTR_DSN_STATUS  "status"/* XXX Postfix <2.3 compat */
304 #define MAIL_ATTR_DSN_DTYPE   "diag_type"         /* dsn diagnostic code */
305 #define MAIL_ATTR_DSN_DTEXT   "diag_text"         /* dsn diagnostic code */
306 #define MAIL_ATTR_DSN_MTYPE   "mta_type"          /* dsn remote MTA */
307 #define MAIL_ATTR_DSN_MNAME   "mta_mname"         /* dsn remote MTA */
308 #define MAIL_ATTR_DSN_ACTION  "action"/* XXX Postfix <2.3 compat */
309 #define MAIL_ATTR_DSN_ENVID   "envelope_id"       /* dsn envelope id */
310 #define MAIL_ATTR_DSN_RET     "ret_flags"         /* dsn full/headers */
311 #define MAIL_ATTR_DSN_NOTIFY  "notify_flags"      /* dsn notify flags */
312 #define MAIL_ATTR_DSN_ORCPT   "dsn_orig_rcpt"     /* dsn original recipient */
313 #define MAIL_ATTR_SENDOPTS    "sendopts"          /* RFC6531 etc. support */
314 
315  /*
316   * SMTP reply footer support.
317   */
318 #define MAIL_ATTR_SERVER_NAME "server_name"
319 
320 /* LICENSE
321 /* .ad
322 /* .fi
323 /*        The Secure Mailer license must be distributed with this software.
324 /* AUTHOR(S)
325 /*        Wietse Venema
326 /*        IBM T.J. Watson Research
327 /*        P.O. Box 704
328 /*        Yorktown Heights, NY 10598, USA
329 /*
330 /*        Wietse Venema
331 /*        Google, Inc.
332 /*        111 8th Avenue
333 /*        New York, NY 10011, USA
334 /*
335 /*        Wietse Venema
336 /*        porcupine.org
337 /*--*/
338 
339 #endif
340