Mercurial > hg > mlmmj
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 |