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);
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];
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;
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;
if(!subbed) {
/* Address is not subscribed */
if(!nogennotsubscribed)
- generate_notsubscribed(&ml, address, mlmmjsend, typesub);
+ generate_subscription(&ml, address, typesub, false);
exit(EXIT_SUCCESS);
}
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;
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);
+}
+
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)
{
}
}
+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);
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());
}