From: Baptiste Daroussin Date: Wed, 8 Feb 2023 13:32:28 +0000 (+0100) Subject: mlmmj-process: isolate function to extract recipextra from MTA X-Git-Tag: RELEASE_1_4_0b1~231 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91eefaf8da42e2792a9c7cfde6edc4dd779ef65b;p=thirdparty%2Fmlmmj.git mlmmj-process: isolate function to extract recipextra from MTA --- diff --git a/include/mlmmj-process.h b/include/mlmmj-process.h index ccbc399d..b817db6a 100644 --- a/include/mlmmj-process.h +++ b/include/mlmmj-process.h @@ -1,6 +1,6 @@ -/* Copyright (C) 2002, 2003 Mads Martin Joergensen - * - * $Id$ +/* + * Copyright (C) 2002, 2003 Mads Martin Joergensen + * Copyright (C) 2023 Baptiste Daroussin * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -21,8 +21,6 @@ * IN THE SOFTWARE. */ -#ifndef MMJML_PROCESS_H -#define MMJML_PROCESS_H - +#pragma once -#endif /* MMJML_PROCESS_H */ +char *get_recipextra_from_env(int ctrlfd); diff --git a/src/mlmmj-process.c b/src/mlmmj-process.c index 97df919e..5bfd5491 100644 --- a/src/mlmmj-process.c +++ b/src/mlmmj-process.c @@ -1,6 +1,6 @@ -/* Copyright (C) 2003, 2003, 2004 Mads Martin Joergensen - * - * $Id$ +/* + * Copyright (C) 2003, 2003, 2004 Mads Martin Joergensen + * Copyright (C) 2023 Baptiste Daroussin * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -590,27 +590,9 @@ int main(int argc, char **argv) find_email_adr(readhdrs[4].values[i], &dtemails); } - /* address extension (the "foo" part of "user+foo@domain.tld") */ - if((envstr = getenv("DEFAULT")) != NULL) { - /* qmail */ - recipextra = xstrdup(envstr); - } else if((envstr = getenv("EXTENSION")) != NULL) { - /* postfix */ - recipextra = xstrdup(envstr); - } else if((envstr = getenv("LOCAL_PART_SUFFIX")) != NULL) { - /* exim */ - listdelim = getlistdelim(ctrlfd); - if (strncmp(envstr, listdelim, strlen(listdelim)) == 0) { - recipextra = xstrdup(envstr + strlen(listdelim)); - } else { - recipextra = xstrdup(envstr); - } - free(listdelim); - listdelim = NULL; - } else { - findaddress = 1; - } - + recipextra = get_recipextra_from_env(ctrlfd); + if (recipextra == NULL) + findaddress = true; addrtocc = !statctrl(ctrlfd, "tocc"); if (findaddress) { diff --git a/src/utils.c b/src/utils.c index 16675d68..7d4c9bc4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -34,6 +34,7 @@ #include "xmalloc.h" #include "utils.h" +#include "getlistdelim.h" extern char **environ; @@ -206,3 +207,28 @@ lock(int fd, bool wr) } return (true); } + +char * +get_recipextra_from_env(int ctrlfd) +{ + const char *envstr; + char *listdelim, *recipextra; + + /* address extension (the "foo" part of "user+foo@domain.tld") */ + /* qmail */ + if((envstr = getenv("DEFAULT")) != NULL) + return (xstrdup(envstr)); + /* postfix */ + if((envstr = getenv("EXTENSION")) != NULL) + return (xstrdup(envstr)); + /* exim */ + if ((envstr = getenv("LOCAL_PART_SUFFIX")) != NULL) { + listdelim = getlistdelim(ctrlfd); + if (strncmp(envstr, listdelim, strlen(listdelim)) == 0) + recipextra = xstrdup(envstr + strlen(listdelim)); + else + recipextra = xstrdup(envstr); + return (recipextra); + } + return (NULL); +} diff --git a/tests/mlmmj.c b/tests/mlmmj.c index 53ca0bd8..5562862f 100644 --- a/tests/mlmmj.c +++ b/tests/mlmmj.c @@ -61,6 +61,7 @@ #include "incindexfile.h" #include "log_oper.h" #include "listcontrol.h" +#include "mlmmj-process.h" ATF_TC_WITHOUT_HEAD(random_int); ATF_TC_WITHOUT_HEAD(chomp); @@ -130,6 +131,10 @@ ATF_TC_WITHOUT_HEAD(get_preppedhdrs_from_map_1); ATF_TC_WITHOUT_HEAD(get_prepped_mailbody_from_map); ATF_TC_WITHOUT_HEAD(get_prepped_mailbody_from_map_1); ATF_TC_WITHOUT_HEAD(get_ctrl_command); +ATF_TC_WITHOUT_HEAD(get_recipextra_from_env_none); +ATF_TC_WITHOUT_HEAD(get_recipextra_from_env_qmail); +ATF_TC_WITHOUT_HEAD(get_recipextra_from_env_postfix); +ATF_TC_WITHOUT_HEAD(get_recipextra_from_env_exim); #ifndef NELEM #define NELEM(array) (sizeof(array) / sizeof((array)[0])) @@ -1991,6 +1996,47 @@ ATF_TC_BODY(get_ctrl_command, tc) ATF_REQUIRE(ctrl == NULL); } +ATF_TC_BODY(get_recipextra_from_env_none, tc) +{ + ATF_REQUIRE(get_recipextra_from_env(-1) == NULL); +} + +ATF_TC_BODY(get_recipextra_from_env_qmail, tc) +{ + char *str; + setenv("DEFAULT", "value", 1); + + str = get_recipextra_from_env(-1); + ATF_REQUIRE_STREQ(str, "value"); + free(str); +} + +ATF_TC_BODY(get_recipextra_from_env_postfix, tc) +{ + char *str; + + setenv("EXTENSION", "value", 1); + str = get_recipextra_from_env(-1); + ATF_REQUIRE_STREQ(str, "value"); + free(str); +} + +ATF_TC_BODY(get_recipextra_from_env_exim, tc) +{ + char *str; + + setenv("LOCAL_PART_SUFFIX", "+value", 1); + str = get_recipextra_from_env(-1); + ATF_REQUIRE_STREQ(str, "value"); + free(str); + + /* no valid delimiter */ + setenv("LOCAL_PART_SUFFIX", "=value", 1); + str = get_recipextra_from_env(-1); + ATF_REQUIRE_STREQ(str, "=value"); + free(str); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, random_int); @@ -2061,6 +2107,10 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, get_prepped_mailbody_from_map); ATF_TP_ADD_TC(tp, get_prepped_mailbody_from_map_1); ATF_TP_ADD_TC(tp, get_ctrl_command); + ATF_TP_ADD_TC(tp, get_recipextra_from_env_none); + ATF_TP_ADD_TC(tp, get_recipextra_from_env_qmail); + ATF_TP_ADD_TC(tp, get_recipextra_from_env_postfix); + ATF_TP_ADD_TC(tp, get_recipextra_from_env_exim); return (atf_no_error()); }