]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
prepstdreply: eliminate the temporary prepqstdreply refactor
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 5 Jan 2022 10:22:04 +0000 (11:22 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 5 Jan 2022 10:22:04 +0000 (11:22 +0100)
now every consumer have been converted to handle files relative to the
list directory

include/prepstdreply.h
src/listcontrol.c
src/mlmmj-bounce.c
src/mlmmj-process.c
src/mlmmj-sub.c
src/mlmmj-unsub.c
src/prepstdreply.c
src/send_list.c
tests/mlmmj.c

index 4f58c2e66da70478d27e11fac23c2a3d5de3edfe..fa9d0e7aea179178359750669d55f6045979e6ff 100644 (file)
@@ -62,9 +62,7 @@ void register_originalmail(text *txt, int fd);
 void register_formatted(text *txt, const char *token,
                rewind_function rew, get_function get, void * state);
 char *get_processed_text_line(text *txt, int headers, struct mlmmj_list *list);
-char *prepstdreply(text *txt, struct mlmmj_list *list,
-               const char *from, const char *to, const char *replyto, bool infd);
-struct queuedmail *prepqstdreply(text *txt, struct mlmmj_list *list,
+struct queuedmail *prepstdreply(text *txt, struct mlmmj_list *list,
                const char *from, const char *to, const char *replyto);
 void close_text(text *txt);
 
index d5936def1df3091f7973a3118f9ebadc52c1a759..9b7cdd1da58754679e2f9612c7564a955f3187bc 100644 (file)
@@ -225,7 +225,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list,
                        MY_ASSERT(txt);
                        register_unformatted(txt, "subaddr",
                                        fromemails->emaillist[0]);
-                       q = prepqstdreply(txt, list, "$listowner$",
+                       q = prepstdreply(txt, list, "$listowner$",
                                        fromemails->emaillist[0], NULL);
                        MY_ASSERT(q);
                        close_text(txt);
@@ -272,7 +272,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list,
                        MY_ASSERT(txt);
                        register_unformatted(txt, "subaddr",
                                        fromemails->emaillist[0]);
-                       q = prepqstdreply(txt, list, "$listowner$",
+                       q = prepstdreply(txt, list, "$listowner$",
                                        fromemails->emaillist[0], NULL);
                        MY_ASSERT(q);
                        close_text(txt);
@@ -319,7 +319,7 @@ int listcontrol(struct email_container *fromemails, struct mlmmj_list *list,
                        MY_ASSERT(txt);
                        register_unformatted(txt, "subaddr",
                                        fromemails->emaillist[0]);
-                       q = prepqstdreply(txt, list, "$listowner$",
+                       q = prepstdreply(txt, list, "$listowner$",
                                        fromemails->emaillist[0], NULL);
                        MY_ASSERT(q);
                        close_text(txt);
@@ -795,7 +795,7 @@ permit:
                                fromemails->emaillist[0]);
                txt = open_text(list, "help", NULL, NULL, NULL, "listhelp");
                MY_ASSERT(txt);
-               q = prepqstdreply(txt, list,
+               q = prepstdreply(txt, list,
                                "$listowner$", fromemails->emaillist[0], NULL);
                MY_ASSERT(q);
                close_text(txt);
@@ -816,7 +816,7 @@ permit:
                                fromemails->emaillist[0]);
                txt = open_text(list, "faq", NULL, NULL, NULL, "listfaq");
                MY_ASSERT(txt);
-               q = prepqstdreply(txt, list,
+               q = prepstdreply(txt, list,
                                "$listowner$", fromemails->emaillist[0], NULL);
                MY_ASSERT(q);
                close_text(txt);
index b0f8e52e1582c8aae674bcfa51327f97fc73866b..791feeb884bc16aeb0f0a97ae360f7011a926b04 100644 (file)
@@ -53,6 +53,7 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char
        file_lines_state *fls;
        char *probefile;
        char *myaddr, *from, *a, *queuefilename;
+       struct queuedmail *q;
        int fd;
        time_t t;
 
@@ -76,8 +77,8 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char
        fls = init_truncated_file_lines(addr, 0, ':');
        register_formatted(txt, "bouncenumbers",
                        rewind_file_lines, get_file_line, fls);
-       queuefilename = prepstdreply(txt, list, "$listowner$", myaddr, NULL, false);
-       MY_ASSERT(queuefilename);
+       q = prepstdreply(txt, list, "$listowner$", myaddr, NULL);
+       MY_ASSERT(q);
        close_text(txt);
 
        finish_file_lines(fls);
@@ -98,6 +99,7 @@ static void do_probe(struct mlmmj_list *list, const char *mlmmjsend, const char
 
        free(probefile);
 
+       xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
        execlp(mlmmjsend, mlmmjsend,
                                "-l", "5",
                                "-L", list->dir,
index de41f5c76d7e7c2833a2d646adc5b9aa1ab7310c..ef475556a6edc268dcd5dd43a379f746f803143f 100644 (file)
@@ -173,8 +173,8 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename,
        int fd = open(mailfilename, O_RDONLY);
        register_originalmail(txt, fd);
        close(fd);
-       queuefilename = prepstdreply(txt, list, "$listowner$", to, replyto, false);
-       MY_ASSERT(queuefilename);
+       q = prepstdreply(txt, list, "$listowner$", to, replyto);
+       MY_ASSERT(q);
        close_text(txt);
 
        /* we might need to exec more than one mlmmj-send */
@@ -206,17 +206,20 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename,
                        myq.fd = openat(list->queuefd, myq.name, O_RDONLY);
                        if (send_single_mail(list, &mh, &myq))
                                exit(EXIT_SUCCESS);
-               } else
+               } else {
+                       char *queuefilename;
+                       xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
                        execlp(mlmmjsend, mlmmjsend,
                                        "-l", "2",
                                        "-L", list->dir,
                                        "-F", from,
                                        "-m", queuefilename, (char *)NULL);
+               }
                log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjsend);
                exit(EXIT_FAILURE);
        }
 
-       free(queuefilename);
+       queuedmail_free(q);
 
        /* send mail to poster that the list is moderated */
 
@@ -231,7 +234,7 @@ static void newmoderated(struct mlmmj_list *list, const char *mailfilename,
        int fd2 = open(mailfilename, O_RDONLY);
        register_originalmail(txt, fd2);
        close(fd2);
-       q = prepqstdreply(txt, list, "$listowner$", efromsender, NULL);
+       q = prepstdreply(txt, list, "$listowner$", efromsender, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -458,7 +461,7 @@ send_denymail(struct mlmmj_list *list, const char *cause, const char *subcause,
        if (causestr != NULL)
                register_unformatted(txt, cause, causestr);
        register_originalmail(txt, done->fd);
-       q = prepqstdreply(txt, list, "$listowner$", posteraddr, NULL);
+       q = prepstdreply(txt, list, "$listowner$", posteraddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
        unlinkat(list->queuefd, done->name, 0);
index 059c25e5c6877f7fcd9d26bfc1cdcff476eb6f72..16c86823d84127db42b02df5d3f22ba5915150f4 100644 (file)
@@ -55,7 +55,7 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr,
        int i, fd, status, nosubmodmails = 0;
        text *txt;
        memory_lines_state *mls;
-       char *a = NULL, *queuefilename, *from, *str;
+       char *a = NULL, *from, *str;
        char *modfilename, *mods, *to, *replyto, *moderators = NULL;
        char *cookie, *obstruct;
        const char *modetype;
@@ -156,8 +156,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr,
        register_unformatted(txt, "moderators", "%gatekeepers%"); /* DEPRECATED */
        register_formatted(txt, "gatekeepers",
                        rewind_memory_lines, get_memory_line, mls);
-       queuefilename = prepstdreply(txt, list, "$listowner$", to, replyto, false);
-       MY_ASSERT(queuefilename);
+       q = prepstdreply(txt, list, "$listowner$", to, replyto);
+       MY_ASSERT(q);
        close_text(txt);
        
        /* we might need to exec more than one mlmmj-send */
@@ -179,6 +179,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr,
                        while(pid == -1 && errno == EINTR);
                }
                finish_memory_lines(mls);
+               char *queuefilename;
+               xasprintf(&queuefilename, "%s/queue/%s", list->dir, q->name);
                execl(mlmmjsend, mlmmjsend,
                                "-a",
                                "-l", "4",
@@ -193,7 +195,7 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr,
 
        free(to);
        free(replyto);
-       
+       queuedmail_free(q);
        /* send mail to requester that the list is submod'ed */
 
        xasprintf(&from, "%s%sbounces-help@%s", list->name, list->delim,
@@ -208,8 +210,8 @@ static void moderate_sub(struct mlmmj_list *list, const char *subaddr,
        register_unformatted(txt, "moderators", "%gatekeepers"); /* DEPRECATED */
        register_formatted(txt, "gatekeepers",
                        rewind_memory_lines, get_memory_line, mls);
-       q = prepqstdreply(txt, list, "$listowner$", subaddr, NULL);
-       MY_ASSERT(queuefilename);
+       q = prepstdreply(txt, list, "$listowner$", subaddr, NULL);
+       MY_ASSERT(q);
        close_text(txt);
 
        finish_memory_lines(mls);
@@ -314,7 +316,7 @@ static void confirm_sub(struct mlmmj_list *list, const char *subaddr,
        free(listtext);
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -363,7 +365,7 @@ static void notify_sub(struct mlmmj_list *list, const char *subaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "newsub", subaddr); /* DEPRECATED */
-       q = prepqstdreply(txt, list, "$listowner$", "$listowner$", NULL);
+       q = prepstdreply(txt, list, "$listowner$", "$listowner$", NULL);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -454,7 +456,7 @@ static void generate_subconfirm(struct mlmmj_list *list, const char *subaddr,
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
        register_unformatted(txt, "confirmaddr", confirmaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
        MY_ASSERT(q);
        close_text(txt);
        struct mail_headers mh;
@@ -504,7 +506,7 @@ static void generate_subscribed(struct mlmmj_list *list, const char *subaddr,
                        "sub-subscribed");
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
index 2051686148fb4fc55dda38486b4fcff13cd322a0..b7b5bf1cb31219db2321ea70d842c8673aa5b1d6 100644 (file)
@@ -68,7 +68,7 @@ static void confirm_unsub(struct mlmmj_list *list, const char *subaddr,
        free(listtext);
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -112,7 +112,7 @@ static void notify_unsub(struct mlmmj_list *list, const char *subaddr,
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "oldsub", subaddr); /* DEPRECATED */
-       q = prepqstdreply(txt, list, "$listowner$", "$listowner$", NULL);
+       q = prepstdreply(txt, list, "$listowner$", "$listowner$", NULL);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -196,7 +196,7 @@ static void generate_unsubconfirm(struct mlmmj_list *list, const char *subaddr,
        register_unformatted(txt, "subaddr", subaddr);
        register_unformatted(txt, "confaddr", confirmaddr); /* DEPRECATED */
        register_unformatted(txt, "confirmaddr", confirmaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, confirmaddr);
        MY_ASSERT(q);
        close_text(txt);
 
@@ -247,7 +247,7 @@ static void generate_notsubscribed(struct mlmmj_list *list, const char *subaddr,
                        "unsub-notsubscribed");
        MY_ASSERT(txt);
        register_unformatted(txt, "subaddr", subaddr);
-       q = prepqstdreply(txt, list, "$helpaddr$", subaddr, NULL);
+       q = prepstdreply(txt, list, "$helpaddr$", subaddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
index 2c76bd188cc76897e5d80e21d7a61ef54ce214d4..ec2c55794555f9b9a53757d1bf5899d7f7709306 100644 (file)
@@ -1580,181 +1580,7 @@ void close_text(text *txt)
        free(txt);
 }
 
-
-char *prepstdreply(text *txt, struct mlmmj_list *list,
-                  const char *from, const char *to,
-                  const char *replyto, bool infd)
-{
-       size_t len, i;
-       int outfd;
-       char *tmp;
-       char *retstr = NULL;
-       char *line;
-       char *str;
-       char *headers[10] = { NULL }; /* relies on NULL to flag end */
-
-       do {
-               if (infd) {
-                       if (list->queuefd == -1)
-                               list->queuefd = openat(list->fd, "queue", O_DIRECTORY);
-                       free(retstr);
-                       retstr = random_str();
-                       outfd = openat(list->queuefd, retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
-               } else {
-                       tmp = random_str();
-                       free(retstr);
-                       retstr = concatstr(3, list->dir, "/queue/", tmp);
-                       free(tmp);
-                       outfd = open(retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
-               }
-       } while ((outfd < 0) && (errno == EEXIST));
-       
-       if(outfd < 0) {
-               log_error(LOG_ARGS, "Could not open std mail %s", retstr);
-               free(retstr);
-               free(txt);
-               return NULL;
-       }
-
-       for (i=0; i<6; i++) {
-               tmp = xstrdup("randomN");
-               tmp[6] = '0' + i;
-               str = random_str();
-               register_unformatted(txt, tmp, str);
-               free(tmp);
-               free(str);
-       }
-
-       tmp = substitute(from, list, txt);
-       xasprintf(&headers[0], "From: %s", tmp);
-       free(tmp);
-       tmp = substitute(to, list, txt);
-       xasprintf(&headers[1], "To: %s", tmp);
-       free(tmp);
-       headers[2] = genmsgid(list->fqdn);
-       chomp(headers[2]);
-       headers[3] = gendatestr();
-       chomp(headers[3]);
-       headers[4] = xstrdup("Subject: mlmmj administrivia");
-       headers[5] = xstrdup("MIME-Version: 1.0");
-       headers[6] = xstrdup("Content-Type: text/plain; charset=utf-8");
-       headers[7] = xstrdup("Content-Transfer-Encoding: 8bit");
-
-       if(replyto) {
-               tmp = substitute(replyto, list, txt);
-               xasprintf(&headers[8], "Reply-To: %s", tmp);
-               free(tmp);
-       }
-
-       for(;;) {
-               line = get_processed_text_line(txt, 1, list);
-               if (!line) {
-                       log_error(LOG_ARGS, "No body in listtext");
-                       break;
-               }
-               if (*line == '\0') {
-                       /* end of headers */
-                       free(line);
-                       line = NULL;
-                       break;
-               }
-               if (*line == ' ' || *line == '\t') {
-                       /* line beginning with linear whitespace is a
-                          continuation of previous header line */
-                       if(dprintf(outfd, "%s\n", line) < 0) {
-                               log_error(LOG_ARGS, "Could not write std mail");
-                               free(line);
-                               free(retstr);
-                               retstr = NULL;
-                               goto freeandreturn;
-                       }
-               } else {
-                       tmp = line;
-                       len = 0;
-                       while (*tmp && *tmp != ':') {
-                               tmp++;
-                               len++;
-                       }
-                       if (!*tmp) {
-                               log_error(LOG_ARGS, "No headers or invalid "
-                                               "header in listtext");
-                               break;
-                       }
-                       tmp++;
-                       len++;
-                       /* remove the standard header if one matches */
-                       for (i=0; headers[i] != NULL; i++) {
-                               if (strncasecmp(line, headers[i], len) == 0) {
-                                       free(headers[i]);
-                                       while (headers[i] != NULL) {
-                                               headers[i] = headers[i+1];
-                                               i++;
-                                       }
-                                       break;
-                               }
-                       }
-                       if (strncasecmp(line, "Subject:", len) == 0) {
-                               tmp = unistr_utf8_to_header(tmp);
-                               free(line);
-                               xasprintf(&line, "Subject: %s", tmp);
-                               free(tmp);
-                       }
-                       if(dprintf(outfd, "%s\n", line) < 0) {
-                               log_error(LOG_ARGS, "Could not write std mail");
-                               free(line);
-                               free(retstr);
-                               retstr = NULL;
-                               goto freeandreturn;
-                       }
-               }
-               free(line);
-               line = NULL;
-       }
-
-       for (i=0; headers[i] != NULL; i++) {
-               if(dprintf(outfd, "%s\n", headers[i]) < 0) {
-                       log_error(LOG_ARGS, "Could not write std mail");
-                       if (line)
-                               free(line);
-                       free(retstr);
-                       retstr = NULL;
-                       goto freeandreturn;
-               }
-       }
-
-       /* end the headers */
-       if(dprintf(outfd, "\n") < 0) {
-               log_error(LOG_ARGS, "Could not write std mail");
-               if (line)
-                       free(line);
-               free(retstr);
-               retstr = NULL;
-               goto freeandreturn;
-       }
-
-       if (line == NULL) {
-               line = get_processed_text_line(txt, 0, list);
-       }
-       while(line) {
-                       if(dprintf(outfd, "%s\n", line) < 0) {
-                               free(str);
-                               log_error(LOG_ARGS, "Could not write std mail");
-                               free(retstr);
-                               retstr = NULL;
-                               goto freeandreturn;
-                       }
-               free(line);
-               line = get_processed_text_line(txt, 0, list);
-       }
-
-       fsync(outfd);
-       close(outfd);
-
-freeandreturn:
-       return retstr;
-}
-
-struct queuedmail *prepqstdreply(text *txt, struct mlmmj_list *list,
+struct queuedmail *prepstdreply(text *txt, struct mlmmj_list *list,
                   const char *from, const char *to,
                   const char *replyto)
 {
index 315852747b1f82391154f158c06110822eb0a0b4..9d08af2a969a5d4a843c0a7276c7c28d509d11a7 100644 (file)
@@ -185,7 +185,7 @@ void send_list(struct mlmmj_list *list, const char *emailaddr)
                        rewind_subs_list, get_sub, digestsls);
        register_formatted(txt, "nomailsubs",
                        rewind_subs_list, get_sub, nomailsls);
-       q = prepqstdreply(txt, list, "$listowner$", emailaddr, NULL);
+       q = prepstdreply(txt, list, "$listowner$", emailaddr, NULL);
        MY_ASSERT(q);
        close_text(txt);
 
index a2d6710a53c15f03e9d619c1d4a9eebd49343222..b69bbc63ef40b8dde25e2eb6b71ccd38b5288b17 100644 (file)
@@ -260,7 +260,7 @@ ATF_TC_BODY(open_text, tc)
        text *txt = open_text(&list, "finish", "sub", "request", "normal", "sub-confirm");
        ATF_CHECK(txt != NULL);
        register_unformatted(txt, "subaddr", "john@doe.net");
-       struct queuedmail *q = prepqstdreply(txt, &list, "$helpaddr$", "john@doe.net", NULL);
+       struct queuedmail *q = prepstdreply(txt, &list, "$helpaddr$", "john@doe.net", NULL);
        xasprintf(&qname, "%s/queue/%s", list.dir, q->name);
        if (!atf_utils_grep_file("^To: john@doe.net", qname) ||
            !atf_utils_grep_file("^The email address .*john@doe.net.*", qname) ||