changeset 727:4575d3181ca1

Added notmetoo feature where posts are not mirrored to their senders.
author Ben Schmidt
date Fri, 30 Jul 2010 23:54:56 +1000
parents 7d4efc26d03a
children e5286b45f9ca
files ChangeLog TUNABLES contrib/web/perl-admin/conf/tunables.pl contrib/web/php-admin/conf/tunables.pl contrib/web/php-moderation/mlmmj-moderation.php man/mlmmj-send.1 src/listcontrol.c src/mlmmj-process.c src/mlmmj-send.c
diffstat 9 files changed, 113 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Jul 30 09:21:28 2010 +1000
+++ b/ChangeLog	Fri Jul 30 23:54:56 2010 +1000
@@ -1,3 +1,4 @@
+ o Added notmetoo feature where posts are not mirrored to their senders
  o Check return status in mlmmj-perl-admin when adding subscribers (Florian
    Streibelt, Bitmand)
  o Better validation of input in php-admin (Thomas Goirand)
--- a/TUNABLES	Fri Jul 30 09:21:28 2010 +1000
+++ b/TUNABLES	Fri Jul 30 23:54:56 2010 +1000
@@ -217,3 +217,9 @@
 
    The content of this file is appended to mail sent to the list.
 
+ · notmetoo			(boolean)
+
+   If this file is present, mlmmj attempts to exclude the sender of a post
+   from the distribution list for that post so people don't receive copies
+   of their own posts.
+
--- a/contrib/web/perl-admin/conf/tunables.pl	Fri Jul 30 09:21:28 2010 +1000
+++ b/contrib/web/perl-admin/conf/tunables.pl	Fri Jul 30 23:54:56 2010 +1000
@@ -205,3 +205,9 @@
 			  "Footer",
 			  "The content of this option is appended to mail sent to the list.");
 
+mlmmj_boolean("notmetoo",
+			  "Not me too",
+			  "If this is set, mlmmj attempts to exclude the sender of a post ".
+			  "from the distribution list for that post so people don't receive copies ".
+			  "of their own posts.");
+
--- a/contrib/web/php-admin/conf/tunables.pl	Fri Jul 30 09:21:28 2010 +1000
+++ b/contrib/web/php-admin/conf/tunables.pl	Fri Jul 30 23:54:56 2010 +1000
@@ -205,3 +205,9 @@
 			  "Footer",
 			  "The content of this option is appended to mail sent to the list.");
 
