tAnother support for malformed header encodings in buggy MUAs. - rohrpost - A commandline mail client to change the world as we see it.
(HTM) git clone git://r-36.net/rohrpost
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit c4bb4f33ce4ca8e7f040aba158d0fa807f9b5d89
(DIR) parent c1cd5dd02d6645c597a81f5f1efb681af9f59095
(HTM) Author: Christoph Lohmann <20h@r-36.net>
Date: Wed, 25 Jul 2012 18:01:41 +0200
Another support for malformed header encodings in buggy MUAs.
Diffstat:
mime.c | 19 +++++++++++++++++++
mime.h | 1 +
scan.c | 18 ++++++++++++------
view.c | 6 +++---
4 files changed, 35 insertions(+), 9 deletions(-)
---
(DIR) diff --git a/mime.c b/mime.c
t@@ -296,6 +296,25 @@ mime_decodeheader(char *value)
}
char *
+mime_decodeheaderdefault(char *value, char *charset)
+{
+ char *ret, *rdec;
+
+ ret = mime_decodeheader(value);
+ if (ret != NULL) {
+ if (strcasecmp(charset, "utf-8")) {
+ rdec = mime_iconv(ret, charset, "UTF-8");
+ if (rdec != NULL) {
+ free(ret);
+ ret = rdec;
+ }
+ }
+ }
+
+ return ret;
+}
+
+char *
mime_decodeparam(char *value)
{
char *work, *cret, *ret, *cs, *str, *lang;
(DIR) diff --git a/mime.h b/mime.h
t@@ -36,6 +36,7 @@ char *mime_iconv(char *str, char *from, char *to);
char *mime_decodeheaderext(char *value);
int mime_isextws(char *str, int len);
char *mime_decodeheader(char *value);
+char *mime_decodeheaderdefault(char *value, char *charset);
char *mime_decodeparam(char *value);
char *mime_encodestring(char *value);
char *mime_encodeheader(char *header, char *value);
(DIR) diff --git a/scan.c b/scan.c
t@@ -93,8 +93,9 @@ scanmain(int argc, char *argv[])
frome = llist_ciget(mime->hdrs, "from");
if (subjecte != NULL) {
- subject = mime_decodeheader(
- (char *)subjecte->data);
+ subject = mime_decodeheaderdefault(
+ (char *)subjecte->data,
+ mime->charset);
} else {
subject = "<empty>";
}
t@@ -111,7 +112,9 @@ scanmain(int argc, char *argv[])
}
if (frome != NULL) {
- from = mime_decodeheader((char *)frome->data);
+ from = mime_decodeheaderdefault(
+ (char *)frome->data,
+ mime->charset);
} else {
from = "<empty>";
}
t@@ -166,8 +169,9 @@ scanmain(int argc, char *argv[])
id = (char *)ide->data;
if (subjecte != NULL) {
- subject = mime_decodeheader(
- (char *)subjecte->data);
+ subject = mime_decodeheaderdefault(
+ (char *)subjecte->data,
+ mime->charset);
} else {
subject = "<empty>";
}
t@@ -184,7 +188,9 @@ scanmain(int argc, char *argv[])
}
if (frome != NULL) {
- from = mime_decodeheader((char *)frome->data);
+ from = mime_decodeheaderdefault(
+ (char *)frome->data,
+ mime->charset);
} else {
from = "<empty>";
}
(DIR) diff --git a/view.c b/view.c
t@@ -141,7 +141,7 @@ view_printpart(char *id, mime_t *mime, llist_t *dhdrs, llist_t *partl,
didprint = 0;
if (!strcasecmp(dhdrs->first->key, "all")) {
forllist(mime->hdrs, helem) {
- hvalue = mime_decodeheader((char *)helem->data);
+ hvalue = mime_decodeheaderdefault((char *)helem->data, mime->charset);
if (hvalue == NULL)
continue;
if (options & PRINT_VALUE) {
t@@ -157,8 +157,8 @@ view_printpart(char *id, mime_t *mime, llist_t *dhdrs, llist_t *partl,
hlist = llist_cifind(mime->hdrs, delem->key);
if (hlist != NULL) {
forllist(hlist, helem) {
- hvalue = mime_decodeheader(
- (char *)helem->data);
+ hvalue = mime_decodeheaderdefault(
+ (char *)helem->data, mime->charset);
if (hvalue == NULL)
continue;
if (options & PRINT_VALUE) {