X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Finternet_addressing.c;h=e1878423986b1efbc8898c41d6719208e9c38d2a;hb=2579891f090700c01844dff9a29e249eece3e529;hp=16e24233348e29d08bf8d006e74d2bba286fc594;hpb=5b1236258555cdd61892324ef62964faf703b41d;p=citadel.git diff --git a/citadel/internet_addressing.c b/citadel/internet_addressing.c index 16e242333..e18784239 100644 --- a/citadel/internet_addressing.c +++ b/citadel/internet_addressing.c @@ -45,25 +45,32 @@ char *inetcfg = NULL; /* * Return nonzero if the supplied name is an alias for this host. */ -int CtdlLocalHost(char *fqdn) { +int CtdlHostAlias(char *fqdn) { int config_lines; int i; char buf[256]; char host[256], type[256]; - if (!strcasecmp(fqdn, config.c_fqdn)) return(1); - if (inetcfg == NULL) return(0); + if (!strcasecmp(fqdn, config.c_fqdn)) return(hostalias_localhost); + if (inetcfg == NULL) return(hostalias_nomatch); config_lines = num_tokens(inetcfg, '\n'); for (i=0; iusernum)) { + return 0; + } + + for (a=0; afullname); ++a) { if (!strncasecmp(&us->fullname[a], matchstring, strlen(matchstring))) { @@ -283,16 +296,24 @@ int convert_internet_address(char *destuser, char *desthost, char *source) char name[256]; struct quickroom qrbuf; int i; + int hostalias; struct trynamebuf tnb; + char buf[256]; /* Split it up */ process_rfc822_addr(source, user, node, name); /* Map the FQDN to a Citadel node name - * FIX ... we have to check for gateway domains */ - if (CtdlLocalHost(node)) { - strcpy(node, config.c_nodename); + hostalias = CtdlHostAlias(node); + switch(hostalias) { + case hostalias_localhost: + strcpy(node, config.c_nodename); + break; + + case hostalias_gatewaydomain: + extract_token(buf, node, 0, '.'); + safestrncpy(node, buf, sizeof buf); } /* Now try to resolve the name @@ -346,7 +367,11 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) { int colonpos = (-1); int processed = 0; char buf[256]; - char *user, *node, *name; + char user[1024]; + char node[1024]; + char name[1024]; + char addr[1024]; + time_t parsed_date; rfc822 = msg->cm_fields['M']; /* M field contains rfc822 text */ for (i = end; i >= beg; --i) { @@ -363,33 +388,33 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) { lprintf(9, "Key=<%s> Value=<%s>\n", key, value); - /* Here's the big rfc822-to-citadel loop. */ + /* + * Here's the big rfc822-to-citadel loop. + */ + /* Date/time is converted into a unix timestamp. If the conversion + * fails, we replace it with the time the message arrived locally. + */ if (!strcasecmp(key, "Date")) { - sprintf(buf, "%ld", parsedate(value) ); + parsed_date = parsedate(value); + if (parsed_date < 0L) parsed_date = time(NULL); + lprintf(9, "Parsed date is %s", + asctime(localtime(&parsed_date))); + sprintf(buf, "%ld", parsed_date ); if (msg->cm_fields['T'] == NULL) msg->cm_fields['T'] = strdoop(buf); processed = 1; } else if (!strcasecmp(key, "From")) { - user = mallok(1024); - node = mallok(1024); - name = mallok(1024); process_rfc822_addr(value, user, node, name); lprintf(9, "Converted to <%s@%s> (%s)\n", user, node, name); + sprintf(addr, "%s@%s", user, node); if (msg->cm_fields['A'] == NULL) - msg->cm_fields['A'] = user; - else - phree(user); - if (msg->cm_fields['N'] == NULL) - msg->cm_fields['N'] = node; - else - phree(node); - if (msg->cm_fields['H'] == NULL) - msg->cm_fields['H'] = name; - else - phree(name); + msg->cm_fields['A'] = strdoop(name); + processed = 1; + if (msg->cm_fields['F'] == NULL) + msg->cm_fields['F'] = strdoop(addr); processed = 1; } @@ -453,12 +478,11 @@ struct CtdlMessage *convert_internet_message(char *rfc822) { /* At this point we have a field. Are we interested in it? */ converted = convert_field(msg, beg, end); - /****** + /* Strip the field out of the RFC822 header if we used it */ if (converted) { strcpy(&rfc822[beg], &rfc822[pos]); pos = beg; } - ********/ /* If we've hit the end of the message, bail out */ if (pos > strlen(rfc822)) done = 1;