# HG changeset patch # User mortenp # Date 1194297817 -39600 # Node ID c26e97a2207b9227358660e93433fc6ad2bc7551 # Parent dcf36865330f00dfb42d7088c8dd5b0671c5a0f7 Added support for the 'originalmail' keyword (Sascha Sommer) diff -r dcf36865330f -r c26e97a2207b ChangeLog --- a/ChangeLog Thu Sep 27 17:49:57 2007 +1000 +++ b/ChangeLog Tue Nov 06 08:23:37 2007 +1100 @@ -1,3 +1,4 @@ + o Added support for the 'originalmail' keyword (Sascha Sommer) o Merged various changes to the web interface from Franky Van Liedekerke 1.2.15-RC1 o Added --enable-recieve-strip configure option (Ansgar Burchardt) diff -r dcf36865330f -r c26e97a2207b include/prepstdreply.h --- a/include/prepstdreply.h Thu Sep 27 17:49:57 2007 +1000 +++ b/include/prepstdreply.h Tue Nov 06 08:23:37 2007 +1100 @@ -25,12 +25,13 @@ #define PREPSTDREPLY_H char *substitute(const char *line, const char *listaddr, const char *listdelim, - size_t datacount, char **data); + size_t datacount, char **data, const char* mailname); char *substitute_one(const char *line, const char *listaddr, - const char *listdelim, size_t datacount, char **data); + const char *listdelim, size_t datacount, char **data, + const char* mailname); int open_listtext(const char *listdir, const char *filename); char *prepstdreply(const char *listdir, const char *filename, const char *from, const char *to, const char *replyto, size_t tokencount, - char **data, char *customheaders); + char **data, char *customheaders, const char *mailname); #endif /* PREPSTDREPLY_H */ diff -r dcf36865330f -r c26e97a2207b src/mlmmj-bounce.c --- a/src/mlmmj-bounce.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/mlmmj-bounce.c Tue Nov 06 08:23:37 2007 +1100 @@ -139,7 +139,7 @@ maildata[1] = indexstr; queuefilename = prepstdreply(listdir, "bounce-probe", "$listowner$", - myaddr, NULL, 1, maildata, NULL); + myaddr, NULL, 1, maildata, NULL, NULL); MY_ASSERT(queuefilename); myfree(indexstr); diff -r dcf36865330f -r c26e97a2207b src/mlmmj-process.c --- a/src/mlmmj-process.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/mlmmj-process.c Tue Nov 06 08:23:37 2007 +1100 @@ -76,8 +76,7 @@ char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim; char *queuefilename = NULL, *moderatorsfilename; char *mailbasename = mybasename(mailfilename), *tmp, *to; - int queuefd, moderatorsfd, mailfd; - size_t count = 0; + int moderatorsfd; char *maildata[4] = { "moderateaddr", NULL, "moderators", NULL }; #if 0 printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename, @@ -86,11 +85,6 @@ listfqdn = genlistfqdn(listaddr); listname = genlistname(listaddr); - if((mailfd = open(mailfilename, O_RDONLY)) < 0) { - log_error(LOG_ARGS, "Could not open '%s'", mailfilename); - exit(EXIT_FAILURE); - } - moderatorsfilename = concatstr(2, listdir, "/control/moderators"); if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) { log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename); @@ -123,25 +117,7 @@ myfree(listfqdn); queuefilename = prepstdreply(listdir, "moderation", "$listowner$", - to, replyto, 2, maildata, NULL); - - if((queuefd = open(queuefilename, O_WRONLY|O_APPEND)) < 0) { - log_error(LOG_ARGS, "Could not open '%s'", queuefilename); - myfree(queuefilename); - exit(EXIT_FAILURE); - } - - while(count < 100 && (buf = mygetline(mailfd))) { - tmp = concatstr(2, " ", buf); - myfree(buf); - if(writen(queuefd, tmp, strlen(tmp)) < 0) - log_error(LOG_ARGS, "Could not write line for " - "moderatemail"); - myfree(tmp); - count++; - } - close(queuefd); - close(mailfd); + to, replyto, 2, maildata, NULL, mailfilename); execlp(mlmmjsend, mlmmjsend, "-l", "2", @@ -657,7 +633,7 @@ queuefilename = prepstdreply(listdir, "maxmailsize", "$listowner$", fromemails.emaillist[0], - NULL, 2, maildata, NULL); + NULL, 2, maildata, NULL, donemailname); MY_ASSERT(queuefilename) myfree(listdelim); myfree(listname); @@ -768,7 +744,7 @@ listfqdn); queuefilename = prepstdreply(listdir, "notintocc", "$listowner$", fromemails.emaillist[0], - NULL, 0, NULL, NULL); + NULL, 0, NULL, NULL, donemailname); MY_ASSERT(queuefilename) myfree(listdelim); myfree(listname); @@ -829,7 +805,7 @@ "bounces-help@", listfqdn); queuefilename = prepstdreply(listdir, "subonlypost", "$listowner$", fromemails.emaillist[0], - NULL, 1, maildata, NULL); + NULL, 1, maildata, NULL, donemailname); MY_ASSERT(queuefilename) myfree(listaddr); myfree(listdelim); @@ -880,7 +856,7 @@ queuefilename = prepstdreply(listdir, "access", "$listowner$", fromemails.emaillist[0], - NULL, 0, NULL, NULL); + NULL, 0, NULL, NULL, donemailname); MY_ASSERT(queuefilename) myfree(listaddr); myfree(listdelim); diff -r dcf36865330f -r c26e97a2207b src/mlmmj-sub.c --- a/src/mlmmj-sub.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/mlmmj-sub.c Tue Nov 06 08:23:37 2007 +1100 @@ -147,7 +147,7 @@ maildata[5] = moderators; queuefilename = prepstdreply(listdir, "submod-moderator", - "$listowner$", to, replyto, 3, maildata, NULL); + "$listowner$", to, replyto, 3, maildata, NULL, NULL); myfree(maildata[1]); @@ -181,7 +181,7 @@ from = concatstr(4, listname, listdelim, "bounces-help@", listfqdn); queuefilename = prepstdreply(listdir, "submod-requester", "$listowner$", - subaddr, NULL, 0, NULL, NULL); + subaddr, NULL, 0, NULL, NULL, NULL); myfree(listname); myfree(listfqdn); @@ -274,7 +274,7 @@ } queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", - subaddr, NULL, 0, NULL, NULL); + subaddr, NULL, 0, NULL, NULL, NULL); MY_ASSERT(queuefilename); myfree(listtext); @@ -321,7 +321,7 @@ } queuefilename = prepstdreply(listdir, listtext, "$listowner$", - "$listowner$", NULL, 1, maildata, NULL); + "$listowner$", NULL, 1, maildata, NULL, NULL); MY_ASSERT(queuefilename) myfree(listtext); myfree(maildata[1]); @@ -408,7 +408,7 @@ maildata[3] = mystrdup(confirmaddr); queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", subaddr, - confirmaddr, 2, maildata, NULL); + confirmaddr, 2, maildata, NULL, NULL); myfree(maildata[1]); myfree(maildata[3]); @@ -460,7 +460,7 @@ myfree(listdelim); queuefilename = prepstdreply(listdir, "sub-subscribed", "$helpaddr$", - subaddr, NULL, 0, NULL, NULL); + subaddr, NULL, 0, NULL, NULL, NULL); MY_ASSERT(queuefilename); myfree(listaddr); diff -r dcf36865330f -r c26e97a2207b src/mlmmj-unsub.c --- a/src/mlmmj-unsub.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/mlmmj-unsub.c Tue Nov 06 08:23:37 2007 +1100 @@ -76,7 +76,7 @@ } queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", - subaddr, NULL, 0, NULL, NULL); + subaddr, NULL, 0, NULL, NULL, NULL); MY_ASSERT(queuefilename); myfree(listtext); @@ -124,7 +124,7 @@ } queuefilename = prepstdreply(listdir, listtext, "$listowner$", - "$listowner$", NULL, 1, maildata, NULL); + "$listowner$", NULL, 1, maildata, NULL, NULL); MY_ASSERT(queuefilename); myfree(listtext); myfree(maildata[1]); @@ -213,7 +213,7 @@ maildata[3] = mystrdup(confirmaddr); queuefilename = prepstdreply(listdir, listtext, "$helpaddr$", subaddr, - confirmaddr, 2, maildata, NULL); + confirmaddr, 2, maildata, NULL, NULL); myfree(maildata[1]); myfree(maildata[3]); @@ -305,7 +305,7 @@ myfree(listdelim); queuefilename = prepstdreply(listdir, "unsub-notsubscribed", - "$helpaddr$", subaddr, NULL, 0, NULL, NULL); + "$helpaddr$", subaddr, NULL, 0, NULL, NULL, NULL); MY_ASSERT(queuefilename); myfree(listaddr); diff -r dcf36865330f -r c26e97a2207b src/prepstdreply.c --- a/src/prepstdreply.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/prepstdreply.c Tue Nov 06 08:23:37 2007 +1100 @@ -44,13 +44,13 @@ #include "unistr.h" char *substitute(const char *line, const char *listaddr, const char *listdelim, - size_t datacount, char **data) + size_t datacount, char **data, const char *mailname) { char *s1, *s2; - s1 = substitute_one(line, listaddr, listdelim, datacount, data); + s1 = substitute_one(line, listaddr, listdelim, datacount, data, mailname); while(s1) { - s2 = substitute_one(s1, listaddr, listdelim, datacount, data); + s2 = substitute_one(s1, listaddr, listdelim, datacount, data, mailname); if(s2) { myfree(s1); s1 = s2; @@ -62,7 +62,8 @@ } char *substitute_one(const char *line, const char *listaddr, - const char *listdelim, size_t datacount, char **data) + const char *listdelim, size_t datacount, char **data, + const char* mailname) { char *fqdn, *listname, *d1, *d2, *token, *value = NULL; char *retstr, *origline; @@ -132,6 +133,27 @@ value = concatstr(4, listname, listdelim, "subscribe-nomail@", fqdn); goto concatandreturn; + } else if(strcmp(token, "originalmail") == 0) { + /* append the first 100 lines of the mail inline */ + int mailfd; + if(mailname && + ((mailfd = open(mailname, O_RDONLY)) > 0)){ + size_t count = 0; + char* str = NULL; + while(count < 100 && (str = mygetline(mailfd))) { + char* tmp = value; + value = concatstr(3, value, " ", str); + if(tmp) + myfree(tmp); + count++; + } + if(str) + myfree(str); + close(mailfd); + }else{ + log_error(LOG_ARGS, "Could not substitute $originalmail$ (mailname == %s)",mailname); + } + goto concatandreturn; } if(data) { for(i = 0; i < datacount; i++) { @@ -187,7 +209,7 @@ char *prepstdreply(const char *listdir, const char *filename, const char *from, const char *to, const char *replyto, size_t tokencount, - char **data, char *customheaders) + char **data, char *customheaders, const char *mailname) { int infd, outfd; char *listaddr, *listdelim, *myfrom, *tmp, *subject, *retstr = NULL; @@ -211,7 +233,7 @@ chomp(line); utfsub = unistr_escaped_to_utf8(line + 9); utfsub2 = substitute(utfsub, listaddr, listdelim, tokencount, - data); + data, NULL); subject = unistr_utf8_to_header(utfsub2); myfree(utfsub); myfree(utfsub2); @@ -231,14 +253,14 @@ utfline = NULL; } - myfrom = substitute(from, listaddr, listdelim, tokencount, data); - myto = substitute(to, listaddr, listdelim, tokencount, data); + myfrom = substitute(from, listaddr, listdelim, tokencount, data, NULL); + myto = substitute(to, listaddr, listdelim, tokencount, data, NULL); mydate = gendatestr(); mymsgid = genmsgid(listfqdn); if(replyto) { myreplyto = substitute(replyto, listaddr, listdelim, - tokencount, data); + tokencount, data, NULL); tmp = concatstr(3, "Reply-To: ", myreplyto, "\n"); myfree(myreplyto); myreplyto = tmp; @@ -297,7 +319,7 @@ myfree(tmp); tmp = utfline; - str = substitute(utfline, listaddr, listdelim, tokencount, data); + str = substitute(utfline, listaddr, listdelim, tokencount, data, mailname); myfree(tmp); if(writen(outfd, str, strlen(str)) < 0) { diff -r dcf36865330f -r c26e97a2207b src/send_digest.c --- a/src/send_digest.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/send_digest.c Tue Nov 06 08:23:37 2007 +1100 @@ -263,7 +263,7 @@ utfsub = unistr_escaped_to_utf8(line + 9); } - utfsub2 = substitute(utfsub, listaddr, listdelim, 5, subst_data); + utfsub2 = substitute(utfsub, listaddr, listdelim, 5, subst_data, NULL); subject = unistr_utf8_to_header(utfsub2); myfree(utfsub); myfree(utfsub2); @@ -362,7 +362,7 @@ myfree(line); tmp = substitute(utfline, listaddr, listdelim, - 5, subst_data); + 5, subst_data, NULL); myfree(utfline); if(writen(fd, tmp, strlen(tmp)) < 0) { diff -r dcf36865330f -r c26e97a2207b src/send_help.c --- a/src/send_help.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/send_help.c Tue Nov 06 08:23:37 2007 +1100 @@ -57,7 +57,7 @@ myfree(listdelim); queuefilename = prepstdreply(listdir, textfile, "$listowner$", - emailaddr, NULL, 0, NULL, NULL); + emailaddr, NULL, 0, NULL, NULL, NULL); if(queuefilename == NULL) { log_error(LOG_ARGS, "Could not prepare %s mail", name); exit(EXIT_FAILURE); diff -r dcf36865330f -r c26e97a2207b src/send_list.c --- a/src/send_list.c Thu Sep 27 17:49:57 2007 +1000 +++ b/src/send_list.c Tue Nov 06 08:23:37 2007 +1100 @@ -61,7 +61,7 @@ myfree(listdelim); queuefilename = prepstdreply(listdir, "listsubs", "$listowner$", - emailaddr, NULL, 0, NULL, NULL); + emailaddr, NULL, 0, NULL, NULL, NULL); if(queuefilename == NULL) { log_error(LOG_ARGS, "Could not prepare sub list mail"); exit(EXIT_FAILURE);