]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
Reworking the enter message and attach dialogs
[citadel.git] / webcit / messages.c
index d09c88f9e76e10061d632b54c8c6bed069ea4d09..88faa7b2e323783abc36a34c4c847449ce13f80c 100644 (file)
@@ -1,8 +1,5 @@
 /*
- * $Id$
- *
  * Functions which deal with the fetching and displaying of messages.
- *
  */
 
 #include "webcit.h"
@@ -43,7 +40,6 @@ int load_message(message_summary *Msg,
        int state=0;
        
        Buf = NewStrBuf();
-       lprintf(9, "MSG4 %ld|%s\n", Msg->msgnum, ChrPtr(Msg->PartNum));
        if (Msg->PartNum != NULL) {
                serv_printf("MSG4 %ld|%s", Msg->msgnum, ChrPtr(Msg->PartNum));
        }
@@ -69,13 +65,12 @@ int load_message(message_summary *Msg,
                {
                        Done = 1;
                        if (state < 2) {
-                               lprintf(1, _("unexpected end of message"));
                                if (Msg->MsgBody->Data == NULL)
                                        Msg->MsgBody->Data = NewStrBuf();
                                Msg->MsgBody->ContentType = NewStrBufPlain(HKEY("text/html"));
                                StrBufAppendPrintf(Msg->MsgBody->Data, "<div><i>");
-                               StrBufAppendPrintf(Msg->MsgBody->Data, _("unexpected end of message"));
-                               StrBufAppendPrintf(Msg->MsgBody->Data, " (1)</i><br /><br />\n");
+                               StrBufAppendPrintf(Msg->MsgBody->Data, _("Empty message"));
+                               StrBufAppendPrintf(Msg->MsgBody->Data, "</i><br /><br />\n");
                                StrBufAppendPrintf(Msg->MsgBody->Data, "</div>\n");
                        }
                        break;
@@ -651,29 +646,41 @@ int load_msg_ptrs(const char *servcmd,
 }
 
 
-inline message_summary* GetMessagePtrAt(int n, HashList *Summ)
+
+/**
+ * \brief sets FlagToSet for each of ScanMe that appears in MatchMSet
+ * \param ScanMe List of BasicMsgStruct to be searched it MatchSet
+ * \param MatchMSet MSet we want to flag
+ * \param FlagToSet Flag to set on each BasicMsgStruct->Flags if in MSet
+ */
+void SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse)
 {
-       const char *Key;
+       const char *HashKey;
        long HKLen;
+       HashPos *at;
        void *vMsg;
+       message_summary *Msg;
 
-       if (Summ == NULL)
-               return NULL;
-       GetHashAt(Summ, n, &HKLen, &Key, &vMsg);
-       return (message_summary*) vMsg;
+       at = GetNewHashPos(ScanMe, 0);
+       while (GetNextHashPos(ScanMe, at, &HKLen, &HashKey, &vMsg)) {
+               /* Are you a new message, or an old message? */
+               Msg = (message_summary*) vMsg;
+               if (Reverse && IsInMSetList(MatchMSet, Msg->msgnum)) {
+                       Msg->Flags = Msg->Flags | FlagToSet;
+               }
+               else if (!Reverse && !IsInMSetList(MatchMSet, Msg->msgnum)) {
+                       Msg->Flags = Msg->Flags | FlagToSet;
+               }
+       }
+       DeleteHashPos(&at);
 }
 
 
-
 void load_seen_flags(void)
 {
-       message_summary *Msg;
-       const char *HashKey;
-       long HKLen;
-       HashPos *at;
-       void *vMsg;
        StrBuf *OldMsg;
        wcsession *WCC = WC;
+       MSet *MatchMSet;
 
        OldMsg = NewStrBuf();
        serv_puts("GTSN");
@@ -685,19 +692,13 @@ void load_seen_flags(void)
                FreeStrBuf(&OldMsg);
                return;
        }
-       at = GetNewHashPos(WCC->summ, 0);
-       while (GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) {
-               /* Are you a new message, or an old message? */
-               Msg = (message_summary*) vMsg;
-               if (is_msg_in_mset(ChrPtr(OldMsg), Msg->msgnum)) {
-                       Msg->is_new = 0;
-               }
-               else {
-                       Msg->is_new = 1;
-               }
+
+       if (ParseMSet(&MatchMSet, OldMsg))
+       {
+               SetFlagsFromMSet(WCC->summ, MatchMSet, MSGFLAG_READ, 0);
        }
+       DeleteMSet(&MatchMSet);
        FreeStrBuf(&OldMsg);
-       DeleteHashPos(&at);
 }
 
 extern readloop_struct rlid[];
@@ -823,9 +824,15 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer)
        WCC->num_displayed = 0;
 
        /* Put some helpful data in vars for mailsummary_json */
-       svputlong("READLOOP:TOTALMSGS", Stat.nummsgs);
-       svputlong("READLOOP:STARTMSG", Stat.startmsg);
-       svputlong("WCVIEW", WCC->CurRoom.view);
+       {
+               StrBuf *Foo;
+               
+               Foo = NewStrBuf ();
+               StrBufPrintf(Foo, "%ld", Stat.nummsgs);
+               PutBstr(HKEY("__READLOOP:TOTALMSGS"), NewStrBufDup(Foo));
+               StrBufPrintf(Foo, "%ld", Stat.startmsg);
+               PutBstr(HKEY("__READLOOP:STARTMSG"), Foo);
+       }
 
        /*
         * iterate over each message. if we need to load an attachment, do it here. 
@@ -839,7 +846,11 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer)
                while ( GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) {
                        Msg = (message_summary*) vMsg;          
                        if ((Msg->msgnum >= Stat.startmsg) && (Stat.num_displayed <= Stat.maxmsgs)) {
-                               ViewMsg->LoadMsgFromServer(&Stat, &ViewSpecific, Msg, Msg->is_new, i);
+                               ViewMsg->LoadMsgFromServer(&Stat, 
+                                                          &ViewSpecific, 
+                                                          Msg, 
+                                                          (Msg->Flags & MSGFLAG_READ) != 0, 
+                                                          i);
                        } 
                        i++;
                }
@@ -988,6 +999,9 @@ void post_mime_to_server(void) {
  */
 void post_message(void)
 {
+       StrBuf *UserName;
+       StrBuf *EmailAddress;
+       StrBuf *EncBuf;
        char buf[1024];
        StrBuf *encoded_subject = NULL;
        static long dont_post = (-1L);
@@ -1012,7 +1026,9 @@ void post_message(void)
        if (WCC->upload_length > 0) {
                const char *pch;
                int n;
-               char N[64];
+               const char *newn;
+               long newnlen;
+               void *v;
 
                /* There's an attachment.  Save it to this struct... */
                lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length);
@@ -1020,15 +1036,20 @@ void post_message(void)
                memset(att, 0, sizeof(wc_mime_attachment ));
                att->length = WCC->upload_length;
                att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1);
-               att->FileName = NewStrBufPlain(WCC->upload_filename, -1);
+               att->FileName = NewStrBufDup(WCC->upload_filename);
                
                if (WCC->attachments == NULL) {
-                       WCC->attachments = NewHash(1, NULL);
+                       WCC->attachments = NewHash(1, Flathash);
                }
 
                /* And add it to the list. */
-               n = snprintf(N, sizeof N, "%d", GetCount(WCC->attachments) + 1);
-               Put(WCC->attachments, N, n, att, DestroyMime);
+               n = 0;
+               if ((GetCount(WCC->attachments) > 0) && 
+                   GetHashAt(WCC->attachments, 
+                             GetCount(WCC->attachments) -1, 
+                             &newnlen, &newn, &v))
+                   n = *((int*) newn) + 1;
+               Put(WCC->attachments, IKEY(n), att, DestroyMime);
 
                /*
                 * Mozilla sends a simple filename, which is what we want,
@@ -1051,32 +1072,30 @@ void post_message(void)
                att->Data = WCC->upload;
                WCC->upload = NULL;
                WCC->upload_length = 0;
-               display_enter();
-               return;
+
+               /* and keep going, because we don't do attachments in two posts anymore */
        }
 
