changeset 660:c26e97a2207b

Added support for the 'originalmail' keyword (Sascha Sommer)
author mortenp
date Tue, 06 Nov 2007 08:23:37 +1100
parents dcf36865330f
children 497526dfbb70
files ChangeLog include/prepstdreply.h src/mlmmj-bounce.c src/mlmmj-process.c src/mlmmj-sub.c src/mlmmj-unsub.c src/prepstdreply.c src/send_digest.c src/send_help.c src/send_list.c
diffstat 10 files changed, 59 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Sep 27 17:49:57 2007 +1000
+++ b/ChangeLog	Tue Nov 06 08:23:37 2007 +1100
@@ -1,3 +1,4 @@
+ o Added support for the 'originalmail' keyword (Sascha Sommer)
  o Merged various changes to the web interface from Franky Van Liedekerke
 1.2.15-RC1
  o Added --enable-recieve-strip configure option (Ansgar Burchardt)
--- a/include/prepstdreply.h	Thu Sep 27 17:49:57 2007 +1000
+++ b/include/prepstdreply.h	Tue Nov 06 08:23:37 2007 +1100
@@ -25,12 +25,13 @@
 #define PREPSTDREPLY_H
 
 char *substitute(const char *line, const char *listaddr, const char *listdelim,
-		 size_t datacount, char **data);
+		size_t datacount, char **data, const char* mailname);
 char *substitute_one(const char *line, const char *listaddr,
-		 const char *listdelim, size_t datacount, char **data);
+		const char *listdelim, size_t datacount, char **data,
+		const char* mailname);
 int open_listtext(const char *listdir, const char *filename);
 char *prepstdreply(const char *listdir, const char *filename, const char *from,
 		   const char *to, const char *replyto, size_t tokencount,
-		   char **data, char *customheaders);
+		char **data, char *customheaders, const char *mailname);
 
 #endif /* PREPSTDREPLY_H */
--- a/src/mlmmj-bounce.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/mlmmj-bounce.c	Tue Nov 06 08:23:37 2007 +1100
@@ -139,7 +139,7 @@
 
 	maildata[1] = indexstr;
 	queuefilename = prepstdreply(listdir, "bounce-probe", "$listowner$",
-					myaddr, NULL, 1, maildata, NULL);
+					myaddr, NULL, 1, maildata, NULL, NULL);
 	MY_ASSERT(queuefilename);
 	myfree(indexstr);
 
--- a/src/mlmmj-process.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/mlmmj-process.c	Tue Nov 06 08:23:37 2007 +1100
@@ -76,8 +76,7 @@
 	char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim;
 	char *queuefilename = NULL, *moderatorsfilename;
 	char *mailbasename = mybasename(mailfilename), *tmp, *to;
-	int queuefd, moderatorsfd, mailfd;
-	size_t count = 0;
+	int moderatorsfd;
 	char *maildata[4] = { "moderateaddr", NULL, "moderators", NULL };
 #if 0
 	printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename,
@@ -86,11 +85,6 @@
 	listfqdn = genlistfqdn(listaddr);
 	listname = genlistname(listaddr);
 
-	if((mailfd = open(mailfilename, O_RDONLY)) < 0) {
-		log_error(LOG_ARGS, "Could not open '%s'", mailfilename);
-		exit(EXIT_FAILURE);
-	}
-
 	moderatorsfilename = concatstr(2, listdir, "/control/moderators");
 	if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
