/*
* Functions which deal with the fetching and displaying of messages.
*
- * Copyright (c) 1996-2011 by the citadel.org team
+ * Copyright (c) 1996-2012 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.
+ * modify it under the terms of the GNU General Public License, version 3.
*
* 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"
#include "webserver.h"
-#include "groupdav.h"
+#include "dav.h"
#include "calendar.h"
HashList *MsgHeaderHandler = NULL;
StrBuf *CmdBuf = NULL;
msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/');
+ if (msgnum <= 0) return;
+
switch (WCC->Hdr->HR.eReqType)
{
case eGET:
*
* servcmd: the citadel command to send to the citserver
*/
-int load_msg_ptrs(const char *servcmd,
+int load_msg_ptrs(const char *servcmd,
+ const char *filter,
SharedMessageStatus *Stat,
load_msg_ptrs_detailheaders LH)
{
int n;
int skipit;
const char *Ptr = NULL;
+ int StatMajor;
Stat->lowest_found = LONG_MAX;
Stat->highest_found = LONG_MIN;
Buf = NewStrBuf();
serv_puts(servcmd);
StrBuf_ServGetln(Buf);
- if (GetServerStatus(Buf, NULL) != 1) {
+ StatMajor = GetServerStatus(Buf, NULL);
+ switch (StatMajor) {
+ case 1:
+ break;
+ case 8:
+ if (filter != NULL) {
+ serv_puts(filter);
+ serv_puts("000");
+ break;
+ }
+ /* fall back to empty filter in case of we were fooled... */
+ serv_puts("");
+ serv_puts("000");
+ break;
+ default:
FreeStrBuf(&Buf);
return (Stat->nummsgs);
}
int RoomType;
GetParamsGetServerCall_func GetParamsGetServerCall;
+
+ PrintViewHeader_func PrintPageHeader;
PrintViewHeader_func PrintViewHeader;
LoadMsgFromServer_func LoadMsgFromServer;
RenderView_or_Tail_func RenderView_or_Tail;
void *vMsg;
message_summary *Msg;
char cmd[256] = "";
+ char filter[256] = "";
int i, r;
wcsession *WCC = WC;
HashPos *at;
WCC->CurRoom.view = VIEW_MAILBOX;
}
- if (havebstr("is_ajax") && (1 == (ibstr("is_ajax")))) {
- WCC->is_ajax = 1;
- }
-
- if ((oper == do_search) && (WCC->CurRoom.view == VIEW_WIKI)) {
- display_wiki_pagelist();
- return;
- }
-
- if (WCC->CurRoom.view == VIEW_WIKI) {
- http_redirect("wiki?page=home");
- return;
+ if (havebstr("view")) {
+ WCC->CurRoom.view = ibstr("view");
}
memset(&Stat, 0, sizeof(SharedMessageStatus));
}
ViewMsg = (RoomRenderer*) vViewMsg;
- if (!WCC->is_ajax) {
+ if (ViewMsg->PrintPageHeader == NULL)
output_headers(1, 1, 1, 0, 0, 0);
- } else if (WCC->CurRoom.view == VIEW_MAILBOX) {
- jsonMessageListHdr();
- }
+ else
+ ViewMsg->PrintPageHeader(&Stat, ViewSpecific);
if (ViewMsg->GetParamsGetServerCall != NULL) {
r = ViewMsg->GetParamsGetServerCall(
&Stat,
&ViewSpecific,
oper,
- cmd, sizeof(cmd)
+ cmd, sizeof(cmd),
+ filter, sizeof(filter)
);
} else {
r = 0;
}
+
switch(r)
{
case 400:
default:
break;
}
- if (!IsEmptyStr(cmd))
- Stat.nummsgs = load_msg_ptrs(cmd, &Stat, ViewMsg->LHParse);
+ if (!IsEmptyStr(cmd)) {
+ const char *p = NULL;
+ if (!IsEmptyStr(filter))
+ p = filter;
+ Stat.nummsgs = load_msg_ptrs(cmd, p, &Stat, ViewMsg->LHParse);
+ }
if (Stat.sortit) {
CompareFunc SortIt;
StrBuf *Recp = NULL;
StrBuf *Cc = NULL;
StrBuf *Bcc = NULL;
- const StrBuf *Wikipage = NULL;
+ char *wikipage = NULL;
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);
FreeStrBuf(&EmailAddress);
FreeStrBuf(&EncBuf);
- Wikipage = sbstr("page");
+ wikipage = strdup(bstr("page"));
+ str_wiki_index(wikipage);
my_email_addr = sbstr("my_email_addr");
HeaderLen = StrLength(Recp) +
StrLength(encoded_subject) +
StrLength(Cc) +
StrLength(Bcc) +
- StrLength(Wikipage) +
+ strlen(wikipage) +
StrLength(my_email_addr) +
StrLength(references);
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),
- ChrPtr(Wikipage),
+ saving_to_drafts?"":ChrPtr(Cc),
+ saving_to_drafts?"":ChrPtr(Bcc),
+ wikipage,
ChrPtr(my_email_addr),
ChrPtr(references));
FreeStrBuf(&references);
FreeStrBuf(&encoded_subject);
+ free(wikipage);
if ((HeaderLen + StrLength(sbstr("msgtext")) < 10) &&
(GetCount(WCC->attachments) == 0)){
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) {
+ 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"))
}
dont_post = lbstr("postseq");
} else {
- syslog(9, "%s:%d: server post error: %s\n", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+ syslog(9, "%s:%d: server post error: %s", __FILE__, __LINE__, ChrPtr(Buf) + 4);
AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
- if (save_to_drafts) gotoroom(WCC->CurRoom.name);
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;
}
}
const StrBuf *Recp = NULL;
const StrBuf *Cc = NULL;
const StrBuf *Bcc = NULL;
- const StrBuf *Wikipage = NULL;
+ char *wikipage = NULL;
StrBuf *CmdBuf = NULL;
const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s";
Recp = sbstr("recp");
Cc = sbstr("cc");
Bcc = sbstr("bcc");
- Wikipage = sbstr("page");
+ wikipage = strdup(bstr("page"));
+ str_wiki_index(wikipage);
CmdBuf = NewStrBufPlain(NULL,
sizeof (CMD) +
StrLength(display_name) +
StrLength(Cc) +
StrLength(Bcc) +
- StrLength(Wikipage));
+ strlen(wikipage));
StrBufPrintf(CmdBuf,
CMD,
ChrPtr(display_name),
ChrPtr(Cc),
ChrPtr(Bcc),
- ChrPtr(Wikipage));
+ wikipage
+ );
serv_puts(ChrPtr(CmdBuf));
StrBuf_ServGetln(CmdBuf);
+ free(wikipage);
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();
void h_readgt(void) { readloop(readgt, eUseDefault);}
void h_readlt(void) { readloop(readlt, eUseDefault);}
-void jsonMessageListHdr(void)
-{
- /* TODO: make a generic function */
- hprintf("HTTP/1.1 200 OK\r\n");
- hprintf("Content-type: application/json; charset=utf-8\r\n");
- hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
- hprintf("Connection: close\r\n");
- hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
- begin_burst();
-}
/* Output message list in JSON format */
void jsonMessageList(void) {
+ StrBuf *View = NewStrBuf();
const StrBuf *room = sbstr("room");
long oper = (havebstr("query")) ? do_search : readnew;
- WC->is_ajax = 1;
+ StrBufPrintf(View, "%d", VIEW_JSON_LIST);
+ putbstr("view", View);;
gotoroom(room);
readloop(oper, eUseDefault);
- WC->is_ajax = 0;
}
void RegisterReadLoopHandlerset(
int RoomType,
GetParamsGetServerCall_func GetParamsGetServerCall,
+ PrintViewHeader_func PrintPageHeader,
PrintViewHeader_func PrintViewHeader,
load_msg_ptrs_detailheaders LH,
LoadMsgFromServer_func LoadMsgFromServer,
Handler->RoomType = RoomType;
Handler->GetParamsGetServerCall = GetParamsGetServerCall;
+ Handler->PrintPageHeader = PrintPageHeader;
Handler->PrintViewHeader = PrintViewHeader;
Handler->LoadMsgFromServer = LoadMsgFromServer;
Handler->RenderView_or_Tail = RenderView_or_Tail;