Atachment downloading: choose HTTP-Errorcode depending on the server error.
[citadel.git] / webcit / messages.c
index ac363f55a7848cda735488e99a7c72f0834418c9..2915ce1480d5b623c2320395ee8e7cad63830c56 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "webcit.h"
 #include "webserver.h"
-#include "groupdav.h"
+#include "dav.h"
 #include "calendar.h"
 
 HashList *MsgHeaderHandler = NULL;
@@ -362,9 +362,7 @@ void handle_one_message(void)
                        serv_printf("MOVE %ld|_TRASH_|0", msgnum);
                }
                StrBuf_ServGetln(CmdBuf);
-               FlushStrBuf(WCC->ImportantMsg);
-               StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4);
-               GetServerStatus(CmdBuf, &CitStatus);
+               GetServerStatusMsg(CmdBuf, &CitStatus, 1, 0);
                HttpStatus(CitStatus);
                break;
        case eCOPY:
@@ -375,8 +373,7 @@ void handle_one_message(void)
                        Destination = (StrBuf*) vLine;
                        serv_printf("MOVE %ld|%s|%d", msgnum, ChrPtr(Destination), CopyMessage);
                        StrBuf_ServGetln(CmdBuf);
-                       FlushStrBuf(WCC->ImportantMsg);
-                       StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4);
+                       GetServerStatusMsg(CmdBuf, NULL, 1, 0);
                        GetServerStatus(CmdBuf, &CitStatus);
                        HttpStatus(CitStatus);
                }
