X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fhtml2html.c;h=ca2404385505ff14f1890d9d4114959e6eec9221;hb=HEAD;hp=2e19e58e9eecb08b40c269573a11173b817532dc;hpb=9135c64dcb9eb6ff2174098f07ee929760a87ac2;p=citadel.git diff --git a/webcit/html2html.c b/webcit/html2html.c index 2e19e58e9..a631eb81b 100644 --- a/webcit/html2html.c +++ b/webcit/html2html.c @@ -1,20 +1,24 @@ /* - * $Id$ - */ -/** - * \defgroup HTML2HTML Output an HTML message, modifying it slightly to make sure it plays nice + * Output an HTML message, modifying it slightly to make sure it plays nice * with the rest of our web framework. - * \ingroup WebcitHttpServer + * + * Copyright (c) 2005-2012 by the citadel.org team + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/*@{*/ + #include "webcit.h" -#include "webserver.h" -/** - * \brief Strip surrounding single or double quotes from a string. - * - * \param s String to be stripped. + +/* + * Strip surrounding single or double quotes from a string. */ void stripquotes(char *s) { @@ -32,12 +36,12 @@ void stripquotes(char *s) } -/** - * \brief Check to see if a META tag has overridden the declared MIME character set. +/* + * Check to see if a META tag has overridden the declared MIME character set. * - * \param charset Character set name (left unchanged if we don't do anything) - * \param meta_http_equiv Content of the "http-equiv" portion of the META tag - * \param meta_content Content of the "content" portion of the META tag + * charset Character set name (left unchanged if we don't do anything) + * meta_http_equiv Content of the "http-equiv" portion of the META tag + * meta_content Content of the "content" portion of the META tag */ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_content) { @@ -55,7 +59,7 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ if (!ptr) return; safestrncpy(buf, ++ptr, sizeof buf); - striplt(buf); + string_trim(buf); if (!strncasecmp(buf, "charset=", 8)) { strcpy(charset, &buf[8]); @@ -72,18 +76,17 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ /* Remove wandering punctuation */ if ((ptr=strchr(charset, '\"'))) *ptr = 0; - striplt(charset); + string_trim(charset); } } -/** - * \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 +/* + * 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(const char *supplied_charset, int treat_as_wiki, int msgnum, StrBuf *Source, StrBuf *Target) { char buf[SIZ]; @@ -106,11 +109,11 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St StrBuf *BodyArea = NULL; #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 */ + 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 if (Target == NULL) Target = WC->WBuf; @@ -128,7 +131,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St StrBufAppendPrintf(Target, _("realloc() error! couldn't get %d bytes: %s"), buffer_length + 1, strerror(errno)); - StrBufAppendPrintf(Target, "

\n"); + StrBufAppendPrintf(Target, "

