#include "webcit.h"
#include "vcard.h"
#include "webserver.h"
+#include "groupdav.h"
/* Address book entry (keep it short and sweet, it's just a quickie lookup
size_t obuflen; /* Length of output buffer */
char *isav; /* Saved pointer to input buffer */
char *osav; /* Saved pointer to output buffer */
+ int passes = 0;
while (start=strstr(buf, "=?"), end=strstr(buf, "?="),
((start != NULL) && (end != NULL) && (end > start)) )
iconv_close(ic);
}
else {
+ end = start;
+ end++;
+ strcpy(start, "");
+ remove_token(end, 0, '?');
+ remove_token(end, 0, '?');
+ remove_token(end, 0, '?');
+ remove_token(end, 0, '?');
+ strcpy(end, &end[1]);
+
snprintf(newbuf, sizeof newbuf, "%s(unreadable)%s", buf, end);
strcpy(buf, newbuf);
}
free(isav);
+
+ /* Since spammers will go to all sorts of absurd lengths to get their
+ * messages through, there are LOTS of corrupt headers out there.
+ * So, prevent a really badly formed RFC2047 header from throwing
+ * this function into an infinite loop.
+ */
+ ++passes;
+ if (passes > 20) return;
}
}
/*
- * I wanna SEE that message!
+ * I wanna SEE that message! (Optional 'section' for encapsulated message/rfc822 submessage)
*/
-void read_message(long msgnum, int printable_view) {
+void read_message(long msgnum, int printable_view, char *section) {
char buf[SIZ];
char mime_partnum[256];
char mime_filename[256];
char mime_disposition[256];
int mime_length;
char mime_http[SIZ];
+ char mime_submessages[256];
char m_subject[256];
char m_cc[1024];
char from[256];
strcpy(mime_http, "");
strcpy(mime_content_type, "text/plain");
strcpy(mime_charset, "us-ascii");
+ strcpy(mime_submessages, "");
- serv_printf("MSG4 %ld", msgnum);
+ serv_printf("MSG4 %ld|%s", msgnum, section);
serv_getln(buf, sizeof buf);
if (buf[0] != '1') {
wprintf("<STRONG>");
}
safestrncpy(&reply_all[strlen(reply_all)], &buf[5],
(sizeof reply_all - strlen(reply_all)) );
+ lprintf(9, "REPLY_ALL: %s\n", reply_all); // FIXME
}
if ((!strncasecmp(buf, "hnod=", 5))
&& (strcasecmp(&buf[5], serv_info.serv_humannode))) {
extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
mime_length = extract_int(&buf[5], 5);
- if ((!strcasecmp(mime_disposition, "inline"))
+ if (!strcasecmp(mime_content_type, "message/rfc822")) {
+ if (strlen(mime_submessages) > 0) {
+ strcat(mime_submessages, "|");
+ }
+ strcat(mime_submessages, mime_partnum);
+ }
+ else if ((!strcasecmp(mime_disposition, "inline"))
&& (!strncasecmp(mime_content_type, "image/", 6)) ){
snprintf(&mime_http[strlen(mime_http)],
(sizeof(mime_http) - strlen(mime_http) - 1),
"TARGET=\"wc.%ld.%s\">"
"<IMG SRC=\"/static/diskette_24x.gif\" "
"BORDER=0 ALIGN=MIDDLE>\n"
- "Part %s: %s (%s, %d bytes)</A><br />\n",
+ "%s (%s, %d bytes)</A><br />\n",
msgnum, mime_partnum, mime_filename,
msgnum, mime_partnum,
- mime_partnum, mime_filename,
- mime_content_type, mime_length);
+ mime_filename,
+ mime_content_type, mime_length
+ );
}
/*** begin handler prep ***/
urlescputs(reply_to);
wprintf("?cc=");
urlescputs(reply_all);
- wprintf("?subject=");
- if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
- urlescputs(m_subject);
+ if (strlen(m_subject) > 0) {
+ wprintf("?subject=");
+ if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
+ urlescputs(m_subject);
+ }
wprintf("\">[%s]</a> ", _("ReplyAll"));
}
/* Set up a character set conversion if we need to (and if we can) */
#ifdef HAVE_ICONV
+ if (strchr(mime_charset, ';')) strcpy(strchr(mime_charset, ';'), "");
if ( (strcasecmp(mime_charset, "us-ascii"))
- && (strcasecmp(mime_charset, "UTF-8")) ) {
+ && (strcasecmp(mime_charset, "UTF-8"))
+ && (strcasecmp(mime_charset, ""))
+ ) {
ic = iconv_open("UTF-8", mime_charset);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n", __FILE__, __LINE__, mime_charset, strerror(errno));
}
}
#endif
while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { }
}
+ /* If there are attached submessages, display them now... */
+ if ( (strlen(mime_submessages) > 0) && (!section[0]) ) {
+ for (i=0; i<num_tokens(mime_submessages, '|'); ++i) {
+ extract_token(buf, mime_submessages, i, '|', sizeof buf);
+ /* use printable_view to suppress buttons */
+ wprintf("<blockquote>");
+ read_message(msgnum, 1, buf);
+ wprintf("</blockquote>");
+ }
+ }
+
+
/* Afterwards, offer links to download attachments 'n' such */
- if (strlen(mime_http) > 0) {
+ if ( (strlen(mime_http) > 0) && (!section[0]) ) {
wprintf("%s", mime_http);
}
msgnum = atol(bstr("msgnum"));
begin_ajax_response();
- read_message(msgnum, 0);
+ read_message(msgnum, 0, "");
end_ajax_response();
}
"<body onLoad=\" window.print(); window.close(); \">\n"
);
- read_message(msgnum, 1);
+ read_message(msgnum, 1, "");
wprintf("\n</body></html>\n\n");
wDumpContent(0);
/* 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, "UTF-8"))
+ && (strcasecmp(mime_charset, ""))
+ ) {
ic = iconv_open("UTF-8", mime_charset);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "iconv_open() failed: %s\n", strerror(errno));
+ lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno));
}
}
#endif
void display_summarized(int num) {
char datebuf[64];
+ wprintf("<tr bgcolor=\"#%s\" ",
+ ((num % 2) ? "DDDDDD" : "FFFFFF")
+ );
+
+ wprintf("onClick=\" new Ajax.Updater('preview_pane', '/msg', { method: 'get', parameters: 'msgnum=%ld' } ); \" ", WC->summ[num].msgnum);
+ wprintf(">");
+
wprintf("<TD>");
if (WC->summ[num].is_new) wprintf("<B>");
escputs(WC->summ[num].subj);
wprintf(" </TD>");
wprintf("<TD>"
"<INPUT TYPE=\"checkbox\" NAME=\"msg_%ld\" VALUE=\"yes\">"
- "</TD>\n",
+ "</TD>",
WC->summ[num].msgnum
);
+
+ wprintf("</tr>\n");
}
long pn_previous = 0L;
long pn_current = 0L;
long pn_next = 0L;
- int bg = 0;
struct addrbookent *addrbook = NULL;
int num_ab = 0;
char *sortby = NULL;
set_preference(sortpref_name, sortby, 1);
}
if (strlen(sortby) == 0) sortby = sortpref_value;
- if (strlen(sortby) == 0) sortby = "msgid";
+ if (strlen(sortby) == 0) sortby = "rdate";
output_headers(1, 1, 1, 0, 0, 0);
datesort_button = "<a href=\"/readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=date\"><img border=\"0\" src=\"/static/up_pointer.gif\" /></a>" ;
}
else {
- datesort_button = "<a href=\"/readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=date\"><img border=\"0\" src=\"/static/sort_none.gif\" /></a>" ;
+ datesort_button = "<a href=\"/readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=rdate\"><img border=\"0\" src=\"/static/sort_none.gif\" /></a>" ;
}
if (is_summary) {
"<form name=\"msgomatic\" "
"method=\"POST\" action=\"/do_stuff_to_msgs\">\n"
+ "<span class=\"mailbox_summary\">"
"<table border=0 cellspacing=0 "
"cellpadding=0 width=100%%>\n"
"<TR>"
if (a > 0) pn_previous = WC->msgarr[a-1];
if (a < (nummsgs-1)) pn_next = WC->msgarr[a+1];
- /* If a tabular view, set up the line */
- if (is_summary) {
- bg = 1 - bg;
- wprintf("<tr bgcolor=\"#%s\" ",
- (bg ? "DDDDDD" : "FFFFFF")
- );
-
- wprintf("onClick=\" new Ajax.Updater('preview_pane', '/msg', { method: 'get', parameters: 'msgnum=%ld' } ); \" ", WC->summ[a].msgnum);
-
- wprintf(">");
- }
-
/* Display the message */
if (is_summary) {
display_summarized(a);
display_note(WC->msgarr[a]);
}
else {
- read_message(WC->msgarr[a], 0);
- }
-
- /* If a tabular view, finish the line */
- if (is_summary) {
- wprintf("</TR>\n");
+ read_message(WC->msgarr[a], 0, "");
}
if (lowest_displayed < 0) lowest_displayed = a;
}
if (is_summary) {
- wprintf("</table></form>"
+ wprintf("</table></span></form>"
"</div>\n"); /* end of 'fix_scrollbar_bug' div */
wprintf("</div>"); /* end of 'message_list' div */
wprintf("<div id=\"ml_slider\"></div>"); /* slider */
wprintf("<div id=\"preview_pane\">"); /* The preview pane will initially be empty */
+
+ /* Now register each message (whose element ID is "m9999",
+ * where "9999" is the message number) as draggable.
+ wprintf("<script type=\"text/javascript\">\n");
+ for (a = 0; a < nummsgs; ++a) {
+ wprintf("new Draggable('m%ld',{revert:true});\n",
+ WC->summ[a].msgnum);
+ }
+ wprintf("</script>\n");
+ */
}
/* Bump these because although we're thinking in zero base, the user
void display_enter(void)
{
char buf[SIZ];
+ char ebuf[SIZ];
long now;
struct wc_attachment *att;
int recipient_required = 0;
int recipient_bad = 0;
+ int i;
if (strlen(bstr("force_room")) > 0) {
gotoroom(bstr("force_room"));
wprintf("<textarea name=\"msgtext\" cols=\"80\" rows=\"15\">");
+ /* If we're continuing from a previous edit, put our partially-composed message back... */
msgescputs(bstr("msgtext"));
+
+ /* If we're forwarding a message, insert it here... */
if (atol(bstr("fwdquote")) > 0L) {
wprintf("<br><div align=center><i>");
wprintf(_("--- forwarded message ---"));
wprintf("</i></div><br>");
pullquote_message(atol(bstr("fwdquote")), 1);
}
+
+ /* If we're replying quoted, insert the quote here... */
else if (atol(bstr("replyquote")) > 0L) {
wprintf("<br>"
"<blockquote>");
pullquote_message(atol(bstr("replyquote")), 0);
wprintf("</blockquote>");
}
+
+ /* Insert our signature if appropriate... */
+ if ( (WC->is_mailbox) && (strcmp(bstr("sig_inserted"), "yes")) ) {
+ get_preference("use_sig", buf, sizeof buf);
+ if (!strcasecmp(buf, "yes")) {
+ get_preference("signature", ebuf, sizeof ebuf);
+ euid_unescapize(buf, ebuf);
+ wprintf("<br>--<br>");
+ for (i=0; i<strlen(buf); ++i) {
+ if (buf[i] == '\n') {
+ wprintf("<br>");
+ }
+ else if (buf[i] == '<') {
+ wprintf("<");
+ }
+ else if (buf[i] == '>') {
+ wprintf(">");
+ }
+ else if (buf[i] == '&') {
+ wprintf("&");
+ }
+ else if (buf[i] == '\"') {
+ wprintf(""");
+ }
+ else if (buf[i] == '\'') {
+ wprintf("'");
+ }
+ else if (isprint(buf[i])) {
+ wprintf("%c", buf[i]);
+ }
+ }
+ }
+ }
+
wprintf("</textarea>");
wprintf("</center><br />\n");
wprintf("\"> "
"<input type=\"submit\" name=\"cancel_button\" value=\"%s\">\n", _("Cancel"));
+ /* Make sure we only insert our signature once */
+ if (strcmp(bstr("sig_inserted"), "yes")) {
+ wprintf("<INPUT TYPE=\"hidden\" NAME=\"sig_inserted\" VALUE=\"yes\">\n");
+ }
+
wprintf("</form>\n");
wprintf("</td></tr></table></div>\n");
wprintf("<br />\n");
wprintf("<form METHOD=\"POST\" ACTION=\"/move_msg\">\n");
- wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgid\" VALUE=\"%s\">\n",
- bstr("msgid"));
-
+ wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgid\" VALUE=\"%s\">\n", bstr("msgid"));
wprintf("<SELECT NAME=\"target_room\" SIZE=5>\n");
serv_puts("LKRA");