]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
Extracting the 'To:' header from the replying_to message now works.
[citadel.git] / webcit / messages.c
index 231d98eef54d9c3a4d8479fab8f310618d2994a1..61a7b0801bf884eec52ae37fbf445f381bd7d3f7 100644 (file)
@@ -46,7 +46,6 @@ int load_message(message_summary *Msg,
                 StrBuf *FoundCharset,
                 StrBuf **Error)
 {
-       wcsession *WCC = WC;
        StrBuf *Buf;
        StrBuf *HdrToken;
        headereval *Hdr;
@@ -161,38 +160,6 @@ int load_message(message_summary *Msg,
        /* now we put the body mimepart we read above into the mimelist */
        Put(Msg->AllAttach, SKEY(Msg->MsgBody->PartNum), Msg->MsgBody, DestroyMime);
        
-       /* Generate a reply-to address */
-       if (StrLength(Msg->Rfca) > 0) {
-               if (Msg->reply_to == NULL)
-                       Msg->reply_to = NewStrBuf();
-               if (StrLength(Msg->from) > 0) {
-                       StrBufPrintf(Msg->reply_to, "%s <%s>", ChrPtr(Msg->from), ChrPtr(Msg->Rfca));
-               }
-               else {
-                       FlushStrBuf(Msg->reply_to);
-                       StrBufAppendBuf(Msg->reply_to, Msg->Rfca, 0);
-               }
-       }
-       else 
-       {
-               if ((StrLength(Msg->OtherNode)>0) && 
-                   (strcasecmp(ChrPtr(Msg->OtherNode), ChrPtr(WCC->serv_info->serv_nodename))) &&
-                   (strcasecmp(ChrPtr(Msg->OtherNode), ChrPtr(WCC->serv_info->serv_humannode)) ))
-               {
-                       if (Msg->reply_to == NULL)
-                               Msg->reply_to = NewStrBuf();
-                       StrBufPrintf(Msg->reply_to, 
-                                    "%s @ %s",
-                                    ChrPtr(Msg->from), 
-                                    ChrPtr(Msg->OtherNode));
-               }
-               else {
-                       if (Msg->reply_to == NULL)
-                               Msg->reply_to = NewStrBuf();
-                       FlushStrBuf(Msg->reply_to);
-                       StrBufAppendBuf(Msg->reply_to, Msg->from, 0);
-               }
-       }
        FreeStrBuf(&Buf);
        FreeStrBuf(&HdrToken);
        return 1;
@@ -941,7 +908,7 @@ void post_mime_to_server(void) {
                text_to_server_qp(txtmail);     /* Transmit message in quoted-printable encoding */
                free(txtmail);
 
-               serv_printf("--%s", alt_boundary);
+               serv_printf("\n--%s", alt_boundary);
        }
 
        serv_puts("Content-type: text/html; charset=utf-8");
@@ -1322,6 +1289,7 @@ void display_enter(void)
        int recipient_bad = 0;
        int is_anonymous = 0;
        wcsession *WCC = WC;
+       int i = 0;
 
        now = time(NULL);
 
@@ -1380,6 +1348,105 @@ void display_enter(void)
                return;
        }
 
+
+       /*
+        * If the "replying_to" variable is set, it refers to a message
+        * number from which we must extract some header fields...
+        */
+       long replying_to = lbstr("replying_to");
+       if (replying_to > 0) {
+               char wefw[1024] = "";
+               char msgn[256] = "";
+               char from[256] = "";
+               char node[256] = "";
+               char rfca[256] = "";
+               serv_printf("MSG0 %ld|1", replying_to); 
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+                       if ( (!strncasecmp(buf, "subj=", 5)) && (strlen(buf) > 5) ) {
+                               StrBuf *subj = NewStrBuf();
+                               if (!strcasecmp(bstr("replying_mode"), "forward")) {
+                                       if (strncasecmp(&buf[5], "Fw:", 3)) {
+                                               StrBufAppendBufPlain(subj, HKEY("Fw: "), 0);
+                                       }
+                               }
+                               else {
+                                       if (strncasecmp(&buf[5], "Re:", 3)) {
+                                               StrBufAppendBufPlain(subj, HKEY("Re: "), 0);
+                                       }
+                               }
+                               StrBufAppendBufPlain(subj, &buf[5], -1, 0);
+                               PutBstr(HKEY("subject"), subj);
+                       }
+
+                       else if (!strncasecmp(buf, "wefw=", 5)) {
+                               safestrncpy(wefw, &buf[5], sizeof wefw);
+
+                               /* Trim down excessively long lists of thread references.  We eliminate the
+                                * second one in the list so that the thread root remains intact.
+                                */
+                               int rrtok = num_tokens(wefw, '|');
+                               int rrlen = strlen(wefw);
+                               if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+                                       remove_token(wefw, 1, '|');
+                               }
+                       }
+
+                       else if (!strncasecmp(buf, "msgn=", 5)) {
+                               safestrncpy(msgn, &buf[5], sizeof msgn);
+                       }
+
+                       else if (!strncasecmp(buf, "from=", 5)) {
+                               safestrncpy(from, &buf[5], sizeof from);
+                               for (i=0; i<strlen(from); ++i) {
+                                       if (from[i] == ',') from[i] = ' ';
+                               }
+                       }
+
+                       else if (!strncasecmp(buf, "node=", 5)) {
+                               safestrncpy(node, &buf[5], sizeof node);
+                       }
+
+                       else if (!strncasecmp(buf, "rfca=", 5)) {
+                               safestrncpy(rfca, &buf[5], sizeof rfca);
+                       }
+
+               }
+
+               if (strlen(wefw) + strlen(msgn) > 0) {
+                       StrBuf *refs = NewStrBuf();
+                       if (!IsEmptyStr(wefw)) {
+                               StrBufAppendBufPlain(refs, wefw, -1, 0);
+                       }
+                       if ( (!IsEmptyStr(wefw)) && (!IsEmptyStr(msgn)) ) {
+                               StrBufAppendBufPlain(refs, HKEY("|"), 0);
+                       }
+                       if (!IsEmptyStr(msgn)) {
+                               StrBufAppendBufPlain(refs, msgn, -1, 0);
+                       }
+                       PutBstr(HKEY("references"), refs);
+               }
+
+               if (    (!strcasecmp(bstr("replying_mode"), "reply"))
+                       || (!strcasecmp(bstr("replying_mode"), "replyall"))
+               ) {
+                       StrBuf *to_rcpt = NewStrBuf();
+                       if (!IsEmptyStr(rfca)) {
+                               StrBufAppendPrintf(to_rcpt, "%s <%s>", from, rfca);
+                       }
+                       else {
+                               StrBufAppendPrintf(to_rcpt, "%s", from);
+                               if (    (!IsEmptyStr(node))
+                                       && (strcasecmp(node, ChrPtr(WC->serv_info->serv_nodename)))
+                               ) {
+                                       StrBufAppendPrintf(to_rcpt, " @ %s", node);
+                               }
+                       }
+                       PutBstr(HKEY("recp"), to_rcpt);
+               }
+       }
+
        /*
         * Otherwise proceed normally.
         * Do a custom room banner with no navbar...