Add "fullpostmaster" to check <postmaster> without a domain, if the
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 31 May 2005 10:58:18 +0000 (10:58 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 31 May 2005 10:58:18 +0000 (10:58 +0000)
domained version fails.

doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/src/acl.c
src/src/macros.h
src/src/verify.c

index 47682b8..f5e8499 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.145 2005/05/25 20:32:44 tom Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.146 2005/05/31 10:58:18 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -58,6 +58,9 @@ PH/06 There is a timeout for writing blocks of data, set by, e.g. data_timeout
 TK/04 Added simple SPF lookup method in EXPERIMENTAL_SPF. See NewStuff for
       details. Thanks to Chris Webb <chris@arachsys.com> for the patch!
 
+PH/07 Added "fullpostmaster" verify option, which does a check to <postmaster>
+      without a domain if the check to <postmaster@domain> fails.
+
 
 Exim version 4.51
 -----------------
index 7a5bf4f..d0997d1 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.47 2005/05/25 20:33:28 tom Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.48 2005/05/31 10:58:18 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -247,6 +247,11 @@ TK/01 Added an 'spf' lookup type that will return an SPF result for a given
 
       Patch submitted by Chris Webb <chris@arachsys.com>.
 
+PH/02 There's a new verify callout option, "fullpostmaster", which first acts
+      as "postmaster" and checks the recipient <postmaster@domain>. If that
+      fails, it tries just <postmaster>, without a domain, in accordance with
+      the specification in RFC 2821.
+
 
 Version 4.51
 ------------
index a96e2d1..08c69c6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/acl.c,v 1.35 2005/05/25 09:58:16 fanf2 Exp $ */
+/* $Cambridge: exim/src/src/acl.c,v 1.36 2005/05/31 10:58:18 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1512,6 +1512,11 @@ while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
           else if (strcmpic(opt, US"use_postmaster") == 0)
              verify_options |= vopt_callout_recippmaster;
           else if (strcmpic(opt, US"postmaster") == 0) pm_mailfrom = US"";
+          else if (strcmpic(opt, US"fullpostmaster") == 0)
+            {
+            pm_mailfrom = US"";
+            verify_options |= vopt_callout_fullpm;
+            }
 
           else if (strncmpic(opt, US"mailfrom", 8) == 0)
             {
index 9ab6f02..55fdd84 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.13 2005/05/10 10:19:11 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.14 2005/05/31 10:58:18 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -602,7 +602,7 @@ enum { v_none, v_sender, v_recipient, v_expn };
 #define vopt_is_recipient         0x0002
 #define vopt_qualify              0x0004
 #define vopt_expn                 0x0008
-#define vopt_callout_postmaster   0x0010   /* during callout */
+#define vopt_callout_fullpm       0x0010   /* full postmaster during callout */
 #define vopt_callout_random       0x0020   /* during callout */
 #define vopt_callout_no_cache     0x0040   /* disable callout cache */
 #define vopt_callout_recipsender  0x0080   /* use real sender to verify recip */
index abdb5fa..e346cf9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/verify.c,v 1.17 2005/05/24 08:15:02 tom Exp $ */
+/* $Cambridge: exim/src/src/verify.c,v 1.18 2005/05/31 10:58:18 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -128,6 +128,7 @@ Arguments:
   options           the verification options - these bits are used:
                       vopt_is_recipient => this is a recipient address
                       vopt_callout_no_cache => don't use callout cache
+                      vopt_callout_fullpm => if postmaster check, do full one
                       vopt_callout_random => do the "random" thing
                       vopt_callout_recipsender => use real sender for recipient
                       vopt_callout_recippmaster => use postmaster for recipient
@@ -563,7 +564,8 @@ for (host = host_list; host != NULL && !done; host = host->next)
         new_address_record.result = ccache_reject;
         }
 
-      /* Do postmaster check if requested */
+      /* Do postmaster check if requested; if a full check is required, we
+      check for RCPT TO:<postmaster> (no domain) in accordance with RFC 821. */
 
       if (done && pm_mailfrom != NULL)
         {
@@ -577,10 +579,29 @@ for (host = host_list; host != NULL && !done; host = host->next)
           smtp_read_response(&inblock, responsebuffer,
             sizeof(responsebuffer), '2', callout) &&
 
+          /* First try using the current domain */
+
+          ((
           smtp_write_command(&outblock, FALSE,
             "RCPT TO:<postmaster@%.1000s>\r\n", addr->domain) >= 0 &&
           smtp_read_response(&inblock, responsebuffer,
-            sizeof(responsebuffer), '2', callout);
+            sizeof(responsebuffer), '2', callout)
+          )
+
+          ||
+
+          /* If that doesn't work, and a full check is requested,
+          try without the domain. */
+
+          (
+          (options & vopt_callout_fullpm) != 0 &&
+          smtp_write_command(&outblock, FALSE,
+            "RCPT TO:<postmaster>\r\n") >= 0 &&
+          smtp_read_response(&inblock, responsebuffer,
+            sizeof(responsebuffer), '2', callout)
+          ));
+
+        /* Sort out the cache record */
 
         new_domain_record.postmaster_stamp = time(NULL);
 
@@ -791,6 +812,7 @@ Arguments:
                      These ones are used by do_callout() -- the options variable
                        is passed to it.
 
+                     vopt_callout_fullpm => if postmaster check, do full one
                      vopt_callout_no_cache => don't use callout cache
                      vopt_callout_random => do the "random" thing
                      vopt_callout_recipsender => use real sender for recipient