Fix dkim_signers condition logic / Renamed dkim_signing_domains to dkim_signers
authorTom Kistner <tom@duncanthrax.net>
Thu, 15 Oct 2009 08:06:23 +0000 (08:06 +0000)
committerTom Kistner <tom@duncanthrax.net>
Thu, 15 Oct 2009 08:06:23 +0000 (08:06 +0000)
src/src/acl.c
src/src/dkim.c
src/src/dkim.h
src/src/expand.c
src/src/globals.c
src/src/globals.h
src/src/receive.c
src/src/smtp_in.c
src/src/spool_in.c

index 04b7fe5f59bd59b1f730908744e4446f0791ea4f..7bcec314dba7c0994ee1b4af039dc67d45c99ff2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/acl.c,v 1.84 2009/10/14 14:48:41 nm4 Exp $ */
+/* $Cambridge: exim/src/src/acl.c,v 1.85 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -2789,20 +2789,11 @@ for (; cb != NULL; cb = cb->next)
 
     #ifndef DISABLE_DKIM
     case ACLC_DKIM_SIGNER:
-    if (dkim_signing_domain != NULL)
-      {
-      rc = match_isinlist(dkim_signing_domain,
+    if (dkim_cur_signer != NULL)
+      rc = match_isinlist(dkim_cur_signer,
                           &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL);
-      if (rc == FAIL)
-        {
-        rc = match_isinlist(dkim_exim_expand_query(DKIM_IDENTITY),
-                            &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL);
-        }
-      }
     else
-      {
        rc = FAIL;
-      }
     break;
 
     case ACLC_DKIM_STATUS:
index 3109168a33c44005ae6d44e940ef4aacf4007314..0ac1aeccfd1fa4f6927beda572921511f751a0c8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/dkim.c,v 1.4 2009/10/13 18:32:05 tom Exp $ */
+/* $Cambridge: exim/src/src/dkim.c,v 1.5 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -19,6 +19,7 @@
 pdkim_ctx       *dkim_verify_ctx = NULL;
 pdkim_signature *dkim_signatures = NULL;
 pdkim_signature *dkim_cur_sig    = NULL;
+uschar          *dkim_cur_signer = NULL;
 
 int dkim_exim_query_dns_txt(char *name, char *answer) {
   dns_answer dnsa;
@@ -81,9 +82,9 @@ void dkim_exim_verify_feed(uschar *data, int len) {
 
 void dkim_exim_verify_finish(void) {
   pdkim_signature *sig = NULL;
-  int dkim_signing_domains_size = 0;
-  int dkim_signing_domains_ptr = 0;
-  dkim_signing_domains = NULL;
+  int dkim_signers_size = 0;
+  int dkim_signers_ptr = 0;
+  dkim_signers = NULL;
 
   /* Delete eventual previous signature chain */
   dkim_signatures = NULL;
@@ -178,32 +179,42 @@ void dkim_exim_verify_finish(void) {
     logmsg[ptr] = '\0';
     log_write(0, LOG_MAIN, (char *)logmsg);
 
-    /* Build a colon-separated list of signing domains in dkim_signing_domains */
-    dkim_signing_domains = string_append(dkim_signing_domains,
-                                         &dkim_signing_domains_size,
-                                         &dkim_signing_domains_ptr,
-                                         2,
-                                         sig->domain,
-                                         ":"
-                                        );
+    /* Build a colon-separated list of signing domains (and identities, if present) in dkim_signers */
+    dkim_signers = string_append(dkim_signers,
+                                 &dkim_signers_size,
+                                 &dkim_signers_ptr,
+                                 2,
+                                 sig->domain,
+                                 ":"
+                                );
+
+    if (sig->identity != NULL) {
+      dkim_signers = string_append(dkim_signers,
+                                   &dkim_signers_size,
+                                   &dkim_signers_ptr,
+                                   2,
+                                   sig->identity,
+                                   ":"
+                                  );
+    }
 
     /* Process next signature */
     sig = sig->next;
   }
 
   /* Chop the last colon from the domain list */
