From: Art Cancro Date: Sun, 18 Sep 2005 19:34:26 +0000 (+0000) Subject: * When submitting a message, harvest non-local addresses for potential X-Git-Tag: v7.86~4629 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=8ecd1cb59874051ad1c6fe9b28045957ba087335 * When submitting a message, harvest non-local addresses for potential inclusion in a user's Collected Addresses book. Note: we don't actually do anything with these addresses yet. That comes next. --- diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 71dbb7a21..0722424db 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,9 @@ $Log$ +Revision 655.9 2005/09/18 19:34:26 ajc +* When submitting a message, harvest non-local addresses for potential + inclusion in a user's Collected Addresses book. Note: we don't actually + do anything with these addresses yet. That comes next. + Revision 655.8 2005/09/18 17:50:05 ajc * serv_network.c: use a stat() call to determine the mtime of spoolin, and skip the scan if it hasn't been touched since the last time we looked. @@ -7143,3 +7148,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index 0a0de73a1..0ec59ce34 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -356,6 +356,12 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) { processed = 1; } + else if (!strcasecmp(key, "CC")) { + if (msg->cm_fields['Y'] == NULL) + msg->cm_fields['Y'] = strdup(value); + processed = 1; + } + else if (!strcasecmp(key, "Message-ID")) { if (msg->cm_fields['I'] != NULL) { lprintf(CTDL_WARNING, "duplicate message id\n"); @@ -633,3 +639,71 @@ int CtdlDirectoryLookup(char *target, char *internet_addr, size_t targbuflen) { return(-1); } + + +/* + * Harvest any email addresses that someone might want to have in their + * "collected addresses" book. + */ +char *harvest_collected_addresses(struct CtdlMessage *msg) { + char *coll = NULL; + char addr[256]; + char user[256], node[256], name[256]; + int is_harvestable; + int i, j, h; + int field = 0; + + if (msg == NULL) return(NULL); + + is_harvestable = 1; + strcpy(addr, ""); + if (msg->cm_fields['A'] != NULL) { + strcat(addr, msg->cm_fields['A']); + } + if (msg->cm_fields['F'] != NULL) { + strcat(addr, " <"); + strcat(addr, msg->cm_fields['F']); + strcat(addr, ">"); + if (IsDirectory(msg->cm_fields['F'])) { + is_harvestable = 0; + } + } + + if (is_harvestable) { + coll = strdup(addr); + } + else { + coll = strdup(""); + } + + if (coll == NULL) return(NULL); + + /* Scan both the R (To) and Y (CC) fields */ + for (i = 0; i < 2; ++i) { + if (i == 0) field = 'R' ; + if (i == 1) field = 'Y' ; + + if (msg->cm_fields[field] != NULL) { + for (j=0; jcm_fields[field], ','); ++j) { + extract_token(addr, msg->cm_fields[field], j, ',', sizeof addr); + process_rfc822_addr(addr, user, node, name); + h = CtdlHostAlias(node); + if ( (h != hostalias_localhost) && (h != hostalias_directory) ) { + coll = realloc(coll, strlen(coll) + strlen(addr) + 4); + if (coll == NULL) return(NULL); + if (strlen(coll) > 0) { + strcat(coll, ","); + } + striplt(addr); + strcat(coll, addr); + } + } + } + } + + if (strlen(coll) == 0) { + free(coll); + return(NULL); + } + return(coll); +} diff --git a/citadel/internet_addressing.h b/citadel/internet_addressing.h index 6e7b227cf..009e73bae 100644 --- a/citadel/internet_addressing.h +++ b/citadel/internet_addressing.h @@ -24,6 +24,7 @@ void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr); int CtdlDirectoryLookup(char *target, char *internet_addr, size_t targbuflen); struct CtdlMessage *convert_internet_message(char *rfc822); int CtdlHostAlias(char *fqdn); +char *harvest_collected_addresses(struct CtdlMessage *msg); /* * Values that can be returned by CtdlHostAlias() diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 50aeaa1ae..59c11abb8 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -1479,19 +1479,15 @@ int CtdlOutputPreLoadedMsg( cprintf(">%s", nl); if (!is_room_aide() && (TheMessage->cm_anon_type == MES_ANONONLY)) { - // cprintf("From: x@x.org (----)%s", nl); cprintf("From: \"----\" %s", nl); } else if (!is_room_aide() && (TheMessage->cm_anon_type == MES_ANONOPT)) { - // cprintf("From: x@x.org (anonymous)%s", nl); cprintf("From: \"anonymous\" %s", nl); } else if (strlen(fuser) > 0) { - // cprintf("From: %s (%s)%s", fuser, luser, nl); cprintf("From: \"%s\" <%s>%s", luser, fuser, nl); } else { - // cprintf("From: %s@%s (%s)%s", suser, snode, luser, nl); cprintf("From: \"%s\" <%s@%s>%s", luser, suser, snode, nl); } @@ -2033,9 +2029,6 @@ int ReplicationChecks(struct CtdlMessage *msg) { - - - /* * Save a message to disk and submit it into the delivery system. */ @@ -2061,6 +2054,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ char *instr; struct ser_ret smr; char *hold_R, *hold_D; + char *collected_addresses = NULL; lprintf(CTDL_DEBUG, "CtdlSubmitMsg() called\n"); if (is_valid_message(msg) == 0) return(-1); /* self check */ @@ -2362,6 +2356,15 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ CtdlFreeMessage(imsg); } + /* + * Any addresses to collect? (FIXME do something with them!!) + */ + collected_addresses = harvest_collected_addresses(msg); + if (collected_addresses != NULL) { + lprintf(CTDL_DEBUG, "FIXME collected addresses: %s\n", collected_addresses); + free(collected_addresses); + } + return(newmsgid); } diff --git a/citadel/sysconfig.h b/citadel/sysconfig.h index 545ddfee1..895dc41c9 100644 --- a/citadel/sysconfig.h +++ b/citadel/sysconfig.h @@ -107,6 +107,7 @@ #define USERCALENDARROOM "Calendar" #define USERTASKSROOM "Tasks" #define USERCONTACTSROOM "Contacts" +#define USERCOLLECTEDROOM "Collected Addresses" #define USERNOTESROOM "Notes" #define PAGELOGROOM "Sent/Received Pages" #define SYSCONFIGROOM "Local System Configuration"