#pragma once
-void send_help(struct ml *ml, const char *queuefilename,
- const char *emailaddr, const char *mlmmjsend);
+void send_help(struct ml *ml, const char *queuefilename, const char *emailaddr);
#include "mlmmj.h"
-void send_list(struct ml *ml, const char *emailaddr, const char *mlmmjsend);
+void send_list(struct ml *ml, const char *emailaddr);
struct subs_list_state;
struct subs_list_state *init_subs_list(int fd, const char *dirname);
void rewind_subs_list(void *state);
tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
- send_help(ml, queuefilename,
- tll_front(*fromemails), mlmmjsend);
+ send_help(ml, queuefilename, tll_front(*fromemails));
return -1;
}
log_oper(ml->fd, OPLOGFNAME, "mlmmj-sub: request for digest"
tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
- send_help(ml, queuefilename,
- tll_front(*fromemails), mlmmjsend);
+ send_help(ml, queuefilename, tll_front(*fromemails));
return -1;
}
log_oper(ml->fd, OPLOGFNAME, "mlmmj-sub: request for nomail"
tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
- send_help(ml, queuefilename,
- tll_front(*fromemails), mlmmjsend);
+ send_help(ml, queuefilename, tll_front(*fromemails));
return -1;
}
log_oper(ml->fd, OPLOGFNAME, "mlmmj-sub: request for both"
"$listowner$", tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
- send_help(ml, queuefilename,
- tll_front(*fromemails), mlmmjsend);
+ send_help(ml, queuefilename, tll_front(*fromemails));
break;
/* listname+faq@domain.tld */
"$listowner$", tll_front(*fromemails), NULL);
MY_ASSERT(queuefilename);
close_text(txt);
- send_help(ml, queuefilename,
- tll_front(*fromemails), mlmmjsend);
+ send_help(ml, queuefilename, tll_front(*fromemails));
break;
/* listname+get-INDEX@domain.tld */
" Ignoring mail");
return -1;
} else {
- send_list(ml, owner, mlmmjsend);
+ send_list(ml, owner);
}
if (owners != NULL)
tll_free_and_free(*owners, free);
#include "mlmmj-process.h"
#include "utils.h"
#include "xstring.h"
+#include "send_help.h"
enum action {
ALLOW,
char *randomstr = NULL, *mqueuename, *omitfilename;
char *mlmmjsend, *mlmmjsub, *mlmmjunsub;
char *bindir, *subjectprefix, *discardname;
- char *fromaddr;
text *txt;
char *queuefilename, *recipextra = NULL, *owner = NULL;
char *maxmailsizestr;
exit(EXIT_SUCCESS);
}
- gen_addr(fromaddr, &ml, "bounces-help");
txt = open_text(ml.fd, "deny", "post",
"maxmailsize", NULL, "maxmailsize");
MY_ASSERT(txt);
unlink(mailfile);
free(donemailname);
free(maxmailsizestr);
- exec_or_die(mlmmjsend, "-l", "1", "-L", ml.dir, "-T",
- posteraddr, "-F", fromaddr, "-m", queuefilename,
- NULL);
+ send_help(&ml, queuefilename, posteraddr);
}
}
free(donemailname);
exit(EXIT_SUCCESS);
}
- gen_addr(fromaddr, &ml, "bounces-help");
txt = open_text(ml.fd, "deny", "post",
"tocc", NULL, "notintocc");
MY_ASSERT(txt);
close_text(txt);
unlink(donemailname);
free(donemailname);
- exec_or_die(mlmmjsend, "-l", "1", "-L", ml.dir, "-T",
- posteraddr, "-F", fromaddr, "-m", queuefilename, NULL);
+ send_help(&ml, queuefilename, posteraddr);
}
access_rules = ctrlvalues(ml.ctrlfd, "access");
free(donemailname);
exit(EXIT_SUCCESS);
}
- gen_addr(fromaddr, &ml, "bounces-help");
txt = open_text(ml.fd, "deny", "post",
"access", NULL, "access");
MY_ASSERT(txt);
unlink(donemailname);
free(donemailname);
free(randomstr);
- exec_or_die(mlmmjsend, "-l", "1", "-L", ml.dir, "-T",
- posteraddr, "-F", fromaddr, "-m", queuefilename,
- NULL);
+ send_help(&ml, queuefilename, posteraddr);
} else if (accret == MODERATE) {
moderated = 1;
modreason = ACCESS;
free(donemailname);
exit(EXIT_SUCCESS);
}
- gen_addr(fromaddr, &ml, "bounces-help");
if (subonlypost) {
txt = open_text(ml.fd, "deny", "post",
"subonlypost", NULL, "subonlypost");
close_text(txt);
unlink(donemailname);
free(donemailname);
- exec_or_die(mlmmjsend, "-L", ml.dir, "-l", "1",
- "-T", testaddr, "-F", fromaddr, "-m",
- queuefilename, NULL);
+ send_help(&ml, queuefilename, testaddr);
}
}
}
#include "ctrlvalues.h"
#include "chomp.h"
#include "utils.h"
+#include "send_help.h"
static void moderate_sub(struct ml *ml, const char *subaddr,
const char *mlmmjsend, enum subtype typesub,
/* send mail to requester that the list is submod'ed */
- gen_addr(from, ml, "bounces-help");
-
txt = open_text(ml->fd,
"wait", "sub",
subreason_strs[reasonsub], subtype_strs[typesub],
close_text(txt);
finish_memory_lines(mls);
- execl(mlmmjsend, mlmmjsend,
- "-l", "1",
- "-L", ml->dir,
- "-T", subaddr,
- "-F", from,
- "-m", queuefilename, (char *)NULL);
- log_error(LOG_ARGS, "execl() of '%s' failed", mlmmjsend);
- exit(EXIT_FAILURE);
+ send_help(ml, queuefilename, subaddr);
}
void getaddrandtype(const char *listdir, const char *modstr,
#include "send_help.h"
#include "utils.h"
#include "xmalloc.h"
+#include "send_mail.h"
-void send_help(struct ml *ml, const char *queuefilename,
- const char *emailaddr, const char *mlmmjsend)
+void
+send_help(struct ml *ml, const char *queuefilename, const char *emailaddr)
{
char *fromaddr;
+ struct mail mail;
+ memset(&mail, 0, sizeof(mail));
gen_addr(fromaddr, ml, "bounces-help");
- exec_or_die(mlmmjsend, "-l", "1", "-L", ml->dir, "-T", emailaddr,
- "-F", fromaddr, "-m", queuefilename, NULL);
+ mail.to = emailaddr;
+ mail.from = fromaddr;
+ mail.fp = fopen(queuefilename, "r");
+ if (!send_single_mail(&mail, ml, false))
+ save_queue(queuefilename, &mail);
+ exit(EXIT_SUCCESS);
}
#include "wrappers.h"
#include "prepstdreply.h"
#include "utils.h"
+#include "send_help.h"
struct subs_list_state {
}
-void send_list(struct ml *ml, const char *emailaddr, const char *mlmmjsend)
+void send_list(struct ml *ml, const char *emailaddr)
{
text *txt;
struct subs_list_state *normalsls, *digestsls, *nomailsls;
- char *queuefilename, *fromaddr;
+ char *queuefilename;
int fd;
- gen_addr(fromaddr, ml, "bounces-help");
-
normalsls = init_subs_list(ml->fd, "subscribers.d");
digestsls = init_subs_list(ml->fd, "digesters.d");
nomailsls = init_subs_list(ml->fd, "nomailsubs.d");
finish_subs_list(digestsls);
finish_subs_list(nomailsls);
- exec_or_die(mlmmjsend, "-l", "1", "-L", ml->dir, "-T", emailaddr, "-F",
- fromaddr, "-m", queuefilename, NULL);
+ send_help(ml, queuefilename, emailaddr);
}
sockfd = newsmtp(ml);
if (sockfd == -1)
return (false);
- if (send_mail(sockfd, mail, ml->fd, ml->ctrlfd, bounce) != 0) {
+ if (send_mail(sockfd, mail, ml->fd, ml->ctrlfd, bounce)) {
endsmtp(&sockfd);
return (false);
}
#include "xmalloc.h"
#include "send_mail.h"
#include "strgen.h"
+#include "send_help.h"
char *subtype_strs[] = {
"normal",
notify_sub(struct ml *ml, const char *subaddr, enum subtype typesub,
enum subreason reasonsub, bool sub)
{
- char *fromaddr, *tostr;
+ char *tostr;
text *txt;
char *queuefilename = NULL;
const char *listtext = NULL;
- struct mail mail;
- memset(&mail, 0, sizeof(mail));
- gen_addr(fromaddr, ml, "bounces-help");
gen_addr(tostr, ml, "owner");
switch(typesub) {
MY_ASSERT(queuefilename);
close_text(txt);
- mail.to = tostr;
- mail.from = fromaddr;
- mail.fp = fopen(queuefilename, "r");
- if (!send_single_mail(&mail, ml, false)) {
- save_queue(queuefilename, &mail);
- exit(EXIT_FAILURE);
- }
+ send_help(ml, queuefilename, tostr);
exit(EXIT_SUCCESS);
}
enum subtype typesub, bool sub)
{
text *txt;
- char *queuefilename, *fromaddr;
- struct mail mail;
+ char *queuefilename;
- 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(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);
+ send_help(ml, queuefilename, subaddr);
}
void
mail.to = subaddr;
mail.from = fromaddr;
mail.fp = fopen(queuefilename, "r");
- if (!send_single_mail(&mail, ml, false)) {
+ if (!send_single_mail(&mail, ml, false))
save_queue(queuefilename, &mail);
- exit(EXIT_FAILURE);
- }
exit(EXIT_SUCCESS);
}
enum subreason reasonsub, bool sub)
{
text *txt;
- char *queuefilename, *fromaddr;
+ char *queuefilename;
const char *listtext;
- struct mail mail;
-
- memset(&mail, 0, sizeof(mail));
- gen_addr(fromaddr, ml, "bounces-help");
switch(typesub) {
default:
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);
+ send_help(ml, queuefilename, subaddr);
}
-
#include "mlmmj-process.h"
#include "prepstdreply.h"
#include "mlmmj_tests.h"
+#include "send_help.h"
ATF_TC_WITHOUT_HEAD(random_int);
ATF_TC_WITHOUT_HEAD(chomp);
ATF_TC_WITHOUT_HEAD(generate_subconfirm);
ATF_TC_WITHOUT_HEAD(confirm_sub);
ATF_TC_WITHOUT_HEAD(listcontrol);
+ATF_TC_WITHOUT_HEAD(send_help);
ATF_TC_BODY(random_int, tc)
{
ATF_REQUIRE_EQ(listcontrol(&fromemails, &ml, "subscribe", NULL, NULL, NULL, "meh"), -1);
}
+ATF_TC_BODY(send_help, tc)
+{
+ char *dir;
+ 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");
+ atf_utils_create_file("mail", "headers\n\nbody\n");
+ 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) {
+ send_help(&ml, "mail", "test@plop");
+ }
+ atf_utils_wait(p2, 0, "save:mailout.txt", "");
+ atf_utils_wait(p, 0, "", "");
+ const char *output= "EHLO heloname\r\n"
+ "MAIL FROM:<test+bounces-help@test>\r\n"
+ "RCPT TO:<test@plop>\r\n"
+ "DATA\r\n"
+ "headers\r\n"
+ "\r\n"
+ "body\r\n"
+ "\r\n"
+ ".\r\n"
+ "QUIT\r\n";
+ if (!atf_utils_compare_file("mailout.txt", output)) {
+ atf_utils_cat_file("mailout.txt", "");
+ atf_tc_fail("invalid file");
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, random_int);
ATF_TP_ADD_TC(tp, generate_subconfirm);
ATF_TP_ADD_TC(tp, confirm_sub);
ATF_TP_ADD_TC(tp, listcontrol);
+ ATF_TP_ADD_TC(tp, send_help);
return (atf_no_error());
}