Add "fullpostmaster" to check <postmaster> without a domain, if the
[exim.git] / src / src / verify.c
index 458f4d97849418db6a79c240787ff177f355a219..e346cf986dcfc9bf579ba9c4e5d372a949cb8fb0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/verify.c,v 1.15 2005/02/17 11:58:26 ph10 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
@@ -550,7 +551,8 @@ for (host = host_list; host != NULL && !done; host = host->next)
       {
       done =
         smtp_write_command(&outblock, FALSE, "RCPT TO:<%.1000s>\r\n",
-          addr->address) >= 0 &&
+          transport_rcpt_address(addr,
+            addr->transport->rcpt_include_affixes)) >= 0 &&
         smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
           '2', callout);
 
@@ -562,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)
         {
@@ -576,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);
 
@@ -790,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
@@ -1228,6 +1251,10 @@ else for (addr_list = addr_local, i = 0; i < 2; addr_list = addr_remote, i++)
     addr_list = addr->next;
 
     fprintf(f, "%s", CS addr->address);
+#ifdef EXPERIMENTAL_SRS
+    if(addr->p.srs_sender)
+      fprintf(f, "    [srs = %s]", addr->p.srs_sender);
+#endif
     while (p != NULL)
       {
       fprintf(f, "\n    <-- %s", p->address);