/*
* Functions which deal with the fetching and displaying of messages.
*
- * Copyright (c) 1996-2018 by the citadel.org team
+ * Copyright (c) 1996-2020 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, version 3.
+ * This program is open source software. We call it open source, not
+ * free software, because Richard Stallman is a communist and an asshole.
+ *
+ * The program is licensed under the 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
#define SENDER_COL_WIDTH_PCT 30 /* Mailbox view column width */
#define DATE_PLUS_BUTTONS_WIDTH_PCT 20 /* Mailbox view column width */
-void jsonMessageListHdr(void);
-
-void display_enter(void);
-
-void fixview()
-{
+void fixview() {
/* workaround for json listview; its not useable directly */
if (WC->CurRoom.view == VIEW_JSON_LIST) {
StrBuf *View = NewStrBuf();
putbstr("view", View);;
}
}
-int load_message(message_summary *Msg,
- StrBuf *FoundCharset,
- StrBuf **Error)
-{
+
+
+int load_message(message_summary *Msg, StrBuf *FoundCharset, StrBuf **Error) {
StrBuf *Buf;
StrBuf *HdrToken;
char buf[SIZ];
}
-
/*
- * I wanna SEE that message!
+ * Display a message to the user
*
* msgnum Message number to display
* printable_view Nonzero to display a printable view
* section Optional for encapsulated message/rfc822 submessage
*/
-int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, const StrBuf *PartNum, const StrBuf **OutMime, WCTemplputParams *TP)
-{
+int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, const StrBuf *PartNum, const StrBuf **OutMime, WCTemplputParams *TP) {
StrBuf *Buf;
StrBuf *FoundCharset;
HashPos *it;
}
-long
-HttpStatus(long CitadelStatus)
-{
+long HttpStatus(long CitadelStatus) {
long httpstatus = 502;
switch (MAJORCODE(CitadelStatus))
return httpstatus;
}
+
/*
* Unadorned HTML output of an individual message, suitable
* for placing in a hidden iframe, for printing, or whatever
*/
-void handle_one_message(void)
-{
+void handle_one_message(void) {
long CitStatus = ERROR + NOT_HERE;
int CopyMessage = 0;
const StrBuf *Destination;
StrBuf *CmdBuf = NULL;
const char *pMsg;
-
pMsg = strchr(ChrPtr(WCC->Hdr->HR.ReqLine), '/');
if (pMsg == NULL) {
HttpStatus(CitStatus);
wDumpContent(0);
}
+
/*
* Display a message's headers
*/
}
-
/*
* load message pointers from the server for a "read messages" operation
*
}
-
-/**
- * \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
+/*
+ * sets FlagToSet for each of ScanMe that appears in MatchMSet
+ * ScanMe: List of BasicMsgStruct to be searched it MatchSet
+ * MatchMSet: MSet we want to flag
+ * FlagToSet: Flag to set on each BasicMsgStruct->Flags if in MSet
*/
-long SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse)
-{
+long SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse) {
const char *HashKey;
long HKLen;
long count = 0;
}
-long load_seen_flags(void)
-{
+long load_seen_flags(void) {
long count = 0;
StrBuf *OldMsg;
wcsession *WCC = WC;
*
* Set oper to "readnew" or "readold" or "readfwd" or "headers" or "readgt" or "readlt" or "do_search"
*/
-void readloop(long oper, eCustomRoomRenderer ForceRenderer)
-{
+void readloop(long oper, eCustomRoomRenderer ForceRenderer) {
RoomRenderer *ViewMsg;
void *vViewMsg;
void *vMsg;
* discarded. This prevents the accidental double-saving of the same message
* if the user happens to click the browser "back" button.
*/
-void post_message(void)
-{
+void post_message(void) {
StrBuf *UserName;
StrBuf *EmailAddress;
StrBuf *EncBuf;
eReplyAll,
eForward
}eReplyToNodes;
-
+
+
/*
* display the message entry screen
*/
-void display_enter(void)
-{
+void display_enter(void) {
const char *ReplyingModeStr;
eReplyToNodes ReplyMode = eReply;
StrBuf *Line;
return;
}
-
ReplyingModeStr = bstr("replying_mode");
- if (ReplyingModeStr != NULL) for (i = 0; i < 3; i++) {
+ if (ReplyingModeStr != NULL) {
+ for (i = 0; i < 3; i++) {
if (strcmp(ReplyingModeStr, ReplyToModeStrings[i]) == 0) {
ReplyMode = (eReplyToNodes) i;
break;
}
}
-
+ }
/*
* If the "replying_to" variable is set, it refers to a message
StrBuf *wefw = NULL;
StrBuf *msgn = NULL;
StrBuf *from = NULL;
- StrBuf *node = NULL;
StrBuf *rfca = NULL;
StrBuf *rcpt = NULL;
StrBuf *cccc = NULL;
StrBuf *replyto = NULL;
StrBuf *nvto = NULL;
+ int message_originated_locally = 0;
serv_printf("MSG0 %ld|1", replying_to);
StrBuf_ServGetln(Line);
if (GetServerStatusMsg(Line, NULL, 0, 0) == 1)
- while (len = StrBuf_ServGetln(Line),
- (len >= 0) &&
- ((len != 3) ||
- strcmp(ChrPtr(Line), "000")))
- {
+ while (len = StrBuf_ServGetln(Line), (len >= 0) && ((len != 3) || strcmp(ChrPtr(Line), "000"))) {
eMessageField which;
- if ((StrLength(Line) > 4) &&
- (ChrPtr(Line)[4] == '=') &&
- GetFieldFromMnemonic(&which, ChrPtr(Line)))
- switch (which) {
+ if ((StrLength(Line) > 4) && (ChrPtr(Line)[4] == '=') && GetFieldFromMnemonic(&which, ChrPtr(Line))) switch (which) {
case eMsgSubject: {
StrBuf *subj = NewStrBuf();
StrBuf *FlatSubject;
}
break;
+ case eIsLocal: {
+ message_originated_locally = 1;
+ break;
+ }
+
case eWeferences:
{
int rrtok;
}
break;
}
-
case eRecipient:
rcpt = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
break;
-
-
case eCarbonCopY:
cccc = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
break;
-
-
- case eNodeName:
- node = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
- break;
case eReplyTo:
replyto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
break;
putbstr("nvto", nvto);
break;
case eXclusivID:
- case eHumanNode:
case eJournal:
case eListID:
case eMesageText:
- case eOriginalRoom:
case eMessagePath:
case eSpecialField:
case eTimestamp:
case eFormatType:
case eMessagePart:
case eSubFolder:
- case ePevious:
case eLastHeader:
break;
/*
* If this is a Reply or a ReplyAll, copy the sender's email into the To: field
*/
- if ((ReplyMode == eReply) || (ReplyMode == eReplyAll))
- {
+ if ((ReplyMode == eReply) || (ReplyMode == eReplyAll)) {
StrBuf *to_rcpt;
+
if ((StrLength(replyto) > 0) && (ReplyMode == eReplyAll)) {
to_rcpt = NewStrBuf();
StrBufAppendBuf(to_rcpt, replyto, 0);
}
- else if (StrLength(rfca) > 0) {
+
+ else if ( (StrLength(rfca) > 0) && (message_originated_locally == 0) ) {
to_rcpt = NewStrBuf();
StrBufAppendBuf(to_rcpt, from, 0);
StrBufAppendBufPlain(to_rcpt, HKEY(" <"), 0);
StrBufAppendBuf(to_rcpt, rfca, 0);
StrBufAppendBufPlain(to_rcpt, HKEY(">"), 0);
}
+
else {
to_rcpt = from;
from = NULL;
- if ( (StrLength(node) > 0)
- && (strcasecmp(ChrPtr(node), ChrPtr(WCC->serv_info->serv_nodename)))
- ) {
- StrBufAppendBufPlain(to_rcpt, HKEY(" @ "), 0);
- StrBufAppendBuf(to_rcpt, node, 0);
- }
}
PutBstr(HKEY("recp"), to_rcpt);
}
/*
* Only if this is a ReplyAll, copy all recipients into the Cc: field
*/
- if (ReplyMode == eReplyAll)
- {
+ if (ReplyMode == eReplyAll) {
StrBuf *cc_rcpt = rcpt;
rcpt = NULL;
- if ((StrLength(cccc) > 0) && (StrLength(replyto) == 0))
- {
+ if ((StrLength(cccc) > 0) && (StrLength(replyto) == 0)) {
if (cc_rcpt != NULL) {
StrBufAppendPrintf(cc_rcpt, ", ");
StrBufAppendBuf(cc_rcpt, cccc, 0);
- } else {
+ }
+ else {
cc_rcpt = cccc;
cccc = NULL;
}
}
- if (cc_rcpt != NULL)
+ if (cc_rcpt != NULL) {
PutBstr(HKEY("cc"), cc_rcpt);
+ }
}
+
+ // FOOFOO
+ syslog(LOG_DEBUG, "wefw = %s", ChrPtr(wefw));
+ syslog(LOG_DEBUG, "msgn = %s", ChrPtr(msgn));
+ syslog(LOG_DEBUG, "from = %s", ChrPtr(from));
+ syslog(LOG_DEBUG, "rfca = %s", ChrPtr(rfca));
+ syslog(LOG_DEBUG, "rcpt = %s", ChrPtr(rcpt));
+ syslog(LOG_DEBUG, "cccc = %s", ChrPtr(cccc));
+ syslog(LOG_DEBUG, "replyto = %s", ChrPtr(replyto));
+ syslog(LOG_DEBUG, "nvto = %s", ChrPtr(nvto));
+ syslog(LOG_DEBUG, "local = %d" , message_originated_locally);
+
FreeStrBuf(&wefw);
FreeStrBuf(&msgn);
FreeStrBuf(&from);
- FreeStrBuf(&node);
FreeStrBuf(&rfca);
FreeStrBuf(&rcpt);
FreeStrBuf(&cccc);
}
FreeStrBuf(&Line);
+
/*
* Otherwise proceed normally.
* Do a custom room banner with no navbar...
*/
-
if (recipient_required) {
const StrBuf *Recp = NULL;
const StrBuf *Cc = NULL;
return;
}
+
/*
* delete a message
*/
-void delete_msg(void)
-{
+void delete_msg(void) {
long msgid;
StrBuf *Line;
/*
* move a message to another room
*/
-void move_msg(void)
-{
+void move_msg(void) {
long msgid;
msgid = lbstr("msgid");
}
-
/*
* Generic function to output an arbitrary MIME attachment from
* message being composed
* filename Fake filename to give
* force_download Nonzero to force set the Content-Type: header to "application/octet-stream"
*/
-void postpart(StrBuf *partnum, StrBuf *filename, int force_download)
-{
+void postpart(StrBuf *partnum, StrBuf *filename, int force_download) {
void *vPart;
StrBuf *content_type;
wc_mime_attachment *part;
* partnum MIME part number to be output
* force_download Nonzero to force set the Content-Type: header to "application/octet-stream"
*/
-void view_or_download_mimepart(int force_download)
-{
+void view_or_download_mimepart(int force_download) {
long msgnum;
off_t bytes;
StrBuf *Buf;
/*
* Read any MIME part of a message, from the server, into memory.
*/
-StrBuf *load_mimepart(long msgnum, char *partnum)
-{
+StrBuf *load_mimepart(long msgnum, char *partnum) {
off_t bytes;
StrBuf *Buf;
}
}
+
/*
* Read any MIME part of a message, from the server, into memory.
*/
-void MimeLoadData(wc_mime_attachment *Mime)
-{
+void MimeLoadData(wc_mime_attachment *Mime) {
StrBuf *Buf;
const char *Ptr;
off_t bytes;
view_or_download_mimepart(0);
}
+
void download_mimepart(void) {
view_or_download_mimepart(1);
}
+
void view_postpart(void) {
StrBuf *filename = NewStrBuf();
StrBuf *partnum = NewStrBuf();
FreeStrBuf(&partnum);
}
+
void download_postpart(void) {
StrBuf *filename = NewStrBuf();
StrBuf *partnum = NewStrBuf();
}
-
void show_num_attachments(void) {
wc_printf("%d", GetCount(WC->attachments));
}
void h_readlt(void) { readloop(readlt, eUseDefault);}
-
/* Output message list in JSON format */
void jsonMessageList(void) {
StrBuf *View = NewStrBuf();
readloop(oper, eUseDefault);
}
+
void FreeReadLoopHandlerSet(void *v) {
RoomRenderer *Handler = (RoomRenderer *) v;
FreeStrBuf(&Handler->FetchMessageList);
free(Handler);
}
+
void RegisterReadLoopHandlerset(
int RoomType,
GetParamsGetServerCall_func GetParamsGetServerCall,