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);
guchar kar = data[i];
if (space_seen && kar != ' ') {
- g_string_append (html, " ");
+ g_string_append (html, " ");
space_seen = FALSE;
}
break_dist = 0;
if (space_seen) { /* second space in a row */
g_string_append (html, " ");
- space_seen = FALSE;
} else
space_seen = TRUE;
break;
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, ">");
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;
+}