From ebb74077eee67e729300b3be193482192975fa19 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 15 Oct 2018 13:58:07 +0200 Subject: plus addressing improvements * first `+` splits local part from sub-address * prioritize plus addressing over domain wildcards --- qmail-send.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'qmail-send.c') diff --git a/qmail-send.c b/qmail-send.c index 6eac4d5..8c6237e 100644 --- a/qmail-send.c +++ b/qmail-send.c @@ -149,21 +149,18 @@ char *recip; return 1; } - for (i = 0;i <= addr.len;++i) - if (!i || (i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.'))) - if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) { - if (!*x) break; - if (!stralloc_cats(&rwline,x)) return 0; - if (!stralloc_cats(&rwline,"-")) return 0; - if (!stralloc_cat(&rwline,&addr)) return 0; - if (!stralloc_0(&rwline)) return 0; - return 1; - } - + if ((x = constmap(&mapvdoms, addr.s, addr.len)) && (*x)) { + if (!stralloc_cats(&rwline,x)) return 0; + if (!stralloc_cats(&rwline,"-")) return 0; + if (!stralloc_cat(&rwline,&addr)) return 0; + if (!stralloc_0(&rwline)) return 0; + return 1; + } + + /* sub-addressing: ignore first and last character in local part */ static stralloc newaddr = {0}; - for (i = at; i > 0; --i) { + for (i = 1; i < at - 1; ++i) { if (addr.s[i] == '+' /*|| addr.s[i] == '-'*/) { - if (i == at - 1) break; if (!stralloc_copyb(&newaddr, addr.s, i)) return 0; if (!stralloc_catb(&newaddr, addr.s + at, addr.len - at)) return 0; if (x = constmap(&mapvdoms, newaddr.s, newaddr.len)) { @@ -179,6 +176,17 @@ char *recip; } } + for (i = at + 1;i <= addr.len;++i) + if ((i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.'))) + if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) { + if (!*x) break; + if (!stralloc_cats(&rwline,x)) return 0; + if (!stralloc_cats(&rwline,"-")) return 0; + if (!stralloc_cat(&rwline,&addr)) return 0; + if (!stralloc_0(&rwline)) return 0; + return 1; + } + if (!stralloc_cat(&rwline,&addr)) return 0; if (!stralloc_0(&rwline)) return 0; return 2; -- cgit v1.2.3