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 /qmail-send.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 'qmail-send.c')
| -rw-r--r-- | qmail-send.c | 34 |
1 files changed, 21 insertions, 13 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; | |||
| 149 | return 1; | 149 | return 1; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | for (i = 0;i <= addr.len;++i) | 152 | if ((x = constmap(&mapvdoms, addr.s, addr.len)) && (*x)) { |
| 153 | if (!i || (i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.'))) | 153 | if (!stralloc_cats(&rwline,x)) return 0; |
| 154 | if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) { | 154 | if (!stralloc_cats(&rwline,"-")) return 0; |
| 155 | if (!*x) break; | 155 | if (!stralloc_cat(&rwline,&addr)) return 0; |
| 156 | if (!stralloc_cats(&rwline,x)) return 0; | 156 | if (!stralloc_0(&rwline)) return 0; |
| 157 | if (!stralloc_cats(&rwline,"-")) return 0; | 157 | return 1; |
| 158 | if (!stralloc_cat(&rwline,&addr)) return 0; | 158 | } |
| 159 | if (!stralloc_0(&rwline)) return 0; | 159 | |
| 160 | return 1; | 160 | /* sub-addressing: ignore first and last character in local part */ |
| 161 | } | ||
| 162 | |||
| 163 | static stralloc newaddr = {0}; | 161 | static stralloc newaddr = {0}; |
| 164 | for (i = at; i > 0; --i) { | 162 | for (i = 1; i < at - 1; ++i) { |
| 165 | if (addr.s[i] == '+' /*|| addr.s[i] == '-'*/) { | 163 | if (addr.s[i] == '+' /*|| addr.s[i] == '-'*/) { |
| 166 | if (i == at - 1) break; | ||
| 167 | if (!stralloc_copyb(&newaddr, addr.s, i)) return 0; | 164 | if (!stralloc_copyb(&newaddr, addr.s, i)) return 0; |
| 168 | if (!stralloc_catb(&newaddr, addr.s + at, addr.len - at)) return 0; | 165 | if (!stralloc_catb(&newaddr, addr.s + at, addr.len - at)) return 0; |
| 169 | if (x = constmap(&mapvdoms, newaddr.s, newaddr.len)) { | 166 | if (x = constmap(&mapvdoms, newaddr.s, newaddr.len)) { |
| @@ -179,6 +176,17 @@ char *recip; | |||
| 179 | } | 176 | } |
| 180 | } | 177 | } |
| 181 | 178 | ||
| 179 | for (i = at + 1;i <= addr.len;++i) | ||
| 180 | if ((i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.'))) | ||
| 181 | if (x = constmap(&mapvdoms,addr.s + i,addr.len - i)) { | ||
| 182 | if (!*x) break; | ||
| 183 | if (!stralloc_cats(&rwline,x)) return 0; | ||
| 184 | if (!stralloc_cats(&rwline,"-")) return 0; | ||
| 185 | if (!stralloc_cat(&rwline,&addr)) return 0; | ||
| 186 | if (!stralloc_0(&rwline)) return 0; | ||
| 187 | return 1; | ||
| 188 | } | ||
| 189 | |||
| 182 | if (!stralloc_cat(&rwline,&addr)) return 0; | 190 | if (!stralloc_cat(&rwline,&addr)) return 0; |
| 183 | if (!stralloc_0(&rwline)) return 0; | 191 | if (!stralloc_0(&rwline)) return 0; |
| 184 | return 2; | 192 | return 2; |
