X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=5b7c0bdda4987c18889e1e02416c75c9c4bcc023;hp=2b7cbb5abee79cbd60f180ae1dc9a97a1150a095;hb=e5257b19bddccd4992b445fc828d03d09366ba25;hpb=28fbc4e0d124d6c3d41cfd970ad699fe48555182 diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 2b7cbb5..5b7c0bd 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -316,7 +316,23 @@ modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix) tmp += prefix_len; tmp = g_strchug (tmp); } else { - break; + gchar *prefix_down, *tmp_down; + + /* We need this to properly check the cases of + some clients adding FW: instead of Fw: for + example */ + prefix_down = g_utf8_strdown (prefix, -1); + tmp_down = g_utf8_strdown (tmp, -1); + if (g_str_has_prefix (tmp_down, prefix_down)) { + tmp += prefix_len; + tmp = g_strchug (tmp); + g_free (prefix_down); + g_free (tmp_down); + } else { + g_free (prefix_down); + g_free (tmp_down); + break; + } } } while (tmp); @@ -1922,6 +1938,7 @@ modest_text_utils_simplify_recipients (const gchar *recipients) for (node = addresses; node != NULL; node = g_slist_next (node)) { const gchar *address = (const gchar *) node->data; gchar *left_limit, *right_limit; + left_limit = strstr (address, "<"); right_limit = g_strrstr (address, ">"); @@ -1991,3 +2008,38 @@ modest_text_utils_remove_duplicate_addresses_list (GSList *address_list) return new_list; } + +gchar * +modest_text_utils_get_secure_header (const gchar *value, + const gchar *header) +{ + const gint max_len = 128; + gchar *new_value = NULL; + gchar *needle = g_strrstr (value, header); + + if (needle && value != needle) + new_value = g_strdup (needle + strlen (header)); + + if (!new_value) + new_value = g_strdup (value); + + /* Do a max length check to prevent DoS attacks caused by huge + malformed headers */ + if (g_utf8_validate (new_value, -1, NULL)) { + if (g_utf8_strlen (new_value, -1) > max_len) { + gchar *tmp = g_malloc0 (max_len * 4); + g_utf8_strncpy (tmp, (const gchar *) new_value, max_len); + g_free (new_value); + new_value = tmp; + } + } else { + if (strlen (new_value) > max_len) { + gchar *tmp = g_malloc0 (max_len); + strncpy (new_value, tmp, max_len); + g_free (new_value); + new_value = tmp; + } + } + + return new_value; +}