X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Finternet_addressing.c;h=57c55b03dfe1f39719e04377273e0fc5edc6ba66;hb=68c5cc783b518571f3ab1d25179a1bcf7015a7ce;hp=b517871620a14f8967aa5ad5464c6283db7e0d88;hpb=aca7dd04d80f04b9cd61f740549ce370e76bc332;p=citadel.git diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index b51787162..57c55b03d 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -2,7 +2,7 @@ * This file contains functions which handle the mapping of Internet addresses * to users on the Citadel system. * - * 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. @@ -322,7 +322,7 @@ int CtdlHostAlias(char *fqdn) { */ int CtdlIsMe(char *addr, int addr_buf_len) { - recptypes *recp; + struct recptypes *recp; int i; recp = validate_recipients(addr, NULL, 0); @@ -375,17 +375,16 @@ void sanitize_truncated_recipient(char *str) * (What can I say, I'm in a weird mood today...) */ void remove_any_whitespace_to_the_left_or_right_of_at_symbol(char *name) { - unsigned int i; + char *ptr; + if (!name) return; - for (i = 0; i < strlen(name); ++i) { - if (name[i] == '@') { - while (isspace(name[i - 1]) && i > 0) { - strcpy(&name[i - 1], &name[i]); - --i; - } - while (isspace(name[i + 1])) { - strcpy(&name[i + 1], &name[i + 2]); - } + for (ptr=name; *ptr; ++ptr) { + while ( (isspace(*ptr)) && (*(ptr+1)=='@') ) { + strcpy(ptr, ptr+1); + if (ptr > name) --ptr; + } + while ( (*ptr=='@') && (*(ptr+1)!=0) && (isspace(*(ptr+1))) ) { + strcpy(ptr+1, ptr+2); } } } @@ -394,8 +393,7 @@ void remove_any_whitespace_to_the_left_or_right_of_at_symbol(char *name) { /* * Aliasing for network mail. */ -int alias(char *name) -{ /* process alias and routing info for mail */ +int alias(char *name) { /* process alias and routing info for mail */ int a; char aaa[SIZ]; int at = 0; @@ -458,16 +456,14 @@ int alias(char *name) * * Caller needs to free the result using free_recipients() */ -recptypes *validate_recipients(const char *supplied_recipients, const char *RemoteIdentifier, int Flags) { - struct CitContext *CCC = CC; - recptypes *ret; +struct recptypes *validate_recipients(const char *supplied_recipients, const char *RemoteIdentifier, int Flags) { + struct recptypes *ret; char *recipients = NULL; char *org_recp; char this_recp[256]; char this_recp_cooked[256]; char append[SIZ]; long len; - int num_recps = 0; int i, j; int mailtype; int invalid; @@ -479,11 +475,11 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo int in_quotes = 0; /* Initialize */ - ret = (recptypes *) malloc(sizeof(recptypes)); + ret = (struct recptypes *) malloc(sizeof(struct recptypes)); if (ret == NULL) return(NULL); /* Set all strings to null and numeric values to zero */ - memset(ret, 0, sizeof(recptypes)); + memset(ret, 0, sizeof(struct recptypes)); if (supplied_recipients == NULL) { recipients = strdup(""); @@ -522,7 +518,7 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo } /* Now start extracting recipients... */ - + Array *recp_array = array_new(1024); while (!IsEmptyStr(recipients)) { for (i=0; i<=strlen(recipients); ++i) { if (recipients[i] == '\"') in_quotes = 1 - in_quotes; @@ -542,8 +538,12 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo striplt(this_recp); if (IsEmptyStr(this_recp)) break; - syslog(LOG_DEBUG, "internet_addressing: evaluating recipient #%d: %s", num_recps, this_recp); - ++num_recps; + syslog(LOG_DEBUG, "internet_addressing: evaluating recipient: %s", this_recp); + array_append(recp_array, this_recp); + } + + for (int r=0; rrecp_room, this_recp); } - else if ( (!strncasecmp(this_recp, "room_", 5)) - && (!CtdlGetRoom(&tempQR, &this_recp_cooked[5])) ) { + else if ( (!strncasecmp(this_recp, "room_", 5)) && (!CtdlGetRoom(&tempQR, &this_recp_cooked[5])) ) { /* Save room so we can restore it later */ - tempQR2 = CCC->room; - CCC->room = tempQR; + tempQR2 = CC->room; + CC->room = tempQR; /* Check permissions to send mail to this room */ err = CtdlDoIHavePermissionToPostInThisRoom( @@ -605,7 +604,7 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo } /* Restore room in case something needs it */ - CCC->room = tempQR2; + CC->room = tempQR2; } else if (CtdlGetUser(&tempUS, this_recp) == 0) { @@ -691,6 +690,8 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo ); free(recipients); + array_free(recp_array); + return(ret); } @@ -698,7 +699,7 @@ recptypes *validate_recipients(const char *supplied_recipients, const char *Remo /* * Destructor for recptypes */ -void free_recipients(recptypes *valid) { +void free_recipients(struct recptypes *valid) { if (valid == NULL) { return; @@ -722,8 +723,7 @@ void free_recipients(recptypes *valid) { } -char *qp_encode_email_addrs(char *source) -{ +char *qp_encode_email_addrs(char *source) { char *user, *node, *name; const char headerStr[] = "=?UTF-8?Q?"; char *Encoded; @@ -758,20 +758,19 @@ char *qp_encode_email_addrs(char *source) free (AddrPtr), AddrPtr = ptr; ptr = (long *) malloc(sizeof (long) * nAddrPtrMax * 2); - memset(&ptr[nAddrPtrMax], 0, - sizeof (long) * nAddrPtrMax); + memset(&ptr[nAddrPtrMax], 0, sizeof (long) * nAddrPtrMax); memcpy (ptr, AddrUtf8, sizeof (long) * nAddrPtrMax); free (AddrUtf8), AddrUtf8 = ptr; nAddrPtrMax *= 2; } - if (((unsigned char) source[i] < 32) || - ((unsigned char) source[i] > 126)) { + if (((unsigned char) source[i] < 32) || ((unsigned char) source[i] > 126)) { need_to_encode = 1; AddrUtf8[nColons] = 1; } - if (source[i] == '"') + if (source[i] == '"') { InQuotes = !InQuotes; + } if (!InQuotes && source[i] == ',') { AddrPtr[nColons] = i; nColons++; @@ -801,28 +800,19 @@ char *qp_encode_email_addrs(char *source) for (i = 0; i < nColons && nPtr != NULL; i++) { nmax = EncodedMaxLen - (nPtr - Encoded); if (AddrUtf8[i]) { - process_rfc822_addr(&source[AddrPtr[i]], - user, - node, - name); + process_rfc822_addr(&source[AddrPtr[i]], user, node, name); /* TODO: libIDN here ! */ if (IsEmptyStr(name)) { - n = snprintf(nPtr, nmax, - (i==0)?"%s@%s" : ",%s@%s", - user, node); + n = snprintf(nPtr, nmax, (i==0)?"%s@%s" : ",%s@%s", user, node); } else { EncodedName = rfc2047encode(name, strlen(name)); - n = snprintf(nPtr, nmax, - (i==0)?"%s <%s@%s>" : ",%s <%s@%s>", - EncodedName, user, node); + n = snprintf(nPtr, nmax, (i==0)?"%s <%s@%s>" : ",%s <%s@%s>", EncodedName, user, node); free(EncodedName); } } else { - n = snprintf(nPtr, nmax, - (i==0)?"%s" : ",%s", - &source[AddrPtr[i]]); + n = snprintf(nPtr, nmax, (i==0)?"%s" : ",%s", &source[AddrPtr[i]]); } if (n > 0 ) nPtr += n; @@ -884,8 +874,7 @@ void unfold_rfc822_field(char **field, char **FieldEnd) else { if (*sField=='\"') quote = 1 - quote; if (!quote) { - if (isspace(*sField)) - { + if (isspace(*sField)) { *pField = ' '; pField++; sField++; @@ -909,8 +898,7 @@ void unfold_rfc822_field(char **field, char **FieldEnd) * Split an RFC822-style address into userid, host, and full name * */ -void process_rfc822_addr(const char *rfc822, char *user, char *node, char *name) -{ +void process_rfc822_addr(const char *rfc822, char *user, char *node, char *name) { int a; strcpy(user, ""); @@ -1005,7 +993,6 @@ void process_rfc822_addr(const char *rfc822, char *user, char *node, char *name) ) { strcpy(node, CtdlGetConfigStr("c_nodename")); } - else { /* strip anything to the left of a @ */ @@ -1104,10 +1091,12 @@ int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) { process_rfc822_addr(value, user, node, name); syslog(LOG_DEBUG, "internet_addressing: converted to <%s@%s> (%s)", user, node, name); snprintf(addr, sizeof(addr), "%s@%s", user, node); - if (CM_IsEmpty(msg, eAuthor) && !IsEmptyStr(name)) - CM_SetField(msg, eAuthor, name, strlen(name)); - if (CM_IsEmpty(msg, erFc822Addr) && !IsEmptyStr(addr)) - CM_SetField(msg, erFc822Addr, addr, strlen(addr)); + if (CM_IsEmpty(msg, eAuthor) && !IsEmptyStr(name)) { + CM_SetField(msg, eAuthor, name, -1); + } + if (CM_IsEmpty(msg, erFc822Addr) && !IsEmptyStr(addr)) { + CM_SetField(msg, erFc822Addr, addr, -1); + } processed = 1; } @@ -1416,7 +1405,8 @@ void directory_key(char *key, char *addr) { } -/* Return nonzero if the supplied address is in one of "our" domains +/* + * Return nonzero if the supplied address is in one of "our" domains */ int IsDirectory(char *addr, int allow_masq_domains) { char domain[256]; @@ -1668,6 +1658,7 @@ void AutoGenerateEmailAddressForUser(struct ctdluser *user) snprintf(synthetic_email_addr, sizeof synthetic_email_addr, "ctdl%08x@%s", i, CtdlGetConfigStr("c_fqdn")); } u = CtdlDirectoryLookup(NULL, synthetic_email_addr, 0); + syslog(LOG_DEBUG, "user_ops: address <%s> lookup returned <%d>", synthetic_email_addr, u); } CtdlSetEmailAddressesForUser(user->fullname, synthetic_email_addr);