# HG changeset patch # User Ben Schmidt # Date 1284913863 -36000 # Node ID 5edfa9eef6c723a5f98ccf56758fa4cef022f5a0 # Parent 926f184eec44d2892c3fc87e3ad2e8e7b5559927 Add $random0$ through $random5$ substitutions diff -r 926f184eec44 -r 5edfa9eef6c7 ChangeLog --- a/ChangeLog Mon Sep 20 02:25:54 2010 +1000 +++ b/ChangeLog Mon Sep 20 02:31:03 2010 +1000 @@ -1,3 +1,4 @@ + o Add $random0$ through $random5$ substitutions o Add a $subject$ substitution for list texts o Changes to how $originalmail$ works -- existing installations will change behaviour due to this; prepending a space to the lines currently containing diff -r 926f184eec44 -r 5edfa9eef6c7 README.listtexts --- a/README.listtexts Mon Sep 20 02:25:54 2010 +1000 +++ b/README.listtexts Mon Sep 20 02:31:03 2010 +1000 @@ -241,6 +241,16 @@ subonlypost) the from address of the message that was received as determined by Mlmmj +- $random0$ +- $random1$ +- $random2$ +- $random3$ +- $random4$ +- $random5$ + these are 6 distinct random strings; they allow list texts to be constructed + that are MIME messages with attachments by using creating boundaries that are + unlikely to appear in the attached messages + - $subaddr$ (available only in submod-moderator and [un]sub-confirm[-digest|-nomail]) the address requested to be (un-)subscribed diff -r 926f184eec44 -r 5edfa9eef6c7 src/prepstdreply.c --- a/src/prepstdreply.c Mon Sep 20 02:25:54 2010 +1000 +++ b/src/prepstdreply.c Mon Sep 20 02:31:03 2010 +1000 @@ -194,6 +194,7 @@ char *listaddr, *listdelim, *tmp, *retstr = NULL; char *listfqdn, *line, *utfline, *utfsub, *utfsub2; char *str = NULL; + char **moredata; char *headers[10] = { NULL }; /* relies on NULL to flag end */ if ((infd = open_listtext(listdir, filename)) < 0) { @@ -206,6 +207,7 @@ do { tmp = random_str(); + if (retstr) myfree(retstr); retstr = concatstr(3, listdir, "/queue/", tmp); myfree(tmp); @@ -219,15 +221,27 @@ myfree(listaddr); myfree(listdelim); myfree(listfqdn); + myfree(retstr); return NULL; } + moredata = mymalloc(2*(tokencount+6) * sizeof(char *)); + for (i=0; i<2*tokencount; i++) { + moredata[i] = data[i]; + } + for (i=0; i<6; i++) { + moredata[2*(tokencount+i)] = mystrdup("randomN"); + moredata[2*(tokencount+i)][6] = '0' + i; + moredata[2*(tokencount+i)+1] = random_str(); + } + tokencount += 6; + tmp = substitute(from, listaddr, listdelim, - tokencount, data); + tokencount, moredata); headers[0] = concatstr(2, "From: ", tmp); myfree(tmp); tmp = substitute(to, listaddr, listdelim, - tokencount, data); + tokencount, moredata); headers[1] = concatstr(2, "To: ", tmp); myfree(tmp); headers[2] = genmsgid(listfqdn); @@ -241,7 +255,7 @@ if(replyto) { tmp = substitute(replyto, listaddr, listdelim, - tokencount, data); + tokencount, moredata); headers[8] = concatstr(2, "Reply-To: ", tmp); myfree(tmp); } @@ -265,7 +279,7 @@ continuation of previous header line */ utfsub = unistr_escaped_to_utf8(line); str = substitute(utfsub, listaddr, listdelim, - tokencount, data); + tokencount, moredata); myfree(utfsub); len = strlen(str); str[len] = '\n'; @@ -273,10 +287,9 @@ log_error(LOG_ARGS, "Could not write std mail"); myfree(str); myfree(line); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } myfree(str); } else { @@ -308,7 +321,7 @@ utfsub = unistr_escaped_to_utf8(tmp); *tmp = '\0'; utfsub2 = substitute(utfsub, listaddr, listdelim, - tokencount, data); + tokencount, moredata); myfree(utfsub); if (strncasecmp(line, "Subject:", len) == 0) { tmp = unistr_utf8_to_header(utfsub2); @@ -325,10 +338,9 @@ log_error(LOG_ARGS, "Could not write std mail"); myfree(str); myfree(line); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } myfree(str); } @@ -343,10 +355,9 @@ if (line) myfree(line); myfree(str); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } } @@ -356,10 +367,9 @@ myfree(str); if (line) myfree(line); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } if (line) { @@ -399,11 +409,10 @@ if(writen(outfd,str,strlen(str)) < 0) { myfree(str); myfree(utfline); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); log_error(LOG_ARGS, "Could not write std mail"); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } myfree(str); i++; @@ -418,15 +427,14 @@ myfree(utfline); } else { str = substitute(utfline, listaddr, listdelim, - tokencount, data); + tokencount, moredata); myfree(utfline); if(writen(outfd, str, strlen(str)) < 0) { myfree(str); - myfree(listaddr); - myfree(listdelim); - myfree(listfqdn); log_error(LOG_ARGS, "Could not write std mail"); - return NULL; + myfree(retstr); + retstr = NULL; + goto freeandreturn; } myfree(str); } @@ -437,9 +445,16 @@ fsync(outfd); close(outfd); +freeandreturn: myfree(listaddr); myfree(listdelim); myfree(listfqdn); + for (i=tokencount-6; i