]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
generate_scubscription: deduplicate and test code
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 15 Feb 2023 13:13:24 +0000 (14:13 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 15 Feb 2023 13:13:24 +0000 (14:13 +0100)
include/subscriberfuncs.h
src/mlmmj-sub.c
src/mlmmj-unsub.c
src/subscriberfuncs.c
tests/mlmmj.c

index d608b0b8295d167dc2db54c83c72cf518e7b6d86..a3a6328a1c58607d58aaf0ebe114a9d7fb22551c 100644 (file)
@@ -31,3 +31,4 @@ enum subtype is_subbed(int listfd, const char *address, bool both);
 char *get_subcookie_content(int listfd, bool unsub, const char *param);
 void notify_sub(struct ml *ml, const char *subaddr, enum subtype typesub,
                enum subreason reasonsub, bool sub);
+void generate_subscription(struct ml *ml, const char *subaddr, enum subtype typesub, bool sub);
index cbc0eb9186188c7d7d70c6bed8cda10a28090cce..4d50af99dbb648f2c93669057436997c56308ed4 100644 (file)
@@ -419,27 +419,6 @@ static void print_help(const char *prg)
        exit(EXIT_SUCCESS);
 }
 
-void generate_subscribed(struct ml *ml, const char *subaddr,
-    const char *mlmmjsend, enum subtype typesub)
-{
-       text *txt;
-       char *queuefilename, *fromaddr;
-
-       gen_addr(fromaddr, ml, "bounceshelp");
-       txt = open_text(ml->fd,
-                       "deny", "sub", "subbed", subtype_strs[typesub],
-                       "sub-subscribed");
-       MY_ASSERT(txt);
-       register_default_unformatted(txt, ml);
-       register_unformatted(txt, "subaddr", subaddr);
-       queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
-       MY_ASSERT(queuefilename);
-       close_text(txt);
-
-       exec_or_die(mlmmjsend, "-l", "1", "-L", ml->dir, "-T", subaddr, "-F",
-           fromaddr, "-m", queuefilename, NULL);
-}
-
 static void subscribe_type(int listfd, char *address, enum subtype typesub) {
        int dirfd;;
        char chstr[2];
@@ -612,7 +591,7 @@ int main(int argc, char **argv)
 
        if(subbed == typesub) {
                if(!nogensubscribed)
-                       generate_subscribed(&ml, address, mlmmjsend, typesub);
+                       generate_subscription(&ml, address, typesub, true);
                return EXIT_SUCCESS;
        } else if(subbed != SUB_NONE) {
                reasonsub = SUB_SWITCH;
index 94f80b0b0c1313bd17507cadc31e467e67ef7ecc..3b69404d5f356513fbf20bbaa27ce1f4464e7923 100644 (file)
@@ -183,27 +183,6 @@ static void print_help(const char *prg)
        exit(EXIT_SUCCESS);
 }
 
-static void generate_notsubscribed(struct ml *ml, const char *subaddr,
-       const char *mlmmjsend, enum subtype typesub)
-{
-       text *txt;
-       char *queuefilename, *fromaddr;
-
-       gen_addr(fromaddr, ml, "bounces-help");
-       txt = open_text(ml->fd,
-                       "deny", "unsub", "unsubbed", subtype_strs[typesub],
-                       "unsub-notsubscribed");
-       MY_ASSERT(txt);
-       register_default_unformatted(txt, ml);
-       register_unformatted(txt, "subaddr", subaddr);
-       queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
-       MY_ASSERT(queuefilename);
-       close_text(txt);
-
-       exec_or_die(mlmmjsend, "-l", "1", "-L", ml->dir, "-T", subaddr,
-           "-F", fromaddr, "-m", queuefilename, NULL);
-}
-
 int main(int argc, char **argv)
 {
        int opt;
@@ -340,7 +319,7 @@ int main(int argc, char **argv)
        if(!subbed) {
                /* Address is not subscribed */
                if(!nogennotsubscribed)
-                       generate_notsubscribed(&ml, address, mlmmjsend, typesub);
+                       generate_subscription(&ml, address, typesub, false);
                exit(EXIT_SUCCESS);
        }
 
index 23b9fcef2181dce3aeee75f534b0e1819a6436d2..3c73736bf508f0600f703525136407f4d87cc5b1 100644 (file)
@@ -166,8 +166,9 @@ get_subcookie_content(int listfd, bool unsub, const char *param)
        return (NULL);
 }
 
-void notify_sub(struct ml *ml, const char *subaddr, enum subtype typesub,
-               enum subreason reasonsub, bool sub)
+void
+notify_sub(struct ml *ml, const char *subaddr, enum subtype typesub,
+    enum subreason reasonsub, bool sub)
 {
        char *fromaddr, *tostr;
        text *txt;
@@ -217,3 +218,34 @@ void notify_sub(struct ml *ml, const char *subaddr, enum subtype typesub,
        exit(EXIT_SUCCESS);
 }
 
+void
+generate_subscription(struct ml *ml, const char *subaddr,
+    enum subtype typesub, bool sub)
+{
+       text *txt;
+       char *queuefilename, *fromaddr;
+       struct mail mail;
+
+       memset(&mail, 0, sizeof(mail));
+
+       gen_addr(fromaddr, ml, "bounces-help");
+       txt = open_text(ml->fd, "deny", sub ? "sub" : "unsub",
+           sub ? "subbed" : "unsubbed", subtype_strs[typesub],
+           sub ? "sub-subscribed" : "unsub-notsubscribed");
+       MY_ASSERT(txt);
+       register_default_unformatted(txt, ml);
+       register_unformatted(txt, "subaddr", subaddr);
+       queuefilename = prepstdreply(txt, ml, "$helpaddr$", subaddr, NULL);
+       MY_ASSERT(queuefilename);
+       close_text(txt);
+
+       mail.to = subaddr;
+       mail.from = fromaddr;
+       mail.fp = fopen(queuefilename, "r");
+       if (!send_single_mail(&mail, ml, false)) {
+               save_queue(queuefilename, &mail);
+               exit(EXIT_FAILURE);
+       }
+       exit(EXIT_SUCCESS);
+}
+
index 1d34cbcd5cd35362ba05c26f3982c7bb914b34c4..221d35d3d75b524cd365ad834f709455c227b41b 100644 (file)
@@ -139,6 +139,7 @@ ATF_TC_WITHOUT_HEAD(get_processed_text_line);
 ATF_TC_WITHOUT_HEAD(newsmtp);
 ATF_TC_WITHOUT_HEAD(save_queue);
 ATF_TC_WITHOUT_HEAD(send_single_mail);
+ATF_TC_WITHOUT_HEAD(generate_subscription);
 
 ATF_TC_BODY(random_int, tc)
 {
@@ -2113,6 +2114,54 @@ ATF_TC_BODY(send_single_mail, tc)
        }
 }
 
+ATF_TC_BODY(generate_subscription, tc)
+{
+       char *dir;
+       const char *path;
+       init_ml(true);
+       struct ml ml;
+       ml_init(&ml);
+       ml.dir = "list";
+       ml_open(&ml, false);
+       rmdir("list/text");
+       xasprintf(&dir, "%s/../listtexts/en",
+           atf_tc_get_config_var(tc, "srcdir"));
+
+       symlink(dir, "list/text");
+       atf_utils_create_file("list/control/smtpport", "25678");
+       atf_utils_create_file("list/control/smtphelo", "heloname");
+       int smtppipe[2];
+       ATF_REQUIRE(socketpair(AF_UNIX, SOCK_STREAM, 0, smtppipe) >= 0);
+
+       pid_t p2 = single_mail_reception(smtppipe[1]);
+       atf_utils_readline(smtppipe[0]);
+       pid_t p = atf_utils_fork();
+       if (p == 0) {
+               generate_subscription(&ml, "test@plop", SUB_NORMAL, true);
+       }
+       atf_utils_wait(p2, 0, "save:mailout.txt", "");
+       atf_utils_wait(p, 0, "", "");
+       path = "mailout.txt";
+       if (!atf_utils_grep_file(".*You were unable to be subscribed to the list because you are already*", path)) {
+               atf_utils_cat_file(path, "");
+               atf_tc_fail("invalid file");
+       }
+
+       p2 = single_mail_reception(smtppipe[1]);
+       atf_utils_readline(smtppipe[0]);
+       p = atf_utils_fork();
+       if (p == 0) {
+               generate_subscription(&ml, "test@plop", SUB_NORMAL, false);
+       }
+       atf_utils_wait(p2, 0, "save:mailout.txt", "");
+       atf_utils_wait(p, 0, "", "");
+       path = "mailout.txt";
+       if (!atf_utils_grep_file(".*You were unable to be unsubscribed from the list because you are not*", path)) {
+               atf_utils_cat_file(path, "");
+               atf_tc_fail("invalid file");
+       }
+}
+
 ATF_TP_ADD_TCS(tp)
 {
        ATF_TP_ADD_TC(tp, random_int);
@@ -2189,6 +2238,7 @@ ATF_TP_ADD_TCS(tp)
        ATF_TP_ADD_TC(tp, newsmtp);
        ATF_TP_ADD_TC(tp, save_queue);
        ATF_TP_ADD_TC(tp, send_single_mail);
+       ATF_TP_ADD_TC(tp, generate_subscription);
 
        return (atf_no_error());
 }