+mlmmj_boolean("notmetoo",
+			  "Not me too",
+			  "If this is set, mlmmj attempts to exclude the sender of a post ".
+			  "from the distribution list for that post so people don't receive copies ".
+			  "of their own posts.");
+
--- a/contrib/web/php-moderation/mlmmj-moderation.php	Fri Jul 30 09:21:28 2010 +1000
+++ b/contrib/web/php-moderation/mlmmj-moderation.php	Fri Jul 30 23:54:56 2010 +1000
@@ -116,6 +116,7 @@
 	if (is_dir($mod_dir)) {
 		if ($dh = opendir($mod_dir)) {
 			while (($file = readdir($dh)) !== false) {
+				if( !ereg("^([0-9a-f]+)\$",$file) ) continue;
 				$full_path = $mod_dir . "/" . $file;
 				if(filetype($full_path) == "file"){
 					if(FALSE === ($input = file_get_contents($full_path))){
@@ -203,6 +204,9 @@
 			}else{
 //				echo "Deleting message ".$_REQUEST["msg_id"][$i]."<br>";
 				unlink($mod_dir . "/" . $_REQUEST["msg_id"][$i]);
+				if( file_exists($mod_dir . "/" . $_REQUEST["msg_id"][$i] . ".orig") ){
+					unlink($mod_dir . "/" . $_REQUEST["msg_id"][$i] . ".orig");
+				}
 			}
 		}
 	}
--- a/man/mlmmj-send.1	Fri Jul 30 09:21:28 2010 +1000
+++ b/man/mlmmj-send.1	Fri Jul 30 23:54:56 2010 +1000
@@ -1,11 +1,11 @@
-.TH mlmmj-send "1" "September 2004" mlmmj-send
+.TH mlmmj-send "1" "January 2010" mlmmj-send
 .SH NAME
 mlmmj-send \- send mail to a mailinglist or similar
 .SH SYNOPSIS
 .B mlmmj-send
 [\fI-L\fR /path/to/list | \fI-l\fR listctrl] \fI\-m\fR /path/to/mail
-[\fI-a\fR] [\fI-D\fR] [\fI-F\fR] [\fI-h\fR] [\fI-r\fR] [\fI-R\fR] [\fI-s\fR]
-[\fI-T\fR] [\fI-V\fR]
+[\fI-a\fR] [\fI-D\fR] [\fI-F\fR] [\fI-h\fR] [\fI-o\fR] [\fI-r\fR] [\fI-R\fR]
+[\fI-s\fR] [\fI-T\fR] [\fI-V\fR]
 .HP
 \fB\-a\fR: Don't archive the mail
 .HP
@@ -21,6 +21,8 @@
 .HP
 \fB\-m\fR: Full path to mail file
 .HP
+\fB\-o\fR: Address to omit from distribution (normal mail only)
+.HP
 \fB\-r\fR: Relayhost IP address (defaults to 127.0.0.1)
 .HP
 \fB\-R\fR: What to use as Reply-To: header
--- a/src/listcontrol.c	Fri Jul 30 09:21:28 2010 +1000
+++ b/src/listcontrol.c	Fri Jul 30 23:54:56 2010 +1000
@@ -105,7 +105,8 @@
 		const char *mlmmjbounce, const char *mailname)
 {
 	char *bouncenr, *tmpstr;
-	char *param = NULL, *conffilename, *moderatefilename;
+	char *param = NULL, *conffilename, *moderatefilename, *omitfilename;
+	char *omit = NULL;
 	char *c, *archivefilename, *sendfilename;
 	const char *subswitch;
 	struct stat stbuf;
@@ -604,7 +605,6 @@
 		}
 
 		sendfilename = concatstr(2, moderatefilename, ".sending");
-
 		if(stat(moderatefilename, &stbuf) < 0) {
 			myfree(moderatefilename);
 			/* no mail to moderate */
@@ -620,9 +620,30 @@
 			exit(EXIT_FAILURE);
 		}
 
+		omitfilename = concatstr(2, moderatefilename, ".omit");
+		if(stat(omitfilename, &stbuf) == 0) {
+			tmpfd = open(omitfilename, O_RDONLY);
+			if(tmpfd < 0) {
+				log_error(LOG_ARGS, "Could not open %s",
+						omitfilename);
+			} else {
+				omit = mygetline(tmpfd);
+				close(tmpfd);
+				chomp(omit);
+			}
+			unlink(omitfilename);
+			myfree(omitfilename);
+		}
+
 		log_oper(listdir, OPLOGFNAME, "%s moderated %s",
 				fromemails->emaillist[0], moderatefilename);
 		myfree(moderatefilename);
+		if (omit != NULL)
+			execlp(mlmmjsend, mlmmjsend,
+					"-L", listdir,
+					"-o", omit,
+					"-m", sendfilename, (char *)NULL);
+		else
 		execlp(mlmmjsend, mlmmjsend,
 				"-L", listdir,
 				"-m", sendfilename, (char *)NULL);
--- a/src/mlmmj-process.c	Fri Jul 30 09:21:28 2010 +1000
+++ b/src/mlmmj-process.c	Fri Jul 30 23:54:56 2010 +1000
@@ -335,14 +335,15 @@
 int main(int argc, char **argv)
 {
 	int i, j, opt, noprocess = 0, moderated = 0;
-	int hdrfd, footfd, rawmailfd, donemailfd;
+	int hdrfd, footfd, rawmailfd, donemailfd, omitfd;
 	int subonlypost = 0, addrtocc = 1, intocc = 0, modnonsubposts = 0;
 	int maxmailsize = 0;
 	int notoccdenymails = 0, noaccessdenymails = 0, nosubonlydenymails = 0;
 	int nomaxmailsizedenymails = 0;
+	int notmetoo = 0;
 	char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL;
 	char *footerfilename = NULL, *donemailname = NULL;
-	char *randomstr = NULL, *mqueuename;
+	char *randomstr = NULL, *mqueuename, *omitfilename;
 	char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
 	char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim;
 	char *listfqdn, *listname, *fromaddr;
@@ -855,6 +856,7 @@
 	}
 
 startaccess:
+
 	if(!moderated)
 		moderated = statctrl(listdir, "moderated");
 
@@ -931,6 +933,8 @@
 		}
 	}
 
+	notmetoo = statctrl(listdir, "notmetoo");
+
 	if(moderated) {
 		mqueuename = concatstr(3, listdir, "/moderation/",
 				       randomstr);
@@ -943,6 +947,27 @@
 			exit(EXIT_FAILURE);
 		}
 		myfree(donemailname);
