changeset 744:926f184eec44

Add a $subject$ substitution for list texts
author Ben Schmidt
date Mon, 20 Sep 2010 02:25:54 +1000
parents c2ffbdcf3be5
children 5edfa9eef6c7
files ChangeLog README.listtexts src/mlmmj-process.c
diffstat 3 files changed, 40 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Sep 20 02:07:42 2010 +1000
+++ b/ChangeLog	Mon Sep 20 02:25:54 2010 +1000
@@ -1,3 +1,4 @@
+ 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
    $originalmail$ in the listtexts will generally retain current behaviour
--- a/README.listtexts	Mon Sep 20 02:07:42 2010 +1000
+++ b/README.listtexts	Mon Sep 20 02:25:54 2010 +1000
@@ -237,13 +237,19 @@
   number like 1000000000.
 
 - $posteraddr$
-  (available only in subonlypost)
+  (available only in access, notintocc, moderation, moderation-poster and
+  subonlypost)
   the from address of the message that was received as determined by Mlmmj
 
 - $subaddr$
   (available only in submod-moderator and [un]sub-confirm[-digest|-nomail])
   the address requested to be (un-)subscribed
 
+- $subject$
+  (available only in access, notintocc, moderation, moderation-poster and
+  subonlypost)
+  the subject line of the message in question
+
 - \uNNNN
   (NNNN are hex digits)
   a Unicode character
--- a/src/mlmmj-process.c	Mon Sep 20 02:07:42 2010 +1000
+++ b/src/mlmmj-process.c	Mon Sep 20 02:25:54 2010 +1000
@@ -52,6 +52,7 @@
 #include "memory.h"
 #include "log_oper.h"
 #include "chomp.h"
+#include "unistr.h"
 
 enum action {
 	ALLOW,
@@ -71,14 +72,16 @@
 
 
 void newmoderated(const char *listdir, const char *mailfilename,
-		  const char *mlmmjsend, const char *efromsender)
+		  const char *mlmmjsend, const char *efromsender,
+		  size_t tokencount, char **data)
 {
+	size_t i;
 	char *from, *listfqdn, *listname, *moderators = NULL;
 	char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim;
 	char *queuefilename = NULL, *moderatorsfilename, *efromismod = NULL;
 	char *mailbasename = mybasename(mailfilename), *tmp, *to;
 	int moderatorsfd, foundaddr = 0, notifymod = 0, status;
-	char *maildata[4] = { "moderateaddr", NULL, "moderators", NULL };
+	char *maildata[10] = { "moderateaddr", NULL, "moderators", NULL };
 	pid_t childpid, pid;
 #if 0
 	printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename,
@@ -87,6 +90,13 @@
 	listfqdn = genlistfqdn(listaddr);
 	listname = genlistname(listaddr);
 
+	MY_ASSERT(tokencount<=3)
+	for (i=0; i<tokencount; i++) {
+		maildata[4+2*i] = data[2*i];
+		maildata[5+2*i] = data[1+2*i];
+	}
+	tokencount += 2;
+
 	moderatorsfilename = concatstr(2, listdir, "/control/moderators");
 	if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
 		log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
@@ -133,7 +143,7 @@
 	myfree(listfqdn);
 
 	queuefilename = prepstdreply(listdir, "moderation", "$listowner$",
-				     to, replyto, 2, maildata,
+				     to, replyto, tokencount, maildata,
 				     mailfilename);
 
 	/* we might need to exec more than one mlmmj-send */
@@ -176,7 +186,7 @@
 
 	queuefilename = prepstdreply(listdir, "moderation-poster",
 				     "$listowner$", efromsender,
-				     NULL, 1, maildata+2, mailfilename);
+				     NULL, tokencount-1, maildata+2, mailfilename);
 
 	execlp(mlmmjsend, mlmmjsend,
 			"-l", "1",
@@ -385,7 +395,8 @@
 	char *listfqdn, *listname, *fromaddr;
 	char *queuefilename, *recipextra = NULL, *owner = NULL;
 	char *maxmailsizestr;
-	char *maildata[4] = { "posteraddr", NULL, "maxmailsize", NULL };
+	char *maildata[6] = { "subject", NULL,
+		"posteraddr", NULL, "maxmailsize", NULL };
 	char *envstr, *efrom;
 	struct stat st;
 	uid_t uid;
@@ -404,6 +415,7 @@
 		{ "Cc:", 0, NULL },
 		{ "Return-Path:", 0, NULL },
 		{ "Delivered-To:", 0, NULL },
+		{ "Subject:", 0, NULL },
 		{ NULL, 0, NULL }
 	};
 
