Hi Norbert, apologies for the long silence.  Work took over my life,
and for some reason I didn't get your BTS prod of 15th May.

The attached single patch replaces both my previous patches, and
implements null envelope-sender both for nullmailer-queue 
and for nullmailer-inject.

Nullmailer-queue accepts a blank sender line as in the first patch.

Nullmailer-inject now works both when specifying  -f "" on the command
line, and for the default of picking up "Return-Path: <>".

I would have liked to have updated the tests too,  but I don't have a
copy of Bruce's 'functions' include-file to test them with.

Nick
diff -urw nullmailer-1.02/lib/address.cc nullmailer-dbg/lib/address.cc
--- nullmailer-1.02/lib/address.cc      2005-11-10 16:11:12.000000000 +0000
+++ nullmailer-dbg/lib/address.cc       2006-06-25 16:01:04.000000000 +0100
@@ -518,6 +518,17 @@
   RETURN(node, "<" + r2.str + ">" + comment, "", r2.addr);
 }
 
+RULE(null_addr) 
+{
+  ENTER("LABRACKET RABRACKET");
+  mystring comment;
+  node = skipcomment(node, comment);
+  MATCHTOKEN(LABRACKET);
+  node = skipcomment(node, comment);
+  MATCHTOKEN(RABRACKET);
+  RETURN(node, "<>" + comment, "", "");
+}
+
 RULE(phrase)
 {
   ENTER("word *word");
@@ -646,7 +657,8 @@
   anode* tokenlist = tokenize(line.c_str());
   if(!tokenlist)
     return false;
-  result r = match_addresses(tokenlist);
+  result r = match_null_addr(tokenlist);
+  if (!r) r = match_addresses(tokenlist);
   del_tokens(tokenlist);
   if(r) {
     line = r.str;
diff -urw nullmailer-1.02/src/inject.cc nullmailer-dbg/src/inject.cc
--- nullmailer-1.02/src/inject.cc       2005-11-10 16:11:12.000000000 +0000
+++ nullmailer-dbg/src/inject.cc        2006-06-25 15:59:28.000000000 +0100
@@ -100,6 +100,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 static slist recipients;
 static mystring sender;
+static bool use_header_sender = true;
 static bool use_header_recips = true;
 
 void parse_recips(const mystring& list)
@@ -126,6 +127,9 @@
 bool parse_sender(const mystring& list)
 {
   int end = list.find_first('\n');
+  if(end == -1) {
+    return true;       // null sender
+  }
   if(end > 0 && list.find_first('\n', end+1) < 0) {
     sender = list.sub(0, end);
     return true;
@@ -165,7 +169,8 @@
        return true;
       if(is_resent) {
        if(!header_is_resent) {
-         sender = "";
+         // if(use_header_sender)      // There is no Resent-Return-Path
+         //   sender = "";
          if(use_header_recips)
            recipients.empty();
        }
@@ -187,8 +192,10 @@
              parse_recips(list);
          }
          else if(is_sender) {
-           if(is_resent == header_is_resent && !sender)
+           if(is_resent == header_is_resent && use_header_sender) {
              parse_sender(list);
+             use_header_sender = 0;
+           }
          }
        }
       }
@@ -282,7 +289,7 @@
   if(!shost) shost = host;
   canonicalize(shost);
   
-  if(!sender)
+  if(use_header_sender && !sender)
     sender = suser + "@" + shost;
 }
 
@@ -547,6 +554,7 @@
       fout << "nullmailer-inject: Invalid sender address: " << o_from << endl;
       return false;
     }
+    use_header_sender = false;
   }
   use_header_recips = (use_recips != use_args);
   if(use_recips == use_header)
diff -urw nullmailer-1.02/src/queue.cc nullmailer-dbg/src/queue.cc
--- nullmailer-1.02/src/queue.cc        2005-11-10 16:11:12.000000000 +0000
+++ nullmailer-dbg/src/queue.cc 2006-06-25 15:45:07.000000000 +0100
@@ -94,9 +94,9 @@
 bool copyenv(fdobuf& out)
 {
   mystring str;
-  if(!fin.getline(str) || !str)
+  if(!fin.getline(str))
     fail("Could not read envelope sender.");
-  if(!validate_addr(str, false))
+  if(!validate_addr(str, false) && str != "")
     fail("Envelope sender address is invalid.");
   if(!(out << str << endl))
     fail("Could not write envelope sender.");

Reply via email to