From 965dc19512d1f0873b23623fb8803f7ac989f993 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sat, 27 Sep 2008 16:18:25 +0000 Subject: [PATCH] * rename urlstring parser * add Samjams patch for mime attachments --- webcit/html2html.c | 113 +++++++++++++++++++-------------------------- webcit/messages.c | 2 +- webcit/rss.c | 2 +- webcit/webcit.c | 14 ++---- webcit/webcit.h | 2 +- 5 files changed, 53 insertions(+), 80 deletions(-) diff --git a/webcit/html2html.c b/webcit/html2html.c index 0db2374a1..609ebe038 100644 --- a/webcit/html2html.c +++ b/webcit/html2html.c @@ -78,21 +78,20 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ /** * \brief Sanitize and enhance an HTML message for display. * Also convert weird character sets to UTF-8 if necessary. + * Also fixup img src="cid:..." type inline images to fetch the image * * \param supplied_charset the input charset as declared in the MIME headers */ -void output_html(char *supplied_charset, int treat_as_wiki) { +void output_html(char *supplied_charset, int treat_as_wiki, int msgnum) { char buf[SIZ]; char *msg; char *ptr; char *msgstart; char *msgend; - char *converted_msg; - size_t converted_alloc = 0; + StrBuf *converted_msg; int buffer_length = 1; int line_length = 0; int content_length = 0; - int output_length = 0; char new_window[SIZ]; int brak = 0; int alevel = 0; @@ -265,14 +264,12 @@ void output_html(char *supplied_charset, int treat_as_wiki) { */ /** Now go through the message, parsing tags as necessary. */ - converted_alloc = content_length + 8192; - converted_msg = malloc(converted_alloc); + converted_msg = NewStrBufPlain(NULL, content_length + 8192); if (converted_msg == NULL) { wprintf("Error %d: %s
%s:%d", errno, strerror(errno), __FILE__, __LINE__); goto BAIL; } - strcpy(converted_msg, ""); ptr = msg; msgend = strchr(msg, 0); while (ptr < msgend) { @@ -280,7 +277,7 @@ void output_html(char *supplied_charset, int treat_as_wiki) { /** Try to sanitize the html of any rogue scripts */ if (!strncasecmp(ptr, "= converted_alloc) { - converted_alloc += 8192; - converted_msg = realloc(converted_msg, converted_alloc); - if (converted_msg == NULL) { - abort(); - } - } - sprintf(&converted_msg[output_length], + StrBufAppendPrintf(converted_msg, "'))) ) { /* open external links to new window */ - content_length += 64; - if (content_length >= converted_alloc) { - converted_alloc += 8192; - converted_msg = realloc(converted_msg, converted_alloc); - if (converted_msg == NULL) { - abort(); - } - } - sprintf(&converted_msg[output_length], new_window); - output_length += strlen(new_window); + StrBufAppendPrintf(converted_msg, new_window); ptr = &ptr[8]; } else if ( (treat_as_wiki) && (strncasecmp(ptr, "= converted_alloc) { - converted_alloc += 8192; - converted_msg = realloc(converted_msg, converted_alloc); - if (converted_msg == NULL) { - abort(); - } - } - sprintf(&converted_msg[output_length], "'); + char* src=strstr(ptr, " src=\"cid:"); + char *cid_start, *cid_end; + ++brak; + + if (src && + (cid_start=strchr(src,':')) && + (cid_end=strchr(cid_start,'"')) && + (cid_end < tag_end)) { + + /* copy tag and attributes up to src="cid: */ + StrBufAppendBufPlain(converted_msg, ptr, src - ptr, 0); + cid_start++; + + /* add in /webcit/mimepart//CID/ + trailing / stops dumb URL filters getting excited */ + StrBufAppendPrintf(converted_msg, + "src=\"/webcit/mimepart/%d/",msgnum); + StrBufAppendBufPlain(converted_msg, cid_start, cid_end - cid_start, 0); + StrBufAppendBufPlain(converted_msg, "/\"", -1, 0); + + ptr = cid_end+1; + } + StrBufAppendBufPlain(converted_msg, ptr, tag_end - ptr, 0); + ptr = tag_end; + } /** * Turn anything that looks like a URL into a real link, as long @@ -413,34 +412,17 @@ void output_html(char *supplied_charset, int treat_as_wiki) { ptr[len] = linkedchar; content_length += (32 + linklen); - if (content_length >= converted_alloc) { - converted_alloc += 8192; - converted_msg = realloc(converted_msg, converted_alloc); - if (converted_msg == NULL) { - abort(); - } - } - sprintf(&converted_msg[output_length], new_window); - output_length += strlen(new_window); - converted_msg[output_length] = '\"'; - converted_msg[++output_length] = 0; - for (i=0; i"); - output_length += 2; - for (i=0; i"); - output_length += 4; + StrBufAppendPrintf(converted_msg, "%s\"", new_window); + StrBufAppendBufPlain(converted_msg, ptr, linklen, 0); + StrBufAppendPrintf(converted_msg, "\">"); + StrBufAppendBufPlain(converted_msg, ptr, linklen, 0); + ptr += linklen; + StrBufAppendPrintf(converted_msg, ""); } } else { - converted_msg[output_length] = *ptr++; - converted_msg[++output_length] = 0; + StrBufAppendBufPlain(converted_msg, ptr, 1, 0); + ptr++; } /** @@ -454,8 +436,7 @@ void output_html(char *supplied_charset, int treat_as_wiki) { if (*(ptr-1) == '>') { --brak; if ((scriptlevel == 0) && (script_start_pos >= 0)) { - output_length = script_start_pos; - converted_msg[output_length] = 0; + StrBufCutRight(converted_msg, StrLength(converted_msg) - script_start_pos); script_start_pos = (-1); } } @@ -467,7 +448,7 @@ void output_html(char *supplied_charset, int treat_as_wiki) { /** output_length = content_length; */ /** Output our big pile of markup */ - StrBufAppendBufPlain(WC->WBuf, converted_msg, output_length, 0); + StrBufAppendBuf(WC->WBuf, converted_msg, 0); BAIL: /** A little trailing vertical whitespace... */ wprintf("

\n"); diff --git a/webcit/messages.c b/webcit/messages.c index 2200841f3..29899788e 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -1305,7 +1305,7 @@ void read_message(long msgnum, int printable_view, char *section) { /* HTML is fun, but we've got to strip it first */ else if (!strcasecmp(mime_content_type, "text/html")) { - output_html(mime_charset, (WC->wc_view == VIEW_WIKI ? 1 : 0)); + output_html(mime_charset, (WC->wc_view == VIEW_WIKI ? 1 : 0), msgnum); } /* Unknown weirdness */ diff --git a/webcit/rss.c b/webcit/rss.c index 696ed019c..8a8638f8d 100644 --- a/webcit/rss.c +++ b/webcit/rss.c @@ -338,7 +338,7 @@ void display_rss(char *roomname, StrBuf *request_method) } /** HTML is fun, but we've got to strip it first */ else if (!strcasecmp(content_type, "text/html")) { - output_html(charset, 0); + output_html(charset, 0, WC->msgarr[a]); } ENDBODY: diff --git a/webcit/webcit.c b/webcit/webcit.c index 51105a76b..c14dacfdc 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -95,19 +95,15 @@ void free_url(void *U) /* * Extract variables from the URL. */ -void addurls(StrBuf *url) +void ParseURLParams(StrBuf *url) { const char *aptr, *bptr, *eptr, *up; -/// char *buf; int len, keylen; urlcontent *u; struct wcsession *WCC = WC; if (WCC->urlstrings == NULL) WCC->urlstrings = NewHash(1, NULL); -// buf = (char*) malloc (ulen + 1); -// memcpy(buf, url, ulen); -/// buf[ulen] = '\0'; eptr = ChrPtr(url) + StrLength(url); up = ChrPtr(url); while ((up < eptr) && (!IsEmptyStr(up))) { @@ -115,17 +111,14 @@ void addurls(StrBuf *url) while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '=')) aptr++; if (*aptr != '=') { - ///free(buf); return; } - ///*aptr = '\0'; aptr++; bptr = aptr; while ((bptr < eptr) && (*bptr != '\0') && (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) { bptr++; } - //*bptr = '\0'; keylen = aptr - up - 1; /* -1 -> '=' */ if(keylen > sizeof(u->url_key)) { lprintf(1, "URLkey to long! [%s]", up); @@ -155,7 +148,6 @@ void addurls(StrBuf *url) ChrPtr(u->url_data)); #endif } - //free(buf); } /* @@ -1477,7 +1469,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method if (!strncasecmp(ChrPtr(ContentType), "application/x-www-form-urlencoded", 33)) { StrBufCutLeft(content, body_start); - addurls(content); + ParseURLParams(content); } else if (!strncasecmp(ChrPtr(ContentType), "multipart", 9)) { content_end = ChrPtr(content) + ContentLength + body_start; mime_parser(ChrPtr(content), content_end, *upload_handler, NULL, NULL, NULL, 0); @@ -1499,7 +1491,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method while (pch < pche) { if ((*pch == '?') || (*pch == '&')) { StrBufCutLeft(UrlLine, pch - pchs + 1); - addurls(UrlLine); + ParseURLParams(UrlLine); break; } pch ++; diff --git a/webcit/webcit.h b/webcit/webcit.h index 220c68f7d..468d1ae79 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -742,7 +742,7 @@ int is_msg_in_mset(char *mset, long msgnum); void display_addressbook(long msgnum, char alpha); void offer_start_page(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType); void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext); -void output_html(char *, int); +void output_html(char *, int, int); void do_listsub(void); void toggle_self_service(void); ssize_t write(int fd, const void *buf, size_t count); -- 2.30.2