@@ -123,25 +117,7 @@
 	myfree(listfqdn);
 
 	queuefilename = prepstdreply(listdir, "moderation", "$listowner$",
-				     to, replyto, 2, maildata, NULL);
-
-	if((queuefd = open(queuefilename, O_WRONLY|O_APPEND)) < 0) {
-		log_error(LOG_ARGS, "Could not open '%s'", queuefilename);
-		myfree(queuefilename);
-		exit(EXIT_FAILURE);
-	}
-	
-	while(count < 100 && (buf = mygetline(mailfd))) {
-		tmp = concatstr(2, " ", buf);
-		myfree(buf);
-		if(writen(queuefd, tmp, strlen(tmp)) < 0)
-			log_error(LOG_ARGS, "Could not write line for "
-					    "moderatemail");
-		myfree(tmp);
-		count++;
-	}
-	close(queuefd);
-	close(mailfd);
+				     to, replyto, 2, maildata, NULL, mailfilename);
 
 	execlp(mlmmjsend, mlmmjsend,
 				"-l", "2",
@@ -657,7 +633,7 @@
 			queuefilename = prepstdreply(listdir,
 					"maxmailsize", "$listowner$",
 					fromemails.emaillist[0],
-					NULL, 2, maildata, NULL);
+					NULL, 2, maildata, NULL, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listdelim);
 			myfree(listname);
@@ -768,7 +744,7 @@
 				     listfqdn);
 		queuefilename = prepstdreply(listdir, "notintocc",
 					"$listowner$", fromemails.emaillist[0],
-					     NULL, 0, NULL, NULL);
+					     NULL, 0, NULL, NULL, donemailname);
 		MY_ASSERT(queuefilename)
 		myfree(listdelim);
 		myfree(listname);
@@ -829,7 +805,7 @@
 					"bounces-help@", listfqdn);
 			queuefilename = prepstdreply(listdir, "subonlypost",
 					"$listowner$", fromemails.emaillist[0],
-						     NULL, 1, maildata, NULL);
+						     NULL, 1, maildata, NULL, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listaddr);
 			myfree(listdelim);
@@ -880,7 +856,7 @@
 			queuefilename = prepstdreply(listdir, "access",
 							"$listowner$",
 							fromemails.emaillist[0],
-						     NULL, 0, NULL, NULL);
+						     NULL, 0, NULL, NULL, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listaddr);
 			myfree(listdelim);
--- a/src/mlmmj-sub.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/mlmmj-sub.c	Tue Nov 06 08:23:37 2007 +1100
@@ -147,7 +147,7 @@
 	maildata[5] = moderators;
 
 	queuefilename = prepstdreply(listdir, "submod-moderator",
-				"$listowner$", to, replyto, 3, maildata, NULL);
+				"$listowner$", to, replyto, 3, maildata, NULL, NULL);
 	
 	myfree(maildata[1]);
 	
@@ -181,7 +181,7 @@
 
 	from = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
 	queuefilename = prepstdreply(listdir, "submod-requester", "$listowner$",
-					subaddr, NULL, 0, NULL, NULL);
+					subaddr, NULL, 0, NULL, NULL, NULL);
 	
 	myfree(listname);
 	myfree(listfqdn);
@@ -274,7 +274,7 @@
 	}
 
 	queuefilename = prepstdreply(listdir, listtext, "$helpaddr$",
-				     subaddr, NULL, 0, NULL, NULL);
+				     subaddr, NULL, 0, NULL, NULL, NULL);
 	MY_ASSERT(queuefilename);
 	myfree(listtext);
 
@@ -321,7 +321,7 @@
 	}
 
 	queuefilename = prepstdreply(listdir, listtext, "$listowner$",
-				"$listowner$", NULL, 1, maildata, NULL);
+				"$listowner$", NULL, 1, maildata, NULL, NULL);
 	MY_ASSERT(queuefilename)
 	myfree(listtext);
 	myfree(maildata[1]);
@@ -408,7 +408,7 @@
 	maildata[3] = mystrdup(confirmaddr);
 
 	queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", subaddr,
-				     confirmaddr, 2, maildata, NULL);
+				     confirmaddr, 2, maildata, NULL, NULL);
 
 	myfree(maildata[1]);
 	myfree(maildata[3]);
@@ -460,7 +460,7 @@
 	myfree(listdelim);
 
 	queuefilename = prepstdreply(listdir, "sub-subscribed", "$helpaddr$",
-				     subaddr, NULL, 0, NULL, NULL);
+				     subaddr, NULL, 0, NULL, NULL, NULL);
 	MY_ASSERT(queuefilename);
 
 	myfree(listaddr);
