changeset 745:5edfa9eef6c7

Add $random0$ through $random5$ substitutions
author Ben Schmidt
date Mon, 20 Sep 2010 02:31:03 +1000
parents 926f184eec44
children 32d3f7e3b523
files ChangeLog README.listtexts src/prepstdreply.c
diffstat 3 files changed, 57 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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<tokencount; i++) {
+		myfree(moredata[2*i]);
+		myfree(moredata[2*i+1]);
+	}
+	myfree(moredata);
+
 	return retstr;
 }