]> code.citadel.org Git - citadel.git/blobdiff - citadel/internet_addressing.c
Handle RFC822 'References:' field and Citadel W (Wefewences) field
[citadel.git] / citadel / internet_addressing.c
index 1b414be7de8e8d19f6cb6b820a19b59825175db0..6f28a69a336ff79376637ab89caa7fefebc08e3d 100644 (file)
@@ -336,7 +336,7 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) {
 
        else if (!strcasecmp(key, "From")) {
                process_rfc822_addr(value, user, node, name);
-               lprintf(CTDL_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
+               CtdlLogPrintf(CTDL_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);
@@ -366,7 +366,7 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) {
 
        else if (!strcasecmp(key, "Message-ID")) {
                if (msg->cm_fields['I'] != NULL) {
-                       lprintf(CTDL_WARNING, "duplicate message id\n");
+                       CtdlLogPrintf(CTDL_WARNING, "duplicate message id\n");
                }
 
                if (msg->cm_fields['I'] == NULL) {
@@ -397,12 +397,64 @@ int convert_field(struct CtdlMessage *msg, int beg, int end) {
                processed = 1;
        }
 
+       else if (!strcasecmp(key, "References")) {
+               if (msg->cm_fields['W'] != NULL) {
+                       free(msg->cm_fields['W']);
+               }
+               msg->cm_fields['W'] = strdup(value);
+               processed = 1;
+       }
+
+       else if (!strcasecmp(key, "In-reply-to")) {
+               if (msg->cm_fields['W'] == NULL) {              /* References: supersedes In-reply-to: */
+                       msg->cm_fields['W'] = strdup(value);
+               }
+               processed = 1;
+       }
+
+
+
        /* Clean up and move on. */
        free(key);      /* Don't free 'value', it's actually the same buffer */
        return(processed);
 }
 
 
+/*
+ * Convert RFC822 references format (References) to Citadel references format (Weferences)
+ */
+void convert_references_to_wefewences(char *str) {
+       int bracket_nesting = 0;
+       char *ptr = str;
+       char *moveptr = NULL;
+       char ch;
+
+       while(*ptr) {
+               ch = *ptr;
+               if (ch == '>') {
+                       --bracket_nesting;
+                       if (bracket_nesting < 0) bracket_nesting = 0;
+               }
+               if ((ch == '>') && (bracket_nesting == 0) && (*(ptr+1)) && (ptr>str) ) {
+                       *ptr = '|';
+                       ++ptr;
+               }
+               else if (bracket_nesting > 0) {
+                       ++ptr;
+               }
+               else {
+                       moveptr = ptr;
+                       while (*moveptr) {
+                               *moveptr = *(moveptr+1);
+                               ++moveptr;
+                       }
+               }
+               if (ch == '<') ++bracket_nesting;
+       }
+
+}
+
+
 /*
  * Convert an RFC822 message (headers + body) to a CtdlMessage structure.
  * NOTE: the supplied buffer becomes part of the CtdlMessage structure, and
@@ -484,6 +536,13 @@ struct CtdlMessage *convert_internet_message(char *rfc822) {
                msg->cm_fields['T'] = strdup(buf);
        }
 
+       /* If a W (references, or rather, Wefewences) field is present, we
+        * have to convert it from RFC822 format to Citadel format.
+        */
+       if (msg->cm_fields['W'] != NULL) {
+               convert_references_to_wefewences(msg->cm_fields['W']);
+       }
+
        return msg;
 }
 
@@ -560,7 +619,7 @@ void directory_key(char *key, char *addr) {
        }
        key[keylen++] = 0;
 
-       lprintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
+       CtdlLogPrintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
 }
 
 
@@ -603,7 +662,7 @@ void CtdlDirectoryInit(void) {
 void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
        char key[SIZ];
 
-       lprintf(CTDL_DEBUG, "Dir: %s --> %s\n",
+       CtdlLogPrintf(CTDL_DEBUG, "Dir: %s --> %s\n",
                internet_addr, citadel_addr);
        if (IsDirectory(internet_addr, 0) == 0) return;