]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
mlmmj-process: isolate function to extract recipextra from MTA
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 8 Feb 2023 13:32:28 +0000 (14:32 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 8 Feb 2023 13:32:28 +0000 (14:32 +0100)
include/mlmmj-process.h
src/mlmmj-process.c
src/utils.c
tests/mlmmj.c

index ccbc399d29aa6ad0ae488d99d5ebe29d6650e5a0..b817db6ad2683ce0e93cb6092cd33b87c2f27b81 100644 (file)
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002, 2003 Mads Martin Joergensen <mmj at mmj.dk>
- *
- * $Id$
+/*
+ * Copyright (C) 2002, 2003 Mads Martin Joergensen <mmj at mmj.dk>
+ * Copyright (C) 2023 Baptiste Daroussin <bapt@FreeBSd.org>
  *
  * 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);
index 97df919e02d644209e0ac13c5181c15b880f2893..5bfd5491f1a63d005897f1882ede6a445467f6f5 100644 (file)
@@ -1,6 +1,6 @@
-/* Copyright (C) 2003, 2003, 2004 Mads Martin Joergensen <mmj at mmj.dk>
- *
- * $Id$
+/*
+ * Copyright (C) 2003, 2003, 2004 Mads Martin Joergensen <mmj at mmj.dk>
+ * Copyright (C) 2023 Baptiste Daroussin <bapt@FreeBSD.org>
  *
  * 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) {
index 16675d682d1137cd8558ece4023b8b41677db6b0..7d4c9bc4d55018c8aa934892f48574aa55834023 100644 (file)
@@ -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);
+}
index 53ca0bd8c54e1e816d2304dd82ab52b09aebe046..5562862febfb39eda1ca259364d74932e4ee9f63 100644 (file)
@@ -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());
 }