From: Nathan W. <fac...@us...> - 2003-10-20 20:42:43
|
Update of /cvsroot/gaim/gaim/src/protocols/jabber In directory sc8-pr-cvs1:/tmp/cvs-serv24950/src/protocols/jabber Modified Files: buddy.c jutil.c jutil.h message.c Log Message: this should implement the full nodeprep, nameprep, and resourceprep string profiles, so we compare JIDs correctly Index: buddy.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/buddy.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -p -r1.7 -r1.8 --- buddy.c 13 Oct 2003 18:54:40 -0000 1.7 +++ buddy.c 20 Oct 2003 20:41:42 -0000 1.8 @@ -537,7 +537,7 @@ static void jabber_vcard_parse(JabberStr JabberBuddy *jb; JabberBuddyResource *jbr; GString *info_text; - const char *resource_name; + char *resource_name; char *title; xmlnode *vcard; @@ -586,6 +586,8 @@ static void jabber_vcard_parse(JabberStr g_free(purdy); } } + + g_free(resource_name); if((vcard = xmlnode_get_child(packet, "vCard"))) { xmlnode *child; Index: jutil.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/jutil.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -p -r1.6 -r1.7 --- jutil.c 14 Oct 2003 16:44:35 -0000 1.6 +++ jutil.c 20 Oct 2003 20:41:42 -0000 1.7 @@ -116,34 +116,78 @@ jabber_id_new(const char *str) { 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 @@ jabber_id_free(JabberID *jid) } -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 @@ const char *jabber_normalize(const char g_free(tmp); return buf; } + Index: jutil.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/jutil.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- jutil.h 14 Oct 2003 16:44:35 -0000 1.3 +++ jutil.h 20 Oct 2003 20:41:42 -0000 1.4 @@ -34,7 +34,7 @@ typedef struct _JabberID { JabberID* jabber_id_new(const char *str); void jabber_id_free(JabberID *jid); -const char *jabber_get_resource(const char *jid); +char *jabber_get_resource(const char *jid); char *jabber_get_bare_jid(const char *jid); time_t str_to_time(const char *timestamp); Index: message.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/message.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -p -r1.10 -r1.11 --- message.c 14 Oct 2003 05:07:38 -0000 1.10 +++ message.c 20 Oct 2003 20:41:42 -0000 1.11 @@ -79,7 +79,7 @@ static void handle_chat(JabberMessage *j JabberBuddyResource *jbr; jb = jabber_buddy_find(jm->js, jm->from, TRUE); - jbr = jabber_buddy_find_resource(jb, jabber_get_resource(jm->from)); + jbr = jabber_buddy_find_resource(jb, jid->resource); if(find_unnormalized_conv(jm->from, jm->js->gc->account)) { from = g_strdup(jm->from); @@ -174,7 +174,7 @@ static void handle_groupchat(JabberMessa jm->subject); if(jm->xhtml || jm->body) - serv_got_chat_in(jm->js->gc, chat->id, jabber_get_resource(jm->from), + serv_got_chat_in(jm->js->gc, chat->id, jid->resource, 0, jm->xhtml ? jm->xhtml : jm->body, jm->sent); jabber_id_free(jid); } @@ -412,12 +412,17 @@ int jabber_message_send_im(GaimConnectio JabberBuddyResource *jbr; char *buf; char *xhtml; + char *resource; if(!who || !msg) return 0; + resource = jabber_get_resource(who); + jb = jabber_buddy_find(gc->proto_data, who, TRUE); - jbr = jabber_buddy_find_resource(jb, jabber_get_resource(who)); + jbr = jabber_buddy_find_resource(jb, resource); + + g_free(resource); jm = g_new0(JabberMessage, 1); jm->js = gc->proto_data; @@ -468,9 +473,12 @@ int jabber_send_typing(GaimConnection *g JabberMessage *jm; JabberBuddy *jb; JabberBuddyResource *jbr; + char *resource = jabber_get_resource(who); jb = jabber_buddy_find(gc->proto_data, who, TRUE); - jbr = jabber_buddy_find_resource(jb, jabber_get_resource(who)); + jbr = jabber_buddy_find_resource(jb, resource); + + g_free(resource); if(!jbr || !(jbr->capabilities & JABBER_CAP_COMPOSING)) return 0; |