]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
Initial implementation of the 'replying_to=' method for extracting Subject and Refere...
[citadel.git] / webcit / messages.c
index 2cda9c6b008f0bf715491bc8c424b043452cfdfd..049b1f10f7cb29adc23d2e46d9c2b8e3bfeb4681 100644 (file)
@@ -1,5 +1,21 @@
 /*
  * Functions which deal with the fetching and displaying of messages.
+ *
+ * Copyright (c) 1996-2011 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
 #include "webcit.h"
@@ -30,7 +46,6 @@ int load_message(message_summary *Msg,
                 StrBuf *FoundCharset,
                 StrBuf **Error)
 {
-       wcsession *WCC = WC;
        StrBuf *Buf;
        StrBuf *HdrToken;
        headereval *Hdr;
@@ -52,7 +67,7 @@ int load_message(message_summary *Msg,
                *Error = NewStrBuf();
                StrBufAppendPrintf(*Error, "<strong>");
                StrBufAppendPrintf(*Error, _("ERROR:"));
-               StrBufAppendPrintf(*Error, "</strong> %s<br />\n", &buf[4]);
+               StrBufAppendPrintf(*Error, "</strong> %s<br>\n", &buf[4]);
                FreeStrBuf(&Buf);
                return 0;
        }
@@ -70,7 +85,7 @@ int load_message(message_summary *Msg,
                                Msg->MsgBody->ContentType = NewStrBufPlain(HKEY("text/html"));
                                StrBufAppendPrintf(Msg->MsgBody->Data, "<div><i>");
                                StrBufAppendPrintf(Msg->MsgBody->Data, _("Empty message"));
-                               StrBufAppendPrintf(Msg->MsgBody->Data, "</i><br /><br />\n");
+                               StrBufAppendPrintf(Msg->MsgBody->Data, "</i><br><br>\n");
                                StrBufAppendPrintf(Msg->MsgBody->Data, "</div>\n");
                        }
                        break;
@@ -84,9 +99,6 @@ int load_message(message_summary *Msg,
                        StrBufExtract_token(HdrToken, Buf, 0, '=');
                        StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
                        
-#ifdef TECH_PREVIEW
-                       if (dbg_analyze_msg) lprintf(1, ":: [%s] = [%s]\n", ChrPtr(HdrToken), ChrPtr(Buf));
-#endif
                        /* look up one of the examine_* functions to parse the content */
                        if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
                            (vHdr != NULL)) {
@@ -115,9 +127,6 @@ int load_message(message_summary *Msg,
                                StrBufExtract_token(HdrToken, Buf, 0, ':');
                                if (StrLength(HdrToken) > 0) {
                                        StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
-#ifdef TECH_PREVIEW
-                                       if (dbg_analyze_msg) lprintf(1, ":: [%s] = [%s]\n", ChrPtr(HdrToken), ChrPtr(Buf));
-#endif
                                        /* the examine*'s know how to do with mime headers too... */
                                        if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
                                            (vHdr != NULL)) {
@@ -151,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;
@@ -475,22 +452,6 @@ void print_message(void) {
        wDumpContent(0);
 }
 
-/* 
- * Mobile browser view of message
- */
-void mobile_message_view(void) 
-{
-       long msgnum = 0L;
-       const StrBuf *Mime;
-  
-       msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/');
-       output_headers(1, 0, 0, 0, 0, 1);
-       begin_burst();
-       do_template("msgcontrols", NULL);
-       read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime);
-       wDumpContent(0);
-}
-
 /*
  * Display a message's headers
  */
@@ -543,8 +504,10 @@ message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSu
        Msg = (message_summary*)malloc(sizeof(message_summary));
        memset(Msg, 0, sizeof(message_summary));
        while (len = StrBuf_ServGetln(Buf),
+              (len >= 0) && 
               ((len != 3)  ||
-               strcmp(ChrPtr(Buf), "000")== 0)){
+               strcmp(ChrPtr(Buf), "000")))
+       {
                buf = ChrPtr(Buf);
                ebuf = strchr(ChrPtr(Buf), '=');
                nBuf = ebuf - buf;
@@ -553,7 +516,7 @@ message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSu
                        StrBufCutLeft(Buf, nBuf + 1);
                        Eval->f(Msg, Buf);
                }
-               else lprintf(1, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
+               else syslog(1, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
        }
        return Msg;
 }
@@ -595,7 +558,10 @@ int load_msg_ptrs(const char *servcmd,
                return (Stat->nummsgs);
        }
        Buf2 = NewStrBuf();
-       while (len = StrBuf_ServGetln(Buf), ((len != 3) || strcmp(ChrPtr(Buf), "000")!= 0))
+       while (len = StrBuf_ServGetln(Buf), 
+              ((len >= 0) &&
+               ((len != 3) || 
+                strcmp(ChrPtr(Buf), "000")!= 0)))
        {
                if (Stat->nummsgs < Stat->maxload) {
                        skipit = 0;
@@ -749,6 +715,11 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer)
                return;
        }
 
+       if (WCC->CurRoom.view == VIEW_WIKI) {
+               http_redirect("wiki?page=home");
+               return;
+       }
+
        memset(&Stat, 0, sizeof(SharedMessageStatus));
        Stat.maxload = 10000;
        Stat.lowest_found = (-1);
@@ -937,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");
@@ -1051,7 +1022,7 @@ void post_message(void)
                        if (GetServerStatus(Buf, NULL) != 2) {
                                /* You probably don't even have a dumb Drafts folder */
                                StrBufCutLeft(Buf, 4);
-                               lprintf(9, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf));
+                               syslog(9, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf));
                                StrBufAppendBufPlain(WCC->ImportantMsg, _("Saved to Drafts failed: "), -1, 0);
                                StrBufAppendBuf(WCC->ImportantMsg, Buf, 0);
                                display_enter();
