From 8d7cd043e07dfe4e0ae93befb667a2189e4b482d Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 24 Jul 2021 17:41:40 -0400 Subject: [PATCH] Reworked validate_recipients() and expand_aliases() in preparation for expanding aliases into multiple recipients --- citadel/citadel.h | 9 ++---- citadel/internet_addressing.c | 58 ++++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/citadel/citadel.h b/citadel/citadel.h index 6e1ed632a..35237621b 100644 --- a/citadel/citadel.h +++ b/citadel/citadel.h @@ -1,7 +1,7 @@ /* * Main Citadel header file * - * Copyright (c) 1987-2020 by the citadel.org team + * Copyright (c) 1987-2021 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3. @@ -30,8 +30,7 @@ extern "C" { /* * Text description of this software - * (We used to define this ourselves, but why bother when - * the GNU build tools do it for us?) + * (We used to define this ourselves, but why bother when the build tools do it for us?) */ #define CITADEL PACKAGE_STRING @@ -156,10 +155,6 @@ struct ctdlroom { #define MES_ANONONLY 66 // "****" header #define MES_ANONOPT 67 // "Anonymous" header -#define MES_ERROR (-1) // Can't send message due to bad address -#define MES_LOCAL 0 // Local message, do no network processing -#define MES_INTERNET 1 // Convert msg and send as Internet mail - /****************************************************************************/ /* diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index 57c55b03d..b845b304a 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -172,9 +172,7 @@ void utf8ify_rfc822_string(char *buf) { end = nextend; } - /* Now we handle foreign character sets properly encoded - * in RFC2047 format. - */ + // Now we handle foreign character sets properly encoded in RFC2047 format. start = strstr(buf, "=?"); FindNextEnd((start != NULL)? start : buf, end); while (start != NULL && end != NULL && end > start) { @@ -390,10 +388,18 @@ void remove_any_whitespace_to_the_left_or_right_of_at_symbol(char *name) { } +// values that can be returned by expand_aliases() +enum { + EA_ERROR, // Can't send message due to bad address + EA_LOCAL, // Local message, do no network processing + EA_INTERNET // Convert msg and send as Internet mail +}; + + /* * Aliasing for network mail. */ -int alias(char *name) { /* process alias and routing info for mail */ +int expand_aliases(char *name) { /* process alias and routing info for mail */ int a; char aaa[SIZ]; int at = 0; @@ -411,9 +417,9 @@ int alias(char *name) { /* process alias and routing info for mail */ strcpy(name, aaa); } - if (strcasecmp(original_name, name)) { + //if (strcasecmp(original_name, name)) { syslog(LOG_INFO, "internet_addressing: %s is being forwarded to %s", original_name, name); - } + //} /* Change "user @ xxx" to "user" if xxx is an alias for this host */ for (a=0; name[a] != '\0'; ++a) { @@ -428,8 +434,8 @@ int alias(char *name) { /* process alias and routing info for mail */ /* determine local or remote type, see citadel.h */ at = haschar(name, '@'); - if (at == 0) return(MES_LOCAL); /* no @'s - local address */ - if (at > 1) return(MES_ERROR); /* >1 @'s - invalid address */ + if (at == 0) return(EA_LOCAL); /* no @'s - local address */ + if (at > 1) return(EA_ERROR); /* >1 @'s - invalid address */ remove_any_whitespace_to_the_left_or_right_of_at_symbol(name); /* figure out the delivery mode */ @@ -439,11 +445,11 @@ int alias(char *name) { /* process alias and routing info for mail */ * is an FQDN and will attempt SMTP delivery to the Internet. */ if (haschar(node, '.') > 0) { - return(MES_INTERNET); + return(EA_INTERNET); } /* If we get to this point it's an invalid node name */ - return (MES_ERROR); + return (EA_ERROR); } @@ -536,20 +542,28 @@ struct recptypes *validate_recipients(const char *supplied_recipients, const cha } striplt(this_recp); - if (IsEmptyStr(this_recp)) - break; - syslog(LOG_DEBUG, "internet_addressing: evaluating recipient: %s", this_recp); - array_append(recp_array, this_recp); + if (!IsEmptyStr(this_recp)) { + syslog(LOG_DEBUG, "internet_addressing: evaluating recipient: %s", this_recp); + array_append(recp_array, this_recp); + } } for (int r=0; rnum_room; strcpy(this_recp, CtdlGetConfigStr("c_aideroom")); @@ -584,7 +600,7 @@ struct recptypes *validate_recipients(const char *supplied_recipients, const cha RemoteIdentifier, Flags, 0 /* 0 = not a reply */ - ); + ); if (err) { ++ret->num_error; invalid = 1; @@ -628,7 +644,7 @@ struct recptypes *validate_recipients(const char *supplied_recipients, const cha invalid = 1; } break; - case MES_INTERNET: + case EA_INTERNET: /* Yes, you're reading this correctly: if the target * domain points back to the local system, * the address is invalid. That's @@ -647,7 +663,7 @@ struct recptypes *validate_recipients(const char *supplied_recipients, const cha strcat(ret->recp_internet, this_recp); } break; - case MES_ERROR: + case EA_ERROR: ++ret->num_error; invalid = 1; break; -- 2.30.2