summaryrefslogtreecommitdiffstats
path: root/realrcptto.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2018-10-15 13:58:07 +0200
committermanuel <manuel@mausz.at>2018-10-15 13:59:42 +0200
commitebb74077eee67e729300b3be193482192975fa19 (patch)
tree92943e7e45be072b92590cd4107989efcef024f6 /realrcptto.c
parent6ce418f63ceeda3d02246c6044c969d5f8f08b26 (diff)
downloadqmail-ebb74077eee67e729300b3be193482192975fa19.tar.gz
qmail-ebb74077eee67e729300b3be193482192975fa19.tar.bz2
qmail-ebb74077eee67e729300b3be193482192975fa19.zip
plus addressing improvements
* first `+` splits local part from sub-address * prioritize plus addressing over domain wildcards
Diffstat (limited to 'realrcptto.c')
-rw-r--r--realrcptto.c23
1 files changed, 13 insertions, 10 deletions
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)
173 unsigned int i; 173 unsigned int i;
174 char *x; 174 char *x;
175 175
176 for (i = at; i > 0; --i) 176 /* sub-addressing: ignore first and last character in local part */
177 if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break; 177 for (i = 1; i < at - 1; ++i) {
178 if (i == 0 || i == at - 1) return NULL; 178 if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) {
179 179 if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem();
180 if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); 180 if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem();
181 if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); 181 x = constmap(&mapvdoms, newaddr.s, newaddr.len);
182 x = constmap(&mapvdoms, newaddr.s, newaddr.len); 182 if (!x) return NULL;
183 if (!x) return NULL; 183
184 localpart->s[i] = '-';
185 return x;
186 }
187 }
184 188
185 localpart->s[i] = '-'; 189 return NULL;
186 return x;
187} 190}
188 191
189// max lookups 192// max lookups