--- a/src/mlmmj-unsub.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/mlmmj-unsub.c	Tue Nov 06 08:23:37 2007 +1100
@@ -76,7 +76,7 @@
 	}
 
 	queuefilename = prepstdreply(listdir, listtext, "$helpaddr$",
-				     subaddr, NULL, 0, NULL, NULL);
+				     subaddr, NULL, 0, NULL, NULL, NULL);
 	MY_ASSERT(queuefilename);
 	myfree(listtext);
 
@@ -124,7 +124,7 @@
 	}
 	
 	queuefilename = prepstdreply(listdir, listtext, "$listowner$",
-				     "$listowner$", NULL, 1, maildata, NULL);
+				     "$listowner$", NULL, 1, maildata, NULL, NULL);
 	MY_ASSERT(queuefilename);
 	myfree(listtext);
 	myfree(maildata[1]);
@@ -213,7 +213,7 @@
 	maildata[3] = mystrdup(confirmaddr);
 
 	queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", subaddr,
-				     confirmaddr, 2, maildata, NULL);
+				     confirmaddr, 2, maildata, NULL, NULL);
 
 	myfree(maildata[1]);
 	myfree(maildata[3]);
@@ -305,7 +305,7 @@
 	myfree(listdelim);
 
 	queuefilename = prepstdreply(listdir, "unsub-notsubscribed",
-				     "$helpaddr$", subaddr, NULL, 0, NULL, NULL);
+				     "$helpaddr$", subaddr, NULL, 0, NULL, NULL, NULL);
 	MY_ASSERT(queuefilename);
 
 	myfree(listaddr);
