summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--qmail-send.c34
-rw-r--r--realrcptto.c23
2 files changed, 34 insertions, 23 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;
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