From 3ee3b980a23b79479a650343a0fa876f68cad4bc Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 16 Aug 2017 16:35:48 +0200 Subject: Implement plus addressing for virtualdomains --- qmail-send.c | 19 +++++++++++++++++++ realrcptto.c | 25 ++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/qmail-send.c b/qmail-send.c index 0baed66..6eac4d5 100644 --- a/qmail-send.c +++ b/qmail-send.c @@ -160,6 +160,25 @@ char *recip; return 1; } + static stralloc newaddr = {0}; + for (i = at; i > 0; --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)) { + if (!*x) break; + if (!stralloc_cats(&rwline, x)) return 0; + if (!stralloc_cats(&rwline, "-")) return 0; + addr.s[i] = '-'; + if (!stralloc_cat(&rwline, &addr)) return 0; + if (!stralloc_0(&rwline)) return 0; + return 1; + } + break; + } + } + if (!stralloc_cat(&rwline,&addr)) return 0; if (!stralloc_0(&rwline)) return 0; return 2; diff --git a/realrcptto.c b/realrcptto.c index 866bd57..e18a21f 100644 --- a/realrcptto.c +++ b/realrcptto.c @@ -165,6 +165,25 @@ static int userext() } } +static char *virtualext(stralloc *localpart, unsigned int at) +{ + static stralloc newaddr = {0}; + 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; + + localpart->s[i] = '-'; + return x; +} + // max lookups #define MAXRECURSION 5 @@ -286,7 +305,11 @@ int depth; unsigned int xlen,newlen; char *x; for (i = 0;;++i) { - if (i > localpart.len) return denyaddr(addr, depth); + if (i > localpart.len) { + x = virtualext(&localpart, at); + if (x) break; + return denyaddr(addr, depth); + } if (!i || (i == at + 1) || (i == localpart.len) || ((i > at) && (localpart.s[i] == '.'))) { x = constmap(&mapvdoms,localpart.s + i,localpart.len - i); -- cgit v1.2.3