# HG changeset patch # User Ben Schmidt # Date 1280498096 -36000 # Node ID 4575d3181ca14e77498f8e8012731d5e90bd4e7a # Parent 7d4efc26d03ac721b874e632f08d5b020ced92ed Added notmetoo feature where posts are not mirrored to their senders. diff -r 7d4efc26d03a -r 4575d3181ca1 ChangeLog --- 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) diff -r 7d4efc26d03a -r 4575d3181ca1 TUNABLES --- 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. + diff -r 7d4efc26d03a -r 4575d3181ca1 contrib/web/perl-admin/conf/tunables.pl --- 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."); + diff -r 7d4efc26d03a -r 4575d3181ca1 contrib/web/php-admin/conf/tunables.pl --- 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."); + diff -r 7d4efc26d03a -r 4575d3181ca1 contrib/web/php-moderation/mlmmj-moderation.php --- 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]."
"; 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"); + } } } } diff -r 7d4efc26d03a -r 4575d3181ca1 man/mlmmj-send.1 --- 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 diff -r 7d4efc26d03a -r 4575d3181ca1 src/listcontrol.c --- 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); diff -r 7d4efc26d03a -r 4575d3181ca1 src/mlmmj-process.c --- 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); diff -r 7d4efc26d03a -r 4575d3181ca1 src/mlmmj-send.c --- 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) {