final touches on dkim test harness
[citadel.git] / webcit / html2html.c
index aff7eec7b8849c6bc67c9f7a803afeeff37320c4..a631eb81b44d168894b377d9ad4da91ba4ff62e7 100644 (file)
@@ -2,25 +2,19 @@
  * Output an HTML message, modifying it slightly to make sure it plays nice
  * with the rest of our web framework.
  *
- * Copyright (c) 2005-2010 by the citadel.org team
+ * Copyright (c) 2005-2012 by the citadel.org team
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include "webcit.h"
-#include "webserver.h"
+
 
 
 /*
@@ -65,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]);
 
@@ -82,7 +76,7 @@ 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);
        }
 }
 
@@ -137,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, "</b><br /><br />\n");
+                       StrBufAppendPrintf(Target, "</b><br><br>\n");
                        while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
                                /** flush */
                        }
@@ -193,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, ' ');
@@ -302,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));
                }
        }
@@ -345,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<br />%s:%d", errno, strerror(errno), __FILE__, __LINE__);
+               StrBufAppendPrintf(Target, "Error %d: %s<br>%s:%d", errno, strerror(errno), __FILE__, __LINE__);
                goto BAIL;
        }
 
@@ -394,9 +388,16 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St
                                StrBufAppendPrintf(converted_msg, new_window);
                                ptr = &ptr[8];
                        }
-                       else if ( (treat_as_wiki) && (strncasecmp(ptr, "<a href=\"wiki?", 14)) ) {
+                       else if (
+                               (treat_as_wiki)
+                               && (strncasecmp(ptr, "<a href=\"wiki?", 14))
+                               && (strncasecmp(ptr, "<a href=\"dotgoto?", 17))
+                               && (strncasecmp(ptr, "<a href=\"knrooms?", 17))
+                       ) {
                                content_length += 64;
-                               StrBufAppendPrintf(converted_msg, "<a href=\"wiki?page=");
+                               StrBufAppendPrintf(converted_msg, "<a href=\"wiki?go=");
+                               StrBufUrlescAppend(converted_msg, WC->CurRoom.name, NULL);
+                               StrBufAppendPrintf(converted_msg, "?page=");
                                ptr = &ptr[9];
                        }
                        else {
@@ -413,9 +414,9 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St
                         * and then ended the message)
                         */
                        if (!tag_end) {
-                               lprintf(9, "tag_end is null and ptr is:\n");
-                               lprintf(9, "%s\n", ptr);
-                               lprintf(9, "Theoretical bytes remaining: %d\n", msgend - ptr);
+                               syslog(LOG_DEBUG, "tag_end is null and ptr is:\n");
+                               syslog(LOG_DEBUG, "%s\n", ptr);
+                               syslog(LOG_DEBUG, "Theoretical bytes remaining: %d\n", (int)(msgend - ptr));
                        }
 
                        src=strstr(ptr, "src=\"cid:");
@@ -449,72 +450,73 @@ void output_html(const char *supplied_charset, int treat_as_wiki, int msgnum, St
                 * Turn anything that looks like a URL into a real link, as long
                 * as it's not inside a tag already
                 */
-               else if ( (brak == 0) && (alevel == 0)
-                    && (!strncasecmp(ptr, "http://", 7))) {
-                               /** Find the end of the link */
-                               int strlenptr;
-                               linklen = 0;
+               else if ( (brak == 0) && (alevel == 0) &&
+                         ( (!strncasecmp(ptr, "http://", 7)) ||
+                           (!strncasecmp(ptr, "https://", 8)))) {
+                       /** Find the end of the link */
+                       int strlenptr;
+                       linklen = 0;
                                
-                               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]=='\'')
+                       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, "&nbsp;");
-                                       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, "</A>");
+                               nbspreviewptr = strstr(ptr, "&nbsp;");
+                               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, "</A>");
+                       }
                }
                else {
                        StrBufAppendBufPlain(converted_msg, ptr, 1, 0);
@@ -555,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, "<br /><br />\n");
+       StrBufAppendPrintf(Target, "<br><br>\n");
 
        /** Now give back the memory */
        FreeStrBuf(&converted_msg);
@@ -640,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;
@@ -676,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);
@@ -689,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;
        }
 
@@ -697,7 +699,7 @@ 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);