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