}
-
-/**
- * \brief Read message in simple, JavaScript-embeddable form for 'forward'
- * or 'reply quoted' operations.
- *
- * NOTE: it is VITALLY IMPORTANT that we output no single-quotes or linebreaks
- * in this function. Doing so would throw a JavaScript error in the
- * 'supplied text' argument to the editor.
- *
- * \param msgnum Message number of the message we want to quote
- * \param forward_attachments Nonzero if we want attachments to be forwarded
- */
-void pullquote_message(long msgnum, int forward_attachments, int include_headers) {
- struct wcsession *WCC = WC;
- char buf[SIZ];
- char mime_partnum[256];
- char mime_filename[256];
- char mime_content_type[256];
- char mime_charset[256];
- char mime_disposition[256];
- int mime_length;
- char *attachments = NULL;
- char *ptr = NULL;
- int num_attachments = 0;
- //wc_attachment *att;
- char m_subject[1024];
- char from[256];
- char node[256];
- char rfca[256];
- char to[256];
- char reply_to[512];
- char now[256];
- int format_type = 0;
- int nhdr = 0;
- int bq = 0;
- int i = 0;
-#ifdef HAVE_ICONV
- iconv_t ic = (iconv_t)(-1) ;
- char *ibuf; /**< Buffer of characters to be converted */
- char *obuf; /**< Buffer for converted characters */
- size_t ibuflen; /**< Length of input buffer */
- size_t obuflen; /**< Length of output buffer */
- char *osav; /**< Saved pointer to output buffer */
-#endif
-
- strcpy(from, "");
- strcpy(node, "");
- strcpy(rfca, "");
- strcpy(reply_to, "");
- strcpy(mime_content_type, "text/plain");
- strcpy(mime_charset, "us-ascii");
-
- serv_printf("MSG4 %ld", msgnum);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '1') {
- wprintf(_("ERROR:"));
- wprintf("%s<br />", &buf[4]);
- return;
- }
-
- strcpy(m_subject, "");
-
- while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) {
- if (!strcmp(buf, "000")) {
- wprintf("%s (3)", _("unexpected end of message"));
- return;
- }
- if (include_headers) {
- if (!strncasecmp(buf, "nhdr=yes", 8))
- nhdr = 1;
- if (nhdr == 1)
- buf[0] = '_';
- if (!strncasecmp(buf, "type=", 5))
- format_type = atoi(&buf[5]);
- if (!strncasecmp(buf, "from=", 5)) {
- strcpy(from, &buf[5]);
- wprintf(_("from "));
- utf8ify_rfc822_string(from);
- msgescputs(from);
- }
- if (!strncasecmp(buf, "subj=", 5)) {
- strcpy(m_subject, &buf[5]);
- }
- if ((!strncasecmp(buf, "hnod=", 5))
- && (strcasecmp(&buf[5], serv_info.serv_humannode))) {
- wprintf("(%s) ", &buf[5]);
- }
- if ((!strncasecmp(buf, "room=", 5))
- && (strcasecmp(&buf[5], WC->wc_roomname))
- && (!IsEmptyStr(&buf[5])) ) {
- wprintf(_("in "));
- wprintf("%s> ", &buf[5]);
- }
- if (!strncasecmp(buf, "rfca=", 5)) {
- strcpy(rfca, &buf[5]);
- wprintf("<");
- msgescputs(rfca);
- wprintf("> ");
- }
- if (!strncasecmp(buf, "node=", 5)) {
- strcpy(node, &buf[5]);
- if ( ((WC->room_flags & QR_NETWORK)
- || ((strcasecmp(&buf[5], serv_info.serv_nodename)
- && (strcasecmp(&buf[5], serv_info.serv_fqdn)))))
- && (IsEmptyStr(rfca))
- ) {
- wprintf("@%s ", &buf[5]);
- }
- }
- if (!strncasecmp(buf, "rcpt=", 5)) {
- wprintf(_("to "));
- strcpy(to, &buf[5]);
- utf8ify_rfc822_string(to);
- wprintf("%s ", to);
- }
- if (!strncasecmp(buf, "time=", 5)) {
- webcit_fmt_date(now, atol(&buf[5]), 0);
- wprintf("%s ", now);
- }
- }
-
- /**
- * Save attachment info for later. We can't start downloading them
- * yet because we're in the middle of a server transaction.
- */
- if (!strncasecmp(buf, "part=", 5)) {
- ptr = malloc( (strlen(buf) + ((attachments != NULL) ? strlen(attachments) : 0)) ) ;
- if (ptr != NULL) {
- ++num_attachments;
- sprintf(ptr, "%s%s\n",
- ((attachments != NULL) ? attachments : ""),
- &buf[5]
- );
- free(attachments);
- attachments = ptr;
- lprintf(9, "attachments=<%s>\n", attachments);
- }
- }
-
- }
-
- if (include_headers) {
- wprintf("<br>");
-
- utf8ify_rfc822_string(m_subject);
- if (!IsEmptyStr(m_subject)) {
- wprintf(_("Subject:"));
- wprintf(" ");
- msgescputs(m_subject);
- wprintf("<br />");
- }
-
- /**
- * Begin body
- */
- wprintf("<br />");
- }
-
- /**
- * Learn the content type
- */
- strcpy(mime_content_type, "text/plain");
- while (serv_getln(buf, sizeof buf), (!IsEmptyStr(buf))) {
- if (!strcmp(buf, "000")) {
- wprintf("%s (4)", _("unexpected end of message"));
- goto ENDBODY;
- }
- if (!strncasecmp(buf, "Content-type: ", 14)) {
- int len;
- safestrncpy(mime_content_type, &buf[14],
- sizeof(mime_content_type));
- for (i=0; i<strlen(mime_content_type); ++i) {
- if (!strncasecmp(&mime_content_type[i], "charset=", 8)) {
- safestrncpy(mime_charset, &mime_content_type[i+8],
- sizeof mime_charset);
- }
- }
- len = strlen(mime_content_type);
- for (i=0; i<len; ++i) {
- if (mime_content_type[i] == ';') {
- mime_content_type[i] = 0;
- len = i - 1;
- }
- }
- len = strlen(mime_charset);
- for (i=0; i<len; ++i) {
- if (mime_charset[i] == ';') {
- mime_charset[i] = 0;
- len = i - 1;
- }
- }
- }
- }
-
- /** Set up a character set conversion if we need to (and if we can) */
-#ifdef HAVE_ICONV
- if ( (strcasecmp(mime_charset, "us-ascii"))
- && (strcasecmp(mime_charset, "UTF-8"))
- && (strcasecmp(mime_charset, ""))
- ) {
- ctdl_iconv_open("UTF-8", mime_charset, &ic);
- if (ic == (iconv_t)(-1) ) {
- lprintf(5, "%s:%d iconv_open(%s, %s) failed: %s\n",
- __FILE__, __LINE__, "UTF-8", mime_charset, strerror(errno));
- }
- }
-#endif
-
- /** Messages in legacy Citadel variformat get handled thusly... */
- if (!strcasecmp(mime_content_type, "text/x-citadel-variformat")) {
- pullquote_fmout();
- }
-
- /* Boring old 80-column fixed format text gets handled this way... */
- else if (!strcasecmp(mime_content_type, "text/plain")) {
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- int len;
- len = strlen(buf);
- if ((len > 0) && (buf[len-1] == '\n')) buf[--len] = 0;
- if ((len > 0) && (buf[len-1] == '\r')) buf[--len] = 0;
-
-#ifdef HAVE_ICONV
- if (ic != (iconv_t)(-1) ) {
- ibuf = buf;
- ibuflen = len;
- obuflen = SIZ;
- obuf = (char *) malloc(obuflen);
- osav = obuf;
- iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
- osav[SIZ-obuflen] = 0;
- safestrncpy(buf, osav, sizeof buf);
- free(osav);
- }
-#endif
-
- len = strlen(buf);
- while ((!IsEmptyStr(buf)) && (isspace(buf[len - 1])))
- buf[--len] = 0;
- if ((bq == 0) &&
- ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) )) {
- wprintf("<blockquote>");
- bq = 1;
- } else if ((bq == 1) &&
- (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) ) {
- wprintf("</blockquote>");
- bq = 0;
- }
- wprintf("<tt>");
- url(buf, sizeof(buf));
- msgescputs1(buf);
- wprintf("</tt><br />");
- }
- wprintf("</i><br />");
- }
-
- /** HTML just gets escaped and stuffed back into the editor */
- else if (!strcasecmp(mime_content_type, "text/html")) {
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- strcat(buf, "\n");
- msgescputs(buf);
- }
- }//// TODO: charset? utf8?
-
- /** Unknown weirdness ... don't know how to handle this content type */
- else {
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { }
- }
-
-ENDBODY:
- /** end of body handler */
-
- /*
- * If there were attachments, we have to download them and insert them
- * into the attachment chain for the forwarded message we are composing.
- */
- if ( (forward_attachments) && (num_attachments) ) {
- for (i=0; i<num_attachments; ++i) {
- extract_token(buf, attachments, i, '\n', sizeof buf);
- extract_token(mime_filename, buf, 1, '|', sizeof mime_filename);
- extract_token(mime_partnum, buf, 2, '|', sizeof mime_partnum);
- extract_token(mime_disposition, buf, 3, '|', sizeof mime_disposition);
- extract_token(mime_content_type, buf, 4, '|', sizeof mime_content_type);
- mime_length = extract_int(buf, 5);
-
- /*
- * tracing ... uncomment if necessary
- *
- */
- lprintf(9, "fwd filename: %s\n", mime_filename);
- lprintf(9, "fwd partnum : %s\n", mime_partnum);
- lprintf(9, "fwd conttype: %s\n", mime_content_type);
- lprintf(9, "fwd dispose : %s\n", mime_disposition);
- lprintf(9, "fwd length : %d\n", mime_length);
-
-/// if ( (!strcasecmp(mime_disposition, "inline"))
-/// || (!strcasecmp(mime_disposition, "attachment")) ) {
-
-///// int n;
-///// char N[64];
-///// /* Create an attachment struct from this mime part... */
-///// att = malloc(sizeof(wc_attachment));
-///// memset(att, 0, sizeof(wc_attachment));
-///// att->length = mime_length;
-///// att->content_type = NewStrBufPlain(mime_content_type, -1);
-///// att->filename = NewStrBufPlain(mime_filename, -1);
-///// att->data = load_mimepart(msgnum, mime_partnum);
-/////
-///// 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, free_attachment);
-///// }
-
- }
- }
-
-#ifdef HAVE_ICONV
- if (ic != (iconv_t)(-1) ) {
- iconv_close(ic);
- }
-#endif
-
- if (attachments != NULL) {
- free(attachments);
- }
-}
-
-
-
-
message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSubject, long MsgNum)
{
void *vEval;