From: Wilfried Göesgens Date: Wed, 14 Feb 2007 20:59:24 +0000 (+0000) Subject: * get synced with citadels mime_parser X-Git-Tag: v7.86~3581 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=fbdda1a05be0a42b063a5aeb8dbe0b715b21bb55 * get synced with citadels mime_parser * replace _'s in subjects * tell what we did to the debs --- diff --git a/webcit/debian/changelog b/webcit/debian/changelog index 7bf865002..89b04874b 100644 --- a/webcit/debian/changelog +++ b/webcit/debian/changelog @@ -1,3 +1,9 @@ +webcit (7.02-9) unstable; urgency=high + + * fixed some quoted printable bugs. + * thierys fixes to the css + + -- Wilfried Goesgens Wed, 14 Feb 2007 21:09:00 +0100 webcit (7.02-8) unstable; urgency=low * be more fault tolerant. diff --git a/webcit/messages.c b/webcit/messages.c index 9e05d552d..96fe8cbe3 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -127,7 +127,18 @@ void utf8ify_rfc822_string(char *buf) { ibuflen = CtdlDecodeBase64(ibuf, istr, strlen(istr)); } else if (!strcasecmp(encoding, "Q")) { /**< quoted-printable */ - ibuflen = CtdlDecodeQuotedPrintable(ibuf, istr, strlen(istr)); + size_t len; + long pos; + + len = strlen(istr); + pos = 0; + while (pos < len) + { + if (istr[pos] == '_') istr[pos] = ' '; + pos++; + } + + ibuflen = CtdlDecodeQuotedPrintable(ibuf, istr, len); } else { strcpy(ibuf, istr); /**< unknown encoding */ diff --git a/webcit/mime_parser.c b/webcit/mime_parser.c index 33b249b50..18b0d9788 100644 --- a/webcit/mime_parser.c +++ b/webcit/mime_parser.c @@ -49,72 +49,47 @@ char *fixed_partnum(char *supplied_partnum) { /* * Convert "quoted-printable" to binary. Returns number of bytes decoded. + * according to RFC2045 section 6.7 */ int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) { - char buf[SIZ]; - int buf_length = 0; - int soft_line_break = 0; unsigned int ch; - int decoded_length = 0; - int i; + int destpos = 1; + int sourcepos = 1; + int ignore_last = 0; + char *check; decoded[0] = 0; - decoded_length = 0; - memset(buf, '\0', SIZ); - buf_length = 0; - - for (i = 0; i < sourcelen; ++i) { - size_t buflen = strlen(buf); - buf[buf_length++] = encoded[i]; - - if ( (encoded[i] == '\n') - || (encoded[i] == 0) - || (i == (sourcelen-1)) ) { - buf[buf_length++] = 0; - - /*** begin -- process one line ***/ - - if (buf[buflen-1] == '\n') { - buf[buflen-1] = 0; - buflen --; - } - if (buf[buflen-1] == '\r') { - buf[buflen-1] = 0; - buflen --; - } - while (isspace(buf[buflen-1])) { - buf[buflen-1] = 0; - buflen --; - } - soft_line_break = 0; - - while (buflen > 0) { - if ((buf[0] == '=') && (buf[1] == '\0')) { - soft_line_break = 1; - buf[0] = '\0'; - buflen = 0; - } else if ((buflen>=3) && (buf[0]=='=')) { - sscanf(&buf[1], "%02x", &ch); - decoded[decoded_length++] = ch; - strcpy(buf, &buf[3]); - buflen -=3; - } else { - decoded[decoded_length++] = buf[0]; - strcpy(buf, &buf[1]); - buflen --; - } + if (sourcelen >0) + decoded[0] = encoded[0]; + while (sourcepos <= sourcelen){ + check = &decoded[destpos]; + decoded[destpos] = encoded[sourcepos]; + if ((ignore_last == 0) && (decoded[destpos-1] == '=')) + { + if ((*check == '\0') || + (*check == '\n') || + (*check == '\r')) + { + decoded[destpos - 1] = '\0'; + destpos-=2; } - if (soft_line_break == 0) { - decoded[decoded_length++] = '\r'; - decoded[decoded_length++] = '\n'; + else if (sourcelen - sourcepos > 2) + { + sscanf(&encoded[sourcepos], "%02x", &ch); + decoded[destpos - 1] = ch; + sourcepos++; + destpos --; + ignore_last = 1; } - buf_length = 0; - /*** end -- process one line ***/ } + else + ignore_last = 0; + destpos ++; + sourcepos ++; } - decoded[decoded_length++] = 0; - return(decoded_length); + decoded[destpos] = 0; + return(destpos - 1); } /*