Matthew Hodgson wrote:

Ken Murhcison wrote:


Matthew Hodgson wrote:



Looking at the process_recipient() code in lmtpengine.c,

I'm not sure


that the
quote-string parsing has been updated fully to reflect

virtual domains - so


I've fiddled around and come up with a version based on the

existing


code, and
also a complete rewrite. I enclose the latter as a patch here; it
hasn't been
rigorously tested (at all), but has fixed my particular

problem. If anyone


has interest in the other version, just say - any feedback & flames
appreciated.

I'm looking at your current patch now to make sure it looks
sane before I commit it. If you have an alternate patch, I'd like to see it also.




Hi Ken,

Be sure to look at the 2nd version of the patch I submitted to the list; the
1st one included a few rather embarassing bugs.

I've abandoned the alternative patch (the minimal extension of the existing
code), as ensuring that forcedowncase vaguely works with quoted-strings as
well as virtual domains was becoming too clunky, and I'm now depending on it
for the installation here.  Rather than ending up with a load of unwrapped
states, I suspect the better idea is to chuck a few state flags in as I did
with the submitted patch, I hope.

One thing you missed in you patch was the downcasing of the domain for something like [EMAIL PROTECTED] I've written my own patch, based on yours which I *think* handles all cases (at least it doesn in my test harness). Try the attached patch and let me know how it works before I commit it.



In other news, the latest CVS doesn't compile from clean when using a
berkeley backend; HAVE_BDB needs to be #defined in config.h at some point to
avoid disturbing fatal errors of the form:
Jan  8 16:51:16 foo imap[11302]: Fatal error: cyrusdb backend

Any time that configure.in is updated, you need to re-make the configure script:


rm configure
sh SMakefile
./configure ...


Any time that a Makefile.in is updated, you should re-run configure.


--
Kenneth Murchison     Oceana Matrix Ltd.
Software Engineer     21 Princeton Place
716-662-8973 x26      Orchard Park, NY 14127
--PGP Public Key--    http://www.oceana.com/~ken/ksm.pgp
Index: lmtpengine.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/lmtpengine.c,v
retrieving revision 1.98
diff -c -r1.98 lmtpengine.c
*** lmtpengine.c        2 Jan 2004 20:34:10 -0000       1.98
--- lmtpengine.c        8 Jan 2004 18:25:03 -0000
***************
*** 756,761 ****
--- 756,762 ----
      int r, sl;
      address_data_t *ret = (address_data_t *) xmalloc(sizeof(address_data_t));
      int forcedowncase = config_getswitch(IMAPOPT_LMTP_DOWNCASE_RCPT);
+     int quoted, detail;
  
      assert(addr != NULL && msg != NULL);
  
***************
*** 781,817 ****
        addr++;
      }
      
!     if (*addr == '\"') {
!       addr++;
!       while (*addr && *addr != '\"') {
!           if (*addr == '\\') addr++;
!           *dest++ = *addr++;
        }
!     }
!     else {
!       if(forcedowncase) {
!           /* We should downcase the localpart up to the first + */
!           while(*addr != '@' && *addr != '>' && *addr != '+') {
!               if(*addr == '\\') addr++;
!               *dest++ = TOLOWER(*addr++);
!           }
!           if (*addr == '+') {
!             while(*addr != '@' && *addr != '>') {
!               if(*addr == '\\') addr++;
!               *dest++ = *addr++;
!             }
!           }
!           while ((config_virtdomains || *addr != '@') && *addr != '>') {
!               if(*addr == '\\') addr++;
!               *dest++ = TOLOWER(*addr++);
!           }
        } else {
!         /* Now finish the remainder of the localpart */
!         while ((config_virtdomains || *addr != '@') && *addr != '>') {
!             if (*addr == '\\') addr++;
!             *dest++ = *addr++;
!         }
!        }
      }
      *dest = '\0';
        
--- 782,815 ----
        addr++;
      }
      
!     quoted = detail = 0;
!     while (*addr &&
!          (quoted ||
!           ((config_virtdomains || *addr != '@') && *addr != '>'))) {
!       /* start/end of quoted localpart, skip the quote */
!       if (*addr == '\"') {
!           quoted = !quoted;
!           addr++;
!           continue;
        }
! 
!       /* escaped char, pass it through */
!       if (*addr == '\\') {
!           addr++;
!           if (!*addr) break;
        } else {
!           /* start of detail */
!           if (*addr == '+') detail = 1;
! 
!           /* end of localpart (unless quoted) */
!           if (*addr == '@' && !quoted) detail = 0;
!       }
! 
!       /* downcase everything accept the detail */
!       if (forcedowncase && !detail)
!           *dest++ = TOLOWER(*addr++);
!       else
!           *dest++ = *addr++;
      }
      *dest = '\0';
        

Reply via email to