/*
- * $Id$
- *
* Functions which deal with the fetching and displaying of messages.
- *
*/
#include "webcit.h"
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));
}
}
-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");
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[];
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.
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++;
}
*/
void post_message(void)
{
+ StrBuf *UserName;
+ StrBuf *EmailAddress;
+ StrBuf *EncBuf;
char buf[1024];
StrBuf *encoded_subject = NULL;
static long dont_post = (-1L);
- wc_mime_attachment *att;
int is_anonymous = 0;
const StrBuf *display_name = NULL;
wcsession *WCC = WC;
}
}
- if (WCC->upload_length > 0) {
- const char *pch;
- int n;
- char N[64];
-
- /* There's an attachment. Save it to this struct... */
- lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length);
- att = malloc(sizeof(wc_mime_attachment));
- 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);
-
- if (WCC->attachments == NULL) {
- WCC->attachments = NewHash(1, NULL);
- }
-
- /* And add it to the list. */
- n = snprintf(N, sizeof N, "%d", GetCount(WCC->attachments) + 1);
- Put(WCC->attachments, N, n, att, DestroyMime);
-
- /*
- * Mozilla sends a simple filename, which is what we want,
- * but Satan's Browser sends an entire pathname. Reduce
- * the path to just a filename if we need to.
- */
- pch = strrchr(ChrPtr(att->FileName), '/');
- if (pch != NULL) {
- StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
- }
- pch = strrchr(ChrPtr(att->FileName), '\\');
- if (pch != NULL) {
- StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
- }
-
- /*
- * Transfer control of this memory from the upload struct
- * to the attachment struct.
- */
- att->Data = WCC->upload;
- WCC->upload = NULL;
- WCC->upload_length = 0;
- display_enter();
- return;
- }
-
- 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) {
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),
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);
}
+/*
+ * Client is uploading an attachment
+ */
+void upload_attachment(void) {
+ wcsession *WCC = WC;
+ const char *pch;
+ int n;
+ const char *newn;
+ long newnlen;
+ void *v;
+ wc_mime_attachment *att;
+
+ lprintf(9, "upload_attachment()\n");
+ wc_printf("upload_attachment()<br>\n");
+
+ if (WCC->upload_length <= 0) {
+ lprintf(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);
+ 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 ));
+ att->length = WCC->upload_length;
+ att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1);
+ att->FileName = NewStrBufDup(WCC->upload_filename);
+
+ if (WCC->attachments == NULL) {
+ WCC->attachments = NewHash(1, Flathash);
+ }
+
+ /* And add it to the list. */
+ 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,
+ * but Satan's Browser sends an entire pathname. Reduce
+ * the path to just a filename if we need to.
+ */
+ pch = strrchr(ChrPtr(att->FileName), '/');
+ if (pch != NULL) {
+ StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+ }
+ pch = strrchr(ChrPtr(att->FileName), '\\');
+ if (pch != NULL) {
+ StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+ }
+
+ /*
+ * Transfer control of this memory from the upload struct
+ * to the attachment struct.
+ */
+ att->Data = WCC->upload;
+ WCC->upload = NULL;
+ WCC->upload_length = 0;
+}
+
/*
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);
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) {
}
-
-
void view_mimepart(void) {
mimepart(0);
}
FreeStrBuf(&partnum);
}
+
+
+void show_num_attachments(void) {
+ wc_printf("%d", GetCount(WC->attachments));
+}
+
+
void h_readnew(void) { readloop(readnew, eUseDefault);}
void h_readold(void) { readloop(readold, eUseDefault);}
void h_readfwd(void) { readloop(readfwd, eUseDefault);}
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, PROHIBIT_STARTPAGE);
WebcitAddUrlHandler(HKEY("mimepart_download"), "", 0, download_mimepart, NEED_URL);
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("show_num_attachments"), "", 0, show_num_attachments, AJAX);
/* json */
WebcitAddUrlHandler(HKEY("roommsgs"), "", 0, jsonMessageList,0);