+		if (notmetoo) {
+			omitfilename = concatstr(2, mqueuename, ".omit");
+			omitfd = open(omitfilename, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
+			if (omitfd < 0) {
+				log_error(LOG_ARGS, "could not open %s",
+					    	    omitfilename);
+				myfree(mqueuename);
+				myfree(omitfilename);
+				exit(EXIT_FAILURE);
+			}
+			myfree(omitfilename);
+			if(writen(omitfd, fromemails.emaillist[0],
+					strlen(fromemails.emaillist[0])) < 0) {
+				log_error(LOG_ARGS,
+						"could not write omit file");
+				myfree(mqueuename);
+				exit(EXIT_FAILURE);
+			}
+			fsync(omitfd);
+			close(omitfd);
+		}
 		newmoderated(listdir, mqueuename, mlmmjsend, efrom);
 		return EXIT_SUCCESS;
 	}
@@ -955,6 +980,12 @@
 		exit(EXIT_SUCCESS);
 	}
 
+	if (notmetoo)
+		execlp(mlmmjsend, mlmmjsend,
+				"-L", listdir,
+				"-o", fromemails.emaillist[0],
+				"-m", donemailname, (char *)NULL);
+	else
 	execlp(mlmmjsend, mlmmjsend,
 				"-L", listdir,
 				"-m", donemailname, (char *)NULL);
--- a/src/mlmmj-send.c	Fri Jul 30 09:21:28 2010 +1000
+++ b/src/mlmmj-send.c	Fri Jul 30 23:54:56 2010 +1000
@@ -673,8 +673,8 @@
 static void print_help(const char *prg)
 {
         printf("Usage: %s [-L /path/to/list || -l listctrl] \n"
-	       "       -m /path/to/mail [-a] [-D] [-F] [-h] [-r] [-R] "
-	       "[-s] [-T] [-V]\n"
+	       "       -m /path/to/mail [-a] [-D] [-F] [-h] [-o] [-r] [-R] "
+	       "[-R] [-s] [-T] [-V]\n"
 	       " -a: Don't archive the mail\n"
 	       " -D: Don't delete the mail after it's sent\n"
 	       " -F: What to use as MAIL FROM:\n"
@@ -689,6 +689,7 @@
 	       "    '7' means 'digest'\n"
 	       " -L: Full path to list directory\n"
 	       " -m: Full path to mail file\n"
+	       " -o: Address to omit from distribution (normal mail only)\n"
 	       " -r: Relayhost IP address (defaults to 127.0.0.1)\n"
 	       " -R: What to use as Reply-To: header\n"
 	       " -s: Subscribers file name\n"
@@ -704,7 +705,7 @@
 	int deletewhensent = 1, sendres = 0, archive = 1, digest = 0;
 	int ctrlarchive, res;
 	char *listaddr = NULL, *listdelim = NULL;
-	char *mailfilename = NULL, *subfilename = NULL;
+	char *mailfilename = NULL, *subfilename = NULL, *omit = NULL;
 	char *replyto = NULL, *bounceaddr = NULL, *to_addr = NULL;
 	char *relayhost = NULL, *archivefilename = NULL, *tmpstr;
 	char *listctrl = NULL, *subddirname = NULL, *listdir = NULL;
@@ -737,7 +738,7 @@
 	if(sigaction(SIGTERM, &sigact, NULL) < 0)
 		log_error(LOG_ARGS, "Could not install SIGTERM handler!");
 
-	while ((opt = getopt(argc, argv, "aVDhm:l:L:R:F:T:r:s:")) != -1){
+	while ((opt = getopt(argc, argv, "aVDhm:l:L:R:F:T:r:s:o:")) != -1){
 		switch(opt) {
 		case 'a':
 			archive = 0;
@@ -760,6 +761,9 @@
 		case 'm':
 			mailfilename = optarg;
 			break;
+		case 'o':
+			omit = optarg;
+			break;
 		case 'r':
 			relayhost = optarg;
 			break;
@@ -1179,6 +1183,22 @@
 			do {
 				res = getaddrsfromfd(&stl, subfd,
 						maxverprecips);
+				if(omit != NULL && maxverprecips > 1) {
+					for(i = 0; i < stl.count; i++) {
+						if(strcmp(stl.strs[i], omit)
+							== 0) {
+						    myfree(stl.strs[i]);
+						    stl.count--;
+						    while (i < stl.count) {
+							stl.strs[i] =
+								stl.strs[i+1];
+							i++;
+						    }
+						    stl.strs[stl.count] = NULL;
+						    break;
+						}
+					}
+				}
 				if(stl.count == maxverprecips) {
 					initsmtp(&sockfd, relay, smtpport);
 					if(verp) {