Attached is a conversion to StrBuf

I've tested my stuff but not the rest; I'm still converting it to use more
liberal tag/attribute matches.

I note that uncensored seems not to be living up to it's name, it's censored
one of my messages and seems to be hitting dothebart worse than that.

Sam
Index: rss.c
===================================================================
--- rss.c	(revision 6631)
+++ rss.c	(working copy)
@@ -338,7 +338,7 @@
 		} 
 		/** 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:
Index: html2html.c
===================================================================
--- html2html.c	(revision 6631)
+++ html2html.c	(working copy)
@@ -9,8 +9,8 @@
 /[EMAIL PROTECTED]/
 #include "webcit.h"
 #include "webserver.h"
+#include "libcitadel.h"
 
-
 /**
  * \brief	Strip surrounding single or double quotes from a string.
  *
@@ -78,21 +78,20 @@
 /**
  * \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 @@
 	 */
 
 	/** 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<br />%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 @@
 		/** Try to sanitize the html of any rogue scripts */
 		if (!strncasecmp(ptr, "<script", 7)) {
 			if (scriptlevel == 0) {
-				script_start_pos = output_length;
+				script_start_pos = StrLength(converted_msg);
 			}
 			++scriptlevel;
 		}
@@ -296,16 +293,8 @@
 		 */
 		if (!strncasecmp(ptr, "<a href=\"mailto:", 16)) {
 			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],
+			StrBufAppendPrintf(converted_msg,
 				"<a href=\"display_enter?force_room=_MAIL_&recp=");
-			output_length += 46;
 			ptr = &ptr[16];
 			++alevel;
 			++brak;
@@ -318,38 +307,48 @@
 			     &&  ((strchr(ptr, '/') < strchr(ptr, '>'))) 
 			     ) {
 				/* 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, "<a href=\"wiki?", 14)) ) {
 				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], "<a href=\"wiki?page=");
-				output_length += 19;
+				StrBufAppendPrintf(converted_msg, "<a href=\"wiki?page=");
 				ptr = &ptr[9];
 			}
 			else {
-				sprintf(&converted_msg[output_length], "<a href=\"");
-				output_length += 9;
+				StrBufAppendPrintf(converted_msg, "<a href=\"");
 				ptr = &ptr[9];
 			}
 		}
+		/** Fixup <img src="cid:... ...> to fetch the mime part */
+		else if (!strncasecmp(ptr, "<img ", 5)) {
+			char* tag_end=strchr(ptr,'>');
+			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/<msgno>/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
 		 * as it's not inside a tag already
@@ -413,34 +412,17 @@
 					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<linklen; ++i) {
-						converted_msg[output_length] = ptr[i];
-						converted_msg[++output_length] = 0;
-					}
-					sprintf(&converted_msg[output_length], "\">");
-					output_length += 2;
-					for (i=0; i<linklen; ++i) {
-						converted_msg[output_length] = *ptr++;
-						converted_msg[++output_length] = 0;
-					}
-					sprintf(&converted_msg[output_length], "</A>");
-					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, "</A>");
 				}
 		}
 		else {
-			converted_msg[output_length] = *ptr++;
-			converted_msg[++output_length] = 0;
+			StrBufAppendBufPlain(converted_msg, ptr, 1, 0);
+			ptr++;
 		}
 
 		/**
@@ -454,8 +436,7 @@
 		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 @@
 	/**	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("<br /><br />\n");
Index: webcit.h
===================================================================
--- webcit.h	(revision 6631)
+++ webcit.h	(working copy)
@@ -742,7 +742,7 @@
 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);
Index: messages.c
===================================================================
--- messages.c	(revision 6631)
+++ messages.c	(working copy)
@@ -1305,7 +1305,7 @@
 
 	/* 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 */

Reply via email to