comparison src/mlmmj-process.c @ 744:926f184eec44

Add a $subject$ substitution for list texts
author Ben Schmidt
date Mon, 20 Sep 2010 02:25:54 +1000
parents b72bcb7e08a2
children dfc9ab125fd4
comparison
equal deleted inserted replaced
743:c2ffbdcf3be5 744:926f184eec44
50 #include "prepstdreply.h" 50 #include "prepstdreply.h"
51 #include "subscriberfuncs.h" 51 #include "subscriberfuncs.h"
52 #include "memory.h" 52 #include "memory.h"
53 #include "log_oper.h" 53 #include "log_oper.h"
54 #include "chomp.h" 54 #include "chomp.h"
55 #include "unistr.h"
55 56
56 enum action { 57 enum action {
57 ALLOW, 58 ALLOW,
58 SEND, 59 SEND,
59 DENY, 60 DENY,
69 "discarded" 70 "discarded"
70 }; 71 };
71 72
72 73
73 void newmoderated(const char *listdir, const char *mailfilename, 74 void newmoderated(const char *listdir, const char *mailfilename,
74 const char *mlmmjsend, const char *efromsender) 75 const char *mlmmjsend, const char *efromsender,
76 size_t tokencount, char **data)
75 { 77 {
78 size_t i;
76 char *from, *listfqdn, *listname, *moderators = NULL; 79 char *from, *listfqdn, *listname, *moderators = NULL;
77 char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim; 80 char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim;
78 char *queuefilename = NULL, *moderatorsfilename, *efromismod = NULL; 81 char *queuefilename = NULL, *moderatorsfilename, *efromismod = NULL;
79 char *mailbasename = mybasename(mailfilename), *tmp, *to; 82 char *mailbasename = mybasename(mailfilename), *tmp, *to;
80 int moderatorsfd, foundaddr = 0, notifymod = 0, status; 83 int moderatorsfd, foundaddr = 0, notifymod = 0, status;
81 char *maildata[4] = { "moderateaddr", NULL, "moderators", NULL }; 84 char *maildata[10] = { "moderateaddr", NULL, "moderators", NULL };
82 pid_t childpid, pid; 85 pid_t childpid, pid;
83 #if 0 86 #if 0
84 printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename, 87 printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename,
85 mailbasename); 88 mailbasename);
86 #endif 89 #endif
87 listfqdn = genlistfqdn(listaddr); 90 listfqdn = genlistfqdn(listaddr);
88 listname = genlistname(listaddr); 91 listname = genlistname(listaddr);
89 92
93 MY_ASSERT(tokencount<=3)
94 for (i=0; i<tokencount; i++) {
95 maildata[4+2*i] = data[2*i];
96 maildata[5+2*i] = data[1+2*i];
97 }
98 tokencount += 2;
99
90 moderatorsfilename = concatstr(2, listdir, "/control/moderators"); 100 moderatorsfilename = concatstr(2, listdir, "/control/moderators");
91 if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) { 101 if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
92 log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename); 102 log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
93 myfree(moderatorsfilename); 103 myfree(moderatorsfilename);
94 exit(EXIT_FAILURE); 104 exit(EXIT_FAILURE);
131 myfree(listdelim); 141 myfree(listdelim);
132 myfree(listname); 142 myfree(listname);
133 myfree(listfqdn); 143 myfree(listfqdn);
134 144
135 queuefilename = prepstdreply(listdir, "moderation", "$listowner$", 145 queuefilename = prepstdreply(listdir, "moderation", "$listowner$",
136 to, replyto, 2, maildata, 146 to, replyto, tokencount, maildata,
137 mailfilename); 147 mailfilename);
138 148
139 /* we might need to exec more than one mlmmj-send */ 149 /* we might need to exec more than one mlmmj-send */
140 150
141 notifymod = !efromismod && statctrl(listdir,"notifymod"); 151 notifymod = !efromismod && statctrl(listdir,"notifymod");
174 184
175 /* send mail to poster that the list is moderated */ 185 /* send mail to poster that the list is moderated */
176 186
177 queuefilename = prepstdreply(listdir, "moderation-poster", 187 queuefilename = prepstdreply(listdir, "moderation-poster",
178 "$listowner$", efromsender, 188 "$listowner$", efromsender,
179 NULL, 1, maildata+2, mailfilename); 189 NULL, tokencount-1, maildata+2, mailfilename);
180 190
181 execlp(mlmmjsend, mlmmjsend, 191 execlp(mlmmjsend, mlmmjsend,
182 "-l", "1", 192 "-l", "1",
183 "-L", listdir, 193 "-L", listdir,
184 "-F", from, 194 "-F", from,
383 char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce; 393 char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
384 char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim; 394 char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim;
385 char *listfqdn, *listname, *fromaddr; 395 char *listfqdn, *listname, *fromaddr;
386 char *queuefilename, *recipextra = NULL, *owner = NULL; 396 char *queuefilename, *recipextra = NULL, *owner = NULL;
387 char *maxmailsizestr; 397 char *maxmailsizestr;
388 char *maildata[4] = { "posteraddr", NULL, "maxmailsize", NULL }; 398 char *maildata[6] = { "subject", NULL,
399 "posteraddr", NULL, "maxmailsize", NULL };
389 char *envstr, *efrom; 400 char *envstr, *efrom;
390 struct stat st; 401 struct stat st;
391 uid_t uid; 402 uid_t uid;
392 struct email_container fromemails = { 0, NULL }; 403 struct email_container fromemails = { 0, NULL };
393 struct email_container toemails = { 0, NULL }; 404 struct email_container toemails = { 0, NULL };
402 { "From:", 0, NULL }, 413 { "From:", 0, NULL },
403 { "To:", 0, NULL }, 414 { "To:", 0, NULL },
404 { "Cc:", 0, NULL }, 415 { "Cc:", 0, NULL },
405 { "Return-Path:", 0, NULL }, 416 { "Return-Path:", 0, NULL },
406 { "Delivered-To:", 0, NULL }, 417 { "Delivered-To:", 0, NULL },
418 { "Subject:", 0, NULL },
407 { NULL, 0, NULL } 419 { NULL, 0, NULL }
408 }; 420 };
409 421
410 CHECKFULLPATH(argv[0]); 422 CHECKFULLPATH(argv[0]);
411 423
536 548
537 /* From: addresses */ 549 /* From: addresses */
538 for(i = 0; i < readhdrs[0].valuecount; i++) { 550 for(i = 0; i < readhdrs[0].valuecount; i++) {
539 find_email_adr(readhdrs[0].values[i], &fromemails); 551 find_email_adr(readhdrs[0].values[i], &fromemails);
540 } 552 }
553 if (fromemails.emailcount)
554 maildata[3] = fromemails.emaillist[0];
541 555
542 /* To: addresses */ 556 /* To: addresses */
543 for(i = 0; i < readhdrs[1].valuecount; i++) { 557 for(i = 0; i < readhdrs[1].valuecount; i++) {
544 find_email_adr(readhdrs[1].values[i], &toemails); 558 find_email_adr(readhdrs[1].values[i], &toemails);
545 } 559 }
556 570
557 /* Delivered-To: addresses */ 571 /* Delivered-To: addresses */
558 for(i = 0; i < readhdrs[4].valuecount; i++) { 572 for(i = 0; i < readhdrs[4].valuecount; i++) {
559 find_email_adr(readhdrs[4].values[i], &dtemails); 573 find_email_adr(readhdrs[4].values[i], &dtemails);
560 } 574 }
575
576 /* Subject: */
577 if (readhdrs[5].valuecount)
578 maildata[1] = unistr_header_to_utf8(readhdrs[5].values[0]);
579 if (!maildata[1])
580 maildata[1] = mystrdup("");
561 581
562 /* envelope from */ 582 /* envelope from */
563 if((envstr = getenv("SENDER")) != NULL) { 583 if((envstr = getenv("SENDER")) != NULL) {
564 /* qmail, postfix, exim */ 584 /* qmail, postfix, exim */
565 efrom = mystrdup(envstr); 585 efrom = mystrdup(envstr);
633 exit(EXIT_FAILURE); 653 exit(EXIT_FAILURE);
634 } 654 }
635 close(rawmailfd); 655 close(rawmailfd);
636 close(donemailfd); 656 close(donemailfd);
637 unlink(mailfile); 657 unlink(mailfile);
638 log_oper(listdir, OPLOGFNAME, "mlmmj-recieve: sending" 658 log_oper(listdir, OPLOGFNAME, "mlmmj-process: sending"
639 " mail from %s to owner", 659 " mail from %s to owner",
640 efrom); 660 efrom);
641 execlp(mlmmjsend, mlmmjsend, 661 execlp(mlmmjsend, mlmmjsend,
642 "-l", "4", 662 "-l", "4",
643 "-L", listdir, 663 "-L", listdir,
690 listdelim = getlistdelim(listdir); 710 listdelim = getlistdelim(listdir);
691 listname = genlistname(listaddr); 711 listname = genlistname(listaddr);
692 listfqdn = genlistfqdn(listaddr); 712 listfqdn = genlistfqdn(listaddr);
693 fromaddr = concatstr(4, listname, listdelim, 713 fromaddr = concatstr(4, listname, listdelim,
694 "bounces-help@", listfqdn); 714 "bounces-help@", listfqdn);
695 maildata[3] = maxmailsizestr; 715 maildata[5] = maxmailsizestr;
696 queuefilename = prepstdreply(listdir, 716 queuefilename = prepstdreply(listdir,
697 "maxmailsize", "$listowner$", 717 "maxmailsize", "$listowner$",
698 fromemails.emaillist[0], 718 fromemails.emaillist[0],
699 NULL, 1, maildata+2, donemailname); 719 NULL, 1, maildata+4, donemailname);
700 MY_ASSERT(queuefilename) 720 MY_ASSERT(queuefilename)
701 myfree(listdelim); 721 myfree(listdelim);
702 myfree(listname); 722 myfree(listname);
703 myfree(listfqdn); 723 myfree(listfqdn);
704 unlink(donemailname); 724 unlink(donemailname);
809 listfqdn = genlistfqdn(listaddr); 829 listfqdn = genlistfqdn(listaddr);
810 fromaddr = concatstr(4, listname, listdelim, "bounces-help@", 830 fromaddr = concatstr(4, listname, listdelim, "bounces-help@",
811 listfqdn); 831 listfqdn);
812 queuefilename = prepstdreply(listdir, "notintocc", 832 queuefilename = prepstdreply(listdir, "notintocc",
813 "$listowner$", fromemails.emaillist[0], 833 "$listowner$", fromemails.emaillist[0],
814 NULL, 0, NULL, donemailname); 834 NULL, 2, maildata, donemailname);
815 MY_ASSERT(queuefilename) 835 MY_ASSERT(queuefilename)
816 myfree(listdelim); 836 myfree(listdelim);
817 myfree(listname); 837 myfree(listname);
818 myfree(listfqdn); 838 myfree(listfqdn);
819 unlink(donemailname); 839 unlink(donemailname);
865 exit(EXIT_SUCCESS); 885 exit(EXIT_SUCCESS);
866 } 886 }
867 listdelim = getlistdelim(listdir); 887 listdelim = getlistdelim(listdir);
868 listname = genlistname(listaddr); 888 listname = genlistname(listaddr);
869 listfqdn = genlistfqdn(listaddr); 889 listfqdn = genlistfqdn(listaddr);
870 maildata[1] = fromemails.emaillist[0];
871 fromaddr = concatstr(4, listname, listdelim, 890 fromaddr = concatstr(4, listname, listdelim,
872 "bounces-help@", listfqdn); 891 "bounces-help@", listfqdn);
873 queuefilename = prepstdreply(listdir, "subonlypost", 892 queuefilename = prepstdreply(listdir, "subonlypost",
874 "$listowner$", fromemails.emaillist[0], 893 "$listowner$", fromemails.emaillist[0],
875 NULL, 1, maildata, donemailname); 894 NULL, 2, maildata, donemailname);
876 MY_ASSERT(queuefilename) 895 MY_ASSERT(queuefilename)
877 myfree(listaddr); 896 myfree(listaddr);
878 myfree(listdelim); 897 myfree(listdelim);
879 myfree(listname); 898 myfree(listname);
880 myfree(listfqdn); 899 myfree(listfqdn);
925 fromaddr = concatstr(4, listname, listdelim, 944 fromaddr = concatstr(4, listname, listdelim,
926 "bounces-help@", listfqdn); 945 "bounces-help@", listfqdn);
927 queuefilename = prepstdreply(listdir, "access", 946 queuefilename = prepstdreply(listdir, "access",
928 "$listowner$", 947 "$listowner$",
929 fromemails.emaillist[0], 948 fromemails.emaillist[0],
930 NULL, 0, NULL, donemailname); 949 NULL, 2, maildata, donemailname);
931 MY_ASSERT(queuefilename) 950 MY_ASSERT(queuefilename)
932 myfree(listaddr); 951 myfree(listaddr);
933 myfree(listdelim); 952 myfree(listdelim);
934 myfree(listname); 953 myfree(listname);
935 myfree(listfqdn); 954 myfree(listfqdn);
1002 exit(EXIT_FAILURE); 1021 exit(EXIT_FAILURE);
1003 } 1022 }
1004 fsync(omitfd); 1023 fsync(omitfd);
1005 close(omitfd); 1024 close(omitfd);
1006 } 1025 }
1007 newmoderated(listdir, mqueuename, mlmmjsend, efrom); 1026 newmoderated(listdir, mqueuename, mlmmjsend, efrom, 2, maildata);
1008 return EXIT_SUCCESS; 1027 return EXIT_SUCCESS;
1009 } 1028 }
1010 1029
1011 myfree(randomstr); 1030 myfree(randomstr);
1012 1031