\n"); while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { /** flush */ } @@ -161,7 +164,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St ++ptr; if ((ptr == NULL) || (ptr >= msgend)) break; - /** + /* * Look for META tags. Some messages (particularly in * Asian locales) illegally declare a message's character * set in the HTML instead of in the MIME headers. This @@ -184,7 +187,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St meta = malloc(meta_length + 1); safestrncpy(meta, meta_start, meta_length); meta[meta_length] = 0; - striplt(meta); + string_trim(meta); if (!strncasecmp(meta, "HTTP-EQUIV=", 11)) { meta_http_equiv = strdup(&meta[11]); spaceptr = strchr(meta_http_equiv, ' '); @@ -206,7 +209,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St } } - /** + /* * Any of these tags cause everything up to and including * the tag to be removed. */ @@ -265,7 +268,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St msgstart = ptr; } - /** + /* * Any of these tags cause everything including and following * the tag to be removed. */ @@ -283,7 +286,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St strcpy(msg, msgstart); } - /** Now go through the message, parsing tags as necessary. */ + /* Now go through the message, parsing tags as necessary. */ converted_msg = NewStrBufPlain(NULL, content_length + 8192); @@ -293,10 +296,10 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St && (strcasecmp(charset, "UTF-8")) && (strcasecmp(charset, "")) ) { - lprintf(9, "Converting %s to UTF-8\n", charset); + syslog(LOG_DEBUG, "Converting %s to UTF-8\n", charset); ctdl_iconv_open("UTF-8", charset, &ic); if (ic == (iconv_t)(-1) ) { - lprintf(5, "%s:%d iconv_open() failed: %s\n", + syslog(LOG_WARNING, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno)); } } @@ -327,7 +330,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St #endif - /** + /* * At this point, the message has been stripped down to * only the content inside the tags, and has * been converted to UTF-8 if it was originally in a foreign @@ -336,7 +339,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St */ if (converted_msg == NULL) { - StrBufAppendPrintf(Target, "Error %d: %s
%s:%d", errno, strerror(errno), __FILE__, __LINE__); + StrBufAppendPrintf(Target, "Error %d: %s
%s:%d", errno, strerror(errno), __FILE__, __LINE__); goto BAIL; } @@ -369,7 +372,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St if (!strncasecmp(ptr, "CurRoom.name, NULL); + StrBufAppendPrintf(converted_msg, "?page="); ptr = &ptr[9]; } else { @@ -397,22 +407,23 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St } /** Fixup '); - + char* src; /* FIXME - handle this situation (maybe someone opened an ') - ||(ptr[i]=='[') - ||(ptr[i]==']') - ||(ptr[i]=='"') - ||(ptr[i]=='\'') + strlenptr = strlen(ptr); + for (i=0; i<=strlenptr; ++i) { + if ((ptr[i]==0) + ||(isspace(ptr[i])) + ||(ptr[i]==10) + ||(ptr[i]==13) + ||(ptr[i]=='(') + ||(ptr[i]==')') + ||(ptr[i]=='<') + ||(ptr[i]=='>') + ||(ptr[i]=='[') + ||(ptr[i]==']') + ||(ptr[i]=='"') + ||(ptr[i]=='\'') ) linklen = i; - /* did s.b. send us an entity? */ - if (ptr[i] == '&') { - if ((ptr[i+2] ==';') || - (ptr[i+3] ==';') || - (ptr[i+5] ==';') || - (ptr[i+6] ==';') || - (ptr[i+7] ==';')) - linklen = i; - } - if (linklen > 0) break; + /* did s.b. send us an entity? */ + if (ptr[i] == '&') { + if ((ptr[i+2] ==';') || + (ptr[i+3] ==';') || + (ptr[i+5] ==';') || + (ptr[i+6] ==';') || + (ptr[i+7] ==';')) + linklen = i; } - if (linklen > 0) { - char *ltreviewptr; - char *nbspreviewptr; - char linkedchar; - int len; + if (linklen > 0) break; + } + if (linklen > 0) { + char *ltreviewptr; + char *nbspreviewptr; + char linkedchar; + int len; - len = linklen; - linkedchar = ptr[len]; - ptr[len] = '\0'; - /* spot for some subject strings tinymce tends to give us. */ - ltreviewptr = strchr(ptr, '<'); - if (ltreviewptr != NULL) { - *ltreviewptr = '\0'; - linklen = ltreviewptr - ptr; - } + len = linklen; + linkedchar = ptr[len]; + ptr[len] = '\0'; + /* spot for some subject strings tinymce tends to give us. */ + ltreviewptr = strchr(ptr, '<'); + if (ltreviewptr != NULL) { + *ltreviewptr = '\0'; + linklen = ltreviewptr - ptr; + } - nbspreviewptr = strstr(ptr, " "); - if (nbspreviewptr != NULL) { - /* nbspreviewptr = '\0'; */ - linklen = nbspreviewptr - ptr; - } - if (ltreviewptr != 0) - *ltreviewptr = '<'; - - ptr[len] = linkedchar; - - content_length += (32 + linklen); - 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, ""); + nbspreviewptr = strstr(ptr, " "); + if (nbspreviewptr != NULL) { + /* nbspreviewptr = '\0'; */ + linklen = nbspreviewptr - ptr; } + if (ltreviewptr != 0) + *ltreviewptr = '<'; + + ptr[len] = linkedchar; + + content_length += (32 + linklen); + 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 { StrBufAppendBufPlain(converted_msg, ptr, 1, 0); @@ -545,7 +557,7 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St StrBufAppendBuf(Target, converted_msg, 0); BAIL: /** A little trailing vertical whitespace... */ - StrBufAppendPrintf(Target, "

\n"); + StrBufAppendPrintf(Target, "

\n"); /** Now give back the memory */ FreeStrBuf(&converted_msg); @@ -618,6 +630,8 @@ void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf) if (TrailerLen > 0) StrBufAppendBufPlain(Target, end, TrailerLen, 0); } + + void url(char *buf, size_t bufsize) { int len, UrlLen, Offset, TrailerLen, outpos; @@ -628,7 +642,7 @@ void url(char *buf, size_t bufsize) start = NULL; len = strlen(buf); if (len > bufsize) { - lprintf(1, "URL: content longer than buffer!"); + syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } end = buf + len; @@ -664,7 +678,7 @@ void url(char *buf, size_t bufsize) UrlLen = end - start; if (UrlLen > sizeof(urlbuf)){ - lprintf(1, "URL: content longer than buffer!"); + syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } memcpy(urlbuf, start, UrlLen); @@ -677,7 +691,7 @@ void url(char *buf, size_t bufsize) "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c", LB, QU, urlbuf, QU, QU, TARGET, QU, RB, urlbuf, LB, RB); if (outpos >= sizeof(outbuf) - Offset) { - lprintf(1, "URL: content longer than buffer!"); + syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } @@ -685,14 +699,10 @@ void url(char *buf, size_t bufsize) if (TrailerLen > 0) memcpy(outbuf + Offset + outpos, end, TrailerLen); if (Offset + outpos + TrailerLen > bufsize) { - lprintf(1, "URL: content longer than buffer!"); + syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } memcpy (buf, outbuf, Offset + outpos + TrailerLen); *(buf + Offset + outpos + TrailerLen) = '\0'; } - - - -/*@}*/