Start
[exim.git] / src / src / expand.c
1 /* $Cambridge: exim/src/src/expand.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
2
3 /*************************************************
4 *     Exim - an Internet mail transport agent    *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2004 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10
11 /* Functions for handling string expansion. */
12
13
14 #include "exim.h"
15
16 #ifdef STAND_ALONE
17 #ifndef SUPPORT_CRYPTEQ
18 #define SUPPORT_CRYPTEQ
19 #endif
20 #endif
21
22 #ifdef SUPPORT_CRYPTEQ
23 #ifdef CRYPT_H
24 #include <crypt.h>
25 #endif
26 #ifndef HAVE_CRYPT16
27 extern char* crypt16(char*, char*);
28 #endif
29 #endif
30
31 #ifdef LOOKUP_LDAP
32 #include "lookups/ldap.h"
33 #endif
34
35
36
37 /* Recursively called function */
38
39 static uschar *expand_string_internal(uschar *, BOOL, uschar **, BOOL);
40
41
42
43 /*************************************************
44 *            Local statics and tables            *
45 *************************************************/
46
47 /* Table of item names, and corresponding switch numbers. The names must be in
48 alphabetical order. */
49
50 static uschar *item_table[] = {
51   US"extract",
52   US"hash",
53   US"hmac",
54   US"if",
55   US"length",
56   US"lookup",
57   US"nhash",
58   #ifdef EXIM_PERL
59     US"perl",
60   #endif
61   US"readfile",
62   US"readsocket",
63   US"run",
64   US"sg",
65   US"substr",
66   US"tr" };
67
68 enum {
69   EITEM_EXTRACT,
70   EITEM_HASH,
71   EITEM_HMAC,
72   EITEM_IF,
73   EITEM_LENGTH,
74   EITEM_LOOKUP,
75   EITEM_NHASH,
76   #ifdef EXIM_PERL
77     EITEM_PERL,
78   #endif
79   EITEM_READFILE,
80   EITEM_READSOCK,
81   EITEM_RUN,
82   EITEM_SG,
83   EITEM_SUBSTR,
84   EITEM_TR };
85
86 /* Tables of operator names, and corresponding switch numbers. The names must be
87 in alphabetical order. There are two tables, because underscore is used in some
88 cases to introduce arguments, whereas for other it is part of the name. This is
89 an historical mis-design. */
90
91 static uschar *op_table_underscore[] = {
92   US"from_utf8",
93   US"local_part",
94   US"quote_local_part",
95   US"time_interval"};
96
97 enum {
98   EOP_FROM_UTF8,
99   EOP_LOCAL_PART,
100   EOP_QUOTE_LOCAL_PART,
101   EOP_TIME_INTERVAL };
102
103 static uschar *op_table_main[] = {
104   US"address",
105   US"base62",
106   US"base62d",
107   US"domain",
108   US"escape",
109   US"eval",
110   US"eval10",
111   US"expand",
112   US"h",
113   US"hash",
114   US"hex2b64",
115   US"l",
116   US"lc",
117   US"length",
118   US"mask",
119   US"md5",
120   US"nh",
121   US"nhash",
122   US"quote",
123   US"rfc2047",
124   US"rxquote",
125   US"s",
126   US"sha1",
127   US"stat",
128   US"str2b64",
129   US"strlen",
130   US"substr",
131   US"uc" };
132
133 enum {
134   EOP_ADDRESS =  sizeof(op_table_underscore)/sizeof(uschar *),
135   EOP_BASE62,
136   EOP_BASE62D,
137   EOP_DOMAIN,
138   EOP_ESCAPE,
139   EOP_EVAL,
140   EOP_EVAL10,
141   EOP_EXPAND,
142   EOP_H,
143   EOP_HASH,
144   EOP_HEX2B64,
145   EOP_L,
146   EOP_LC,
147   EOP_LENGTH,
148   EOP_MASK,
149   EOP_MD5,
150   EOP_NH,
151   EOP_NHASH,
152   EOP_QUOTE,
153   EOP_RFC2047,
154   EOP_RXQUOTE,
155   EOP_S,
156   EOP_SHA1,
157   EOP_STAT,
158   EOP_STR2B64,
159   EOP_STRLEN,
160   EOP_SUBSTR,
161   EOP_UC };
162
163
164 /* Table of condition names, and corresponding switch numbers. The names must
165 be in alphabetical order. */
166
167 static uschar *cond_table[] = {
168   US"<",
169   US"<=",
170   US"=",
171   US"==",     /* Backward compatibility */
172   US">",
173   US">=",
174   US"and",
175   US"crypteq",
176   US"def",
177   US"eq",
178   US"eqi",
179   US"exists",
180   US"first_delivery",
181   US"ge",
182   US"gei",
183   US"gt",
184   US"gti",
185   US"isip",
186   US"isip4",
187   US"isip6",
188   US"ldapauth",
189   US"le",
190   US"lei",
191   US"lt",
192   US"lti",
193   US"match",
194   US"match_address",
195   US"match_domain",
196   US"match_local_part",
197   US"or",
198   US"pam",
199   US"pwcheck",
200   US"queue_running",
201   US"radius",
202   US"saslauthd"
203 };
204
205 enum {
206   ECOND_NUM_L,
207   ECOND_NUM_LE,
208   ECOND_NUM_E,
209   ECOND_NUM_EE,
210   ECOND_NUM_G,
211   ECOND_NUM_GE,
212   ECOND_AND,
213   ECOND_CRYPTEQ,
214   ECOND_DEF,
215   ECOND_STR_EQ,
216   ECOND_STR_EQI,
217   ECOND_EXISTS,
218   ECOND_FIRST_DELIVERY,
219   ECOND_STR_GE,
220   ECOND_STR_GEI,
221   ECOND_STR_GT,
222   ECOND_STR_GTI,
223   ECOND_ISIP,
224   ECOND_ISIP4,
225   ECOND_ISIP6,
226   ECOND_LDAPAUTH,
227   ECOND_STR_LE,
228   ECOND_STR_LEI,
229   ECOND_STR_LT,
230   ECOND_STR_LTI,
231   ECOND_MATCH,
232   ECOND_MATCH_ADDRESS,
233   ECOND_MATCH_DOMAIN,
234   ECOND_MATCH_LOCAL_PART,
235   ECOND_OR,
236   ECOND_PAM,
237   ECOND_PWCHECK,
238   ECOND_QUEUE_RUNNING,
239   ECOND_RADIUS,
240   ECOND_SASLAUTHD
241 };
242
243
244 /* Type for main variable table */
245
246 typedef struct {
247   char *name;
248   int   type;
249   void *value;
250 } var_entry;
251
252 /* Type for entries pointing to address/length pairs. Not currently
253 in use. */
254
255 typedef struct {
256   uschar **address;
257   int  *length;
258 } alblock;
259
260 /* Types of table entry */
261
262 enum {
263   vtype_int,            /* value is address of int */
264   vtype_filter_int,     /* ditto, but recognized only when filtering */
265   vtype_ino,            /* value is address of ino_t (not always an int) */
266   vtype_uid,            /* value is address of uid_t (not always an int) */
267   vtype_gid,            /* value is address of gid_t (not always an int) */
268   vtype_stringptr,      /* value is address of pointer to string */
269   vtype_msgbody,        /* as stringptr, but read when first required */
270   vtype_msgbody_end,    /* ditto, the end of the message */
271   vtype_msgheaders,     /* the message's headers */
272   vtype_localpart,      /* extract local part from string */
273   vtype_domain,         /* extract domain from string */
274   vtype_recipients,     /* extract recipients from recipients list */
275                         /* (enabled only during system filtering */
276   vtype_todbsdin,       /* value not used; generate BSD inbox tod */
277   vtype_tode,           /* value not used; generate tod in epoch format */
278   vtype_todf,           /* value not used; generate full tod */
279   vtype_todl,           /* value not used; generate log tod */
280   vtype_todlf,          /* value not used; generate log file datestamp tod */
281   vtype_todzone,        /* value not used; generate time zone only */
282   vtype_todzulu,        /* value not used; generate zulu tod */
283   vtype_reply,          /* value not used; get reply from headers */
284   vtype_pid,            /* value not used; result is pid */
285   vtype_host_lookup,    /* value not used; get host name */
286   vtype_load_avg        /* value not used; result is int from os_getloadavg */
287   };
288
289 /* This table must be kept in alphabetical order. */
290
291 static var_entry var_table[] = {
292   { "acl_c0",              vtype_stringptr,   &acl_var[0] },
293   { "acl_c1",              vtype_stringptr,   &acl_var[1] },
294   { "acl_c2",              vtype_stringptr,   &acl_var[2] },
295   { "acl_c3",              vtype_stringptr,   &acl_var[3] },
296   { "acl_c4",              vtype_stringptr,   &acl_var[4] },
297   { "acl_c5",              vtype_stringptr,   &acl_var[5] },
298   { "acl_c6",              vtype_stringptr,   &acl_var[6] },
299   { "acl_c7",              vtype_stringptr,   &acl_var[7] },
300   { "acl_c8",              vtype_stringptr,   &acl_var[8] },
301   { "acl_c9",              vtype_stringptr,   &acl_var[9] },
302   { "acl_m0",              vtype_stringptr,   &acl_var[10] },
303   { "acl_m1",              vtype_stringptr,   &acl_var[11] },
304   { "acl_m2",              vtype_stringptr,   &acl_var[12] },
305   { "acl_m3",              vtype_stringptr,   &acl_var[13] },
306   { "acl_m4",              vtype_stringptr,   &acl_var[14] },
307   { "acl_m5",              vtype_stringptr,   &acl_var[15] },
308   { "acl_m6",              vtype_stringptr,   &acl_var[16] },
309   { "acl_m7",              vtype_stringptr,   &acl_var[17] },
310   { "acl_m8",              vtype_stringptr,   &acl_var[18] },
311   { "acl_m9",              vtype_stringptr,   &acl_var[19] },
312   { "acl_verify_message",  vtype_stringptr,   &acl_verify_message },
313   { "address_data",        vtype_stringptr,   &deliver_address_data },
314   { "address_file",        vtype_stringptr,   &address_file },
315   { "address_pipe",        vtype_stringptr,   &address_pipe },
316   { "authenticated_id",    vtype_stringptr,   &authenticated_id },
317   { "authenticated_sender",vtype_stringptr,   &authenticated_sender },
318   { "authentication_failed",vtype_int,        &authentication_failed },
319   { "body_linecount",      vtype_int,         &body_linecount },
320   { "body_zerocount",      vtype_int,         &body_zerocount },
321   { "bounce_recipient",    vtype_stringptr,   &bounce_recipient },
322   { "bounce_return_size_limit", vtype_int,    &bounce_return_size_limit },
323   { "caller_gid",          vtype_gid,         &real_gid },
324   { "caller_uid",          vtype_uid,         &real_uid },
325   { "compile_date",        vtype_stringptr,   &version_date },
326   { "compile_number",      vtype_stringptr,   &version_cnumber },
327   { "dnslist_domain",      vtype_stringptr,   &dnslist_domain },
328   { "dnslist_text",        vtype_stringptr,   &dnslist_text },
329   { "dnslist_value",       vtype_stringptr,   &dnslist_value },
330   { "domain",              vtype_stringptr,   &deliver_domain },
331   { "domain_data",         vtype_stringptr,   &deliver_domain_data },
332   { "exim_gid",            vtype_gid,         &exim_gid },
333   { "exim_path",           vtype_stringptr,   &exim_path },
334   { "exim_uid",            vtype_uid,         &exim_uid },
335   { "home",                vtype_stringptr,   &deliver_home },
336   { "host",                vtype_stringptr,   &deliver_host },
337   { "host_address",        vtype_stringptr,   &deliver_host_address },
338   { "host_data",           vtype_stringptr,   &host_data },
339   { "host_lookup_failed",  vtype_int,         &host_lookup_failed },
340   { "inode",               vtype_ino,         &deliver_inode },
341   { "interface_address",   vtype_stringptr,   &interface_address },
342   { "interface_port",      vtype_int,         &interface_port },
343   #ifdef LOOKUP_LDAP
344   { "ldap_dn",             vtype_stringptr,   &eldap_dn },
345   #endif
346   { "load_average",        vtype_load_avg,    NULL },
347   { "local_part",          vtype_stringptr,   &deliver_localpart },
348   { "local_part_data",     vtype_stringptr,   &deliver_localpart_data },
349   { "local_part_prefix",   vtype_stringptr,   &deliver_localpart_prefix },
350   { "local_part_suffix",   vtype_stringptr,   &deliver_localpart_suffix },
351   { "local_scan_data",     vtype_stringptr,   &local_scan_data },
352   { "local_user_gid",      vtype_gid,         &local_user_gid },
353   { "local_user_uid",      vtype_uid,         &local_user_uid },
354   { "localhost_number",    vtype_int,         &host_number },
355   { "mailstore_basename",  vtype_stringptr,   &mailstore_basename },
356   { "message_age",         vtype_int,         &message_age },
357   { "message_body",        vtype_msgbody,     &message_body },
358   { "message_body_end",    vtype_msgbody_end, &message_body_end },
359   { "message_body_size",   vtype_int,         &message_body_size },
360   { "message_headers",     vtype_msgheaders,  NULL },
361   { "message_id",          vtype_stringptr,   &message_id },
362   { "message_size",        vtype_int,         &message_size },
363   { "n0",                  vtype_filter_int,  &filter_n[0] },
364   { "n1",                  vtype_filter_int,  &filter_n[1] },
365   { "n2",                  vtype_filter_int,  &filter_n[2] },
366   { "n3",                  vtype_filter_int,  &filter_n[3] },
367   { "n4",                  vtype_filter_int,  &filter_n[4] },
368   { "n5",                  vtype_filter_int,  &filter_n[5] },
369   { "n6",                  vtype_filter_int,  &filter_n[6] },
370   { "n7",                  vtype_filter_int,  &filter_n[7] },
371   { "n8",                  vtype_filter_int,  &filter_n[8] },
372   { "n9",                  vtype_filter_int,  &filter_n[9] },
373   { "original_domain",     vtype_stringptr,   &deliver_domain_orig },
374   { "original_local_part", vtype_stringptr,   &deliver_localpart_orig },
375   { "originator_gid",      vtype_gid,         &originator_gid },
376   { "originator_uid",      vtype_uid,         &originator_uid },
377   { "parent_domain",       vtype_stringptr,   &deliver_domain_parent },
378   { "parent_local_part",   vtype_stringptr,   &deliver_localpart_parent },
379   { "pid",                 vtype_pid,         NULL },
380   { "primary_hostname",    vtype_stringptr,   &primary_hostname },
381   { "qualify_domain",      vtype_stringptr,   &qualify_domain_sender },
382   { "qualify_recipient",   vtype_stringptr,   &qualify_domain_recipient },
383   { "rcpt_count",          vtype_int,         &rcpt_count },
384   { "rcpt_defer_count",    vtype_int,         &rcpt_defer_count },
385   { "rcpt_fail_count",     vtype_int,         &rcpt_fail_count },
386   { "received_count",      vtype_int,         &received_count },
387   { "received_for",        vtype_stringptr,   &received_for },
388   { "received_protocol",   vtype_stringptr,   &received_protocol },
389   { "recipient_data",      vtype_stringptr,   &recipient_data },
390   { "recipients",          vtype_recipients,  NULL },
391   { "recipients_count",    vtype_int,         &recipients_count },
392   { "reply_address",       vtype_reply,       NULL },
393   { "return_path",         vtype_stringptr,   &return_path },
394   { "return_size_limit",   vtype_int,         &bounce_return_size_limit },
395   { "runrc",               vtype_int,         &runrc },
396   { "self_hostname",       vtype_stringptr,   &self_hostname },
397   { "sender_address",      vtype_stringptr,   &sender_address },
398   { "sender_address_domain", vtype_domain,    &sender_address },
399   { "sender_address_local_part", vtype_localpart, &sender_address },
400   { "sender_data",         vtype_stringptr,   &sender_data },
401   { "sender_fullhost",     vtype_stringptr,   &sender_fullhost },
402   { "sender_helo_name",    vtype_stringptr,   &sender_helo_name },
403   { "sender_host_address", vtype_stringptr,   &sender_host_address },
404   { "sender_host_authenticated",vtype_stringptr, &sender_host_authenticated },
405   { "sender_host_name",    vtype_host_lookup, NULL },
406   { "sender_host_port",    vtype_int,         &sender_host_port },
407   { "sender_ident",        vtype_stringptr,   &sender_ident },
408   { "sender_rcvhost",      vtype_stringptr,   &sender_rcvhost },
409   { "smtp_command_argument", vtype_stringptr, &smtp_command_argument },
410   { "sn0",                 vtype_filter_int,  &filter_sn[0] },
411   { "sn1",                 vtype_filter_int,  &filter_sn[1] },
412   { "sn2",                 vtype_filter_int,  &filter_sn[2] },
413   { "sn3",                 vtype_filter_int,  &filter_sn[3] },
414   { "sn4",                 vtype_filter_int,  &filter_sn[4] },
415   { "sn5",                 vtype_filter_int,  &filter_sn[5] },
416   { "sn6",                 vtype_filter_int,  &filter_sn[6] },
417   { "sn7",                 vtype_filter_int,  &filter_sn[7] },
418   { "sn8",                 vtype_filter_int,  &filter_sn[8] },
419   { "sn9",                 vtype_filter_int,  &filter_sn[9] },
420   { "spool_directory",     vtype_stringptr,   &spool_directory },
421   { "thisaddress",         vtype_stringptr,   &filter_thisaddress },
422   { "tls_certificate_verified", vtype_int,    &tls_certificate_verified },
423   { "tls_cipher",          vtype_stringptr,   &tls_cipher },
424   { "tls_peerdn",          vtype_stringptr,   &tls_peerdn },
425   { "tod_bsdinbox",        vtype_todbsdin,    NULL },
426   { "tod_epoch",           vtype_tode,        NULL },
427   { "tod_full",            vtype_todf,        NULL },
428   { "tod_log",             vtype_todl,        NULL },
429   { "tod_logfile",         vtype_todlf,       NULL },
430   { "tod_zone",            vtype_todzone,     NULL },
431   { "tod_zulu",            vtype_todzulu,     NULL },
432   { "value",               vtype_stringptr,   &lookup_value },
433   { "version_number",      vtype_stringptr,   &version_string },
434   { "warn_message_delay",  vtype_stringptr,   &warnmsg_delay },
435   { "warn_message_recipient",vtype_stringptr, &warnmsg_recipients },
436   { "warn_message_recipients",vtype_stringptr,&warnmsg_recipients },
437   { "warnmsg_delay",       vtype_stringptr,   &warnmsg_delay },
438   { "warnmsg_recipient",   vtype_stringptr,   &warnmsg_recipients },
439   { "warnmsg_recipients",  vtype_stringptr,   &warnmsg_recipients }
440 };
441
442 static int var_table_size = sizeof(var_table)/sizeof(var_entry);
443 static uschar var_buffer[256];
444 static BOOL malformed_header;
445
446 /* For textual hashes */
447
448 static char *hashcodes = "abcdefghijklmnopqrtsuvwxyz"
449                          "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
450                          "0123456789";
451
452 enum { HMAC_MD5, HMAC_SHA1 };
453
454 /* For numeric hashes */
455
456 static unsigned int prime[] = {
457   2,   3,   5,   7,  11,  13,  17,  19,  23,  29,
458  31,  37,  41,  43,  47,  53,  59,  61,  67,  71,
459  73,  79,  83,  89,  97, 101, 103, 107, 109, 113};
460
461 /* For printing modes in symbolic form */
462
463 static uschar *mtable_normal[] =
464   { US"---", US"--x", US"-w-", US"-wx", US"r--", US"r-x", US"rw-", US"rwx" };
465
466 static uschar *mtable_setid[] =
467   { US"--S", US"--s", US"-wS", US"-ws", US"r-S", US"r-s", US"rwS", US"rws" };
468
469 static uschar *mtable_sticky[] =
470   { US"--T", US"--t", US"-wT", US"-wt", US"r-T", US"r-t", US"rwT", US"rwt" };
471
472
473
474 /*************************************************
475 *           Tables for UTF-8 support             *
476 *************************************************/
477
478 /* Table of the number of extra characters, indexed by the first character
479 masked with 0x3f. The highest number for a valid UTF-8 character is in fact
480 0x3d. */
481
482 static uschar utf8_table1[] = {
483   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
484   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
485   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
486   3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
487
488 /* These are the masks for the data bits in the first byte of a character,
489 indexed by the number of additional bytes. */
490
491 static int utf8_table2[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
492
493 /* Get the next UTF-8 character, advancing the pointer. */
494
495 #define GETUTF8INC(c, ptr) \
496   c = *ptr++; \
497   if ((c & 0xc0) == 0xc0) \
498     { \
499     int a = utf8_table1[c & 0x3f];  /* Number of additional bytes */ \
500     int s = 6*a; \
501     c = (c & utf8_table2[a]) << s; \
502     while (a-- > 0) \
503       { \
504       s -= 6; \
505       c |= (*ptr++ & 0x3f) << s; \
506       } \
507     }
508
509
510 /*************************************************
511 *           Binary chop search on a table        *
512 *************************************************/
513
514 /* This is used for matching expansion items and operators.
515
516 Arguments:
517   name        the name that is being sought
518   table       the table to search
519   table_size  the number of items in the table
520
521 Returns:      the offset in the table, or -1
522 */
523
524 static int
525 chop_match(uschar *name, uschar **table, int table_size)
526 {
527 uschar **bot = table;
528 uschar **top = table + table_size;
529
530 while (top > bot)
531   {
532   uschar **mid = bot + (top - bot)/2;
533   int c = Ustrcmp(name, *mid);
534   if (c == 0) return mid - table;
535   if (c > 0) bot = mid + 1; else top = mid;
536   }
537
538 return -1;
539 }
540
541
542
543 /*************************************************
544 *          Check a condition string              *
545 *************************************************/
546
547 /* This function is called to expand a string, and test the result for a "true"
548 or "false" value. Failure of the expansion yields FALSE; logged unless it was a
549 forced fail or lookup defer. All store used by the function can be released on
550 exit.
551
552 Arguments:
553   condition     the condition string
554   m1            text to be incorporated in panic error
555   m2            ditto
556
557 Returns:        TRUE if condition is met, FALSE if not
558 */
559
560 BOOL
561 expand_check_condition(uschar *condition, uschar *m1, uschar *m2)
562 {
563 int rc;
564 void *reset_point = store_get(0);
565 uschar *ss = expand_string(condition);
566 if (ss == NULL)
567   {
568   if (!expand_string_forcedfail && !search_find_defer)
569     log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand condition \"%s\" "
570       "for %s %s: %s", condition, m1, m2, expand_string_message);
571   return FALSE;
572   }
573 rc = ss[0] != 0 && Ustrcmp(ss, "0") != 0 && strcmpic(ss, US"no") != 0 &&
574   strcmpic(ss, US"false") != 0;
575 store_reset(reset_point);
576 return rc;
577 }
578
579
580
581 /*************************************************
582 *             Pick out a name from a string      *
583 *************************************************/
584
585 /* If the name is too long, it is silently truncated.
586
587 Arguments:
588   name      points to a buffer into which to put the name
589   max       is the length of the buffer
590   s         points to the first alphabetic character of the name
591   extras    chars other than alphanumerics to permit
592
593 Returns:    pointer to the first character after the name
594
595 Note: The test for *s != 0 in the while loop is necessary because
596 Ustrchr() yields non-NULL if the character is zero (which is not something
597 I expected). */
598
599 static uschar *
600 read_name(uschar *name, int max, uschar *s, uschar *extras)
601 {
602 int ptr = 0;
603 while (*s != 0 && (isalnum(*s) || Ustrchr(extras, *s) != NULL))
604   {
605   if (ptr < max-1) name[ptr++] = *s;
606   s++;
607   }
608 name[ptr] = 0;
609 return s;
610 }
611
612
613
614 /*************************************************
615 *     Pick out the rest of a header name         *
616 *************************************************/
617
618 /* A variable name starting $header_ (or just $h_ for those who like
619 abbreviations) might not be the complete header name because headers can
620 contain any printing characters in their names, except ':'. This function is
621 called to read the rest of the name, chop h[eader]_ off the front, and put ':'
622 on the end, if the name was terminated by white space.
623
624 Arguments:
625   name      points to a buffer in which the name read so far exists
626   max       is the length of the buffer
627   s         points to the first character after the name so far, i.e. the
628             first non-alphameric character after $header_xxxxx
629
630 Returns:    a pointer to the first character after the header name
631 */
632
633 static uschar *
634 read_header_name(uschar *name, int max, uschar *s)
635 {
636 int prelen = Ustrchr(name, '_') - name + 1;
637 int ptr = Ustrlen(name) - prelen;
638 if (ptr > 0) memmove(name, name+prelen, ptr);
639 while (mac_isgraph(*s) && *s != ':')
640   {
641   if (ptr < max-1) name[ptr++] = *s;
642   s++;
643   }
644 if (*s == ':') s++;
645 name[ptr++] = ':';
646 name[ptr] = 0;
647 return s;
648 }
649
650
651
652 /*************************************************
653 *           Pick out a number from a string      *
654 *************************************************/
655
656 /* Arguments:
657   n     points to an integer into which to put the number
658   s     points to the first digit of the number
659
660 Returns:  a pointer to the character after the last digit
661 */
662
663 static uschar *
664 read_number(int *n, uschar *s)
665 {
666 *n = 0;
667 while (isdigit(*s)) *n = *n * 10 + (*s++ - '0');
668 return s;
669 }
670
671
672
673 /*************************************************
674 *        Extract keyed subfield from a string    *
675 *************************************************/
676
677 /* The yield is in dynamic store; NULL means that the key was not found.
678
679 Arguments:
680   key       points to the name of the key
681   s         points to the string from which to extract the subfield
682
683 Returns:    NULL if the subfield was not found, or
684             a pointer to the subfield's data
685 */
686
687 static uschar *
688 expand_getkeyed(uschar *key, uschar *s)
689 {
690 int length = Ustrlen(key);
691 while (isspace(*s)) s++;
692
693 /* Loop to search for the key */
694
695 while (*s != 0)
696   {
697   int dkeylength;
698   uschar *data;
699   uschar *dkey = s;
700
701   while (*s != 0 && *s != '=' && !isspace(*s)) s++;
702   dkeylength = s - dkey;
703   while (isspace(*s)) s++;
704   if (*s == '=') while (isspace((*(++s))));
705
706   data = string_dequote(&s);
707   if (length == dkeylength && strncmpic(key, dkey, length) == 0)
708     return data;
709
710   while (isspace(*s)) s++;
711   }
712
713 return NULL;
714 }
715
716
717
718
719 /*************************************************
720 *   Extract numbered subfield from string        *
721 *************************************************/
722
723 /* Extracts a numbered field from a string that is divided by tokens - for
724 example a line from /etc/passwd is divided by colon characters.  First field is
725 numbered one.  Negative arguments count from the right. Zero returns the whole
726 string. Returns NULL if there are insufficient tokens in the string
727
728 ***WARNING***
729 Modifies final argument - this is a dynamically generated string, so that's OK.
730
731 Arguments:
732   field       number of field to be extracted,
733                 first field = 1, whole string = 0, last field = -1
734   separators  characters that are used to break string into tokens
735   s           points to the string from which to extract the subfield
736
737 Returns:      NULL if the field was not found,
738               a pointer to the field's data inside s (modified to add 0)
739 */
740
741 static uschar *
742 expand_gettokened (int field, uschar *separators, uschar *s)
743 {
744 int sep = 1;
745 int count;
746 uschar *ss = s;
747 uschar *fieldtext = NULL;
748
749 if (field == 0) return s;
750
751 /* Break the line up into fields in place; for field > 0 we stop when we have
752 done the number of fields we want. For field < 0 we continue till the end of
753 the string, counting the number of fields. */
754
755 count = (field > 0)? field : INT_MAX;
756
757 while (count-- > 0)
758   {
759   size_t len;
760
761   /* Previous field was the last one in the string. For a positive field
762   number, this means there are not enough fields. For a negative field number,
763   check that there are enough, and scan back to find the one that is wanted. */
764
765   if (sep == 0)
766     {
767     if (field > 0 || (-field) > (INT_MAX - count - 1)) return NULL;
768     if ((-field) == (INT_MAX - count - 1)) return s;
769     while (field++ < 0)
770       {
771       ss--;
772       while (ss[-1] != 0) ss--;
773       }
774     fieldtext = ss;
775     break;
776     }
777
778   /* Previous field was not last in the string; save its start and put a
779   zero at its end. */
780
781   fieldtext = ss;
782   len = Ustrcspn(ss, separators);
783   sep = ss[len];
784   ss[len] = 0;
785   ss += len + 1;
786   }
787
788 return fieldtext;
789 }
790
791
792
793 /*************************************************
794 *        Extract a substring from a string       *
795 *************************************************/
796
797 /* Perform the ${substr or ${length expansion operations.
798
799 Arguments:
800   subject     the input string
801   value1      the offset from the start of the input string to the start of
802                 the output string; if negative, count from the right.
803   value2      the length of the output string, or negative (-1) for unset
804                 if value1 is positive, unset means "all after"
805                 if value1 is negative, unset means "all before"
806   len         set to the length of the returned string
807
808 Returns:      pointer to the output string, or NULL if there is an error
809 */
810
811 static uschar *
812 extract_substr(uschar *subject, int value1, int value2, int *len)
813 {
814 int sublen = Ustrlen(subject);
815
816 if (value1 < 0)    /* count from right */
817   {
818   value1 += sublen;
819
820   /* If the position is before the start, skip to the start, and adjust the
821   length. If the length ends up negative, the substring is null because nothing
822   can precede. This falls out naturally when the length is unset, meaning "all
823   to the left". */
824
825   if (value1 < 0)
826     {
827     value2 += value1;
828     if (value2 < 0) value2 = 0;
829     value1 = 0;
830     }
831
832   /* Otherwise an unset length => characters before value1 */
833
834   else if (value2 < 0)
835     {
836     value2 = value1;
837     value1 = 0;
838     }
839   }
840
841 /* For a non-negative offset, if the starting position is past the end of the
842 string, the result will be the null string. Otherwise, an unset length means
843 "rest"; just set it to the maximum - it will be cut down below if necessary. */
844
845 else
846   {
847   if (value1 > sublen)
848     {
849     value1 = sublen;
850     value2 = 0;
851     }
852   else if (value2 < 0) value2 = sublen;
853   }
854
855 /* Cut the length down to the maximum possible for the offset value, and get
856 the required characters. */
857
858 if (value1 + value2 > sublen) value2 = sublen - value1;
859 *len = value2;
860 return subject + value1;
861 }
862
863
864
865
866 /*************************************************
867 *            Old-style hash of a string          *
868 *************************************************/
869
870 /* Perform the ${hash expansion operation.
871
872 Arguments:
873   subject     the input string (an expanded substring)
874   value1      the length of the output string; if greater or equal to the
875                 length of the input string, the input string is returned
876   value2      the number of hash characters to use, or 26 if negative
877   len         set to the length of the returned string
878
879 Returns:      pointer to the output string, or NULL if there is an error
880 */
881
882 static uschar *
883 compute_hash(uschar *subject, int value1, int value2, int *len)
884 {
885 int sublen = Ustrlen(subject);
886
887 if (value2 < 0) value2 = 26;
888 else if (value2 > Ustrlen(hashcodes))
889   {
890   expand_string_message =
891     string_sprintf("hash count \"%d\" too big", value2);
892   return NULL;
893   }
894
895 /* Calculate the hash text. We know it is shorter than the original string, so
896 can safely place it in subject[] (we know that subject is always itself an
897 expanded substring). */
898
899 if (value1 < sublen)
900   {
901   int c;
902   int i = 0;
903   int j = value1;
904   while ((c = (subject[j])) != 0)
905     {
906     int shift = (c + j++) & 7;
907     subject[i] ^= (c << shift) | (c >> (8-shift));
908     if (++i >= value1) i = 0;
909     }
910   for (i = 0; i < value1; i++)
911     subject[i] = hashcodes[(subject[i]) % value2];
912   }
913 else value1 = sublen;
914
915 *len = value1;
916 return subject;
917 }
918
919
920
921
922 /*************************************************
923 *             Numeric hash of a string           *
924 *************************************************/
925
926 /* Perform the ${nhash expansion operation. The first characters of the
927 string are treated as most important, and get the highest prime numbers.
928
929 Arguments:
930   subject     the input string
931   value1      the maximum value of the first part of the result
932   value2      the maximum value of the second part of the result,
933                 or negative to produce only a one-part result
934   len         set to the length of the returned string
935
936 Returns:  pointer to the output string, or NULL if there is an error.
937 */
938
939 static uschar *
940 compute_nhash (uschar *subject, int value1, int value2, int *len)
941 {
942 uschar *s = subject;
943 int i = 0;
944 unsigned long int total = 0; /* no overflow */
945
946 while (*s != 0)
947   {
948   if (i == 0) i = sizeof(prime)/sizeof(int) - 1;
949   total += prime[i--] * (unsigned int)(*s++);
950   }
951
952 /* If value2 is unset, just compute one number */
953
954 if (value2 < 0)
955   {
956   s = string_sprintf("%d", total % value1);
957   }
958
959 /* Otherwise do a div/mod hash */
960
961 else
962   {
963   total = total % (value1 * value2);
964   s = string_sprintf("%d/%d", total/value2, total % value2);
965   }
966
967 *len = Ustrlen(s);
968 return s;
969 }
970
971
972
973
974
975 /*************************************************
976 *     Find the value of a header or headers      *
977 *************************************************/
978
979 /* Multiple instances of the same header get concatenated, and this function
980 can also return a concatenation of all the header lines. When concatenating
981 specific headers that contain lists of addresses, a comma is inserted between
982 them. Otherwise we use a straight concatenation. Because some messages can have
983 pathologically large number of lines, there is a limit on the length that is
984 returned. Also, to avoid massive store use which would result from using
985 string_cat() as it copies and extends strings, we do a preliminary pass to find
986 out exactly how much store will be needed. On "normal" messages this will be
987 pretty trivial.
988
989 Arguments:
990   name          the name of the header, without the leading $header_ or $h_,
991                 or NULL if a concatenation of all headers is required
992   exists_only   TRUE if called from a def: test; don't need to build a string;
993                 just return a string that is not "" and not "0" if the header
994                 exists
995   newsize       return the size of memory block that was obtained; may be NULL
996                 if exists_only is TRUE
997   want_raw      TRUE if called for $rh_ or $rheader_ variables; no processing,
998                 other than concatenating, will be done on the header
999   charset       name of charset to translate MIME words to; used only if
1000                 want_raw is false; if NULL, no translation is done (this is
1001                 used for $bh_ and $bheader_)
1002
1003 Returns:        NULL if the header does not exist, else a pointer to a new
1004                 store block
1005 */
1006
1007 static uschar *
1008 find_header(uschar *name, BOOL exists_only, int *newsize, BOOL want_raw,
1009   uschar *charset)
1010 {
1011 BOOL found = name == NULL;
1012 int comma = 0;
1013 int len = found? 0 : Ustrlen(name);
1014 int i;
1015 uschar *yield = NULL;
1016 uschar *ptr = NULL;
1017
1018 /* Loop for two passes - saves code repetition */
1019
1020 for (i = 0; i < 2; i++)
1021   {
1022   int size = 0;
1023   header_line *h;
1024
1025   for (h = header_list; size < header_insert_maxlen && h != NULL; h = h->next)
1026     {
1027     if (h->type != htype_old && h->text != NULL)  /* NULL => Received: placeholder */
1028       {
1029       if (name == NULL || (len <= h->slen && strncmpic(name, h->text, len) == 0))
1030         {
1031         int ilen;
1032         uschar *t;
1033
1034         if (exists_only) return US"1";      /* don't need actual string */
1035         found = TRUE;
1036         t = h->text + len;                  /* text to insert */
1037         if (!want_raw)                      /* unless wanted raw, */
1038           while (isspace(*t)) t++;          /* remove leading white space */
1039         ilen = h->slen - (t - h->text);     /* length to insert */
1040
1041         /* Set comma = 1 if handling a single header and it's one of those
1042         that contains an address list, except when asked for raw headers. Only
1043         need to do this once. */
1044
1045         if (!want_raw && name != NULL && comma == 0 &&
1046             Ustrchr("BCFRST", h->type) != NULL)
1047           comma = 1;
1048
1049         /* First pass - compute total store needed; second pass - compute
1050         total store used, including this header. */
1051
1052         size += ilen + comma;
1053
1054         /* Second pass - concatentate the data, up to a maximum. Note that
1055         the loop stops when size hits the limit. */
1056
1057         if (i != 0)
1058           {
1059           if (size > header_insert_maxlen)
1060             {
1061             ilen -= size - header_insert_maxlen;
1062             comma = 0;
1063             }
1064           Ustrncpy(ptr, t, ilen);
1065           ptr += ilen;
1066           if (comma != 0 && ilen > 0)
1067             {
1068             ptr[-1] = ',';
1069             *ptr++ = '\n';
1070             }
1071           }
1072         }
1073       }
1074     }
1075
1076   /* At end of first pass, truncate size if necessary, and get the buffer
1077   to hold the data, returning the buffer size. */
1078
1079   if (i == 0)
1080     {
1081     if (!found) return NULL;
1082     if (size > header_insert_maxlen) size = header_insert_maxlen;
1083     *newsize = size + 1;
1084     ptr = yield = store_get(*newsize);
1085     }
1086   }
1087
1088 /* Remove a redundant added comma if present */
1089
1090 if (comma != 0 && ptr > yield) ptr -= 2;
1091
1092 /* That's all we do for raw header expansion. */
1093
1094 if (want_raw)
1095   {
1096   *ptr = 0;
1097   }
1098
1099 /* Otherwise, we remove trailing whitespace, including newlines. Then we do RFC
1100 2047 decoding, translating the charset if requested. The rfc2047_decode2()
1101 function can return an error with decoded data if the charset translation
1102 fails. If decoding fails, it returns NULL. */
1103
1104 else
1105   {
1106   uschar *decoded, *error;
1107   while (ptr > yield && isspace(ptr[-1])) ptr--;
1108   *ptr = 0;
1109   decoded = rfc2047_decode2(yield, TRUE, charset, '?', NULL, newsize, &error);
1110   if (error != NULL)
1111     {
1112     DEBUG(D_any) debug_printf("*** error in RFC 2047 decoding: %s\n"
1113       "    input was: %s\n", error, yield);
1114     }
1115   if (decoded != NULL) yield = decoded;
1116   }
1117
1118 return yield;
1119 }
1120
1121
1122
1123
1124 /*************************************************
1125 *               Find value of a variable         *
1126 *************************************************/
1127
1128 /* The table of variables is kept in alphabetic order, so we can search it
1129 using a binary chop. The "choplen" variable is nothing to do with the binary
1130 chop.
1131
1132 Arguments:
1133   name          the name of the variable being sought
1134   exists_only   TRUE if this is a def: test; passed on to find_header()
1135   skipping      TRUE => skip any processing evaluation; this is not the same as
1136                   exists_only because def: may test for values that are first
1137                   evaluated here
1138   newsize       pointer to an int which is initially zero; if the answer is in
1139                 a new memory buffer, *newsize is set to its size
1140
1141 Returns:        NULL if the variable does not exist, or
1142                 a pointer to the variable's contents, or
1143                 something non-NULL if exists_only is TRUE
1144 */
1145
1146 static uschar *
1147 find_variable(uschar *name, BOOL exists_only, BOOL skipping, int *newsize)
1148 {
1149 int first = 0;
1150 int last = var_table_size;
1151
1152 while (last > first)
1153   {
1154   uschar *s, *domain;
1155   uschar **ss;
1156   int middle = (first + last)/2;
1157   int c = Ustrcmp(name, var_table[middle].name);
1158
1159   if (c > 0) { first = middle + 1; continue; }
1160   if (c < 0) { last = middle; continue; }
1161
1162   /* Found an existing variable. If in skipping state, the value isn't needed,
1163   and we want to avoid processing (such as looking up up the host name). */
1164
1165   if (skipping) return US"";
1166
1167   switch (var_table[middle].type)
1168     {
1169     case vtype_filter_int:
1170     if (!filter_running) return NULL;
1171     /* Fall through */
1172
1173     case vtype_int:
1174     sprintf(CS var_buffer, "%d", *(int *)(var_table[middle].value)); /* Integer */
1175     return var_buffer;
1176
1177     case vtype_ino:
1178     sprintf(CS var_buffer, "%ld", (long int)(*(ino_t *)(var_table[middle].value))); /* Inode */
1179     return var_buffer;
1180
1181     case vtype_gid:
1182     sprintf(CS var_buffer, "%ld", (long int)(*(gid_t *)(var_table[middle].value))); /* gid */
1183     return var_buffer;
1184
1185     case vtype_uid:
1186     sprintf(CS var_buffer, "%ld", (long int)(*(uid_t *)(var_table[middle].value))); /* uid */
1187     return var_buffer;
1188
1189     case vtype_stringptr:                      /* Pointer to string */
1190     s = *((uschar **)(var_table[middle].value));
1191     return (s == NULL)? US"" : s;
1192
1193     case vtype_pid:
1194     sprintf(CS var_buffer, "%d", (int)getpid()); /* pid */
1195     return var_buffer;
1196
1197     case vtype_load_avg:
1198     sprintf(CS var_buffer, "%d", os_getloadavg()); /* load_average */
1199     return var_buffer;
1200
1201     case vtype_host_lookup:                    /* Lookup if not done so */
1202     if (sender_host_name == NULL && sender_host_address != NULL &&
1203         !host_lookup_failed && host_name_lookup() == OK)
1204       host_build_sender_fullhost();
1205     return (sender_host_name == NULL)? US"" : sender_host_name;
1206
1207     case vtype_localpart:                      /* Get local part from address */
1208     s = *((uschar **)(var_table[middle].value));
1209     if (s == NULL) return US"";
1210     domain = Ustrrchr(s, '@');
1211     if (domain == NULL) return s;
1212     if (domain - s > sizeof(var_buffer) - 1)
1213       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "local part longer than %d in "
1214         "string expansion", sizeof(var_buffer));
1215     Ustrncpy(var_buffer, s, domain - s);
1216     var_buffer[domain - s] = 0;
1217     return var_buffer;
1218
1219     case vtype_domain:                         /* Get domain from address */
1220     s = *((uschar **)(var_table[middle].value));
1221     if (s == NULL) return US"";
1222     domain = Ustrrchr(s, '@');
1223     return (domain == NULL)? US"" : domain + 1;
1224
1225     case vtype_msgheaders:
1226     return find_header(NULL, exists_only, newsize, FALSE, NULL);
1227
1228     case vtype_msgbody:                        /* Pointer to msgbody string */
1229     case vtype_msgbody_end:                    /* Ditto, the end of the msg */
1230     ss = (uschar **)(var_table[middle].value);
1231     if (*ss == NULL && deliver_datafile >= 0)  /* Read body when needed */
1232       {
1233       uschar *body;
1234       int start_offset = SPOOL_DATA_START_OFFSET;
1235       int len = message_body_visible;
1236       if (len > message_size) len = message_size;
1237       *ss = body = store_malloc(len+1);
1238       body[0] = 0;
1239       if (var_table[middle].type == vtype_msgbody_end)
1240         {
1241         struct stat statbuf;
1242         if (fstat(deliver_datafile, &statbuf) == 0)
1243           {
1244           start_offset = statbuf.st_size - len;
1245           if (start_offset < SPOOL_DATA_START_OFFSET)
1246             start_offset = SPOOL_DATA_START_OFFSET;
1247           }
1248         }
1249       lseek(deliver_datafile, start_offset, SEEK_SET);
1250       len = read(deliver_datafile, body, len);
1251       if (len > 0)
1252         {
1253         body[len] = 0;
1254         while (len > 0)
1255           {
1256           if (body[--len] == '\n' || body[len] == 0) body[len] = ' ';
1257           }
1258         }
1259       }
1260     return (*ss == NULL)? US"" : *ss;
1261
1262     case vtype_todbsdin:                       /* BSD inbox time of day */
1263     return tod_stamp(tod_bsdin);
1264
1265     case vtype_tode:                           /* Unix epoch time of day */
1266     return tod_stamp(tod_epoch);
1267
1268     case vtype_todf:                           /* Full time of day */
1269     return tod_stamp(tod_full);
1270
1271     case vtype_todl:                           /* Log format time of day */
1272     return tod_stamp(tod_log_bare);            /* (without timezone) */
1273
1274     case vtype_todzone:                        /* Time zone offset only */
1275     return tod_stamp(tod_zone);
1276
1277     case vtype_todzulu:                        /* Zulu time */
1278     return tod_stamp(tod_zulu);
1279
1280     case vtype_todlf:                          /* Log file datestamp tod */
1281     return tod_stamp(tod_log_datestamp);
1282
1283     case vtype_reply:                          /* Get reply address */
1284     s = find_header(US"reply-to:", exists_only, newsize, FALSE,
1285       headers_charset);
1286     if (s == NULL || *s == 0)
1287       s = find_header(US"from:", exists_only, newsize, FALSE, headers_charset);
1288     return (s == NULL)? US"" : s;
1289
1290     /* A recipients list is available only during system message filtering,
1291     during ACL processing after DATA, and while expanding pipe commands
1292     generated from a system filter, but not elsewhere. */
1293
1294     case vtype_recipients:
1295     if (!enable_dollar_recipients) return NULL; else
1296       {
1297       int size = 128;
1298       int ptr = 0;
1299       int i;
1300       s = store_get(size);
1301       for (i = 0; i < recipients_count; i++)
1302         {
1303         if (i != 0) s = string_cat(s, &size, &ptr, US", ", 2);
1304         s = string_cat(s, &size, &ptr, recipients_list[i].address,
1305           Ustrlen(recipients_list[i].address));
1306         }
1307       s[ptr] = 0;     /* string_cat() leaves room */
1308       }
1309     return s;
1310     }
1311   }
1312
1313 return NULL;          /* Unknown variable name */
1314 }
1315
1316
1317
1318
1319 /*************************************************
1320 *           Read and expand substrings           *
1321 *************************************************/
1322
1323 /* This function is called to read and expand argument substrings for various
1324 expansion items. Some have a minimum requirement that is less than the maximum;
1325 in these cases, the first non-present one is set to NULL.
1326
1327 Arguments:
1328   sub        points to vector of pointers to set
1329   n          maximum number of substrings
1330   m          minimum required
1331   sptr       points to current string pointer
1332   skipping   the skipping flag
1333   check_end  if TRUE, check for final '}'
1334   name       name of item, for error message
1335
1336 Returns:     0 OK; string pointer updated
1337              1 curly bracketing error (too few arguments)
1338              2 too many arguments (only if check_end is set); message set
1339              3 other error (expansion failure)
1340 */
1341
1342 static int
1343 read_subs(uschar **sub, int n, int m, uschar **sptr, BOOL skipping,
1344   BOOL check_end, uschar *name)
1345 {
1346 int i;
1347 uschar *s = *sptr;
1348
1349 while (isspace(*s)) s++;
1350 for (i = 0; i < n; i++)
1351   {
1352   if (*s != '{')
1353     {
1354     if (i < m) return 1;
1355     sub[i] = NULL;
1356     break;
1357     }
1358   sub[i] = expand_string_internal(s+1, TRUE, &s, skipping);
1359   if (sub[i] == NULL) return 3;
1360   if (*s++ != '}') return 1;
1361   while (isspace(*s)) s++;
1362   }
1363 if (check_end && *s++ != '}')
1364   {
1365   if (s[-1] == '{')
1366     {
1367     expand_string_message = string_sprintf("Too many arguments for \"%s\" "
1368       "(max is %d)", name, n);
1369     return 2;
1370     }
1371   return 1;
1372   }
1373
1374 *sptr = s;
1375 return 0;
1376 }
1377
1378
1379
1380
1381 /*************************************************
1382 *        Read and evaluate a condition           *
1383 *************************************************/
1384
1385 /*
1386 Arguments:
1387   s        points to the start of the condition text
1388   yield    points to a BOOL to hold the result of the condition test;
1389            if NULL, we are just reading through a condition that is
1390            part of an "or" combination to check syntax, or in a state
1391            where the answer isn't required
1392
1393 Returns:   a pointer to the first character after the condition, or
1394            NULL after an error
1395 */
1396
1397 static uschar *
1398 eval_condition(uschar *s, BOOL *yield)
1399 {
1400 BOOL testfor = TRUE;
1401 BOOL tempcond, combined_cond;
1402 BOOL *subcondptr;
1403 int i, rc, cond_type, roffset;
1404 int num[2];
1405 struct stat statbuf;
1406 uschar name[256];
1407 uschar *sub[4];
1408
1409 const pcre *re;
1410 const uschar *rerror;
1411
1412 for (;;)
1413   {
1414   while (isspace(*s)) s++;
1415   if (*s == '!') { testfor = !testfor; s++; } else break;
1416   }
1417
1418 /* Numeric comparisons are symbolic */
1419
1420 if (*s == '=' || *s == '>' || *s == '<')
1421   {
1422   int p = 0;
1423   name[p++] = *s++;
1424   if (*s == '=')
1425     {
1426     name[p++] = '=';
1427     s++;
1428     }
1429   name[p] = 0;
1430   }
1431
1432 /* All other conditions are named */
1433
1434 else s = read_name(name, 256, s, US"_");
1435
1436 /* If we haven't read a name, it means some non-alpha character is first. */
1437
1438 if (name[0] == 0)
1439   {
1440   expand_string_message = string_sprintf("condition name expected, "
1441     "but found \"%.16s\"", s);
1442   return NULL;
1443   }
1444
1445 /* Find which condition we are dealing with, and switch on it */
1446
1447 cond_type = chop_match(name, cond_table, sizeof(cond_table)/sizeof(uschar *));
1448 switch(cond_type)
1449   {
1450   /* def: tests for a non-zero or non-NULL variable, or for an existing
1451   header */
1452
1453   case ECOND_DEF:
1454   if (*s != ':')
1455     {
1456     expand_string_message = US"\":\" expected after \"def\"";
1457     return NULL;
1458     }
1459
1460   s = read_name(name, 256, s+1, US"_");
1461
1462   /* Test for a header's existence */
1463
1464   if (Ustrncmp(name, "h_", 2) == 0 ||
1465       Ustrncmp(name, "rh_", 3) == 0 ||
1466       Ustrncmp(name, "bh_", 3) == 0 ||
1467       Ustrncmp(name, "header_", 7) == 0 ||
1468       Ustrncmp(name, "rheader_", 8) == 0 ||
1469       Ustrncmp(name, "bheader_", 8) == 0)
1470     {
1471     s = read_header_name(name, 256, s);
1472     if (yield != NULL) *yield =
1473       (find_header(name, TRUE, NULL, FALSE, NULL) != NULL) == testfor;
1474     }
1475
1476   /* Test for a variable's having a non-empty value. If yield == NULL we
1477   are in a skipping state, and don't care about the answer. */
1478
1479   else
1480     {
1481     uschar *value = find_variable(name, TRUE, yield == NULL, NULL);
1482     if (value == NULL)
1483       {
1484       expand_string_message = (name[0] == 0)?
1485         string_sprintf("variable name omitted after \"def:\"") :
1486         string_sprintf("unknown variable \"%s\" after \"def:\"", name);
1487       return NULL;
1488       }
1489     if (yield != NULL)
1490       *yield = (value[0] != 0 && Ustrcmp(value, "0") != 0) == testfor;
1491     }
1492
1493   return s;
1494
1495
1496   /* first_delivery tests for first delivery attempt */
1497
1498   case ECOND_FIRST_DELIVERY:
1499   if (yield != NULL) *yield = deliver_firsttime == testfor;
1500   return s;
1501
1502
1503   /* queue_running tests for any process started by a queue runner */
1504
1505   case ECOND_QUEUE_RUNNING:
1506   if (yield != NULL) *yield = (queue_run_pid != (pid_t)0) == testfor;
1507   return s;
1508
1509
1510   /* exists:  tests for file existence
1511        isip:  tests for any IP address
1512       isip4:  tests for an IPv4 address
1513       isip6:  tests for an IPv6 address
1514         pam:  does PAM authentication
1515      radius:  does RADIUS authentication
1516    ldapauth:  does LDAP authentication
1517     pwcheck:  does Cyrus SASL pwcheck authentication
1518   */
1519
1520   case ECOND_EXISTS:
1521   case ECOND_ISIP:
1522   case ECOND_ISIP4:
1523   case ECOND_ISIP6:
1524   case ECOND_PAM:
1525   case ECOND_RADIUS:
1526   case ECOND_LDAPAUTH:
1527   case ECOND_PWCHECK:
1528
1529   while (isspace(*s)) s++;
1530   if (*s != '{') goto COND_FAILED_CURLY_START;
1531
1532   sub[0] = expand_string_internal(s+1, TRUE, &s, yield == NULL);
1533   if (sub[0] == NULL) return NULL;
1534   if (*s++ != '}') goto COND_FAILED_CURLY_END;
1535
1536   if (yield == NULL) return s;   /* No need to run the test if skipping */
1537
1538   switch(cond_type)
1539     {
1540     case ECOND_EXISTS:
1541     if ((expand_forbid & RDO_EXISTS) != 0)
1542       {
1543       expand_string_message = US"File existence tests are not permitted";
1544       return NULL;
1545       }
1546     *yield = (Ustat(sub[0], &statbuf) == 0) == testfor;
1547     break;
1548
1549     case ECOND_ISIP:
1550     case ECOND_ISIP4:
1551     case ECOND_ISIP6:
1552     rc = string_is_ip_address(sub[0], NULL);
1553     *yield = ((cond_type == ECOND_ISIP)? (rc > 0) :
1554              (cond_type == ECOND_ISIP4)? (rc == 4) : (rc == 6)) == testfor;
1555     break;
1556
1557     /* Various authentication tests - all optionally compiled */
1558
1559     case ECOND_PAM:
1560     #ifdef SUPPORT_PAM
1561     rc = auth_call_pam(sub[0], &expand_string_message);
1562     goto END_AUTH;
1563     #else
1564     goto COND_FAILED_NOT_COMPILED;
1565     #endif  /* SUPPORT_PAM */
1566
1567     case ECOND_RADIUS:
1568     #ifdef RADIUS_CONFIG_FILE
1569     rc = auth_call_radius(sub[0], &expand_string_message);
1570     goto END_AUTH;
1571     #else
1572     goto COND_FAILED_NOT_COMPILED;
1573     #endif  /* RADIUS_CONFIG_FILE */
1574
1575     case ECOND_LDAPAUTH:
1576     #ifdef LOOKUP_LDAP
1577       {
1578       /* Just to keep the interface the same */
1579       BOOL do_cache;
1580       int old_pool = store_pool;
1581       store_pool = POOL_SEARCH;
1582       rc = eldapauth_find((void *)(-1), NULL, sub[0], Ustrlen(sub[0]), NULL,
1583         &expand_string_message, &do_cache);
1584       store_pool = old_pool;
1585       }
1586     goto END_AUTH;
1587     #else
1588     goto COND_FAILED_NOT_COMPILED;
1589     #endif  /* LOOKUP_LDAP */
1590
1591     case ECOND_PWCHECK:
1592     #ifdef CYRUS_PWCHECK_SOCKET
1593     rc = auth_call_pwcheck(sub[0], &expand_string_message);
1594     goto END_AUTH;
1595     #else
1596     goto COND_FAILED_NOT_COMPILED;
1597     #endif  /* CYRUS_PWCHECK_SOCKET */
1598
1599     #if defined(SUPPORT_PAM) || defined(RADIUS_CONFIG_FILE) || \
1600         defined(LOOKUP_LDAP) || defined(CYRUS_PWCHECK_SOCKET)
1601     END_AUTH:
1602     if (rc == ERROR || rc == DEFER) return NULL;
1603     *yield = (rc == OK) == testfor;
1604     #endif
1605     }
1606   return s;
1607
1608
1609   /* saslauthd: does Cyrus saslauthd authentication. Four parameters are used:
1610
1611      ${if saslauthd {{username}{password}{service}{realm}}  {yes}[no}}
1612
1613   However, the last two are optional. That is why the whole set is enclosed
1614   in their own set or braces. */
1615
1616   case ECOND_SASLAUTHD:
1617   #ifndef CYRUS_SASLAUTHD_SOCKET
1618   goto COND_FAILED_NOT_COMPILED;
1619   #else
1620   while (isspace(*s)) s++;
1621   if (*s++ != '{') goto COND_FAILED_CURLY_START;
1622   switch(read_subs(sub, 4, 2, &s, yield == NULL, TRUE, US"saslauthd"))
1623     {
1624     case 1: expand_string_message = US"too few arguments or bracketing "
1625       "error for saslauthd";
1626     case 2:
1627     case 3: return NULL;
1628     }
1629   if (sub[2] == NULL) sub[3] = NULL;  /* realm if no service */
1630   if (yield != NULL)
1631     {
1632     int rc;
1633     rc = auth_call_saslauthd(sub[0], sub[1], sub[2], sub[3],
1634       &expand_string_message);
1635     if (rc == ERROR || rc == DEFER) return NULL;
1636     *yield = (rc == OK) == testfor;
1637     }
1638   return s;
1639   #endif /* CYRUS_SASLAUTHD_SOCKET */
1640
1641
1642   /* symbolic operators for numeric and string comparison, and a number of
1643   other operators, all requiring two arguments.
1644
1645   match:             does a regular expression match and sets up the numerical
1646                        variables if it succeeds
1647   match_address:     matches in an address list
1648   match_domain:      matches in a domain list
1649   match_local_part:  matches in a local part list
1650   crypteq:           encrypts plaintext and compares against an encrypted text,
1651                        using crypt(), crypt16(), MD5 or SHA-1
1652   */
1653
1654   case ECOND_MATCH:
1655   case ECOND_MATCH_ADDRESS:
1656   case ECOND_MATCH_DOMAIN:
1657   case ECOND_MATCH_LOCAL_PART:
1658   case ECOND_CRYPTEQ:
1659
1660   case ECOND_NUM_L:     /* Numerical comparisons */
1661   case ECOND_NUM_LE:
1662   case ECOND_NUM_E:
1663   case ECOND_NUM_EE:
1664   case ECOND_NUM_G:
1665   case ECOND_NUM_GE:
1666
1667   case ECOND_STR_LT:    /* String comparisons */
1668   case ECOND_STR_LTI:
1669   case ECOND_STR_LE:
1670   case ECOND_STR_LEI:
1671   case ECOND_STR_EQ:
1672   case ECOND_STR_EQI:
1673   case ECOND_STR_GT:
1674   case ECOND_STR_GTI:
1675   case ECOND_STR_GE:
1676   case ECOND_STR_GEI:
1677
1678   for (i = 0; i < 2; i++)
1679     {
1680     while (isspace(*s)) s++;
1681     if (*s != '{')
1682       {
1683       if (i == 0) goto COND_FAILED_CURLY_START;
1684       expand_string_message = string_sprintf("missing 2nd string in {} "
1685         "after \"%s\"", name);
1686       return NULL;
1687       }
1688     sub[i] = expand_string_internal(s+1, TRUE, &s, yield == NULL);
1689     if (sub[i] == NULL) return NULL;
1690     if (*s++ != '}') goto COND_FAILED_CURLY_END;
1691
1692     /* Convert to numerical if required; we know that the names of all the
1693     conditions that compare numbers do not start with a letter. This just saves
1694     checking for them individually. */
1695
1696     if (!isalpha(name[0]))
1697       {
1698       uschar *endptr;
1699       num[i] = (int)Ustrtol((const uschar *)sub[i], &endptr, 10);
1700       if (tolower(*endptr) == 'k')
1701         {
1702         num[i] *= 1024;
1703         endptr++;
1704         }
1705       else if (tolower(*endptr) == 'm')
1706         {
1707         num[i] *= 1024*1024;
1708         endptr++;
1709         }
1710       while (isspace(*endptr)) endptr++;
1711       if (*endptr != 0)
1712         {
1713         expand_string_message = string_sprintf("\"%s\" is not a number",
1714           sub[i]);
1715         return NULL;
1716         }
1717       }
1718     }
1719
1720   /* Result not required */
1721
1722   if (yield == NULL) return s;
1723
1724   /* Do an appropriate comparison */
1725
1726   switch(cond_type)
1727     {
1728     case ECOND_NUM_E:
1729     case ECOND_NUM_EE:
1730     *yield = (num[0] == num[1]) == testfor;
1731     break;
1732
1733     case ECOND_NUM_G:
1734     *yield = (num[0] > num[1]) == testfor;
1735     break;
1736
1737     case ECOND_NUM_GE:
1738     *yield = (num[0] >= num[1]) == testfor;
1739     break;
1740
1741     case ECOND_NUM_L:
1742     *yield = (num[0] < num[1]) == testfor;
1743     break;
1744
1745     case ECOND_NUM_LE:
1746     *yield = (num[0] <= num[1]) == testfor;
1747     break;
1748
1749     case ECOND_STR_LT:
1750     *yield = (Ustrcmp(sub[0], sub[1]) < 0) == testfor;
1751     break;
1752
1753     case ECOND_STR_LTI:
1754     *yield = (strcmpic(sub[0], sub[1]) < 0) == testfor;
1755     break;
1756
1757     case ECOND_STR_LE:
1758     *yield = (Ustrcmp(sub[0], sub[1]) <= 0) == testfor;
1759     break;
1760
1761     case ECOND_STR_LEI:
1762     *yield = (strcmpic(sub[0], sub[1]) <= 0) == testfor;
1763     break;
1764
1765     case ECOND_STR_EQ:
1766     *yield = (Ustrcmp(sub[0], sub[1]) == 0) == testfor;
1767     break;
1768
1769     case ECOND_STR_EQI:
1770     *yield = (strcmpic(sub[0], sub[1]) == 0) == testfor;
1771     break;
1772
1773     case ECOND_STR_GT:
1774     *yield = (Ustrcmp(sub[0], sub[1]) > 0) == testfor;
1775     break;
1776
1777     case ECOND_STR_GTI:
1778     *yield = (strcmpic(sub[0], sub[1]) > 0) == testfor;
1779     break;
1780
1781     case ECOND_STR_GE:
1782     *yield = (Ustrcmp(sub[0], sub[1]) >= 0) == testfor;
1783     break;
1784
1785     case ECOND_STR_GEI:
1786     *yield = (strcmpic(sub[0], sub[1]) >= 0) == testfor;
1787     break;
1788
1789     case ECOND_MATCH:   /* Regular expression match */
1790     re = pcre_compile(CS sub[1], PCRE_COPT, (const char **)&rerror, &roffset,
1791       NULL);
1792     if (re == NULL)
1793       {
1794       expand_string_message = string_sprintf("regular expression error in "
1795         "\"%s\": %s at offset %d", sub[1], rerror, roffset);
1796       return NULL;
1797       }
1798     *yield = regex_match_and_setup(re, sub[0], 0, -1) == testfor;
1799     break;
1800
1801     case ECOND_MATCH_ADDRESS:  /* Match in an address list */
1802     rc = match_address_list(sub[0], TRUE, FALSE, &(sub[1]), NULL, -1, 0, NULL);
1803     goto MATCHED_SOMETHING;
1804
1805     case ECOND_MATCH_DOMAIN:   /* Match in a domain list */
1806     rc = match_isinlist(sub[0], &(sub[1]), 0, &domainlist_anchor, NULL,
1807       MCL_DOMAIN + MCL_NOEXPAND, TRUE, NULL);
1808     goto MATCHED_SOMETHING;
1809
1810     case ECOND_MATCH_LOCAL_PART:
1811     rc = match_isinlist(sub[0], &(sub[1]), 0, &localpartlist_anchor, NULL,
1812       MCL_LOCALPART + MCL_NOEXPAND, TRUE, NULL);
1813     /* Fall through */
1814
1815     MATCHED_SOMETHING:
1816     switch(rc)
1817       {
1818       case OK:
1819       *yield = testfor;
1820       break;
1821
1822       case FAIL:
1823       *yield = !testfor;
1824       break;
1825
1826       case DEFER:
1827       expand_string_message = string_sprintf("unable to complete match "
1828         "against \"%s\": %s", sub[1], search_error_message);
1829       return NULL;
1830       }
1831
1832     break;
1833
1834     /* Various "encrypted" comparisons. If the second string starts with
1835     "{" then an encryption type is given. Default to crypt() or crypt16()
1836     (build-time choice). */
1837
1838     case ECOND_CRYPTEQ:
1839     #ifndef SUPPORT_CRYPTEQ
1840     goto COND_FAILED_NOT_COMPILED;
1841     #else
1842     if (strncmpic(sub[1], US"{md5}", 5) == 0)
1843       {
1844       int sublen = Ustrlen(sub[1]+5);
1845       md5 base;
1846       uschar digest[16];
1847
1848       md5_start(&base);
1849       md5_end(&base, (uschar *)sub[0], Ustrlen(sub[0]), digest);
1850
1851       /* If the length that we are comparing against is 24, the MD5 digest
1852       is expressed as a base64 string. This is the way LDAP does it. However,
1853       some other software uses a straightforward hex representation. We assume
1854       this if the length is 32. Other lengths fail. */
1855
1856       if (sublen == 24)
1857         {
1858         uschar *coded = auth_b64encode((uschar *)digest, 16);
1859         DEBUG(D_auth) debug_printf("crypteq: using MD5+B64 hashing\n"
1860           "  subject=%s\n  crypted=%s\n", coded, sub[1]+5);
1861         *yield = (Ustrcmp(coded, sub[1]+5) == 0) == testfor;
1862         }
1863       else if (sublen == 32)
1864         {
1865         int i;
1866         uschar coded[36];
1867         for (i = 0; i < 16; i++) sprintf(CS (coded+2*i), "%02X", digest[i]);
1868         coded[32] = 0;
1869         DEBUG(D_auth) debug_printf("crypteq: using MD5+hex hashing\n"
1870           "  subject=%s\n  crypted=%s\n", coded, sub[1]+5);
1871         *yield = (strcmpic(coded, sub[1]+5) == 0) == testfor;
1872         }
1873       else
1874         {
1875         DEBUG(D_auth) debug_printf("crypteq: length for MD5 not 24 or 32: "
1876           "fail\n  crypted=%s\n", sub[1]+5);
1877         *yield = !testfor;
1878         }
1879       }
1880
1881     else if (strncmpic(sub[1], US"{sha1}", 6) == 0)
1882       {
1883       int sublen = Ustrlen(sub[1]+6);
1884       sha1 base;
1885       uschar digest[20];
1886
1887       sha1_start(&base);
1888       sha1_end(&base, (uschar *)sub[0], Ustrlen(sub[0]), digest);
1889
1890       /* If the length that we are comparing against is 28, assume the SHA1
1891       digest is expressed as a base64 string. If the length is 40, assume a
1892       straightforward hex representation. Other lengths fail. */
1893
1894       if (sublen == 28)
1895         {
1896         uschar *coded = auth_b64encode((uschar *)digest, 20);
1897         DEBUG(D_auth) debug_printf("crypteq: using SHA1+B64 hashing\n"
1898           "  subject=%s\n  crypted=%s\n", coded, sub[1]+6);
1899         *yield = (Ustrcmp(coded, sub[1]+6) == 0) == testfor;
1900         }
1901       else if (sublen == 40)
1902         {
1903         int i;
1904         uschar coded[44];
1905         for (i = 0; i < 20; i++) sprintf(CS (coded+2*i), "%02X", digest[i]);
1906         coded[40] = 0;
1907         DEBUG(D_auth) debug_printf("crypteq: using SHA1+hex hashing\n"
1908           "  subject=%s\n  crypted=%s\n", coded, sub[1]+6);
1909         *yield = (strcmpic(coded, sub[1]+6) == 0) == testfor;
1910         }
1911       else
1912         {
1913         DEBUG(D_auth) debug_printf("crypteq: length for SHA-1 not 28 or 40: "
1914           "fail\n  crypted=%s\n", sub[1]+6);
1915         *yield = !testfor;
1916         }
1917       }
1918
1919     else   /* {crypt} or {crypt16} and non-{ at start */
1920       {
1921       int which = 0;
1922       uschar *coded;
1923
1924       if (strncmpic(sub[1], US"{crypt}", 7) == 0)
1925         {
1926         sub[1] += 7;
1927         which = 1;
1928         }
1929       else if (strncmpic(sub[1], US"{crypt16}", 9) == 0)
1930         {
1931         sub[1] += 9;
1932         which = 2;
1933         }
1934       else if (sub[1][0] == '{')
1935         {
1936         expand_string_message = string_sprintf("unknown encryption mechanism "
1937           "in \"%s\"", sub[1]);
1938         return NULL;
1939         }
1940
1941       switch(which)
1942         {
1943         case 0:  coded = US DEFAULT_CRYPT(CS sub[0], CS sub[1]); break;
1944         case 1:  coded = US crypt(CS sub[0], CS sub[1]); break;
1945         default: coded = US crypt16(CS sub[0], CS sub[1]); break;
1946         }
1947
1948       #define STR(s) # s
1949       #define XSTR(s) STR(s)
1950       DEBUG(D_auth) debug_printf("crypteq: using %s()\n"
1951         "  subject=%s\n  crypted=%s\n",
1952         (which == 0)? XSTR(DEFAULT_CRYPT) : (which == 1)? "crypt" : "crypt16",
1953         coded, sub[1]);
1954       #undef STR
1955       #undef XSTR
1956
1957       /* If the encrypted string contains fewer than two characters (for the
1958       salt), force failure. Otherwise we get false positives: with an empty
1959       string the yield of crypt() is an empty string! */
1960
1961       *yield = (Ustrlen(sub[1]) < 2)? !testfor :
1962         (Ustrcmp(coded, sub[1]) == 0) == testfor;
1963       }
1964     break;
1965     #endif  /* SUPPORT_CRYPTEQ */
1966     }   /* Switch for comparison conditions */
1967
1968   return s;    /* End of comparison conditions */
1969
1970
1971   /* and/or: computes logical and/or of several conditions */
1972
1973   case ECOND_AND:
1974   case ECOND_OR:
1975   subcondptr = (yield == NULL)? NULL : &tempcond;
1976   combined_cond = (cond_type == ECOND_AND);
1977
1978   while (isspace(*s)) s++;
1979   if (*s++ != '{') goto COND_FAILED_CURLY_START;
1980
1981   for (;;)
1982     {
1983     while (isspace(*s)) s++;
1984     if (*s == '}') break;
1985     if (*s != '{')
1986       {
1987       expand_string_message = string_sprintf("each subcondition "
1988         "inside an \"%s{...}\" condition must be in its own {}", name);
1989       return NULL;
1990       }
1991
1992     s = eval_condition(s+1, subcondptr);
1993     if (s == NULL)
1994       {
1995       expand_string_message = string_sprintf("%s inside \"%s{...}\" condition",
1996         expand_string_message, name);
1997       return NULL;
1998       }
1999     while (isspace(*s)) s++;
2000
2001     if (*s++ != '}')
2002       {
2003       expand_string_message = string_sprintf("missing } at end of condition "
2004         "inside \"%s\" group", name);
2005       return NULL;
2006       }
2007
2008     if (yield != NULL)
2009       {
2010       if (cond_type == ECOND_AND)
2011         {
2012         combined_cond &= tempcond;
2013         if (!combined_cond) subcondptr = NULL;  /* once false, don't */
2014         }                                       /* evaluate any more */
2015       else
2016         {
2017         combined_cond |= tempcond;
2018         if (combined_cond) subcondptr = NULL;   /* once true, don't */
2019         }                                       /* evaluate any more */
2020       }
2021     }
2022
2023   if (yield != NULL) *yield = (combined_cond == testfor);
2024   return ++s;
2025
2026
2027   /* Unknown condition */
2028
2029   default:
2030   expand_string_message = string_sprintf("unknown condition \"%s\"", name);
2031   return NULL;
2032   }   /* End switch on condition type */
2033
2034 /* Missing braces at start and end of data */
2035
2036 COND_FAILED_CURLY_START:
2037 expand_string_message = string_sprintf("missing { after \"%s\"", name);
2038 return NULL;
2039
2040 COND_FAILED_CURLY_END:
2041 expand_string_message = string_sprintf("missing } at end of \"%s\" condition",
2042   name);
2043 return NULL;
2044
2045 /* A condition requires code that is not compiled */
2046
2047 #if !defined(SUPPORT_PAM) || !defined(RADIUS_CONFIG_FILE) || \
2048     !defined(LOOKUP_LDAP) || !defined(CYRUS_PWCHECK_SOCKET) || \
2049     !defined(SUPPORT_CRYPTEQ) || !defined(CYRUS_SASLAUTHD_SOCKET)
2050 COND_FAILED_NOT_COMPILED:
2051 expand_string_message = string_sprintf("support for \"%s\" not compiled",
2052   name);
2053 return NULL;
2054 #endif
2055 }
2056
2057
2058
2059
2060 /*************************************************
2061 *          Save numerical variables              *
2062 *************************************************/
2063
2064 /* This function is called from items such as "if" that want to preserve and
2065 restore the numbered variables.
2066
2067 Arguments:
2068   save_expand_string    points to an array of pointers to set
2069   save_expand_nlength   points to an array of ints for the lengths
2070
2071 Returns:                the value of expand max to save
2072 */
2073
2074 static int
2075 save_expand_strings(uschar **save_expand_nstring, int *save_expand_nlength)
2076 {
2077 int i;
2078 for (i = 0; i <= expand_nmax; i++)
2079   {
2080   save_expand_nstring[i] = expand_nstring[i];
2081   save_expand_nlength[i] = expand_nlength[i];
2082   }
2083 return expand_nmax;
2084 }
2085
2086
2087
2088 /*************************************************
2089 *           Restore numerical variables          *
2090 *************************************************/
2091
2092 /* This function restored saved values of numerical strings.
2093
2094 Arguments:
2095   save_expand_nmax      the number of strings to restore
2096   save_expand_string    points to an array of pointers
2097   save_expand_nlength   points to an array of ints
2098
2099 Returns:                nothing
2100 */
2101
2102 static void
2103 restore_expand_strings(int save_expand_nmax, uschar **save_expand_nstring,
2104   int *save_expand_nlength)
2105 {
2106 int i;
2107 expand_nmax = save_expand_nmax;
2108 for (i = 0; i <= expand_nmax; i++)
2109   {
2110   expand_nstring[i] = save_expand_nstring[i];
2111   expand_nlength[i] = save_expand_nlength[i];
2112   }
2113 }
2114
2115
2116
2117
2118
2119 /*************************************************
2120 *            Handle yes/no substrings            *
2121 *************************************************/
2122
2123 /* This function is used by ${if}, ${lookup} and ${extract} to handle the
2124 alternative substrings that depend on whether or not the condition was true,
2125 or the lookup or extraction succeeded. The substrings always have to be
2126 expanded, to check their syntax, but "skipping" is set when the result is not
2127 needed - this avoids unnecessary nested lookups.
2128
2129 Arguments:
2130   skipping       TRUE if we were skipping when this item was reached
2131   yes            TRUE if the first string is to be used, else use the second
2132   save_lookup    a value to put back into lookup_value before the 2nd expansion
2133   sptr           points to the input string pointer
2134   yieldptr       points to the output string pointer
2135   sizeptr        points to the output string size
2136   ptrptr         points to the output string pointer
2137   type           "lookup" or "if" or "extract" or "run", for error message
2138
2139 Returns:         0 OK; lookup_value has been reset to save_lookup
2140                  1 expansion failed
2141                  2 expansion failed because of bracketing error
2142 */
2143
2144 static int
2145 process_yesno(BOOL skipping, BOOL yes, uschar *save_lookup, uschar **sptr,
2146   uschar **yieldptr, int *sizeptr, int *ptrptr, uschar *type)
2147 {
2148 int rc = 0;
2149 uschar *s = *sptr;    /* Local value */
2150 uschar *sub1, *sub2;
2151
2152 /* If there are no following strings, we substitute the contents of $value for
2153 lookups and for extractions in the success case. In the fail case, nothing is
2154 substituted. In the case of "if", lack of following strings is an error. */
2155
2156 while (isspace(*s)) s++;
2157 if (*s == '}')
2158   {
2159   if (type[0] == 'i') goto FAILED_CURLY;
2160   if (yes && lookup_value != NULL)
2161     *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value,
2162       Ustrlen(lookup_value));
2163   lookup_value = save_lookup;
2164   s++;
2165   goto RETURN;
2166   }
2167
2168 /* Expand the first substring. Forced failures are noticed only if we actually
2169 want this string. Set skipping in the call in the fail case (this will always
2170 be the case if we were already skipping). */
2171
2172 sub1 = expand_string_internal(s+1, TRUE, &s, !yes);
2173 if (sub1 == NULL && (yes || !expand_string_forcedfail)) goto FAILED;
2174 expand_string_forcedfail = FALSE;
2175 if (*s++ != '}') goto FAILED_CURLY;
2176
2177 /* If we want the first string, add it to the output */
2178
2179 if (yes)
2180   *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, sub1, Ustrlen(sub1));
2181
2182 /* If this is called from a lookup or an extract, we want to restore $value to
2183 what it was at the start of the item, so that it has this value during the
2184 second string expansion. For the call from "if" to this function, save_lookup
2185 is set to lookup_value, so that this statement does nothing. */
2186
2187 lookup_value = save_lookup;
2188
2189 /* There now follows either another substring, or "fail", or nothing. This
2190 time, forced failures are noticed only if we want the second string. We must
2191 set skipping in the nested call if we don't want this string, or if we were
2192 already skipping. */
2193
2194 while (isspace(*s)) s++;
2195 if (*s == '{')
2196   {
2197   sub2 = expand_string_internal(s+1, TRUE, &s, yes || skipping);
2198   if (sub2 == NULL && (!yes || !expand_string_forcedfail)) goto FAILED;
2199   expand_string_forcedfail = FALSE;
2200   if (*s++ != '}') goto FAILED_CURLY;
2201
2202   /* If we want the second string, add it to the output */
2203
2204   if (!yes)
2205     *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, sub2, Ustrlen(sub2));
2206   }
2207
2208 /* If there is no second string, but the word "fail" is present when the use of
2209 the second string is wanted, set a flag indicating it was a forced failure
2210 rather than a syntactic error. Swallow the terminating } in case this is nested
2211 inside another lookup or if or extract. */
2212
2213 else if (*s != '}')
2214   {
2215   uschar name[256];
2216   s = read_name(name, sizeof(name), s, US"_");
2217   if (Ustrcmp(name, "fail") == 0)
2218     {
2219     if (!yes && !skipping)
2220       {
2221       while (isspace(*s)) s++;
2222       if (*s++ != '}') goto FAILED_CURLY;
2223       expand_string_message =
2224         string_sprintf("\"%s\" failed and \"fail\" requested", type);
2225       expand_string_forcedfail = TRUE;
2226       goto FAILED;
2227       }
2228     }
2229   else
2230     {
2231     expand_string_message =
2232       string_sprintf("syntax error in \"%s\" item - \"fail\" expected", type);
2233     goto FAILED;
2234     }
2235   }
2236
2237 /* All we have to do now is to check on the final closing brace. */
2238
2239 while (isspace(*s)) s++;
2240 if (*s++ == '}') goto RETURN;
2241
2242 /* Get here if there is a bracketing failure */
2243
2244 FAILED_CURLY:
2245 rc++;
2246
2247 /* Get here for other failures */
2248
2249 FAILED:
2250 rc++;
2251
2252 /* Update the input pointer value before returning */
2253
2254 RETURN:
2255 *sptr = s;
2256 return rc;
2257 }
2258
2259
2260
2261
2262
2263
2264 /*************************************************
2265 *    Handle MD5 or SHA-1 computation for HMAC    *
2266 *************************************************/
2267
2268 /* These are some wrapping functions that enable the HMAC code to be a bit
2269 cleaner. A good compiler will spot the tail recursion.
2270
2271 Arguments:
2272   type         HMAC_MD5 or HMAC_SHA1
2273   remaining    are as for the cryptographic hash functions
2274
2275 Returns:       nothing
2276 */
2277
2278 static void
2279 chash_start(int type, void *base)
2280 {
2281 if (type == HMAC_MD5)
2282   md5_start((md5 *)base);
2283 else
2284   sha1_start((sha1 *)base);
2285 }
2286
2287 static void
2288 chash_mid(int type, void *base, uschar *string)
2289 {
2290 if (type == HMAC_MD5)
2291   md5_mid((md5 *)base, string);
2292 else
2293   sha1_mid((sha1 *)base, string);
2294 }
2295
2296 static void
2297 chash_end(int type, void *base, uschar *string, int length, uschar *digest)
2298 {
2299 if (type == HMAC_MD5)
2300   md5_end((md5 *)base, string, length, digest);
2301 else
2302   sha1_end((sha1 *)base, string, length, digest);
2303 }
2304
2305
2306
2307
2308
2309 /*************************************************
2310 *        Join a file onto the output string      *
2311 *************************************************/
2312
2313 /* This is used for readfile and after a run expansion. It joins the contents
2314 of a file onto the output string, globally replacing newlines with a given
2315 string (optionally). The file is closed at the end.
2316
2317 Arguments:
2318   f            the FILE
2319   yield        pointer to the expandable string
2320   sizep        pointer to the current size
2321   ptrp         pointer to the current position
2322   eol          newline replacement string, or NULL
2323
2324 Returns:       new value of string pointer
2325 */
2326
2327 static uschar *
2328 cat_file(FILE *f, uschar *yield, int *sizep, int *ptrp, uschar *eol)
2329 {
2330 int eollen;
2331 uschar buffer[1024];
2332
2333 eollen = (eol == NULL)? 0 : Ustrlen(eol);
2334
2335 while (Ufgets(buffer, sizeof(buffer), f) != NULL)
2336   {
2337   int len = Ustrlen(buffer);
2338   if (eol != NULL && buffer[len-1] == '\n') len--;
2339   yield = string_cat(yield, sizep, ptrp, buffer, len);
2340   if (buffer[len] != 0)
2341     yield = string_cat(yield, sizep, ptrp, eol, eollen);
2342   }
2343
2344 if (yield != NULL) yield[*ptrp] = 0;
2345
2346 return yield;
2347 }
2348
2349
2350
2351
2352 /*************************************************
2353 *          Evaluate numeric expression           *
2354 *************************************************/
2355
2356 /* This is a set of mutually recursive functions that evaluate a simple
2357 arithmetic expression involving only + - * / and parentheses. The only one that
2358 is called from elsewhere is eval_expr, whose interface is:
2359
2360 Arguments:
2361   sptr          pointer to the pointer to the string - gets updated
2362   decimal       TRUE if numbers are to be assumed decimal
2363   error         pointer to where to put an error message - must be NULL on input
2364   endket        TRUE if ')' must terminate - FALSE for external call
2365
2366
2367 Returns:        on success: the value of the expression, with *error still NULL
2368                 on failure: an undefined value, with *error = a message
2369 */
2370
2371 static int eval_sumterm(uschar **, BOOL, uschar **);
2372
2373 static int
2374 eval_expr(uschar **sptr, BOOL decimal, uschar **error, BOOL endket)
2375 {
2376 uschar *s = *sptr;
2377 int x = eval_sumterm(&s, decimal, error);
2378 if (*error == NULL)
2379   {
2380   while (*s == '+' || *s == '-')
2381     {
2382     int op = *s++;
2383     int y = eval_sumterm(&s, decimal, error);
2384     if (*error != NULL) break;
2385     if (op == '+') x += y; else x -= y;
2386     }
2387   if (*error == NULL)
2388     {
2389     if (endket)
2390       {
2391       if (*s != ')')
2392         *error = US"expecting closing parenthesis";
2393       else
2394         while (isspace(*(++s)));
2395       }
2396     else if (*s != 0) *error = US"expecting + or -";
2397     }
2398   }
2399
2400 *sptr = s;
2401 return x;
2402 }
2403
2404 static int
2405 eval_term(uschar **sptr, BOOL decimal, uschar **error)
2406 {
2407 register int c;
2408 int n;
2409 uschar *s = *sptr;
2410 while (isspace(*s)) s++;
2411 c = *s;
2412 if (isdigit(c) || ((c == '-' || c == '+') && isdigit(s[1])))
2413   {
2414   int count;
2415   (void)sscanf(CS s, (decimal? "%d%n" : "%i%n"), &n, &count);
2416   s += count;
2417   if (tolower(*s) == 'k') { n *= 1024; s++; }
2418     else if (tolower(*s) == 'm') { n *= 1024*1024; s++; }
2419   while (isspace (*s)) s++;
2420   }
2421 else if (c == '(')
2422   {
2423   s++;
2424   n = eval_expr(&s, decimal, error, 1);
2425   }
2426 else
2427   {
2428   *error = US"expecting number or opening parenthesis";
2429   n = 0;
2430   }
2431 *sptr = s;
2432 return n;
2433 }
2434
2435 static int eval_sumterm(uschar **sptr, BOOL decimal, uschar **error)
2436 {
2437 uschar *s = *sptr;
2438 int x = eval_term(&s, decimal, error);
2439 if (*error == NULL)
2440   {
2441   while (*s == '*' || *s == '/')
2442     {
2443     int op = *s++;
2444     int y = eval_term(&s, decimal, error);
2445     if (*error != NULL) break;
2446     if (op == '*') x *= y; else x /= y;
2447     }
2448   }
2449 *sptr = s;
2450 return x;
2451 }
2452
2453
2454
2455
2456 /*************************************************
2457 *                 Expand string                  *
2458 *************************************************/
2459
2460 /* Returns either an unchanged string, or the expanded string in stacking pool
2461 store. Interpreted sequences are:
2462
2463    \...                    normal escaping rules
2464    $name                   substitutes the variable
2465    ${name}                 ditto
2466    ${op:string}            operates on the expanded string value
2467    ${item{arg1}{arg2}...}  expands the args and then does the business
2468                              some literal args are not enclosed in {}
2469
2470 There are now far too many operators and item types to make it worth listing
2471 them here in detail any more.
2472
2473 We use an internal routine recursively to handle embedded substrings. The
2474 external function follows. The yield is NULL if the expansion failed, and there
2475 are two cases: if something collapsed syntactically, or if "fail" was given
2476 as the action on a lookup failure. These can be distinguised by looking at the
2477 variable expand_string_forcedfail, which is TRUE in the latter case.
2478
2479 The skipping flag is set true when expanding a substring that isn't actually
2480 going to be used (after "if" or "lookup") and it prevents lookups from
2481 happening lower down.
2482
2483 Store usage: At start, a store block of the length of the input plus 64
2484 is obtained. This is expanded as necessary by string_cat(), which might have to
2485 get a new block, or might be able to expand the original. At the end of the
2486 function we can release any store above that portion of the yield block that
2487 was actually used. In many cases this will be optimal.
2488
2489 However: if the first item in the expansion is a variable name or header name,
2490 we reset the store before processing it; if the result is in fresh store, we
2491 use that without copying. This is helpful for expanding strings like
2492 $message_headers which can get very long.
2493
2494 Arguments:
2495   string         the string to be expanded
2496   ket_ends       true if expansion is to stop at }
2497   left           if not NULL, a pointer to the first character after the
2498                  expansion is placed here (typically used with ket_ends)
2499   skipping       TRUE for recursive calls when the value isn't actually going
2500                  to be used (to allow for optimisation)
2501
2502 Returns:         NULL if expansion fails:
2503                    expand_string_forcedfail is set TRUE if failure was forced
2504                    expand_string_message contains a textual error message
2505                  a pointer to the expanded string on success
2506 */
2507
2508 static uschar *
2509 expand_string_internal(uschar *string, BOOL ket_ends, uschar **left,
2510   BOOL skipping)
2511 {
2512 int ptr = 0;
2513 int size = Ustrlen(string)+ 64;
2514 int item_type;
2515 uschar *yield = store_get(size);
2516 uschar *s = string;
2517 uschar *save_expand_nstring[EXPAND_MAXN+1];
2518 int save_expand_nlength[EXPAND_MAXN+1];
2519
2520 expand_string_forcedfail = FALSE;
2521 expand_string_message = US"";
2522
2523 while (*s != 0)
2524   {
2525   uschar *value;
2526   uschar name[256];
2527
2528   /* \ escapes the next character, which must exist, or else
2529   the expansion fails. There's a special escape, \N, which causes
2530   copying of the subject verbatim up to the next \N. Otherwise,
2531   the escapes are the standard set. */
2532
2533   if (*s == '\\')
2534     {
2535     if (s[1] == 0)
2536       {
2537       expand_string_message = US"\\ at end of string";
2538       goto EXPAND_FAILED;
2539       }
2540
2541     if (s[1] == 'N')
2542       {
2543       uschar *t = s + 2;
2544       for (s = t; *s != 0; s++) if (*s == '\\' && s[1] == 'N') break;
2545       yield = string_cat(yield, &size, &ptr, t, s - t);
2546       if (*s != 0) s += 2;
2547       }
2548
2549     else
2550       {
2551       uschar ch[1];
2552       ch[0] = string_interpret_escape(&s);
2553       s++;
2554       yield = string_cat(yield, &size, &ptr, ch, 1);
2555       }
2556
2557     continue;
2558     }
2559
2560   /* Anything other than $ is just copied verbatim, unless we are
2561   looking for a terminating } character. */
2562
2563   if (ket_ends && *s == '}') break;
2564
2565   if (*s != '$')
2566     {
2567     yield = string_cat(yield, &size, &ptr, s++, 1);
2568     continue;
2569     }
2570
2571   /* No { after the $ - must be a plain name or a number for string
2572   match variable. There has to be a fudge for variables that are the
2573   names of header fields preceded by "$header_" because header field
2574   names can contain any printing characters except space and colon.
2575   For those that don't like typing this much, "$h_" is a synonym for
2576   "$header_". A non-existent header yields a NULL value; nothing is
2577   inserted. */
2578
2579   if (isalpha((*(++s))))
2580     {
2581     int len;
2582     int newsize = 0;
2583
2584     s = read_name(name, sizeof(name), s, US"_");
2585
2586     /* If this is the first thing to be expanded, release the pre-allocated
2587     buffer. */
2588
2589     if (ptr == 0 && yield != NULL)
2590       {
2591       store_reset(yield);
2592       yield = NULL;
2593       size = 0;
2594       }
2595
2596     /* Header */
2597
2598     if (Ustrncmp(name, "h_", 2) == 0 ||
2599         Ustrncmp(name, "rh_", 3) == 0 ||
2600         Ustrncmp(name, "bh_", 3) == 0 ||
2601         Ustrncmp(name, "header_", 7) == 0 ||
2602         Ustrncmp(name, "rheader_", 8) == 0 ||
2603         Ustrncmp(name, "bheader_", 8) == 0)
2604       {
2605       BOOL want_raw = (name[0] == 'r')? TRUE : FALSE;
2606       uschar *charset = (name[0] == 'b')? NULL : headers_charset;
2607       s = read_header_name(name, sizeof(name), s);
2608       value = find_header(name, FALSE, &newsize, want_raw, charset);
2609
2610       /* If we didn't find the header, and the header contains a closing brace
2611       characters, this may be a user error where the terminating colon
2612       has been omitted. Set a flag to adjust the error message in this case.
2613       But there is no error here - nothing gets inserted. */
2614
2615       if (value == NULL)
2616         {
2617         if (Ustrchr(name, '}') != NULL) malformed_header = TRUE;
2618         continue;
2619         }
2620       }
2621
2622     /* Variable */
2623
2624     else
2625       {
2626       value = find_variable(name, FALSE, skipping, &newsize);
2627       if (value == NULL)
2628         {
2629         expand_string_message =
2630           string_sprintf("unknown variable name \"%s\"", name);
2631         goto EXPAND_FAILED;
2632         }
2633       }
2634
2635     /* If the data is known to be in a new buffer, newsize will be set to the
2636     size of that buffer. If this is the first thing in an expansion string,
2637     yield will be NULL; just point it at the new store instead of copying. Many
2638     expansion strings contain just one reference, so this is a useful
2639     optimization, especially for humungous headers. */
2640
2641     len = Ustrlen(value);
2642     if (yield == NULL && newsize != 0)
2643       {
2644       yield = value;
2645       size = newsize;
2646       ptr = len;
2647       }
2648     else yield = string_cat(yield, &size, &ptr, value, len);
2649
2650     continue;
2651     }
2652
2653   if (isdigit(*s))
2654     {
2655     int n;
2656     s = read_number(&n, s);
2657     if (n >= 0 && n <= expand_nmax)
2658       yield = string_cat(yield, &size, &ptr, expand_nstring[n],
2659         expand_nlength[n]);
2660     continue;
2661     }
2662
2663   /* Otherwise, if there's no '{' after $ it's an error. */
2664
2665   if (*s != '{')
2666     {
2667     expand_string_message = US"$ not followed by letter, digit, or {";
2668     goto EXPAND_FAILED;
2669     }
2670
2671   /* After { there can be various things, but they all start with
2672   an initial word, except for a number for a string match variable. */
2673
2674   if (isdigit((*(++s))))
2675     {
2676     int n;
2677     s = read_number(&n, s);
2678     if (*s++ != '}')
2679       {
2680       expand_string_message = US"} expected after number";
2681       goto EXPAND_FAILED;
2682       }
2683     if (n >= 0 && n <= expand_nmax)
2684       yield = string_cat(yield, &size, &ptr, expand_nstring[n],
2685         expand_nlength[n]);
2686     continue;
2687     }
2688
2689   if (!isalpha(*s))
2690     {
2691     expand_string_message = US"letter or digit expected after ${";
2692     goto EXPAND_FAILED;
2693     }
2694
2695   /* Allow "-" in names to cater for substrings with negative
2696   arguments. Since we are checking for known names after { this is
2697   OK. */
2698
2699   s = read_name(name, sizeof(name), s, US"_-");
2700   item_type = chop_match(name, item_table, sizeof(item_table)/sizeof(uschar *));
2701
2702   switch(item_type)
2703     {
2704     /* Handle conditionals - preserve the values of the numerical expansion
2705     variables in case they get changed by a regular expression match in the
2706     condition. If not, they retain their external settings. At the end
2707     of this "if" section, they get restored to their previous values. */
2708
2709     case EITEM_IF:
2710       {
2711       BOOL cond = FALSE;
2712       uschar *next_s;
2713       int save_expand_nmax =
2714         save_expand_strings(save_expand_nstring, save_expand_nlength);
2715
2716       while (isspace(*s)) s++;
2717       next_s = eval_condition(s, skipping? NULL : &cond);
2718       if (next_s == NULL) goto EXPAND_FAILED;  /* message already set */
2719
2720       DEBUG(D_expand)
2721         debug_printf("condition: %.*s\n   result: %s\n", (int)(next_s - s), s,
2722           cond? "true" : "false");
2723
2724       s = next_s;
2725
2726       /* The handling of "yes" and "no" result strings is now in a separate
2727       function that is also used by ${lookup} and ${extract} and ${run}. */
2728
2729       switch(process_yesno(
2730                skipping,                     /* were previously skipping */
2731                cond,                         /* success/failure indicator */
2732                lookup_value,                 /* value to reset for string2 */
2733                &s,                           /* input pointer */
2734                &yield,                       /* output pointer */
2735                &size,                        /* output size */
2736                &ptr,                         /* output current point */
2737                US"if"))                      /* condition type */
2738         {
2739         case 1: goto EXPAND_FAILED;          /* when all is well, the */
2740         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
2741         }
2742
2743       /* Restore external setting of expansion variables for continuation
2744       at this level. */
2745
2746       restore_expand_strings(save_expand_nmax, save_expand_nstring,
2747         save_expand_nlength);
2748       continue;
2749       }
2750
2751     /* Handle database lookups unless locked out. If "skipping" is TRUE, we are
2752     expanding an internal string that isn't actually going to be used. All we
2753     need to do is check the syntax, so don't do a lookup at all. Preserve the
2754     values of the numerical expansion variables in case they get changed by a
2755     partial lookup. If not, they retain their external settings. At the end
2756     of this "lookup" section, they get restored to their previous values. */
2757
2758     case EITEM_LOOKUP:
2759       {
2760       int stype, partial, affixlen, starflags;
2761       int expand_setup = 0;
2762       int nameptr = 0;
2763       uschar *key, *filename, *affix;
2764       uschar *save_lookup_value = lookup_value;
2765       int save_expand_nmax =
2766         save_expand_strings(save_expand_nstring, save_expand_nlength);
2767
2768       if ((expand_forbid & RDO_LOOKUP) != 0)
2769         {
2770         expand_string_message = US"lookup expansions are not permitted";
2771         goto EXPAND_FAILED;
2772         }
2773
2774       /* Get the key we are to look up for single-key+file style lookups.
2775       Otherwise set the key NULL pro-tem. */
2776
2777       while (isspace(*s)) s++;
2778       if (*s == '{')
2779         {
2780         key = expand_string_internal(s+1, TRUE, &s, skipping);
2781         if (key == NULL) goto EXPAND_FAILED;
2782         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
2783         while (isspace(*s)) s++;
2784         }
2785       else key = NULL;
2786
2787       /* Find out the type of database */
2788
2789       if (!isalpha(*s))
2790         {
2791         expand_string_message = US"missing lookup type";
2792         goto EXPAND_FAILED;
2793         }
2794
2795       /* The type is a string that may contain special characters of various
2796       kinds. Allow everything except space or { to appear; the actual content
2797       is checked by search_findtype_partial. */
2798
2799       while (*s != 0 && *s != '{' && !isspace(*s))
2800         {
2801         if (nameptr < sizeof(name) - 1) name[nameptr++] = *s;
2802         s++;
2803         }
2804       name[nameptr] = 0;
2805       while (isspace(*s)) s++;
2806
2807       /* Now check for the individual search type and any partial or default
2808       options. Only those types that are actually in the binary are valid. */
2809
2810       stype = search_findtype_partial(name, &partial, &affix, &affixlen,
2811         &starflags);
2812       if (stype < 0)
2813         {
2814         expand_string_message = search_error_message;
2815         goto EXPAND_FAILED;
2816         }
2817
2818       /* Check that a key was provided for those lookup types that need it,
2819       and was not supplied for those that use the query style. */
2820
2821       if (!mac_islookup(stype, lookup_querystyle))
2822         {
2823         if (key == NULL)
2824           {
2825           expand_string_message = string_sprintf("missing {key} for single-"
2826             "key \"%s\" lookup", name);
2827           goto EXPAND_FAILED;
2828           }
2829         }
2830       else
2831         {
2832         if (key != NULL)
2833           {
2834           expand_string_message = string_sprintf("a single key was given for "
2835             "lookup type \"%s\", which is not a single-key lookup type", name);
2836           goto EXPAND_FAILED;
2837           }
2838         }
2839
2840       /* Get the next string in brackets and expand it. It is the file name for
2841       single-key+file lookups, and the whole query otherwise. */
2842
2843       if (*s != '{') goto EXPAND_FAILED_CURLY;
2844       filename = expand_string_internal(s+1, TRUE, &s, skipping);
2845       if (filename == NULL) goto EXPAND_FAILED;
2846       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
2847       while (isspace(*s)) s++;
2848
2849       /* If this isn't a single-key+file lookup, re-arrange the variables
2850       to be appropriate for the search_ functions. */
2851
2852       if (key == NULL)
2853         {
2854         key = filename;
2855         filename = NULL;
2856         }
2857
2858       /* If skipping, don't do the next bit - just lookup_value == NULL, as if
2859       the entry was not found. Note that there is no search_close() function.
2860       Files are left open in case of re-use. At suitable places in higher logic,
2861       search_tidyup() is called to tidy all open files. This can save opening
2862       the same file several times. However, files may also get closed when
2863       others are opened, if too many are open at once. The rule is that a
2864       handle should not be used after a second search_open().
2865
2866       Request that a partial search sets up $1 and maybe $2 by passing
2867       expand_setup containing zero. If its value changes, reset expand_nmax,
2868       since new variables will have been set. Note that at the end of this
2869       "lookup" section, the old numeric variables are restored. */
2870
2871       if (skipping)
2872         lookup_value = NULL;
2873       else
2874         {
2875         void *handle = search_open(filename, stype, 0, NULL, NULL);
2876         if (handle == NULL)
2877           {
2878           expand_string_message = search_error_message;
2879           goto EXPAND_FAILED;
2880           }
2881         lookup_value = search_find(handle, filename, key, partial, affix,
2882           affixlen, starflags, &expand_setup);
2883         if (search_find_defer)
2884           {
2885           expand_string_message =
2886             string_sprintf("lookup of \"%s\" gave DEFER: %s", key,
2887               search_error_message);
2888           goto EXPAND_FAILED;
2889           }
2890         if (expand_setup > 0) expand_nmax = expand_setup;
2891         }
2892
2893       /* The handling of "yes" and "no" result strings is now in a separate
2894       function that is also used by ${if} and ${extract}. */
2895
2896       switch(process_yesno(
2897                skipping,                     /* were previously skipping */
2898                lookup_value != NULL,         /* success/failure indicator */
2899                save_lookup_value,            /* value to reset for string2 */
2900                &s,                           /* input pointer */
2901                &yield,                       /* output pointer */
2902                &size,                        /* output size */
2903                &ptr,                         /* output current point */
2904                US"lookup"))                  /* condition type */
2905         {
2906         case 1: goto EXPAND_FAILED;          /* when all is well, the */
2907         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
2908         }
2909
2910       /* Restore external setting of expansion variables for carrying on
2911       at this level, and continue. */
2912
2913       restore_expand_strings(save_expand_nmax, save_expand_nstring,
2914         save_expand_nlength);
2915       continue;
2916       }
2917
2918     /* If Perl support is configured, handle calling embedded perl subroutines,
2919     unless locked out at this time. Syntax is ${perl{sub}} or ${perl{sub}{arg}}
2920     or ${perl{sub}{arg1}{arg2}} or up to a maximum of EXIM_PERL_MAX_ARGS
2921     arguments (defined below). */
2922
2923     #ifdef EXIM_PERL
2924     #define EXIM_PERL_MAX_ARGS 8
2925
2926     case EITEM_PERL:
2927       {
2928       uschar *sub_arg[EXIM_PERL_MAX_ARGS + 2];
2929       uschar *new_yield;
2930
2931       if ((expand_forbid & RDO_PERL) != 0)
2932         {
2933         expand_string_message = US"Perl calls are not permitted";
2934         goto EXPAND_FAILED;
2935         }
2936
2937       switch(read_subs(sub_arg, EXIM_PERL_MAX_ARGS + 1, 1, &s, skipping, TRUE,
2938            US"perl"))
2939         {
2940         case 1: goto EXPAND_FAILED_CURLY;
2941         case 2:
2942         case 3: goto EXPAND_FAILED;
2943         }
2944
2945       /* If skipping, we don't actually do anything */
2946
2947       if (skipping) continue;
2948
2949       /* Start the interpreter if necessary */
2950
2951       if (!opt_perl_started)
2952         {
2953         uschar *initerror;
2954         if (opt_perl_startup == NULL)
2955           {
2956           expand_string_message = US"A setting of perl_startup is needed when "
2957             "using the Perl interpreter";
2958           goto EXPAND_FAILED;
2959           }
2960         DEBUG(D_any) debug_printf("Starting Perl interpreter\n");
2961         initerror = init_perl(opt_perl_startup);
2962         if (initerror != NULL)
2963           {
2964           expand_string_message =
2965             string_sprintf("error in perl_startup code: %s\n", initerror);
2966           goto EXPAND_FAILED;
2967           }
2968         opt_perl_started = TRUE;
2969         }
2970
2971       /* Call the function */
2972
2973       sub_arg[EXIM_PERL_MAX_ARGS + 1] = NULL;
2974       new_yield = call_perl_cat(yield, &size, &ptr, &expand_string_message,
2975         sub_arg[0], sub_arg + 1);
2976
2977       /* NULL yield indicates failure; if the message pointer has been set to
2978       NULL, the yield was undef, indicating a forced failure. Otherwise the
2979       message will indicate some kind of Perl error. */
2980
2981       if (new_yield == NULL)
2982         {
2983         if (expand_string_message == NULL)
2984           {
2985           expand_string_message =
2986             string_sprintf("Perl subroutine \"%s\" returned undef to force "
2987               "failure", sub_arg[0]);
2988           expand_string_forcedfail = TRUE;
2989           }
2990         goto EXPAND_FAILED;
2991         }
2992
2993       /* Yield succeeded. Ensure forcedfail is unset, just in case it got
2994       set during a callback from Perl. */
2995
2996       expand_string_forcedfail = FALSE;
2997       yield = new_yield;
2998       continue;
2999       }
3000     #endif /* EXIM_PERL */
3001
3002     /* Handle "readfile" to insert an entire file */
3003
3004     case EITEM_READFILE:
3005       {
3006       FILE *f;
3007       uschar *sub_arg[2];
3008
3009       if ((expand_forbid & RDO_READFILE) != 0)
3010         {
3011         expand_string_message = US"file insertions are not permitted";
3012         goto EXPAND_FAILED;
3013         }
3014
3015       switch(read_subs(sub_arg, 2, 1, &s, skipping, TRUE, US"readfile"))
3016         {
3017         case 1: goto EXPAND_FAILED_CURLY;
3018         case 2:
3019         case 3: goto EXPAND_FAILED;
3020         }
3021
3022       /* If skipping, we don't actually do anything */
3023
3024       if (skipping) continue;
3025
3026       /* Open the file and read it */
3027
3028       f = Ufopen(sub_arg[0], "rb");
3029       if (f == NULL)
3030         {
3031         expand_string_message = string_open_failed(errno, "%s", sub_arg[0]);
3032         goto EXPAND_FAILED;
3033         }
3034
3035       yield = cat_file(f, yield, &size, &ptr, sub_arg[1]);
3036       fclose(f);
3037       continue;
3038       }
3039
3040     /* Handle "readsocket" to insert data from a Unix domain socket */
3041
3042     case EITEM_READSOCK:
3043       {
3044       int fd;
3045       int timeout = 5;
3046       int save_ptr = ptr;
3047       FILE *f;
3048       struct sockaddr_un sockun;         /* don't call this "sun" ! */
3049       uschar *arg;
3050       uschar *sub_arg[4];
3051
3052       if ((expand_forbid & RDO_READSOCK) != 0)
3053         {
3054         expand_string_message = US"socket insertions are not permitted";
3055         goto EXPAND_FAILED;
3056         }
3057
3058       /* Read up to 4 arguments, but don't do the end of item check afterwards,
3059       because there may be a string for expansion on failure. */
3060
3061       switch(read_subs(sub_arg, 4, 2, &s, skipping, FALSE, US"readsocket"))
3062         {
3063         case 1: goto EXPAND_FAILED_CURLY;
3064         case 2:                             /* Won't occur: no end check */
3065         case 3: goto EXPAND_FAILED;
3066         }
3067
3068       /* Sort out timeout, if given */
3069
3070       if (sub_arg[2] != NULL)
3071         {
3072         timeout = readconf_readtime(sub_arg[2], 0, FALSE);
3073         if (timeout < 0)
3074           {
3075           expand_string_message = string_sprintf("bad time value %s",
3076             sub_arg[2]);
3077           goto EXPAND_FAILED;
3078           }
3079         }
3080       else sub_arg[3] = NULL;                     /* No eol if no timeout */
3081
3082       /* If skipping, we don't actually do anything */
3083
3084       if (!skipping)
3085         {
3086         /* Make a connection to the socket */
3087
3088         if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
3089           {
3090           expand_string_message = string_sprintf("failed to create socket: %s",
3091             strerror(errno));
3092           goto SOCK_FAIL;
3093           }
3094
3095         sockun.sun_family = AF_UNIX;
3096         sprintf(sockun.sun_path, "%.*s", (int)(sizeof(sockun.sun_path)-1),
3097           sub_arg[0]);
3098         if(connect(fd, (struct sockaddr *)(&sockun), sizeof(sockun)) == -1)
3099           {
3100           expand_string_message = string_sprintf("failed to connect to socket "
3101             "%s: %s", sub_arg[0], strerror(errno));
3102           goto SOCK_FAIL;
3103           }
3104         DEBUG(D_expand) debug_printf("connected to socket %s\n", sub_arg[0]);
3105
3106         /* Write the request string, if not empty */
3107
3108         if (sub_arg[1][0] != 0)
3109           {
3110           int len = Ustrlen(sub_arg[1]);
3111           DEBUG(D_expand) debug_printf("writing \"%s\" to socket\n",
3112             sub_arg[1]);
3113           if (write(fd, sub_arg[1], len) != len)
3114             {
3115             expand_string_message = string_sprintf("request write to socket "
3116               "failed: %s", strerror(errno));
3117             goto SOCK_FAIL;
3118             }
3119           }
3120
3121         /* Now we need to read from the socket, under a timeout. The function
3122         that reads a file can be used. */
3123
3124         f = fdopen(fd, "rb");
3125         sigalrm_seen = FALSE;
3126         alarm(timeout);
3127         yield = cat_file(f, yield, &size, &ptr, sub_arg[3]);
3128         alarm(0);
3129         fclose(f);
3130
3131         /* After a timeout, we restore the pointer in the result, that is,
3132         make sure we add nothing from the socket. */
3133
3134         if (sigalrm_seen)
3135           {
3136           ptr = save_ptr;
3137           expand_string_message = US"socket read timed out";
3138           goto SOCK_FAIL;
3139           }
3140         }
3141
3142       /* The whole thing has worked (or we were skipping). If there is a
3143       failure string following, we need to skip it. */
3144
3145       if (*s == '{')
3146         {
3147         if (expand_string_internal(s+1, TRUE, &s, TRUE) == NULL)
3148           goto EXPAND_FAILED;
3149         if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3150         while (isspace(*s)) s++;
3151         }
3152       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3153       continue;
3154
3155       /* Come here on failure to create socket, connect socket, write to the
3156       socket, or timeout on reading. If another substring follows, expand and
3157       use it. Otherwise, those conditions give expand errors. */
3158
3159       SOCK_FAIL:
3160       if (*s != '{') goto EXPAND_FAILED;
3161       DEBUG(D_any) debug_printf("%s\n", expand_string_message);
3162       arg = expand_string_internal(s+1, TRUE, &s, FALSE);
3163       if (arg == NULL) goto EXPAND_FAILED;
3164       yield = string_cat(yield, &size, &ptr, arg, Ustrlen(arg));
3165       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3166       while (isspace(*s)) s++;
3167       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3168       continue;
3169       }
3170
3171     /* Handle "run" to execute a program. */
3172
3173     case EITEM_RUN:
3174       {
3175       FILE *f;
3176       uschar *old_lookup_value = NULL;
3177       uschar *arg;
3178       uschar **argv;
3179       pid_t pid;
3180       int fd_in, fd_out;
3181       int lsize = 0;
3182       int lptr = 0;
3183
3184       if ((expand_forbid & RDO_RUN) != 0)
3185         {
3186         expand_string_message = US"running a command is not permitted";
3187         goto EXPAND_FAILED;
3188         }
3189
3190       while (isspace(*s)) s++;
3191       if (*s != '{') goto EXPAND_FAILED_CURLY;
3192       arg = expand_string_internal(s+1, TRUE, &s, skipping);
3193       if (arg == NULL) goto EXPAND_FAILED;
3194       while (isspace(*s)) s++;
3195       if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3196
3197       if (skipping)   /* Just pretend it worked when we're skipping */
3198         {
3199         runrc = 0;
3200         }
3201       else
3202         {
3203         if (!transport_set_up_command(&argv,    /* anchor for arg list */
3204             arg,                                /* raw command */
3205             FALSE,                              /* don't expand the arguments */
3206             0,                                  /* not relevant when... */
3207             NULL,                               /* no transporting address */
3208             US"${run} expansion",               /* for error messages */
3209             &expand_string_message))            /* where to put error message */
3210           {
3211           goto EXPAND_FAILED;
3212           }
3213
3214         /* Create the child process, making it a group leader. */
3215
3216         pid = child_open(argv, NULL, 0077, &fd_in, &fd_out, TRUE);
3217
3218         if (pid < 0)
3219           {
3220           expand_string_message =
3221             string_sprintf("couldn't create child process: %s", strerror(errno));
3222           goto EXPAND_FAILED;
3223           }
3224
3225         /* Nothing is written to the standard input. */
3226
3227         close(fd_in);
3228
3229         /* Wait for the process to finish, applying the timeout, and inspect its
3230         return code for serious disasters. Simple non-zero returns are passed on.
3231         */
3232
3233         if ((runrc = child_close(pid, 60)) < 0)
3234           {
3235           if (runrc == -256)
3236             {
3237             expand_string_message = string_sprintf("command timed out");
3238             killpg(pid, SIGKILL);       /* Kill the whole process group */
3239             }
3240
3241           else if (runrc == -257)
3242             expand_string_message = string_sprintf("wait() failed: %s",
3243               strerror(errno));
3244
3245           else
3246             expand_string_message = string_sprintf("command killed by signal %d",
3247               -runrc);
3248
3249           goto EXPAND_FAILED;
3250           }
3251
3252         /* Read the pipe to get the command's output into $value (which is kept
3253         in lookup_value). */
3254
3255         f = fdopen(fd_out, "rb");
3256         old_lookup_value = lookup_value;
3257         lookup_value = NULL;
3258         lookup_value = cat_file(f, lookup_value, &lsize, &lptr, NULL);
3259         fclose(f);
3260         }
3261
3262       /* Process the yes/no strings */
3263
3264       switch(process_yesno(
3265                skipping,                     /* were previously skipping */
3266                runrc == 0,                   /* success/failure indicator */
3267                old_lookup_value,             /* value to reset for string2 */
3268                &s,                           /* input pointer */
3269                &yield,                       /* output pointer */
3270                &size,                        /* output size */
3271                &ptr,                         /* output current point */
3272                US"run"))                     /* condition type */
3273         {
3274         case 1: goto EXPAND_FAILED;          /* when all is well, the */
3275         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
3276         }
3277
3278       continue;
3279       }
3280
3281     /* Handle character translation for "tr" */
3282
3283     case EITEM_TR:
3284       {
3285       int oldptr = ptr;
3286       int o2m;
3287       uschar *sub[3];
3288
3289       switch(read_subs(sub, 3, 3, &s, skipping, TRUE, US"tr"))
3290         {
3291         case 1: goto EXPAND_FAILED_CURLY;
3292         case 2:
3293         case 3: goto EXPAND_FAILED;
3294         }
3295
3296       yield = string_cat(yield, &size, &ptr, sub[0], Ustrlen(sub[0]));
3297       o2m = Ustrlen(sub[2]) - 1;
3298
3299       if (o2m >= 0) for (; oldptr < ptr; oldptr++)
3300         {
3301         uschar *m = Ustrrchr(sub[1], yield[oldptr]);
3302         if (m != NULL)
3303           {
3304           int o = m - sub[1];
3305           yield[oldptr] = sub[2][(o < o2m)? o : o2m];
3306           }
3307         }
3308
3309       continue;
3310       }
3311
3312     /* Handle "hash", "length", "nhash", and "substr" when they are given with
3313     expanded arguments. */
3314
3315     case EITEM_HASH:
3316     case EITEM_LENGTH:
3317     case EITEM_NHASH:
3318     case EITEM_SUBSTR:
3319       {
3320       int i;
3321       int len;
3322       uschar *ret;
3323       int val[2] = { 0, -1 };
3324       uschar *sub[3];
3325
3326       /* "length" takes only 2 arguments whereas the others take 2 or 3.
3327       Ensure that sub[2] is set in the ${length case. */
3328
3329       sub[2] = NULL;
3330       switch(read_subs(sub, (item_type == EITEM_LENGTH)? 2:3, 2, &s, skipping,
3331              TRUE, name))
3332         {
3333         case 1: goto EXPAND_FAILED_CURLY;
3334         case 2:
3335         case 3: goto EXPAND_FAILED;
3336         }
3337
3338       /* Juggle the arguments if there are only two of them: always move the
3339       string to the last position and make ${length{n}{str}} equivalent to
3340       ${substr{0}{n}{str}}. See the defaults for val[] above. */
3341
3342       if (sub[2] == NULL)
3343         {
3344         sub[2] = sub[1];
3345         sub[1] = NULL;
3346         if (item_type == EITEM_LENGTH)
3347           {
3348           sub[1] = sub[0];
3349           sub[0] = NULL;
3350           }
3351         }
3352
3353       for (i = 0; i < 2; i++)
3354         {
3355         if (sub[i] == NULL) continue;
3356         val[i] = (int)Ustrtol(sub[i], &ret, 10);
3357         if (*ret != 0 || (i != 0 && val[i] < 0))
3358           {
3359           expand_string_message = string_sprintf("\"%s\" is not a%s number "
3360             "(in \"%s\" expansion)", sub[i], (i != 0)? " positive" : "", name);
3361           goto EXPAND_FAILED;
3362           }
3363         }
3364
3365       ret =
3366         (item_type == EITEM_HASH)?
3367           compute_hash(sub[2], val[0], val[1], &len) :
3368         (item_type == EITEM_NHASH)?
3369           compute_nhash(sub[2], val[0], val[1], &len) :
3370           extract_substr(sub[2], val[0], val[1], &len);
3371
3372       if (ret == NULL) goto EXPAND_FAILED;
3373       yield = string_cat(yield, &size, &ptr, ret, len);
3374       continue;
3375       }
3376
3377     /* Handle HMAC computation: ${hmac{<algorithm>}{<secret>}{<text>}}
3378     This code originally contributed by Steve Haslam. It currently supports
3379     the use of MD5 and SHA-1 hashes.
3380
3381     We need some workspace that is large enough to handle all the supported
3382     hash types. Use macros to set the sizes rather than be too elaborate. */
3383
3384     #define MAX_HASHLEN      20
3385     #define MAX_HASHBLOCKLEN 64
3386
3387     case EITEM_HMAC:
3388       {
3389       uschar *sub[3];
3390       md5 md5_base;
3391       sha1 sha1_base;
3392       void *use_base;
3393       int type, i;
3394       int hashlen;      /* Number of octets for the hash algorithm's output */
3395       int hashblocklen; /* Number of octets the hash algorithm processes */
3396       uschar *keyptr, *p;
3397       unsigned int keylen;
3398
3399       uschar keyhash[MAX_HASHLEN];
3400       uschar innerhash[MAX_HASHLEN];
3401       uschar finalhash[MAX_HASHLEN];
3402       uschar finalhash_hex[2*MAX_HASHLEN];
3403       uschar innerkey[MAX_HASHBLOCKLEN];
3404       uschar outerkey[MAX_HASHBLOCKLEN];
3405
3406       switch (read_subs(sub, 3, 3, &s, skipping, TRUE, name))
3407         {
3408         case 1: goto EXPAND_FAILED_CURLY;
3409         case 2:
3410         case 3: goto EXPAND_FAILED;
3411         }
3412
3413       if (Ustrcmp(sub[0], "md5") == 0)
3414         {
3415         type = HMAC_MD5;
3416         use_base = &md5_base;
3417         hashlen = 16;
3418         hashblocklen = 64;
3419         }
3420       else if (Ustrcmp(sub[0], "sha1") == 0)
3421         {
3422         type = HMAC_SHA1;
3423         use_base = &sha1_base;
3424         hashlen = 20;
3425         hashblocklen = 64;
3426         }
3427       else
3428         {
3429         expand_string_message =
3430           string_sprintf("hmac algorithm \"%s\" is not recognised", sub[0]);
3431         goto EXPAND_FAILED;
3432         }
3433
3434       keyptr = sub[1];
3435       keylen = Ustrlen(keyptr);
3436
3437       /* If the key is longer than the hash block length, then hash the key
3438       first */
3439
3440       if (keylen > hashblocklen)
3441         {
3442         chash_start(type, use_base);
3443         chash_end(type, use_base, keyptr, keylen, keyhash);
3444         keyptr = keyhash;
3445         keylen = hashlen;
3446         }
3447
3448       /* Now make the inner and outer key values */
3449
3450       memset(innerkey, 0x36, hashblocklen);
3451       memset(outerkey, 0x5c, hashblocklen);
3452
3453       for (i = 0; i < keylen; i++)
3454         {
3455         innerkey[i] ^= keyptr[i];
3456         outerkey[i] ^= keyptr[i];
3457         }
3458
3459       /* Now do the hashes */
3460
3461       chash_start(type, use_base);
3462       chash_mid(type, use_base, innerkey);
3463       chash_end(type, use_base, sub[2], Ustrlen(sub[2]), innerhash);
3464
3465       chash_start(type, use_base);
3466       chash_mid(type, use_base, outerkey);
3467       chash_end(type, use_base, innerhash, hashlen, finalhash);
3468
3469       /* Encode the final hash as a hex string */
3470
3471       p = finalhash_hex;
3472       for (i = 0; i < hashlen; i++)
3473         {
3474         *p++ = hex_digits[(finalhash[i] & 0xf0) >> 4];
3475         *p++ = hex_digits[finalhash[i] & 0x0f];
3476         }
3477
3478       DEBUG(D_any) debug_printf("HMAC[%s](%.*s,%.*s)=%.*s\n", sub[0],
3479         (int)keylen, keyptr, Ustrlen(sub[2]), sub[2], hashlen*2, finalhash_hex);
3480
3481       yield = string_cat(yield, &size, &ptr, finalhash_hex, hashlen*2);
3482       }
3483
3484     continue;
3485
3486     /* Handle global substitution for "sg" - like Perl's s/xxx/yyy/g operator.
3487     We have to save the numerical variables and restore them afterwards. */
3488
3489     case EITEM_SG:
3490       {
3491       const pcre *re;
3492       int moffset, moffsetextra, slen;
3493       int roffset;
3494       int emptyopt;
3495       const uschar *rerror;
3496       uschar *subject;
3497       uschar *sub[3];
3498       int save_expand_nmax =
3499         save_expand_strings(save_expand_nstring, save_expand_nlength);
3500
3501       switch(read_subs(sub, 3, 3, &s, skipping, TRUE, US"sg"))
3502         {
3503         case 1: goto EXPAND_FAILED_CURLY;
3504         case 2:
3505         case 3: goto EXPAND_FAILED;
3506         }
3507
3508       /* Compile the regular expression */
3509
3510       re = pcre_compile(CS sub[1], PCRE_COPT, (const char **)&rerror, &roffset,
3511         NULL);
3512
3513       if (re == NULL)
3514         {
3515         expand_string_message = string_sprintf("regular expression error in "
3516           "\"%s\": %s at offset %d", sub[1], rerror, roffset);
3517         goto EXPAND_FAILED;
3518         }
3519
3520       /* Now run a loop to do the substitutions as often as necessary. It ends
3521       when there are no more matches. Take care over matches of the null string;
3522       do the same thing as Perl does. */
3523
3524       subject = sub[0];
3525       slen = Ustrlen(sub[0]);
3526       moffset = moffsetextra = 0;
3527       emptyopt = 0;
3528
3529       for (;;)
3530         {
3531         int ovector[3*(EXPAND_MAXN+1)];
3532         int n = pcre_exec(re, NULL, CS subject, slen, moffset + moffsetextra,
3533           PCRE_EOPT | emptyopt, ovector, sizeof(ovector)/sizeof(int));
3534         int nn;
3535         uschar *insert;
3536
3537         /* No match - if we previously set PCRE_NOTEMPTY after a null match, this
3538         is not necessarily the end. We want to repeat the match from one
3539         character further along, but leaving the basic offset the same (for
3540         copying below). We can't be at the end of the string - that was checked
3541         before setting PCRE_NOTEMPTY. If PCRE_NOTEMPTY is not set, we are
3542         finished; copy the remaining string and end the loop. */
3543
3544         if (n < 0)
3545           {
3546           if (emptyopt != 0)
3547             {
3548             moffsetextra = 1;
3549             emptyopt = 0;
3550             continue;
3551             }
3552           yield = string_cat(yield, &size, &ptr, subject+moffset, slen-moffset);
3553           break;
3554           }
3555
3556         /* Match - set up for expanding the replacement. */
3557
3558         if (n == 0) n = EXPAND_MAXN + 1;
3559         expand_nmax = 0;
3560         for (nn = 0; nn < n*2; nn += 2)
3561           {
3562           expand_nstring[expand_nmax] = subject + ovector[nn];
3563           expand_nlength[expand_nmax++] = ovector[nn+1] - ovector[nn];
3564           }
3565         expand_nmax--;
3566
3567         /* Copy the characters before the match, plus the expanded insertion. */
3568
3569         yield = string_cat(yield, &size, &ptr, subject + moffset,
3570           ovector[0] - moffset);
3571         insert = expand_string(sub[2]);
3572         if (insert == NULL) goto EXPAND_FAILED;
3573         yield = string_cat(yield, &size, &ptr, insert, Ustrlen(insert));
3574
3575         moffset = ovector[1];
3576         moffsetextra = 0;
3577         emptyopt = 0;
3578
3579         /* If we have matched an empty string, first check to see if we are at
3580         the end of the subject. If so, the loop is over. Otherwise, mimic
3581         what Perl's /g options does. This turns out to be rather cunning. First
3582         we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match a non-empty
3583         string at the same point. If this fails (picked up above) we advance to
3584         the next character. */
3585
3586         if (ovector[0] == ovector[1])
3587           {
3588           if (ovector[0] == slen) break;
3589           emptyopt = PCRE_NOTEMPTY | PCRE_ANCHORED;
3590           }
3591         }
3592
3593       /* All done - restore numerical variables. */
3594
3595       restore_expand_strings(save_expand_nmax, save_expand_nstring,
3596         save_expand_nlength);
3597       continue;
3598       }
3599
3600     /* Handle keyed and numbered substring extraction. If the first argument
3601     consists entirely of digits, then a numerical extraction is assumed. */
3602
3603     case EITEM_EXTRACT:
3604       {
3605       int i;
3606       int j = 2;
3607       int field_number = 1;
3608       BOOL field_number_set = FALSE;
3609       uschar *save_lookup_value = lookup_value;
3610       uschar *sub[3];
3611       int save_expand_nmax =
3612         save_expand_strings(save_expand_nstring, save_expand_nlength);
3613
3614       /* Read the arguments */
3615
3616       for (i = 0; i < j; i++)
3617         {
3618         while (isspace(*s)) s++;
3619         if (*s == '{')
3620           {
3621           sub[i] = expand_string_internal(s+1, TRUE, &s, skipping);
3622           if (sub[i] == NULL) goto EXPAND_FAILED;
3623           if (*s++ != '}') goto EXPAND_FAILED_CURLY;
3624
3625           /* After removal of leading and trailing white space, the first
3626           argument must not be empty; if it consists entirely of digits
3627           (optionally preceded by a minus sign), this is a numerical
3628           extraction, and we expect 3 arguments. */
3629
3630           if (i == 0)
3631             {
3632             int len;
3633             int x = 0;
3634             uschar *p = sub[0];
3635
3636             while (isspace(*p)) p++;
3637             sub[0] = p;
3638
3639             len = Ustrlen(p);
3640             while (len > 0 && isspace(p[len-1])) len--;
3641             p[len] = 0;
3642
3643             if (*p == 0)
3644               {
3645               expand_string_message = US"first argument of \"expand\" must not "
3646                 "be empty";
3647               goto EXPAND_FAILED;
3648               }
3649
3650             if (*p == '-')
3651               {
3652               field_number = -1;
3653               p++;
3654               }
3655             while (*p != 0 && isdigit(*p)) x = x * 10 + *p++ - '0';
3656             if (*p == 0)
3657               {
3658               field_number *= x;
3659               j = 3;               /* Need 3 args */
3660               field_number_set = TRUE;
3661               }
3662             }
3663           }
3664         else goto EXPAND_FAILED_CURLY;
3665         }
3666
3667       /* Extract either the numbered or the keyed substring into $value. If
3668       skipping, just pretend the extraction failed. */
3669
3670       lookup_value = skipping? NULL : field_number_set?
3671         expand_gettokened(field_number, sub[1], sub[2]) :
3672         expand_getkeyed(sub[0], sub[1]);
3673
3674       /* If no string follows, $value gets substituted; otherwise there can
3675       be yes/no strings, as for lookup or if. */
3676
3677       switch(process_yesno(
3678                skipping,                     /* were previously skipping */
3679                lookup_value != NULL,         /* success/failure indicator */
3680                save_lookup_value,            /* value to reset for string2 */
3681                &s,                           /* input pointer */
3682                &yield,                       /* output pointer */
3683                &size,                        /* output size */
3684                &ptr,                         /* output current point */
3685                US"extract"))                 /* condition type */
3686         {
3687         case 1: goto EXPAND_FAILED;          /* when all is well, the */
3688         case 2: goto EXPAND_FAILED_CURLY;    /* returned value is 0 */
3689         }
3690
3691       /* All done - restore numerical variables. */
3692
3693       restore_expand_strings(save_expand_nmax, save_expand_nstring,
3694         save_expand_nlength);
3695
3696       continue;
3697       }
3698     }
3699
3700   /* Control reaches here if the name is not recognized as one of the more
3701   complicated expansion items. Check for the "operator" syntax (name terminated
3702   by a colon). Some of the operators have arguments, separated by _ from the
3703   name. */
3704
3705   if (*s == ':')
3706     {
3707     int c;
3708     uschar *arg = NULL;
3709     uschar *sub = expand_string_internal(s+1, TRUE, &s, skipping);
3710     if (sub == NULL) goto EXPAND_FAILED;
3711     s++;
3712
3713     /* Owing to an historical mis-design, an underscore may be part of the
3714     operator name, or it may introduce arguments.  We therefore first scan the
3715     table of names that contain underscores. If there is no match, we cut off
3716     the arguments and then scan the main table. */
3717
3718     c = chop_match(name, op_table_underscore,
3719       sizeof(op_table_underscore)/sizeof(uschar *));
3720
3721     if (c < 0)
3722       {
3723       arg = Ustrchr(name, '_');
3724       if (arg != NULL) *arg = 0;
3725       c = chop_match(name, op_table_main,
3726         sizeof(op_table_main)/sizeof(uschar *));
3727       if (c >= 0) c += sizeof(op_table_underscore)/sizeof(uschar *);
3728       if (arg != NULL) *arg++ = '_';   /* Put back for error messages */
3729       }
3730
3731     /* If we are skipping, we don't need to perform the operation at all.
3732     This matters for operations like "mask", because the data may not be
3733     in the correct format when skipping. For example, the expression may test
3734     for the existence of $sender_host_address before trying to mask it. For
3735     other operations, doing them may not fail, but it is a waste of time. */
3736
3737     if (skipping && c >= 0) continue;
3738
3739     /* Otherwise, switch on the operator type */
3740
3741     switch(c)
3742       {
3743       case EOP_BASE62:
3744         {
3745         uschar *t;
3746         unsigned long int n = Ustrtoul(sub, &t, 10);
3747         if (*t != 0)
3748           {
3749           expand_string_message = string_sprintf("argument for base62 "
3750             "operator is \"%s\", which is not a decimal number", sub);
3751           goto EXPAND_FAILED;
3752           }
3753         t = string_base62(n);
3754         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
3755         continue;
3756         }
3757
3758       case EOP_BASE62D:
3759         {
3760         uschar buf[16];
3761         uschar *tt = sub;
3762         unsigned long int n = 0;
3763         while (*tt != 0)
3764           {
3765           uschar *t = Ustrchr(base62_chars, *tt++);
3766           if (t == NULL)
3767             {
3768             expand_string_message = string_sprintf("argument for base62d "
3769               "operator is \"%s\", which is not a base 62 number", sub);
3770             goto EXPAND_FAILED;
3771             }
3772           n = n * 62 + (t - base62_chars);
3773           }
3774         (void)sprintf(CS buf, "%ld", n);
3775         yield = string_cat(yield, &size, &ptr, buf, Ustrlen(buf));
3776         continue;
3777         }
3778
3779       case EOP_EXPAND:
3780         {
3781         uschar *expanded = expand_string_internal(sub, FALSE, NULL, skipping);
3782         if (expanded == NULL)
3783           {
3784           expand_string_message =
3785             string_sprintf("internal expansion of \"%s\" failed: %s", sub,
3786               expand_string_message);
3787           goto EXPAND_FAILED;
3788           }
3789         yield = string_cat(yield, &size, &ptr, expanded, Ustrlen(expanded));
3790         continue;
3791         }
3792
3793       case EOP_LC:
3794         {
3795         int count = 0;
3796         uschar *t = sub - 1;
3797         while (*(++t) != 0) { *t = tolower(*t); count++; }
3798         yield = string_cat(yield, &size, &ptr, sub, count);
3799         continue;
3800         }
3801
3802       case EOP_UC:
3803         {
3804         int count = 0;
3805         uschar *t = sub - 1;
3806         while (*(++t) != 0) { *t = toupper(*t); count++; }
3807         yield = string_cat(yield, &size, &ptr, sub, count);
3808         continue;
3809         }
3810
3811       case EOP_MD5:
3812         {
3813         md5 base;
3814         uschar digest[16];
3815         int j;
3816         char st[33];
3817         md5_start(&base);
3818         md5_end(&base, sub, Ustrlen(sub), digest);
3819         for(j = 0; j < 16; j++) sprintf(st+2*j, "%02x", digest[j]);
3820         yield = string_cat(yield, &size, &ptr, US st, (int)strlen(st));
3821         continue;
3822         }
3823
3824       case EOP_SHA1:
3825         {
3826         sha1 base;
3827         uschar digest[20];
3828         int j;
3829         char st[41];
3830         sha1_start(&base);
3831         sha1_end(&base, sub, Ustrlen(sub), digest);
3832         for(j = 0; j < 20; j++) sprintf(st+2*j, "%02X", digest[j]);
3833         yield = string_cat(yield, &size, &ptr, US st, (int)strlen(st));
3834         continue;
3835         }
3836
3837       /* Convert hex encoding to base64 encoding */
3838
3839       case EOP_HEX2B64:
3840         {
3841         int c = 0;
3842         int b = -1;
3843         uschar *in = sub;
3844         uschar *out = sub;
3845         uschar *enc;
3846
3847         for (enc = sub; *enc != 0; enc++)
3848           {
3849           if (!isxdigit(*enc))
3850             {
3851             expand_string_message = string_sprintf("\"%s\" is not a hex "
3852               "string", sub);
3853             goto EXPAND_FAILED;
3854             }
3855           c++;
3856           }
3857
3858         if ((c & 1) != 0)
3859           {
3860           expand_string_message = string_sprintf("\"%s\" contains an odd "
3861             "number of characters", sub);
3862           goto EXPAND_FAILED;
3863           }
3864
3865         while ((c = *in++) != 0)
3866           {
3867           if (isdigit(c)) c -= '0';
3868           else c = toupper(c) - 'A' + 10;
3869           if (b == -1)
3870             {
3871             b = c << 4;
3872             }
3873           else
3874             {
3875             *out++ = b | c;
3876             b = -1;
3877             }
3878           }
3879
3880         enc = auth_b64encode(sub, out - sub);
3881         yield = string_cat(yield, &size, &ptr, enc, Ustrlen(enc));
3882         continue;
3883         }
3884
3885       /* mask applies a mask to an IP address; for example the result of
3886       ${mask:131.111.10.206/28} is 131.111.10.192/28. */
3887
3888       case EOP_MASK:
3889         {
3890         int count;
3891         uschar *endptr;
3892         int binary[4];
3893         int mask, maskoffset;
3894         int type = string_is_ip_address(sub, &maskoffset);
3895         uschar buffer[64];
3896
3897         if (type == 0)
3898           {
3899           expand_string_message = string_sprintf("\"%s\" is not an IP address",
3900            sub);
3901           goto EXPAND_FAILED;
3902           }
3903
3904         if (maskoffset == 0)
3905           {
3906           expand_string_message = string_sprintf("missing mask value in \"%s\"",
3907             sub);
3908           goto EXPAND_FAILED;
3909           }
3910
3911         mask = Ustrtol(sub + maskoffset + 1, &endptr, 10);
3912
3913         if (*endptr != 0 || mask < 0 || mask > ((type == 4)? 32 : 128))
3914           {
3915           expand_string_message = string_sprintf("mask value too big in \"%s\"",
3916             sub);
3917           goto EXPAND_FAILED;
3918           }
3919
3920         /* Convert the address to binary integer(s) and apply the mask */
3921
3922         sub[maskoffset] = 0;
3923         count = host_aton(sub, binary);
3924         host_mask(count, binary, mask);
3925
3926         /* Convert to masked textual format and add to output. */
3927
3928         yield = string_cat(yield, &size, &ptr, buffer,
3929           host_nmtoa(count, binary, mask, buffer));
3930         continue;
3931         }
3932
3933       case EOP_ADDRESS:
3934       case EOP_LOCAL_PART:
3935       case EOP_DOMAIN:
3936         {
3937         uschar *error;
3938         int start, end, domain;
3939         uschar *t = parse_extract_address(sub, &error, &start, &end, &domain,
3940           FALSE);
3941         if (t != NULL)
3942           {
3943           if (c != EOP_DOMAIN)
3944             {
3945             if (c == EOP_LOCAL_PART && domain != 0) end = start + domain - 1;
3946             yield = string_cat(yield, &size, &ptr, sub+start, end-start);
3947             }
3948           else if (domain != 0)
3949             {
3950             domain += start;
3951             yield = string_cat(yield, &size, &ptr, sub+domain, end-domain);
3952             }
3953           }
3954         continue;
3955         }
3956
3957       /* quote puts a string in quotes if it is empty or contains anything
3958       other than alphamerics, underscore, dot, or hyphen.
3959
3960       quote_local_part puts a string in quotes if RFC 2821/2822 requires it to
3961       be quoted in order to be a valid local part.
3962
3963       In both cases, newlines and carriage returns are converted into \n and \r
3964       respectively */
3965
3966       case EOP_QUOTE:
3967       case EOP_QUOTE_LOCAL_PART:
3968       if (arg == NULL)
3969         {
3970         BOOL needs_quote = (*sub == 0);      /* TRUE for empty string */
3971         uschar *t = sub - 1;
3972
3973         if (c == EOP_QUOTE)
3974           {
3975           while (!needs_quote && *(++t) != 0)
3976             needs_quote = !isalnum(*t) && !strchr("_-.", *t);
3977           }
3978         else  /* EOP_QUOTE_LOCAL_PART */
3979           {
3980           while (!needs_quote && *(++t) != 0)
3981             needs_quote = !isalnum(*t) &&
3982               strchr("!#$%&'*+-/=?^_`{|}~", *t) == NULL &&
3983               (*t != '.' || t == sub || t[1] == 0);
3984           }
3985
3986         if (needs_quote)
3987           {
3988           yield = string_cat(yield, &size, &ptr, US"\"", 1);
3989           t = sub - 1;
3990           while (*(++t) != 0)
3991             {
3992             if (*t == '\n')
3993               yield = string_cat(yield, &size, &ptr, US"\\n", 2);
3994             else if (*t == '\r')
3995               yield = string_cat(yield, &size, &ptr, US"\\r", 2);
3996             else
3997               {
3998               if (*t == '\\' || *t == '"')
3999                 yield = string_cat(yield, &size, &ptr, US"\\", 1);
4000               yield = string_cat(yield, &size, &ptr, t, 1);
4001               }
4002             }
4003           yield = string_cat(yield, &size, &ptr, US"\"", 1);
4004           }
4005         else yield = string_cat(yield, &size, &ptr, sub, Ustrlen(sub));
4006         continue;
4007         }
4008
4009       /* quote_lookuptype does lookup-specific quoting */
4010
4011       else
4012         {
4013         int n;
4014         uschar *opt = Ustrchr(arg, '_');
4015
4016         if (opt != NULL) *opt++ = 0;
4017
4018         n = search_findtype(arg, Ustrlen(arg));
4019         if (n < 0)
4020           {
4021           expand_string_message = search_error_message;
4022           goto EXPAND_FAILED;
4023           }
4024
4025         if (lookup_list[n].quote != NULL)
4026           sub = (lookup_list[n].quote)(sub, opt);
4027         else if (opt != NULL) sub = NULL;
4028
4029         if (sub == NULL)
4030           {
4031           expand_string_message = string_sprintf(
4032             "\"%s\" unrecognized after \"${quote_%s\"",
4033             opt, arg);
4034           goto EXPAND_FAILED;
4035           }
4036
4037         yield = string_cat(yield, &size, &ptr, sub, Ustrlen(sub));
4038         continue;
4039         }
4040
4041       /* rx quote sticks in \ before any non-alphameric character so that
4042       the insertion works in a regular expression. */
4043
4044       case EOP_RXQUOTE:
4045         {
4046         uschar *t = sub - 1;
4047         while (*(++t) != 0)
4048           {
4049           if (!isalnum(*t))
4050             yield = string_cat(yield, &size, &ptr, US"\\", 1);
4051           yield = string_cat(yield, &size, &ptr, t, 1);
4052           }
4053         continue;
4054         }
4055
4056       /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as
4057       prescribed by the RFC, if there are characters that need to be encoded */
4058
4059       case EOP_RFC2047:
4060         {
4061         uschar buffer[1024];
4062         uschar *string = parse_quote_2047(sub, Ustrlen(sub), headers_charset,
4063           buffer, sizeof(buffer));
4064         yield = string_cat(yield, &size, &ptr, string, Ustrlen(string));
4065         continue;
4066         }
4067
4068       /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into
4069       underscores */
4070
4071       case EOP_FROM_UTF8:
4072         {
4073         while (*sub != 0)
4074           {
4075           int c;
4076           uschar buff[4];
4077           GETUTF8INC(c, sub);
4078           if (c > 255) c = '_';
4079           buff[0] = c;
4080           yield = string_cat(yield, &size, &ptr, buff, 1);
4081           }
4082         continue;
4083         }
4084
4085       /* escape turns all non-printing characters into escape sequences. */
4086
4087       case EOP_ESCAPE:
4088         {
4089         uschar *t = string_printing(sub);
4090         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
4091         continue;
4092         }
4093
4094       /* Handle numeric expression evaluation */
4095
4096       case EOP_EVAL:
4097       case EOP_EVAL10:
4098         {
4099         uschar *save_sub = sub;
4100         uschar *error = NULL;
4101         int n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE);
4102         if (error != NULL)
4103           {
4104           expand_string_message = string_sprintf("error in expression "
4105             "evaluation: %s (after processing \"%.*s\")", error, sub-save_sub,
4106               save_sub);
4107           goto EXPAND_FAILED;
4108           }
4109         sprintf(CS var_buffer, "%d", n);
4110         yield = string_cat(yield, &size, &ptr, var_buffer, Ustrlen(var_buffer));
4111         continue;
4112         }
4113
4114       /* Handle time period formating */
4115
4116       case EOP_TIME_INTERVAL:
4117         {
4118         int n;
4119         uschar *t = read_number(&n, sub);
4120         if (*t != 0) /* Not A Number*/
4121           {
4122           expand_string_message = string_sprintf("string \"%s\" is not a "
4123             "positive number in \"%s\" operator", sub, name);
4124           goto EXPAND_FAILED;
4125           }
4126         t = readconf_printtime(n);
4127         yield = string_cat(yield, &size, &ptr, t, Ustrlen(t));
4128         continue;
4129         }
4130
4131       /* Convert string to base64 encoding */
4132
4133       case EOP_STR2B64:
4134         {
4135         uschar *encstr = auth_b64encode(sub, Ustrlen(sub));
4136         yield = string_cat(yield, &size, &ptr, encstr, Ustrlen(encstr));
4137         continue;
4138         }
4139
4140       /* strlen returns the length of the string */
4141
4142       case EOP_STRLEN:
4143         {
4144         uschar buff[24];
4145         (void)sprintf(CS buff, "%d", Ustrlen(sub));
4146         yield = string_cat(yield, &size, &ptr, buff, Ustrlen(buff));
4147         continue;
4148         }
4149
4150       /* length_n or l_n takes just the first n characters or the whole string,
4151       whichever is the shorter;
4152
4153       substr_m_n, and s_m_n take n characters from offset m; negative m take
4154       from the end; l_n is synonymous with s_0_n. If n is omitted in substr it
4155       takes the rest, either to the right or to the left.
4156
4157       hash_n or h_n makes a hash of length n from the string, yielding n
4158       characters from the set a-z; hash_n_m makes a hash of length n, but
4159       uses m characters from the set a-zA-Z0-9.
4160
4161       nhash_n returns a single number between 0 and n-1 (in text form), while
4162       nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies
4163       between 0 and n-1 and the second between 0 and m-1. */
4164
4165       case EOP_LENGTH:
4166       case EOP_L:
4167       case EOP_SUBSTR:
4168       case EOP_S:
4169       case EOP_HASH:
4170       case EOP_H:
4171       case EOP_NHASH:
4172       case EOP_NH:
4173         {
4174         int sign = 1;
4175         int value1 = 0;
4176         int value2 = -1;
4177         int *pn;
4178         int len;
4179         uschar *ret;
4180
4181         if (arg == NULL)
4182           {
4183           expand_string_message = string_sprintf("missing values after %s",
4184             name);
4185           goto EXPAND_FAILED;
4186           }
4187
4188         /* "length" has only one argument, effectively being synonymous with
4189         substr_0_n. */
4190
4191         if (c == EOP_LENGTH || c == EOP_L)
4192           {
4193           pn = &value2;
4194           value2 = 0;
4195           }
4196
4197         /* The others have one or two arguments; for "substr" the first may be
4198         negative. The second being negative means "not supplied". */
4199
4200         else
4201           {
4202           pn = &value1;
4203           if (name[0] == 's' && *arg == '-') { sign = -1; arg++; }
4204           }
4205
4206         /* Read up to two numbers, separated by underscores */
4207
4208         ret = arg;
4209         while (*arg != 0)
4210           {
4211           if (arg != ret && *arg == '_' && pn == &value1)
4212             {
4213             pn = &value2;
4214             value2 = 0;
4215             if (arg[1] != 0) arg++;
4216             }
4217           else if (!isdigit(*arg))
4218             {
4219             expand_string_message =
4220               string_sprintf("non-digit after underscore in \"%s\"", name);
4221             goto EXPAND_FAILED;
4222             }
4223           else *pn = (*pn)*10 + *arg++ - '0';
4224           }
4225         value1 *= sign;
4226
4227         /* Perform the required operation */
4228
4229         ret =
4230           (c == EOP_HASH || c == EOP_H)?
4231              compute_hash(sub, value1, value2, &len) :
4232           (c == EOP_NHASH || c == EOP_NH)?
4233              compute_nhash(sub, value1, value2, &len) :
4234              extract_substr(sub, value1, value2, &len);
4235
4236         if (ret == NULL) goto EXPAND_FAILED;
4237         yield = string_cat(yield, &size, &ptr, ret, len);
4238         continue;
4239         }
4240
4241       /* Stat a path */
4242
4243       case EOP_STAT:
4244         {
4245         uschar *s;
4246         uschar smode[12];
4247         uschar **modetable[3];
4248         int i;
4249         mode_t mode;
4250         struct stat st;
4251
4252         if (stat(CS sub, &st) < 0)
4253           {
4254           expand_string_message = string_sprintf("stat(%s) failed: %s",
4255             sub, strerror(errno));
4256           goto EXPAND_FAILED;
4257           }
4258         mode = st.st_mode;
4259         switch (mode & S_IFMT)
4260           {
4261           case S_IFIFO: smode[0] = 'p'; break;
4262           case S_IFCHR: smode[0] = 'c'; break;
4263           case S_IFDIR: smode[0] = 'd'; break;
4264           case S_IFBLK: smode[0] = 'b'; break;
4265           case S_IFREG: smode[0] = '-'; break;
4266           default: smode[0] = '?'; break;
4267           }
4268
4269         modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky;
4270         modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid;
4271         modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid;
4272
4273         for (i = 0; i < 3; i++)
4274           {
4275           memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3);
4276           mode >>= 3;
4277           }
4278
4279         smode[10] = 0;
4280         s = string_sprintf("mode=%04lo smode=%s inode=%ld device=%ld links=%ld "
4281           "uid=%ld gid=%ld size=%ld atime=%ld mtime=%ld ctime=%ld",
4282           (long)(st.st_mode & 077777), smode, (long)st.st_ino,
4283           (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid,
4284           (long)st.st_gid, (long)st.st_size, (long)st.st_atime,
4285           (long)st.st_mtime, (long)st.st_ctime);
4286         yield = string_cat(yield, &size, &ptr, s, Ustrlen(s));
4287         continue;
4288         }
4289
4290       /* Unknown operator */
4291
4292       default:
4293       expand_string_message =
4294         string_sprintf("unknown expansion operator \"%s\"", name);
4295       goto EXPAND_FAILED;
4296       }
4297     }
4298
4299   /* Handle a plain name. If this is the first thing in the expansion, release
4300   the pre-allocated buffer. If the result data is known to be in a new buffer,
4301   newsize will be set to the size of that buffer, and we can just point at that
4302   store instead of copying. Many expansion strings contain just one reference,
4303   so this is a useful optimization, especially for humungous headers
4304   ($message_headers). */
4305
4306   if (*s++ == '}')
4307     {
4308     int len;
4309     int newsize = 0;
4310     if (ptr == 0)
4311       {
4312       store_reset(yield);
4313       yield = NULL;
4314       size = 0;
4315       }
4316     value = find_variable(name, FALSE, skipping, &newsize);
4317     if (value == NULL)
4318       {
4319       expand_string_message =
4320         string_sprintf("unknown variable in \"${%s}\"", name);
4321       goto EXPAND_FAILED;
4322       }
4323     len = Ustrlen(value);
4324     if (yield == NULL && newsize != 0)
4325       {
4326       yield = value;
4327       size = newsize;
4328       ptr = len;
4329       }
4330     else yield = string_cat(yield, &size, &ptr, value, len);
4331     continue;
4332     }
4333
4334   /* Else there's something wrong */
4335
4336   expand_string_message =
4337     string_sprintf("\"${%s\" is not a known operator (or a } is missing "
4338     "in a variable reference)", name);
4339   goto EXPAND_FAILED;
4340   }
4341
4342 /* If we hit the end of the string when ket_ends is set, there is a missing
4343 terminating brace. */
4344
4345 if (ket_ends && *s == 0)
4346   {
4347   expand_string_message = malformed_header?
4348     US"missing } at end of string - could be header name not terminated by colon"
4349     :
4350     US"missing } at end of string";
4351   goto EXPAND_FAILED;
4352   }
4353
4354 /* Expansion succeeded; yield may still be NULL here if nothing was actually
4355 added to the string. If so, set up an empty string. Add a terminating zero. If
4356 left != NULL, return a pointer to the terminator. */
4357
4358 if (yield == NULL) yield = store_get(1);
4359 yield[ptr] = 0;
4360 if (left != NULL) *left = s;
4361
4362 /* Any stacking store that was used above the final string is no longer needed.
4363 In many cases the final string will be the first one that was got and so there
4364 will be optimal store usage. */
4365
4366 store_reset(yield + ptr + 1);
4367 DEBUG(D_expand)
4368   {
4369   debug_printf("expanding: %.*s\n   result: %s\n", (int)(s - string), string,
4370     yield);
4371   if (skipping) debug_printf("skipping: result is not used\n");
4372   }
4373 return yield;
4374
4375 /* This is the failure exit: easiest to program with a goto. We still need
4376 to update the pointer to the terminator, for cases of nested calls with "fail".
4377 */
4378
4379 EXPAND_FAILED_CURLY:
4380 expand_string_message = malformed_header?
4381   US"missing or misplaced { or } - could be header name not terminated by colon"
4382   :
4383   US"missing or misplaced { or }";
4384
4385 /* At one point, Exim reset the store to yield (if yield was not NULL), but
4386 that is a bad idea, because expand_string_message is in dynamic store. */
4387
4388 EXPAND_FAILED:
4389 if (left != NULL) *left = s;
4390 DEBUG(D_expand)
4391   {
4392   debug_printf("failed to expand: %s\n", string);
4393   debug_printf("   error message: %s\n", expand_string_message);
4394   if (expand_string_forcedfail) debug_printf("failure was forced\n");
4395   }
4396 return NULL;
4397 }
4398
4399
4400 /* This is the external function call. Do a quick check for any expansion
4401 metacharacters, and if there are none, just return the input string.
4402
4403 Argument: the string to be expanded
4404 Returns:  the expanded string, or NULL if expansion failed; if failure was
4405           due to a lookup deferring, search_find_defer will be TRUE
4406 */
4407
4408 uschar *
4409 expand_string(uschar *string)
4410 {
4411 search_find_defer = FALSE;
4412 malformed_header = FALSE;
4413 return (Ustrpbrk(string, "$\\") == NULL)? string :
4414   expand_string_internal(string, FALSE, NULL, FALSE);
4415 }
4416
4417
4418
4419 /*************************************************
4420 *              Expand and copy                   *
4421 *************************************************/
4422
4423 /* Now and again we want to expand a string and be sure that the result is in a
4424 new bit of store. This function does that.
4425
4426 Argument: the string to be expanded
4427 Returns:  the expanded string, always in a new bit of store, or NULL
4428 */
4429
4430 uschar *
4431 expand_string_copy(uschar *string)
4432 {
4433 uschar *yield = expand_string(string);
4434 if (yield == string) yield = string_copy(string);
4435 return yield;
4436 }
4437
4438
4439
4440 /*************************************************
4441 *        Expand and interpret as an integer      *
4442 *************************************************/
4443
4444 /* Expand a string, and convert the result into an integer.
4445
4446 Argument: the string to be expanded
4447
4448 Returns:  the integer value, or
4449           -1 for an expansion error               ) in both cases, message in
4450           -2 for an integer interpretation error  ) expand_string_message
4451
4452 */
4453
4454 int
4455 expand_string_integer(uschar *string)
4456 {
4457 long int value;
4458 uschar *s = expand_string(string);
4459 uschar *msg = US"invalid integer \"%s\"";
4460 uschar *endptr;
4461
4462 if (s == NULL) return -1;
4463
4464 /* On an overflow, strtol() returns LONG_MAX or LONG_MIN, and sets errno
4465 to ERANGE. When there isn't an overflow, errno is not changed, at least on some
4466 systems, so we set it zero ourselves. */
4467
4468 errno = 0;
4469 value = strtol(CS s, CSS &endptr, 0);
4470
4471 if (endptr == s)
4472   {
4473   msg = US"integer expected but \"%s\" found";
4474   }
4475 else
4476   {
4477   /* Ensure we can cast this down to an int */
4478   if (value > INT_MAX  || value < INT_MIN) errno = ERANGE;
4479
4480   if (errno != ERANGE)
4481     {
4482     if (tolower(*endptr) == 'k')
4483       {
4484       if (value > INT_MAX/1024 || value < INT_MIN/1024) errno = ERANGE;
4485         else value *= 1024;
4486       endptr++;
4487       }
4488     else if (tolower(*endptr) == 'm')
4489       {
4490       if (value > INT_MAX/(1024*1024) || value < INT_MIN/(1024*1024))
4491         errno = ERANGE;
4492       else value *= 1024*1024;
4493       endptr++;
4494       }
4495     }
4496   if (errno == ERANGE)
4497     msg = US"absolute value of integer \"%s\" is too large (overflow)";
4498   else
4499     {
4500     while (isspace(*endptr)) endptr++;
4501     if (*endptr == 0) return (int)value;
4502     }
4503   }
4504
4505 expand_string_message = string_sprintf(CS msg, s);
4506 return -2;
4507 }
4508
4509
4510
4511 /*************************************************
4512 **************************************************
4513 *             Stand-alone test program           *
4514 **************************************************
4515 *************************************************/
4516
4517 #ifdef STAND_ALONE
4518
4519
4520 BOOL
4521 regex_match_and_setup(const pcre *re, uschar *subject, int options, int setup)
4522 {
4523 int ovector[3*(EXPAND_MAXN+1)];
4524 int n = pcre_exec(re, NULL, subject, Ustrlen(subject), 0, PCRE_EOPT|options,
4525   ovector, sizeof(ovector)/sizeof(int));
4526 BOOL yield = n >= 0;
4527 if (n == 0) n = EXPAND_MAXN + 1;
4528 if (yield)
4529   {
4530   int nn;
4531   expand_nmax = (setup < 0)? 0 : setup + 1;
4532   for (nn = (setup < 0)? 0 : 2; nn < n*2; nn += 2)
4533     {
4534     expand_nstring[expand_nmax] = subject + ovector[nn];
4535     expand_nlength[expand_nmax++] = ovector[nn+1] - ovector[nn];
4536     }
4537   expand_nmax--;
4538   }
4539 return yield;
4540 }
4541
4542
4543 int main(int argc, uschar **argv)
4544 {
4545 int i;
4546 uschar buffer[1024];
4547
4548 debug_selector = D_v;
4549 debug_file = stderr;
4550 debug_fd = fileno(debug_file);
4551 big_buffer = malloc(big_buffer_size);
4552
4553 for (i = 1; i < argc; i++)
4554   {
4555   if (argv[i][0] == '+')
4556     {
4557     debug_trace_memory = 2;
4558     argv[i]++;
4559     }
4560   if (isdigit(argv[i][0]))
4561     debug_selector = Ustrtol(argv[i], NULL, 0);
4562   else
4563     if (Ustrspn(argv[i], "abcdefghijklmnopqrtsuvwxyz0123456789-.:/") ==
4564         Ustrlen(argv[i]))
4565       {
4566       #ifdef LOOKUP_LDAP
4567       eldap_default_servers = argv[i];
4568       #endif
4569       #ifdef LOOKUP_MYSQL
4570       mysql_servers = argv[i];
4571       #endif
4572       #ifdef LOOKUP_PGSQL
4573       pgsql_servers = argv[i];
4574       #endif
4575       }
4576   #ifdef EXIM_PERL
4577   else opt_perl_startup = argv[i];
4578   #endif
4579   }
4580
4581 printf("Testing string expansion: debug_level = %d\n\n", debug_level);
4582
4583 expand_nstring[1] = US"string 1....";
4584 expand_nlength[1] = 8;
4585 expand_nmax = 1;
4586
4587 #ifdef EXIM_PERL
4588 if (opt_perl_startup != NULL)
4589   {
4590   uschar *errstr;
4591   printf("Starting Perl interpreter\n");
4592   errstr = init_perl(opt_perl_startup);
4593   if (errstr != NULL)
4594     {
4595     printf("** error in perl_startup code: %s\n", errstr);
4596     return EXIT_FAILURE;
4597     }
4598   }
4599 #endif /* EXIM_PERL */
4600
4601 while (fgets(buffer, sizeof(buffer), stdin) != NULL)
4602   {
4603   void *reset_point = store_get(0);
4604   uschar *yield = expand_string(buffer);
4605   if (yield != NULL)
4606     {
4607     printf("%s\n", yield);
4608     store_reset(reset_point);
4609     }
4610   else
4611     {
4612     if (search_find_defer) printf("search_find deferred\n");
4613     printf("Failed: %s\n", expand_string_message);
4614     if (expand_string_forcedfail) printf("Forced failure\n");
4615     printf("\n");
4616     }
4617   }
4618
4619 search_tidyup();
4620
4621 return 0;
4622 }
4623
4624 #endif
4625
4626 /* End of expand.c */