From 979ec0c561418539c64048abad20f15662fd56b8 Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Wed, 15 Feb 2023 14:13:24 +0100 Subject: [PATCH] generate_scubscription: deduplicate and test code --- include/subscriberfuncs.h | 1 + src/mlmmj-sub.c | 23 +----------------- src/mlmmj-unsub.c | 23 +----------------- src/subscriberfuncs.c | 36 ++++++++++++++++++++++++++-- tests/mlmmj.c | 50 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 46 deletions(-) diff --git a/include/subscriberfuncs.h b/include/subscriberfuncs.h index d608b0b8..a3a6328a 100644 --- a/include/subscriberfuncs.h +++ b/include/subscriberfuncs.h @@ -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); diff --git a/src/mlmmj-sub.c b/src/mlmmj-sub.c index cbc0eb91..4d50af99 100644 --- a/src/mlmmj-sub.c +++ b/src/mlmmj-sub.c @@ -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; diff --git a/src/mlmmj-unsub.c b/src/mlmmj-unsub.c index 94f80b0b..3b69404d 100644 --- a/src/mlmmj-unsub.c +++ b/src/mlmmj-unsub.c @@ -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); } diff --git a/src/subscriberfuncs.c b/src/subscriberfuncs.c index 23b9fcef..3c73736b 100644 --- a/src/subscriberfuncs.c +++ b/src/subscriberfuncs.c @@ -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); +} + diff --git a/tests/mlmmj.c b/tests/mlmmj.c index 1d34cbcd..221d35d3 100644 --- a/tests/mlmmj.c +++ b/tests/mlmmj.c @@ -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()); } -- 2.47.3