From f787f3b9ee9eca31772cc9f36eea9125cf8173a4 Mon Sep 17 00:00:00 2001 From: djcb Date: Wed, 15 May 2013 00:08:38 +0300 Subject: [PATCH] * lib: cleanup header fields a bit more; fixes #209 --- lib/mu-msg-file.c | 48 +++++++++++++++++++++++++---------------------- lib/mu-msg-sexp.c | 11 +++++++++-- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/lib/mu-msg-file.c b/lib/mu-msg-file.c index d28da180..89302ca0 100644 --- a/lib/mu-msg-file.c +++ b/lib/mu-msg-file.c @@ -592,28 +592,34 @@ get_tags (MuMsgFile *self) } -/* wrongly encoded messages may cause GMime to return invalid - * UTF8... we double check, and ensure our output is always correct - * utf8 */ -gchar * -maybe_cleanup (const char* str, const char *path, gboolean *do_free) +static char* +cleanup_maybe (const char *str, gboolean *do_free) { - if (!str || G_LIKELY(g_utf8_validate(str, -1, NULL))) - return (char*)str; + char *cur, *s; - g_debug ("invalid utf8 in %s", path); + if (!str) + return NULL; - if (*do_free) - return mu_str_asciify_in_place ((char*)str); - else { - gchar *ascii; - ascii = mu_str_asciify_in_place(g_strdup (str)); - *do_free = TRUE; - return ascii; - } + if (!g_utf8_validate(str, -1, NULL)) { + if (*do_free) + s = mu_str_asciify_in_place ((char*)str); + else { + *do_free = TRUE; + s = mu_str_asciify_in_place(g_strdup (str)); + } + } else + s = (char*)str; + + /* strip control chars */ + for (cur = s; *cur; ++cur) + if (iscntrl(*cur)) + *cur = ' '; + + return s; } + G_GNUC_CONST static GMimeRecipientType recipient_type (MuMsgFieldId mfid) { @@ -659,9 +665,8 @@ mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, return get_recipient (self, recipient_type(mfid)); case MU_MSG_FIELD_ID_FROM: - return (char*)maybe_cleanup - (g_mime_message_get_sender (self->_mime_msg), - self->_path, do_free); + return (char*)cleanup_maybe + (g_mime_message_get_sender (self->_mime_msg), do_free); case MU_MSG_FIELD_ID_PATH: return self->_path; @@ -670,9 +675,8 @@ mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, return (char*)get_mailing_list (self); case MU_MSG_FIELD_ID_SUBJECT: - return (char*)maybe_cleanup - (g_mime_message_get_subject (self->_mime_msg), - self->_path, do_free); + return (char*)cleanup_maybe + (g_mime_message_get_subject (self->_mime_msg), do_free); case MU_MSG_FIELD_ID_MSGID: return get_msgid (self, do_free); diff --git a/lib/mu-msg-sexp.c b/lib/mu-msg-sexp.c index 5d6eeb60..f0a179b9 100644 --- a/lib/mu-msg-sexp.c +++ b/lib/mu-msg-sexp.c @@ -17,6 +17,7 @@ ** */ #include +#include #include "mu-str.h" #include "mu-msg.h" @@ -49,12 +50,18 @@ append_sexp_attr_list (GString *gstr, const char* elm, const GSList *lst) static void append_sexp_attr (GString *gstr, const char* elm, const char *str) { - gchar *esc; + gchar *esc, *utf8, *cur; if (!str || strlen(str) == 0) return; /* empty: don't include */ - esc = mu_str_escape_c_literal (str, TRUE); + utf8 = mu_str_utf8ify (str); + for (cur = utf8; *cur; ++cur) + if (iscntrl(*cur)) + *cur = ' '; + + esc = mu_str_escape_c_literal (utf8, TRUE); + g_free (utf8); g_string_append_printf (gstr, "\t:%s %s\n", elm, esc); g_free (esc);