a929e937c05c8fe5175406e481998675322cca03
[exim.git] / src / src / expand.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2014 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8
9 /* Functions for handling string expansion. */
10
11
12 #include "exim.h"
13
14 /* Recursively called function */
15
16 static uschar *expand_string_internal(uschar *, BOOL, uschar **, BOOL, BOOL, BOOL *);
17 static int_eximarith_t expanded_string_integer(uschar *, BOOL);
18
19 #ifdef STAND_ALONE
20 #ifndef SUPPORT_CRYPTEQ
21 #define SUPPORT_CRYPTEQ
22 #endif
23 #endif
24
25 #ifdef LOOKUP_LDAP
26 #include "lookups/ldap.h"
27 #endif
28
29 #ifdef SUPPORT_CRYPTEQ
30 #ifdef CRYPT_H
31 #include <crypt.h>
32 #endif
33 #ifndef HAVE_CRYPT16
34 extern char* crypt16(char*, char*);
35 #endif
36 #endif
37
38 /* The handling of crypt16() is a mess. I will record below the analysis of the
39 mess that was sent to me. We decided, however, to make changing this very low
40 priority, because in practice people are moving away from the crypt()
41 algorithms nowadays, so it doesn't seem worth it.
42
43 <quote>
44 There is an algorithm named "crypt16" in Ultrix and Tru64.  It crypts
45 the first 8 characters of the password using a 20-round version of crypt
46 (standard crypt does 25 rounds).  It then crypts the next 8 characters,
47 or an empty block if the password is less than 9 characters, using a
48 20-round version of crypt and the same salt as was used for the first
49 block.  Charaters after the first 16 are ignored.  It always generates
50 a 16-byte hash, which is expressed together with the salt as a string
51 of 24 base 64 digits.  Here are some links to peruse:
52
53         http://cvs.pld.org.pl/pam/pamcrypt/crypt16.c?rev=1.2
54         http://seclists.org/bugtraq/1999/Mar/0076.html
55
56 There's a different algorithm named "bigcrypt" in HP-UX, Digital Unix,
57 and OSF/1.  This is the same as the standard crypt if given a password
58 of 8 characters or less.  If given more, it first does the same as crypt
59 using the first 8 characters, then crypts the next 8 (the 9th to 16th)
60 using as salt the first two base 64 digits from the first hash block.
61 If the password is more than 16 characters then it crypts the 17th to 24th
62 characters using as salt the first two base 64 digits from the second hash
63 block.  And so on: I've seen references to it cutting off the password at
64 40 characters (5 blocks), 80 (10 blocks), or 128 (16 blocks).  Some links:
65
66         http://cvs.pld.org.pl/pam/pamcrypt/bigcrypt.c?rev=1.2
67         http://seclists.org/bugtraq/1999/Mar/0109.html
68         http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/HTML/AA-Q0R2D-
69              TET1_html/sec.c222.html#no_id_208
70
71 Exim has something it calls "crypt16".  It will either use a native
72 crypt16 or its own implementation.  A native crypt16 will presumably
73 be the one that I called "crypt16" above.  The internal "crypt16"
74 function, however, is a two-block-maximum implementation of what I called
75 "bigcrypt".  The documentation matches the internal code.
76
77 I suspect that whoever did the "crypt16" stuff for Exim didn't realise
78 that crypt16 and bigcrypt were different things.
79
80 Exim uses the LDAP-style scheme identifier "{crypt16}" to refer
81 to whatever it is using under that name.  This unfortunately sets a
82 precedent for using "{crypt16}" to identify two incompatible algorithms
83 whose output can't be distinguished.  With "{crypt16}" thus rendered
84 ambiguous, I suggest you deprecate it and invent two new identifiers
85 for the two algorithms.
86
87 Both crypt16 and bigcrypt are very poor algorithms, btw.  Hashing parts
88 of the password separately means they can be cracked separately, so
89 the double-length hash only doubles the cracking effort instead of
90 squaring it.  I recommend salted SHA-1 ({SSHA}), or the Blowfish-based
91 bcrypt ({CRYPT}$2a$).
92 </quote>
93 */
94
95
96
97 #ifndef nelements
98 # define nelements(arr) (sizeof(arr) / sizeof(*arr))
99 #endif
100
101 /*************************************************
102 *            Local statics and tables            *
103 *************************************************/
104
105 /* Table of item names, and corresponding switch numbers. The names must be in
106 alphabetical order. */
107
108 static uschar *item_table[] = {
109   US"acl",
110   US"certextract",
111   US"dlfunc",
112   US"extract",
113   US"filter",
114   US"hash",
115   US"hmac",
116   US"if",
117   US"length",
118   US"listextract",
119   US"lookup",
120   US"map",
121   US"nhash",
122   US"perl",
123   US"prvs",
124   US"prvscheck",
125   US"readfile",
126   US"readsocket",
127   US"reduce",
128   US"run",
129   US"sg",
130   US"substr",
131   US"tr" };
132
133 enum {
134   EITEM_ACL,
135   EITEM_CERTEXTRACT,
136   EITEM_DLFUNC,
137   EITEM_EXTRACT,
138   EITEM_FILTER,
139   EITEM_HASH,
140   EITEM_HMAC,
141   EITEM_IF,
142   EITEM_LENGTH,
143   EITEM_LISTEXTRACT,
144   EITEM_LOOKUP,
145   EITEM_MAP,
146   EITEM_NHASH,
147   EITEM_PERL,
148   EITEM_PRVS,
149   EITEM_PRVSCHECK,
150   EITEM_READFILE,
151   EITEM_READSOCK,
152   EITEM_REDUCE,
153   EITEM_RUN,
154   EITEM_SG,
155   EITEM_SUBSTR,
156   EITEM_TR };
157
158 /* Tables of operator names, and corresponding switch numbers. The names must be
159 in alphabetical order. There are two tables, because underscore is used in some
160 cases to introduce arguments, whereas for other it is part of the name. This is
161 an historical mis-design. */
162
163 static uschar *op_table_underscore[] = {
164   US"from_utf8",
165   US"local_part",
166   US"quote_local_part",
167   US"reverse_ip",
168   US"time_eval",
169   US"time_interval"};
170
171 enum {
172   EOP_FROM_UTF8,
173   EOP_LOCAL_PART,
174   EOP_QUOTE_LOCAL_PART,
175   EOP_REVERSE_IP,
176   EOP_TIME_EVAL,
177   EOP_TIME_INTERVAL };
178
179 static uschar *op_table_main[] = {
180   US"address",
181   US"addresses",
182   US"base62",
183   US"base62d",
184   US"domain",
185   US"escape",
186   US"eval",
187   US"eval10",
188   US"expand",
189   US"h",
190   US"hash",
191   US"hex2b64",
192   US"hexquote",
193   US"l",
194   US"lc",
195   US"length",
196   US"listcount",
197   US"listnamed",
198   US"mask",
199   US"md5",
200   US"nh",
201   US"nhash",
202   US"quote",
203   US"randint",
204   US"rfc2047",
205   US"rfc2047d",
206   US"rxquote",
207   US"s",
208   US"sha1",
209   US"sha256",
210   US"stat",
211   US"str2b64",
212   US"strlen",
213   US"substr",
214   US"uc",
215   US"utf8clean" };
216
217 enum {
218   EOP_ADDRESS =  sizeof(op_table_underscore)/sizeof(uschar *),
219   EOP_ADDRESSES,
220   EOP_BASE62,
221   EOP_BASE62D,
222   EOP_DOMAIN,
223   EOP_ESCAPE,
224   EOP_EVAL,
225   EOP_EVAL10,
226   EOP_EXPAND,
227   EOP_H,
228   EOP_HASH,
229   EOP_HEX2B64,
230   EOP_HEXQUOTE,
231   EOP_L,
232   EOP_LC,
233   EOP_LENGTH,
234   EOP_LISTCOUNT,
235   EOP_LISTNAMED,
236   EOP_MASK,
237   EOP_MD5,
238   EOP_NH,
239   EOP_NHASH,
240   EOP_QUOTE,
241   EOP_RANDINT,
242   EOP_RFC2047,
243   EOP_RFC2047D,
244   EOP_RXQUOTE,
245   EOP_S,
246   EOP_SHA1,
247   EOP_SHA256,
248   EOP_STAT,
249   EOP_STR2B64,
250   EOP_STRLEN,
251   EOP_SUBSTR,
252   EOP_UC,
253   EOP_UTF8CLEAN };
254
255
256 /* Table of condition names, and corresponding switch numbers. The names must
257 be in alphabetical order. */
258
259 static uschar *cond_table[] = {
260   US"<",
261   US"<=",
262   US"=",
263   US"==",     /* Backward compatibility */
264   US">",
265   US">=",
266   US"acl",
267   US"and",
268   US"bool",
269   US"bool_lax",
270   US"crypteq",
271   US"def",
272   US"eq",
273   US"eqi",
274   US"exists",
275   US"first_delivery",
276   US"forall",
277   US"forany",
278   US"ge",
279   US"gei",
280   US"gt",
281   US"gti",
282   US"inlist",
283   US"inlisti",
284   US"isip",
285   US"isip4",
286   US"isip6",
287   US"ldapauth",
288   US"le",
289   US"lei",
290   US"lt",
291   US"lti",
292   US"match",
293   US"match_address",
294   US"match_domain",
295   US"match_ip",
296   US"match_local_part",
297   US"or",
298   US"pam",
299   US"pwcheck",
300   US"queue_running",
301   US"radius",
302   US"saslauthd"
303 };
304
305 enum {
306   ECOND_NUM_L,
307   ECOND_NUM_LE,
308   ECOND_NUM_E,
309   ECOND_NUM_EE,
310   ECOND_NUM_G,
311   ECOND_NUM_GE,
312   ECOND_ACL,
313   ECOND_AND,
314   ECOND_BOOL,
315   ECOND_BOOL_LAX,
316   ECOND_CRYPTEQ,
317   ECOND_DEF,
318   ECOND_STR_EQ,
319   ECOND_STR_EQI,
320   ECOND_EXISTS,
321   ECOND_FIRST_DELIVERY,
322   ECOND_FORALL,
323   ECOND_FORANY,
324   ECOND_STR_GE,
325   ECOND_STR_GEI,
326   ECOND_STR_GT,
327   ECOND_STR_GTI,
328   ECOND_INLIST,
329   ECOND_INLISTI,
330   ECOND_ISIP,
331   ECOND_ISIP4,
332   ECOND_ISIP6,
333   ECOND_LDAPAUTH,
334   ECOND_STR_LE,
335   ECOND_STR_LEI,
336   ECOND_STR_LT,
337   ECOND_STR_LTI,
338   ECOND_MATCH,
339   ECOND_MATCH_ADDRESS,
340   ECOND_MATCH_DOMAIN,
341   ECOND_MATCH_IP,
342   ECOND_MATCH_LOCAL_PART,
343   ECOND_OR,
344   ECOND_PAM,
345   ECOND_PWCHECK,
346   ECOND_QUEUE_RUNNING,
347   ECOND_RADIUS,
348   ECOND_SASLAUTHD
349 };
350
351
352 /* Types of table entry */
353
354 enum vtypes {
355   vtype_int,            /* value is address of int */
356   vtype_filter_int,     /* ditto, but recognized only when filtering */
357   vtype_ino,            /* value is address of ino_t (not always an int) */
358   vtype_uid,            /* value is address of uid_t (not always an int) */
359   vtype_gid,            /* value is address of gid_t (not always an int) */
360   vtype_bool,           /* value is address of bool */
361   vtype_stringptr,      /* value is address of pointer to string */
362   vtype_msgbody,        /* as stringptr, but read when first required */
363   vtype_msgbody_end,    /* ditto, the end of the message */
364   vtype_msgheaders,     /* the message's headers, processed */
365   vtype_msgheaders_raw, /* the message's headers, unprocessed */
366   vtype_localpart,      /* extract local part from string */
367   vtype_domain,         /* extract domain from string */
368   vtype_string_func,    /* value is string returned by given function */
369   vtype_todbsdin,       /* value not used; generate BSD inbox tod */
370   vtype_tode,           /* value not used; generate tod in epoch format */
371   vtype_todel,          /* value not used; generate tod in epoch/usec format */
372   vtype_todf,           /* value not used; generate full tod */
373   vtype_todl,           /* value not used; generate log tod */
374   vtype_todlf,          /* value not used; generate log file datestamp tod */
375   vtype_todzone,        /* value not used; generate time zone only */
376   vtype_todzulu,        /* value not used; generate zulu tod */
377   vtype_reply,          /* value not used; get reply from headers */
378   vtype_pid,            /* value not used; result is pid */
379   vtype_host_lookup,    /* value not used; get host name */
380   vtype_load_avg,       /* value not used; result is int from os_getloadavg */
381   vtype_pspace,         /* partition space; value is T/F for spool/log */
382   vtype_pinodes,        /* partition inodes; value is T/F for spool/log */
383   vtype_cert            /* SSL certificate */
384   #ifndef DISABLE_DKIM
385   ,vtype_dkim           /* Lookup of value in DKIM signature */
386   #endif
387 };
388
389 /* Type for main variable table */
390
391 typedef struct {
392   const char *name;
393   enum vtypes type;
394   void       *value;
395 } var_entry;
396
397 /* Type for entries pointing to address/length pairs. Not currently
398 in use. */
399
400 typedef struct {
401   uschar **address;
402   int  *length;
403 } alblock;
404
405 static uschar * fn_recipients(void);
406
407 /* This table must be kept in alphabetical order. */
408
409 static var_entry var_table[] = {
410   /* WARNING: Do not invent variables whose names start acl_c or acl_m because
411      they will be confused with user-creatable ACL variables. */
412   { "acl_arg1",            vtype_stringptr,   &acl_arg[0] },
413   { "acl_arg2",            vtype_stringptr,   &acl_arg[1] },
414   { "acl_arg3",            vtype_stringptr,   &acl_arg[2] },
415   { "acl_arg4",            vtype_stringptr,   &acl_arg[3] },
416   { "acl_arg5",            vtype_stringptr,   &acl_arg[4] },
417   { "acl_arg6",            vtype_stringptr,   &acl_arg[5] },
418   { "acl_arg7",            vtype_stringptr,   &acl_arg[6] },
419   { "acl_arg8",            vtype_stringptr,   &acl_arg[7] },
420   { "acl_arg9",            vtype_stringptr,   &acl_arg[8] },
421   { "acl_narg",            vtype_int,         &acl_narg },
422   { "acl_verify_message",  vtype_stringptr,   &acl_verify_message },
423   { "address_data",        vtype_stringptr,   &deliver_address_data },
424   { "address_file",        vtype_stringptr,   &address_file },
425   { "address_pipe",        vtype_stringptr,   &address_pipe },
426   { "authenticated_fail_id",vtype_stringptr,  &authenticated_fail_id },
427   { "authenticated_id",    vtype_stringptr,   &authenticated_id },
428   { "authenticated_sender",vtype_stringptr,   &authenticated_sender },
429   { "authentication_failed",vtype_int,        &authentication_failed },
430 #ifdef WITH_CONTENT_SCAN
431   { "av_failed",           vtype_int,         &av_failed },
432 #endif
433 #ifdef EXPERIMENTAL_BRIGHTMAIL
434   { "bmi_alt_location",    vtype_stringptr,   &bmi_alt_location },
435   { "bmi_base64_tracker_verdict", vtype_stringptr, &bmi_base64_tracker_verdict },
436   { "bmi_base64_verdict",  vtype_stringptr,   &bmi_base64_verdict },
437   { "bmi_deliver",         vtype_int,         &bmi_deliver },
438 #endif
439   { "body_linecount",      vtype_int,         &body_linecount },
440   { "body_zerocount",      vtype_int,         &body_zerocount },
441   { "bounce_recipient",    vtype_stringptr,   &bounce_recipient },
442   { "bounce_return_size_limit", vtype_int,    &bounce_return_size_limit },
443   { "caller_gid",          vtype_gid,         &real_gid },
444   { "caller_uid",          vtype_uid,         &real_uid },
445   { "compile_date",        vtype_stringptr,   &version_date },
446   { "compile_number",      vtype_stringptr,   &version_cnumber },
447   { "csa_status",          vtype_stringptr,   &csa_status },
448 #ifdef EXPERIMENTAL_DCC
449   { "dcc_header",          vtype_stringptr,   &dcc_header },
450   { "dcc_result",          vtype_stringptr,   &dcc_result },
451 #endif
452 #ifdef WITH_OLD_DEMIME
453   { "demime_errorlevel",   vtype_int,         &demime_errorlevel },
454   { "demime_reason",       vtype_stringptr,   &demime_reason },
455 #endif
456 #ifndef DISABLE_DKIM
457   { "dkim_algo",           vtype_dkim,        (void *)DKIM_ALGO },
458   { "dkim_bodylength",     vtype_dkim,        (void *)DKIM_BODYLENGTH },
459   { "dkim_canon_body",     vtype_dkim,        (void *)DKIM_CANON_BODY },
460   { "dkim_canon_headers",  vtype_dkim,        (void *)DKIM_CANON_HEADERS },
461   { "dkim_copiedheaders",  vtype_dkim,        (void *)DKIM_COPIEDHEADERS },
462   { "dkim_created",        vtype_dkim,        (void *)DKIM_CREATED },
463   { "dkim_cur_signer",     vtype_stringptr,   &dkim_cur_signer },
464   { "dkim_domain",         vtype_stringptr,   &dkim_signing_domain },
465   { "dkim_expires",        vtype_dkim,        (void *)DKIM_EXPIRES },
466   { "dkim_headernames",    vtype_dkim,        (void *)DKIM_HEADERNAMES },
467   { "dkim_identity",       vtype_dkim,        (void *)DKIM_IDENTITY },
468   { "dkim_key_granularity",vtype_dkim,        (void *)DKIM_KEY_GRANULARITY },
469   { "dkim_key_nosubdomains",vtype_dkim,       (void *)DKIM_NOSUBDOMAINS },
470   { "dkim_key_notes",      vtype_dkim,        (void *)DKIM_KEY_NOTES },
471   { "dkim_key_srvtype",    vtype_dkim,        (void *)DKIM_KEY_SRVTYPE },
472   { "dkim_key_testing",    vtype_dkim,        (void *)DKIM_KEY_TESTING },
473   { "dkim_selector",       vtype_stringptr,   &dkim_signing_selector },
474   { "dkim_signers",        vtype_stringptr,   &dkim_signers },
475   { "dkim_verify_reason",  vtype_dkim,        (void *)DKIM_VERIFY_REASON },
476   { "dkim_verify_status",  vtype_dkim,        (void *)DKIM_VERIFY_STATUS},
477 #endif
478 #ifdef EXPERIMENTAL_DMARC
479   { "dmarc_ar_header",     vtype_stringptr,   &dmarc_ar_header },
480   { "dmarc_domain_policy", vtype_stringptr,   &dmarc_domain_policy },
481   { "dmarc_status",        vtype_stringptr,   &dmarc_status },
482   { "dmarc_status_text",   vtype_stringptr,   &dmarc_status_text },
483   { "dmarc_used_domain",   vtype_stringptr,   &dmarc_used_domain },
484 #endif
485   { "dnslist_domain",      vtype_stringptr,   &dnslist_domain },
486   { "dnslist_matched",     vtype_stringptr,   &dnslist_matched },
487   { "dnslist_text",        vtype_stringptr,   &dnslist_text },
488   { "dnslist_value",       vtype_stringptr,   &dnslist_value },
489   { "domain",              vtype_stringptr,   &deliver_domain },
490   { "domain_data",         vtype_stringptr,   &deliver_domain_data },
491   { "exim_gid",            vtype_gid,         &exim_gid },
492   { "exim_path",           vtype_stringptr,   &exim_path },
493   { "exim_uid",            vtype_uid,         &exim_uid },
494 #ifdef WITH_OLD_DEMIME
495   { "found_extension",     vtype_stringptr,   &found_extension },
496 #endif
497   { "headers_added",       vtype_string_func, &fn_hdrs_added },
498   { "home",                vtype_stringptr,   &deliver_home },
499   { "host",                vtype_stringptr,   &deliver_host },
500   { "host_address",        vtype_stringptr,   &deliver_host_address },
501   { "host_data",           vtype_stringptr,   &host_data },
502   { "host_lookup_deferred",vtype_int,         &host_lookup_deferred },
503   { "host_lookup_failed",  vtype_int,         &host_lookup_failed },
504   { "host_port",           vtype_int,         &deliver_host_port },
505   { "inode",               vtype_ino,         &deliver_inode },
506   { "interface_address",   vtype_stringptr,   &interface_address },
507   { "interface_port",      vtype_int,         &interface_port },
508   { "item",                vtype_stringptr,   &iterate_item },
509   #ifdef LOOKUP_LDAP
510   { "ldap_dn",             vtype_stringptr,   &eldap_dn },
511   #endif
512   { "load_average",        vtype_load_avg,    NULL },
513   { "local_part",          vtype_stringptr,   &deliver_localpart },
514   { "local_part_data",     vtype_stringptr,   &deliver_localpart_data },
515   { "local_part_prefix",   vtype_stringptr,   &deliver_localpart_prefix },
516   { "local_part_suffix",   vtype_stringptr,   &deliver_localpart_suffix },
517   { "local_scan_data",     vtype_stringptr,   &local_scan_data },
518   { "local_user_gid",      vtype_gid,         &local_user_gid },
519   { "local_user_uid",      vtype_uid,         &local_user_uid },
520   { "localhost_number",    vtype_int,         &host_number },
521   { "log_inodes",          vtype_pinodes,     (void *)FALSE },
522   { "log_space",           vtype_pspace,      (void *)FALSE },
523   { "lookup_dnssec_authenticated",vtype_stringptr,&lookup_dnssec_authenticated},
524   { "mailstore_basename",  vtype_stringptr,   &mailstore_basename },
525 #ifdef WITH_CONTENT_SCAN
526   { "malware_name",        vtype_stringptr,   &malware_name },
527 #endif
528   { "max_received_linelength", vtype_int,     &max_received_linelength },
529   { "message_age",         vtype_int,         &message_age },
530   { "message_body",        vtype_msgbody,     &message_body },
531   { "message_body_end",    vtype_msgbody_end, &message_body_end },
532   { "message_body_size",   vtype_int,         &message_body_size },
533   { "message_exim_id",     vtype_stringptr,   &message_id },
534   { "message_headers",     vtype_msgheaders,  NULL },
535   { "message_headers_raw", vtype_msgheaders_raw, NULL },
536   { "message_id",          vtype_stringptr,   &message_id },
537   { "message_linecount",   vtype_int,         &message_linecount },
538   { "message_size",        vtype_int,         &message_size },
539 #ifdef WITH_CONTENT_SCAN
540   { "mime_anomaly_level",  vtype_int,         &mime_anomaly_level },
541   { "mime_anomaly_text",   vtype_stringptr,   &mime_anomaly_text },
542   { "mime_boundary",       vtype_stringptr,   &mime_boundary },
543   { "mime_charset",        vtype_stringptr,   &mime_charset },
544   { "mime_content_description", vtype_stringptr, &mime_content_description },
545   { "mime_content_disposition", vtype_stringptr, &mime_content_disposition },
546   { "mime_content_id",     vtype_stringptr,   &mime_content_id },
547   { "mime_content_size",   vtype_int,         &mime_content_size },
548   { "mime_content_transfer_encoding",vtype_stringptr, &mime_content_transfer_encoding },
549   { "mime_content_type",   vtype_stringptr,   &mime_content_type },
550   { "mime_decoded_filename", vtype_stringptr, &mime_decoded_filename },
551   { "mime_filename",       vtype_stringptr,   &mime_filename },
552   { "mime_is_coverletter", vtype_int,         &mime_is_coverletter },
553   { "mime_is_multipart",   vtype_int,         &mime_is_multipart },
554   { "mime_is_rfc822",      vtype_int,         &mime_is_rfc822 },
555   { "mime_part_count",     vtype_int,         &mime_part_count },
556 #endif
557   { "n0",                  vtype_filter_int,  &filter_n[0] },
558   { "n1",                  vtype_filter_int,  &filter_n[1] },
559   { "n2",                  vtype_filter_int,  &filter_n[2] },
560   { "n3",                  vtype_filter_int,  &filter_n[3] },
561   { "n4",                  vtype_filter_int,  &filter_n[4] },
562   { "n5",                  vtype_filter_int,  &filter_n[5] },
563   { "n6",                  vtype_filter_int,  &filter_n[6] },
564   { "n7",                  vtype_filter_int,  &filter_n[7] },
565   { "n8",                  vtype_filter_int,  &filter_n[8] },
566   { "n9",                  vtype_filter_int,  &filter_n[9] },
567   { "original_domain",     vtype_stringptr,   &deliver_domain_orig },
568   { "original_local_part", vtype_stringptr,   &deliver_localpart_orig },
569   { "originator_gid",      vtype_gid,         &originator_gid },
570   { "originator_uid",      vtype_uid,         &originator_uid },
571   { "parent_domain",       vtype_stringptr,   &deliver_domain_parent },
572   { "parent_local_part",   vtype_stringptr,   &deliver_localpart_parent },
573   { "pid",                 vtype_pid,         NULL },
574   { "primary_hostname",    vtype_stringptr,   &primary_hostname },
575 #ifdef EXPERIMENTAL_PROXY
576   { "proxy_host_address",  vtype_stringptr,   &proxy_host_address },
577   { "proxy_host_port",     vtype_int,         &proxy_host_port },
578   { "proxy_session",       vtype_bool,        &proxy_session },
579   { "proxy_target_address",vtype_stringptr,   &proxy_target_address },
580   { "proxy_target_port",   vtype_int,         &proxy_target_port },
581 #endif
582   { "prvscheck_address",   vtype_stringptr,   &prvscheck_address },
583   { "prvscheck_keynum",    vtype_stringptr,   &prvscheck_keynum },
584   { "prvscheck_result",    vtype_stringptr,   &prvscheck_result },
585   { "qualify_domain",      vtype_stringptr,   &qualify_domain_sender },
586   { "qualify_recipient",   vtype_stringptr,   &qualify_domain_recipient },
587   { "rcpt_count",          vtype_int,         &rcpt_count },
588   { "rcpt_defer_count",    vtype_int,         &rcpt_defer_count },
589   { "rcpt_fail_count",     vtype_int,         &rcpt_fail_count },
590   { "received_count",      vtype_int,         &received_count },
591   { "received_for",        vtype_stringptr,   &received_for },
592   { "received_ip_address", vtype_stringptr,   &interface_address },
593   { "received_port",       vtype_int,         &interface_port },
594   { "received_protocol",   vtype_stringptr,   &received_protocol },
595   { "received_time",       vtype_int,         &received_time },
596   { "recipient_data",      vtype_stringptr,   &recipient_data },
597   { "recipient_verify_failure",vtype_stringptr,&recipient_verify_failure },
598   { "recipients",          vtype_string_func, &fn_recipients },
599   { "recipients_count",    vtype_int,         &recipients_count },
600 #ifdef WITH_CONTENT_SCAN
601   { "regex_match_string",  vtype_stringptr,   &regex_match_string },
602 #endif
603   { "reply_address",       vtype_reply,       NULL },
604   { "return_path",         vtype_stringptr,   &return_path },
605   { "return_size_limit",   vtype_int,         &bounce_return_size_limit },
606   { "router_name",         vtype_stringptr,   &router_name },
607   { "runrc",               vtype_int,         &runrc },
608   { "self_hostname",       vtype_stringptr,   &self_hostname },
609   { "sender_address",      vtype_stringptr,   &sender_address },
610   { "sender_address_data", vtype_stringptr,   &sender_address_data },
611   { "sender_address_domain", vtype_domain,    &sender_address },
612   { "sender_address_local_part", vtype_localpart, &sender_address },
613   { "sender_data",         vtype_stringptr,   &sender_data },
614   { "sender_fullhost",     vtype_stringptr,   &sender_fullhost },
615   { "sender_helo_name",    vtype_stringptr,   &sender_helo_name },
616   { "sender_host_address", vtype_stringptr,   &sender_host_address },
617   { "sender_host_authenticated",vtype_stringptr, &sender_host_authenticated },
618   { "sender_host_dnssec",  vtype_bool,        &sender_host_dnssec },
619   { "sender_host_name",    vtype_host_lookup, NULL },
620   { "sender_host_port",    vtype_int,         &sender_host_port },
621   { "sender_ident",        vtype_stringptr,   &sender_ident },
622   { "sender_rate",         vtype_stringptr,   &sender_rate },
623   { "sender_rate_limit",   vtype_stringptr,   &sender_rate_limit },
624   { "sender_rate_period",  vtype_stringptr,   &sender_rate_period },
625   { "sender_rcvhost",      vtype_stringptr,   &sender_rcvhost },
626   { "sender_verify_failure",vtype_stringptr,  &sender_verify_failure },
627   { "sending_ip_address",  vtype_stringptr,   &sending_ip_address },
628   { "sending_port",        vtype_int,         &sending_port },
629   { "smtp_active_hostname", vtype_stringptr,  &smtp_active_hostname },
630   { "smtp_command",        vtype_stringptr,   &smtp_cmd_buffer },
631   { "smtp_command_argument", vtype_stringptr, &smtp_cmd_argument },
632   { "smtp_count_at_connection_start", vtype_int, &smtp_accept_count },
633   { "smtp_notquit_reason", vtype_stringptr,   &smtp_notquit_reason },
634   { "sn0",                 vtype_filter_int,  &filter_sn[0] },
635   { "sn1",                 vtype_filter_int,  &filter_sn[1] },
636   { "sn2",                 vtype_filter_int,  &filter_sn[2] },
637   { "sn3",                 vtype_filter_int,  &filter_sn[3] },
638   { "sn4",                 vtype_filter_int,  &filter_sn[4] },
639   { "sn5",                 vtype_filter_int,  &filter_sn[5] },
640   { "sn6",                 vtype_filter_int,  &filter_sn[6] },
641   { "sn7",                 vtype_filter_int,  &filter_sn[7] },
642   { "sn8",                 vtype_filter_int,  &filter_sn[8] },
643   { "sn9",                 vtype_filter_int,  &filter_sn[9] },
644 #ifdef WITH_CONTENT_SCAN
645   { "spam_bar",            vtype_stringptr,   &spam_bar },
646   { "spam_report",         vtype_stringptr,   &spam_report },
647   { "spam_score",          vtype_stringptr,   &spam_score },
648   { "spam_score_int",      vtype_stringptr,   &spam_score_int },
649 #endif
650 #ifdef EXPERIMENTAL_SPF
651   { "spf_guess",           vtype_stringptr,   &spf_guess },
652   { "spf_header_comment",  vtype_stringptr,   &spf_header_comment },
653   { "spf_received",        vtype_stringptr,   &spf_received },
654   { "spf_result",          vtype_stringptr,   &spf_result },
655   { "spf_smtp_comment",    vtype_stringptr,   &spf_smtp_comment },
656 #endif
657   { "spool_directory",     vtype_stringptr,   &spool_directory },
658   { "spool_inodes",        vtype_pinodes,     (void *)TRUE },
659   { "spool_space",         vtype_pspace,      (void *)TRUE },
660 #ifdef EXPERIMENTAL_SRS
661   { "srs_db_address",      vtype_stringptr,   &srs_db_address },
662   { "srs_db_key",          vtype_stringptr,   &srs_db_key },
663   { "srs_orig_recipient",  vtype_stringptr,   &srs_orig_recipient },
664   { "srs_orig_sender",     vtype_stringptr,   &srs_orig_sender },
665   { "srs_recipient",       vtype_stringptr,   &srs_recipient },
666   { "srs_status",          vtype_stringptr,   &srs_status },
667 #endif
668   { "thisaddress",         vtype_stringptr,   &filter_thisaddress },
669
670   /* The non-(in,out) variables are now deprecated */
671   { "tls_bits",            vtype_int,         &tls_in.bits },
672   { "tls_certificate_verified", vtype_int,    &tls_in.certificate_verified },
673   { "tls_cipher",          vtype_stringptr,   &tls_in.cipher },
674
675   { "tls_in_bits",         vtype_int,         &tls_in.bits },
676   { "tls_in_certificate_verified", vtype_int, &tls_in.certificate_verified },
677   { "tls_in_cipher",       vtype_stringptr,   &tls_in.cipher },
678   { "tls_in_ocsp",         vtype_int,         &tls_in.ocsp },
679   { "tls_in_ourcert",      vtype_cert,        &tls_in.ourcert },
680   { "tls_in_peercert",     vtype_cert,        &tls_in.peercert },
681   { "tls_in_peerdn",       vtype_stringptr,   &tls_in.peerdn },
682 #if defined(SUPPORT_TLS)
683   { "tls_in_sni",          vtype_stringptr,   &tls_in.sni },
684 #endif
685   { "tls_out_bits",        vtype_int,         &tls_out.bits },
686   { "tls_out_certificate_verified", vtype_int,&tls_out.certificate_verified },
687   { "tls_out_cipher",      vtype_stringptr,   &tls_out.cipher },
688 #ifdef EXPERIMENTAL_DANE
689   { "tls_out_dane",        vtype_bool,        &tls_out.dane_verified },
690 #endif
691   { "tls_out_ocsp",        vtype_int,         &tls_out.ocsp },
692   { "tls_out_ourcert",     vtype_cert,        &tls_out.ourcert },
693   { "tls_out_peercert",    vtype_cert,        &tls_out.peercert },
694   { "tls_out_peerdn",      vtype_stringptr,   &tls_out.peerdn },
695 #if defined(SUPPORT_TLS)
696   { "tls_out_sni",         vtype_stringptr,   &tls_out.sni },
697 #endif
698 #ifdef EXPERIMENTAL_DANE
699   { "tls_out_tlsa_usage",  vtype_int,         &tls_out.tlsa_usage },
700 #endif
701
702   { "tls_peerdn",          vtype_stringptr,   &tls_in.peerdn }, /* mind the alphabetical order! */
703 #if defined(SUPPORT_TLS)
704   { "tls_sni",             vtype_stringptr,   &tls_in.sni },    /* mind the alphabetical order! */
705 #endif
706
707   { "tod_bsdinbox",        vtype_todbsdin,    NULL },
708   { "tod_epoch",           vtype_tode,        NULL },
709   { "tod_epoch_l",         vtype_todel,       NULL },
710   { "tod_full",            vtype_todf,        NULL },
711   { "tod_log",             vtype_todl,        NULL },
712   { "tod_logfile",         vtype_todlf,       NULL },
713   { "tod_zone",            vtype_todzone,     NULL },
714   { "tod_zulu",            vtype_todzulu,     NULL },
715 #ifdef EXPERIMENTAL_TPDA
716   { "tpda_data",           vtype_stringptr,   &tpda_data },
717
718   /*XXX want to use generic vars for as many of these as possible*/
719   { "tpda_defer_errno",     vtype_int,         &tpda_defer_errno },
720
721   { "tpda_event",          vtype_stringptr,   &tpda_event },
722 #endif
723   { "transport_name",      vtype_stringptr,   &transport_name },
724   { "value",               vtype_stringptr,   &lookup_value },
725   { "version_number",      vtype_stringptr,   &version_string },
726   { "warn_message_delay",  vtype_stringptr,   &warnmsg_delay },
727   { "warn_message_recipient",vtype_stringptr, &warnmsg_recipients },
728   { "warn_message_recipients",vtype_stringptr,&warnmsg_recipients },
729   { "warnmsg_delay",       vtype_stringptr,   &warnmsg_delay },
730   { "warnmsg_recipient",   vtype_stringptr,   &warnmsg_recipients },
731   { "warnmsg_recipients",  vtype_stringptr,   &warnmsg_recipients }
732 };
733
734 static int var_table_size = sizeof(var_table)/sizeof(var_entry);
735 static uschar var_buffer[256];
736 static BOOL malformed_header;
737
738 /* For textual hashes */
739
740 static const char *hashcodes = "abcdefghijklmnopqrtsuvwxyz"
741                                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
742                                "0123456789";
743
744 enum { HMAC_MD5, HMAC_SHA1 };
745
746 /* For numeric hashes */
747
748 static unsigned int prime[] = {
749   2,   3,   5,   7,  11,  13,  17,  19,  23,  29,
750  31,  37,  41,  43,  47,  53,  59,  61,  67,  71,
751  73,  79,  83,  89,  97, 101, 103, 107, 109, 113};
752
753 /* For printing modes in symbolic form */
754
755 static uschar *mtable_normal[] =
756   { US"---", US"--x", US"-w-", US"-wx", US"r--", US"r-x", US"rw-", US"rwx" };
757
758 static uschar *mtable_setid[] =
759   { US"--S", US"--s", US"-wS", US"-ws", US"r-S", US"r-s", US"rwS", US"rws" };
760
761 static uschar *mtable_sticky[] =
762   { US"--T", US"--t", US"-wT", US"-wt", US"r-T", US"r-t", US"rwT", US"rwt" };
763
764
765
766 /*************************************************
767 *           Tables for UTF-8 support             *
768 *************************************************/
769
770 /* Table of the number of extra characters, indexed by the first character
771 masked with 0x3f. The highest number for a valid UTF-8 character is in fact
772 0x3d. */
773
774 static uschar utf8_table1[] = {
775   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
776   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
777   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
778   3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
779
780 /* These are the masks for the data bits in the first byte of a character,
781 indexed by the number of additional bytes. */
782
783 static int utf8_table2[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
784
785 /* Get the next UTF-8 character, advancing the pointer. */
786
787 #define GETUTF8INC(c, ptr) \
788   c = *ptr++; \
789   if ((c & 0xc0) == 0xc0) \
790     { \
791     int a = utf8_table1[c & 0x3f];  /* Number of additional bytes */ \
792     int s = 6*a; \
793     c = (c & utf8_table2[a]) << s; \
794     while (a-- > 0) \
795       { \
796       s -= 6; \
797       c |= (*ptr++ & 0x3f) << s; \
798       } \
799     }
800
801
802 /*************************************************
803 *           Binary chop search on a table        *
804 *************************************************/
805
806 /* This is used for matching expansion items and operators.
807
808 Arguments:
809   name        the name that is being sought
810   table       the table to search
811   table_size  the number of items in the table
812
813 Returns:      the offset in the table, or -1
814 */
815
816 static int
817 chop_match(uschar *name, uschar **table, int table_size)
818 {
819 uschar **bot = table;
820 uschar **top = table + table_size;
821
822 while (top > bot)
823   {
824   uschar **mid = bot + (top - bot)/2;
825   int c = Ustrcmp(name, *mid);
826   if (c == 0) return mid - table;
827   if (c > 0) bot = mid + 1; else top = mid;
828   }
829
830 return -1;
831 }
832
833
834
835 /*************************************************
836 *          Check a condition string              *
837 *************************************************/
838
839 /* This function is called to expand a string, and test the result for a "true"
840 or "false" value. Failure of the expansion yields FALSE; logged unless it was a
841 forced fail or lookup defer.
842
843 We used to release all store used, but this is not not safe due
844 to ${dlfunc } and ${acl }.  In any case expand_string_internal()
845 is reasonably careful to release what it can.
846
847 The actual false-value tests should be replicated for ECOND_BOOL_LAX.
848
849 Arguments:
850   condition     the condition string
851   m1            text to be incorporated in panic error
852   m2            ditto
853
854 Returns:        TRUE if condition is met, FALSE if not
855 */
856
857 BOOL
858 expand_check_condition(uschar *condition, uschar *m1, uschar *m2)
859 {
860 int rc;
861 uschar *ss = expand_string(condition);
862 if (ss == NULL)
863   {
864   if (!expand_string_forcedfail && !search_find_defer)
865     log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand condition \"%s\" "
866       "for %s %s: %s", condition, m1, m2, expand_string_message);
867   return FALSE;
868   }
869 rc = ss[0] != 0 && Ustrcmp(ss, "0") != 0 && strcmpic(ss, US"no") != 0 &&
870   strcmpic(ss, US"false") != 0;
871 return rc;
872 }
873
874
875
876
877 /*************************************************
878 *        Pseudo-random number generation         *
879 *************************************************/
880
881 /* Pseudo-random number generation.  The result is not "expected" to be
882 cryptographically strong but not so weak that someone will shoot themselves
883 in the foot using it as a nonce in some email header scheme or whatever
884 weirdness they'll twist this into.  The result should ideally handle fork().
885
886 However, if we're stuck unable to provide this, then we'll fall back to
887 appallingly bad randomness.
888
889 If SUPPORT_TLS is defined then this will not be used except as an emergency
890 fallback.
891
892 Arguments:
893   max       range maximum
894 Returns     a random number in range [0, max-1]
895 */
896
897 #ifdef SUPPORT_TLS
898 # define vaguely_random_number vaguely_random_number_fallback
899 #endif
900 int
901 vaguely_random_number(int max)
902 {
903 #ifdef SUPPORT_TLS
904 # undef vaguely_random_number
905 #endif
906   static pid_t pid = 0;
907   pid_t p2;
908 #if defined(HAVE_SRANDOM) && !defined(HAVE_SRANDOMDEV)
909   struct timeval tv;
910 #endif
911
912   p2 = getpid();
913   if (p2 != pid)
914     {
915     if (pid != 0)
916       {
917
918 #ifdef HAVE_ARC4RANDOM
919       /* cryptographically strong randomness, common on *BSD platforms, not
920       so much elsewhere.  Alas. */
921 #ifndef NOT_HAVE_ARC4RANDOM_STIR
922       arc4random_stir();
923 #endif
924 #elif defined(HAVE_SRANDOM) || defined(HAVE_SRANDOMDEV)
925 #ifdef HAVE_SRANDOMDEV
926       /* uses random(4) for seeding */
927       srandomdev();
928 #else
929       gettimeofday(&tv, NULL);
930       srandom(tv.tv_sec | tv.tv_usec | getpid());
931 #endif
932 #else
933       /* Poor randomness and no seeding here */
934 #endif
935
936       }
937     pid = p2;
938     }
939
940 #ifdef HAVE_ARC4RANDOM
941   return arc4random() % max;
942 #elif defined(HAVE_SRANDOM) || defined(HAVE_SRANDOMDEV)
943   return random() % max;
944 #else
945   /* This one returns a 16-bit number, definitely not crypto-strong */
946   return random_number(max);
947 #endif
948 }
949
950
951
952
953 /*************************************************
954 *             Pick out a name from a string      *
955 *************************************************/
956
957 /* If the name is too long, it is silently truncated.
958
959 Arguments:
960   name      points to a buffer into which to put the name
961   max       is the length of the buffer
962   s         points to the first alphabetic character of the name
963   extras    chars other than alphanumerics to permit
964
965 Returns:    pointer to the first character after the name
966
967 Note: The test for *s != 0 in the while loop is necessary because
968 Ustrchr() yields non-NULL if the character is zero (which is not something
969 I expected). */
970
971 static uschar *
972 read_name(uschar *name, int max, uschar *s, uschar *extras)
973 {
974 int ptr = 0;
975 while (*s != 0 && (isalnum(*s) || Ustrchr(extras, *s) != NULL))
976   {
977   if (ptr < max-1) name[ptr++] = *s;
978   s++;
979   }
980 name[ptr] = 0;
981 return s;
982 }
983
984
985
986 /*************************************************
987 *     Pick out the rest of a header name         *
988 *************************************************/
989
990 /* A variable name starting $header_ (or just $h_ for those who like
991 abbreviations) might not be the complete header name because headers can
992 contain any printing characters in their names, except ':'. This function is
993 called to read the rest of the name, chop h[eader]_ off the front, and put ':'
994 on the end, if the name was terminated by white space.
995
996 Arguments:
997   name      points to a buffer in which the name read so far exists
998   max       is the length of the buffer
999   s         points to the first character after the name so far, i.e. the
1000             first non-alphameric character after $header_xxxxx
1001
1002 Returns:    a pointer to the first character after the header name
1003 */
1004
1005 static uschar *
1006 read_header_name(uschar *name, int max, uschar *s)
1007 {
1008 int prelen = Ustrchr(name, '_') - name + 1;
1009 int ptr = Ustrlen(name) - prelen;
1010 if (ptr > 0) memmove(name, name+prelen, ptr);
1011 while (mac_isgraph(*s) && *s != ':')
1012   {
1013   if (ptr < max-1) name[ptr++] = *s;
1014   s++;
1015   }
1016 if (*s == ':') s++;
1017 name[ptr++] = ':';
1018 name[ptr] = 0;
1019 return s;
1020 }
1021
1022
1023
1024 /*************************************************
1025 *           Pick out a number from a string      *
1026 *************************************************/
1027
1028 /* Arguments:
1029   n     points to an integer into which to put the number
1030   s     points to the first digit of the number
1031
1032 Returns:  a pointer to the character after the last digit
1033 */
1034
1035 static uschar *
1036 read_number(int *n, uschar *s)
1037 {
1038 *n = 0;
1039 while (isdigit(*s)) *n = *n * 10 + (*s++ - '0');
1040 return s;
1041 }
1042
1043
1044
1045 /*************************************************
1046 *        Extract keyed subfield from a string    *
1047 *************************************************/
1048
1049 /* The yield is in dynamic store; NULL means that the key was not found.
1050
1051 Arguments:
1052   key       points to the name of the key
1053   s         points to the string from which to extract the subfield
1054
1055 Returns:    NULL if the subfield was not found, or
1056             a pointer to the subfield's data
1057 */
1058
1059 static uschar *
1060 expand_getkeyed(uschar *key, uschar *s)
1061 {
1062 int length = Ustrlen(key);
1063 while (isspace(*s)) s++;
1064
1065 /* Loop to search for the key */
1066
1067 while (*s != 0)
1068   {
1069   int dkeylength;
1070   uschar *data;
1071   uschar *dkey = s;
1072
1073   while (*s != 0 && *s != '=' && !isspace(*s)) s++;
1074   dkeylength = s - dkey;
1075   while (isspace(*s)) s++;
1076   if (*s == '=') while (isspace((*(++s))));
1077
1078   data = string_dequote(&s);
1079   if (length == dkeylength && strncmpic(key, dkey, length) == 0)
1080     return data;
1081
1082   while (isspace(*s)) s++;
1083   }
1084
1085 return NULL;
1086 }
1087
1088
1089
1090 static var_entry *
1091 find_var_ent(uschar * name)
1092 {
1093 int first = 0;
1094 int last = var_table_size;
1095
1096 while (last > first)
1097   {
1098   int middle = (first + last)/2;
1099   int c = Ustrcmp(name, var_table[middle].name);
1100
1101   if (c > 0) { first = middle + 1; continue; }
1102   if (c < 0) { last = middle; continue; }
1103   return &var_table[middle];
1104   }
1105 return NULL;
1106 }
1107
1108 /*************************************************
1109 *   Extract numbered subfield from string        *
1110 *************************************************/
1111
1112 /* Extracts a numbered field from a string that is divided by tokens - for
1113 example a line from /etc/passwd is divided by colon characters.  First field is
1114 numbered one.  Negative arguments count from the right. Zero returns the whole
1115 string. Returns NULL if there are insufficient tokens in the string
1116
1117 ***WARNING***
1118 Modifies final argument - this is a dynamically generated string, so that's OK.
1119
1120 Arguments:
1121   field       number of field to be extracted,
1122                 first field = 1, whole string = 0, last field = -1
1123   separators  characters that are used to break string into tokens
1124   s           points to the string from which to extract the subfield
1125
1126 Returns:      NULL if the field was not found,
1127               a pointer to the field's data inside s (modified to add 0)
1128 */
1129
1130 static uschar *
1131 expand_gettokened (int field, uschar *separators, uschar *s)
1132 {
1133 int sep = 1;
1134 int count;
1135 uschar *ss = s;
1136 uschar *fieldtext = NULL;
1137
1138 if (field == 0) return s;
1139
1140 /* Break the line up into fields in place; for field > 0 we stop when we have
1141 done the number of fields we want. For field < 0 we continue till the end of
1142 the string, counting the number of fields. */
1143
1144 count = (field > 0)? field : INT_MAX;
1145
1146 while (count-- > 0)
1147   {
1148   size_t len;
1149
1150   /* Previous field was the last one in the string. For a positive field
1151   number, this means there are not enough fields. For a negative field number,
1152   check that there are enough, and scan back to find the one that is wanted. */
1153
1154   if (sep == 0)
1155     {
1156     if (field > 0 || (-field) > (INT_MAX - count - 1)) return NULL;
1157     if ((-field) == (INT_MAX - count - 1)) return s;
1158     while (field++ < 0)
1159       {
1160       ss--;
1161       while (ss[-1] != 0) ss--;
1162       }
1163     fieldtext = ss;
1164     break;
1165     }
1166
1167   /* Previous field was not last in the string; save its start and put a
1168   zero at its end. */
1169
1170   fieldtext = ss;
1171   len = Ustrcspn(ss, separators);
1172   sep = ss[len];
1173   ss[len] = 0;
1174   ss += len + 1;
1175   }
1176
1177 return fieldtext;
1178 }
1179
1180
1181 static uschar *
1182 expand_getlistele(int field, uschar * list)
1183 {
1184 uschar * tlist= list;
1185 int sep= 0;
1186 uschar dummy;
1187
1188 if(field<0)
1189 {
1190   for(field++; string_nextinlist(&tlist, &sep, &dummy, 1); ) field++;
1191   sep= 0;
1192 }
1193 if(field==0) return NULL;
1194 while(--field>0 && (string_nextinlist(&list, &sep, &dummy, 1))) ;
1195 return string_nextinlist(&list, &sep, NULL, 0);
1196 }
1197
1198
1199 /* Certificate fields, by name.  Worry about by-OID later */
1200 /* Names are chosen to not have common prefixes */
1201
1202 #ifdef SUPPORT_TLS
1203 typedef struct
1204 {
1205 uschar * name;
1206 int      namelen;
1207 uschar * (*getfn)(void * cert, uschar * mod);
1208 } certfield;
1209 static certfield certfields[] =
1210 {                       /* linear search; no special order */
1211   { US"version",         7,  &tls_cert_version },
1212   { US"serial_number",   13, &tls_cert_serial_number },
1213   { US"subject",         7,  &tls_cert_subject },
1214   { US"notbefore",       9,  &tls_cert_not_before },
1215   { US"notafter",        8,  &tls_cert_not_after },
1216   { US"issuer",          6,  &tls_cert_issuer },
1217   { US"signature",       9,  &tls_cert_signature },
1218   { US"sig_algorithm",   13, &tls_cert_signature_algorithm },
1219   { US"subj_altname",    12, &tls_cert_subject_altname },
1220   { US"ocsp_uri",        8,  &tls_cert_ocsp_uri },
1221   { US"crl_uri",         7,  &tls_cert_crl_uri },
1222 };
1223
1224 static uschar *
1225 expand_getcertele(uschar * field, uschar * certvar)
1226 {
1227 var_entry * vp;
1228 certfield * cp;
1229
1230 if (!(vp = find_var_ent(certvar)))
1231   {
1232   expand_string_message = 
1233     string_sprintf("no variable named \"%s\"", certvar);
1234   return NULL;          /* Unknown variable name */
1235   }
1236 /* NB this stops us passing certs around in variable.  Might
1237 want to do that in future */
1238 if (vp->type != vtype_cert)
1239   {
1240   expand_string_message = 
1241     string_sprintf("\"%s\" is not a certificate", certvar);
1242   return NULL;          /* Unknown variable name */
1243   }
1244 if (!*(void **)vp->value)
1245   return NULL;
1246
1247 if (*field >= '0' && *field <= '9')
1248   return tls_cert_ext_by_oid(*(void **)vp->value, field, 0);
1249
1250 for(cp = certfields;
1251     cp < certfields + nelements(certfields);
1252     cp++)
1253   if (Ustrncmp(cp->name, field, cp->namelen) == 0)
1254     {
1255     uschar * modifier = *(field += cp->namelen) == ','
1256       ? ++field : NULL;
1257     return (*cp->getfn)( *(void **)vp->value, modifier );
1258     }
1259
1260 expand_string_message = 
1261   string_sprintf("bad field selector \"%s\" for certextract", field);
1262 return NULL;
1263 }
1264 #endif  /*SUPPORT_TLS*/
1265
1266 /*************************************************
1267 *        Extract a substring from a string       *
1268 *************************************************/
1269
1270 /* Perform the ${substr or ${length expansion operations.
1271
1272 Arguments:
1273   subject     the input string
1274   value1      the offset from the start of the input string to the start of
1275                 the output string; if negative, count from the right.
1276   value2      the length of the output string, or negative (-1) for unset
1277                 if value1 is positive, unset means "all after"
1278                 if value1 is negative, unset means "all before"
1279   len         set to the length of the returned string
1280
1281 Returns:      pointer to the output string, or NULL if there is an error
1282 */
1283
1284 static uschar *
1285 extract_substr(uschar *subject, int value1, int value2, int *len)
1286 {
1287 int sublen = Ustrlen(subject);
1288
1289 if (value1 < 0)    /* count from right */
1290   {
1291   value1 += sublen;
1292
1293   /* If the position is before the start, skip to the start, and adjust the
1294   length. If the length ends up negative, the substring is null because nothing
1295   can precede. This falls out naturally when the length is unset, meaning "all
1296   to the left". */
1297
1298   if (value1 < 0)
1299     {
1300     value2 += value1;
1301     if (value2 < 0) value2 = 0;
1302     value1 = 0;
1303     }
1304
1305   /* Otherwise an unset length => characters before value1 */
1306
1307   else if (value2 < 0)
1308     {
1309     value2 = value1;
1310     value1 = 0;
1311     }
1312   }
1313
1314 /* For a non-negative offset, if the starting position is past the end of the
1315 string, the result will be the null string. Otherwise, an unset length means
1316 "rest"; just set it to the maximum - it will be cut down below if necessary. */
1317
1318 else
1319   {
1320   if (value1 > sublen)
1321     {
1322     value1 = sublen;
1323     value2 = 0;
1324     }
1325   else if (value2 < 0) value2 = sublen;
1326   }
1327
1328 /* Cut the length down to the maximum possible for the offset value, and get
1329 the required characters. */
1330
1331 if (value1 + value2 > sublen) value2 = sublen - value1;
1332 *len = value2;
1333 return subject + value1;
1334 }
1335
1336
1337
1338
1339 /*************************************************
1340 *            Old-style hash of a string          *
1341 *************************************************/
1342
1343 /* Perform the ${hash expansion operation.
1344
1345 Arguments:
1346   subject     the input string (an expanded substring)
1347   value1      the length of the output string; if greater or equal to the
1348                 length of the input string, the input string is returned
1349   value2      the number of hash characters to use, or 26 if negative
1350   len         set to the length of the returned string
1351
1352 Returns:      pointer to the output string, or NULL if there is an error
1353 */
1354
1355 static uschar *
1356 compute_hash(uschar *subject, int value1, int value2, int *len)
1357 {
1358 int sublen = Ustrlen(subject);
1359
1360 if (value2 < 0) value2 = 26;
1361 else if (value2 > Ustrlen(hashcodes))
1362   {
1363   expand_string_message =
1364     string_sprintf("hash count \"%d\" too big", value2);
1365   return NULL;
1366   }
1367
1368 /* Calculate the hash text. We know it is shorter than the original string, so
1369 can safely place it in subject[] (we know that subject is always itself an
1370 expanded substring). */
1371
1372 if (value1 < sublen)
1373   {
1374   int c;
1375   int i = 0;
1376   int j = value1;
1377   while ((c = (subject[j])) != 0)
1378     {
1379     int shift = (c + j++) & 7;
1380     subject[i] ^= (c << shift) | (c >> (8-shift));
1381     if (++i >= value1) i = 0;
1382     }
1383   for (i = 0; i < value1; i++)
1384     subject[i] = hashcodes[(subject[i]) % value2];
1385   }
1386 else value1 = sublen;
1387
1388 *len = value1;
1389 return subject;
1390 }
1391
1392
1393
1394
1395 /*************************************************
1396 *             Numeric hash of a string           *
1397 *************************************************/
1398
1399 /* Perform the ${nhash expansion operation. The first characters of the
1400 string are treated as most important, and get the highest prime numbers.
1401
1402 Arguments:
1403   subject     the input string
1404   value1      the maximum value of the first part of the result
1405   value2      the maximum value of the second part of the result,
1406                 or negative to produce only a one-part result
1407   len         set to the length of the returned string
1408
1409 Returns:  pointer to the output string, or NULL if there is an error.
1410 */
1411
1412 static uschar *
1413 compute_nhash (uschar *subject, int value1, int value2, int *len)
1414 {
1415 uschar *s = subject;
1416 int i = 0;
1417 unsigned long int total = 0; /* no overflow */
1418
1419 while (*s != 0)
1420   {
1421   if (i == 0) i = sizeof(prime)/sizeof(int) - 1;
1422   total += prime[i--] * (unsigned int)(*s++);
1423   }
1424
1425 /* If value2 is unset, just compute one number */
1426
1427 if (value2 < 0)
1428   {
1429   s = string_sprintf("%d", total % value1);
1430   }
1431
1432 /* Otherwise do a div/mod hash */
1433
1434 else
1435   {
1436   total = total % (value1 * value2);
1437   s = string_sprintf("%d/%d", total/value2, total % value2);
1438   }
1439
1440 *len = Ustrlen(s);
1441 return s;
1442 }
1443
1444
1445
1446
1447
1448 /*************************************************
1449 *     Find the value of a header or headers      *
1450 *************************************************/
1451
1452 /* Multiple instances of the same header get concatenated, and this function
1453 can also return a concatenation of all the header lines. When concatenating
1454 specific headers that contain lists of addresses, a comma is inserted between
1455 them. Otherwise we use a straight concatenation. Because some messages can have
1456 pathologically large number of lines, there is a limit on the length that is
1457 returned. Also, to avoid massive store use which would result from using
1458 string_cat() as it copies and extends strings, we do a preliminary pass to find
1459 out exactly how much store will be needed. On "normal" messages this will be
1460 pretty trivial.
1461
1462 Arguments:
1463   name          the name of the header, without the leading $header_ or $h_,
1464                 or NULL if a concatenation of all headers is required
1465   exists_only   TRUE if called from a def: test; don't need to build a string;
1466                 just return a string that is not "" and not "0" if the header
1467                 exists
1468   newsize       return the size of memory block that was obtained; may be NULL
1469                 if exists_only is TRUE
1470   want_raw      TRUE if called for $rh_ or $rheader_ variables; no processing,
1471                 other than concatenating, will be done on the header. Also used
1472                 for $message_headers_raw.
1473   charset       name of charset to translate MIME words to; used only if
1474                 want_raw is false; if NULL, no translation is done (this is
1475                 used for $bh_ and $bheader_)
1476
1477 Returns:        NULL if the header does not exist, else a pointer to a new
1478                 store block
1479 */
1480
1481 static uschar *
1482 find_header(uschar *name, BOOL exists_only, int *newsize, BOOL want_raw,
1483   uschar *charset)
1484 {
1485 BOOL found = name == NULL;
1486 int comma = 0;
1487 int len = found? 0 : Ustrlen(name);
1488 int i;
1489 uschar *yield = NULL;
1490 uschar *ptr = NULL;
1491
1492 /* Loop for two passes - saves code repetition */
1493
1494 for (i = 0; i < 2; i++)
1495   {
1496   int size = 0;
1497   header_line *h;
1498
1499   for (h = header_list; size < header_insert_maxlen && h != NULL; h = h->next)
1500     {
1501     if (h->type != htype_old && h->text != NULL)  /* NULL => Received: placeholder */
1502       {
1503       if (name == NULL || (len <= h->slen && strncmpic(name, h->text, len) == 0))
1504         {
1505         int ilen;
1506         uschar *t;
1507
1508         if (exists_only) return US"1";      /* don't need actual string */
1509         found = TRUE;
1510         t = h->text + len;                  /* text to insert */
1511         if (!want_raw)                      /* unless wanted raw, */
1512           while (isspace(*t)) t++;          /* remove leading white space */
1513         ilen = h->slen - (t - h->text);     /* length to insert */
1514
1515         /* Unless wanted raw, remove trailing whitespace, including the
1516         newline. */
1517
1518         if (!want_raw)
1519           while (ilen > 0 && isspace(t[ilen-1])) ilen--;
1520
1521         /* Set comma = 1 if handling a single header and it's one of those
1522         that contains an address list, except when asked for raw headers. Only
1523         need to do this once. */
1524
1525         if (!want_raw && name != NULL && comma == 0 &&
1526             Ustrchr("BCFRST", h->type) != NULL)
1527           comma = 1;
1528
1529         /* First pass - compute total store needed; second pass - compute
1530         total store used, including this header. */
1531
1532         size += ilen + comma + 1;  /* +1 for the newline */
1533
1534         /* Second pass - concatentate the data, up to a maximum. Note that
1535         the loop stops when size hits the limit. */
1536
1537         if (i != 0)
1538           {
1539           if (size > header_insert_maxlen)
1540             {
1541             ilen -= size - header_insert_maxlen - 1;
1542             comma = 0;
1543             }
1544           Ustrncpy(ptr, t, ilen);
1545           ptr += ilen;
1546
1547           /* For a non-raw header, put in the comma if needed, then add
1548           back the newline we removed above, provided there was some text in
1549           the header. */
1550
1551           if (!want_raw && ilen > 0)
1552             {
1553             if (comma != 0) *ptr++ = ',';
1554             *ptr++ = '\n';
1555             }
1556           }
1557         }
1558       }
1559     }
1560
1561   /* At end of first pass, return NULL if no header found. Then truncate size
1562   if necessary, and get the buffer to hold the data, returning the buffer size.
1563   */
1564
1565   if (i == 0)
1566     {
1567     if (!found) return NULL;
1568     if (size > header_insert_maxlen) size = header_insert_maxlen;
1569     *newsize = size + 1;
1570     ptr = yield = store_get(*newsize);
1571     }
1572   }
1573
1574 /* That's all we do for raw header expansion. */
1575
1576 if (want_raw)
1577   {
1578   *ptr = 0;
1579   }
1580
1581 /* Otherwise, remove a final newline and a redundant added comma. Then we do
1582 RFC 2047 decoding, translating the charset if requested. The rfc2047_decode2()
1583 function can return an error with decoded data if the charset translation
1584 fails. If decoding fails, it returns NULL. */
1585
1586 else
1587   {
1588   uschar *decoded, *error;
1589   if (ptr > yield && ptr[-1] == '\n') ptr--;
1590   if (ptr > yield && comma != 0 && ptr[-1] == ',') ptr--;
1591   *ptr = 0;
1592   decoded = rfc2047_decode2(yield, check_rfc2047_length, charset, '?', NULL,
1593     newsize, &error);
1594   if (error != NULL)
1595     {
1596     DEBUG(D_any) debug_printf("*** error in RFC 2047 decoding: %s\n"
1597       "    input was: %s\n", error, yield);
1598     }
1599   if (decoded != NULL) yield = decoded;
1600   }
1601
1602 return yield;
1603 }
1604
1605
1606
1607
1608 /*************************************************
1609 *               Return list of recipients        *
1610 *************************************************/
1611 /* A recipients list is available only during system message filtering,
1612 during ACL processing after DATA, and while expanding pipe commands
1613 generated from a system filter, but not elsewhere. */
1614
1615 static uschar *
1616 fn_recipients(void)
1617 {
1618 if (!enable_dollar_recipients) return NULL; else
1619   {
1620   int size = 128;
1621   int ptr = 0;
1622   int i;
1623   uschar * s = store_get(size);
1624   for (i = 0; i < recipients_count; i++)
1625     {
1626     if (i != 0) s = string_cat(s, &size, &ptr, US", ", 2);
1627     s = string_cat(s, &size, &ptr, recipients_list[i].address,
1628       Ustrlen(recipients_list[i].address));
1629     }
1630   s[ptr] = 0;     /* string_cat() leaves room */
1631   return s;
1632   }
1633 }
1634
1635
1636 /*************************************************
1637 *               Find value of a variable         *
1638 *************************************************/
1639
1640 /* The table of variables is kept in alphabetic order, so we can search it
1641 using a binary chop. The "choplen" variable is nothing to do with the binary
1642 chop.
1643
1644 Arguments:
1645   name          the name of the variable being sought
1646   exists_only   TRUE if this is a def: test; passed on to find_header()
1647   skipping      TRUE => skip any processing evaluation; this is not the same as
1648                   exists_only because def: may test for values that are first
1649                   evaluated here
1650   newsize       pointer to an int which is initially zero; if the answer is in
1651                 a new memory buffer, *newsize is set to its size
1652
1653 Returns:        NULL if the variable does not exist, or
1654                 a pointer to the variable's contents, or
1655                 something non-NULL if exists_only is TRUE
1656 */
1657
1658 static uschar *
1659 find_variable(uschar *name, BOOL exists_only, BOOL skipping, int *newsize)
1660 {
1661 var_entry * vp;
1662 uschar *s, *domain;
1663 uschar **ss;
1664 void * val;
1665
1666 /* Handle ACL variables, whose names are of the form acl_cxxx or acl_mxxx.
1667 Originally, xxx had to be a number in the range 0-9 (later 0-19), but from
1668 release 4.64 onwards arbitrary names are permitted, as long as the first 5
1669 characters are acl_c or acl_m and the sixth is either a digit or an underscore
1670 (this gave backwards compatibility at the changeover). There may be built-in
1671 variables whose names start acl_ but they should never start in this way. This
1672 slightly messy specification is a consequence of the history, needless to say.
1673
1674 If an ACL variable does not exist, treat it as empty, unless strict_acl_vars is
1675 set, in which case give an error. */
1676
1677 if ((Ustrncmp(name, "acl_c", 5) == 0 || Ustrncmp(name, "acl_m", 5) == 0) &&
1678      !isalpha(name[5]))
1679   {
1680   tree_node *node =
1681     tree_search((name[4] == 'c')? acl_var_c : acl_var_m, name + 4);
1682   return (node == NULL)? (strict_acl_vars? NULL : US"") : node->data.ptr;
1683   }
1684
1685 /* Handle $auth<n> variables. */
1686
1687 if (Ustrncmp(name, "auth", 4) == 0)
1688   {
1689   uschar *endptr;
1690   int n = Ustrtoul(name + 4, &endptr, 10);
1691   if (*endptr == 0 && n != 0 && n <= AUTH_VARS)
1692     return (auth_vars[n-1] == NULL)? US"" : auth_vars[n-1];
1693   }
1694
1695 /* For all other variables, search the table */
1696
1697 if (!(vp = find_var_ent(name)))
1698   return NULL;          /* Unknown variable name */
1699
1700 /* Found an existing variable. If in skipping state, the value isn't needed,
1701 and we want to avoid processing (such as looking up the host name). */
1702
1703 if (skipping)
1704   return US"";
1705
1706 val = vp->value;
1707 switch (vp->type)
1708   {
1709   case vtype_filter_int:
1710   if (!filter_running) return NULL;
1711   /* Fall through */
1712   /* VVVVVVVVVVVV */
1713   case vtype_int:
1714   sprintf(CS var_buffer, "%d", *(int *)(val)); /* Integer */
1715   return var_buffer;
1716
1717   case vtype_ino:
1718   sprintf(CS var_buffer, "%ld", (long int)(*(ino_t *)(val))); /* Inode */
1719   return var_buffer;
1720
1721   case vtype_gid:
1722   sprintf(CS var_buffer, "%ld", (long int)(*(gid_t *)(val))); /* gid */
1723   return var_buffer;
1724
1725   case vtype_uid:
1726   sprintf(CS var_buffer, "%ld", (long int)(*(uid_t *)(val))); /* uid */
1727   return var_buffer;
1728
1729   case vtype_bool:
1730   sprintf(CS var_buffer, "%s", *(BOOL *)(val) ? "yes" : "no"); /* bool */
1731   return var_buffer;
1732
1733   case vtype_stringptr:                      /* Pointer to string */
1734   s = *((uschar **)(val));
1735   return (s == NULL)? US"" : s;
1736
1737   case vtype_pid:
1738   sprintf(CS var_buffer, "%d", (int)getpid()); /* pid */
1739   return var_buffer;
1740
1741   case vtype_load_avg:
1742   sprintf(CS var_buffer, "%d", OS_GETLOADAVG()); /* load_average */
1743   return var_buffer;
1744
1745   case vtype_host_lookup:                    /* Lookup if not done so */
1746   if (sender_host_name == NULL && sender_host_address != NULL &&
1747       !host_lookup_failed && host_name_lookup() == OK)
1748     host_build_sender_fullhost();
1749   return (sender_host_name == NULL)? US"" : sender_host_name;
1750
1751   case vtype_localpart:                      /* Get local part from address */
1752   s = *((uschar **)(val));
1753   if (s == NULL) return US"";
1754   domain = Ustrrchr(s, '@');
1755   if (domain == NULL) return s;
1756   if (domain - s > sizeof(var_buffer) - 1)
1757     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "local part longer than " SIZE_T_FMT
1758         " in string expansion", sizeof(var_buffer));
1759   Ustrncpy(var_buffer, s, domain - s);
1760   var_buffer[domain - s] = 0;
1761   return var_buffer;
1762
1763   case vtype_domain:                         /* Get domain from address */
1764   s = *((uschar **)(val));
1765   if (s == NULL) return US"";
1766   domain = Ustrrchr(s, '@');
1767   return (domain == NULL)? US"" : domain + 1;
1768
1769   case vtype_msgheaders:
1770   return find_header(NULL, exists_only, newsize, FALSE, NULL);
1771
1772   case vtype_msgheaders_raw:
1773   return find_header(NULL, exists_only, newsize, TRUE, NULL);
1774
1775   case vtype_msgbody:                        /* Pointer to msgbody string */
1776   case vtype_msgbody_end:                    /* Ditto, the end of the msg */
1777   ss = (uschar **)(val);
1778   if (*ss == NULL && deliver_datafile >= 0)  /* Read body when needed */
1779     {
1780     uschar *body;
1781     off_t start_offset = SPOOL_DATA_START_OFFSET;
1782     int len = message_body_visible;
1783     if (len > message_size) len = message_size;
1784     *ss = body = store_malloc(len+1);
1785     body[0] = 0;
1786     if (vp->type == vtype_msgbody_end)
1787       {
1788       struct stat statbuf;
1789       if (fstat(deliver_datafile, &statbuf) == 0)
1790         {
1791         start_offset = statbuf.st_size - len;
1792         if (start_offset < SPOOL_DATA_START_OFFSET)
1793           start_offset = SPOOL_DATA_START_OFFSET;
1794         }
1795       }
1796     lseek(deliver_datafile, start_offset, SEEK_SET);
1797     len = read(deliver_datafile, body, len);
1798     if (len > 0)
1799       {
1800       body[len] = 0;
1801       if (message_body_newlines)   /* Separate loops for efficiency */
1802         {
1803         while (len > 0)
1804           { if (body[--len] == 0) body[len] = ' '; }
1805         }
1806       else
1807         {
1808         while (len > 0)
1809           { if (body[--len] == '\n' || body[len] == 0) body[len] = ' '; }
1810         }
1811       }
1812     }
1813   return (*ss == NULL)? US"" : *ss;
1814
1815   case vtype_todbsdin:                       /* BSD inbox time of day */
1816   return tod_stamp(tod_bsdin);
1817
1818   case vtype_tode:                           /* Unix epoch time of day */
1819   return tod_stamp(tod_epoch);
1820
1821   case vtype_todel:                          /* Unix epoch/usec time of day */
1822   return tod_stamp(tod_epoch_l);
1823
1824   case vtype_todf:                           /* Full time of day */
1825   return tod_stamp(tod_full);
1826
1827   case vtype_todl:                           /* Log format time of day */
1828   return tod_stamp(tod_log_bare);            /* (without timezone) */
1829
1830   case vtype_todzone:                        /* Time zone offset only */
1831   return tod_stamp(tod_zone);
1832
1833   case vtype_todzulu:                        /* Zulu time */
1834   return tod_stamp(tod_zulu);
1835
1836   case vtype_todlf:                          /* Log file datestamp tod */
1837   return tod_stamp(tod_log_datestamp_daily);
1838
1839   case vtype_reply:                          /* Get reply address */
1840   s = find_header(US"reply-to:", exists_only, newsize, TRUE,
1841     headers_charset);
1842   if (s != NULL) while (isspace(*s)) s++;
1843   if (s == NULL || *s == 0)
1844     {
1845     *newsize = 0;                            /* For the *s==0 case */
1846     s = find_header(US"from:", exists_only, newsize, TRUE, headers_charset);
1847     }
1848   if (s != NULL)
1849     {
1850     uschar *t;
1851     while (isspace(*s)) s++;
1852     for (t = s; *t != 0; t++) if (*t == '\n') *t = ' ';
1853     while (t > s && isspace(t[-1])) t--;
1854     *t = 0;
1855     }
1856   return (s == NULL)? US"" : s;
1857
1858   case vtype_string_func:
1859     {
1860     uschar * (*fn)() = val;
1861     return fn();
1862     }
1863
1864   case vtype_pspace:
1865     {
1866     int inodes;
1867     sprintf(CS var_buffer, "%d",
1868       receive_statvfs(val == (void *)TRUE, &inodes));
1869     }
1870   return var_buffer;
1871
1872   case vtype_pinodes:
1873     {
1874     int inodes;
1875     (void) receive_statvfs(val == (void *)TRUE, &inodes);
1876     sprintf(CS var_buffer, "%d", inodes);
1877     }
1878   return var_buffer;
1879
1880   case vtype_cert:
1881   return *(void **)val ? US"<cert>" : US"";
1882
1883   #ifndef DISABLE_DKIM
1884   case vtype_dkim:
1885   return dkim_exim_expand_query((int)(long)val);
1886   #endif
1887
1888   }
1889
1890 return NULL;  /* Unknown variable. Silences static checkers. */
1891 }
1892
1893
1894
1895
1896 void
1897 modify_variable(uschar *name, void * value)
1898 {
1899 var_entry * vp;
1900 if ((vp = find_var_ent(name))) vp->value = value;
1901 return;          /* Unknown variable name, fail silently */
1902 }
1903
1904
1905
1906
1907
1908 /*************************************************
1909 *           Read and expand substrings           *
1910 *************************************************/
1911
1912 /* This function is called to read and expand argument substrings for various
1913 expansion items. Some have a minimum requirement that is less than the maximum;
1914 in these cases, the first non-present one is set to NULL.
1915
1916 Arguments:
1917   sub        points to vector of pointers to set
1918   n          maximum number of substrings
1919   m          minimum required
1920   sptr       points to current string pointer
1921   skipping   the skipping flag
1922   check_end  if TRUE, check for final '}'
1923   name       name of item, for error message
1924   resetok    if not NULL, pointer to flag - write FALSE if unsafe to reset
1925              the store.
1926
1927 Returns:     0 OK; string pointer updated
1928              1 curly bracketing error (too few arguments)
1929              2 too many arguments (only if check_end is set); message set
1930              3 other error (expansion failure)
1931 */
1932
1933 static int
1934 read_subs(uschar **sub, int n, int m, uschar **sptr, BOOL skipping,
1935   BOOL check_end, uschar *name, BOOL *resetok)
1936 {
1937 int i;
1938 uschar *s = *sptr;
1939
1940 while (isspace(*s)) s++;
1941 for (i = 0; i < n; i++)
1942   {
1943   if (*s != '{')
1944     {
1945     if (i < m) return 1;
1946     sub[i] = NULL;
1947     break;
1948     }
1949   sub[i] = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, resetok);
1950   if (sub[i] == NULL) return 3;
1951   if (*s++ != '}') return 1;
1952   while (isspace(*s)) s++;
1953   }
1954 if (check_end && *s++ != '}')
1955   {
1956   if (s[-1] == '{')
1957     {
1958     expand_string_message = string_sprintf("Too many arguments for \"%s\" "
1959       "(max is %d)", name, n);
1960     return 2;
1961     }
1962   return 1;
1963   }
1964
1965 *sptr = s;
1966 return 0;
1967 }
1968
1969
1970
1971
1972 /*************************************************
1973 *     Elaborate message for bad variable         *
1974 *************************************************/
1975
1976 /* For the "unknown variable" message, take a look at the variable's name, and
1977 give additional information about possible ACL variables. The extra information
1978 is added on to expand_string_message.
1979
1980 Argument:   the name of the variable
1981 Returns:    nothing
1982 */
1983
1984 static void
1985 check_variable_error_message(uschar *name)
1986 {
1987 if (Ustrncmp(name, "acl_", 4) == 0)
1988   expand_string_message = string_sprintf("%s (%s)", expand_string_message,
1989     (name[4] == 'c' || name[4] == 'm')?
1990       (isalpha(name[5])?
1991         US"6th character of a user-defined ACL variable must be a digit or underscore" :
1992         US"strict_acl_vars is set"    /* Syntax is OK, it has to be this */
1993       ) :
1994       US"user-defined ACL variables must start acl_c or acl_m");
1995 }
1996
1997
1998
1999 /*
2000 Load args from sub array to globals, and call acl_check().
2001 Sub array will be corrupted on return.
2002
2003 Returns:       OK         access is granted by an ACCEPT verb
2004                DISCARD    access is granted by a DISCARD verb
2005                FAIL       access is denied
2006                FAIL_DROP  access is denied; drop the connection
2007                DEFER      can't tell at the moment
2008                ERROR      disaster
2009 */
2010 static int
2011 eval_acl(uschar ** sub, int nsub, uschar ** user_msgp)
2012 {
2013 int i;
2014 uschar *tmp;
2015 int sav_narg = acl_narg;
2016 int ret;
2017 extern int acl_where;
2018
2019 if(--nsub > sizeof(acl_arg)/sizeof(*acl_arg)) nsub = sizeof(acl_arg)/sizeof(*acl_arg);
2020 for (i = 0; i < nsub && sub[i+1]; i++)
2021   {
2022   tmp = acl_arg[i];
2023   acl_arg[i] = sub[i+1];        /* place callers args in the globals */
2024   sub[i+1] = tmp;               /* stash the old args using our caller's storage */
2025   }
2026 acl_narg = i;
2027 while (i < nsub)
2028   {
2029   sub[i+1] = acl_arg[i];
2030   acl_arg[i++] = NULL;
2031   }
2032
2033 DEBUG(D_expand)
2034   debug_printf("expanding: acl: %s  arg: %s%s\n",
2035     sub[0],
2036     acl_narg>0 ? acl_arg[0] : US"<none>",
2037     acl_narg>1 ? " +more"   : "");
2038
2039 ret = acl_eval(acl_where, sub[0], user_msgp, &tmp);
2040
2041 for (i = 0; i < nsub; i++)
2042   acl_arg[i] = sub[i+1];        /* restore old args */
2043 acl_narg = sav_narg;
2044
2045 return ret;
2046 }
2047
2048
2049
2050
2051 /*************************************************
2052 *        Read and evaluate a condition           *
2053 *************************************************/
2054
2055 /*
2056 Arguments:
2057   s        points to the start of the condition text
2058   resetok  points to a BOOL which is written false if it is unsafe to
2059            free memory. Certain condition types (acl) may have side-effect
2060            allocation which must be preserved.
2061   yield    points to a BOOL to hold the result of the condition test;
2062            if NULL, we are just reading through a condition that is
2063            part of an "or" combination to check syntax, or in a state
2064            where the answer isn't required
2065
2066 Returns:   a pointer to the first character after the condition, or
2067            NULL after an error
2068 */
2069
2070 static uschar *
2071 eval_condition(uschar *s, BOOL *resetok, BOOL *yield)
2072 {
2073 BOOL testfor = TRUE;
2074 BOOL tempcond, combined_cond;
2075 BOOL *subcondptr;
2076 BOOL sub2_honour_dollar = TRUE;
2077 int i, rc, cond_type, roffset;
2078 int_eximarith_t num[2];
2079 struct stat statbuf;
2080 uschar name[256];
2081 uschar *sub[10];
2082
2083 const pcre *re;
2084 const uschar *rerror;
2085
2086 for (;;)
2087   {
2088   while (isspace(*s)) s++;
2089   if (*s == '!') { testfor = !testfor; s++; } else break;
2090   }
2091
2092 /* Numeric comparisons are symbolic */
2093
2094 if (*s == '=' || *s == '>' || *s == '<')
2095   {
2096   int p = 0;
2097   name[p++] = *s++;
2098   if (*s == '=')
2099     {
2100     name[p++] = '=';
2101     s++;
2102     }
2103   name[p] = 0;
2104   }
2105
2106 /* All other conditions are named */
2107
2108 else s = read_name(name, 256, s, US"_");
2109
2110 /* If we haven't read a name, it means some non-alpha character is first. */
2111
2112 if (name[0] == 0)
2113   {
2114   expand_string_message = string_sprintf("condition name expected, "
2115     "but found \"%.16s\"", s);
2116   return NULL;
2117   }
2118
2119 /* Find which condition we are dealing with, and switch on it */
2120
2121 cond_type = chop_match(name, cond_table, sizeof(cond_table)/sizeof(uschar *));
2122 switch(cond_type)
2123   {
2124   /* def: tests for a non-empty variable, or for the existence of a header. If
2125   yield == NULL we are in a skipping state, and don't care about the answer. */
2126
2127   case ECOND_DEF:
2128   if (*s != ':')
2129     {
2130     expand_string_message = US"\":\" expected after \"def\"";
2131     return NULL;
2132     }
2133
2134   s = read_name(name, 256, s+1, US"_");
2135
2136   /* Test for a header's existence. If the name contains a closing brace
2137   character, this may be a user error where the terminating colon has been
2138   omitted. Set a flag to adjust a subsequent error message in this case. */
2139
2140   if (Ustrncmp(name, "h_", 2) == 0 ||
2141       Ustrncmp(name, "rh_", 3) == 0 ||
2142       Ustrncmp(name, "bh_", 3) == 0 ||
2143       Ustrncmp(name, "header_", 7) == 0 ||
2144       Ustrncmp(name, "rheader_", 8) == 0 ||
2145       Ustrncmp(name, "bheader_", 8) == 0)
2146     {
2147     s = read_header_name(name, 256, s);
2148     /* {-for-text-editors */
2149     if (Ustrchr(name, '}') != NULL) malformed_header = TRUE;
2150     if (yield != NULL) *yield =
2151       (find_header(name, TRUE, NULL, FALSE, NULL) != NULL) == testfor;
2152     }
2153
2154   /* Test for a variable's having a non-empty value. A non-existent variable
2155   causes an expansion failure. */
2156
2157   else
2158     {
2159     uschar *value = find_variable(name, TRUE, yield == NULL, NULL);
2160     if (value == NULL)
2161       {
2162       expand_string_message = (name[0] == 0)?
2163         string_sprintf("variable name omitted after \"def:\"") :
2164         string_sprintf("unknown variable \"%s\" after \"def:\"", name);
2165       check_variable_error_message(name);
2166       return NULL;
2167       }
2168     if (yield != NULL) *yield = (value[0] != 0) == testfor;
2169     }
2170
2171   return s;
2172
2173
2174   /* first_delivery tests for first delivery attempt */
2175
2176   case ECOND_FIRST_DELIVERY:
2177   if (yield != NULL) *yield = deliver_firsttime == testfor;
2178   return s;
2179
2180
2181   /* queue_running tests for any process started by a queue runner */
2182
2183   case ECOND_QUEUE_RUNNING:
2184   if (yield != NULL) *yield = (queue_run_pid != (pid_t)0) == testfor;
2185   return s;
2186
2187
2188   /* exists:  tests for file existence
2189        isip:  tests for any IP address
2190       isip4:  tests for an IPv4 address
2191       isip6:  tests for an IPv6 address
2192         pam:  does PAM authentication
2193      radius:  does RADIUS authentication
2194    ldapauth:  does LDAP authentication
2195     pwcheck:  does Cyrus SASL pwcheck authentication
2196   */
2197
2198   case ECOND_EXISTS:
2199   case ECOND_ISIP:
2200   case ECOND_ISIP4:
2201   case ECOND_ISIP6:
2202   case ECOND_PAM:
2203   case ECOND_RADIUS:
2204   case ECOND_LDAPAUTH:
2205   case ECOND_PWCHECK:
2206
2207   while (isspace(*s)) s++;
2208   if (*s != '{') goto COND_FAILED_CURLY_START;          /* }-for-text-editors */
2209
2210   sub[0] = expand_string_internal(s+1, TRUE, &s, yield == NULL, TRUE, resetok);
2211   if (sub[0] == NULL) return NULL;
2212   /* {-for-text-editors */
2213   if (*s++ != '}') goto COND_FAILED_CURLY_END;
2214
2215   if (yield == NULL) return s;   /* No need to run the test if skipping */
2216
2217   switch(cond_type)
2218     {
2219     case ECOND_EXISTS:
2220     if ((expand_forbid & RDO_EXISTS) != 0)
2221       {
2222       expand_string_message = US"File existence tests are not permitted";
2223       return NULL;
2224       }
2225     *yield = (Ustat(sub[0], &statbuf) == 0) == testfor;
2226     break;
2227
2228     case ECOND_ISIP:
2229     case ECOND_ISIP4:
2230     case ECOND_ISIP6:
2231     rc = string_is_ip_address(sub[0], NULL);
2232     *yield = ((cond_type == ECOND_ISIP)? (rc != 0) :
2233              (cond_type == ECOND_ISIP4)? (rc == 4) : (rc == 6)) == testfor;
2234     break;
2235
2236     /* Various authentication tests - all optionally compiled */
2237
2238     case ECOND_PAM:
2239     #ifdef SUPPORT_PAM
2240     rc = auth_call_pam(sub[0], &expand_string_message);
2241     goto END_AUTH;
2242     #else
2243     goto COND_FAILED_NOT_COMPILED;
2244     #endif  /* SUPPORT_PAM */
2245
2246     case ECOND_RADIUS:
2247     #ifdef RADIUS_CONFIG_FILE
2248     rc = auth_call_radius(sub[0], &expand_string_message);
2249     goto END_AUTH;
2250     #else
2251     goto COND_FAILED_NOT_COMPILED;
2252     #endif  /* RADIUS_CONFIG_FILE */
2253
2254     case ECOND_LDAPAUTH:
2255     #ifdef LOOKUP_LDAP
2256       {
2257       /* Just to keep the interface the same */
2258       BOOL do_cache;
2259       int old_pool = store_pool;
2260       store_pool = POOL_SEARCH;
2261       rc = eldapauth_find((void *)(-1), NULL, sub[0], Ustrlen(sub[0]), NULL,
2262         &expand_string_message, &do_cache);
2263       store_pool = old_pool;
2264       }
2265     goto END_AUTH;
2266     #else
2267     goto COND_FAILED_NOT_COMPILED;
2268     #endif  /* LOOKUP_LDAP */
2269
2270     case ECOND_PWCHECK:
2271     #ifdef CYRUS_PWCHECK_SOCKET
2272     rc = auth_call_pwcheck(sub[0], &expand_string_message);
2273     goto END_AUTH;
2274     #else
2275     goto COND_FAILED_NOT_COMPILED;
2276     #endif  /* CYRUS_PWCHECK_SOCKET */
2277
2278     #if defined(SUPPORT_PAM) || defined(RADIUS_CONFIG_FILE) || \
2279         defined(LOOKUP_LDAP) || defined(CYRUS_PWCHECK_SOCKET)
2280     END_AUTH:
2281     if (rc == ERROR || rc == DEFER) return NULL;
2282     *yield = (rc == OK) == testfor;
2283     #endif
2284     }
2285   return s;
2286
2287
2288   /* call ACL (in a conditional context).  Accept true, deny false.
2289   Defer is a forced-fail.  Anything set by message= goes to $value.
2290   Up to ten parameters are used; we use the braces round the name+args
2291   like the saslauthd condition does, to permit a variable number of args.
2292   See also the expansion-item version EITEM_ACL and the traditional
2293   acl modifier ACLC_ACL.
2294   Since the ACL may allocate new global variables, tell our caller to not
2295   reclaim memory.
2296   */
2297
2298   case ECOND_ACL:
2299     /* ${if acl {{name}{arg1}{arg2}...}  {yes}{no}} */
2300     {
2301     uschar *user_msg;
2302     BOOL cond = FALSE;
2303     int size = 0;
2304     int ptr = 0;
2305
2306     while (isspace(*s)) s++;
2307     if (*s++ != '{') goto COND_FAILED_CURLY_START;      /*}*/
2308
2309     switch(read_subs(sub, sizeof(sub)/sizeof(*sub), 1,
2310       &s, yield == NULL, TRUE, US"acl", resetok))
2311       {
2312       case 1: expand_string_message = US"too few arguments or bracketing "
2313         "error for acl";
2314       case 2:
2315       case 3: return NULL;
2316       }
2317
2318     *resetok = FALSE;
2319     if (yield != NULL) switch(eval_acl(sub, sizeof(sub)/sizeof(*sub), &user_msg))
2320         {
2321         case OK:
2322           cond = TRUE;
2323         case FAIL:
2324           lookup_value = NULL;
2325           if (user_msg)
2326             {
2327             lookup_value = string_cat(NULL, &size, &ptr, user_msg, Ustrlen(user_msg));
2328             lookup_value[ptr] = '\0';
2329             }
2330           *yield = cond == testfor;
2331           break;
2332
2333         case DEFER:
2334           expand_string_forcedfail = TRUE;
2335         default:
2336           expand_string_message = string_sprintf("error from acl \"%s\"", sub[0]);
2337           return NULL;
2338         }
2339     return s;
2340     }
2341
2342
2343   /* saslauthd: does Cyrus saslauthd authentication. Four parameters are used:
2344
2345      ${if saslauthd {{username}{password}{service}{realm}}  {yes}{no}}
2346
2347   However, the last two are optional. That is why the whole set is enclosed
2348   in their own set of braces. */
2349
2350   case ECOND_SASLAUTHD:
2351   #ifndef CYRUS_SASLAUTHD_SOCKET
2352   goto COND_FAILED_NOT_COMPILED;
2353   #else
2354   while (isspace(*s)) s++;
2355   if (*s++ != '{') goto COND_FAILED_CURLY_START;        /* }-for-text-editors */
2356   switch(read_subs(sub, 4, 2, &s, yield == NULL, TRUE, US"saslauthd", resetok))
2357     {
2358     case 1: expand_string_message = US"too few arguments or bracketing "
2359       "error for saslauthd";
2360     case 2:
2361     case 3: return NULL;
2362     }
2363   if (sub[2] == NULL) sub[3] = NULL;  /* realm if no service */
2364   if (yield != NULL)
2365     {
2366     int rc;
2367     rc = auth_call_saslauthd(sub[0], sub[1], sub[2], sub[3],
2368       &expand_string_message);
2369     if (rc == ERROR || rc == DEFER) return NULL;
2370     *yield = (rc == OK) == testfor;
2371     }
2372   return s;
2373   #endif /* CYRUS_SASLAUTHD_SOCKET */
2374
2375
2376   /* symbolic operators for numeric and string comparison, and a number of
2377   other operators, all requiring two arguments.
2378
2379   crypteq:           encrypts plaintext and compares against an encrypted text,
2380                        using crypt(), crypt16(), MD5 or SHA-1
2381   inlist/inlisti:    checks if first argument is in the list of the second
2382   match:             does a regular expression match and sets up the numerical
2383                        variables if it succeeds
2384   match_address:     matches in an address list
2385   match_domain:      matches in a domain list
2386   match_ip:          matches a host list that is restricted to IP addresses
2387   match_local_part:  matches in a local part list
2388   */
2389
2390   case ECOND_MATCH_ADDRESS:
2391   case ECOND_MATCH_DOMAIN:
2392   case ECOND_MATCH_IP:
2393   case ECOND_MATCH_LOCAL_PART:
2394 #ifndef EXPAND_LISTMATCH_RHS
2395     sub2_honour_dollar = FALSE;
2396 #endif
2397     /* FALLTHROUGH */
2398
2399   case ECOND_CRYPTEQ:
2400   case ECOND_INLIST:
2401   case ECOND_INLISTI:
2402   case ECOND_MATCH:
2403
2404   case ECOND_NUM_L:     /* Numerical comparisons */
2405   case ECOND_NUM_LE:
2406   case ECOND_NUM_E:
2407   case ECOND_NUM_EE:
2408   case ECOND_NUM_G:
2409   case ECOND_NUM_GE:
2410
2411   case ECOND_STR_LT:    /* String comparisons */
2412   case ECOND_STR_LTI:
2413   case ECOND_STR_LE:
2414   case ECOND_STR_LEI:
2415   case ECOND_STR_EQ:
2416   case ECOND_STR_EQI:
2417   case ECOND_STR_GT:
2418   case ECOND_STR_GTI:
2419   case ECOND_STR_GE:
2420   case ECOND_STR_GEI:
2421
2422   for (i = 0; i < 2; i++)
2423     {
2424     /* Sometimes, we don't expand substrings; too many insecure configurations
2425     created using match_address{}{} and friends, where the second param
2426     includes information from untrustworthy sources. */
2427     BOOL honour_dollar = TRUE;
2428     if ((i > 0) && !sub2_honour_dollar)
2429       honour_dollar = FALSE;
2430
2431     while (isspace(*s)) s++;
2432     if (*s != '{')
2433       {
2434       if (i == 0) goto COND_FAILED_CURLY_START;
2435       expand_string_message = string_sprintf("missing 2nd string in {} "
2436         "after \"%s\"", name);
2437       return NULL;
2438       }
2439     sub[i] = expand_string_internal(s+1, TRUE, &s, yield == NULL,
2440         honour_dollar, resetok);
2441     if (sub[i] == NULL) return NULL;
2442     if (*s++ != '}') goto COND_FAILED_CURLY_END;
2443
2444     /* Convert to numerical if required; we know that the names of all the
2445     conditions that compare numbers do not start with a letter. This just saves
2446     checking for them individually. */
2447
2448     if (!isalpha(name[0]) && yield != NULL)
2449       {
2450       if (sub[i][0] == 0)
2451         {
2452         num[i] = 0;
2453         DEBUG(D_expand)
2454           debug_printf("empty string cast to zero for numerical comparison\n");
2455         }
2456       else
2457         {
2458         num[i] = expanded_string_integer(sub[i], FALSE);
2459         if (expand_string_message != NULL) return NULL;
2460         }
2461       }
2462     }
2463
2464   /* Result not required */
2465
2466   if (yield == NULL) return s;
2467
2468   /* Do an appropriate comparison */
2469
2470   switch(cond_type)
2471     {
2472     case ECOND_NUM_E:
2473     case ECOND_NUM_EE:
2474     tempcond = (num[0] == num[1]);
2475     break;
2476
2477     case ECOND_NUM_G:
2478     tempcond = (num[0] > num[1]);
2479     break;
2480
2481     case ECOND_NUM_GE:
2482     tempcond = (num[0] >= num[1]);
2483     break;
2484
2485     case ECOND_NUM_L:
2486     tempcond = (num[0] < num[1]);
2487     break;
2488
2489     case ECOND_NUM_LE:
2490     tempcond = (num[0] <= num[1]);
2491     break;
2492
2493     case ECOND_STR_LT:
2494     tempcond = (Ustrcmp(sub[0], sub[1]) < 0);
2495     break;
2496
2497     case ECOND_STR_LTI:
2498     tempcond = (strcmpic(sub[0], sub[1]) < 0);
2499     break;
2500
2501     case ECOND_STR_LE:
2502     tempcond = (Ustrcmp(sub[0], sub[1]) <= 0);
2503     break;
2504
2505     case ECOND_STR_LEI:
2506     tempcond = (strcmpic(sub[0], sub[1]) <= 0);
2507     break;
2508
2509     case ECOND_STR_EQ:
2510     tempcond = (Ustrcmp(sub[0], sub[1]) == 0);
2511     break;
2512
2513     case ECOND_STR_EQI:
2514     tempcond = (strcmpic(sub[0], sub[1]) == 0);
2515     break;
2516
2517     case ECOND_STR_GT:
2518     tempcond = (Ustrcmp(sub[0], sub[1]) > 0);
2519     break;
2520
2521     case ECOND_STR_GTI:
2522     tempcond = (strcmpic(sub[0], sub[1]) > 0);
2523     break;
2524
2525     case ECOND_STR_GE:
2526     tempcond = (Ustrcmp(sub[0], sub[1]) >= 0);
2527     break;
2528
2529     case ECOND_STR_GEI:
2530     tempcond = (strcmpic(sub[0], sub[1]) >= 0);
2531     break;
2532
2533     case ECOND_MATCH:   /* Regular expression match */
2534     re = pcre_compile(CS sub[1], PCRE_COPT, (const char **)&rerror, &roffset,
2535       NULL);
2536     if (re == NULL)
2537       {
2538       expand_string_message = string_sprintf("regular expression error in "
2539         "\"%s\": %s at offset %d", sub[1], rerror, roffset);
2540       return NULL;
2541       }
2542     tempcond = regex_match_and_setup(re, sub[0], 0, -1);
2543     break;
2544
2545     case ECOND_MATCH_ADDRESS:  /* Match in an address list */
2546     rc = match_address_list(sub[0], TRUE, FALSE, &(sub[1]), NULL, -1, 0, NULL);
2547     goto MATCHED_SOMETHING;
2548
2549     case ECOND_MATCH_DOMAIN:   /* Match in a domain list */
2550     rc = match_isinlist(sub[0], &(sub[1]), 0, &domainlist_anchor, NULL,
2551       MCL_DOMAIN + MCL_NOEXPAND, TRUE, NULL);
2552     goto MATCHED_SOMETHING;
2553
2554     case ECOND_MATCH_IP:       /* Match IP address in a host list */
2555     if (sub[0][0] != 0 && string_is_ip_address(sub[0], NULL) == 0)
2556       {
2557       expand_string_message = string_sprintf("\"%s\" is not an IP address",
2558         sub[0]);
2559       return NULL;
2560       }
2561     else
2562       {
2563       unsigned int *nullcache = NULL;
2564       check_host_block cb;
2565
2566       cb.host_name = US"";
2567       cb.host_address = sub[0];
2568
2569       /* If the host address starts off ::ffff: it is an IPv6 address in
2570       IPv4-compatible mode. Find the IPv4 part for checking against IPv4
2571       addresses. */
2572
2573       cb.host_ipv4 = (Ustrncmp(cb.host_address, "::ffff:", 7) == 0)?
2574         cb.host_address + 7 : cb.host_address;
2575
2576       rc = match_check_list(
2577              &sub[1],                   /* the list */
2578              0,                         /* separator character */
2579              &hostlist_anchor,          /* anchor pointer */
2580              &nullcache,                /* cache pointer */
2581              check_host,                /* function for testing */
2582              &cb,                       /* argument for function */
2583              MCL_HOST,                  /* type of check */
2584              sub[0],                    /* text for debugging */
2585              NULL);                     /* where to pass back data */
2586       }
2587     goto MATCHED_SOMETHING;
2588
2589     case ECOND_MATCH_LOCAL_PART:
2590     rc = match_isinlist(sub[0], &(sub[1]), 0, &localpartlist_anchor, NULL,
2591       MCL_LOCALPART + MCL_NOEXPAND, TRUE, NULL);
2592     /* Fall through */
2593     /* VVVVVVVVVVVV */
2594     MATCHED_SOMETHING:
2595     switch(rc)
2596       {
2597       case OK:
2598       tempcond = TRUE;
2599       break;
2600
2601       case FAIL:
2602       tempcond = FALSE;
2603       break;
2604
2605       case DEFER:
2606       expand_string_message = string_sprintf("unable to complete match "
2607         "against \"%s\": %s", sub[1], search_error_message);
2608       return NULL;
2609       }
2610
2611     break;
2612
2613     /* Various "encrypted" comparisons. If the second string starts with
2614     "{" then an encryption type is given. Default to crypt() or crypt16()
2615     (build-time choice). */
2616     /* }-for-text-editors */
2617
2618     case ECOND_CRYPTEQ:
2619     #ifndef SUPPORT_CRYPTEQ
2620     goto COND_FAILED_NOT_COMPILED;
2621     #else
2622     if (strncmpic(sub[1], US"{md5}", 5) == 0)
2623       {
2624       int sublen = Ustrlen(sub[1]+5);
2625       md5 base;
2626       uschar digest[16];
2627
2628       md5_start(&base);
2629       md5_end(&base, (uschar *)sub[0], Ustrlen(sub[0]), digest);
2630
2631       /* If the length that we are comparing against is 24, the MD5 digest
2632       is expressed as a base64 string. This is the way LDAP does it. However,
2633       some other software uses a straightforward hex representation. We assume
2634       this if the length is 32. Other lengths fail. */
2635
2636       if (sublen == 24)
2637         {
2638         uschar *coded = auth_b64encode((uschar *)digest, 16);
2639         DEBUG(D_auth) debug_printf("crypteq: using MD5+B64 hashing\n"
2640           "  subject=%s\n  crypted=%s\n", coded, sub[1]+5);
2641         tempcond = (Ustrcmp(coded, sub[1]+5) == 0);
2642         }
2643       else if (sublen == 32)
2644         {
2645         int i;
2646         uschar coded[36];
2647         for (i = 0; i < 16; i++) sprintf(CS (coded+2*i), "%02X", digest[i]);
2648         coded[32] = 0;
2649         DEBUG(D_auth) debug_printf("crypteq: using MD5+hex hashing\n"
2650           "  subject=%s\n  crypted=%s\n", coded, sub[1]+5);
2651         tempcond = (strcmpic(coded, sub[1]+5) == 0);
2652         }
2653       else
2654         {
2655         DEBUG(D_auth) debug_printf("crypteq: length for MD5 not 24 or 32: "
2656           "fail\n  crypted=%s\n", sub[1]+5);
2657         tempcond = FALSE;
2658         }
2659       }
2660
2661     else if (strncmpic(sub[1], US"{sha1}", 6) == 0)
2662       {
2663       int sublen = Ustrlen(sub[1]+6);
2664       sha1 base;
2665       uschar digest[20];
2666
2667       sha1_start(&base);
2668       sha1_end(&base, (uschar *)sub[0], Ustrlen(sub[0]), digest);
2669
2670       /* If the length that we are comparing against is 28, assume the SHA1
2671       digest is expressed as a base64 string. If the length is 40, assume a
2672       straightforward hex representation. Other lengths fail. */
2673
2674       if (sublen == 28)
2675         {
2676         uschar *coded = auth_b64encode((uschar *)digest, 20);
2677         DEBUG(D_auth) debug_printf("crypteq: using SHA1+B64 hashing\n"
2678           "  subject=%s\n  crypted=%s\n", coded, sub[1]+6);
2679         tempcond = (Ustrcmp(coded, sub[1]+6) == 0);
2680         }
2681       else if (sublen == 40)
2682         {
2683         int i;
2684         uschar coded[44];
2685         for (i = 0; i < 20; i++) sprintf(CS (coded+2*i), "%02X", digest[i]);
2686         coded[40] = 0;
2687         DEBUG(D_auth) debug_printf("crypteq: using SHA1+hex hashing\n"
2688           "  subject=%s\n  crypted=%s\n", coded, sub[1]+6);
2689         tempcond = (strcmpic(coded, sub[1]+6) == 0);
2690         }
2691       else
2692         {
2693         DEBUG(D_auth) debug_printf("crypteq: length for SHA-1 not 28 or 40: "
2694           "fail\n  crypted=%s\n", sub[1]+6);
2695         tempcond = FALSE;
2696         }
2697       }
2698
2699     else   /* {crypt} or {crypt16} and non-{ at start */
2700            /* }-for-text-editors */
2701       {
2702       int which = 0;
2703       uschar *coded;
2704
2705       if (strncmpic(sub[1], US"{crypt}", 7) == 0)
2706         {
2707         sub[1] += 7;
2708         which = 1;
2709         }
2710       else if (strncmpic(sub[1], US"{crypt16}", 9) == 0)
2711         {
2712         sub[1] += 9;
2713         which = 2;
2714         }
2715       else if (sub[1][0] == '{')                /* }-for-text-editors */
2716         {
2717         expand_string_message = string_sprintf("unknown encryption mechanism "
2718           "in \"%s\"", sub[1]);
2719         return NULL;
2720         }
2721
2722       switch(which)
2723         {
2724         case 0:  coded = US DEFAULT_CRYPT(CS sub[0], CS sub[1]); break;
2725         case 1:  coded = US crypt(CS sub[0], CS sub[1]); break;
2726         default: coded = US crypt16(CS sub[0], CS sub[1]); break;
2727         }
2728
2729       #define STR(s) # s
2730       #define XSTR(s) STR(s)
2731       DEBUG(D_auth) debug_printf("crypteq: using %s()\n"
2732         "  subject=%s\n  crypted=%s\n",
2733         (which == 0)? XSTR(DEFAULT_CRYPT) : (which == 1)? "crypt" : "crypt16",
2734         coded, sub[1]);
2735       #undef STR
2736       #undef XSTR
2737
2738       /* If the encrypted string contains fewer than two characters (for the
2739       salt), force failure. Otherwise we get false positives: with an empty
2740       string the yield of crypt() is an empty string! */
2741
2742       tempcond = (Ustrlen(sub[1]) < 2)? FALSE :
2743         (Ustrcmp(coded, sub[1]) == 0);
2744       }
2745     break;
2746     #endif  /* SUPPORT_CRYPTEQ */
2747
2748     case ECOND_INLIST:
2749     case ECOND_INLISTI:
2750       {
2751       int sep = 0;
2752       uschar *save_iterate_item = iterate_item;
2753       int (*compare)(const uschar *, const uschar *);
2754
2755       DEBUG(D_expand) debug_printf("condition: %s\n", name);
2756
2757       tempcond = FALSE;
2758       if (cond_type == ECOND_INLISTI)
2759         compare = strcmpic;
2760       else
2761         compare = (int (*)(const uschar *, const uschar *)) strcmp;
2762
2763       while ((iterate_item = string_nextinlist(&sub[1], &sep, NULL, 0)) != NULL)
2764         if (compare(sub[0], iterate_item) == 0)
2765           {
2766           tempcond = TRUE;
2767           break;
2768           }
2769       iterate_item = save_iterate_item;
2770       }
2771
2772     }   /* Switch for comparison conditions */
2773
2774   *yield = tempcond == testfor;
2775   return s;    /* End of comparison conditions */
2776
2777
2778   /* and/or: computes logical and/or of several conditions */
2779
2780   case ECOND_AND:
2781   case ECOND_OR:
2782   subcondptr = (yield == NULL)? NULL : &tempcond;
2783   combined_cond = (cond_type == ECOND_AND);
2784
2785   while (isspace(*s)) s++;
2786   if (*s++ != '{') goto COND_FAILED_CURLY_START;        /* }-for-text-editors */
2787
2788   for (;;)
2789     {
2790     while (isspace(*s)) s++;
2791     /* {-for-text-editors */
2792     if (*s == '}') break;
2793     if (*s != '{')                                      /* }-for-text-editors */
2794       {
2795       expand_string_message = string_sprintf("each subcondition "
2796         "inside an \"%s{...}\" condition must be in its own {}", name);
2797       return NULL;
2798       }
2799
2800     if (!(s = eval_condition(s+1, resetok, subcondptr)))
2801       {
2802       expand_string_message = string_sprintf("%s inside \"%s{...}\" condition",
2803         expand_string_message, name);
2804       return NULL;
2805       }
2806     while (isspace(*s)) s++;
2807
2808     /* {-for-text-editors */
2809     if (*s++ != '}')
2810       {
2811       /* {-for-text-editors */
2812       expand_string_message = string_sprintf("missing } at end of condition "
2813         "inside \"%s\" group", name);
2814       return NULL;
2815       }
2816
2817     if (yield != NULL)
2818       {
2819       if (cond_type == ECOND_AND)
2820         {
2821         combined_cond &= tempcond;
2822         if (!combined_cond) subcondptr = NULL;  /* once false, don't */
2823         }                                       /* evaluate any more */
2824       else
2825         {
2826         combined_cond |= tempcond;
2827         if (combined_cond) subcondptr = NULL;   /* once true, don't */
2828         }                                       /* evaluate any more */
2829       }
2830     }
2831
2832   if (yield != NULL) *yield = (combined_cond == testfor);
2833   return ++s;
2834
2835
2836   /* forall/forany: iterates a condition with different values */
2837
2838   case ECOND_FORALL:
2839   case ECOND_FORANY:
2840     {
2841     int sep = 0;
2842     uschar *save_iterate_item = iterate_item;
2843
2844     DEBUG(D_expand) debug_printf("condition: %s\n", name);
2845
2846     while (isspace(*s)) s++;
2847     if (*s++ != '{') goto COND_FAILED_CURLY_START;      /* }-for-text-editors */
2848     sub[0] = expand_string_internal(s, TRUE, &s, (yield == NULL), TRUE, resetok);
2849     if (sub[0] == NULL) return NULL;
2850     /* {-for-text-editors */
2851     if (*s++ != '}') goto COND_FAILED_CURLY_END;
2852
2853     while (isspace(*s)) s++;
2854     if (*s++ != '{') goto COND_FAILED_CURLY_START;      /* }-for-text-editors */
2855
2856     sub[1] = s;
2857
2858     /* Call eval_condition once, with result discarded (as if scanning a
2859     "false" part). This allows us to find the end of the condition, because if
2860     the list it empty, we won't actually evaluate the condition for real. */
2861
2862     if (!(s = eval_condition(sub[1], resetok, NULL)))
2863       {
2864       expand_string_message = string_sprintf("%s inside \"%s\" condition",
2865         expand_string_message, name);
2866       return NULL;
2867       }
2868     while (isspace(*s)) s++;
2869
2870     /* {-for-text-editors */
2871     if (*s++ != '}')
2872       {
2873       /* {-for-text-editors */
2874       expand_string_message = string_sprintf("missing } at end of condition "
2875         "inside \"%s\"", name);
2876       return NULL;
2877       }
2878
2879     if (yield != NULL) *yield = !testfor;
2880     while ((iterate_item = string_nextinlist(&sub[0], &sep, NULL, 0)) != NULL)
2881       {
2882       DEBUG(D_expand) debug_printf("%s: $item = \"%s\"\n", name, iterate_item);
2883       if (!eval_condition(sub[1], resetok, &tempcond))
2884         {
2885         expand_string_message = string_sprintf("%s inside \"%s\" condition",
2886           expand_string_message, name);
2887         iterate_item = save_iterate_item;
2888         return NULL;
2889         }
2890       DEBUG(D_expand) debug_printf("%s: condition evaluated to %s\n", name,
2891         tempcond? "true":"false");
2892
2893       if (yield != NULL) *yield = (tempcond == testfor);
2894       if (tempcond == (cond_type == ECOND_FORANY)) break;
2895       }
2896
2897     iterate_item = save_iterate_item;
2898     return s;
2899     }
2900
2901
2902   /* The bool{} expansion condition maps a string to boolean.
2903   The values supported should match those supported by the ACL condition
2904   (acl.c, ACLC_CONDITION) so that we keep to a minimum the different ideas
2905   of true/false.  Note that Router "condition" rules have a different
2906   interpretation, where general data can be used and only a few values
2907   map to FALSE.
2908   Note that readconf.c boolean matching, for boolean configuration options,
2909   only matches true/yes/false/no.
2910   The bool_lax{} condition matches the Router logic, which is much more
2911   liberal. */
2912   case ECOND_BOOL:
2913   case ECOND_BOOL_LAX:
2914     {
2915     uschar *sub_arg[1];
2916     uschar *t, *t2;
2917     uschar *ourname;
2918     size_t len;
2919     BOOL boolvalue = FALSE;
2920     while (isspace(*s)) s++;
2921     if (*s != '{') goto COND_FAILED_CURLY_START;        /* }-for-text-editors */
2922     ourname = cond_type == ECOND_BOOL_LAX ? US"bool_lax" : US"bool";
2923     switch(read_subs(sub_arg, 1, 1, &s, yield == NULL, FALSE, ourname, resetok))
2924       {
2925       case 1: expand_string_message = string_sprintf(
2926                   "too few arguments or bracketing error for %s",
2927                   ourname);
2928       /*FALLTHROUGH*/
2929       case 2:
2930       case 3: return NULL;
2931       }
2932     t = sub_arg[0];
2933     while (isspace(*t)) t++;
2934     len = Ustrlen(t);
2935     if (len)
2936       {
2937       /* trailing whitespace: seems like a good idea to ignore it too */
2938       t2 = t + len - 1;
2939       while (isspace(*t2)) t2--;
2940       if (t2 != (t + len))
2941         {
2942         *++t2 = '\0';
2943         len = t2 - t;
2944         }
2945       }
2946     DEBUG(D_expand)
2947       debug_printf("considering %s: %s\n", ourname, len ? t : US"<empty>");
2948     /* logic for the lax case from expand_check_condition(), which also does
2949     expands, and the logic is both short and stable enough that there should
2950     be no maintenance burden from replicating it. */
2951     if (len == 0)
2952       boolvalue = FALSE;
2953     else if (*t == '-'
2954              ? Ustrspn(t+1, "0123456789") == len-1
2955              : Ustrspn(t,   "0123456789") == len)
2956       {
2957       boolvalue = (Uatoi(t) == 0) ? FALSE : TRUE;
2958       /* expand_check_condition only does a literal string "0" check */
2959       if ((cond_type == ECOND_BOOL_LAX) && (len > 1))
2960         boolvalue = TRUE;
2961       }
2962     else if (strcmpic(t, US"true") == 0 || strcmpic(t, US"yes") == 0)
2963       boolvalue = TRUE;
2964     else if (strcmpic(t, US"false") == 0 || strcmpic(t, US"no") == 0)
2965       boolvalue = FALSE;
2966     else if (cond_type == ECOND_BOOL_LAX)
2967       boolvalue = TRUE;
2968     else
2969       {
2970       expand_string_message = string_sprintf("unrecognised boolean "
2971        "value \"%s\"", t);
2972       return NULL;
2973       }
2974     if (yield != NULL) *yield = (boolvalue == testfor);
2975     return s;
2976     }
2977
2978   /* Unknown condition */
2979
2980   default:
2981   expand_string_message = string_sprintf("unknown condition \"%s\"", name);
2982   return NULL;
2983   }   /* End switch on condition type */
2984
2985 /* Missing braces at start and end of data */
2986
2987 COND_FAILED_CURLY_START:
2988 expand_string_message = string_sprintf("missing { after \"%s\"", name);
2989 return NULL;
2990
2991 COND_FAILED_CURLY_END:
2992 expand_string_message = string_sprintf("missing } at end of \"%s\" condition",
2993   name);
2994 return NULL;
2995
2996 /* A condition requires code that is not compiled */
2997
2998 #if !defined(SUPPORT_PAM) || !defined(RADIUS_CONFIG_FILE) || \
2999     !defined(LOOKUP_LDAP) || !defined(CYRUS_PWCHECK_SOCKET) || \
3000     !defined(SUPPORT_CRYPTEQ) || !defined(CYRUS_SASLAUTHD_SOCKET)
3001 COND_FAILED_NOT_COMPILED:
3002 expand_string_message = string_sprintf("support for \"%s\" not compiled",
3003   name);
3004 return NULL;
3005 #endif
3006 }
3007
3008
3009
3010
3011 /*************************************************
3012 *          Save numerical variables              *
3013 *************************************************/
3014
3015 /* This function is called from items such as "if" that want to preserve and
3016 restore the numbered variables.
3017
3018 Arguments:
3019   save_expand_string    points to an array of pointers to set
3020   save_expand_nlength   points to an array of ints for the lengths
3021
3022 Returns:                the value of expand max to save
3023 */
3024
3025 static int
3026 save_expand_strings(uschar **save_expand_nstring, int *save_expand_nlength)
3027 {
3028 int i;
3029 for (i = 0; i <= expand_nmax; i++)
3030   {
3031   save_expand_nstring[i] = expand_nstring[i];
3032   save_expand_nlength[i] = expand_nlength[i];
3033   }
3034 return expand_nmax;
3035 }
3036
3037
3038
3039 /*************************************************
3040 *           Restore numerical variables          *
3041 *************************************************/
3042
3043 /* This function restored saved values of numerical strings.
3044
3045 Arguments:
3046   save_expand_nmax      the number of strings to restore
3047   save_expand_string    points to an array of pointers
3048   save_expand_nlength   points to an array of ints
3049
3050 Returns:                nothing
3051 */
3052
3053 static void
3054 restore_expand_strings(int save_expand_nmax, uschar **save_expand_nstring,
3055   int *save_expand_nlength)
3056 {
3057 int i;
3058 expand_nmax = save_expand_nmax;
3059 for (i = 0; i <= expand_nmax; i++)
3060   {
3061   expand_nstring[i] = save_expand_nstring[i];
3062   expand_nlength[i] = save_expand_nlength[i];
3063   }
3064 }
3065
3066
3067
3068
3069
3070 /*************************************************
3071 *            Handle yes/no substrings            *
3072 *************************************************/
3073
3074 /* This function is used by ${if}, ${lookup} and ${extract} to handle the
3075 alternative substrings that depend on whether or not the condition was true,
3076 or the lookup or extraction succeeded. The substrings always have to be
3077 expanded, to check their syntax, but "skipping" is set when the result is not
3078 needed - this avoids unnecessary nested lookups.
3079
3080 Arguments:
3081   skipping       TRUE if we were skipping when this item was reached
3082   yes            TRUE if the first string is to be used, else use the second
3083   save_lookup    a value to put back into lookup_value before the 2nd expansion
3084   sptr           points to the input string pointer
3085   yieldptr       points to the output string pointer
3086   sizeptr        points to the output string size
3087   ptrptr         points to the output string pointer
3088   type           "lookup" or "if" or "extract" or "run", for error message
3089   resetok        if not NULL, pointer to flag - write FALSE if unsafe to reset
3090                 the store.
3091
3092 Returns:         0 OK; lookup_value has been reset to save_lookup
3093                  1 expansion failed
3094                  2 expansion failed because of bracketing error
3095 */
3096
3097 static int
3098 process_yesno(BOOL skipping, BOOL yes, uschar *save_lookup, uschar **sptr,
3099   uschar **yieldptr, int *sizeptr, int *ptrptr, uschar *type, BOOL *resetok)
3100 {
3101 int rc = 0;
3102 uschar *s = *sptr;    /* Local value */
3103 uschar *sub1, *sub2;
3104
3105 /* If there are no following strings, we substitute the contents of $value for
3106 lookups and for extractions in the success case. For the ${if item, the string
3107 "true" is substituted. In the fail case, nothing is substituted for all three
3108 items. */
3109
3110 while (isspace(*s)) s++;
3111 if (*s == '}')
3112   {
3113   if (type[0] == 'i')
3114     {
3115     if (yes) *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, US"true", 4);
3116     }
3117   else
3118     {
3119     if (yes && lookup_value != NULL)
3120       *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value,
3121         Ustrlen(lookup_value));
3122     lookup_value = save_lookup;
3123     }
3124   s++;
3125   goto RETURN;
3126   }
3127
3128 /* The first following string must be braced. */
3129
3130 if (*s++ != '{') goto FAILED_CURLY;
3131
3132 /* Expand the first substring. Forced failures are noticed only if we actually
3133 want this string. Set skipping in the call in the fail case (this will always
3134 be the case if we were already skipping). */
3135
3136 sub1 = expand_string_internal(s, TRUE, &s, !yes, TRUE, resetok);
3137 if (sub1 == NULL && (yes || !expand_string_forcedfail)) goto FAILED;
3138 expand_string_forcedfail = FALSE;
3139 if (*s++ != '}') goto FAILED_CURLY;
3140
3141 /* If we want the first string, add it to the output */
3142
3143 if (yes)
3144   *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, sub1, Ustrlen(sub1));
3145
3146 /* If this is called from a lookup or an extract, we want to restore $value to
3147 what it was at the start of the item, so that it has this value during the
3148 second string expansion. For the call from "if" or "run" to this function,
3149 save_lookup is set to lookup_value, so that this statement does nothing. */
3150
3151 lookup_value = save_lookup;
3152
3153 /* There now follows either another substring, or "fail", or nothing. This
3154 time, forced failures are noticed only if we want the second string. We must
3155 set skipping in the nested call if we don't want this string, or if we were
3156 already skipping. */
3157
3158 while (isspace(*s)) s++;
3159 if (*s == '{')
3160   {
3161   sub2 = expand_string_internal(s+1, TRUE, &s, yes || skipping, TRUE, resetok);
3162   if (sub2 == NULL && (!yes || !expand_string_forcedfail)) goto FAILED;
3163   expand_string_forcedfail = FALSE;
3164   if (*s++ != '}') goto FAILED_CURLY;
3165
3166   /* If we want the second string, add it to the output */
3167
3168   if (!yes)
3169     *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, sub2, Ustrlen(sub2));
3170   }
3171
3172 /* If there is no second string, but the word "fail" is present when the use of
3173 the second string is wanted, set a flag indicating it was a forced failure
3174 rather than a syntactic error. Swallow the terminating } in case this is nested
3175 inside another lookup or if or extract. */
3176
3177 else if (*s != '}')
3178   {
3179   uschar name[256];
3180   s = read_name(name, sizeof(name), s, US"_");
3181   if (Ustrcmp(name, "fail") == 0)
3182     {
3183     if (!yes && !skipping)
3184       {
3185       while (isspace(*s)) s++;
3186       if (*s++ != '}') goto FAILED_CURLY;
3187       expand_string_message =
3188         string_sprintf("\"%s\" failed and \"fail\" requested", type);
3189       expand_string_forcedfail = TRUE;
3190       goto FAILED;
3191       }
3192     }
3193   else
3194     {
3195     expand_string_message =
3196       string_sprintf("syntax error in \"%s\" item - \"fail\" expected", type);
3197     goto FAILED;
3198     }
3199   }
3200
3201 /* All we have to do now is to check on the final closing brace. */
3202
3203 while (isspace(*s)) s++;
3204 if (*s++ == '}') goto RETURN;
3205
3206 /* Get here if there is a bracketing failure */
3207
3208 FAILED_CURLY:
3209 rc++;
3210
3211 /* Get here for other failures */
3212
3213 FAILED:
3214 rc++;
3215
3216 /* Update the input pointer value before returning */
3217
3218 RETURN:
3219 *sptr = s;
3220 return rc;
3221 }
3222
3223
3224
3225
3226 /*************************************************
3227 *    Handle MD5 or SHA-1 computation for HMAC    *
3228 *************************************************/
3229
3230 /* These are some wrapping functions that enable the HMAC code to be a bit
3231 cleaner. A good compiler will spot the tail recursion.
3232
3233 Arguments:
3234   type         HMAC_MD5 or HMAC_SHA1
3235   remaining    are as for the cryptographic hash functions
3236
3237 Returns:       nothing
3238 */
3239
3240 static void
3241 chash_start(int type, void *base)
3242 {
3243 if (type == HMAC_MD5)
3244   md5_start((md5 *)base);
3245 else
3246   sha1_start((sha1 *)base);
3247 }
3248
3249 static void
3250 chash_mid(int type, void *base, uschar *string)
3251 {
3252 if (type == HMAC_MD5)
3253   md5_mid((md5 *)base, string);
3254 else
3255   sha1_mid((sha1 *)base, string);
3256 }
3257
3258 static void
3259 chash_end(int type, void *base, uschar *string, int length, uschar *digest)
3260 {
3261 if (type == HMAC_MD5)
3262   md5_end((md5 *)base, string, length, digest);
3263 else
3264   sha1_end((sha1 *)base, string, length, digest);
3265 }
3266
3267
3268
3269
3270
3271 /********************************************************
3272 * prvs: Get last three digits of days since Jan 1, 1970 *
3273 ********************************************************/
3274
3275 /* This is needed to implement the "prvs" BATV reverse
3276    path signing scheme
3277
3278 Argument: integer "days" offset to add or substract to
3279           or from the current number of days.
3280
3281 Returns:  pointer to string containing the last three
3282           digits of the number of days since Jan 1, 1970,
3283           modified by the offset argument, NULL if there
3284           was an error in the conversion.
3285
3286 */
3287
3288 static uschar *
3289 prvs_daystamp(int day_offset)
3290 {
3291 uschar *days = store_get(32);                /* Need at least 24 for cases */
3292 (void)string_format(days, 32, TIME_T_FMT,    /* where TIME_T_FMT is %lld */
3293   (time(NULL) + day_offset*86400)/86400);
3294 return (Ustrlen(days) >= 3) ? &days[Ustrlen(days)-3] : US"100";
3295 }
3296
3297
3298
3299 /********************************************************
3300 *   prvs: perform HMAC-SHA1 computation of prvs bits    *
3301 ********************************************************/
3302
3303 /* This is needed to implement the "prvs" BATV reverse
3304    path signing scheme
3305
3306 Arguments:
3307   address RFC2821 Address to use
3308       key The key to use (must be less than 64 characters
3309           in size)
3310   key_num Single-digit key number to use. Defaults to
3311           '0' when NULL.
3312
3313 Returns:  pointer to string containing the first three
3314           bytes of the final hash in hex format, NULL if
3315           there was an error in the process.
3316 */
3317
3318 static uschar *
3319 prvs_hmac_sha1(uschar *address, uschar *key, uschar *key_num, uschar *daystamp)
3320 {
3321 uschar *hash_source, *p;
3322 int size = 0,offset = 0,i;
3323 sha1 sha1_base;
3324 void *use_base = &sha1_base;
3325 uschar innerhash[20];
3326 uschar finalhash[20];
3327 uschar innerkey[64];
3328 uschar outerkey[64];
3329 uschar *finalhash_hex = store_get(40);
3330
3331 if (key_num == NULL)
3332   key_num = US"0";
3333
3334 if (Ustrlen(key) > 64)
3335   return NULL;
3336
3337 hash_source = string_cat(NULL,&size,&offset,key_num,1);
3338 string_cat(hash_source,&size,&offset,daystamp,3);
3339 string_cat(hash_source,&size,&offset,address,Ustrlen(address));
3340 hash_source[offset] = '\0';
3341
3342 DEBUG(D_expand) debug_printf("prvs: hash source is '%s'\n", hash_source);
3343
3344 memset(innerkey, 0x36, 64);
3345 memset(outerkey, 0x5c, 64);
3346
3347 for (i = 0; i < Ustrlen(key); i++)
3348   {
3349   innerkey[i] ^= key[i];
3350   outerkey[i] ^= key[i];
3351   }
3352
3353 chash_start(HMAC_SHA1, use_base);
3354 chash_mid(HMAC_SHA1, use_base, innerkey);
3355 chash_end(HMAC_SHA1, use_base, hash_source, offset, innerhash);
3356
3357 chash_start(HMAC_SHA1, use_base);
3358 chash_mid(HMAC_SHA1, use_base, outerkey);
3359 chash_end(HMAC_SHA1, use_base, innerhash, 20, finalhash);
3360
3361 p = finalhash_hex;
3362 for (i = 0; i < 3; i++)
3363   {
3364   *p++ = hex_digits[(finalhash[i] & 0xf0) >> 4];
3365   *p++ = hex_digits[finalhash[i] & 0x0f];
3366   }
3367 *p = '\0';
3368
3369 return finalhash_hex;
3370 }
3371
3372
3373
3374
3375 /*************************************************
3376 *        Join a file onto the output string      *
3377 *************************************************/
3378
3379 /* This is used for readfile and after a run expansion. It joins the contents
3380 of a file onto the output string, globally replacing newlines with a given
3381 string (optionally). The file is closed at the end.
3382
3383 Arguments:
3384   f            the FILE
3385   yield        pointer to the expandable string
3386   sizep        pointer to the current size
3387   ptrp         pointer to the current position
3388   eol          newline replacement string, or NULL
3389
3390 Returns:       new value of string pointer
3391 */
3392
3393 static uschar *
3394 cat_file(FILE *f, uschar *yield, int *sizep, int *ptrp, uschar *eol)
3395 {
3396 int eollen;
3397 uschar buffer[1024];
3398
3399 eollen = (eol == NULL)? 0 : Ustrlen(eol);
3400
3401 while (Ufgets(buffer, sizeof(buffer), f) != NULL)
3402   {
3403   int len = Ustrlen(buffer);
3404   if (eol != NULL && buffer[len-1] == '\n') len--;
3405   yield = string_cat(yield, sizep, ptrp, buffer, len);
3406   if (buffer[len] != 0)
3407     yield = string_cat(yield, sizep, ptrp, eol, eollen);
3408   }
3409
3410 if (yield != NULL) yield[*ptrp] = 0;
3411
3412 return yield;
3413 }
3414
3415
3416
3417
3418 /*************************************************
3419 *          Evaluate numeric expression           *
3420 *************************************************/
3421
3422 /* This is a set of mutually recursive functions that evaluate an arithmetic
3423 expression involving + - * / % & | ^ ~ << >> and parentheses. The only one of
3424 these functions that is called from elsewhere is eval_expr, whose interface is:
3425
3426 Arguments:
3427   sptr        pointer to the pointer to the string - gets updated
3428   decimal     TRUE if numbers are to be assumed decimal
3429   error       pointer to where to put an error message - must be NULL on input
3430   endket      TRUE if ')' must terminate - FALSE for external call
3431
3432 Returns:      on success: the value of the expression, with *error still NULL
3433               on failure: an undefined value, with *error = a message
3434 */
3435
3436 static int_eximarith_t eval_op_or(uschar **, BOOL, uschar **);
3437
3438
3439 static int_eximarith_t
3440 eval_expr(uschar **sptr, BOOL decimal, uschar **error, BOOL endket)
3441 {
3442 uschar *s = *sptr;
3443 int_eximarith_t x = eval_op_or(&s, decimal, error);
3444 if (*error == NULL)
3445   {
3446   if (endket)
3447     {
3448     if (*s != ')')
3449       *error = US"expecting closing parenthesis";
3450     else
3451       while (isspace(*(++s)));
3452     }
3453   else if (*s != 0) *error = US"expecting operator";
3454   }
3455 *sptr = s;
3456 return x;
3457 }
3458
3459
3460 static int_eximarith_t
3461 eval_number(uschar **sptr, BOOL decimal, uschar **error)
3462 {
3463 register int c;
3464 int_eximarith_t n;
3465 uschar *s = *sptr;
3466 while (isspace(*s)) s++;
3467 c = *s;
3468 if (isdigit(c))
3469   {
3470   int count;
3471   (void)sscanf(CS s, (decimal? SC_EXIM_DEC "%n" : SC_EXIM_ARITH "%n"), &n, &count);
3472   s += count;
3473   switch (tolower(*s))
3474     {
3475     default: break;
3476     case 'k': n *= 1024; s++; break;
3477     case 'm': n *= 1024*1024; s++; break;
3478     case 'g': n *= 1024*1024*1024; s++; break;
3479     }
3480   while (isspace (*s)) s++;
3481   }
3482 else if (c == '(')
3483   {
3484   s++;
3485   n = eval_expr(&s, decimal, error, 1);
3486   }
3487 else
3488   {
3489   *error = US"expecting number or opening parenthesis";
3490   n = 0;
3491   }
3492 *sptr = s;
3493 return n;
3494 }
3495
3496
3497 static int_eximarith_t
3498 eval_op_unary(uschar **sptr, BOOL decimal, uschar **error)
3499 {
3500 uschar *s = *sptr;
3501 int_eximarith_t x;
3502 while (isspace(*s)) s++;
3503 if (*s == '+' || *s == '-' || *s == '~')
3504   {
3505   int op = *s++;
3506   x = eval_op_unary(&s, decimal, error);
3507   if (op == '-') x = -x;
3508     else if (op == '~') x = ~x;
3509   }
3510 else
3511   {
3512   x = eval_number(&s, decimal, error);
3513   }
3514 *sptr = s;
3515 return x;
3516 }
3517
3518
3519 static int_eximarith_t
3520 eval_op_mult(uschar **sptr, BOOL decimal, uschar **error)
3521 {
3522 uschar *s = *sptr;
3523 int_eximarith_t x = eval_op_unary(&s, decimal, error);
3524 if (*error == NULL)
3525   {
3526   while (*s == '*' || *s == '/' || *s == '%')
3527     {
3528     int op = *s++;
3529     int_eximarith_t y = eval_op_unary(&s, decimal, error);
3530     if (*error != NULL) break;
3531     /* SIGFPE both on div/mod by zero and on INT_MIN / -1, which would give
3532      * a value of INT_MAX+1. Note that INT_MIN * -1 gives INT_MIN for me, which
3533      * is a bug somewhere in [gcc 4.2.1, FreeBSD, amd64].  In fact, -N*-M where
3534      * -N*M is INT_MIN will yielf INT_MIN.
3535      * Since we don't support floating point, this is somewhat simpler.
3536      * Ideally, we'd return an error, but since we overflow for all other
3537      * arithmetic, consistency suggests otherwise, but what's the correct value
3538      * to use?  There is none.
3539      * The C standard guarantees overflow for unsigned arithmetic but signed
3540      * overflow invokes undefined behaviour; in practice, this is overflow
3541      * except for converting INT_MIN to INT_MAX+1.  We also can't guarantee
3542      * that long/longlong larger than int are available, or we could just work
3543      * with larger types.  We should consider whether to guarantee 32bit eval
3544      * and 64-bit working variables, with errors returned.  For now ...
3545      * So, the only SIGFPEs occur with a non-shrinking div/mod, thus -1; we
3546      * can just let the other invalid results occur otherwise, as they have
3547      * until now.  For this one case, we can coerce.
3548      */
3549     if (y == -1 && x == EXIM_ARITH_MIN && op != '*')
3550       {
3551       DEBUG(D_expand)
3552         debug_printf("Integer exception dodging: " PR_EXIM_ARITH "%c-1 coerced to " PR_EXIM_ARITH "\n",
3553             EXIM_ARITH_MIN, op, EXIM_ARITH_MAX);
3554       x = EXIM_ARITH_MAX;
3555       continue;
3556       }
3557     if (op == '*')
3558       x *= y;
3559     else
3560       {
3561       if (y == 0)
3562         {
3563         *error = (op == '/') ? US"divide by zero" : US"modulo by zero";
3564         x = 0;
3565         break;
3566         }
3567       if (op == '/')
3568         x /= y;
3569       else
3570         x %= y;
3571       }
3572     }
3573   }
3574 *sptr = s;
3575 return x;
3576 }
3577
3578
3579 static int_eximarith_t
3580 eval_op_sum(uschar **sptr, BOOL decimal, uschar **error)
3581 {
3582 uschar *s = *sptr;
3583 int_eximarith_t x = eval_op_mult(&s, decimal, error);
3584 if (*error == NULL)
3585   {
3586   while (*s == '+' || *s == '-')
3587     {
3588     int op = *s++;
3589     int_eximarith_t y = eval_op_mult(&s, decimal, error);
3590     if (*error != NULL) break;
3591     if (op == '+') x += y; else x -= y;
3592     }
3593   }
3594 *sptr = s;
3595 return x;
3596 }
3597
3598
3599 static int_eximarith_t
3600 eval_op_shift(uschar **sptr, BOOL decimal, uschar **error)
3601 {
3602 uschar *s = *sptr;
3603 int_eximarith_t x = eval_op_sum(&s, decimal, error);
3604 if (*error == NULL)
3605   {
3606   while ((*s == '<' || *s == '>') && s[1] == s[0])
3607     {
3608     int_eximarith_t y;
3609     int op = *s++;
3610     s++;
3611     y = eval_op_sum(&s, decimal, error);
3612     if (*error != NULL) break;
3613     if (op == '<') x <<= y; else x >>= y;
3614     }
3615   }
3616 *sptr = s;
3617 return x;
3618 }
3619
3620
3621 static int_eximarith_t
3622 eval_op_and(uschar **sptr, BOOL decimal, uschar **error)
3623 {
3624 uschar *s = *sptr;
3625 int_eximarith_t x = eval_op_shift(&s, decimal, error);
3626 if (*error == NULL)
3627   {
3628   while (*s == '&')
3629     {
3630     int_eximarith_t y;
3631     s++;
3632     y = eval_op_shift(&s, decimal, error);
3633     if (*error != NULL) break;
3634     x &= y;
3635     }
3636   }
3637 *sptr = s;
3638 return x;
3639 }
3640
3641
3642 static int_eximarith_t
3643 eval_op_xor(uschar **sptr, BOOL decimal, uschar **error)
3644 {
3645 uschar *s = *sptr;
3646 int_eximarith_t x = eval_op_and(&s, decimal, error);
3647 if (*error == NULL)
3648   {
3649   while (*s == '^')
3650     {
3651     int_eximarith_t y;
3652     s++;
3653     y = eval_op_and(&s, decimal, error);
3654     if (*error != NULL) break;
3655     x ^= y;
3656     }
3657   }
3658 *sptr = s;
3659 return x;
3660 }
3661
3662
3663 static int_eximarith_t
3664 eval_op_or(uschar **sptr, BOOL decimal, uschar **error)
3665 {
3666 uschar *s = *sptr;
3667 int_eximarith_t x = eval_op_xor(&s, decimal, error);
3668 if (*error == NULL)
3669   {
3670   while (*s == '|')
3671     {
3672     int_eximarith_t y;
3673     s++;
3674     y = eval_op_xor(&s, decimal, error);
3675     if (*error != NULL) break;
3676     x |= y;
3677     }
3678   }
3679 *sptr = s;
3680 return x;
3681 }
3682
3683
3684
3685 /*************************************************
3686 *                 Expand string                  *
3687 *************************************************/
3688
3689 /* Returns either an unchanged string, or the expanded string in stacking pool
3690 store. Interpreted sequences are:
3691
3692    \...                    normal escaping rules
3693    $name                   substitutes the variable
3694    ${name}                 ditto
3695    ${op:string}            operates on the expanded string value
3696    ${item{arg1}{arg2}...}  expands the args and then does the business
3697                              some literal args are not enclosed in {}
3698
3699 There are now far too many operators and item types to make it worth listing
3700 them here in detail any more.
3701
3702 We use an internal routine recursively to handle embedded substrings. The
3703 external function follows. The yield is NULL if the expansion failed, and there
3704 are two cases: if something collapsed syntactically, or if "fail" was given
3705 as the action on a lookup failure. These can be distinguised by looking at the
3706 variable expand_string_forcedfail, which is TRUE in the latter case.
3707
3708 The skipping flag is set true when expanding a substring that isn't actually
3709 going to be used (after "if" or "lookup") and it prevents lookups from
3710 happening lower down.
3711
3712 Store usage: At start, a store block of the length of the input plus 64
3713 is obtained. This is expanded as necessary by string_cat(), which might have to
3714 get a new block, or might be able to expand the original. At the end of the
3715 function we can release any store above that portion of the yield block that
3716 was actually used. In many cases this will be optimal.
3717
3718 However: if the first item in the expansion is a variable name or header name,
3719 we reset the store before processing it; if the result is in fresh store, we
3720 use that without copying. This is helpful for expanding strings like
3721 $message_headers which can get very long.
3722
3723 There's a problem if a ${dlfunc item has side-effects that cause allocation,
3724 since resetting the store at the end of the expansion will free store that was
3725 allocated by the plugin code as well as the slop after the expanded string. So
3726 we skip any resets if ${dlfunc } has been used. The same applies for ${acl }
3727 and, given the acl condition, ${if }. This is an unfortunate consequence of
3728 string expansion becoming too powerful.
3729
3730 Arguments:
3731   string         the string to be expanded
3732   ket_ends       true if expansion is to stop at }
3733   left           if not NULL, a pointer to the first character after the
3734                  expansion is placed here (typically used with ket_ends)
3735   skipping       TRUE for recursive calls when the value isn't actually going
3736                  to be used (to allow for optimisation)
3737   honour_dollar  TRUE if $ is to be expanded,
3738                  FALSE if it's just another character
3739   resetok_p      if not NULL, pointer to flag - write FALSE if unsafe to reset
3740                  the store.
3741
3742 Returns:         NULL if expansion fails:
3743                    expand_string_forcedfail is set TRUE if failure was forced
3744                    expand_string_message contains a textual error message
3745                  a pointer to the expanded string on success
3746 */
3747
3748 static uschar *
3749 expand_string_internal(uschar *string, BOOL ket_ends, uschar **left,
3750   BOOL skipping, BOOL honour_dollar, BOOL *resetok_p)
3751 {
3752 int ptr = 0;
3753 int size = Ustrlen(string)+ 64;
3754 int item_type;
3755 uschar *yield = store_get(size);
3756 uschar *s = string;
3757 uschar *save_expand_nstring[EXPAND_MAXN+1];
3758 int save_expand_nlength[EXPAND_MAXN+1];
3759 BOOL resetok = TRUE;
3760
3761 expand_string_forcedfail = FALSE;
3762 expand_string_message = US"";
3763
3764 while (*s != 0)
3765   {
3766   uschar *value;
3767   uschar name[256];
3768
3769   /* \ escapes the next character, which must exist, or else
3770   the expansion fails. There's a special escape, \N, which causes
3771   copying of the subject verbatim up to the next \N. Otherwise,
3772   the escapes are the standard set. */
3773
3774   if (*s == '\\')
3775     {
3776     if (s[1] == 0)
3777       {
3778       expand_string_message = US"\\ at end of string";
3779       goto EXPAND_FAILED;
3780       }
3781
3782     if (s[1] == 'N')
3783       {
3784       uschar *t = s + 2;
3785       for (s = t; *s != 0; s++) if (*s == '\\' && s[1] == 'N') break;
3786       yield = string_cat(yield, &size, &ptr, t, s - t);
3787       if (*s != 0) s += 2;
3788       }
3789
3790     else
3791       {
3792       uschar ch[1];
3793       ch[0] = string_interpret_escape(&s);
3794       s++;
3795       yield = string_cat(yield, &size, &ptr, ch, 1);
3796       }
3797
3798     continue;
3799     }
3800
3801   /*{*/
3802   /* Anything other than $ is just copied verbatim, unless we are
3803   looking for a terminating } character. */
3804
3805   /*{*/
3806   if (ket_ends && *s == '}') break;
3807
3808   if (*s != '$' || !honour_dollar)
3809     {
3810     yield = string_cat(yield, &size, &ptr, s++, 1);
3811     continue;
3812     }
3813
3814   /* No { after the $ - must be a plain name or a number for string
3815   match variable. There has to be a fudge for variables that are the
3816   names of header fields preceded by "$header_" because header field
3817   names can contain any printing characters except space and colon.
3818   For those that don't like typing this much, "$h_" is a synonym for
3819   "$header_". A non-existent header yields a NULL value; nothing is
3820   inserted. */  /*}*/
3821
3822   if (isalpha((*(++s))))
3823     {
3824     int len;
3825     int newsize = 0;
3826
3827     s = read_name(name, sizeof(name), s, US"_");
3828
3829     /* If this is the first thing to be expanded, release the pre-allocated
3830     buffer. */
3831
3832     if (ptr == 0 && yield != NULL)
3833       {
3834       if (resetok) store_reset(yield);
3835       yield = NULL;
3836       size = 0;
3837       }
3838
3839     /* Header */
3840
3841     if (Ustrncmp(name, "h_", 2) == 0 ||
3842         Ustrncmp(name, "rh_", 3) == 0 ||
3843         Ustrncmp(name, "bh_", 3) == 0 ||
3844         Ustrncmp(name, "header_", 7) == 0 ||
3845         Ustrncmp(name, "rheader_", 8) == 0 ||
3846         Ustrncmp(name, "bheader_", 8) == 0)
3847       {
3848       BOOL want_raw = (name[0] == 'r')? TRUE : FALSE;
3849       uschar *charset = (name[0] == 'b')? NULL : headers_charset;
3850       s = read_header_name(name, sizeof(name), s);
3851       value = find_header(name, FALSE, &newsize, want_raw, charset);
3852
3853       /* If we didn't find the header, and the header contains a closing brace
3854       character, this may be a user error where the terminating colon
3855       has been omitted. Set a flag to adjust the error message in this case.
3856       But there is no error here - nothing gets inserted. */
3857
3858       if (value == NULL)
3859         {
3860         if (Ustrchr(name, '}') != NULL) malformed_header = TRUE;
3861         continue;
3862         }
3863       }
3864
3865     /* Variable */
3866
3867     else
3868       {
3869       value = find_variable(name, FALSE, skipping, &newsize);
3870       if (value == NULL)
3871         {
3872         expand_string_message =
3873           string_sprintf("unknown variable name \"%s\"", name);
3874           check_variable_error_message(name);
3875         goto EXPAND_FAILED;
3876         }
3877       }
3878
3879     /* If the data is known to be in a new buffer, newsize will be set to the
3880     size of that buffer. If this is the first thing in an expansion string,
3881     yield will be NULL; just point it at the new store instead of copying. Many
3882     expansion strings contain just one reference, so this is a useful
3883     optimization, especially for humungous headers. */
3884
3885     len = Ustrlen(value);
3886     if (yield == NULL && newsize != 0)
3887       {
3888       yield = value;
3889       size = newsize;
3890       ptr = len;
3891       }
3892     else yield = string_cat(yield, &size, &ptr, value, len);
3893
3894     continue;
3895     }
3896
3897   if (isdigit(*s))
3898     {
3899     int n;
3900     s = read_number(&n, s);
3901     if (n >= 0 && n <= expand_nmax)
3902       yield = string_cat(yield, &size, &ptr, expand_nstring[n],
3903         expand_nlength[n]);
3904     continue;
3905     }
3906
3907   /* Otherwise, if there's no '{' after $ it's an error. */             /*}*/
3908
3909   if (*s != '{')                                                        /*}*/
3910     {
3911     expand_string_message = US"$ not followed by letter, digit, or {";  /*}*/
3912     goto EXPAND_FAILED;
3913     }
3914
3915   /* After { there can be various things, but they all start with
3916   an initial word, except for a number for a string match variable. */
3917
3918   if (isdigit((*(++s))))
3919     {
3920     int n;
3921     s = read_number(&n, s);             /*{*/
3922     if (*s++ != '}')
3923       {                                 /*{*/
3924       expand_string_message = US"} expected after number";
3925       goto EXPAND_FAILED;
3926       }
3927     if (n >= 0 && n <= expand_nmax)
3928       yield = string_cat(yield, &size, &ptr, expand_nstring[n],
3929         expand_nlength[n]);
3930     continue;
3931     }
3932
3933   if (!isalpha(*s))
3934     {
3935     expand_string_message = US"letter or digit expected after ${";      /*}*/
3936     goto EXPAND_FAILED;
3937     }
3938
3939   /* Allow "-" in names to cater for substrings with negative
3940   arguments. Since we are checking for known names after { this is
3941   OK. */
3942
3943   s = read_name(name, sizeof(name), s, US"_-");
3944   item_type = chop_match(name, item_table, sizeof(item_table)/sizeof(uschar *));
3945
3946   switch(item_type)
3947     {
3948     /* Call an ACL from an expansion.  We feed data in via $acl_arg1 - $acl_arg9.
3949     If the ACL returns accept or reject we return content set by "message ="
3950     There is currently no limit on recursion; this would have us call
3951     acl_check_internal() directly and get a current level from somewhere.
3952     See also the acl expansion condition ECOND_ACL and the traditional
3953     acl modifier ACLC_ACL.
3954     Assume that the function has side-effects on the store that must be preserved.
3955     */
3956
3957     case EITEM_ACL:
3958       /* ${acl {name} {arg1}{arg2}...} */
3959       {
3960       uschar *sub[10];  /* name + arg1-arg9 (which must match number of acl_arg[]) */
3961       uschar *user_msg;
3962
3963       switch(read_subs(sub, 10, 1, &s, skipping, TRUE, US"acl", &resetok))
3964         {
3965         case 1: goto EXPAND_FAILED_CURLY;
3966         case 2:
3967         case 3: goto EXPAND_FAILED;
3968         }
3969       if (skipping) continue;
3970
3971       resetok = FALSE;
3972       switch(eval_acl(sub, sizeof(sub)/sizeof(*sub), &user_msg))
3973         {
3974         case OK:
3975         case FAIL:
3976           DEBUG(D_expand)
3977             debug_printf("acl expansion yield: %s\n", user_msg);
3978           if (user_msg)
3979             yield = string_cat(yield, &size, &ptr, user_msg, Ustrlen(user_msg));
3980           continue;
3981
3982         case DEFER:
3983           expand_string_forcedfail = TRUE;
3984         default:
3985           expand_string_message = string_sprintf("error from acl \"%s\"", sub[0]);
3986           goto EXPAND_FAILED;
3987         }
3988       }
3989
3990     /* Handle conditionals - preserve the values of the numerical expansion
3991     variables in case they get changed by a regular expression match in the
3992     condition. If not, they retain their external settings. At the end
3993     of this "if" section, they get restored to their previous values. */
3994
3995     case EITEM_IF:
3996       {
3997       BOOL cond = FALSE;
3998       uschar *next_s;
3999       int save_expand_nmax =
4000         save_expand_strings(save_expand_nstring, save_expand_nlength);
4001
4002       while (isspace(*s)) s++;
4003       next_s = eval_condition(s, &resetok, skipping? NULL : &cond);
4004       if (next_s == NULL) goto EXPAND_FAILED;  /* message already set */
4005
4006       DEBUG(D_expand)
4007         debug_printf("condition: %.*s\n   result: %s\n", (int)(next_s - s), s,
4008           cond? "true" : "false");
4009
4010       s = next_s;
4011
4012       /* The handling of "yes" and "no" result strings is now in a separate
4013       function that is also used by ${lookup} and ${extract} and ${run}. */
4014
4015       switch(process_yesno(
4016                skipping,                     /* were previously skipping */
4017                cond,                         /* success/failure indicator */
4018                lookup_value,                 /* value to reset for string2 */
4019                &s,                           /* input pointer */
4020                &yield,                       /* output pointer */
4021                &size,                        /* output size */
4022                &ptr,                         /* output current point */
4023                US"if",                       /* condition type */
4024                &resetok))
4025         {
4026         case 1: goto EXPAND_FAILED;          /* when all is well, the */
4027         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
4028         }
4029
4030       /* Restore external setting of expansion variables for continuation
4031       at this level. */
4032
4033       restore_expand_strings(save_expand_nmax, save_expand_nstring,
4034         save_expand_nlength);
4035       continue;
4036       }
4037
4038     /* Handle database lookups unless locked out. If "skipping" is TRUE, we are
4039     expanding an internal string that isn't actually going to be used. All we
4040     need to do is check the syntax, so don't do a lookup at all. Preserve the
4041     values of the numerical expansion variables in case they get changed by a
4042     partial lookup. If not, they retain their external settings. At the end
4043     of this "lookup" section, they get restored to their previous values. */
4044
4045     case EITEM_LOOKUP:
4046       {
4047       int stype, partial, affixlen, starflags;
4048       int expand_setup = 0;
4049       int nameptr = 0;
4050       uschar *key, *filename, *affix;
4051       uschar *save_lookup_value = lookup_value;
4052       int save_expand_nmax =
4053         save_expand_strings(save_expand_nstring, save_expand_nlength);
4054
4055       if ((expand_forbid & RDO_LOOKUP) != 0)
4056         {
4057         expand_string_message = US"lookup expansions are not permitted";
4058         goto EXPAND_FAILED;
4059         }
4060
4061       /* Get the key we are to look up for single-key+file style lookups.
4062       Otherwise set the key NULL pro-tem. */
4063
4064       while (isspace(*s)) s++;
4065       if (*s == '{')                                    /*}*/
4066         {
4067         key = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
4068         if (key == NULL) goto EXPAND_FAILED;            /*{*/
4069         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4070         while (isspace(*s)) s++;
4071         }
4072       else key = NULL;
4073
4074       /* Find out the type of database */
4075
4076       if (!isalpha(*s))
4077         {
4078         expand_string_message = US"missing lookup type";
4079         goto EXPAND_FAILED;
4080         }
4081
4082       /* The type is a string that may contain special characters of various
4083       kinds. Allow everything except space or { to appear; the actual content
4084       is checked by search_findtype_partial. */         /*}*/
4085
4086       while (*s != 0 && *s != '{' && !isspace(*s))      /*}*/
4087         {
4088         if (nameptr < sizeof(name) - 1) name[nameptr++] = *s;
4089         s++;
4090         }
4091       name[nameptr] = 0;
4092       while (isspace(*s)) s++;
4093
4094       /* Now check for the individual search type and any partial or default
4095       options. Only those types that are actually in the binary are valid. */
4096
4097       stype = search_findtype_partial(name, &partial, &affix, &affixlen,
4098         &starflags);
4099       if (stype < 0)
4100         {
4101         expand_string_message = search_error_message;
4102         goto EXPAND_FAILED;
4103         }
4104
4105       /* Check that a key was provided for those lookup types that need it,
4106       and was not supplied for those that use the query style. */
4107
4108       if (!mac_islookup(stype, lookup_querystyle|lookup_absfilequery))
4109         {
4110         if (key == NULL)
4111           {
4112           expand_string_message = string_sprintf("missing {key} for single-"
4113             "key \"%s\" lookup", name);
4114           goto EXPAND_FAILED;
4115           }
4116         }
4117       else
4118         {
4119         if (key != NULL)
4120           {
4121           expand_string_message = string_sprintf("a single key was given for "
4122             "lookup type \"%s\", which is not a single-key lookup type", name);
4123           goto EXPAND_FAILED;
4124           }
4125         }
4126
4127       /* Get the next string in brackets and expand it. It is the file name for
4128       single-key+file lookups, and the whole query otherwise. In the case of
4129       queries that also require a file name (e.g. sqlite), the file name comes
4130       first. */
4131
4132       if (*s != '{') goto EXPAND_FAILED_CURLY;
4133       filename = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
4134       if (filename == NULL) goto EXPAND_FAILED;
4135       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4136       while (isspace(*s)) s++;
4137
4138       /* If this isn't a single-key+file lookup, re-arrange the variables
4139       to be appropriate for the search_ functions. For query-style lookups,
4140       there is just a "key", and no file name. For the special query-style +
4141       file types, the query (i.e. "key") starts with a file name. */
4142
4143       if (key == NULL)
4144         {
4145         while (isspace(*filename)) filename++;
4146         key = filename;
4147
4148         if (mac_islookup(stype, lookup_querystyle))
4149           {
4150           filename = NULL;
4151           }
4152         else
4153           {
4154           if (*filename != '/')
4155             {
4156             expand_string_message = string_sprintf(
4157               "absolute file name expected for \"%s\" lookup", name);
4158             goto EXPAND_FAILED;
4159             }
4160           while (*key != 0 && !isspace(*key)) key++;
4161           if (*key != 0) *key++ = 0;
4162           }
4163         }
4164
4165       /* If skipping, don't do the next bit - just lookup_value == NULL, as if
4166       the entry was not found. Note that there is no search_close() function.
4167       Files are left open in case of re-use. At suitable places in higher logic,
4168       search_tidyup() is called to tidy all open files. This can save opening
4169       the same file several times. However, files may also get closed when
4170       others are opened, if too many are open at once. The rule is that a
4171       handle should not be used after a second search_open().
4172
4173       Request that a partial search sets up $1 and maybe $2 by passing
4174       expand_setup containing zero. If its value changes, reset expand_nmax,
4175       since new variables will have been set. Note that at the end of this
4176       "lookup" section, the old numeric variables are restored. */
4177
4178       if (skipping)
4179         lookup_value = NULL;
4180       else
4181         {
4182         void *handle = search_open(filename, stype, 0, NULL, NULL);
4183         if (handle == NULL)
4184           {
4185           expand_string_message = search_error_message;
4186           goto EXPAND_FAILED;
4187           }
4188         lookup_value = search_find(handle, filename, key, partial, affix,
4189           affixlen, starflags, &expand_setup);
4190         if (search_find_defer)
4191           {
4192           expand_string_message =
4193             string_sprintf("lookup of \"%s\" gave DEFER: %s",
4194               string_printing2(key, FALSE), search_error_message);
4195           goto EXPAND_FAILED;
4196           }
4197         if (expand_setup > 0) expand_nmax = expand_setup;
4198         }
4199
4200       /* The handling of "yes" and "no" result strings is now in a separate
4201       function that is also used by ${if} and ${extract}. */
4202
4203       switch(process_yesno(
4204                skipping,                     /* were previously skipping */
4205                lookup_value != NULL,         /* success/failure indicator */
4206                save_lookup_value,            /* value to reset for string2 */
4207                &s,                           /* input pointer */
4208                &yield,                       /* output pointer */
4209                &size,                        /* output size */
4210                &ptr,                         /* output current point */
4211                US"lookup",                   /* condition type */
4212                &resetok))
4213         {
4214         case 1: goto EXPAND_FAILED;          /* when all is well, the */
4215         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
4216         }
4217
4218       /* Restore external setting of expansion variables for carrying on
4219       at this level, and continue. */
4220
4221       restore_expand_strings(save_expand_nmax, save_expand_nstring,
4222         save_expand_nlength);
4223       continue;
4224       }
4225
4226     /* If Perl support is configured, handle calling embedded perl subroutines,
4227     unless locked out at this time. Syntax is ${perl{sub}} or ${perl{sub}{arg}}
4228     or ${perl{sub}{arg1}{arg2}} or up to a maximum of EXIM_PERL_MAX_ARGS
4229     arguments (defined below). */
4230
4231     #define EXIM_PERL_MAX_ARGS 8
4232
4233     case EITEM_PERL:
4234     #ifndef EXIM_PERL
4235     expand_string_message = US"\"${perl\" encountered, but this facility "      /*}*/
4236       "is not included in this binary";
4237     goto EXPAND_FAILED;
4238
4239     #else   /* EXIM_PERL */
4240       {
4241       uschar *sub_arg[EXIM_PERL_MAX_ARGS + 2];
4242       uschar *new_yield;
4243
4244       if ((expand_forbid & RDO_PERL) != 0)
4245         {
4246         expand_string_message = US"Perl calls are not permitted";
4247         goto EXPAND_FAILED;
4248         }
4249
4250       switch(read_subs(sub_arg, EXIM_PERL_MAX_ARGS + 1, 1, &s, skipping, TRUE,
4251            US"perl", &resetok))
4252         {
4253         case 1: goto EXPAND_FAILED_CURLY;
4254         case 2:
4255         case 3: goto EXPAND_FAILED;
4256         }
4257
4258       /* If skipping, we don't actually do anything */
4259
4260       if (skipping) continue;
4261
4262       /* Start the interpreter if necessary */
4263
4264       if (!opt_perl_started)
4265         {
4266         uschar *initerror;
4267         if (opt_perl_startup == NULL)
4268           {
4269           expand_string_message = US"A setting of perl_startup is needed when "
4270             "using the Perl interpreter";
4271           goto EXPAND_FAILED;
4272           }
4273         DEBUG(D_any) debug_printf("Starting Perl interpreter\n");
4274         initerror = init_perl(opt_perl_startup);
4275         if (initerror != NULL)
4276           {
4277           expand_string_message =
4278             string_sprintf("error in perl_startup code: %s\n", initerror);
4279           goto EXPAND_FAILED;
4280           }
4281         opt_perl_started = TRUE;
4282         }
4283
4284       /* Call the function */
4285
4286       sub_arg[EXIM_PERL_MAX_ARGS + 1] = NULL;
4287       new_yield = call_perl_cat(yield, &size, &ptr, &expand_string_message,
4288         sub_arg[0], sub_arg + 1);
4289
4290       /* NULL yield indicates failure; if the message pointer has been set to
4291       NULL, the yield was undef, indicating a forced failure. Otherwise the
4292       message will indicate some kind of Perl error. */
4293
4294       if (new_yield == NULL)
4295         {
4296         if (expand_string_message == NULL)
4297           {
4298           expand_string_message =
4299             string_sprintf("Perl subroutine \"%s\" returned undef to force "
4300               "failure", sub_arg[0]);
4301           expand_string_forcedfail = TRUE;
4302           }
4303         goto EXPAND_FAILED;
4304         }
4305
4306       /* Yield succeeded. Ensure forcedfail is unset, just in case it got
4307       set during a callback from Perl. */
4308
4309       expand_string_forcedfail = FALSE;
4310       yield = new_yield;
4311       continue;
4312       }
4313     #endif /* EXIM_PERL */
4314
4315     /* Transform email address to "prvs" scheme to use
4316        as BATV-signed return path */
4317
4318     case EITEM_PRVS:
4319       {
4320       uschar *sub_arg[3];
4321       uschar *p,*domain;
4322
4323       switch(read_subs(sub_arg, 3, 2, &s, skipping, TRUE, US"prvs", &resetok))
4324         {
4325         case 1: goto EXPAND_FAILED_CURLY;
4326         case 2:
4327         case 3: goto EXPAND_FAILED;
4328         }
4329
4330       /* If skipping, we don't actually do anything */
4331       if (skipping) continue;
4332
4333       /* sub_arg[0] is the address */
4334       domain = Ustrrchr(sub_arg[0],'@');
4335       if ( (domain == NULL) || (domain == sub_arg[0]) || (Ustrlen(domain) == 1) )
4336         {
4337         expand_string_message = US"prvs first argument must be a qualified email address";
4338         goto EXPAND_FAILED;
4339         }
4340
4341       /* Calculate the hash. The second argument must be a single-digit
4342       key number, or unset. */
4343
4344       if (sub_arg[2] != NULL &&
4345           (!isdigit(sub_arg[2][0]) || sub_arg[2][1] != 0))
4346         {
4347         expand_string_message = US"prvs second argument must be a single digit";
4348         goto EXPAND_FAILED;
4349         }
4350
4351       p = prvs_hmac_sha1(sub_arg[0],sub_arg[1],sub_arg[2],prvs_daystamp(7));
4352       if (p == NULL)
4353         {
4354         expand_string_message = US"prvs hmac-sha1 conversion failed";
4355         goto EXPAND_FAILED;
4356         }
4357
4358       /* Now separate the domain from the local part */
4359       *domain++ = '\0';
4360
4361       yield = string_cat(yield,&size,&ptr,US"prvs=",5);
4362       string_cat(yield,&size,&ptr,(sub_arg[2] != NULL) ? sub_arg[2] : US"0", 1);
4363       string_cat(yield,&size,&ptr,prvs_daystamp(7),3);
4364       string_cat(yield,&size,&ptr,p,6);
4365       string_cat(yield,&size,&ptr,US"=",1);
4366       string_cat(yield,&size,&ptr,sub_arg[0],Ustrlen(sub_arg[0]));
4367       string_cat(yield,&size,&ptr,US"@",1);
4368       string_cat(yield,&size,&ptr,domain,Ustrlen(domain));
4369
4370       continue;
4371       }
4372
4373     /* Check a prvs-encoded address for validity */
4374
4375     case EITEM_PRVSCHECK:
4376       {
4377       uschar *sub_arg[3];
4378       int mysize = 0, myptr = 0;
4379       const pcre *re;
4380       uschar *p;
4381
4382       /* TF: Ugliness: We want to expand parameter 1 first, then set
4383          up expansion variables that are used in the expansion of
4384          parameter 2. So we clone the string for the first
4385          expansion, where we only expand parameter 1.
4386
4387          PH: Actually, that isn't necessary. The read_subs() function is
4388          designed to work this way for the ${if and ${lookup expansions. I've
4389          tidied the code.
4390       */
4391
4392       /* Reset expansion variables */
4393       prvscheck_result = NULL;
4394       prvscheck_address = NULL;
4395       prvscheck_keynum = NULL;
4396
4397       switch(read_subs(sub_arg, 1, 1, &s, skipping, FALSE, US"prvs", &resetok))
4398         {
4399         case 1: goto EXPAND_FAILED_CURLY;
4400         case 2:
4401         case 3: goto EXPAND_FAILED;
4402         }
4403
4404       re = regex_must_compile(US"^prvs\\=([0-9])([0-9]{3})([A-F0-9]{6})\\=(.+)\\@(.+)$",
4405                               TRUE,FALSE);
4406
4407       if (regex_match_and_setup(re,sub_arg[0],0,-1))
4408         {
4409         uschar *local_part = string_copyn(expand_nstring[4],expand_nlength[4]);
4410         uschar *key_num = string_copyn(expand_nstring[1],expand_nlength[1]);
4411         uschar *daystamp = string_copyn(expand_nstring[2],expand_nlength[2]);
4412         uschar *hash = string_copyn(expand_nstring[3],expand_nlength[3]);
4413         uschar *domain = string_copyn(expand_nstring[5],expand_nlength[5]);
4414
4415         DEBUG(D_expand) debug_printf("prvscheck localpart: %s\n", local_part);
4416         DEBUG(D_expand) debug_printf("prvscheck key number: %s\n", key_num);
4417         DEBUG(D_expand) debug_printf("prvscheck daystamp: %s\n", daystamp);
4418         DEBUG(D_expand) debug_printf("prvscheck hash: %s\n", hash);
4419         DEBUG(D_expand) debug_printf("prvscheck domain: %s\n", domain);
4420
4421         /* Set up expansion variables */
4422         prvscheck_address = string_cat(NULL, &mysize, &myptr, local_part, Ustrlen(local_part));
4423         string_cat(prvscheck_address,&mysize,&myptr,US"@",1);
4424         string_cat(prvscheck_address,&mysize,&myptr,domain,Ustrlen(domain));
4425         prvscheck_address[myptr] = '\0';
4426         prvscheck_keynum = string_copy(key_num);
4427
4428         /* Now expand the second argument */
4429         switch(read_subs(sub_arg, 1, 1, &s, skipping, FALSE, US"prvs", &resetok))
4430           {
4431           case 1: goto EXPAND_FAILED_CURLY;
4432           case 2:
4433           case 3: goto EXPAND_FAILED;
4434           }
4435
4436         /* Now we have the key and can check the address. */
4437
4438         p = prvs_hmac_sha1(prvscheck_address, sub_arg[0], prvscheck_keynum,
4439           daystamp);
4440
4441         if (p == NULL)
4442           {
4443           expand_string_message = US"hmac-sha1 conversion failed";
4444           goto EXPAND_FAILED;
4445           }
4446
4447         DEBUG(D_expand) debug_printf("prvscheck: received hash is %s\n", hash);
4448         DEBUG(D_expand) debug_printf("prvscheck:      own hash is %s\n", p);
4449
4450         if (Ustrcmp(p,hash) == 0)
4451           {
4452           /* Success, valid BATV address. Now check the expiry date. */
4453           uschar *now = prvs_daystamp(0);
4454           unsigned int inow = 0,iexpire = 1;
4455
4456           (void)sscanf(CS now,"%u",&inow);
4457           (void)sscanf(CS daystamp,"%u",&iexpire);
4458
4459           /* When "iexpire" is < 7, a "flip" has occured.
4460              Adjust "inow" accordingly. */
4461           if ( (iexpire < 7) && (inow >= 993) ) inow = 0;
4462
4463           if (iexpire >= inow)
4464             {
4465             prvscheck_result = US"1";
4466             DEBUG(D_expand) debug_printf("prvscheck: success, $pvrs_result set to 1\n");
4467             }
4468             else
4469             {
4470             prvscheck_result = NULL;
4471             DEBUG(D_expand) debug_printf("prvscheck: signature expired, $pvrs_result unset\n");
4472             }
4473           }
4474         else
4475           {
4476           prvscheck_result = NULL;
4477           DEBUG(D_expand) debug_printf("prvscheck: hash failure, $pvrs_result unset\n");
4478           }
4479
4480         /* Now expand the final argument. We leave this till now so that
4481         it can include $prvscheck_result. */
4482
4483         switch(read_subs(sub_arg, 1, 0, &s, skipping, TRUE, US"prvs", &resetok))
4484           {
4485           case 1: goto EXPAND_FAILED_CURLY;
4486           case 2:
4487           case 3: goto EXPAND_FAILED;
4488           }
4489
4490         if (sub_arg[0] == NULL || *sub_arg[0] == '\0')
4491           yield = string_cat(yield,&size,&ptr,prvscheck_address,Ustrlen(prvscheck_address));
4492         else
4493           yield = string_cat(yield,&size,&ptr,sub_arg[0],Ustrlen(sub_arg[0]));
4494
4495         /* Reset the "internal" variables afterwards, because they are in
4496         dynamic store that will be reclaimed if the expansion succeeded. */
4497
4498         prvscheck_address = NULL;
4499         prvscheck_keynum = NULL;
4500         }
4501       else
4502         {
4503         /* Does not look like a prvs encoded address, return the empty string.
4504            We need to make sure all subs are expanded first, so as to skip over
4505            the entire item. */
4506
4507         switch(read_subs(sub_arg, 2, 1, &s, skipping, TRUE, US"prvs", &resetok))
4508           {
4509           case 1: goto EXPAND_FAILED_CURLY;
4510           case 2:
4511           case 3: goto EXPAND_FAILED;
4512           }
4513         }
4514
4515       continue;
4516       }
4517
4518     /* Handle "readfile" to insert an entire file */
4519
4520     case EITEM_READFILE:
4521       {
4522       FILE *f;
4523       uschar *sub_arg[2];
4524
4525       if ((expand_forbid & RDO_READFILE) != 0)
4526         {
4527         expand_string_message = US"file insertions are not permitted";
4528         goto EXPAND_FAILED;
4529         }
4530
4531       switch(read_subs(sub_arg, 2, 1, &s, skipping, TRUE, US"readfile", &resetok))
4532         {
4533         case 1: goto EXPAND_FAILED_CURLY;
4534         case 2:
4535         case 3: goto EXPAND_FAILED;
4536         }
4537
4538       /* If skipping, we don't actually do anything */
4539
4540       if (skipping) continue;
4541
4542       /* Open the file and read it */
4543
4544       f = Ufopen(sub_arg[0], "rb");
4545       if (f == NULL)
4546         {
4547         expand_string_message = string_open_failed(errno, "%s", sub_arg[0]);
4548         goto EXPAND_FAILED;
4549         }
4550
4551       yield = cat_file(f, yield, &size, &ptr, sub_arg[1]);
4552       (void)fclose(f);
4553       continue;
4554       }
4555
4556     /* Handle "readsocket" to insert data from a Unix domain socket */
4557
4558     case EITEM_READSOCK:
4559       {
4560       int fd;
4561       int timeout = 5;
4562       int save_ptr = ptr;
4563       FILE *f;
4564       struct sockaddr_un sockun;         /* don't call this "sun" ! */
4565       uschar *arg;
4566       uschar *sub_arg[4];
4567
4568       if ((expand_forbid & RDO_READSOCK) != 0)
4569         {
4570         expand_string_message = US"socket insertions are not permitted";
4571         goto EXPAND_FAILED;
4572         }
4573
4574       /* Read up to 4 arguments, but don't do the end of item check afterwards,
4575       because there may be a string for expansion on failure. */
4576
4577       switch(read_subs(sub_arg, 4, 2, &s, skipping, FALSE, US"readsocket", &resetok))
4578         {
4579         case 1: goto EXPAND_FAILED_CURLY;
4580         case 2:                             /* Won't occur: no end check */
4581         case 3: goto EXPAND_FAILED;
4582         }
4583
4584       /* Sort out timeout, if given */
4585
4586       if (sub_arg[2] != NULL)
4587         {
4588         timeout = readconf_readtime(sub_arg[2], 0, FALSE);
4589         if (timeout < 0)
4590           {
4591           expand_string_message = string_sprintf("bad time value %s",
4592             sub_arg[2]);
4593           goto EXPAND_FAILED;
4594           }
4595         }
4596       else sub_arg[3] = NULL;                     /* No eol if no timeout */
4597
4598       /* If skipping, we don't actually do anything. Otherwise, arrange to
4599       connect to either an IP or a Unix socket. */
4600
4601       if (!skipping)
4602         {
4603         /* Handle an IP (internet) domain */
4604
4605         if (Ustrncmp(sub_arg[0], "inet:", 5) == 0)
4606           {
4607           int port;
4608           uschar *server_name = sub_arg[0] + 5;
4609           uschar *port_name = Ustrrchr(server_name, ':');
4610
4611           /* Sort out the port */
4612
4613           if (port_name == NULL)
4614             {
4615             expand_string_message =
4616               string_sprintf("missing port for readsocket %s", sub_arg[0]);
4617             goto EXPAND_FAILED;
4618             }
4619           *port_name++ = 0;           /* Terminate server name */
4620
4621           if (isdigit(*port_name))
4622             {
4623             uschar *end;
4624             port = Ustrtol(port_name, &end, 0);
4625             if (end != port_name + Ustrlen(port_name))
4626               {
4627               expand_string_message =
4628                 string_sprintf("invalid port number %s", port_name);
4629               goto EXPAND_FAILED;
4630               }
4631             }
4632           else
4633             {
4634             struct servent *service_info = getservbyname(CS port_name, "tcp");
4635             if (service_info == NULL)
4636               {
4637               expand_string_message = string_sprintf("unknown port \"%s\"",
4638                 port_name);
4639               goto EXPAND_FAILED;
4640               }
4641             port = ntohs(service_info->s_port);
4642             }
4643
4644           if ((fd = ip_connectedsocket(SOCK_STREAM, server_name, port, port,
4645                   timeout, NULL, &expand_string_message)) < 0)
4646               goto SOCK_FAIL;
4647           }
4648
4649         /* Handle a Unix domain socket */
4650
4651         else
4652           {
4653           int rc;
4654           if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
4655             {
4656             expand_string_message = string_sprintf("failed to create socket: %s",
4657               strerror(errno));
4658             goto SOCK_FAIL;
4659             }
4660
4661           sockun.sun_family = AF_UNIX;
4662           sprintf(sockun.sun_path, "%.*s", (int)(sizeof(sockun.sun_path)-1),
4663             sub_arg[0]);
4664
4665           sigalrm_seen = FALSE;
4666           alarm(timeout);
4667           rc = connect(fd, (struct sockaddr *)(&sockun), sizeof(sockun));
4668           alarm(0);
4669           if (sigalrm_seen)
4670             {
4671             expand_string_message = US "socket connect timed out";
4672             goto SOCK_FAIL;
4673             }
4674           if (rc < 0)
4675             {
4676             expand_string_message = string_sprintf("failed to connect to socket "
4677               "%s: %s", sub_arg[0], strerror(errno));
4678             goto SOCK_FAIL;
4679             }
4680           }
4681
4682         DEBUG(D_expand) debug_printf("connected to socket %s\n", sub_arg[0]);
4683
4684         /* Allow sequencing of test actions */
4685         if (running_in_test_harness) millisleep(100);
4686
4687         /* Write the request string, if not empty */
4688
4689         if (sub_arg[1][0] != 0)
4690           {
4691           int len = Ustrlen(sub_arg[1]);
4692           DEBUG(D_expand) debug_printf("writing \"%s\" to socket\n",
4693             sub_arg[1]);
4694           if (write(fd, sub_arg[1], len) != len)
4695             {
4696             expand_string_message = string_sprintf("request write to socket "
4697               "failed: %s", strerror(errno));
4698             goto SOCK_FAIL;
4699             }
4700           }
4701
4702         /* Shut down the sending side of the socket. This helps some servers to
4703         recognise that it is their turn to do some work. Just in case some
4704         system doesn't have this function, make it conditional. */
4705
4706         #ifdef SHUT_WR
4707         shutdown(fd, SHUT_WR);
4708         #endif
4709
4710         if (running_in_test_harness) millisleep(100);
4711
4712         /* Now we need to read from the socket, under a timeout. The function
4713         that reads a file can be used. */
4714
4715         f = fdopen(fd, "rb");
4716         sigalrm_seen = FALSE;
4717         alarm(timeout);
4718         yield = cat_file(f, yield, &size, &ptr, sub_arg[3]);
4719         alarm(0);
4720         (void)fclose(f);
4721
4722         /* After a timeout, we restore the pointer in the result, that is,
4723         make sure we add nothing from the socket. */
4724
4725         if (sigalrm_seen)
4726           {
4727           ptr = save_ptr;
4728           expand_string_message = US "socket read timed out";
4729           goto SOCK_FAIL;
4730           }
4731         }
4732
4733       /* The whole thing has worked (or we were skipping). If there is a
4734       failure string following, we need to skip it. */
4735
4736       if (*s == '{')
4737         {
4738         if (expand_string_internal(s+1, TRUE, &s, TRUE, TRUE, &resetok) == NULL)
4739           goto EXPAND_FAILED;
4740         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4741         while (isspace(*s)) s++;
4742         }
4743       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4744       continue;
4745
4746       /* Come here on failure to create socket, connect socket, write to the
4747       socket, or timeout on reading. If another substring follows, expand and
4748       use it. Otherwise, those conditions give expand errors. */
4749
4750       SOCK_FAIL:
4751       if (*s != '{') goto EXPAND_FAILED;
4752       DEBUG(D_any) debug_printf("%s\n", expand_string_message);
4753       arg = expand_string_internal(s+1, TRUE, &s, FALSE, TRUE, &resetok);
4754       if (arg == NULL) goto EXPAND_FAILED;
4755       yield = string_cat(yield, &size, &ptr, arg, Ustrlen(arg));
4756       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4757       while (isspace(*s)) s++;
4758       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4759       continue;
4760       }
4761
4762     /* Handle "run" to execute a program. */
4763
4764     case EITEM_RUN:
4765       {
4766       FILE *f;
4767       uschar *arg;
4768       uschar **argv;
4769       pid_t pid;
4770       int fd_in, fd_out;
4771       int lsize = 0;
4772       int lptr = 0;
4773
4774       if ((expand_forbid & RDO_RUN) != 0)
4775         {
4776         expand_string_message = US"running a command is not permitted";
4777         goto EXPAND_FAILED;
4778         }
4779
4780       while (isspace(*s)) s++;
4781       if (*s != '{') goto EXPAND_FAILED_CURLY;
4782       arg = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
4783       if (arg == NULL) goto EXPAND_FAILED;
4784       while (isspace(*s)) s++;
4785       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
4786
4787       if (skipping)   /* Just pretend it worked when we're skipping */
4788         {
4789         runrc = 0;
4790         }
4791       else
4792         {
4793         if (!transport_set_up_command(&argv,    /* anchor for arg list */
4794             arg,                                /* raw command */
4795             FALSE,                              /* don't expand the arguments */
4796             0,                                  /* not relevant when... */
4797             NULL,                               /* no transporting address */
4798             US"${run} expansion",               /* for error messages */
4799             &expand_string_message))            /* where to put error message */
4800           {
4801           goto EXPAND_FAILED;
4802           }
4803
4804         /* Create the child process, making it a group leader. */
4805
4806         pid = child_open(argv, NULL, 0077, &fd_in, &fd_out, TRUE);
4807
4808         if (pid < 0)
4809           {
4810           expand_string_message =
4811             string_sprintf("couldn't create child process: %s", strerror(errno));
4812           goto EXPAND_FAILED;
4813           }
4814
4815         /* Nothing is written to the standard input. */
4816
4817         (void)close(fd_in);
4818
4819         /* Read the pipe to get the command's output into $value (which is kept
4820         in lookup_value). Read during execution, so that if the output exceeds
4821         the OS pipe buffer limit, we don't block forever. */
4822
4823         f = fdopen(fd_out, "rb");
4824         sigalrm_seen = FALSE;
4825         alarm(60);
4826         lookup_value = cat_file(f, lookup_value, &lsize, &lptr, NULL);
4827         alarm(0);
4828         (void)fclose(f);
4829
4830         /* Wait for the process to finish, applying the timeout, and inspect its
4831         return code for serious disasters. Simple non-zero returns are passed on.
4832         */
4833
4834         if (sigalrm_seen == TRUE || (runrc = child_close(pid, 30)) < 0)
4835           {
4836           if (sigalrm_seen == TRUE || runrc == -256)
4837             {
4838             expand_string_message = string_sprintf("command timed out");
4839             killpg(pid, SIGKILL);       /* Kill the whole process group */
4840             }
4841
4842           else if (runrc == -257)
4843             expand_string_message = string_sprintf("wait() failed: %s",
4844               strerror(errno));
4845
4846           else
4847             expand_string_message = string_sprintf("command killed by signal %d",
4848               -runrc);
4849
4850           goto EXPAND_FAILED;
4851           }
4852         }
4853
4854       /* Process the yes/no strings; $value may be useful in both cases */
4855
4856       switch(process_yesno(
4857                skipping,                     /* were previously skipping */
4858                runrc == 0,                   /* success/failure indicator */
4859                lookup_value,                 /* value to reset for string2 */
4860                &s,                           /* input pointer */
4861                &yield,                       /* output pointer */
4862                &size,                        /* output size */
4863                &ptr,                         /* output current point */
4864                US"run",                      /* condition type */
4865                &resetok))
4866         {
4867         case 1: goto EXPAND_FAILED;          /* when all is well, the */
4868         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
4869         }
4870
4871       continue;
4872       }
4873
4874     /* Handle character translation for "tr" */
4875
4876     case EITEM_TR:
4877       {
4878       int oldptr = ptr;
4879       int o2m;
4880       uschar *sub[3];
4881
4882       switch(read_subs(sub, 3, 3, &s, skipping, TRUE, US"tr", &resetok))
4883         {
4884         case 1: goto EXPAND_FAILED_CURLY;
4885         case 2:
4886         case 3: goto EXPAND_FAILED;
4887         }
4888
4889       yield = string_cat(yield, &size, &ptr, sub[0], Ustrlen(sub[0]));
4890       o2m = Ustrlen(sub[2]) - 1;
4891
4892       if (o2m >= 0) for (; oldptr < ptr; oldptr++)
4893         {
4894         uschar *m = Ustrrchr(sub[1], yield[oldptr]);
4895         if (m != NULL)
4896           {
4897           int o = m - sub[1];
4898           yield[oldptr] = sub[2][(o < o2m)? o : o2m];
4899           }
4900         }
4901
4902       continue;
4903       }
4904
4905     /* Handle "hash", "length", "nhash", and "substr" when they are given with
4906     expanded arguments. */
4907
4908     case EITEM_HASH:
4909     case EITEM_LENGTH:
4910     case EITEM_NHASH:
4911     case EITEM_SUBSTR:
4912       {
4913       int i;
4914       int len;
4915       uschar *ret;
4916       int val[2] = { 0, -1 };
4917       uschar *sub[3];
4918
4919       /* "length" takes only 2 arguments whereas the others take 2 or 3.
4920       Ensure that sub[2] is set in the ${length } case. */
4921
4922       sub[2] = NULL;
4923       switch(read_subs(sub, (item_type == EITEM_LENGTH)? 2:3, 2, &s, skipping,
4924              TRUE, name, &resetok))
4925         {
4926         case 1: goto EXPAND_FAILED_CURLY;
4927         case 2:
4928         case 3: goto EXPAND_FAILED;
4929         }
4930
4931       /* Juggle the arguments if there are only two of them: always move the
4932       string to the last position and make ${length{n}{str}} equivalent to
4933       ${substr{0}{n}{str}}. See the defaults for val[] above. */
4934
4935       if (sub[2] == NULL)
4936         {
4937         sub[2] = sub[1];
4938         sub[1] = NULL;
4939         if (item_type == EITEM_LENGTH)
4940           {
4941           sub[1] = sub[0];
4942           sub[0] = NULL;
4943           }
4944         }
4945
4946       for (i = 0; i < 2; i++)
4947         {
4948         if (sub[i] == NULL) continue;
4949         val[i] = (int)Ustrtol(sub[i], &ret, 10);
4950         if (*ret != 0 || (i != 0 && val[i] < 0))
4951           {
4952           expand_string_message = string_sprintf("\"%s\" is not a%s number "
4953             "(in \"%s\" expansion)", sub[i], (i != 0)? " positive" : "", name);
4954           goto EXPAND_FAILED;
4955           }
4956         }
4957
4958       ret =
4959         (item_type == EITEM_HASH)?
4960           compute_hash(sub[2], val[0], val[1], &len) :
4961         (item_type == EITEM_NHASH)?
4962           compute_nhash(sub[2], val[0], val[1], &len) :
4963           extract_substr(sub[2], val[0], val[1], &len);
4964
4965       if (ret == NULL) goto EXPAND_FAILED;
4966       yield = string_cat(yield, &size, &ptr, ret, len);
4967       continue;
4968       }
4969
4970     /* Handle HMAC computation: ${hmac{<algorithm>}{<secret>}{<text>}}
4971     This code originally contributed by Steve Haslam. It currently supports
4972     the use of MD5 and SHA-1 hashes.
4973
4974     We need some workspace that is large enough to handle all the supported
4975     hash types. Use macros to set the sizes rather than be too elaborate. */
4976
4977     #define MAX_HASHLEN      20
4978     #define MAX_HASHBLOCKLEN 64
4979
4980     case EITEM_HMAC:
4981       {
4982       uschar *sub[3];
4983       md5 md5_base;
4984       sha1 sha1_base;
4985       void *use_base;
4986       int type, i;
4987       int hashlen;      /* Number of octets for the hash algorithm's output */
4988       int hashblocklen; /* Number of octets the hash algorithm processes */
4989       uschar *keyptr, *p;
4990       unsigned int keylen;
4991
4992       uschar keyhash[MAX_HASHLEN];
4993       uschar innerhash[MAX_HASHLEN];
4994       uschar finalhash[MAX_HASHLEN];
4995       uschar finalhash_hex[2*MAX_HASHLEN];
4996       uschar innerkey[MAX_HASHBLOCKLEN];
4997       uschar outerkey[MAX_HASHBLOCKLEN];
4998
4999       switch (read_subs(sub, 3, 3, &s, skipping, TRUE, name, &resetok))
5000         {
5001         case 1: goto EXPAND_FAILED_CURLY;
5002         case 2:
5003         case 3: goto EXPAND_FAILED;
5004         }
5005
5006       if (Ustrcmp(sub[0], "md5") == 0)
5007         {
5008         type = HMAC_MD5;
5009         use_base = &md5_base;
5010         hashlen = 16;
5011         hashblocklen = 64;
5012         }
5013       else if (Ustrcmp(sub[0], "sha1") == 0)
5014         {
5015         type = HMAC_SHA1;
5016         use_base = &sha1_base;
5017         hashlen = 20;
5018         hashblocklen = 64;
5019         }
5020       else
5021         {
5022         expand_string_message =
5023           string_sprintf("hmac algorithm \"%s\" is not recognised", sub[0]);
5024         goto EXPAND_FAILED;
5025         }
5026
5027       keyptr = sub[1];
5028       keylen = Ustrlen(keyptr);
5029
5030       /* If the key is longer than the hash block length, then hash the key
5031       first */
5032
5033       if (keylen > hashblocklen)
5034         {
5035         chash_start(type, use_base);
5036         chash_end(type, use_base, keyptr, keylen, keyhash);
5037         keyptr = keyhash;
5038         keylen = hashlen;
5039         }
5040
5041       /* Now make the inner and outer key values */
5042
5043       memset(innerkey, 0x36, hashblocklen);
5044       memset(outerkey, 0x5c, hashblocklen);
5045
5046       for (i = 0; i < keylen; i++)
5047         {
5048         innerkey[i] ^= keyptr[i];
5049         outerkey[i] ^= keyptr[i];
5050         }
5051
5052       /* Now do the hashes */
5053
5054       chash_start(type, use_base);
5055       chash_mid(type, use_base, innerkey);
5056       chash_end(type, use_base, sub[2], Ustrlen(sub[2]), innerhash);
5057
5058       chash_start(type, use_base);
5059       chash_mid(type, use_base, outerkey);
5060       chash_end(type, use_base, innerhash, hashlen, finalhash);
5061
5062       /* Encode the final hash as a hex string */
5063
5064       p = finalhash_hex;
5065       for (i = 0; i < hashlen; i++)
5066         {
5067         *p++ = hex_digits[(finalhash[i] & 0xf0) >> 4];
5068         *p++ = hex_digits[finalhash[i] & 0x0f];
5069         }
5070
5071       DEBUG(D_any) debug_printf("HMAC[%s](%.*s,%.*s)=%.*s\n", sub[0],
5072         (int)keylen, keyptr, Ustrlen(sub[2]), sub[2], hashlen*2, finalhash_hex);
5073
5074       yield = string_cat(yield, &size, &ptr, finalhash_hex, hashlen*2);
5075       }
5076
5077     continue;
5078
5079     /* Handle global substitution for "sg" - like Perl's s/xxx/yyy/g operator.
5080     We have to save the numerical variables and restore them afterwards. */
5081
5082     case EITEM_SG:
5083       {
5084       const pcre *re;
5085       int moffset, moffsetextra, slen;
5086       int roffset;
5087       int emptyopt;
5088       const uschar *rerror;
5089       uschar *subject;
5090       uschar *sub[3];
5091       int save_expand_nmax =
5092         save_expand_strings(save_expand_nstring, save_expand_nlength);
5093
5094       switch(read_subs(sub, 3, 3, &s, skipping, TRUE, US"sg", &resetok))
5095         {
5096         case 1: goto EXPAND_FAILED_CURLY;
5097         case 2:
5098         case 3: goto EXPAND_FAILED;
5099         }
5100
5101       /* Compile the regular expression */
5102
5103       re = pcre_compile(CS sub[1], PCRE_COPT, (const char **)&rerror, &roffset,
5104         NULL);
5105
5106       if (re == NULL)
5107         {
5108         expand_string_message = string_sprintf("regular expression error in "
5109           "\"%s\": %s at offset %d", sub[1], rerror, roffset);
5110         goto EXPAND_FAILED;
5111         }
5112
5113       /* Now run a loop to do the substitutions as often as necessary. It ends
5114       when there are no more matches. Take care over matches of the null string;
5115       do the same thing as Perl does. */
5116
5117       subject = sub[0];
5118       slen = Ustrlen(sub[0]);
5119       moffset = moffsetextra = 0;
5120       emptyopt = 0;
5121
5122       for (;;)
5123         {
5124         int ovector[3*(EXPAND_MAXN+1)];
5125         int n = pcre_exec(re, NULL, CS subject, slen, moffset + moffsetextra,
5126           PCRE_EOPT | emptyopt, ovector, sizeof(ovector)/sizeof(int));
5127         int nn;
5128         uschar *insert;
5129
5130         /* No match - if we previously set PCRE_NOTEMPTY after a null match, this
5131         is not necessarily the end. We want to repeat the match from one
5132         character further along, but leaving the basic offset the same (for
5133         copying below). We can't be at the end of the string - that was checked
5134         before setting PCRE_NOTEMPTY. If PCRE_NOTEMPTY is not set, we are
5135         finished; copy the remaining string and end the loop. */
5136
5137         if (n < 0)
5138           {
5139           if (emptyopt != 0)
5140             {
5141             moffsetextra = 1;
5142             emptyopt = 0;
5143             continue;
5144             }
5145           yield = string_cat(yield, &size, &ptr, subject+moffset, slen-moffset);
5146           break;
5147           }
5148
5149         /* Match - set up for expanding the replacement. */
5150
5151         if (n == 0) n = EXPAND_MAXN + 1;
5152         expand_nmax = 0;
5153         for (nn = 0; nn < n*2; nn += 2)
5154           {
5155           expand_nstring[expand_nmax] = subject + ovector[nn];
5156           expand_nlength[expand_nmax++] = ovector[nn+1] - ovector[nn];
5157           }
5158         expand_nmax--;
5159
5160         /* Copy the characters before the match, plus the expanded insertion. */
5161
5162         yield = string_cat(yield, &size, &ptr, subject + moffset,
5163           ovector[0] - moffset);
5164         insert = expand_string(sub[2]);
5165         if (insert == NULL) goto EXPAND_FAILED;
5166         yield = string_cat(yield, &size, &ptr, insert, Ustrlen(insert));
5167
5168         moffset = ovector[1];
5169         moffsetextra = 0;
5170         emptyopt = 0;
5171
5172         /* If we have matched an empty string, first check to see if we are at
5173         the end of the subject. If so, the loop is over. Otherwise, mimic
5174         what Perl's /g options does. This turns out to be rather cunning. First
5175         we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match a non-empty
5176         string at the same point. If this fails (picked up above) we advance to
5177         the next character. */
5178
5179         if (ovector[0] == ovector[1])
5180           {
5181           if (ovector[0] == slen) break;
5182           emptyopt = PCRE_NOTEMPTY | PCRE_ANCHORED;
5183           }
5184         }
5185
5186       /* All done - restore numerical variables. */
5187
5188       restore_expand_strings(save_expand_nmax, save_expand_nstring,
5189         save_expand_nlength);
5190       continue;
5191       }
5192
5193     /* Handle keyed and numbered substring extraction. If the first argument
5194     consists entirely of digits, then a numerical extraction is assumed. */
5195
5196     case EITEM_EXTRACT:
5197       {
5198       int i;
5199       int j = 2;
5200       int field_number = 1;
5201       BOOL field_number_set = FALSE;
5202       uschar *save_lookup_value = lookup_value;
5203       uschar *sub[3];
5204       int save_expand_nmax =
5205         save_expand_strings(save_expand_nstring, save_expand_nlength);
5206
5207       /* Read the arguments */
5208
5209       for (i = 0; i < j; i++)
5210         {
5211         while (isspace(*s)) s++;
5212         if (*s == '{')                                          /*}*/
5213           {
5214           sub[i] = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
5215           if (sub[i] == NULL) goto EXPAND_FAILED;               /*{*/
5216           if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5217
5218           /* After removal of leading and trailing white space, the first
5219           argument must not be empty; if it consists entirely of digits
5220           (optionally preceded by a minus sign), this is a numerical
5221           extraction, and we expect 3 arguments. */
5222
5223           if (i == 0)
5224             {
5225             int len;
5226             int x = 0;
5227             uschar *p = sub[0];
5228
5229             while (isspace(*p)) p++;
5230             sub[0] = p;
5231
5232             len = Ustrlen(p);
5233             while (len > 0 && isspace(p[len-1])) len--;
5234             p[len] = 0;
5235
5236             if (!skipping)
5237               {
5238               if (*p == 0)
5239                 {
5240                 expand_string_message = US"first argument of \"extract\" must "
5241                   "not be empty";
5242                 goto EXPAND_FAILED;
5243                 }
5244
5245               if (*p == '-')
5246                 {
5247                 field_number = -1;
5248                 p++;
5249                 }
5250               while (*p != 0 && isdigit(*p)) x = x * 10 + *p++ - '0';
5251               if (*p == 0)
5252                 {
5253                 field_number *= x;
5254                 j = 3;               /* Need 3 args */
5255                 field_number_set = TRUE;
5256                 }
5257               }
5258             }
5259           }
5260         else goto EXPAND_FAILED_CURLY;
5261         }
5262
5263       /* Extract either the numbered or the keyed substring into $value. If
5264       skipping, just pretend the extraction failed. */
5265
5266       lookup_value = skipping? NULL : field_number_set?
5267         expand_gettokened(field_number, sub[1], sub[2]) :
5268         expand_getkeyed(sub[0], sub[1]);
5269
5270       /* If no string follows, $value gets substituted; otherwise there can
5271       be yes/no strings, as for lookup or if. */
5272
5273       switch(process_yesno(
5274                skipping,                     /* were previously skipping */
5275                lookup_value != NULL,         /* success/failure indicator */
5276                save_lookup_value,            /* value to reset for string2 */
5277                &s,                           /* input pointer */
5278                &yield,                       /* output pointer */
5279                &size,                        /* output size */
5280                &ptr,                         /* output current point */
5281                US"extract",                  /* condition type */
5282                &resetok))
5283         {
5284         case 1: goto EXPAND_FAILED;          /* when all is well, the */
5285         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
5286         }
5287
5288       /* All done - restore numerical variables. */
5289
5290       restore_expand_strings(save_expand_nmax, save_expand_nstring,
5291         save_expand_nlength);
5292
5293       continue;
5294       }
5295
5296     /* return the Nth item from a list */
5297
5298     case EITEM_LISTEXTRACT:
5299       {
5300       int i;
5301       int field_number = 1;
5302       uschar *save_lookup_value = lookup_value;
5303       uschar *sub[2];
5304       int save_expand_nmax =
5305         save_expand_strings(save_expand_nstring, save_expand_nlength);
5306
5307       /* Read the field & list arguments */
5308
5309       for (i = 0; i < 2; i++)
5310         {
5311         while (isspace(*s)) s++;
5312         if (*s != '{')                                  /*}*/
5313           goto EXPAND_FAILED_CURLY;
5314
5315         sub[i] = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
5316         if (!sub[i])     goto EXPAND_FAILED;            /*{*/
5317         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5318
5319         /* After removal of leading and trailing white space, the first
5320         argument must be numeric and nonempty. */
5321
5322         if (i == 0)
5323           {
5324           int len;
5325           int x = 0;
5326           uschar *p = sub[0];
5327
5328           while (isspace(*p)) p++;
5329           sub[0] = p;
5330
5331           len = Ustrlen(p);
5332           while (len > 0 && isspace(p[len-1])) len--;
5333           p[len] = 0;
5334
5335           if (!*p && !skipping)
5336             {
5337             expand_string_message = US"first argument of \"listextract\" must "
5338               "not be empty";
5339             goto EXPAND_FAILED;
5340             }
5341
5342           if (*p == '-')
5343             {
5344             field_number = -1;
5345             p++;
5346             }
5347           while (*p && isdigit(*p)) x = x * 10 + *p++ - '0';
5348           if (*p)
5349             {
5350             expand_string_message = US"first argument of \"listextract\" must "
5351               "be numeric";
5352             goto EXPAND_FAILED;
5353             }
5354           field_number *= x;
5355           }
5356         }
5357
5358       /* Extract the numbered element into $value. If
5359       skipping, just pretend the extraction failed. */
5360
5361       lookup_value = skipping? NULL : expand_getlistele(field_number, sub[1]);
5362
5363       /* If no string follows, $value gets substituted; otherwise there can
5364       be yes/no strings, as for lookup or if. */
5365
5366       switch(process_yesno(
5367                skipping,                     /* were previously skipping */
5368                lookup_value != NULL,         /* success/failure indicator */
5369                save_lookup_value,            /* value to reset for string2 */
5370                &s,                           /* input pointer */
5371                &yield,                       /* output pointer */
5372                &size,                        /* output size */
5373                &ptr,                         /* output current point */
5374                US"extract",                  /* condition type */
5375                &resetok))
5376         {
5377         case 1: goto EXPAND_FAILED;          /* when all is well, the */
5378         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
5379         }
5380
5381       /* All done - restore numerical variables. */
5382
5383       restore_expand_strings(save_expand_nmax, save_expand_nstring,
5384         save_expand_nlength);
5385
5386       continue;
5387       }
5388
5389 #ifdef SUPPORT_TLS
5390     case EITEM_CERTEXTRACT:
5391       {
5392       uschar *save_lookup_value = lookup_value;
5393       uschar *sub[2];
5394       int save_expand_nmax =
5395         save_expand_strings(save_expand_nstring, save_expand_nlength);
5396
5397       /* Read the field argument */
5398       while (isspace(*s)) s++;
5399       if (*s != '{')                                    /*}*/
5400         goto EXPAND_FAILED_CURLY;
5401       sub[0] = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
5402       if (!sub[0])     goto EXPAND_FAILED;              /*{*/
5403       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5404       /* strip spaces fore & aft */
5405       {
5406       int len;
5407       uschar *p = sub[0];
5408
5409       while (isspace(*p)) p++;
5410       sub[0] = p;
5411
5412       len = Ustrlen(p);
5413       while (len > 0 && isspace(p[len-1])) len--;
5414       p[len] = 0;
5415       }
5416
5417       /* inspect the cert argument */
5418       while (isspace(*s)) s++;
5419       if (*s != '{')                                    /*}*/
5420         goto EXPAND_FAILED_CURLY;
5421       if (*++s != '$')
5422         {
5423         expand_string_message = US"second argument of \"certextract\" must "
5424           "be a certificate variable";
5425         goto EXPAND_FAILED;
5426         }
5427       sub[1] = expand_string_internal(s+1, TRUE, &s, skipping, FALSE, &resetok);
5428       if (!sub[1])     goto EXPAND_FAILED;              /*{*/
5429       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5430
5431       if (skipping)
5432         lookup_value = NULL;
5433       else
5434         {
5435         lookup_value = expand_getcertele(sub[0], sub[1]);
5436         if (*expand_string_message) goto EXPAND_FAILED;
5437         }
5438       switch(process_yesno(
5439                skipping,                     /* were previously skipping */
5440                lookup_value != NULL,         /* success/failure indicator */
5441                save_lookup_value,            /* value to reset for string2 */
5442                &s,                           /* input pointer */
5443                &yield,                       /* output pointer */
5444                &size,                        /* output size */
5445                &ptr,                         /* output current point */
5446                US"extract",                  /* condition type */
5447                &resetok))
5448         {
5449         case 1: goto EXPAND_FAILED;          /* when all is well, the */
5450         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
5451         }
5452
5453       restore_expand_strings(save_expand_nmax, save_expand_nstring,
5454         save_expand_nlength);
5455       continue;
5456       }
5457 #endif  /*SUPPORT_TLS*/
5458
5459     /* Handle list operations */
5460
5461     case EITEM_FILTER:
5462     case EITEM_MAP:
5463     case EITEM_REDUCE:
5464       {
5465       int sep = 0;
5466       int save_ptr = ptr;
5467       uschar outsep[2] = { '\0', '\0' };
5468       uschar *list, *expr, *temp;
5469       uschar *save_iterate_item = iterate_item;
5470       uschar *save_lookup_value = lookup_value;
5471
5472       while (isspace(*s)) s++;
5473       if (*s++ != '{') goto EXPAND_FAILED_CURLY;
5474
5475       list = expand_string_internal(s, TRUE, &s, skipping, TRUE, &resetok);
5476       if (list == NULL) goto EXPAND_FAILED;
5477       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5478
5479       if (item_type == EITEM_REDUCE)
5480         {
5481         while (isspace(*s)) s++;
5482         if (*s++ != '{') goto EXPAND_FAILED_CURLY;
5483         temp = expand_string_internal(s, TRUE, &s, skipping, TRUE, &resetok);
5484         if (temp == NULL) goto EXPAND_FAILED;
5485         lookup_value = temp;
5486         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
5487         }
5488
5489       while (isspace(*s)) s++;
5490       if (*s++ != '{') goto EXPAND_FAILED_CURLY;
5491
5492       expr = s;
5493
5494       /* For EITEM_FILTER, call eval_condition once, with result discarded (as
5495       if scanning a "false" part). This allows us to find the end of the
5496       condition, because if the list is empty, we won't actually evaluate the
5497       condition for real. For EITEM_MAP and EITEM_REDUCE, do the same, using
5498       the normal internal expansion function. */
5499
5500       if (item_type == EITEM_FILTER)
5501         {
5502         temp = eval_condition(expr, &resetok, NULL);
5503         if (temp != NULL) s = temp;
5504         }
5505       else
5506         {
5507         temp = expand_string_internal(s, TRUE, &s, TRUE, TRUE, &resetok);
5508         }
5509
5510       if (temp == NULL)
5511         {
5512         expand_string_message = string_sprintf("%s inside \"%s\" item",
5513           expand_string_message, name);
5514         goto EXPAND_FAILED;
5515         }
5516
5517       while (isspace(*s)) s++;
5518       if (*s++ != '}')
5519         {                                               /*{*/
5520         expand_string_message = string_sprintf("missing } at end of condition "
5521           "or expression inside \"%s\"", name);
5522         goto EXPAND_FAILED;
5523         }
5524
5525       while (isspace(*s)) s++;                          /*{*/
5526       if (*s++ != '}')
5527         {                                               /*{*/
5528         expand_string_message = string_sprintf("missing } at end of \"%s\"",
5529           name);
5530         goto EXPAND_FAILED;
5531         }
5532
5533       /* If we are skipping, we can now just move on to the next item. When
5534       processing for real, we perform the iteration. */
5535
5536       if (skipping) continue;
5537       while ((iterate_item = string_nextinlist(&list, &sep, NULL, 0)) != NULL)
5538         {
5539         *outsep = (uschar)sep;      /* Separator as a string */
5540
5541         DEBUG(D_expand) debug_printf("%s: $item = \"%s\"\n", name, iterate_item);
5542
5543         if (item_type == EITEM_FILTER)
5544           {
5545           BOOL condresult;
5546           if (eval_condition(expr, &resetok, &condresult) == NULL)
5547             {
5548             iterate_item = save_iterate_item;
5549             lookup_value = save_lookup_value;
5550             expand_string_message = string_sprintf("%s inside \"%s\" condition",
5551               expand_string_message, name);
5552             goto EXPAND_FAILED;
5553             }
5554           DEBUG(D_expand) debug_printf("%s: condition is %s\n", name,
5555             condresult? "true":"false");
5556           if (condresult)
5557             temp = iterate_item;    /* TRUE => include this item */
5558           else
5559             continue;               /* FALSE => skip this item */
5560           }
5561
5562         /* EITEM_MAP and EITEM_REDUCE */
5563
5564         else
5565           {
5566           temp = expand_string_internal(expr, TRUE, NULL, skipping, TRUE, &resetok);
5567           if (temp == NULL)
5568             {
5569             iterate_item = save_iterate_item;
5570             expand_string_message = string_sprintf("%s inside \"%s\" item",
5571               expand_string_message, name);
5572             goto EXPAND_FAILED;
5573             }
5574           if (item_type == EITEM_REDUCE)
5575             {
5576             lookup_value = temp;      /* Update the value of $value */
5577             continue;                 /* and continue the iteration */
5578             }
5579           }
5580
5581         /* We reach here for FILTER if the condition is true, always for MAP,
5582         and never for REDUCE. The value in "temp" is to be added to the output
5583         list that is being created, ensuring that any occurrences of the
5584         separator character are doubled. Unless we are dealing with the first
5585         item of the output list, add in a space if the new item begins with the
5586         separator character, or is an empty string. */
5587
5588         if (ptr != save_ptr && (temp[0] == *outsep || temp[0] == 0))
5589           yield = string_cat(yield, &size, &ptr, US" ", 1);
5590
5591         /* Add the string in "temp" to the output list that we are building,
5592         This is done in chunks by searching for the separator character. */
5593
5594         for (;;)
5595           {
5596           size_t seglen = Ustrcspn(temp, outsep);
5597             yield = string_cat(yield, &size, &ptr, temp, seglen + 1);
5598
5599           /* If we got to the end of the string we output one character
5600           too many; backup and end the loop. Otherwise arrange to double the
5601           separator. */
5602
5603           if (temp[seglen] == '\0') { ptr--; break; }
5604           yield = string_cat(yield, &size, &ptr, outsep, 1);
5605           temp += seglen + 1;
5606           }
5607
5608         /* Output a separator after the string: we will remove the redundant
5609         final one at the end. */
5610
5611         yield = string_cat(yield, &size, &ptr, outsep, 1);
5612         }   /* End of iteration over the list loop */
5613
5614       /* REDUCE has generated no output above: output the final value of
5615       $value. */
5616
5617       if (item_type == EITEM_REDUCE)
5618         {
5619         yield = string_cat(yield, &size, &ptr, lookup_value,
5620           Ustrlen(lookup_value));
5621         lookup_value = save_lookup_value;  /* Restore $value */
5622         }
5623
5624       /* FILTER and MAP generate lists: if they have generated anything, remove
5625       the redundant final separator. Even though an empty item at the end of a
5626       list does not count, this is tidier. */
5627
5628       else if (ptr != save_ptr) ptr--;
5629
5630       /* Restore preserved $item */
5631
5632       iterate_item = save_iterate_item;
5633       continue;
5634       }
5635
5636
5637     /* If ${dlfunc } support is configured, handle calling dynamically-loaded
5638     functions, unless locked out at this time. Syntax is ${dlfunc{file}{func}}
5639     or ${dlfunc{file}{func}{arg}} or ${dlfunc{file}{func}{arg1}{arg2}} or up to
5640     a maximum of EXPAND_DLFUNC_MAX_ARGS arguments (defined below). */
5641
5642     #define EXPAND_DLFUNC_MAX_ARGS 8
5643
5644     case EITEM_DLFUNC:
5645     #ifndef EXPAND_DLFUNC
5646     expand_string_message = US"\"${dlfunc\" encountered, but this facility "    /*}*/
5647       "is not included in this binary";
5648     goto EXPAND_FAILED;
5649
5650     #else   /* EXPAND_DLFUNC */
5651       {
5652       tree_node *t;
5653       exim_dlfunc_t *func;
5654       uschar *result;
5655       int status, argc;
5656       uschar *argv[EXPAND_DLFUNC_MAX_ARGS + 3];
5657
5658       if ((expand_forbid & RDO_DLFUNC) != 0)
5659         {
5660         expand_string_message =
5661           US"dynamically-loaded functions are not permitted";
5662         goto EXPAND_FAILED;
5663         }
5664
5665       switch(read_subs(argv, EXPAND_DLFUNC_MAX_ARGS + 2, 2, &s, skipping,
5666            TRUE, US"dlfunc", &resetok))
5667         {
5668         case 1: goto EXPAND_FAILED_CURLY;
5669         case 2:
5670         case 3: goto EXPAND_FAILED;
5671         }
5672
5673       /* If skipping, we don't actually do anything */
5674
5675       if (skipping) continue;
5676
5677       /* Look up the dynamically loaded object handle in the tree. If it isn't
5678       found, dlopen() the file and put the handle in the tree for next time. */
5679
5680       t = tree_search(dlobj_anchor, argv[0]);
5681       if (t == NULL)
5682         {
5683         void *handle = dlopen(CS argv[0], RTLD_LAZY);
5684         if (handle == NULL)
5685           {
5686           expand_string_message = string_sprintf("dlopen \"%s\" failed: %s",
5687             argv[0], dlerror());
5688           log_write(0, LOG_MAIN|LOG_PANIC, "%s", expand_string_message);
5689           goto EXPAND_FAILED;
5690           }
5691         t = store_get_perm(sizeof(tree_node) + Ustrlen(argv[0]));
5692         Ustrcpy(t->name, argv[0]);
5693         t->data.ptr = handle;
5694         (void)tree_insertnode(&dlobj_anchor, t);
5695         }
5696
5697       /* Having obtained the dynamically loaded object handle, look up the
5698       function pointer. */
5699
5700       func = (exim_dlfunc_t *)dlsym(t->data.ptr, CS argv[1]);
5701       if (func == NULL)
5702         {
5703         expand_string_message = string_sprintf("dlsym \"%s\" in \"%s\" failed: "
5704           "%s", argv[1], argv[0], dlerror());
5705         log_write(0, LOG_MAIN|LOG_PANIC, "%s", expand_string_message);
5706         goto EXPAND_FAILED;
5707         }
5708
5709       /* Call the function and work out what to do with the result. If it
5710       returns OK, we have a replacement string; if it returns DEFER then
5711       expansion has failed in a non-forced manner; if it returns FAIL then
5712       failure was forced; if it returns ERROR or any other value there's a
5713       problem, so panic slightly. In any case, assume that the function has
5714       side-effects on the store that must be preserved. */
5715
5716       resetok = FALSE;
5717       result = NULL;
5718       for (argc = 0; argv[argc] != NULL; argc++);
5719       status = func(&result, argc - 2, &argv[2]);
5720       if(status == OK)
5721         {
5722         if (result == NULL) result = US"";
5723         yield = string_cat(yield, &size, &ptr, result, Ustrlen(result));
5724         continue;
5725         }
5726       else
5727         {
5728         expand_string_message = result == NULL ? US"(no message)" : result;
5729         if(status == FAIL_FORCED) expand_string_forcedfail = TRUE;
5730           else if(status != FAIL)
5731             log_write(0, LOG_MAIN|LOG_PANIC, "dlfunc{%s}{%s} failed (%d): %s",
5732               argv[0], argv[1], status, expand_string_message);
5733         goto EXPAND_FAILED;
5734         }
5735       }
5736     #endif /* EXPAND_DLFUNC */
5737     }   /* EITEM_* switch */
5738
5739   /* Control reaches here if the name is not recognized as one of the more
5740   complicated expansion items. Check for the "operator" syntax (name terminated
5741   by a colon). Some of the operators have arguments, separated by _ from the
5742   name. */
5743
5744   if (*s == ':')
5745     {
5746     int c;
5747     uschar *arg = NULL;
5748     uschar *sub;
5749     var_entry *vp = NULL;
5750
5751     /* Owing to an historical mis-design, an underscore may be part of the
5752     operator name, or it may introduce arguments.  We therefore first scan the
5753     table of names that contain underscores. If there is no match, we cut off
5754     the arguments and then scan the main table. */
5755
5756     if ((c = chop_match(name, op_table_underscore,
5757         sizeof(op_table_underscore)/sizeof(uschar *))) < 0)
5758       {
5759       arg = Ustrchr(name, '_');
5760       if (arg != NULL) *arg = 0;
5761       c = chop_match(name, op_table_main,
5762         sizeof(op_table_main)/sizeof(uschar *));
5763       if (c >= 0) c += sizeof(op_table_underscore)/sizeof(uschar *);
5764       if (arg != NULL) *arg++ = '_';   /* Put back for error messages */
5765       }
5766
5767     /* Deal specially with operators that might take a certificate variable
5768     as we do not want to do the usual expansion. For most, expand the string.*/
5769     switch(c)
5770       {
5771 #ifdef SUPPORT_TLS
5772       case EOP_MD5:
5773       case EOP_SHA1:
5774       case EOP_SHA256:
5775         if (s[1] == '$')
5776           {
5777           uschar * s1 = s;
5778           sub = expand_string_internal(s+2, TRUE, &s1, skipping,
5779                   FALSE, &resetok);
5780           if (!sub)       goto EXPAND_FAILED;           /*{*/
5781           if (*s1 != '}') goto EXPAND_FAILED_CURLY;
5782           if ((vp = find_var_ent(sub)) && vp->type == vtype_cert)
5783             {
5784             s = s1+1;
5785             break;
5786             }
5787           vp = NULL;
5788           }
5789         /*FALLTHROUGH*/
5790 #endif
5791       default:
5792         sub = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok);
5793         if (!sub) goto EXPAND_FAILED;
5794         s++;
5795         break;
5796       }
5797
5798     /* If we are skipping, we don't need to perform the operation at all.
5799     This matters for operations like "mask", because the data may not be
5800     in the correct format when skipping. For example, the expression may test
5801     for the existence of $sender_host_address before trying to mask it. For
5802     other operations, doing them may not fail, but it is a waste of time. */
5803
5804     if (skipping && c >= 0) continue;
5805
5806     /* Otherwise, switch on the operator type */
5807
5808     switch(c)
5809       {
5810       case EOP_BASE62:
5811         {
5812         uschar *t;
5813         unsigned long int n = Ustrtoul(sub, &t, 10);
5814         if (*t != 0)
5815           {
5816           expand_string_message = string_sprintf("argument for base62 "
5817             "operator is \"%s\", which is not a decimal number", sub);
5818           goto EXPAND_FAILED;
5819           }
5820         t = string_base62(n);
5821         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
5822         continue;
5823         }
5824
5825       /* Note that for Darwin and Cygwin, BASE_62 actually has the value 36 */
5826
5827       case EOP_BASE62D:
5828         {
5829         uschar buf[16];
5830         uschar *tt = sub;
5831         unsigned long int n = 0;
5832         while (*tt != 0)
5833           {
5834           uschar *t = Ustrchr(base62_chars, *tt++);
5835           if (t == NULL)
5836             {
5837             expand_string_message = string_sprintf("argument for base62d "
5838               "operator is \"%s\", which is not a base %d number", sub,
5839               BASE_62);
5840             goto EXPAND_FAILED;
5841             }
5842           n = n * BASE_62 + (t - base62_chars);
5843           }
5844         (void)sprintf(CS buf, "%ld", n);
5845         yield = string_cat(yield, &size, &ptr, buf, Ustrlen(buf));
5846         continue;
5847         }
5848
5849       case EOP_EXPAND:
5850         {
5851         uschar *expanded = expand_string_internal(sub, FALSE, NULL, skipping, TRUE, &resetok);
5852         if (expanded == NULL)
5853           {
5854           expand_string_message =
5855             string_sprintf("internal expansion of \"%s\" failed: %s", sub,
5856               expand_string_message);
5857           goto EXPAND_FAILED;
5858           }
5859         yield = string_cat(yield, &size, &ptr, expanded, Ustrlen(expanded));
5860         continue;
5861         }
5862
5863       case EOP_LC:
5864         {
5865         int count = 0;
5866         uschar *t = sub - 1;
5867         while (*(++t) != 0) { *t = tolower(*t); count++; }
5868         yield = string_cat(yield, &size, &ptr, sub, count);
5869         continue;
5870         }
5871
5872       case EOP_UC:
5873         {
5874         int count = 0;
5875         uschar *t = sub - 1;
5876         while (*(++t) != 0) { *t = toupper(*t); count++; }
5877         yield = string_cat(yield, &size, &ptr, sub, count);
5878         continue;
5879         }
5880
5881       case EOP_MD5:
5882 #ifdef SUPPORT_TLS
5883         if (vp && *(void **)vp->value)
5884           {
5885           uschar * cp = tls_cert_fprt_md5(*(void **)vp->value);
5886           yield = string_cat(yield, &size, &ptr, cp, Ustrlen(cp));
5887           }
5888         else
5889 #endif
5890           {
5891           md5 base;
5892           uschar digest[16];
5893           int j;
5894           char st[33];
5895           md5_start(&base);
5896           md5_end(&base, sub, Ustrlen(sub), digest);
5897           for(j = 0; j < 16; j++) sprintf(st+2*j, "%02x", digest[j]);
5898           yield = string_cat(yield, &size, &ptr, US st, (int)strlen(st));
5899           }
5900         continue;
5901
5902       case EOP_SHA1:
5903 #ifdef SUPPORT_TLS
5904         if (vp && *(void **)vp->value)
5905           {
5906           uschar * cp = tls_cert_fprt_sha1(*(void **)vp->value);
5907           yield = string_cat(yield, &size, &ptr, cp, Ustrlen(cp));
5908           }
5909         else
5910 #endif
5911           {
5912           sha1 base;
5913           uschar digest[20];
5914           int j;
5915           char st[41];
5916           sha1_start(&base);
5917           sha1_end(&base, sub, Ustrlen(sub), digest);
5918           for(j = 0; j < 20; j++) sprintf(st+2*j, "%02X", digest[j]);
5919           yield = string_cat(yield, &size, &ptr, US st, (int)strlen(st));
5920           }
5921         continue;
5922
5923       case EOP_SHA256:
5924 #ifdef SUPPORT_TLS
5925         if (vp && *(void **)vp->value)
5926           {
5927           uschar * cp = tls_cert_fprt_sha256(*(void **)vp->value);
5928           yield = string_cat(yield, &size, &ptr, cp, (int)Ustrlen(cp));
5929           }
5930         else
5931 #endif
5932           expand_string_message = US"sha256 only supported for certificates";
5933         continue;
5934
5935       /* Convert hex encoding to base64 encoding */
5936
5937       case EOP_HEX2B64:
5938         {
5939         int c = 0;
5940         int b = -1;
5941         uschar *in = sub;
5942         uschar *out = sub;
5943         uschar *enc;
5944
5945         for (enc = sub; *enc != 0; enc++)
5946           {
5947           if (!isxdigit(*enc))
5948             {
5949             expand_string_message = string_sprintf("\"%s\" is not a hex "
5950               "string", sub);
5951             goto EXPAND_FAILED;
5952             }
5953           c++;
5954           }
5955
5956         if ((c & 1) != 0)
5957           {
5958           expand_string_message = string_sprintf("\"%s\" contains an odd "
5959             "number of characters", sub);
5960           goto EXPAND_FAILED;
5961           }
5962
5963         while ((c = *in++) != 0)
5964           {
5965           if (isdigit(c)) c -= '0';
5966           else c = toupper(c) - 'A' + 10;
5967           if (b == -1)
5968             {
5969             b = c << 4;
5970             }
5971           else
5972             {
5973             *out++ = b | c;
5974             b = -1;
5975             }
5976           }
5977
5978         enc = auth_b64encode(sub, out - sub);
5979         yield = string_cat(yield, &size, &ptr, enc, Ustrlen(enc));
5980         continue;
5981         }
5982
5983       /* Convert octets outside 0x21..0x7E to \xXX form */
5984
5985       case EOP_HEXQUOTE:
5986         {
5987         uschar *t = sub - 1;
5988         while (*(++t) != 0)
5989           {
5990           if (*t < 0x21 || 0x7E < *t)
5991             yield = string_cat(yield, &size, &ptr,
5992               string_sprintf("\\x%02x", *t), 4);
5993           else
5994             yield = string_cat(yield, &size, &ptr, t, 1);
5995           }
5996         continue;
5997         }
5998
5999       /* count the number of list elements */
6000
6001       case EOP_LISTCOUNT:
6002         {
6003         int cnt = 0;
6004         int sep = 0;
6005         uschar * cp;
6006         uschar buffer[256];
6007
6008         while (string_nextinlist(&sub, &sep, buffer, sizeof(buffer)) != NULL) cnt++;
6009         cp = string_sprintf("%d", cnt);
6010         yield = string_cat(yield, &size, &ptr, cp, Ustrlen(cp));
6011         continue;
6012         }
6013
6014       /* expand a named list given the name */
6015       /* handles nested named lists; requotes as colon-sep list */
6016
6017       case EOP_LISTNAMED:
6018         {
6019         tree_node *t = NULL;
6020         uschar * list;
6021         int sep = 0;
6022         uschar * item;
6023         uschar * suffix = US"";
6024         BOOL needsep = FALSE;
6025         uschar buffer[256];
6026
6027         if (*sub == '+') sub++;
6028         if (arg == NULL)        /* no-argument version */
6029           {
6030           if (!(t = tree_search(addresslist_anchor, sub)) &&
6031               !(t = tree_search(domainlist_anchor,  sub)) &&
6032               !(t = tree_search(hostlist_anchor,    sub)))
6033             t = tree_search(localpartlist_anchor, sub);
6034           }
6035         else switch(*arg)       /* specific list-type version */
6036           {
6037           case 'a': t = tree_search(addresslist_anchor,   sub); suffix = US"_a"; break;
6038           case 'd': t = tree_search(domainlist_anchor,    sub); suffix = US"_d"; break;
6039           case 'h': t = tree_search(hostlist_anchor,      sub); suffix = US"_h"; break;
6040           case 'l': t = tree_search(localpartlist_anchor, sub); suffix = US"_l"; break;
6041           default:
6042             expand_string_message = string_sprintf("bad suffix on \"list\" operator");
6043             goto EXPAND_FAILED;
6044           }
6045
6046         if(!t)
6047           {
6048           expand_string_message = string_sprintf("\"%s\" is not a %snamed list",
6049             sub, !arg?""
6050               : *arg=='a'?"address "
6051               : *arg=='d'?"domain "
6052               : *arg=='h'?"host "
6053               : *arg=='l'?"localpart "
6054               : 0);
6055           goto EXPAND_FAILED;
6056           }
6057
6058         list = ((namedlist_block *)(t->data.ptr))->string;
6059
6060         while ((item = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
6061           {
6062           uschar * buf = US" : ";
6063           if (needsep)
6064             yield = string_cat(yield, &size, &ptr, buf, 3);
6065           else
6066             needsep = TRUE;
6067
6068           if (*item == '+')     /* list item is itself a named list */
6069             {
6070             uschar * sub = string_sprintf("${listnamed%s:%s}", suffix, item);
6071             item = expand_string_internal(sub, FALSE, NULL, FALSE, TRUE, &resetok);
6072             }
6073           else if (sep != ':')  /* item from non-colon-sep list, re-quote for colon list-separator */
6074             {
6075             char * cp;
6076             char tok[3];
6077             tok[0] = sep; tok[1] = ':'; tok[2] = 0;
6078             while ((cp= strpbrk((const char *)item, tok)))
6079               {
6080               yield = string_cat(yield, &size, &ptr, item, cp-(char *)item);
6081               if (*cp++ == ':') /* colon in a non-colon-sep list item, needs doubling */
6082                 {
6083                 yield = string_cat(yield, &size, &ptr, US"::", 2);
6084                 item = (uschar *)cp;
6085                 }
6086               else              /* sep in item; should already be doubled; emit once */
6087                 {
6088                 yield = string_cat(yield, &size, &ptr, (uschar *)tok, 1);
6089                 if (*cp == sep) cp++;
6090                 item = (uschar *)cp;
6091                 }
6092               }
6093             }
6094           yield = string_cat(yield, &size, &ptr, item, Ustrlen(item));
6095           }
6096         continue;
6097         }
6098
6099       /* mask applies a mask to an IP address; for example the result of
6100       ${mask:131.111.10.206/28} is 131.111.10.192/28. */
6101
6102       case EOP_MASK:
6103         {
6104         int count;
6105         uschar *endptr;
6106         int binary[4];
6107         int mask, maskoffset;
6108         int type = string_is_ip_address(sub, &maskoffset);
6109         uschar buffer[64];
6110
6111         if (type == 0)
6112           {
6113           expand_string_message = string_sprintf("\"%s\" is not an IP address",
6114            sub);
6115           goto EXPAND_FAILED;
6116           }
6117
6118         if (maskoffset == 0)
6119           {
6120           expand_string_message = string_sprintf("missing mask value in \"%s\"",
6121             sub);
6122           goto EXPAND_FAILED;
6123           }
6124
6125         mask = Ustrtol(sub + maskoffset + 1, &endptr, 10);
6126
6127         if (*endptr != 0 || mask < 0 || mask > ((type == 4)? 32 : 128))
6128           {
6129           expand_string_message = string_sprintf("mask value too big in \"%s\"",
6130             sub);
6131           goto EXPAND_FAILED;
6132           }
6133
6134         /* Convert the address to binary integer(s) and apply the mask */
6135
6136         sub[maskoffset] = 0;
6137         count = host_aton(sub, binary);
6138         host_mask(count, binary, mask);
6139
6140         /* Convert to masked textual format and add to output. */
6141
6142         yield = string_cat(yield, &size, &ptr, buffer,
6143           host_nmtoa(count, binary, mask, buffer, '.'));
6144         continue;
6145         }
6146
6147       case EOP_ADDRESS:
6148       case EOP_LOCAL_PART:
6149       case EOP_DOMAIN:
6150         {
6151         uschar *error;
6152         int start, end, domain;
6153         uschar *t = parse_extract_address(sub, &error, &start, &end, &domain,
6154           FALSE);
6155         if (t != NULL)
6156           {
6157           if (c != EOP_DOMAIN)
6158             {
6159             if (c == EOP_LOCAL_PART && domain != 0) end = start + domain - 1;
6160             yield = string_cat(yield, &size, &ptr, sub+start, end-start);
6161             }
6162           else if (domain != 0)
6163             {
6164             domain += start;
6165             yield = string_cat(yield, &size, &ptr, sub+domain, end-domain);
6166             }
6167           }
6168         continue;
6169         }
6170
6171       case EOP_ADDRESSES:
6172         {
6173         uschar outsep[2] = { ':', '\0' };
6174         uschar *address, *error;
6175         int save_ptr = ptr;
6176         int start, end, domain;  /* Not really used */
6177
6178         while (isspace(*sub)) sub++;
6179         if (*sub == '>') { *outsep = *++sub; ++sub; }
6180         parse_allow_group = TRUE;
6181
6182         for (;;)
6183           {
6184           uschar *p = parse_find_address_end(sub, FALSE);
6185           uschar saveend = *p;
6186           *p = '\0';
6187           address = parse_extract_address(sub, &error, &start, &end, &domain,
6188             FALSE);
6189           *p = saveend;
6190
6191           /* Add the address to the output list that we are building. This is
6192           done in chunks by searching for the separator character. At the
6193           start, unless we are dealing with the first address of the output
6194           list, add in a space if the new address begins with the separator
6195           character, or is an empty string. */
6196
6197           if (address != NULL)
6198             {
6199             if (ptr != save_ptr && address[0] == *outsep)
6200               yield = string_cat(yield, &size, &ptr, US" ", 1);
6201
6202             for (;;)
6203               {
6204               size_t seglen = Ustrcspn(address, outsep);
6205               yield = string_cat(yield, &size, &ptr, address, seglen + 1);
6206
6207               /* If we got to the end of the string we output one character
6208               too many. */
6209
6210               if (address[seglen] == '\0') { ptr--; break; }
6211               yield = string_cat(yield, &size, &ptr, outsep, 1);
6212               address += seglen + 1;
6213               }
6214
6215             /* Output a separator after the string: we will remove the
6216             redundant final one at the end. */
6217
6218             yield = string_cat(yield, &size, &ptr, outsep, 1);
6219             }
6220
6221           if (saveend == '\0') break;
6222           sub = p + 1;
6223           }
6224
6225         /* If we have generated anything, remove the redundant final
6226         separator. */
6227
6228         if (ptr != save_ptr) ptr--;
6229         parse_allow_group = FALSE;
6230         continue;
6231         }
6232
6233
6234       /* quote puts a string in quotes if it is empty or contains anything
6235       other than alphamerics, underscore, dot, or hyphen.
6236
6237       quote_local_part puts a string in quotes if RFC 2821/2822 requires it to
6238       be quoted in order to be a valid local part.
6239
6240       In both cases, newlines and carriage returns are converted into \n and \r
6241       respectively */
6242
6243       case EOP_QUOTE:
6244       case EOP_QUOTE_LOCAL_PART:
6245       if (arg == NULL)
6246         {
6247         BOOL needs_quote = (*sub == 0);      /* TRUE for empty string */
6248         uschar *t = sub - 1;
6249
6250         if (c == EOP_QUOTE)
6251           {
6252           while (!needs_quote && *(++t) != 0)
6253             needs_quote = !isalnum(*t) && !strchr("_-.", *t);
6254           }
6255         else  /* EOP_QUOTE_LOCAL_PART */
6256           {
6257           while (!needs_quote && *(++t) != 0)
6258             needs_quote = !isalnum(*t) &&
6259               strchr("!#$%&'*+-/=?^_`{|}~", *t) == NULL &&
6260               (*t != '.' || t == sub || t[1] == 0);
6261           }
6262
6263         if (needs_quote)
6264           {
6265           yield = string_cat(yield, &size, &ptr, US"\"", 1);
6266           t = sub - 1;
6267           while (*(++t) != 0)
6268             {
6269             if (*t == '\n')
6270               yield = string_cat(yield, &size, &ptr, US"\\n", 2);
6271             else if (*t == '\r')
6272               yield = string_cat(yield, &size, &ptr, US"\\r", 2);
6273             else
6274               {
6275               if (*t == '\\' || *t == '"')
6276                 yield = string_cat(yield, &size, &ptr, US"\\", 1);
6277               yield = string_cat(yield, &size, &ptr, t, 1);
6278               }
6279             }
6280           yield = string_cat(yield, &size, &ptr, US"\"", 1);
6281           }
6282         else yield = string_cat(yield, &size, &ptr, sub, Ustrlen(sub));
6283         continue;
6284         }
6285
6286       /* quote_lookuptype does lookup-specific quoting */
6287
6288       else
6289         {
6290         int n;
6291         uschar *opt = Ustrchr(arg, '_');
6292
6293         if (opt != NULL) *opt++ = 0;
6294
6295         n = search_findtype(arg, Ustrlen(arg));
6296         if (n < 0)
6297           {
6298           expand_string_message = search_error_message;
6299           goto EXPAND_FAILED;
6300           }
6301
6302         if (lookup_list[n]->quote != NULL)
6303           sub = (lookup_list[n]->quote)(sub, opt);
6304         else if (opt != NULL) sub = NULL;
6305
6306         if (sub == NULL)
6307           {
6308           expand_string_message = string_sprintf(
6309             "\"%s\" unrecognized after \"${quote_%s\"",
6310             opt, arg);
6311           goto EXPAND_FAILED;
6312           }
6313
6314         yield = string_cat(yield, &size, &ptr, sub, Ustrlen(sub));
6315         continue;
6316         }
6317
6318       /* rx quote sticks in \ before any non-alphameric character so that
6319       the insertion works in a regular expression. */
6320
6321       case EOP_RXQUOTE:
6322         {
6323         uschar *t = sub - 1;
6324         while (*(++t) != 0)
6325           {
6326           if (!isalnum(*t))
6327             yield = string_cat(yield, &size, &ptr, US"\\", 1);
6328           yield = string_cat(yield, &size, &ptr, t, 1);
6329           }
6330         continue;
6331         }
6332
6333       /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as
6334       prescribed by the RFC, if there are characters that need to be encoded */
6335
6336       case EOP_RFC2047:
6337         {
6338         uschar buffer[2048];
6339         uschar *string = parse_quote_2047(sub, Ustrlen(sub), headers_charset,
6340           buffer, sizeof(buffer), FALSE);
6341         yield = string_cat(yield, &size, &ptr, string, Ustrlen(string));
6342         continue;
6343         }
6344
6345       /* RFC 2047 decode */
6346
6347       case EOP_RFC2047D:
6348         {
6349         int len;
6350         uschar *error;
6351         uschar *decoded = rfc2047_decode(sub, check_rfc2047_length,
6352           headers_charset, '?', &len, &error);
6353         if (error != NULL)
6354           {
6355           expand_string_message = error;
6356           goto EXPAND_FAILED;
6357           }
6358         yield = string_cat(yield, &size, &ptr, decoded, len);
6359         continue;
6360         }
6361
6362       /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into
6363       underscores */
6364
6365       case EOP_FROM_UTF8:
6366         {
6367         while (*sub != 0)
6368           {
6369           int c;
6370           uschar buff[4];
6371           GETUTF8INC(c, sub);
6372           if (c > 255) c = '_';
6373           buff[0] = c;
6374           yield = string_cat(yield, &size, &ptr, buff, 1);
6375           }
6376         continue;
6377         }
6378
6379           /* replace illegal UTF-8 sequences by replacement character  */
6380           
6381       #define UTF8_REPLACEMENT_CHAR US"?"
6382
6383       case EOP_UTF8CLEAN:
6384         {
6385         int seq_len = 0, index = 0;
6386         int bytes_left = 0;
6387         long codepoint = -1;
6388         uschar seq_buff[4];                     /* accumulate utf-8 here */
6389         
6390         while (*sub != 0)
6391           {
6392           int complete = 0;
6393           uschar c = *sub++;
6394
6395           if (bytes_left)
6396             {
6397             if ((c & 0xc0) != 0x80)
6398               {
6399                     /* wrong continuation byte; invalidate all bytes */
6400               complete = 1; /* error */
6401               }
6402             else
6403               {
6404               codepoint = (codepoint << 6) | (c & 0x3f);
6405               seq_buff[index++] = c;
6406               if (--bytes_left == 0)            /* codepoint complete */
6407                 {
6408                 if(codepoint > 0x10FFFF)        /* is it too large? */
6409                   complete = -1;        /* error (RFC3629 limit) */
6410                 else
6411                   {             /* finished; output utf-8 sequence */
6412                   yield = string_cat(yield, &size, &ptr, seq_buff, seq_len);
6413                   index = 0;
6414                   }
6415                 }
6416               }
6417             }
6418           else  /* no bytes left: new sequence */
6419             {
6420             if((c & 0x80) == 0) /* 1-byte sequence, US-ASCII, keep it */
6421               {
6422               yield = string_cat(yield, &size, &ptr, &c, 1);
6423               continue;
6424               }
6425             if((c & 0xe0) == 0xc0)              /* 2-byte sequence */
6426               {
6427               if(c == 0xc0 || c == 0xc1)        /* 0xc0 and 0xc1 are illegal */
6428                 complete = -1;
6429               else
6430                 {
6431                   bytes_left = 1;
6432                   codepoint = c & 0x1f;
6433                 }
6434               }
6435             else if((c & 0xf0) == 0xe0)         /* 3-byte sequence */
6436               {
6437               bytes_left = 2;
6438               codepoint = c & 0x0f;
6439               }
6440             else if((c & 0xf8) == 0xf0)         /* 4-byte sequence */
6441               {
6442               bytes_left = 3;
6443               codepoint = c & 0x07;
6444               }
6445             else        /* invalid or too long (RFC3629 allows only 4 bytes) */
6446               complete = -1;
6447
6448             seq_buff[index++] = c;
6449             seq_len = bytes_left + 1;
6450             }           /* if(bytes_left) */
6451
6452           if (complete != 0)
6453             {
6454             bytes_left = index = 0;
6455             yield = string_cat(yield, &size, &ptr, UTF8_REPLACEMENT_CHAR, 1);
6456             }
6457           if ((complete == 1) && ((c & 0x80) == 0))
6458             { /* ASCII character follows incomplete sequence */
6459               yield = string_cat(yield, &size, &ptr, &c, 1);
6460             }
6461           }
6462         continue;
6463         }
6464
6465       /* escape turns all non-printing characters into escape sequences. */
6466
6467       case EOP_ESCAPE:
6468         {
6469         uschar *t = string_printing(sub);
6470         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
6471         continue;
6472         }
6473
6474       /* Handle numeric expression evaluation */
6475
6476       case EOP_EVAL:
6477       case EOP_EVAL10:
6478         {
6479         uschar *save_sub = sub;
6480         uschar *error = NULL;
6481         int_eximarith_t n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE);
6482         if (error != NULL)
6483           {
6484           expand_string_message = string_sprintf("error in expression "
6485             "evaluation: %s (after processing \"%.*s\")", error, sub-save_sub,
6486               save_sub);
6487           goto EXPAND_FAILED;
6488           }
6489         sprintf(CS var_buffer, PR_EXIM_ARITH, n);
6490         yield = string_cat(yield, &size, &ptr, var_buffer, Ustrlen(var_buffer));
6491         continue;
6492         }
6493
6494       /* Handle time period formating */
6495
6496       case EOP_TIME_EVAL:
6497         {
6498         int n = readconf_readtime(sub, 0, FALSE);
6499         if (n < 0)
6500           {
6501           expand_string_message = string_sprintf("string \"%s\" is not an "
6502             "Exim time interval in \"%s\" operator", sub, name);
6503           goto EXPAND_FAILED;
6504           }
6505         sprintf(CS var_buffer, "%d", n);
6506         yield = string_cat(yield, &size, &ptr, var_buffer, Ustrlen(var_buffer));
6507         continue;
6508         }
6509
6510       case EOP_TIME_INTERVAL:
6511         {
6512         int n;
6513         uschar *t = read_number(&n, sub);
6514         if (*t != 0) /* Not A Number*/
6515           {
6516           expand_string_message = string_sprintf("string \"%s\" is not a "
6517             "positive number in \"%s\" operator", sub, name);
6518           goto EXPAND_FAILED;
6519           }
6520         t = readconf_printtime(n);
6521         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
6522         continue;
6523         }
6524
6525       /* Convert string to base64 encoding */
6526
6527       case EOP_STR2B64:
6528         {
6529         uschar *encstr = auth_b64encode(sub, Ustrlen(sub));
6530         yield = string_cat(yield, &size, &ptr, encstr, Ustrlen(encstr));
6531         continue;
6532         }
6533
6534       /* strlen returns the length of the string */
6535
6536       case EOP_STRLEN:
6537         {
6538         uschar buff[24];
6539         (void)sprintf(CS buff, "%d", Ustrlen(sub));
6540         yield = string_cat(yield, &size, &ptr, buff, Ustrlen(buff));
6541         continue;
6542         }
6543
6544       /* length_n or l_n takes just the first n characters or the whole string,
6545       whichever is the shorter;
6546
6547       substr_m_n, and s_m_n take n characters from offset m; negative m take
6548       from the end; l_n is synonymous with s_0_n. If n is omitted in substr it
6549       takes the rest, either to the right or to the left.
6550
6551       hash_n or h_n makes a hash of length n from the string, yielding n
6552       characters from the set a-z; hash_n_m makes a hash of length n, but
6553       uses m characters from the set a-zA-Z0-9.
6554
6555       nhash_n returns a single number between 0 and n-1 (in text form), while
6556       nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies
6557       between 0 and n-1 and the second between 0 and m-1. */
6558
6559       case EOP_LENGTH:
6560       case EOP_L:
6561       case EOP_SUBSTR:
6562       case EOP_S:
6563       case EOP_HASH:
6564       case EOP_H:
6565       case EOP_NHASH:
6566       case EOP_NH:
6567         {
6568         int sign = 1;
6569         int value1 = 0;
6570         int value2 = -1;
6571         int *pn;
6572         int len;
6573         uschar *ret;
6574
6575         if (arg == NULL)
6576           {
6577           expand_string_message = string_sprintf("missing values after %s",
6578             name);
6579           goto EXPAND_FAILED;
6580           }
6581
6582         /* "length" has only one argument, effectively being synonymous with
6583         substr_0_n. */
6584
6585         if (c == EOP_LENGTH || c == EOP_L)
6586           {
6587           pn = &value2;
6588           value2 = 0;
6589           }
6590
6591         /* The others have one or two arguments; for "substr" the first may be
6592         negative. The second being negative means "not supplied". */
6593
6594         else
6595           {
6596           pn = &value1;
6597           if (name[0] == 's' && *arg == '-') { sign = -1; arg++; }
6598           }
6599
6600         /* Read up to two numbers, separated by underscores */
6601
6602         ret = arg;
6603         while (*arg != 0)
6604           {
6605           if (arg != ret && *arg == '_' && pn == &value1)
6606             {
6607             pn = &value2;
6608             value2 = 0;
6609             if (arg[1] != 0) arg++;
6610             }
6611           else if (!isdigit(*arg))
6612             {
6613             expand_string_message =
6614               string_sprintf("non-digit after underscore in \"%s\"", name);
6615             goto EXPAND_FAILED;
6616             }
6617           else *pn = (*pn)*10 + *arg++ - '0';
6618           }
6619         value1 *= sign;
6620
6621         /* Perform the required operation */
6622
6623         ret =
6624           (c == EOP_HASH || c == EOP_H)?
6625              compute_hash(sub, value1, value2, &len) :
6626           (c == EOP_NHASH || c == EOP_NH)?
6627              compute_nhash(sub, value1, value2, &len) :
6628              extract_substr(sub, value1, value2, &len);
6629
6630         if (ret == NULL) goto EXPAND_FAILED;
6631         yield = string_cat(yield, &size, &ptr, ret, len);
6632         continue;
6633         }
6634
6635       /* Stat a path */
6636
6637       case EOP_STAT:
6638         {
6639         uschar *s;
6640         uschar smode[12];
6641         uschar **modetable[3];
6642         int i;
6643         mode_t mode;
6644         struct stat st;
6645
6646         if ((expand_forbid & RDO_EXISTS) != 0)
6647           {
6648           expand_string_message = US"Use of the stat() expansion is not permitted";
6649           goto EXPAND_FAILED;
6650           }
6651
6652         if (stat(CS sub, &st) < 0)
6653           {
6654           expand_string_message = string_sprintf("stat(%s) failed: %s",
6655             sub, strerror(errno));
6656           goto EXPAND_FAILED;
6657           }
6658         mode = st.st_mode;
6659         switch (mode & S_IFMT)
6660           {
6661           case S_IFIFO: smode[0] = 'p'; break;
6662           case S_IFCHR: smode[0] = 'c'; break;
6663           case S_IFDIR: smode[0] = 'd'; break;
6664           case S_IFBLK: smode[0] = 'b'; break;
6665           case S_IFREG: smode[0] = '-'; break;
6666           default: smode[0] = '?'; break;
6667           }
6668
6669         modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky;
6670         modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid;
6671         modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid;
6672
6673         for (i = 0; i < 3; i++)
6674           {
6675           memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3);
6676           mode >>= 3;
6677           }
6678
6679         smode[10] = 0;
6680         s = string_sprintf("mode=%04lo smode=%s inode=%ld device=%ld links=%ld "
6681           "uid=%ld gid=%ld size=" OFF_T_FMT " atime=%ld mtime=%ld ctime=%ld",
6682           (long)(st.st_mode & 077777), smode, (long)st.st_ino,
6683           (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid,
6684           (long)st.st_gid, st.st_size, (long)st.st_atime,
6685           (long)st.st_mtime, (long)st.st_ctime);
6686         yield = string_cat(yield, &size, &ptr, s, Ustrlen(s));
6687         continue;
6688         }
6689
6690       /* vaguely random number less than N */
6691
6692       case EOP_RANDINT:
6693         {
6694         int_eximarith_t max;
6695         uschar *s;
6696
6697         max = expanded_string_integer(sub, TRUE);
6698         if (expand_string_message != NULL)
6699           goto EXPAND_FAILED;
6700         s = string_sprintf("%d", vaguely_random_number((int)max));
6701         yield = string_cat(yield, &size, &ptr, s, Ustrlen(s));
6702         continue;
6703         }
6704
6705       /* Reverse IP, including IPv6 to dotted-nibble */
6706
6707       case EOP_REVERSE_IP:
6708         {
6709         int family, maskptr;
6710         uschar reversed[128];
6711
6712         family = string_is_ip_address(sub, &maskptr);
6713         if (family == 0)
6714           {
6715           expand_string_message = string_sprintf(
6716               "reverse_ip() not given an IP address [%s]", sub);
6717           goto EXPAND_FAILED;
6718           }
6719         invert_address(reversed, sub);
6720         yield = string_cat(yield, &size, &ptr, reversed, Ustrlen(reversed));
6721         continue;
6722         }
6723
6724       /* Unknown operator */
6725
6726       default:
6727       expand_string_message =
6728         string_sprintf("unknown expansion operator \"%s\"", name);
6729       goto EXPAND_FAILED;
6730       }
6731     }
6732
6733   /* Handle a plain name. If this is the first thing in the expansion, release
6734   the pre-allocated buffer. If the result data is known to be in a new buffer,
6735   newsize will be set to the size of that buffer, and we can just point at that
6736   store instead of copying. Many expansion strings contain just one reference,
6737   so this is a useful optimization, especially for humungous headers
6738   ($message_headers). */
6739                                                 /*{*/
6740   if (*s++ == '}')
6741     {
6742     int len;
6743     int newsize = 0;
6744     if (ptr == 0)
6745       {
6746       if (resetok) store_reset(yield);
6747       yield = NULL;
6748       size = 0;
6749       }
6750     value = find_variable(name, FALSE, skipping, &newsize);
6751     if (value == NULL)
6752       {
6753       expand_string_message =
6754         string_sprintf("unknown variable in \"${%s}\"", name);
6755       check_variable_error_message(name);
6756       goto EXPAND_FAILED;
6757       }
6758     len = Ustrlen(value);
6759     if (yield == NULL && newsize != 0)
6760       {
6761       yield = value;
6762       size = newsize;
6763       ptr = len;
6764       }
6765     else yield = string_cat(yield, &size, &ptr, value, len);
6766     continue;
6767     }
6768
6769   /* Else there's something wrong */
6770
6771   expand_string_message =
6772     string_sprintf("\"${%s\" is not a known operator (or a } is missing "
6773     "in a variable reference)", name);
6774   goto EXPAND_FAILED;
6775   }
6776
6777 /* If we hit the end of the string when ket_ends is set, there is a missing
6778 terminating brace. */
6779
6780 if (ket_ends && *s == 0)
6781   {
6782   expand_string_message = malformed_header?
6783     US"missing } at end of string - could be header name not terminated by colon"
6784     :
6785     US"missing } at end of string";
6786   goto EXPAND_FAILED;
6787   }
6788
6789 /* Expansion succeeded; yield may still be NULL here if nothing was actually
6790 added to the string. If so, set up an empty string. Add a terminating zero. If
6791 left != NULL, return a pointer to the terminator. */
6792
6793 if (yield == NULL) yield = store_get(1);
6794 yield[ptr] = 0;
6795 if (left != NULL) *left = s;
6796
6797 /* Any stacking store that was used above the final string is no longer needed.
6798 In many cases the final string will be the first one that was got and so there
6799 will be optimal store usage. */
6800
6801 if (resetok) store_reset(yield + ptr + 1);
6802 else if (resetok_p) *resetok_p = FALSE;
6803
6804 DEBUG(D_expand)
6805   {
6806   debug_printf("expanding: %.*s\n   result: %s\n", (int)(s - string), string,
6807     yield);
6808   if (skipping) debug_printf("skipping: result is not used\n");
6809   }
6810 return yield;
6811
6812 /* This is the failure exit: easiest to program with a goto. We still need
6813 to update the pointer to the terminator, for cases of nested calls with "fail".
6814 */
6815
6816 EXPAND_FAILED_CURLY:
6817 expand_string_message = malformed_header?
6818   US"missing or misplaced { or } - could be header name not terminated by colon"
6819   :
6820   US"missing or misplaced { or }";
6821
6822 /* At one point, Exim reset the store to yield (if yield was not NULL), but
6823 that is a bad idea, because expand_string_message is in dynamic store. */
6824
6825 EXPAND_FAILED:
6826 if (left != NULL) *left = s;
6827 DEBUG(D_expand)
6828   {
6829   debug_printf("failed to expand: %s\n", string);
6830   debug_printf("   error message: %s\n", expand_string_message);
6831   if (expand_string_forcedfail) debug_printf("failure was forced\n");
6832   }
6833 if (resetok_p) *resetok_p = resetok;
6834 return NULL;
6835 }
6836
6837
6838 /* This is the external function call. Do a quick check for any expansion
6839 metacharacters, and if there are none, just return the input string.
6840
6841 Argument: the string to be expanded
6842 Returns:  the expanded string, or NULL if expansion failed; if failure was
6843           due to a lookup deferring, search_find_defer will be TRUE
6844 */
6845
6846 uschar *
6847 expand_string(uschar *string)
6848 {
6849 search_find_defer = FALSE;
6850 malformed_header = FALSE;
6851 return (Ustrpbrk(string, "$\\") == NULL)? string :
6852   expand_string_internal(string, FALSE, NULL, FALSE, TRUE, NULL);
6853 }
6854
6855
6856
6857 /*************************************************
6858 *              Expand and copy                   *
6859 *************************************************/
6860
6861 /* Now and again we want to expand a string and be sure that the result is in a
6862 new bit of store. This function does that.
6863
6864 Argument: the string to be expanded
6865 Returns:  the expanded string, always in a new bit of store, or NULL
6866 */
6867
6868 uschar *
6869 expand_string_copy(uschar *string)
6870 {
6871 uschar *yield = expand_string(string);
6872 if (yield == string) yield = string_copy(string);
6873 return yield;
6874 }
6875
6876
6877
6878 /*************************************************
6879 *        Expand and interpret as an integer      *
6880 *************************************************/
6881
6882 /* Expand a string, and convert the result into an integer.
6883
6884 Arguments:
6885   string  the string to be expanded
6886   isplus  TRUE if a non-negative number is expected
6887
6888 Returns:  the integer value, or
6889           -1 for an expansion error               ) in both cases, message in
6890           -2 for an integer interpretation error  ) expand_string_message
6891           expand_string_message is set NULL for an OK integer
6892 */
6893
6894 int_eximarith_t
6895 expand_string_integer(uschar *string, BOOL isplus)
6896 {
6897 return expanded_string_integer(expand_string(string), isplus);
6898 }
6899
6900
6901 /*************************************************
6902  *         Interpret string as an integer        *
6903  *************************************************/
6904
6905 /* Convert a string (that has already been expanded) into an integer.
6906
6907 This function is used inside the expansion code.
6908
6909 Arguments:
6910   s       the string to be expanded
6911   isplus  TRUE if a non-negative number is expected
6912
6913 Returns:  the integer value, or
6914           -1 if string is NULL (which implies an expansion error)
6915           -2 for an integer interpretation error
6916           expand_string_message is set NULL for an OK integer
6917 */
6918
6919 static int_eximarith_t
6920 expanded_string_integer(uschar *s, BOOL isplus)
6921 {
6922 int_eximarith_t value;
6923 uschar *msg = US"invalid integer \"%s\"";
6924 uschar *endptr;
6925
6926 /* If expansion failed, expand_string_message will be set. */
6927
6928 if (s == NULL) return -1;
6929
6930 /* On an overflow, strtol() returns LONG_MAX or LONG_MIN, and sets errno
6931 to ERANGE. When there isn't an overflow, errno is not changed, at least on some
6932 systems, so we set it zero ourselves. */
6933
6934 errno = 0;
6935 expand_string_message = NULL;               /* Indicates no error */
6936
6937 /* Before Exim 4.64, strings consisting entirely of whitespace compared
6938 equal to 0.  Unfortunately, people actually relied upon that, so preserve
6939 the behaviour explicitly.  Stripping leading whitespace is a harmless
6940 noop change since strtol skips it anyway (provided that there is a number
6941 to find at all). */
6942 if (isspace(*s))
6943   {
6944   while (isspace(*s)) ++s;
6945   if (*s == '\0')
6946     {
6947       DEBUG(D_expand)
6948        debug_printf("treating blank string as number 0\n");
6949       return 0;
6950     }
6951   }
6952
6953 value = strtoll(CS s, CSS &endptr, 10);
6954
6955 if (endptr == s)
6956   {
6957   msg = US"integer expected but \"%s\" found";
6958   }
6959 else if (value < 0 && isplus)
6960   {
6961   msg = US"non-negative integer expected but \"%s\" found";
6962   }
6963 else
6964   {
6965   switch (tolower(*endptr))
6966     {
6967     default:
6968       break;
6969     case 'k':
6970       if (value > EXIM_ARITH_MAX/1024 || value < EXIM_ARITH_MIN/1024) errno = ERANGE;
6971       else value *= 1024;
6972       endptr++;
6973       break;
6974     case 'm':
6975       if (value > EXIM_ARITH_MAX/(1024*1024) || value < EXIM_ARITH_MIN/(1024*1024)) errno = ERANGE;
6976       else value *= 1024*1024;
6977       endptr++;
6978       break;
6979     case 'g':
6980       if (value > EXIM_ARITH_MAX/(1024*1024*1024) || value < EXIM_ARITH_MIN/(1024*1024*1024)) errno = ERANGE;
6981       else value *= 1024*1024*1024;
6982       endptr++;
6983       break;
6984     }
6985   if (errno == ERANGE)
6986     msg = US"absolute value of integer \"%s\" is too large (overflow)";
6987   else
6988     {
6989     while (isspace(*endptr)) endptr++;
6990     if (*endptr == 0) return value;
6991     }
6992   }
6993
6994 expand_string_message = string_sprintf(CS msg, s);
6995 return -2;
6996 }
6997
6998
6999 /*************************************************
7000 **************************************************
7001 *             Stand-alone test program           *
7002 **************************************************
7003 *************************************************/
7004
7005 #ifdef STAND_ALONE
7006
7007
7008 BOOL
7009 regex_match_and_setup(const pcre *re, uschar *subject, int options, int setup)
7010 {
7011 int ovector[3*(EXPAND_MAXN+1)];
7012 int n = pcre_exec(re, NULL, subject, Ustrlen(subject), 0, PCRE_EOPT|options,
7013   ovector, sizeof(ovector)/sizeof(int));
7014 BOOL yield = n >= 0;
7015 if (n == 0) n = EXPAND_MAXN + 1;
7016 if (yield)
7017   {
7018   int nn;
7019   expand_nmax = (setup < 0)? 0 : setup + 1;
7020   for (nn = (setup < 0)? 0 : 2; nn < n*2; nn += 2)
7021     {
7022     expand_nstring[expand_nmax] = subject + ovector[nn];
7023     expand_nlength[expand_nmax++] = ovector[nn+1] - ovector[nn];
7024     }
7025   expand_nmax--;
7026   }
7027 return yield;
7028 }
7029
7030
7031 int main(int argc, uschar **argv)
7032 {
7033 int i;
7034 uschar buffer[1024];
7035
7036 debug_selector = D_v;
7037 debug_file = stderr;
7038 debug_fd = fileno(debug_file);
7039 big_buffer = malloc(big_buffer_size);
7040
7041 for (i = 1; i < argc; i++)
7042   {
7043   if (argv[i][0] == '+')
7044     {
7045     debug_trace_memory = 2;
7046     argv[i]++;
7047     }
7048   if (isdigit(argv[i][0]))
7049     debug_selector = Ustrtol(argv[i], NULL, 0);
7050   else
7051     if (Ustrspn(argv[i], "abcdefghijklmnopqrtsuvwxyz0123456789-.:/") ==
7052         Ustrlen(argv[i]))
7053       {
7054       #ifdef LOOKUP_LDAP
7055       eldap_default_servers = argv[i];
7056       #endif
7057       #ifdef LOOKUP_MYSQL
7058       mysql_servers = argv[i];
7059       #endif
7060       #ifdef LOOKUP_PGSQL
7061       pgsql_servers = argv[i];
7062       #endif
7063       #ifdef EXPERIMENTAL_REDIS
7064       redis_servers = argv[i];
7065       #endif
7066       }
7067   #ifdef EXIM_PERL
7068   else opt_perl_startup = argv[i];
7069   #endif
7070   }
7071
7072 printf("Testing string expansion: debug_level = %d\n\n", debug_level);
7073
7074 expand_nstring[1] = US"string 1....";
7075 expand_nlength[1] = 8;
7076 expand_nmax = 1;
7077
7078 #ifdef EXIM_PERL
7079 if (opt_perl_startup != NULL)
7080   {
7081   uschar *errstr;
7082   printf("Starting Perl interpreter\n");
7083   errstr = init_perl(opt_perl_startup);
7084   if (errstr != NULL)
7085     {
7086     printf("** error in perl_startup code: %s\n", errstr);
7087     return EXIT_FAILURE;
7088     }
7089   }
7090 #endif /* EXIM_PERL */
7091
7092 while (fgets(buffer, sizeof(buffer), stdin) != NULL)
7093   {
7094   void *reset_point = store_get(0);
7095   uschar *yield = expand_string(buffer);
7096   if (yield != NULL)
7097     {
7098     printf("%s\n", yield);
7099     store_reset(reset_point);
7100     }
7101   else
7102     {
7103     if (search_find_defer) printf("search_find deferred\n");
7104     printf("Failed: %s\n", expand_string_message);
7105     if (expand_string_forcedfail) printf("Forced failure\n");
7106     printf("\n");
7107     }
7108   }
7109
7110 search_tidyup();
7111
7112 return 0;
7113 }
7114
7115 #endif
7116
7117 /* vi: aw ai sw=2
7118 */
7119 /* End of expand.c */