summaryrefslogtreecommitdiffstats
path: root/realrcptto.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2017-08-16 16:35:48 +0200
committermanuel <manuel@mausz.at>2017-08-16 16:35:48 +0200
commit3ee3b980a23b79479a650343a0fa876f68cad4bc (patch)
tree1fa3f1b2234a7a831274fe279290cf928c6e9ca5 /realrcptto.c
parent08fb6b6e2d13be7b24bbf993bdc99c56e16ca3c5 (diff)
downloadqmail-3ee3b980a23b79479a650343a0fa876f68cad4bc.tar.gz
qmail-3ee3b980a23b79479a650343a0fa876f68cad4bc.tar.bz2
qmail-3ee3b980a23b79479a650343a0fa876f68cad4bc.zip
Implement plus addressing for virtualdomains
Diffstat (limited to 'realrcptto.c')
-rw-r--r--realrcptto.c25
1 files changed, 24 insertions, 1 deletions
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()
165 } 165 }
166} 166}
167 167
168static char *virtualext(stralloc *localpart, unsigned int at)
169{
170 static stralloc newaddr = {0};
171 unsigned int i;
172 char *x;
173
174 for (i = at; i > 0; --i)
175 if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break;
176 if (i == 0 || i == at - 1) return NULL;
177
178 if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem();
179 if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem();
180 x = constmap(&mapvdoms, newaddr.s, newaddr.len);
181 if (!x) return NULL;
182
183 localpart->s[i] = '-';
184 return x;
185}
186
168// max lookups 187// max lookups
169#define MAXRECURSION 5 188#define MAXRECURSION 5
170 189
@@ -286,7 +305,11 @@ int depth;
286 unsigned int xlen,newlen; 305 unsigned int xlen,newlen;
287 char *x; 306 char *x;
288 for (i = 0;;++i) { 307 for (i = 0;;++i) {
289 if (i > localpart.len) return denyaddr(addr, depth); 308 if (i > localpart.len) {
309 x = virtualext(&localpart, at);
310 if (x) break;
311 return denyaddr(addr, depth);
312 }
290 if (!i || (i == at + 1) || (i == localpart.len) || 313 if (!i || (i == at + 1) || (i == localpart.len) ||
291 ((i > at) && (localpart.s[i] == '.'))) { 314 ((i > at) && (localpart.s[i] == '.'))) {
292 x = constmap(&mapvdoms,localpart.s + i,localpart.len - i); 315 x = constmap(&mapvdoms,localpart.s + i,localpart.len - i);