| 115 |
115 |
| 116 void jabber_roster_parse(JabberStream *js, xmlnode *packet) |
116 void jabber_roster_parse(JabberStream *js, xmlnode *packet) |
| 117 { |
117 { |
| 118 xmlnode *query, *item, *group; |
118 xmlnode *query, *item, *group; |
| 119 const char *from = xmlnode_get_attrib(packet, "from"); |
119 const char *from = xmlnode_get_attrib(packet, "from"); |
| 120 char *me1, *me2; |
120 |
| 121 |
121 if(from) { |
| 122 me1 = g_strdup_printf("%s@%s", js->user->node, js->user->domain); |
122 char *me, *from_norm; |
| 123 me2 = g_strdup_printf("%s/%s", me1, js->user->resource); |
123 JabberID *from_jid = jabber_id_new(from); |
| 124 |
124 gboolean invalid; |
| 125 if(from && strcmp(from, me1) && strcmp(from, me2)) { |
125 |
| 126 g_free(me1); |
126 if(!from_jid) |
| 127 g_free(me2); |
127 return; |
| 128 return; |
128 |
| 129 } |
129 from_norm = g_strdup_printf("%s@%s%s%s", |
| 130 |
130 from_jid->node ? from_jid->node : "", |
| 131 g_free(me1); |
131 from_jid->domain, |
| 132 g_free(me2); |
132 from_jid->resource ? "/" : "", |
| |
133 from_jid->resource ? from_jid->resource : ""); |
| |
134 |
| |
135 if(from_jid->resource) |
| |
136 me = g_strdup_printf("%s@%s/%s", js->user->node, js->user->domain, |
| |
137 js->user->resource); |
| |
138 else |
| |
139 me = g_strdup_printf("%s@%s", js->user->node, js->user->domain); |
| |
140 |
| |
141 invalid = g_utf8_collate(from_norm, me); |
| |
142 g_free(from_norm); |
| |
143 g_free(me); |
| |
144 jabber_id_free(from_jid); |
| |
145 |
| |
146 if(invalid) |
| |
147 return; |
| |
148 } |
| 133 |
149 |
| 134 query = xmlnode_get_child(packet, "query"); |
150 query = xmlnode_get_child(packet, "query"); |
| 135 if(!query) |
151 if(!query) |
| 136 return; |
152 return; |
| 137 |
153 |