From 4cfeb201af881dd756fd297999e6fbebfa403cae Mon Sep 17 00:00:00 2001 From: djcb Date: Sun, 7 Apr 2013 16:03:25 +0300 Subject: [PATCH] * mu-contacts: convert the domain part of ascii-domains to lowercase --- lib/mu-contacts.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/mu-contacts.c b/lib/mu-contacts.c index 13348dc7..92b330e7 100644 --- a/lib/mu-contacts.c +++ b/lib/mu-contacts.c @@ -236,6 +236,36 @@ encode_email_address (const char *addr) return enc; } + +/* downcase the domain-part of the email address, but only if it + * consists of ascii (to prevent screwing up idna addresses) + */ +char* +downcase_domain_maybe (const char *addr) +{ + char *addr_conv, *at, *cur; + + addr_conv = g_strdup (addr); + + if (!(at = strchr (addr_conv, '@'))) { /*huh?*/ + g_free (addr_conv); + return NULL; + } + + for (cur = at + 1; *cur; ++cur) { + if (isascii(*cur)) + *cur = g_ascii_tolower (*cur); + else { /* non-ascii; return the unchanged original */ + g_free (addr_conv); + return g_strdup (addr); + } + + } + + return addr_conv; +} + + gboolean mu_contacts_add (MuContacts *self, const char *addr, const char *name, gboolean personal, time_t tstamp) @@ -249,12 +279,18 @@ mu_contacts_add (MuContacts *self, const char *addr, const char *name, /* add the info, if either there is no info for this email * yet, *OR* the new one is more recent and does not have an * empty name */ - group = encode_email_address (addr); + group = encode_email_address (addr); + cinfo = (ContactInfo*) g_hash_table_lookup (self->_hash, group); if (!cinfo || (cinfo->_tstamp < tstamp && !mu_str_is_empty(name))) { + char *addr_dc; ContactInfo *ci; - ci = contact_info_new (g_strdup(addr), + + if (!(addr_dc = downcase_domain_maybe (addr))) + return FALSE; + + ci = contact_info_new (addr_dc, name ? g_strdup(name) : NULL, personal, tstamp); g_hash_table_insert (self->_hash, g_strdup(group), ci);