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';