@@ -1124,7 +1095,7 @@ void post_message(void)
                }
                else 
                {
-                       lprintf(9, "%s\n", ChrPtr(CmdBuf));
+                       syslog(9, "%s\n", ChrPtr(CmdBuf));
                        serv_puts(ChrPtr(CmdBuf));
                        FreeStrBuf(&CmdBuf);
 
@@ -1162,7 +1133,7 @@ void post_message(void)
                        } else {
                                StrBufCutLeft(Buf, 4);
 
-                               lprintf(9, "%s:%d: server post error: %s\n", __FILE__, __LINE__, ChrPtr(Buf));
+                               syslog(9, "%s:%d: server post error: %s\n", __FILE__, __LINE__, ChrPtr(Buf));
                                StrBufAppendBuf(WCC->ImportantMsg, Buf, 0);
                                if (save_to_drafts) gotoroom(WCC->CurRoom.name);
                                display_enter();
@@ -1215,16 +1186,16 @@ void upload_attachment(void) {
        void *v;
        wc_mime_attachment *att;
 
-       lprintf(9, "upload_attachment()\n");
+       syslog(9, "upload_attachment()\n");
        wc_printf("upload_attachment()<br>\n");
 
        if (WCC->upload_length <= 0) {
-               lprintf(9, "ERROR no attachment was uploaded\n");
+               syslog(9, "ERROR no attachment was uploaded\n");
                wc_printf("ERROR no attachment was uploaded<br>\n");
                return;
        }
 
-       lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length);
+       syslog(9, "Client is uploading %d bytes\n", WCC->upload_length);
        wc_printf("Client is uploading %d bytes<br>\n", WCC->upload_length);
        att = malloc(sizeof(wc_mime_attachment));
        memset(att, 0, sizeof(wc_mime_attachment ));
@@ -1269,6 +1240,41 @@ void upload_attachment(void) {
 }
 
 
+/*
+ * Remove an attachment from the message currently being composed.
+ *
+ * Currently we identify the attachment to be removed by its filename.
+ * There is probably a better way to do this.
+ */
+void remove_attachment(void) {
+       wcsession *WCC = WC;
+       wc_mime_attachment *att;
+       void *vAtt;
+       StrBuf *WhichAttachment;
+       HashPos *at;
+       long len;
+       const char *key;
+
+       WhichAttachment = NewStrBufDup(sbstr("which_attachment"));
+       StrBufUnescape(WhichAttachment, 0);
+       at = GetNewHashPos(WCC->attachments, 0);
+       do {
+               GetHashPos(WCC->attachments, at, &len, &key, &vAtt);
+       
+               att = (wc_mime_attachment*) vAtt;
+               if ((att != NULL) && 
+                   (strcmp(ChrPtr(WhichAttachment), 
+                           ChrPtr(att->FileName)   ) == 0))
+               {
+                       DeleteEntryFromHash(WCC->attachments, at);
+                       break;
+               }
+       }
+       while (NextHashPos(WCC->attachments, at));
+       FreeStrBuf(&WhichAttachment);
+       wc_printf("remove_attachment() completed\n");
+}
+
 
 /*
  * display the message entry screen
@@ -1341,6 +1347,62 @@ 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[1024] = "";
+               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 (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);
+                       }
+
+               }
+
+               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);
+               }
+       }
+
        /*
         * Otherwise proceed normally.
         * Do a custom room banner with no navbar...
@@ -1387,7 +1449,7 @@ void display_enter(void)
                        }
                }
                else if (buf[0] != '2') {       /* Any other error means that we cannot continue */
-                       wc_printf("<em>%s</em><br />\n", &buf[4]);      /* TODO -> important message */
+                       wc_printf("<em>%s</em><br>\n", &buf[4]);        /* TODO -> important message */
                        return;
                }
        }
