#pragma once
char *get_recipextra_from_env(int ctrlfd);
+bool addrmatch(const char *listaddr, const char *addr, const char *listdelim, char **recipextra);
}
-static int addrmatch(const char *listaddr, const char *addr,
- const char *listdelim, char **recipextra)
-{
- char *delim, *atsign;
- size_t len;
-
- if (!addr)
- return 0;
-
- if(strcasecmp(listaddr, addr) == 0) {
- if (recipextra)
- *recipextra = NULL;
- return 1;
- }
-
- if (!listdelim)
- return 0;
-
- delim = strstr(addr, listdelim);
- if (!delim)
- return 0;
-
- len = delim - addr;
- if(strncasecmp(listaddr, addr, len) != 0)
- return 0;
- if(*(listaddr + len) != '@')
- return 0;
-
- delim += strlen(listdelim);
-
- atsign = strrchr(delim, '@');
- if (!atsign)
- return 0;
-
- if(strcasecmp(listaddr + len + 1, atsign + 1) != 0)
- return 0;
-
- if (recipextra) {
- len = atsign - delim;
- *recipextra = (char *)xmalloc(len + 1);
- strncpy(*recipextra, delim, len);
- (*recipextra)[len] = '\0';
- }
-
- return 1;
-}
-
static void print_help(const char *prg)
{
}
recipextra = get_recipextra_from_env(ctrlfd);
- if (recipextra == NULL)
+ if (recipextra == NULL) {
findaddress = true;
- addr_in_to_or_cc = !statctrl(ctrlfd, "tocc");
-
- if (findaddress) {
listdelim = getlistdelim(ctrlfd);
}
+ addr_in_to_or_cc = !statctrl(ctrlfd, "tocc");
+
if(addr_in_to_or_cc || findaddress) {
listaddrs = ctrlvalues(ctrlfd, "listaddress");
tll_foreach(dtemails, it) {
}
return (NULL);
}
+
+bool
+addrmatch(const char *listaddr, const char *addr,
+ const char *listdelim, char **recipextra)
+{
+ char *delim, *atsign;
+ size_t len;
+
+ if (recipextra)
+ *recipextra = NULL;
+
+ if (addr == NULL)
+ return (false);
+
+ if(strcasecmp(listaddr, addr) == 0)
+ return (true);
+
+ if (listdelim == NULL)
+ return (false);
+
+ delim = strstr(addr, listdelim);
+ if (delim == NULL)
+ return (false);
+
+ len = delim - addr;
+ if(strncasecmp(listaddr, addr, len) != 0)
+ return (false);
+ if(*(listaddr + len) != '@')
+ return (false);
+
+ delim += strlen(listdelim);
+
+ atsign = strrchr(delim, '@');
+ if (!atsign)
+ return (false);
+
+ if(strcasecmp(listaddr + len + 1, atsign + 1) != 0)
+ return (false);
+
+ if (recipextra) {
+ len = atsign - delim;
+ *recipextra = xstrndup(delim, len);
+ }
+
+ return (true);
+}
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);
+ATF_TC_WITHOUT_HEAD(addrmatch);
#ifndef NELEM
#define NELEM(array) (sizeof(array) / sizeof((array)[0]))
free(str);
}
+ATF_TC_BODY(addrmatch, tc)
+{
+ char *extra;
+
+ ATF_REQUIRE(addrmatch("lists@test.org", "lists@test.org", "+", &extra));
+ ATF_REQUIRE(extra == NULL);
+
+ ATF_REQUIRE(!addrmatch("lists@test.org", NULL, "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "nope@test.org", "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "nope@test.org", NULL, &extra));
+ ATF_REQUIRE(addrmatch("lists@test.org", "lists+@test.org", "+", &extra));
+ ATF_REQUIRE_STREQ(extra, "");
+ ATF_REQUIRE(!addrmatch("lists@test.org", "list+@test.org", "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "lists+@bla.org", "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "bla+@test.org", "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "list+@bla.org", "+", &extra));
+ ATF_REQUIRE(!addrmatch("lists@test.org", "list+test.org", "+", &extra));
+ ATF_REQUIRE(addrmatch("lists@test.org", "lists+value@test.org", "+", &extra));
+ ATF_REQUIRE_STREQ(extra, "value");
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, random_int);
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);
+ ATF_TP_ADD_TC(tp, addrmatch);
return (atf_no_error());
}