-  if ((dkim_signing_domains != NULL) &&
-      (Ustrlen(dkim_signing_domains) > 0))
-    dkim_signing_domains[Ustrlen(dkim_signing_domains)-1] = '\0';
+  if ((dkim_signers != NULL) &&
+      (Ustrlen(dkim_signers) > 0))
+    dkim_signers[Ustrlen(dkim_signers)-1] = '\0';
 }
 
 
 void dkim_exim_acl_setup(uschar *id) {
   pdkim_signature *sig = dkim_signatures;
   dkim_cur_sig = NULL;
+  dkim_cur_signer = id;
   if (dkim_disable_verify ||
-      !id || !sig ||
-      !dkim_verify_ctx) return;
+      !id || !dkim_verify_ctx) return;
   /* Find signature to run ACL on */
   while (sig != NULL) {
     uschar *cmp_val = NULL;
index 28459c58a4cdfe14c2635dbd8cd7d35f4a1af5eb..70258e3bed5461f4d0f910f0bfb275040f19f51e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/dkim.h,v 1.2 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/dkim.h,v 1.3 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -15,6 +15,8 @@ void    dkim_exim_acl_setup(uschar *);
 uschar *dkim_exim_expand_query(int);
 uschar *dkim_exim_expand_defaults(int);
 
+extern uschar *dkim_cur_signer;
+
 #define DKIM_ALGO               1
 #define DKIM_BODYLENGTH         2
 #define DKIM_CANON_BODY         3
index b52901c32878b30b53166801069cdcafedabe30e..a8fccac4c59b621f1f9e1943019c040d5149c526 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.101 2009/10/14 14:48:41 nm4 Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.102 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -423,7 +423,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
index dcb6bece09a0c0196ca42e482299e0c97d7bd754..7546ed47830b69d5cedf2677ba6a39d96b5563d0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.82 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.83 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -532,10 +532,10 @@ BOOL    disable_ipv6           = FALSE;
 BOOL    disable_logging        = FALSE;
 
 #ifndef DISABLE_DKIM
-uschar *dkim_signing_domains     = NULL;
+uschar *dkim_signers             = NULL;
 uschar *dkim_signing_domain      = NULL;
 uschar *dkim_signing_selector    = NULL;
-uschar *dkim_verify_signers      = US"$dkim_signing_domains";
+uschar *dkim_verify_signers      = US"$dkim_signers";
 BOOL    dkim_collect_input       = FALSE;
 BOOL    dkim_disable_verify      = FALSE;
 #endif
index ff087dfbc76104c7242734e98bd222dda17fe4b7..87fc4457a042a3dea1f54f1721a320e3a053d1a1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.h,v 1.63 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.64 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -299,7 +299,7 @@ extern BOOL    disable_ipv6;           /* Don't do any IPv6 things */
 extern BOOL    disable_logging;        /* Disables log writing when TRUE */
 
 #ifndef DISABLE_DKIM
-extern uschar *dkim_signing_domains;   /* Expansion variable, holds colon-separated list of domains that have signed a message */
+extern uschar *dkim_signers;           /* Expansion variable, holds colon-separated list of domains and identities that have signed a message */
 extern uschar *dkim_signing_domain;    /* Expansion variable, domain used for signing a message. */
 extern uschar *dkim_signing_selector;  /* Expansion variable, selector used for signing a message. */
 extern uschar *dkim_verify_signers;    /* Colon-separated list of domains for each of which we call the DKIM ACL */
index 734ca7737c1a3827e8dbef2c4578e94699b5f06e..3741818dbc602f24ce06d629ea464af5a8d81824 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/receive.c,v 1.46 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/receive.c,v 1.47 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -2993,11 +2993,22 @@ else
           int sep = 0;
           uschar *ptr = dkim_verify_signers_expanded;
           uschar *item = NULL;
+          uschar *seen_items = NULL;
+          int     seen_items_size = 0;
+          int     seen_items_offset = 0;
           uschar itembuf[256];
           while ((item = string_nextinlist(&ptr, &sep,
                                            itembuf,
                                            sizeof(itembuf))) != NULL)
             {
+            /* Only run ACL once for each domain or identity, no matter how often it
+               appears in the expanded list. */
+            if (seen_items != NULL) {
+              if (match_isinlist(item,
+                    &seen_items,0,NULL,NULL,MCL_STRING,TRUE,NULL) == OK) continue;
+              string_cat(seen_items,&seen_items_size,&seen_items_offset,":",1);
+            }
+            string_cat(seen_items,&seen_items_size,&seen_items_offset,item,Ustrlen(item));
             dkim_exim_acl_setup(item);
             rc = acl_check(ACL_WHERE_DKIM, NULL, acl_smtp_dkim, &user_msg, &log_msg);
             if (rc != OK) break;
index b9d92d63131c427f4f3d17c3b3a2eb0605736d6b..03374c3ad3d0b288389a3e15f57ca8c1fe52fd94 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/smtp_in.c,v 1.64 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/smtp_in.c,v 1.65 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1041,7 +1041,7 @@ bmi_run = 0;
 bmi_verdicts = NULL;
 #endif
 #ifndef DISABLE_DKIM
-dkim_signing_domains = NULL;
+dkim_signers = NULL;
 dkim_disable_verify = FALSE;
 dkim_collect_input = FALSE;
 #endif
index 1674e78f0efcc4bf40015da260670ee5772acd65..86ba6a28645c608e93dd56ccfa908964f99d23a9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/spool_in.c,v 1.24 2009/06/10 07:34:04 tom Exp $ */
+/* $Cambridge: exim/src/src/spool_in.c,v 1.25 2009/10/15 08:06:23 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -279,7 +279,7 @@ bmi_verdicts = NULL;
 #endif
 
 #ifndef DISABLE_DKIM
-dkim_signing_domains = NULL;
+dkim_signers = NULL;
 dkim_disable_verify = FALSE;
 dkim_collect_input = FALSE;
 #endif