#include "webcit.h"
#include "webserver.h"
-#include "groupdav.h"
+#include "dav.h"
#include "calendar.h"
HashList *MsgHeaderHandler = NULL;
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:
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);
}
StrBuf *CmdBuf = NULL;
msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/');
+ if (msgnum <= 0) return;
+
switch (WCC->Hdr->HR.eReqType)
{
case eGET:
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;
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;
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));
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);
}
StrBuf_ServGetln(Buf);
if (GetServerStatus(Buf, NULL) == 4) {
- if (save_to_drafts) {
+ if (saving_to_drafts) {
if ( (havebstr("recp"))
|| (havebstr("cc" ))
|| (havebstr("bcc" )) ) {
}
}
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);
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;
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);
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);
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)
}
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, ' ');
}
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;
}
}
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);
void mimepart(int force_download)
{
long msgnum;
+ long ErrorDetail;
StrBuf *att;
wcsession *WCC = WC;
StrBuf *Buf;
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) {
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();