Promote dkim_cur_signer to expansion variable
[exim.git] / src / src / expand.c
index 943ec76ecf46e36ba65d7035c05b99ffdb8b7727..47453dc6d183b665bab2cf4c8167a6cfd4aa31bd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.100 2009/08/31 21:14:50 tom Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.103 2009/10/15 08:27:37 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -242,6 +242,7 @@ static uschar *cond_table[] = {
   US">",
   US">=",
   US"and",
+  US"bool",
   US"crypteq",
   US"def",
   US"eq",
@@ -283,6 +284,7 @@ enum {
   ECOND_NUM_G,
   ECOND_NUM_GE,
   ECOND_AND,
+  ECOND_BOOL,
   ECOND_CRYPTEQ,
   ECOND_DEF,
   ECOND_STR_EQ,
@@ -411,6 +413,7 @@ static var_entry var_table[] = {
   { "dkim_canon_headers",  vtype_dkim,        (void *)DKIM_CANON_HEADERS },
   { "dkim_copiedheaders",  vtype_dkim,        (void *)DKIM_COPIEDHEADERS },
   { "dkim_created",        vtype_dkim,        (void *)DKIM_CREATED },
+  { "dkim_cur_signer",     vtype_stringptr,   &dkim_cur_signer },
   { "dkim_domain",         vtype_stringptr,   &dkim_signing_domain },
   { "dkim_expires",        vtype_dkim,        (void *)DKIM_EXPIRES },
   { "dkim_headernames",    vtype_dkim,        (void *)DKIM_HEADERNAMES },
@@ -421,7 +424,7 @@ static var_entry var_table[] = {
   { "dkim_key_srvtype",    vtype_dkim,        (void *)DKIM_KEY_SRVTYPE },
   { "dkim_key_testing",    vtype_dkim,        (void *)DKIM_KEY_TESTING },
   { "dkim_selector",       vtype_stringptr,   &dkim_signing_selector },
-  { "dkim_signing_domains",vtype_stringptr,   &dkim_signing_domains },
+  { "dkim_signers",        vtype_stringptr,   &dkim_signers },
   { "dkim_verify_reason",  vtype_dkim,        (void *)DKIM_VERIFY_REASON },
   { "dkim_verify_status",  vtype_dkim,        (void *)DKIM_VERIFY_STATUS},
 #endif
@@ -2408,6 +2411,53 @@ switch(cond_type)
     }
 
 
+  /* The bool{} expansion condition maps a string to boolean.
+  The values supported should match those supported by the ACL condition
+  (acl.c, ACLC_CONDITION) so that we keep to a minimum the different ideas
+  of true/false.  Note that Router "condition" rules have a different
+  interpretation, where general data can be used and only a few values
+  map to FALSE.
+  Note that readconf.c boolean matching, for boolean configuration options,
+  only matches true/yes/false/no. */
+  case ECOND_BOOL:
+    {
+    uschar *sub_arg[1];
+    uschar *t;
+    size_t len;
+    BOOL boolvalue = FALSE;
+    while (isspace(*s)) s++;
+    if (*s != '{') goto COND_FAILED_CURLY_START;
+    switch(read_subs(sub_arg, 1, 1, &s, yield == NULL, FALSE, US"bool"))
+      {
+      case 1: expand_string_message = US"too few arguments or bracketing "
+        "error for bool";
+      /*FALLTHROUGH*/
+      case 2:
+      case 3: return NULL;
+      }
+    t = sub_arg[0];
+    while (isspace(*t)) t++;
+    len = Ustrlen(t);
+    DEBUG(D_expand)
+      debug_printf("considering bool: %s\n", len ? t : US"<empty>");
+    if (len == 0)
+      boolvalue = FALSE;
+    else if (Ustrspn(t, "0123456789") == len)
+      boolvalue = (Uatoi(t) == 0) ? FALSE : TRUE;
+    else if (strcmpic(t, US"true") == 0 || strcmpic(t, US"yes") == 0)
+      boolvalue = TRUE;
+    else if (strcmpic(t, US"false") == 0 || strcmpic(t, US"no") == 0)
+      boolvalue = FALSE;
+    else
+      {
+      expand_string_message = string_sprintf("unrecognised boolean "
+       "value \"%s\"", t);
+      return NULL;
+      }
+    if (yield != NULL) *yield = (boolvalue != 0);
+    return s;
+    }
+
   /* Unknown condition */
 
   default: