Mercurial > pidgin
diff src/protocols/jabber/jutil.c @ 7306:7c12dab8e513
[gaim-migrate @ 7890]
this should implement the full nodeprep, nameprep, and resourceprep string
profiles, so we compare JIDs correctly
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Mon, 20 Oct 2003 20:41:42 +0000 |
parents | 85fcaff1505d |
children | dd4b4a187171 |
line wrap: on
line diff
--- a/src/protocols/jabber/jutil.c Mon Oct 20 05:08:05 2003 +0000 +++ b/src/protocols/jabber/jutil.c Mon Oct 20 20:41:42 2003 +0000 @@ -116,32 +116,76 @@ { char *at; char *slash; + char *c; JabberID *jid; - if(!str) + if(!str || !g_utf8_validate(str, -1, NULL)) return NULL; jid = g_new0(JabberID, 1); - at = strchr(str, '@'); - slash = strchr(str, '/'); + at = g_utf8_strchr(str, -1, '@'); + slash = g_utf8_strchr(str, -1, '/'); if(at) { - jid->node = g_strndup(str, at-str); + jid->node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC); if(slash) { - jid->domain = g_strndup(at+1, slash-(at+1)); - jid->resource = g_strdup(slash+1); + jid->domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC); + jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); } else { - jid->domain = g_strdup(at+1); + jid->domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC); } } else { if(slash) { - jid->domain = g_strndup(str, slash-str); - jid->resource = g_strdup(slash+1); + jid->domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC); + jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); } else { - jid->domain = g_strdup(str); + jid->domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC); + } + } + + + /* check lengths */ + if((jid->node && strlen(jid->node) > 1023) || + (jid->domain && strlen(jid->domain) > 1023) || + (jid->resource && strlen(jid->resource) > 1023)) { + jabber_id_free(jid); + return NULL; + } + + /* nodeprep */ + c = jid->node; + while(c && *c) { + gunichar ch = g_utf8_get_char(c); + if(ch == '\"' || ch == '&' || ch == '\'' || ch == '/' || ch == ':' || + ch == '<' || ch == '>' || ch == '@' || !g_unichar_isgraph(ch)) { + jabber_id_free(jid); + return NULL; } + c = g_utf8_next_char(c); + } + + /* nameprep */ + c = jid->domain; + while(c && *c) { + gunichar ch = g_utf8_get_char(c); + if(!g_unichar_isgraph(ch)) { + jabber_id_free(jid); + return NULL; + } + c = g_utf8_next_char(c); + } + + /* resourceprep */ + c = jid->resource; + while(c && *c) { + gunichar ch = g_utf8_get_char(c); + if(!g_unichar_isgraph(ch)) { + jabber_id_free(jid); + return NULL; + } + c = g_utf8_next_char(c); } return jid; @@ -162,26 +206,32 @@ } -const char *jabber_get_resource(const char *jid) +char *jabber_get_resource(const char *in) { - char *slash; + JabberID *jid = jabber_id_new(in); + char *out; - slash = strrchr(jid, '/'); - if(slash) - return slash+1; - else + if(!jid) return NULL; + + out = g_strdup(jid->resource); + jabber_id_free(jid); + + return out; } -char *jabber_get_bare_jid(const char *jid) +char *jabber_get_bare_jid(const char *in) { - char *slash; - slash = strrchr(jid, '/'); + JabberID *jid = jabber_id_new(in); + char *out; - if(slash) - return g_utf8_strdown(jid, slash - jid); - else - return g_utf8_strdown(jid, -1); + if(!jid) + return NULL; + + out = g_strdup_printf("%s@%s", jid->node, jid->domain); + jabber_id_free(jid); + + return out; } const char *jabber_normalize(const char *in) @@ -194,3 +244,4 @@ g_free(tmp); return buf; } +