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 +++++++++++++++++++++------------- realrcptto.c | 23 +++++++++++++---------- 2 files changed, 34 insertions(+), 23 deletions(-) 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; diff --git a/realrcptto.c b/realrcptto.c index 93a7aad..0f275ba 100644 --- a/realrcptto.c +++ b/realrcptto.c @@ -173,17 +173,20 @@ static char *virtualext(stralloc *localpart, unsigned int at) unsigned int i; char *x; - for (i = at; i > 0; --i) - if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break; - if (i == 0 || i == at - 1) return NULL; - - if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); - if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); - x = constmap(&mapvdoms, newaddr.s, newaddr.len); - if (!x) return NULL; + /* sub-addressing: ignore first and last character in local part */ + for (i = 1; i < at - 1; ++i) { + if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) { + if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); + if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); + x = constmap(&mapvdoms, newaddr.s, newaddr.len); + if (!x) return NULL; + + localpart->s[i] = '-'; + return x; + } + } - localpart->s[i] = '-'; - return x; + return NULL; } // max lookups -- cgit v1.2.3