@@ -1474,7 +1536,7 @@ void confirm_move_msg(void)
        wc_printf("<CENTER>");
 
        wc_printf(_("Move this message to:"));
-       wc_printf("<br />\n");
+       wc_printf("<br>\n");
 
        wc_printf("<form METHOD=\"POST\" action=\"move_msg\">\n");
        wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
@@ -1492,7 +1554,7 @@ void confirm_move_msg(void)
                }
        }
        wc_printf("</SELECT>\n");
-       wc_printf("<br />\n");
+       wc_printf("<br>\n");
 
        wc_printf("<INPUT TYPE=\"submit\" NAME=\"move_button\" VALUE=\"%s\">", _("Move"));
        wc_printf("&nbsp;");
@@ -1797,7 +1859,6 @@ InitModule_MSG
        WebcitAddUrlHandler(HKEY("msg"), "", 0, embed_message, NEED_URL);
        WebcitAddUrlHandler(HKEY("message"), "", 0, handle_one_message, NEED_URL|XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
        WebcitAddUrlHandler(HKEY("printmsg"), "", 0, print_message, NEED_URL);
-       WebcitAddUrlHandler(HKEY("mobilemsg"), "", 0, mobile_message_view, NEED_URL);
        WebcitAddUrlHandler(HKEY("msgheaders"), "", 0, display_headers, NEED_URL);
 
        WebcitAddUrlHandler(HKEY("mimepart"), "", 0, view_mimepart, NEED_URL);
@@ -1805,6 +1866,7 @@ InitModule_MSG
        WebcitAddUrlHandler(HKEY("postpart"), "", 0, view_postpart, NEED_URL|PROHIBIT_STARTPAGE);
        WebcitAddUrlHandler(HKEY("postpart_download"), "", 0, download_postpart, NEED_URL|PROHIBIT_STARTPAGE);
        WebcitAddUrlHandler(HKEY("upload_attachment"), "", 0, upload_attachment, AJAX);
+       WebcitAddUrlHandler(HKEY("remove_attachment"), "", 0, remove_attachment, AJAX);
        WebcitAddUrlHandler(HKEY("show_num_attachments"), "", 0, show_num_attachments, AJAX);
 
        /* json */