X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit-ng%2Fhtml2html.c;h=25884aad53ef1e9c09b0bf7f3dee132407a213d9;hb=91bc31f50a6d93ad0c01d24e29e61a3f5b972cba;hp=f7db44db9475f5d7ef71aa635c9e9c37fb5befaf;hpb=1de34ae393d0f8bf9c1fb9131765ee50449f4806;p=citadel.git diff --git a/webcit-ng/html2html.c b/webcit-ng/html2html.c index f7db44db9..25884aad5 100644 --- a/webcit-ng/html2html.c +++ b/webcit-ng/html2html.c @@ -1,17 +1,18 @@ -/* - * Output an HTML message, modifying it slightly to make sure it plays nice - * with the rest of our web framework. - * - * Copyright (c) 2005-2017 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. - */ +// +// Output an HTML message, modifying it slightly to make sure it plays nice +// with the rest of our web framework. +// +// Copyright (c) 2005-2018 by the citadel.org team +// +// This program is open source software. It runs great on the +// Linux operating system (and probably elsewhere). You can use, +// copy, and run it under the terms of the GNU General Public +// License version 3. Richard Stallman is an asshole communist. +// +// 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" @@ -23,13 +24,15 @@ void stripquotes(char *s) { int len; - if (!s) return; + if (!s) + return; len = strlen(s); - if (len < 2) return; + if (len < 2) + return; - if ( ( (s[0] == '\"') && (s[len-1] == '\"') ) || ( (s[0] == '\'') && (s[len-1] == '\'') ) ) { - s[len-1] = 0; + if (((s[0] == '\"') && (s[len - 1] == '\"')) || ((s[0] == '\'') && (s[len - 1] == '\''))) { + s[len - 1] = 0; strcpy(s, &s[1]); } } @@ -47,14 +50,19 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ char *ptr; char buf[64]; - if (!charset) return; - if (!meta_http_equiv) return; - if (!meta_content) return; + if (!charset) + return; + if (!meta_http_equiv) + return; + if (!meta_content) + return; - if (strcasecmp(meta_http_equiv, "Content-type")) return; + if (strcasecmp(meta_http_equiv, "Content-type")) + return; ptr = strchr(meta_content, ';'); - if (!ptr) return; + if (!ptr) + return; safestrncpy(buf, ++ptr, sizeof buf); striplt(buf); @@ -73,7 +81,8 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ } /* Remove wandering punctuation */ - if ((ptr=strchr(charset, '\"'))) *ptr = 0; + if ((ptr = strchr(charset, '\"'))) + *ptr = 0; striplt(charset); } } @@ -85,7 +94,8 @@ void extract_charset_from_meta(char *charset, char *meta_http_equiv, char *meta_ * Also fixup img src="cid:..." type inline images to fetch the image * */ -StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source) { +StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source) +{ char buf[SIZ]; char *msg; char *ptr; @@ -105,27 +115,32 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam char charset[128]; StrBuf *BodyArea = NULL; - 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 */ + 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 */ if (msg == NULL) { - return(NULL); + return (NULL); } StrBuf *Target = NewStrBuf(); if (Target == NULL) { - return(NULL); + return (NULL); } + TRACE; + syslog(LOG_DEBUG, "CONVERT: <%s>", ChrPtr(Source)); + + + safestrncpy(charset, supplied_charset, sizeof charset); sprintf(new_window, "'); - if ((ptr == NULL) || (ptr >= msgend)) break; + if ((ptr == NULL) || (ptr >= msgend)) + break; if ((pBody != NULL) && (ptr - pBody > 4)) { char *src; char *cid_start, *cid_end; *ptr = '\0'; - pBody += 4; + pBody += 4; while ((isspace(*pBody)) && (pBody < ptr)) - pBody ++; - BodyArea = NewStrBufPlain(NULL, ptr - pBody); + pBody++; + BodyArea = NewStrBufPlain(NULL, ptr - pBody); if (pBody < ptr) { src = strstr(pBody, "cid:"); if (src) { cid_start = src + 4; cid_end = cid_start; - while ((*cid_end != '"') && - !isspace(*cid_end) && - (cid_end < ptr)) - cid_end ++; + while ((*cid_end != '"') && !isspace(*cid_end) && (cid_end < ptr)) + cid_end++; /* copy tag and attributes up to src="cid: */ StrBufAppendBufPlain(BodyArea, pBody, src - pBody, 0); /* add in /webcit/mimepart//CID/ trailing / stops dumb URL filters getting excited */ - StrBufAppendPrintf(BodyArea, - "/webcit/mimepart/%ld/",msgnum); + StrBufAppendPrintf(BodyArea, "/webcit/mimepart/%ld/", msgnum); StrBufAppendBufPlain(BodyArea, cid_start, cid_end - cid_start, 0); if (ptr - cid_end > 0) - StrBufAppendBufPlain(BodyArea, - cid_end + 1, - ptr - cid_end, 0); - } - else + StrBufAppendBufPlain(BodyArea, cid_end + 1, ptr - cid_end, 0); + } else StrBufAppendBufPlain(BodyArea, pBody, ptr - pBody, 0); } *ptr = '>'; } ++ptr; - if ((ptr == NULL) || (ptr >= msgend)) break; + if ((ptr == NULL) || (ptr >= msgend)) + break; msgstart = ptr; } @@ -248,7 +261,7 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam * Any of these tags cause everything including and following * the tag to be removed. */ - if ( (!strncasecmp(ptr, "/HTML", 5)) ||(!strncasecmp(ptr, "/BODY", 5)) ) { + if ((!strncasecmp(ptr, "/HTML", 5)) || (!strncasecmp(ptr, "/BODY", 5))) { --ptr; msgend = ptr; strcpy(ptr, ""); @@ -264,21 +277,21 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam converted_msg = NewStrBufPlain(NULL, content_length + 8192); /* Convert foreign character sets to UTF-8 if necessary. */ - if ( (strcasecmp(charset, "us-ascii")) - && (strcasecmp(charset, "UTF-8")) - && (strcasecmp(charset, "")) - ) { + if ((strcasecmp(charset, "us-ascii")) + && (strcasecmp(charset, "UTF-8")) + && (strcasecmp(charset, "")) + ) { syslog(LOG_DEBUG, "Converting %s to UTF-8", charset); ctdl_iconv_open("UTF-8", charset, &ic); - if (ic == (iconv_t)(-1) ) { + if (ic == (iconv_t) (-1)) { syslog(LOG_WARNING, "%s:%d iconv_open() failed: %s", __FILE__, __LINE__, strerror(errno)); } } - if (Source == NULL) { - if (ic != (iconv_t)(-1) ) { + if (Source == NULL) { + if (ic != (iconv_t) (-1)) { ibuf = msg; ibuflen = content_length; - obuflen = content_length + (content_length / 2) ; + obuflen = content_length + (content_length / 2); obuf = (char *) malloc(obuflen); osav = obuf; iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen); @@ -288,14 +301,13 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam msg = osav; iconv_close(ic); } - } - else { - if (ic != (iconv_t)(-1) ) { + } else { + if (ic != (iconv_t) (-1)) { StrBuf *Buf = NewStrBufPlain(NULL, StrLength(Source) + 8096);; StrBufConvert(Source, Buf, &ic); FreeStrBuf(&Buf); iconv_close(ic); - msg = (char*)ChrPtr(Source); /* TODO: get rid of this. */ + msg = (char *) ChrPtr(Source); /* TODO: get rid of this. */ } } @@ -312,8 +324,8 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam goto BAIL; } - if (BodyArea != NULL) { // Any attributes that were declared in the tag - StrBufAppendBufPlain(converted_msg, HKEY("
tag + if (BodyArea != NULL) { // Any attributes that were declared in the tag + StrBufAppendBufPlain(converted_msg, HKEY("
tag StrBufAppendBuf(converted_msg, BodyArea, 0); StrBufAppendBufPlain(converted_msg, HKEY(">"), 0); } @@ -349,24 +361,21 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam else if (!strncasecmp(ptr, "')))) { + if (((strchr(ptr, ':') < strchr(ptr, '/'))) && ((strchr(ptr, '/') < strchr(ptr, '>')))) { /* open external links to new window */ StrBufAppendPrintf(converted_msg, new_window); ptr = &ptr[8]; - } - else if ( - (treat_as_wiki) - && (strncasecmp(ptr, "'); - char* src; + char *tag_end = strchr(ptr, '>'); + char *src; /* FIXME - handle this situation (maybe someone opened an ') - ||(ptr[i]=='[') - ||(ptr[i]==']') - ||(ptr[i]=='"') - ||(ptr[i]=='\'') - ) linklen = i; + 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; /* entity tag? */ if (ptr[i] == '&') { - if ((ptr[i+2] ==';') || - (ptr[i+3] ==';') || - (ptr[i+5] ==';') || - (ptr[i+6] ==';') || - (ptr[i+7] ==';')) + if ((ptr[i + 2] == ';') || + (ptr[i + 3] == ';') || + (ptr[i + 5] == ';') || (ptr[i + 6] == ';') || (ptr[i + 7] == ';')) linklen = i; } - if (linklen > 0) break; + if (linklen > 0) + break; } if (linklen > 0) { char *ltreviewptr; char *nbspreviewptr; char linkedchar; int len; - + len = linklen; linkedchar = ptr[len]; ptr[len] = '\0'; @@ -484,8 +489,7 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam ptr += linklen; StrBufAppendPrintf(converted_msg, ""); } - } - else { + } else { StrBufAppendBufPlain(converted_msg, ptr, 1, 0); ptr++; } @@ -496,39 +500,41 @@ StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomnam * so we don't turn things that look like URL's into * links, when they're already links - or image sources. */ - if ((ptr > msg) && (*(ptr-1) == '<')) { + if ((ptr > msg) && (*(ptr - 1) == '<')) { ++brak; } - if ((ptr > msg) && (*(ptr-1) == '>')) { + if ((ptr > msg) && (*(ptr - 1) == '>')) { --brak; if ((scriptlevel == 0) && (script_start_pos >= 0)) { StrBufCutRight(converted_msg, StrLength(converted_msg) - script_start_pos); script_start_pos = (-1); } } - if (!strncasecmp(ptr, "", 3)) --alevel; + if (!strncasecmp(ptr, "", 3)) + --alevel; } } if (BodyArea != NULL) { - StrBufAppendBufPlain(converted_msg, HKEY("
"), 0); // Close the div where we declared attributes copied - FreeStrBuf(&BodyArea); // from the original tag + StrBufAppendBufPlain(converted_msg, HKEY("
"), 0); // Close the div where we declared attributes copied + FreeStrBuf(&BodyArea); // from the original tag } - /* uncomment these two lines to override conversion */ - /* memcpy(converted_msg, msg, content_length); */ - /* output_length = content_length; */ + /* uncomment these two lines to override conversion */ + /* memcpy(converted_msg, msg, content_length); */ + /* output_length = content_length; */ /* Output our big pile of markup */ StrBufAppendBuf(Target, converted_msg, 0); -BAIL: /* A little trailing vertical whitespace... */ + BAIL: /* A little trailing vertical whitespace... */ StrBufAppendPrintf(Target, "
\n"); /* Now give back the memory */ FreeStrBuf(&converted_msg); - if ((msg != NULL) && (Source == NULL)) free(msg); - return(Target); + if ((msg != NULL) && (Source == NULL)) + free(msg); + return (Target); } @@ -536,11 +542,11 @@ BAIL: /* A little trailing vertical whitespace... */ * Look for URL's embedded in a buffer and make them linkable. We use a * target window in order to keep the Citadel session in its own window. */ -void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf) +void UrlizeText(StrBuf * Target, StrBuf * Source, StrBuf * WrkBuf) { int len, UrlLen, Offset, TrailerLen; const char *start, *end, *pos; - + FlushStrBuf(Target); start = NULL; len = StrLength(Source); @@ -559,25 +565,25 @@ void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf) FlushStrBuf(WrkBuf); for (pos = ChrPtr(Source) + len; pos > start; --pos) { - if ( (!isprint(*pos)) - || (isspace(*pos)) - || (*pos == '{') - || (*pos == '}') - || (*pos == '|') - || (*pos == '\\') - || (*pos == '^') - || (*pos == '[') - || (*pos == ']') - || (*pos == '`') - || (*pos == '<') - || (*pos == '>') - || (*pos == '(') - || (*pos == ')') - ) { + if ((!isprint(*pos)) + || (isspace(*pos)) + || (*pos == '{') + || (*pos == '}') + || (*pos == '|') + || (*pos == '\\') + || (*pos == '^') + || (*pos == '[') + || (*pos == ']') + || (*pos == '`') + || (*pos == '<') + || (*pos == '>') + || (*pos == '(') + || (*pos == ')') + ) { end = pos; } } - + UrlLen = end - start; StrBufAppendBufPlain(WrkBuf, start, UrlLen, 0); @@ -585,8 +591,7 @@ void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf) if (Offset != 0) StrBufAppendBufPlain(Target, ChrPtr(Source), Offset, 0); StrBufAppendPrintf(Target, "%ca href=%c%s%c TARGET=%c%s%c%c%s%c/A%c", - LB, QU, ChrPtr(WrkBuf), QU, QU, TARGET, - QU, RB, ChrPtr(WrkBuf), LB, RB); + LB, QU, ChrPtr(WrkBuf), QU, QU, TARGET, QU, RB, ChrPtr(WrkBuf), LB, RB); TrailerLen = StrLength(Source) - (end - ChrPtr(Source)); if (TrailerLen > 0) @@ -618,28 +623,28 @@ void url(char *buf, size_t bufsize) if (start == NULL) return; - for (pos = buf+len; pos > start; --pos) { - if ( (!isprint(*pos)) - || (isspace(*pos)) - || (*pos == '{') - || (*pos == '}') - || (*pos == '|') - || (*pos == '\\') - || (*pos == '^') - || (*pos == '[') - || (*pos == ']') - || (*pos == '`') - || (*pos == '<') - || (*pos == '>') - || (*pos == '(') - || (*pos == ')') - ) { + for (pos = buf + len; pos > start; --pos) { + if ((!isprint(*pos)) + || (isspace(*pos)) + || (*pos == '{') + || (*pos == '}') + || (*pos == '|') + || (*pos == '\\') + || (*pos == '^') + || (*pos == '[') + || (*pos == ']') + || (*pos == '`') + || (*pos == '<') + || (*pos == '>') + || (*pos == '(') + || (*pos == ')') + ) { end = pos; } } - + UrlLen = end - start; - if (UrlLen > sizeof(urlbuf)){ + if (UrlLen > sizeof(urlbuf)) { syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } @@ -649,9 +654,8 @@ void url(char *buf, size_t bufsize) Offset = start - buf; if ((Offset != 0) && (Offset < sizeof(outbuf))) memcpy(outbuf, buf, Offset); - outpos = snprintf(&outbuf[Offset], sizeof(outbuf) - Offset, - "%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); + outpos = snprintf(&outbuf[Offset], sizeof(outbuf) - Offset, + "%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) { syslog(LOG_WARNING, "URL: content longer than buffer!"); return; @@ -664,6 +668,6 @@ void url(char *buf, size_t bufsize) syslog(LOG_WARNING, "URL: content longer than buffer!"); return; } - memcpy (buf, outbuf, Offset + outpos + TrailerLen); + memcpy(buf, outbuf, Offset + outpos + TrailerLen); *(buf + Offset + outpos + TrailerLen) = '\0'; }