* mu-contacts: convert the domain part of ascii-domains to lowercase

This commit is contained in:
djcb 2013-04-07 16:03:25 +03:00
parent 3c4b351e69
commit 4cfeb201af
1 changed files with 38 additions and 2 deletions

View File

@ -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);