ret->cm_anon_type = *mptr++; /* Anon type byte */
ret->cm_format_type = *mptr++; /* Format type byte */
+
+ if (dmsgtext->ptr[dmsgtext->len - 1] != '\0')
+ {
+ MSG_syslog(LOG_ERR, "CtdlFetchMessage(%ld, %d) Forcefully terminating message!!\n", msgnum, with_body);
+ dmsgtext->ptr[dmsgtext->len - 1] = '\0';
+ }
+
/*
* The rest is zero or more arbitrary fields. Load them in.
* We're done when we encounter either a zero-length field or
* have just processed the 'M' (message text) field.
*/
do {
+ field_header = '\0';
long len;
+
+ /* work around possibly buggy messages: */
+ while (field_header == '\0')
+ {
+ if (mptr >= upper_bound) {
+ break;
+ }
+ field_header = *mptr++;
+ }
if (mptr >= upper_bound) {
break;
}
- field_header = *mptr++;
which = field_header;
len = strlen(mptr);
+
CM_SetField(ret, which, mptr, len);
mptr += len + 1; /* advance to next field */
if ( (CM_IsEmpty(ret, eMesageText)) && (with_body) ) {
dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
if (dmsgtext != NULL) {
- CM_SetAsField(ret, eMesageText, &dmsgtext->ptr, dmsgtext->len);
+ CM_SetAsField(ret, eMesageText, &dmsgtext->ptr, dmsgtext->len - 1);
cdb_free(dmsgtext);
}
}
*
*/
int CtdlOutputMsg(long msg_num, /* message number (local) to fetch */
- int mode, /* how would you like that message? */
- int headers_only, /* eschew the message body? */
- int do_proto, /* do Citadel protocol responses? */
- int crlf, /* Use CRLF newlines instead of LF? */
- char *section, /* NULL or a message/rfc822 section */
- int flags, /* various flags; see msgbase.h */
- char **Author,
- char **Address
+ int mode, /* how would you like that message? */
+ int headers_only, /* eschew the message body? */
+ int do_proto, /* do Citadel protocol responses? */
+ int crlf, /* Use CRLF newlines instead of LF? */
+ char *section, /* NULL or a message/rfc822 section */
+ int flags, /* various flags; see msgbase.h */
+ char **Author,
+ char **Address,
+ char **MessageID
) {
struct CitContext *CCC = CC;
struct CtdlMessage *TheMessage = NULL;
long len;
CM_GetAsField(TheMessage, erFc822Addr, Address, &len);
}
+ if ((MessageID != NULL) && (*MessageID == NULL))
+ {
+ long len;
+ CM_GetAsField(TheMessage, emessageId, MessageID, &len);
+ }
CM_Free(TheMessage);
TheMessage = NULL;
long len;
CM_GetAsField(TheMessage, erFc822Addr, Address, &len);
}
+ if ((MessageID != NULL) && (*MessageID == NULL))
+ {
+ long len;
+ CM_GetAsField(TheMessage, emessageId, MessageID, &len);
+ }
CM_Free(TheMessage);
char *mpptr = NULL;
char *hptr;
- for (i = 0; i < 256; ++i) {
- if (TheMessage->cm_fields[i]) {
- mptr = mpptr = TheMessage->cm_fields[i];
-
- if (i == eAuthor) {
+ for (i = 0; i < NDiskFields; ++i) {
+ if (TheMessage->cm_fields[FieldOrder[i]]) {
+ mptr = mpptr = TheMessage->cm_fields[FieldOrder[i]];
+ switch (FieldOrder[i]) {
+ case eAuthor:
safestrncpy(luser, mptr, sizeof_luser);
safestrncpy(suser, mptr, sizeof_suser);
- }
- else if (i == 'Y') {
+ break;
+ case eCarbonCopY:
if ((flags & QP_EADDR) != 0) {
mptr = qp_encode_email_addrs(mptr);
}
sanitize_truncated_recipient(mptr);
cprintf("CC: %s%s", mptr, nl);
- }
- else if (i == 'P') {
+ break;
+ case eMessagePath:
cprintf("Return-Path: %s%s", mptr, nl);
- }
- else if (i == eListID) {
+ break;
+ case eListID:
cprintf("List-ID: %s%s", mptr, nl);
- }
- else if (i == 'V') {
+ break;
+ case eenVelopeTo:
if ((flags & QP_EADDR) != 0)
mptr = qp_encode_email_addrs(mptr);
hptr = mptr;
hptr ++;
if (!IsEmptyStr(hptr))
cprintf("Envelope-To: %s%s", hptr, nl);
- }
- else if (i == 'U') {
+ break;
+ case eMsgSubject:
cprintf("Subject: %s%s", mptr, nl);
subject_found = 1;
- }
- else if (i == 'I')
+ break;
+ case emessageId:
safestrncpy(mid, mptr, sizeof_mid); /// TODO: detect @ here and copy @nodename in if not found.
- else if (i == erFc822Addr)
+ break;
+ case erFc822Addr:
safestrncpy(fuser, mptr, sizeof_fuser);
- /* else if (i == 'O')
+ /* case eOriginalRoom:
cprintf("X-Citadel-Room: %s%s",
- mptr, nl); */
- else if (i == 'N')
+ mptr, nl)
+ break;
+ ; */
+ case eNodeName:
safestrncpy(snode, mptr, sizeof_snode);
- else if (i == 'R')
- {
+ break;
+ case eRecipient:
if (haschar(mptr, '@') == 0)
{
sanitize_truncated_recipient(mptr);
cprintf("To: %s", mptr);
cprintf("%s", nl);
}
- }
- else if (i == 'T') {
+ break;
+ case eTimestamp:
datestring(datestamp, sizeof datestamp,
atol(mptr), DATESTRING_RFC822);
cprintf("Date: %s%s", datestamp, nl);
- }
- else if (i == 'W') {
+ break;
+ case eWeferences:
cprintf("References: ");
k = num_tokens(mptr, '|');
for (j=0; j<k; ++j) {
cprintf(" ");
}
}
- }
- else if (i == eReplyTo) {
+ break;
+ case eReplyTo:
hptr = mptr;
while ((*hptr != '\0') && isspace(*hptr))
hptr ++;
if (!IsEmptyStr(hptr))
cprintf("Reply-To: %s%s", mptr, nl);
+ break;
+
+ case eRemoteRoom:
+ case eDestination:
+ case eExclusiveID:
+ case eHumanNode:
+ case eJournal:
+ case eMesageText:
+ case eBig_message:
+ case eOriginalRoom:
+ case eSpecialField:
+ case eErrorMsg:
+ case eSuppressIdx:
+ case eExtnotify:
+ case eVltMsgNum:
+ /* these don't map to mime message headers. */
+ break;
+
}
if (mptr != mpptr)
free (mptr);
strcpy(suser, "");
strcpy(luser, "");
strcpy(fuser, "");
- strcpy(snode, NODENAME);
+ memcpy(snode, CFG_KEY(c_nodename) + 1);
if (mode == MT_RFC822)
OutputRFC822MsgHeaders(
TheMessage,
MSG_syslog(LOG_INFO, "Final selection: %s (%s)\n", actual_rm, room);
if (strcasecmp(actual_rm, CCC->room.QRname)) {
/* CtdlGetRoom(&CCC->room, actual_rm); */
- CtdlUserGoto(actual_rm, 0, 1, NULL, NULL);
+ CtdlUserGoto(actual_rm, 0, 1, NULL, NULL, NULL, NULL);
}
/*
/* Go back to the room we started from */
MSG_syslog(LOG_DEBUG, "Returning to original room %s\n", hold_rm);
if (strcasecmp(hold_rm, CCC->room.QRname))
- CtdlUserGoto(hold_rm, 0, 1, NULL, NULL);
+ CtdlUserGoto(hold_rm, 0, 1, NULL, NULL, NULL, NULL);
/*
* Any addresses to harvest for someone's address book?
if (fromaddr != NULL) CM_SetField(msg, erFc822Addr, fromaddr, strlen(fromaddr));
if (room != NULL) CM_SetField(msg, eOriginalRoom, room, strlen(room));
- CM_SetField(msg, eNodeName, NODENAME, strlen(NODENAME));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
if (to != NULL) {
CM_SetField(msg, eRecipient, to, strlen(to));
recp = validate_recipients(to, NULL, 0);
}
StrBufRFC2047encode(&FakeEncAuthor, FakeAuthor);
CM_SetAsFieldSB(msg, eAuthor, &FakeEncAuthor);
+ FreeStrBuf(&FakeAuthor);
if (CCC->room.QRflags & QR_MAILBOX) { /* room */
CM_SetField(msg, eOriginalRoom, &CCC->room.QRname[11], strlen(&CCC->room.QRname[11]));
CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname));
}
- CM_SetField(msg, eNodeName, NODENAME, strlen(NODENAME));
- CM_SetField(msg, eHumanNode, HUMANNODE, strlen(HUMANNODE));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
if (rcplen > 0) {
CM_SetField(msg, eRecipient, recipient, rcplen);
CM_SetField(msg, eMesageText, preformatted_text, textlen);
}
else {
- preformatted_text = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
- if (preformatted_text != NULL) {
- CM_SetField(msg, eMesageText, preformatted_text, strlen(preformatted_text));
+ StrBuf *MsgBody;
+ MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
+ if (MsgBody != NULL) {
+ CM_SetAsFieldSB(msg, eMesageText, &MsgBody);
}
}
msg->cm_format_type = 4;
CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
CM_SetField(msg, eOriginalRoom, req_room, strlen(req_room));
- CM_SetField(msg, eNodeName, config.c_nodename, strlen(config.c_nodename));
- CM_SetField(msg, eHumanNode, config.c_humannode, strlen(config.c_humannode));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
msg->cm_flags = flags;
CM_SetAsFieldSB(msg, eMesageText, &encoded_message);