@@ -538,6 +550,8 @@
 	for(i = 0; i < readhdrs[0].valuecount; i++) {
 		find_email_adr(readhdrs[0].values[i], &fromemails);
 	}
+	if (fromemails.emailcount)
+		maildata[3] = fromemails.emaillist[0];
 
 	/* To: addresses */
 	for(i = 0; i < readhdrs[1].valuecount; i++) {
@@ -559,6 +573,12 @@
 		find_email_adr(readhdrs[4].values[i], &dtemails);
 	}
 
+	/* Subject: */
+	if (readhdrs[5].valuecount)
+		maildata[1] = unistr_header_to_utf8(readhdrs[5].values[0]);
+	if (!maildata[1])
+		maildata[1] = mystrdup("");
+
 	/* envelope from */
 	if((envstr = getenv("SENDER")) != NULL) {
 		/* qmail, postfix, exim */
@@ -635,7 +655,7 @@
 			close(rawmailfd);
 			close(donemailfd);
 			unlink(mailfile);
-			log_oper(listdir, OPLOGFNAME, "mlmmj-recieve: sending"
+			log_oper(listdir, OPLOGFNAME, "mlmmj-process: sending"
 					" mail from %s to owner",
 					efrom);
 			execlp(mlmmjsend, mlmmjsend,
@@ -692,11 +712,11 @@
 			listfqdn = genlistfqdn(listaddr);
 			fromaddr = concatstr(4, listname, listdelim,
 					"bounces-help@", listfqdn);
-			maildata[3] = maxmailsizestr;
+			maildata[5] = maxmailsizestr;
 			queuefilename = prepstdreply(listdir,
 					"maxmailsize", "$listowner$",
 					fromemails.emaillist[0],
-					NULL, 1, maildata+2, donemailname);
+					NULL, 1, maildata+4, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listdelim);
 			myfree(listname);
@@ -811,7 +831,7 @@
 				     listfqdn);
 		queuefilename = prepstdreply(listdir, "notintocc",
 					"$listowner$", fromemails.emaillist[0],
-					     NULL, 0, NULL, donemailname);
+					     NULL, 2, maildata, donemailname);
 		MY_ASSERT(queuefilename)
 		myfree(listdelim);
 		myfree(listname);
@@ -867,12 +887,11 @@
 			listdelim = getlistdelim(listdir);
 			listname = genlistname(listaddr);
 			listfqdn = genlistfqdn(listaddr);
-			maildata[1] = fromemails.emaillist[0];
 			fromaddr = concatstr(4, listname, listdelim,
 					"bounces-help@", listfqdn);
 			queuefilename = prepstdreply(listdir, "subonlypost",
 					"$listowner$", fromemails.emaillist[0],
-						     NULL, 1, maildata, donemailname);
+						     NULL, 2, maildata, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listaddr);
 			myfree(listdelim);
@@ -927,7 +946,7 @@
 			queuefilename = prepstdreply(listdir, "access",
 							"$listowner$",
 							fromemails.emaillist[0],
-						     NULL, 0, NULL, donemailname);
+						     NULL, 2, maildata, donemailname);
 			MY_ASSERT(queuefilename)
 			myfree(listaddr);
 			myfree(listdelim);
@@ -1004,7 +1023,7 @@
 			fsync(omitfd);
 			close(omitfd);
 		}
-		newmoderated(listdir, mqueuename, mlmmjsend, efrom);
+		newmoderated(listdir, mqueuename, mlmmjsend, efrom, 2, maildata);
 		return EXIT_SUCCESS;
 	}