diff options
| author | manuel <manuel@mausz.at> | 2018-10-15 13:58:07 +0200 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2018-10-15 13:59:42 +0200 |
| commit | ebb74077eee67e729300b3be193482192975fa19 (patch) | |
| tree | 92943e7e45be072b92590cd4107989efcef024f6 /realrcptto.c | |
| parent | 6ce418f63ceeda3d02246c6044c969d5f8f08b26 (diff) | |
| download | qmail-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.c | 23 |
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 |