@@ -402,6 +399,8 @@ void embed_message(void) {
        StrBuf *CmdBuf = NULL;
 
        msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/');
+       if (msgnum <= 0) return;
+
        switch (WCC->Hdr->HR.eReqType)
        {
        case eGET:
@@ -422,8 +421,7 @@ void embed_message(void) {
                        serv_printf("MOVE %ld|_TRASH_|0", msgnum);
                }
                StrBuf_ServGetln(CmdBuf);
-               FlushStrBuf(WCC->ImportantMsg);
-               StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4);
+               GetServerStatusMsg(CmdBuf, NULL, 1, 0);
                break;
        default:
                break;
@@ -1009,22 +1007,20 @@ void post_message(void)
                const StrBuf *my_email_addr = NULL;
                StrBuf *CmdBuf = NULL;
                StrBuf *references = NULL;
-               int save_to_drafts;
-               long HeaderLen;
+               int saving_to_drafts = 0;
+               long HeaderLen = 0;
 
-               save_to_drafts = !strcasecmp(bstr("submit_action"), "drafts");
+               saving_to_drafts = !strcasecmp(bstr("submit_action"), "draft");
                Buf = NewStrBuf();
 
-               if (save_to_drafts) {
+               if (saving_to_drafts) {
                        /* temporarily change to the drafts room */
                        serv_puts("GOTO _DRAFTS_");
                        StrBuf_ServGetln(Buf);
-                       if (GetServerStatus(Buf, NULL) != 2) {
+                       if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
                                /* You probably don't even have a dumb Drafts folder */
-                               StrBufCutLeft(Buf, 4);
-                               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);
+                               syslog(9, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+                               AppendImportantMessage(_("Saved to Drafts failed: "), -1);
                                display_enter();
                                FreeStrBuf(&Buf);
                                return;
@@ -1075,12 +1071,12 @@ void post_message(void)
                CmdBuf = NewStrBufPlain(NULL, sizeof (CMD) + HeaderLen);
                StrBufPrintf(CmdBuf, 
                             CMD,
-                            save_to_drafts?"":ChrPtr(Recp),
+                            saving_to_drafts?"":ChrPtr(Recp),
                             is_anonymous,
                             ChrPtr(encoded_subject),
                             ChrPtr(display_name),
-                            save_to_drafts?"":ChrPtr(Cc),
-                            save_to_drafts?"":ChrPtr(Bcc),
+                            saving_to_drafts?"":ChrPtr(Cc),
+                            saving_to_drafts?"":ChrPtr(Bcc),
                             ChrPtr(Wikipage),
                             ChrPtr(my_email_addr),
                             ChrPtr(references));
@@ -1089,7 +1085,7 @@ void post_message(void)
 
                if ((HeaderLen + StrLength(sbstr("msgtext")) < 10) && 
                    (GetCount(WCC->attachments) == 0)){
-                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Refusing to post empty message.\n"), -1, 0);
+                       AppendImportantMessage(_("Refusing to post empty message.\n"), -1);
                        FreeStrBuf(&CmdBuf);
                                
                }
@@ -1101,7 +1097,7 @@ void post_message(void)
 
                        StrBuf_ServGetln(Buf);
                        if (GetServerStatus(Buf, NULL) == 4) {
-                               if (save_to_drafts) {
+                               if (saving_to_drafts) {
                                        if (  (havebstr("recp"))
                                              || (havebstr("cc"  ))
                                              || (havebstr("bcc" )) ) {
@@ -1114,29 +1110,28 @@ void post_message(void)
                                        }
                                }
                                post_mime_to_server();
-                               if (save_to_drafts) {
-                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been saved to Drafts.\n"), -1, 0);
+                               if (saving_to_drafts) {
+                                       AppendImportantMessage(_("Message has been saved to Drafts.\n"), -1);
                                        gotoroom(WCC->CurRoom.name);
-                                       display_enter();
+                                       readloop(readnew, eUseDefault);
                                        FreeStrBuf(&Buf);
                                        return;
                                } else if (  (havebstr("recp"))
                                             || (havebstr("cc"  ))
                                             || (havebstr("bcc" ))
                                        ) {
-                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been sent.\n"), -1, 0);
+                                       AppendImportantMessage(_("Message has been sent.\n"), -1);
                                }
                                else {
-                                       StrBufAppendBufPlain(WCC->ImportantMsg, _("Message has been posted.\n"), -1, 0);
+                                       AppendImportantMessage(_("Message has been posted.\n"), -1);
                                }
                                dont_post = lbstr("postseq");
                        } else {
-                               StrBufCutLeft(Buf, 4);
-
-                               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);
+                               syslog(9, "%s:%d: server post error: %s", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+                               AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
                                display_enter();
+                               if (saving_to_drafts) gotoroom(WCC->CurRoom.name);
+                               FreeStrBuf(&Recp);
                                FreeStrBuf(&Buf);
                                FreeStrBuf(&Cc);
                                FreeStrBuf(&Bcc);
@@ -1312,7 +1307,6 @@ void display_enter(void)
        const StrBuf *display_name = NULL;
        int recipient_required = 0;
        int subject_required = 0;
-       int recipient_bad = 0;
        int is_anonymous = 0;
        wcsession *WCC = WC;
        int i = 0;
@@ -1328,7 +1322,9 @@ void display_enter(void)
                is_anonymous = 1;
        }
 
-       /* First test to see whether this is a room that requires recipients to be entered */
+       /*
+        * First, do we have permission to enter messages in this room at all?
+        */
        Line = NewStrBuf();
        serv_puts("ENT0 0");
        StrBuf_ServGetln(Line);
@@ -1411,6 +1407,8 @@ void display_enter(void)
                                if (which == l_subj)
                                {
                                        StrBuf *subj = NewStrBuf();
+                                       StrBuf *FlatSubject;
+
                                        if (!strcasecmp(bstr("replying_mode"), "forward")) {
                                                if (strncasecmp(ChrPtr(Line) + 5, "Fw:", 3)) {
                                                        StrBufAppendBufPlain(subj, HKEY("Fw: "), 0);
@@ -1424,7 +1422,10 @@ void display_enter(void)
                                        StrBufAppendBufPlain(subj, 
                                                             ChrPtr(Line) + 5, 
                                                             StrLength(Line) - 5, 0);
-                                       PutBstr(HKEY("subject"), subj);
+                                       FlatSubject = NewStrBufPlain(NULL, StrLength(subj));
+                                       StrBuf_RFC822_to_Utf8(FlatSubject, subj, NULL, NULL);
+
+                                       PutBstr(HKEY("subject"), FlatSubject);
                                }
 
                                else if (which == l_wefw)
@@ -1449,7 +1450,12 @@ void display_enter(void)
                                }
 
                                else if (which == l_from) {
+                                       StrBuf *FlatFrom;
                                        from = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                       FlatFrom = NewStrBufPlain(NULL, StrLength(from));
+                                       StrBuf_RFC822_to_Utf8(FlatFrom, from, NULL, NULL);
+                                       FreeStrBuf(&from);
+                                       from = FlatFrom;
                                        for (i=0; i<StrLength(from); ++i) {
                                                if (ChrPtr(from)[i] == ',')
                                                        StrBufPeek(from, NULL, i, ' ');
@@ -1469,7 +1475,12 @@ void display_enter(void)
                                }
                                
                                else if (which == l_rfca) {
+                                       StrBuf *FlatRFCA;
                                        rfca = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                       FlatRFCA = NewStrBufPlain(NULL, StrLength(rfca));
+                                       StrBuf_RFC822_to_Utf8(FlatRFCA, rfca, NULL, NULL);
+                                       FreeStrBuf(&rfca);
+                                       rfca = FlatRFCA;
                                }
                        }
 
@@ -1584,16 +1595,15 @@ void display_enter(void)
 
                rc = GetServerStatusMsg(CmdBuf, &Result, 0, 0);
 
-               if (Result == 570) {    /* 570 means we have an invalid recipient listed */
-                       if (havebstr("recp") && 
-                           havebstr("cc"  ) && 
-                           havebstr("bcc" )) {
-                               recipient_bad = 1; /* TODO: and now????? */
-                       }
+               if (    (Result == 570)         /* invalid or missing recipient(s) */
+                       || (Result == 550)      /* higher access required to send Internet mail */
+               ) {
+                       /* These errors will have been displayed and are excusable */
                }
                else if (rc != 2) {     /* Any other error means that we cannot continue */
-                       wc_printf("<em>%s</em><br>\n", ChrPtr(CmdBuf) +4);      /* TODO -> important message */
+                       AppendImportantMessage(ChrPtr(CmdBuf) + 4, StrLength(CmdBuf) - 4);
                        FreeStrBuf(&CmdBuf);
+                       readloop(readnew, eUseDefault);
                        return;
                }
                FreeStrBuf(&CmdBuf);
@@ -1711,6 +1721,7 @@ void postpart(StrBuf *partnum, StrBuf *filename, int force_download)
 void mimepart(int force_download)
 {
        long msgnum;
+       long ErrorDetail;
        StrBuf *att;
        wcsession *WCC = WC;
        StrBuf *Buf;
@@ -1724,7 +1735,7 @@ void mimepart(int force_download)
 
        serv_printf("OPNA %ld|%s", msgnum, ChrPtr(att));
        StrBuf_ServGetln(Buf);
-       if (GetServerStatus(Buf, NULL) == 2) {
+       if (GetServerStatus(Buf, &ErrorDetail) == 2) {
                StrBufCutLeft(Buf, 4);
                bytes = StrBufExtract_long(Buf, 0, '|');
                if (!force_download) {
@@ -1748,7 +1759,23 @@ void mimepart(int force_download)
                http_transmit_thing(CT, 0);
        } else {
                StrBufCutLeft(Buf, 4);
-               hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
+               switch (ErrorDetail) {
+               default:
+               case ERROR + MESSAGE_NOT_FOUND:
+                       hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf));
+                       break;
+               case ERROR + NOT_LOGGED_IN:
+                       hprintf("HTTP/1.1 401 %s\n", ChrPtr(Buf));
+                       break;
+
+               case ERROR + HIGHER_ACCESS_REQUIRED:
+                       hprintf("HTTP/1.1 403 %s\n", ChrPtr(Buf));
+                       break;
+               case ERROR + INTERNAL_ERROR:
+               case ERROR + TOO_BIG:
+                       hprintf("HTTP/1.1 500 %s\n", ChrPtr(Buf));
+                       break;
+               }
                output_headers(0, 0, 0, 0, 0, 0);
                hprintf("Content-Type: text/plain\r\n");
                begin_burst();