--- a/src/prepstdreply.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/prepstdreply.c	Tue Nov 06 08:23:37 2007 +1100
@@ -44,13 +44,13 @@
 #include "unistr.h"
 
 char *substitute(const char *line, const char *listaddr, const char *listdelim,
-		 size_t datacount, char **data)
+		 size_t datacount, char **data, const char *mailname)
 {
 	char *s1, *s2;
 
-	s1 = substitute_one(line, listaddr, listdelim, datacount, data);
+	s1 = substitute_one(line, listaddr, listdelim, datacount, data, mailname);
 	while(s1) {
-		s2 = substitute_one(s1, listaddr, listdelim, datacount, data);
+		s2 = substitute_one(s1, listaddr, listdelim, datacount, data, mailname);
 		if(s2) {
 			myfree(s1);
 			s1 = s2;
@@ -62,7 +62,8 @@
 }
 
 char *substitute_one(const char *line, const char *listaddr,
-		     const char *listdelim, size_t datacount, char **data)
+			const char *listdelim, size_t datacount, char **data,
+			const char* mailname)
 {
 	char *fqdn, *listname, *d1, *d2, *token, *value = NULL;
 	char *retstr, *origline;
@@ -132,6 +133,27 @@
 		value = concatstr(4, listname, listdelim, "subscribe-nomail@",
 				  fqdn);
 		goto concatandreturn;
+	} else if(strcmp(token, "originalmail") == 0) {
+		/* append the first 100 lines of the mail inline */
+		int mailfd;
+		if(mailname && 
+		     ((mailfd = open(mailname, O_RDONLY)) > 0)){
+			size_t count = 0;
+			char* str = NULL;
+			while(count < 100 && (str = mygetline(mailfd))) {
+				char* tmp = value;
+				value = concatstr(3, value, " ", str);
+				if(tmp)
+					myfree(tmp);
+				count++;
+			}
+			if(str)
+				myfree(str);
+			close(mailfd);
+		}else{
+			log_error(LOG_ARGS, "Could not substitute $originalmail$ (mailname == %s)",mailname);
+		}
+		goto concatandreturn;
 	}
 	if(data) {
 		for(i = 0; i < datacount; i++) {
@@ -187,7 +209,7 @@
 
 char *prepstdreply(const char *listdir, const char *filename, const char *from,
 		   const char *to, const char *replyto, size_t tokencount,
-		   char **data, char *customheaders)
+		   char **data, char *customheaders, const char *mailname)
 {
 	int infd, outfd;
 	char *listaddr, *listdelim, *myfrom, *tmp, *subject, *retstr = NULL;
@@ -211,7 +233,7 @@
 		chomp(line);
 		utfsub = unistr_escaped_to_utf8(line + 9);
 		utfsub2 = substitute(utfsub, listaddr, listdelim, tokencount,
-				     data);
+				     data, NULL);
 		subject = unistr_utf8_to_header(utfsub2);
 		myfree(utfsub);
 		myfree(utfsub2);
@@ -231,14 +253,14 @@
 		utfline = NULL;
 	}
 	
-	myfrom = substitute(from, listaddr, listdelim, tokencount, data);
-	myto = substitute(to, listaddr, listdelim, tokencount, data);
+	myfrom = substitute(from, listaddr, listdelim, tokencount, data, NULL);
+	myto = substitute(to, listaddr, listdelim, tokencount, data, NULL);
 	mydate = gendatestr();
 	mymsgid = genmsgid(listfqdn);
 
 	if(replyto) {
 		myreplyto = substitute(replyto, listaddr, listdelim,
-				       tokencount, data);
+				       tokencount, data, NULL);
 		tmp = concatstr(3, "Reply-To: ", myreplyto, "\n");
 		myfree(myreplyto);
 		myreplyto = tmp;
@@ -297,7 +319,7 @@
 		myfree(tmp);
 
 		tmp = utfline;
-		str = substitute(utfline, listaddr, listdelim, tokencount, data);
+		str = substitute(utfline, listaddr, listdelim, tokencount, data, mailname);
 		myfree(tmp);
 
 		if(writen(outfd, str, strlen(str)) < 0) {
--- a/src/send_digest.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/send_digest.c	Tue Nov 06 08:23:37 2007 +1100
@@ -263,7 +263,7 @@
 		utfsub = unistr_escaped_to_utf8(line + 9);
 	}
 
-	utfsub2 = substitute(utfsub, listaddr, listdelim, 5, subst_data);
+	utfsub2 = substitute(utfsub, listaddr, listdelim, 5, subst_data, NULL);
 	subject = unistr_utf8_to_header(utfsub2);
 	myfree(utfsub);
 	myfree(utfsub2);
@@ -362,7 +362,7 @@
 				myfree(line);
 
 				tmp = substitute(utfline, listaddr, listdelim,
-						5, subst_data);
+						5, subst_data, NULL);
 				myfree(utfline);
 
 				if(writen(fd, tmp, strlen(tmp)) < 0) {
--- a/src/send_help.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/send_help.c	Tue Nov 06 08:23:37 2007 +1100
@@ -57,7 +57,7 @@
 	myfree(listdelim);
 
 	queuefilename = prepstdreply(listdir, textfile, "$listowner$",
-					emailaddr, NULL, 0, NULL, NULL);
+					emailaddr, NULL, 0, NULL, NULL, NULL);
 	if(queuefilename == NULL) {
 		log_error(LOG_ARGS, "Could not prepare %s mail", name);
 		exit(EXIT_FAILURE);
--- a/src/send_list.c	Thu Sep 27 17:49:57 2007 +1000
+++ b/src/send_list.c	Tue Nov 06 08:23:37 2007 +1100
@@ -61,7 +61,7 @@
 	myfree(listdelim);
 
 	queuefilename = prepstdreply(listdir, "listsubs", "$listowner$",
-					emailaddr, NULL, 0, NULL, NULL);
+					emailaddr, NULL, 0, NULL, NULL, NULL);
 	if(queuefilename == NULL) {
 		log_error(LOG_ARGS, "Could not prepare sub list mail");
 		exit(EXIT_FAILURE);