/*
- * $Id$
- *
* This file contains functions which handle the mapping of Internet addresses
* to users on the Citadel system.
*/
sField < pFieldEnd;
pField++, sField++)
{
- if (*pField=='\"') quote = 1 - quote;
- if (!quote) {
- if (isspace(*sField))
- {
- *pField = ' ';
- pField++;
- sField++;
-
- while ((sField < pFieldEnd) &&
- isspace(*sField))
+ if ((*sField=='\r') || (*sField=='\n')) {
+ sField++;
+ if (*sField == '\n')
+ sField++;
+ *pField = *sField;
+ }
+ else {
+ if (*sField=='\"') quote = 1 - quote;
+ if (!quote) {
+ if (isspace(*sField))
+ {
+ *pField = ' ';
+ pField++;
sField++;
+
+ while ((sField < pFieldEnd) &&
+ isspace(*sField))
+ sField++;
+ *pField = *sField;
+ }
+ else *pField = *sField;
}
+ else *pField = *sField;
}
- else *pField = *sField;
}
*pField = '\0';
*FieldEnd = pField - 1;
valueend = key + len;
* ( key + (colonpos - beg) ) = '\0';
value = &key[(colonpos - beg) + 1];
+/* printf("Header: [%s]\nValue: [%s]\n", key, value); */
unfold_rfc822_field(&value, &valueend);
valuelen = valueend - value + 1;
+/* printf("UnfoldedValue: [%s]\n", value); */
/*
* Here's the big rfc822-to-citadel loop.
else if (!strcasecmp(key, "From")) {
process_rfc822_addr(value, user, node, name);
- CtdlLogPrintf(CTDL_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
+ syslog(LOG_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
snprintf(addr, sizeof addr, "%s@%s", user, node);
if (msg->cm_fields['A'] == NULL)
msg->cm_fields['A'] = strdup(name);
- processed = 1;
if (msg->cm_fields['F'] == NULL)
msg->cm_fields['F'] = strdup(addr);
processed = 1;
else if (!strcasecmp(key, "Message-ID")) {
if (msg->cm_fields['I'] != NULL) {
- CtdlLogPrintf(CTDL_WARNING, "duplicate message id\n");
+ syslog(LOG_WARNING, "duplicate message id\n");
}
if (msg->cm_fields['I'] == NULL) {
processed = 1;
}
+ else if (!strcasecmp(key, "Reply-To")) {
+ if (msg->cm_fields['K'] != NULL) {
+ free(msg->cm_fields['K']);
+ }
+ msg->cm_fields['K'] = strndup(value, valuelen);
+ processed = 1;
+ }
+
else if (!strcasecmp(key, "In-reply-to")) {
if (msg->cm_fields['W'] == NULL) { /* References: supersedes In-reply-to: */
msg->cm_fields['W'] = strndup(value, valuelen);
(done == 0) )
{
- if ((*pos=='\n') &&
- (!isspace(*(pos+1))))
+ if ( (*pos=='\n') && ((*(pos+1))!=0x20) && ((*(pos+1))!=0x09) )
{
end = pos;
}
/* Strip the field out of the RFC822 header if we used it */
if (!converted) {
StrBufAppendBufPlain(OtherHeaders, beg, end - beg, 0);
+ StrBufAppendBufPlain(OtherHeaders, HKEY("\n"), 0);
}
/* If we've hit the end of the message, bail out */
* The caller is responsible for freeing the returned buffer. If the requested
* field is not present, or anything else goes wrong, it returns NULL.
*/
-char *rfc822_fetch_field(char *rfc822, const char *fieldname) {
+char *rfc822_fetch_field(const char *rfc822, const char *fieldname) {
char *fieldbuf = NULL;
const char *end_of_headers;
const char *field_start;
snprintf(fieldhdr, sizeof fieldhdr, "%s:", fieldname);
/* Locate the end of the headers, so we don't run past that point */
- end_of_headers = bmstrcasestr(rfc822, "\n\r\n");
+ end_of_headers = cbmstrcasestr(rfc822, "\n\r\n");
if (end_of_headers == NULL) {
- end_of_headers = bmstrcasestr(rfc822, "\n\n");
+ end_of_headers = cbmstrcasestr(rfc822, "\n\n");
}
if (end_of_headers == NULL) return (NULL);
- field_start = bmstrcasestr(rfc822, fieldhdr);
+ field_start = cbmstrcasestr(rfc822, fieldhdr);
if (field_start == NULL) return(NULL);
if (field_start > end_of_headers) return(NULL);
strcpy(fieldbuf, "");
ptr = field_start;
- ptr = memreadline(ptr, fieldbuf, SIZ-strlen(fieldbuf) );
+ ptr = cmemreadline(ptr, fieldbuf, SIZ-strlen(fieldbuf) );
while ( (isspace(ptr[0])) && (ptr < end_of_headers) ) {
strcat(fieldbuf, " ");
cont = &fieldbuf[strlen(fieldbuf)];
- ptr = memreadline(ptr, cont, SIZ-strlen(fieldbuf) );
+ ptr = cmemreadline(ptr, cont, SIZ-strlen(fieldbuf) );
striplt(cont);
}
}
key[keylen++] = 0;
- CtdlLogPrintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
+ syslog(LOG_DEBUG, "Directory key is <%s>\n", key);
}
/*
* Add an Internet e-mail address to the directory for a user
*/
-void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
- if (IsDirectory(internet_addr, 0) == 0) return;
- CtdlLogPrintf(CTDL_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
+ if (IsDirectory(internet_addr, 0) == 0)
+ return 0;
+ syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 );
+ return 1;
}
* (NOTE: we don't actually use or need the citadel_addr variable; it's merely
* here because the callback API expects to be able to send it.)
*/
-void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
- CtdlLogPrintf(CTDL_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
+ syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
- cdb_delete(CDB_DIRECTORY, key, strlen(key) );
+ return cdb_delete(CDB_DIRECTORY, key, strlen(key) ) == 0;
}