From: mmj Date: Mon, 14 Jun 2004 14:56:47 +0000 (+1000) Subject: Add functionality for subscribers only posting and to only allow posts with X-Git-Tag: RELEASE_1_0_0~108 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=018247b68e4adc572cc13c4cc4e9762511b8ab79;p=thirdparty%2Fmlmmj.git Add functionality for subscribers only posting and to only allow posts with listaddress in To: or Cc: --- diff --git a/src/Makefile.am b/src/Makefile.am index a55a4304..75c43b27 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,7 +25,8 @@ mlmmj_process_SOURCES = mlmmj-process.c writen.c find_email_adr.c \ mylocking.c listcontrol.c random-int.c strgen.c \ print-version.c send_help.c prepstdreply.c \ do_all_the_voodo_here.c mygetline.c gethdrline.c \ - log_error.c statctrl.c ctrlvalue.c dumpfd2fd.c + log_error.c statctrl.c ctrlvalue.c dumpfd2fd.c \ + subscriberfuncs.c mlmmj_sub_SOURCES = mlmmj-sub.c writen.c mylocking.c \ getlistaddr.c chomp.c random-int.c strgen.c \ diff --git a/src/mlmmj-process.c b/src/mlmmj-process.c index 9bf642f0..b9d4650d 100644 --- a/src/mlmmj-process.c +++ b/src/mlmmj-process.c @@ -28,6 +28,9 @@ #include "mygetline.h" #include "statctrl.h" #include "ctrlvalue.h" +#include "getlistaddr.h" +#include "prepstdreply.h" +#include "subscriberfuncs.h" void newmoderated(const char *listdir, const char *mailfilename, const char *mlmmjsend) @@ -164,11 +167,15 @@ int main(int argc, char **argv) { int i, fd, opt, noprocess = 0, moderated = 0; int hdrfd, footfd, rawmailfd, donemailfd; + int subonlypost = 0, addrtocc = 1, intocc = 0; char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL; char *footerfilename = NULL, *donemailname = NULL; char *randomstr = random_str(), *mqueuename; char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce; - char *bindir, *subjectprefix, *discardname; + char *bindir, *subjectprefix, *discardname, *listaddr; + char *listfqdn, *listname, *fromaddr, *fromstr, *subject; + char *queuefilename; + char *maildata[4]; struct email_container fromemails = { 0, NULL }; struct email_container toemails = { 0, NULL }; struct email_container ccemails = { 0, NULL }; @@ -290,8 +297,8 @@ int main(int argc, char **argv) } if(readhdrs[2].token) { /* Cc: addresses */ - for(i = 0; i < readhdrs[1].valuecount; i++) { - find_email_adr(readhdrs[1].values[i], &ccemails); + for(i = 0; i < readhdrs[2].valuecount; i++) { + find_email_adr(readhdrs[2].values[i], &ccemails); } } if(strchr(toemails.emaillist[0], RECIPDELIM)) { @@ -303,11 +310,77 @@ int main(int argc, char **argv) donemailname); return EXIT_SUCCESS; } -#if 0 - for(i = 0; i < toemails.emailcount; i++) { - if(strncmp(listaddr, toemails.emaillist[i], - strlen(toemails.emaillist[i])) -#endif + + listaddr = getlistaddr(listdir); + + addrtocc = !(statctrl(listdir, "tocc")); + if(addrtocc) { + for(i = 0; i < toemails.emailcount; i++) + if(strcmp(listaddr, toemails.emaillist[i]) == NULL) + intocc = 1; + for(i = 0; i < ccemails.emailcount; i++) + if(strcmp(listaddr, ccemails.emaillist[i]) == NULL) + intocc = 1; + } + + if(addrtocc && !intocc) { + listname = genlistname(listaddr); + listfqdn = genlistfqdn(listaddr); + maildata[0] = "*LSTADDR*"; + maildata[1] = listaddr; + fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn); + fromstr = concatstr(3, listname, "+owner@", listfqdn); + subject = concatstr(3, "Post to ", listaddr, " denied."); + queuefilename = prepstdreply(listdir, "notintocc", fromstr, + fromemails.emaillist[0], NULL, + subject, 1, maildata); + free(listaddr); + free(listname); + free(listfqdn); + free(fromstr); + free(subject); + execlp(mlmmjsend, mlmmjsend, + "-l", "1", + "-T", fromemails.emaillist[0], + "-F", fromaddr, + "-m", queuefilename, 0); + + log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjsend); + exit(EXIT_FAILURE); + } + + subonlypost = statctrl(listdir, "subonlypost"); + if(subonlypost) { + if(is_subbed(listdir, fromemails.emaillist[0]) != 0) { + listname = genlistname(listaddr); + listfqdn = genlistfqdn(listaddr); + maildata[0] = "*LSTADDR*"; + maildata[1] = listaddr; + maildata[2] = "*POSTERADDR*"; + maildata[3] = fromemails.emaillist[0]; + fromaddr = concatstr(3, listname, "+bounces-help@", + listfqdn); + fromstr = concatstr(3, listname, "+owner@", listfqdn); + subject = concatstr(3, "Post to ", listaddr, + " denied"); + queuefilename = prepstdreply(listdir, "subonlypost", + fromstr, fromemails.emaillist[0], NULL, + subject, 2, maildata); + free(listaddr); + free(listname); + free(listfqdn); + free(fromstr); + free(subject); + execlp(mlmmjsend, mlmmjsend, + "-l", "1", + "-T", fromemails.emaillist[0], + "-F", fromaddr, + "-m", queuefilename, 0); + + log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjsend); + exit(EXIT_FAILURE); + } + } moderated = statctrl(listdir, "moderated");