-       if (havebstr("cancel_button")) {
+       if (!strcasecmp(bstr("submit_action"), "cancel")) {
                sprintf(WCC->ImportantMessage, 
                        _("Cancelled.  Message was not posted."));
-       } else if (havebstr("attach_button")) {
-               display_enter();
-               return;
        } else if (lbstr("postseq") == dont_post) {
                sprintf(WCC->ImportantMessage, 
                        _("Automatically cancelled because you have already "
-                       "saved this message."));
+                         "saved this message."));
        } else {
                const char CMD[] = "ENT0 1|%s|%d|4|%s|%s||%s|%s|%s|%s|%s";
-               const StrBuf *Recp = NULL; 
-               const StrBuf *Cc = NULL;
-               const StrBuf *Bcc = NULL;
+               StrBuf *Recp = NULL; 
+               StrBuf *Cc = NULL;
+               StrBuf *Bcc = NULL;
                const StrBuf *Wikipage = NULL;
                const StrBuf *my_email_addr = NULL;
                StrBuf *CmdBuf = NULL;
                StrBuf *references = NULL;
                int save_to_drafts;
+               long HeaderLen;
 
-               save_to_drafts = havebstr("save_button");
+               save_to_drafts = !strcasecmp(bstr("submit_action"), "drafts");
                Buf = NewStrBuf();
 
                if (save_to_drafts) {
@@ -1114,22 +1133,29 @@ void post_message(void)
                        
                        StrBufRFC2047encode(&encoded_subject, Subj);
                }
-               Recp = sbstr("recp");
-               Cc = sbstr("cc");
-               Bcc = sbstr("bcc");
+               UserName = NewStrBuf();
+               EmailAddress = NewStrBuf();
+               EncBuf = NewStrBuf();
+
+               Recp = StrBufSanitizeEmailRecipientVector(sbstr("recp"), UserName, EmailAddress, EncBuf);
+               Cc = StrBufSanitizeEmailRecipientVector(sbstr("cc"), UserName, EmailAddress, EncBuf);
+               Bcc = StrBufSanitizeEmailRecipientVector(sbstr("bcc"), UserName, EmailAddress, EncBuf);
+
+               FreeStrBuf(&UserName);
+               FreeStrBuf(&EmailAddress);
+               FreeStrBuf(&EncBuf);
+
                Wikipage = sbstr("page");
                my_email_addr = sbstr("my_email_addr");
                
-               CmdBuf = NewStrBufPlain(NULL, 
-                                       sizeof (CMD) + 
-                                       StrLength(Recp) + 
-                                       StrLength(encoded_subject) +
-                                       StrLength(Cc) +
-                                       StrLength(Bcc) + 
-                                       StrLength(Wikipage) +
-                                       StrLength(my_email_addr) + 
-                                       StrLength(references));
-
+               HeaderLen = StrLength(Recp) + 
+                       StrLength(encoded_subject) +
+                       StrLength(Cc) +
+                       StrLength(Bcc) + 
+                       StrLength(Wikipage) +
+                       StrLength(my_email_addr) + 
+                       StrLength(references);
+               CmdBuf = NewStrBufPlain(NULL, sizeof (CMD) + HeaderLen);
                StrBufPrintf(CmdBuf, 
                             CMD,
                             save_to_drafts?"":ChrPtr(Recp),
@@ -1144,52 +1170,66 @@ void post_message(void)
                FreeStrBuf(&references);
                FreeStrBuf(&encoded_subject);
 
-               lprintf(9, "%s\n", ChrPtr(CmdBuf));
-               serv_puts(ChrPtr(CmdBuf));
-               FreeStrBuf(&CmdBuf);
+               if ((HeaderLen + StrLength(sbstr("msgtext")) < 10) && 
+                   (GetCount(WCC->attachments) == 0)){
+                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Refusing to post empty message.\n"), -1, 0);
+                       FreeStrBuf(&CmdBuf);
+                               
+               }
+               else 
+               {
+                       lprintf(9, "%s\n", ChrPtr(CmdBuf));
+                       serv_puts(ChrPtr(CmdBuf));
+                       FreeStrBuf(&CmdBuf);
 
-               StrBuf_ServGetln(Buf);
-               if (GetServerStatus(Buf, NULL) == 4) {
-                       if (save_to_drafts) {
-                               if (  (havebstr("recp"))
-                                   || (havebstr("cc"  ))
-                                   || (havebstr("bcc" )) ) {
-                                       /* save recipient headers or room to post to */
-                                       serv_printf("To: %s", ChrPtr(Recp));
-                                       serv_printf("Cc: %s", ChrPtr(Cc));
-                                       serv_printf("Bcc: %s", ChrPtr(Bcc));
-                               } else {
-                                       serv_printf("X-Citadel-Room: %s", ChrPtr(WC->CurRoom.name));
+                       StrBuf_ServGetln(Buf);
+                       if (GetServerStatus(Buf, NULL) == 4) {
+                               if (save_to_drafts) {
+                                       if (  (havebstr("recp"))
+                                             || (havebstr("cc"  ))
+                                             || (havebstr("bcc" )) ) {
+                                               /* save recipient headers or room to post to */
+                                               serv_printf("To: %s", ChrPtr(Recp));
+                                               serv_printf("Cc: %s", ChrPtr(Cc));
+                                               serv_printf("Bcc: %s", ChrPtr(Bcc));
+                                       } else {
+                                               serv_printf("X-Citadel-Room: %s", ChrPtr(WC->CurRoom.name));
+                                       }
                                }
-                       }
-                       post_mime_to_server();
-                       if (save_to_drafts) {
-                               StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been saved to Drafts.\n"), -1, 0);
-                               gotoroom(WCC->CurRoom.name);
+                               post_mime_to_server();
+                               if (save_to_drafts) {
+                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been saved to Drafts.\n"), -1, 0);
+                                       gotoroom(WCC->CurRoom.name);
+                                       display_enter();
+                                       FreeStrBuf(&Buf);
+                                       return;
+                               } else if (  (havebstr("recp"))
+                                            || (havebstr("cc"  ))
+                                            || (havebstr("bcc" ))
+                                       ) {
+                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been sent.\n"), -1, 0);
+                               }
+                               else {
+                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been posted.\n"), -1, 0);
+                               }
+                               dont_post = lbstr("postseq");
+                       } else {
+                               StrBufCutLeft(Buf, 4);
+
+                               lprintf(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();
                                FreeStrBuf(&Buf);
+                               FreeStrBuf(&Cc);
+                               FreeStrBuf(&Bcc);
                                return;
-                       } else if (  (havebstr("recp"))
-                          || (havebstr("cc"  ))
-                          || (havebstr("bcc" ))
-                       ) {
-                               StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been sent.\n"), -1, 0);
-                       }
-                       else {
-                               StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been posted.\n"), -1, 0);
                        }
-                       dont_post = lbstr("postseq");
-               } else {
-                       StrBufCutLeft(Buf, 4);
-
-                       lprintf(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();
-                       FreeStrBuf(&Buf);
-                       return;
                }
+               FreeStrBuf(&Recp);
                FreeStrBuf(&Buf);
+               FreeStrBuf(&Cc);
+               FreeStrBuf(&Bcc);
        }
 
        DeleteHash(&WCC->attachments);
@@ -1340,8 +1380,10 @@ void display_enter(void)
                        return;
                }
        }
-       svputlong("RCPTREQUIRED", recipient_required);
-       svputlong("SUBJREQUIRED", recipient_required || subject_required);
+       if (recipient_required)
+               PutBstr(HKEY("__RCPTREQUIRED"), NewStrBufPlain(HKEY("1")));
+       if (recipient_required || subject_required)
+               PutBstr(HKEY("__SUBJREQUIRED"), NewStrBufPlain(HKEY("1")));
 
        begin_burst();
        output_headers(1, 0, 0, 0, 1, 0);
@@ -1464,8 +1506,10 @@ void postpart(StrBuf *partnum, StrBuf *filename, int force_download)
        void *vPart;
        StrBuf *content_type;
        wc_mime_attachment *part;
-       
-       if (GetHash(WC->attachments, SKEY(partnum), &vPart) &&
+       int i;
+
+       i = StrToi(partnum);
+       if (GetHash(WC->attachments, IKEY(i), &vPart) &&
            (vPart != NULL)) {
                part = (wc_mime_attachment*) vPart;
                if (force_download) {
@@ -1607,8 +1651,6 @@ void MimeLoadData(wc_mime_attachment *Mime)
 }
 
 
-
-
 void view_mimepart(void) {
        mimepart(0);
 }
@@ -1643,6 +1685,7 @@ void download_postpart(void) {
        FreeStrBuf(&partnum);
 }
 
+
 void h_readnew(void) { readloop(readnew, eUseDefault);}
 void h_readold(void) { readloop(readold, eUseDefault);}
 void h_readfwd(void) { readloop(readfwd, eUseDefault);}
@@ -1722,18 +1765,18 @@ InitModule_MSG
                           NULL);
        RegisterPreference("mailbox",_("Mailbox view mode"), PRF_STRING, NULL);
 
-       WebcitAddUrlHandler(HKEY("readnew"), "", 0, h_readnew, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readold"), "", 0, h_readold, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readfwd"), "", 0, h_readfwd, NEED_URL);
+       WebcitAddUrlHandler(HKEY("readnew"), "", 0, h_readnew, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readold"), "", 0, h_readold, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readfwd"), "", 0, h_readfwd, ANONYMOUS|NEED_URL);
        WebcitAddUrlHandler(HKEY("headers"), "", 0, h_headers, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readgt"), "", 0, h_readgt, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readlt"), "", 0, h_readlt, NEED_URL);
+       WebcitAddUrlHandler(HKEY("readgt"), "", 0, h_readgt, ANONYMOUS|NEED_URL);
+       WebcitAddUrlHandler(HKEY("readlt"), "", 0, h_readlt, ANONYMOUS|NEED_URL);
        WebcitAddUrlHandler(HKEY("do_search"), "", 0, h_do_search, 0);
        WebcitAddUrlHandler(HKEY("display_enter"), "", 0, display_enter, 0);
-       WebcitAddUrlHandler(HKEY("post"), "", 0, post_message, 0);
-       WebcitAddUrlHandler(HKEY("move_msg"), "", 0, move_msg, 0);
-       WebcitAddUrlHandler(HKEY("delete_msg"), "", 0, delete_msg, 0);
-       WebcitAddUrlHandler(HKEY("confirm_move_msg"), "", 0, confirm_move_msg, 0);
+       WebcitAddUrlHandler(HKEY("post"), "", 0, post_message, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("move_msg"), "", 0, move_msg, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("delete_msg"), "", 0, delete_msg, PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("confirm_move_msg"), "", 0, confirm_move_msg, PROHIBIT_STARTPAGE);
        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);
@@ -1742,8 +1785,8 @@ InitModule_MSG
 
        WebcitAddUrlHandler(HKEY("mimepart"), "", 0, view_mimepart, NEED_URL);
        WebcitAddUrlHandler(HKEY("mimepart_download"), "", 0, download_mimepart, NEED_URL);
-       WebcitAddUrlHandler(HKEY("postpart"), "", 0, view_postpart, NEED_URL);
-       WebcitAddUrlHandler(HKEY("postpart_download"), "", 0, download_postpart, NEED_URL);
+       WebcitAddUrlHandler(HKEY("postpart"), "", 0, view_postpart, NEED_URL|PROHIBIT_STARTPAGE);
+       WebcitAddUrlHandler(HKEY("postpart_download"), "", 0, download_postpart, NEED_URL|PROHIBIT_STARTPAGE);
 
        /* json */
        WebcitAddUrlHandler(HKEY("roommsgs"), "", 0, jsonMessageList,0);