static void decode_transfer_encoding(char *line, unsigned linesize) { char *ep; switch (transfer_encoding) { case TE_QP: ep = line + strlen(line); decode_q_segment(line, line, linesize, ep, 0); break; case TE_BASE64: ep = line + strlen(line); decode_b_segment(line, line, linesize, ep); break; case TE_DONTCARE: break; } }
static void add_header_to_string(struct string *str, unsigned char *header) { unsigned char *end; while ((end = strstr((const char *)header, "=?")) != NULL) { int encoding; unsigned char *cp, *sp; if (header != end) { add_html_to_string(str, header, end - header); header = end; } /* E.g. * ep : "=?iso-2022-jp?B?GyR...?= foo" * ep : "=?ISO-8859-1?Q?Foo=FCbar?= baz" */ end += 2; cp = strchr((const char *)end, '?'); if (!cp) break; for (sp = end; sp < cp; sp++) /* charset */; encoding = c_tolower(cp[1]); if (!encoding || cp[2] != '?') break; cp += 3; end = strstr((const char *)(cp + 3), "?="); if (!end) break; if (encoding == 'b') decode_b_segment(str, cp, end); else if (encoding == 'q') decode_q_segment(str, cp, end); else break; header = end + 2; } add_html_to_string(str, header, strlen(header)); }
static void decode_transfer_encoding(struct strbuf *line) { struct strbuf *ret; switch (transfer_encoding) { case TE_QP: ret = decode_q_segment(line, 0); break; case TE_BASE64: ret = decode_b_segment(line); break; case TE_DONTCARE: default: return; } strbuf_reset(line); strbuf_addbuf(line, ret); strbuf_release(ret); free(ret); }
static int decode_header_bq(struct strbuf *it) { char *in, *ep, *cp; struct strbuf outbuf = STRBUF_INIT, *dec; struct strbuf charset_q = STRBUF_INIT, piecebuf = STRBUF_INIT; int rfc2047 = 0; in = it->buf; while (in - it->buf <= it->len && (ep = strstr(in, "=?")) != NULL) { int encoding; strbuf_reset(&charset_q); strbuf_reset(&piecebuf); rfc2047 = 1; if (in != ep) { /* * We are about to process an encoded-word * that begins at ep, but there is something * before the encoded word. */ char *scan; for (scan = in; scan < ep; scan++) if (!isspace(*scan)) break; if (scan != ep || in == it->buf) { /* * We should not lose that "something", * unless we have just processed an * encoded-word, and there is only LWS * before the one we are about to process. */ strbuf_add(&outbuf, in, ep - in); } } /* E.g. * ep : "=?iso-2022-jp?B?GyR...?= foo" * ep : "=?ISO-8859-1?Q?Foo=FCbar?= baz" */ ep += 2; if (ep - it->buf >= it->len || !(cp = strchr(ep, '?'))) goto decode_header_bq_out; if (cp + 3 - it->buf > it->len) goto decode_header_bq_out; strbuf_add(&charset_q, ep, cp - ep); encoding = cp[1]; if (!encoding || cp[2] != '?') goto decode_header_bq_out; ep = strstr(cp + 3, "?="); if (!ep) goto decode_header_bq_out; strbuf_add(&piecebuf, cp + 3, ep - cp - 3); switch (tolower(encoding)) { default: goto decode_header_bq_out; case 'b': dec = decode_b_segment(&piecebuf); break; case 'q': dec = decode_q_segment(&piecebuf, 1); break; } if (metainfo_charset) convert_to_utf8(dec, charset_q.buf); strbuf_addbuf(&outbuf, dec); strbuf_release(dec); free(dec); in = ep + 2; } strbuf_addstr(&outbuf, in); strbuf_reset(it); strbuf_addbuf(it, &outbuf); decode_header_bq_out: strbuf_release(&outbuf); strbuf_release(&charset_q); strbuf_release(&piecebuf); return rfc2047; }
static int decode_header_bq(char *it, unsigned itsize) { char *in, *out, *ep, *cp, *sp; char outbuf[1000]; int rfc2047 = 0; in = it; out = outbuf; while ((ep = strstr(in, "=?")) != NULL) { int sz, encoding; char charset_q[256], piecebuf[256]; rfc2047 = 1; if (in != ep) { sz = ep - in; memcpy(out, in, sz); out += sz; in += sz; } /* E.g. * ep : "=?iso-2022-jp?B?GyR...?= foo" * ep : "=?ISO-8859-1?Q?Foo=FCbar?= baz" */ ep += 2; cp = strchr(ep, '?'); if (!cp) return rfc2047; /* no munging */ for (sp = ep; sp < cp; sp++) charset_q[sp - ep] = tolower(*sp); charset_q[cp - ep] = 0; encoding = cp[1]; if (!encoding || cp[2] != '?') return rfc2047; /* no munging */ ep = strstr(cp + 3, "?="); if (!ep) return rfc2047; /* no munging */ switch (tolower(encoding)) { default: return rfc2047; /* no munging */ case 'b': sz = decode_b_segment(cp + 3, piecebuf, sizeof(piecebuf), ep); break; case 'q': sz = decode_q_segment(cp + 3, piecebuf, sizeof(piecebuf), ep, 1); break; } if (sz < 0) return rfc2047; if (metainfo_charset) convert_to_utf8(piecebuf, sizeof(piecebuf), charset_q); sz = strlen(piecebuf); if (outbuf + sizeof(outbuf) <= out + sz) return rfc2047; /* no munging */ strcpy(out, piecebuf); out += sz; in = ep + 2; } strcpy(out, in); strlcpy(it, outbuf, itsize); return rfc2047; }