Sun, 12 Jan 2014 22:51:33 -0800
Prevent spoofing of iq replies by verifying that the 'from' address
matches the 'to' address of the iq request.
This full extent of this problem was realized by Thijs Alkemade, while
investigating a problem reported to us by Fabian Yamaguchi and Christian
Wressnegger of the University of Goettingen)
This change was created by Thijs Alkemade, with small shuffling and
variable renaming by me.
| 7014 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 7014 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28155
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28155
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28155
diff
changeset
|
6 | * source distribution. |
| 7014 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
18443
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7014 | 21 | * |
| 22 | */ | |
| 23 | #include "internal.h" | |
|
18441
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
24 | #include "core.h" |
| 7014 | 25 | #include "debug.h" |
| 26 | #include "prefs.h" | |
| 10941 | 27 | #include "util.h" |
| 7014 | 28 | |
| 7395 | 29 | #include "buddy.h" |
| 8312 | 30 | #include "disco.h" |
|
29913
58f5122fbcd3
First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents:
29399
diff
changeset
|
31 | #include "google/gmail.h" |
|
58f5122fbcd3
First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents:
29399
diff
changeset
|
32 | #include "google/google.h" |
|
58f5122fbcd3
First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents:
29399
diff
changeset
|
33 | #include "google/jingleinfo.h" |
|
58f5122fbcd3
First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents:
29399
diff
changeset
|
34 | #include "google/google_session.h" |
| 7014 | 35 | #include "iq.h" |
|
26143
673b6665624d
Restructure Jingle code to more easily support multiple application types.
Michael Ruprecht <maiku@pidgin.im>
parents:
23754
diff
changeset
|
36 | #include "jingle/jingle.h" |
| 7170 | 37 | #include "oob.h" |
| 7014 | 38 | #include "roster.h" |
| 7395 | 39 | #include "si.h" |
|
17769
69d98a4da006
applied patch for supporting XEP-0199: XMPP Ping
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
40 | #include "ping.h" |
|
17805
5bd417a1c847
Implemented XEP-0050: Ad-Hoc Commands. Note that this XEP requires sending an initial command to the peer, which is not implemented in libpurple itself (since this requires a discovery browser or equivalent).
Andreas Monitzer <am@adiumx.com>
parents:
17769
diff
changeset
|
41 | #include "adhoccommands.h" |
|
23626
e21afec2f485
Custom smileys for XMPP according to XEP 0231. Refs #5627.
Marcus Lundblad <malu@pidgin.im>
parents:
23076
diff
changeset
|
42 | #include "data.h" |
|
24372
830701cec96f
Implements file transfers using in-band bytestreams for XMPP
Marcus Lundblad <malu@pidgin.im>
parents:
23076
diff
changeset
|
43 | #include "ibb.h" |
| 7014 | 44 | |
|
7058
c62db98b7a2a
[gaim-migrate @ 7621]
Herman Bloggs <herman@bluedigits.com>
parents:
7014
diff
changeset
|
45 | #ifdef _WIN32 |
|
c62db98b7a2a
[gaim-migrate @ 7621]
Herman Bloggs <herman@bluedigits.com>
parents:
7014
diff
changeset
|
46 | #include "utsname.h" |
|
c62db98b7a2a
[gaim-migrate @ 7621]
Herman Bloggs <herman@bluedigits.com>
parents:
7014
diff
changeset
|
47 | #endif |
| 7014 | 48 | |
|
29399
cce925ddb58a
These should be static
Paul Aurich <darkrain42@pidgin.im>
parents:
29359
diff
changeset
|
49 | static GHashTable *iq_handlers = NULL; |
|
cce925ddb58a
These should be static
Paul Aurich <darkrain42@pidgin.im>
parents:
29359
diff
changeset
|
50 | static GHashTable *signal_iq_handlers = NULL; |
| 14356 | 51 | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
52 | struct _JabberIqCallbackData { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
53 | JabberIqCallback *callback; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
54 | gpointer data; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
55 | JabberID *to; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
56 | }; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
57 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
58 | void jabber_iq_callbackdata_free(JabberIqCallbackData *jcd) |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
59 | { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
60 | jabber_id_free(jcd->to); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
61 | g_free(jcd); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
62 | } |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
63 | |
| 7014 | 64 | JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) |
| 65 | { | |
| 66 | JabberIq *iq; | |
| 67 | ||
| 68 | iq = g_new0(JabberIq, 1); | |
| 69 | ||
| 70 | iq->type = type; | |
| 71 | ||
| 72 | iq->node = xmlnode_new("iq"); | |
| 73 | switch(iq->type) { | |
| 74 | case JABBER_IQ_SET: | |
| 75 | xmlnode_set_attrib(iq->node, "type", "set"); | |
| 76 | break; | |
| 77 | case JABBER_IQ_GET: | |
| 78 | xmlnode_set_attrib(iq->node, "type", "get"); | |
| 79 | break; | |
| 80 | case JABBER_IQ_ERROR: | |
| 81 | xmlnode_set_attrib(iq->node, "type", "error"); | |
| 82 | break; | |
| 83 | case JABBER_IQ_RESULT: | |
| 84 | xmlnode_set_attrib(iq->node, "type", "result"); | |
| 85 | break; | |
| 86 | case JABBER_IQ_NONE: | |
| 87 | /* this shouldn't ever happen */ | |
| 88 | break; | |
| 89 | } | |
| 90 | ||
| 91 | iq->js = js; | |
| 92 | ||
| 93 | if(type == JABBER_IQ_GET || type == JABBER_IQ_SET) { | |
| 94 | iq->id = jabber_get_next_id(js); | |
| 95 | xmlnode_set_attrib(iq->node, "id", iq->id); | |
| 96 | } | |
| 97 | ||
| 98 | return iq; | |
| 99 | } | |
| 100 | ||
| 101 | JabberIq *jabber_iq_new_query(JabberStream *js, JabberIqType type, | |
| 102 | const char *xmlns) | |
| 103 | { | |
| 104 | JabberIq *iq = jabber_iq_new(js, type); | |
| 105 | xmlnode *query; | |
| 106 | ||
| 107 | query = xmlnode_new_child(iq->node, "query"); | |
| 13808 | 108 | xmlnode_set_namespace(query, xmlns); |
| 7014 | 109 | |
| 110 | return iq; | |
| 111 | } | |
| 112 | ||
| 7395 | 113 | void |
| 114 | jabber_iq_set_callback(JabberIq *iq, JabberIqCallback *callback, gpointer data) | |
| 7014 | 115 | { |
| 116 | iq->callback = callback; | |
| 7395 | 117 | iq->callback_data = data; |
| 7014 | 118 | } |
| 119 | ||
| 120 | void jabber_iq_set_id(JabberIq *iq, const char *id) | |
| 121 | { | |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
122 | g_free(iq->id); |
| 7014 | 123 | |
| 124 | if(id) { | |
| 125 | xmlnode_set_attrib(iq->node, "id", id); | |
| 126 | iq->id = g_strdup(id); | |
| 127 | } else { | |
| 128 | xmlnode_remove_attrib(iq->node, "id"); | |
| 129 | iq->id = NULL; | |
| 130 | } | |
| 131 | } | |
| 132 | ||
| 133 | void jabber_iq_send(JabberIq *iq) | |
| 134 | { | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
135 | JabberIqCallbackData *jcd; |
| 7014 | 136 | g_return_if_fail(iq != NULL); |
| 137 | ||
| 138 | jabber_send(iq->js, iq->node); | |
| 139 | ||
| 7395 | 140 | if(iq->id && iq->callback) { |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
141 | jcd = g_new0(JabberIqCallbackData, 1); |
| 7395 | 142 | jcd->callback = iq->callback; |
| 143 | jcd->data = iq->callback_data; | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
144 | jcd->to = jabber_id_new(xmlnode_get_attrib(iq->node, "to")); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
145 | |
| 8312 | 146 | g_hash_table_insert(iq->js->iq_callbacks, g_strdup(iq->id), jcd); |
| 7395 | 147 | } |
| 7014 | 148 | |
| 149 | jabber_iq_free(iq); | |
| 150 | } | |
| 151 | ||
| 152 | void jabber_iq_free(JabberIq *iq) | |
| 153 | { | |
| 154 | g_return_if_fail(iq != NULL); | |
| 155 | ||
| 156 | g_free(iq->id); | |
| 157 | xmlnode_free(iq->node); | |
| 158 | g_free(iq); | |
| 159 | } | |
| 160 | ||
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
161 | static void jabber_iq_last_parse(JabberStream *js, const char *from, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
162 | JabberIqType type, const char *id, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
163 | xmlnode *packet) |
| 7014 | 164 | { |
| 165 | JabberIq *iq; | |
| 166 | xmlnode *query; | |
|
14453
1cc75906700c
[gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents:
14375
diff
changeset
|
167 | char *idle_time; |
| 7014 | 168 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
169 | if(type == JABBER_IQ_GET) { |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
170 | iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, NS_LAST_ACTIVITY); |
| 8006 | 171 | jabber_iq_set_id(iq, id); |
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
172 | if (from) |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
173 | xmlnode_set_attrib(iq->node, "to", from); |
| 7014 | 174 | |
| 8006 | 175 | query = xmlnode_get_child(iq->node, "query"); |
| 7014 | 176 | |
|
14453
1cc75906700c
[gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents:
14375
diff
changeset
|
177 | idle_time = g_strdup_printf("%ld", js->idle ? time(NULL) - js->idle : 0); |
|
1cc75906700c
[gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents:
14375
diff
changeset
|
178 | xmlnode_set_attrib(query, "seconds", idle_time); |
|
1cc75906700c
[gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents:
14375
diff
changeset
|
179 | g_free(idle_time); |
| 7401 | 180 | |
| 8006 | 181 | jabber_iq_send(iq); |
| 182 | } | |
| 7014 | 183 | } |
| 184 | ||
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
185 | static void jabber_time_parse(JabberStream *js, const char *from, |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
186 | JabberIqType type, const char *id, |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
187 | xmlnode *child) |
| 7014 | 188 | { |
| 189 | JabberIq *iq; | |
| 190 | time_t now_t; | |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
191 | struct tm *tm; |
|
9722
c1072806bcae
[gaim-migrate @ 10583]
Mark Doliner <markdoliner@pidgin.im>
parents:
9709
diff
changeset
|
192 | |
| 7014 | 193 | time(&now_t); |
|
18317
6c814e134e56
support replying to XEP-0202 queries
Nathan Walp <nwalp@pidgin.im>
parents:
18194
diff
changeset
|
194 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
195 | if(type == JABBER_IQ_GET) { |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
196 | xmlnode *tzo, *utc; |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
197 | const char *date, *tz; |
| 7014 | 198 | |
|
25556
300d8959e04c
Fix the implementation of XEP-0202 (Entity Time) (thanks again to Marcus)
Paul Aurich <darkrain42@pidgin.im>
parents:
25554
diff
changeset
|
199 | iq = jabber_iq_new(js, JABBER_IQ_RESULT); |
| 8006 | 200 | jabber_iq_set_id(iq, id); |
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
201 | if (from) |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
202 | xmlnode_set_attrib(iq->node, "to", from); |
| 7014 | 203 | |
|
25556
300d8959e04c
Fix the implementation of XEP-0202 (Entity Time) (thanks again to Marcus)
Paul Aurich <darkrain42@pidgin.im>
parents:
25554
diff
changeset
|
204 | child = xmlnode_new_child(iq->node, child->name); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
205 | xmlnode_set_namespace(child, NS_ENTITY_TIME); |
| 10941 | 206 | |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
207 | /* <tzo>-06:00</tzo> */ |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
208 | tm = localtime(&now_t); |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
209 | tz = purple_get_tzoff_str(tm, TRUE); |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
210 | tzo = xmlnode_new_child(child, "tzo"); |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
211 | xmlnode_insert_data(tzo, tz, -1); |
| 10941 | 212 | |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
213 | /* <utc>2006-12-19T17:58:35Z</utc> */ |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
214 | tm = gmtime(&now_t); |
|
29020
ac6acf2722f3
jabber: Don't use C99 time formatters, which are apparently not available on Windows when using MSVC.
Florian Quèze <florian@instantbird.org>
parents:
28984
diff
changeset
|
215 | date = purple_utf8_strftime("%Y-%m-%dT%H:%M:%SZ", tm); |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
216 | utc = xmlnode_new_child(child, "utc"); |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
217 | xmlnode_insert_data(utc, date, -1); |
| 7014 | 218 | |
| 8006 | 219 | jabber_iq_send(iq); |
|
27433
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
220 | } else { |
|
8eaac1cf4214
Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents:
27175
diff
changeset
|
221 | /* TODO: Errors */ |
|
18181
736c6abf62f4
respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents:
17753
diff
changeset
|
222 | } |
|
736c6abf62f4
respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents:
17753
diff
changeset
|
223 | } |
|
736c6abf62f4
respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents:
17753
diff
changeset
|
224 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
225 | static void jabber_iq_version_parse(JabberStream *js, const char *from, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
226 | JabberIqType type, const char *id, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
227 | xmlnode *packet) |
| 7014 | 228 | { |
| 229 | JabberIq *iq; | |
| 230 | xmlnode *query; | |
| 231 | ||
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
232 | if(type == JABBER_IQ_GET) { |
|
18441
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
233 | GHashTable *ui_info; |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
234 | const char *ui_name = NULL, *ui_version = NULL; |
|
20116
9952c317df4c
applied changes from 8543caa9958f323a231c630bebd65c74dec3401f
Richard Laager <rlaager@pidgin.im>
parents:
19897
diff
changeset
|
235 | #if 0 |
|
20225
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
20116
diff
changeset
|
236 | char *os = NULL; |
| 15884 | 237 | if(!purple_prefs_get_bool("/plugins/prpl/jabber/hide_os")) { |
| 8006 | 238 | struct utsname osinfo; |
| 7014 | 239 | |
| 8006 | 240 | uname(&osinfo); |
| 241 | os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release, | |
| 242 | osinfo.machine); | |
| 243 | } | |
|
20116
9952c317df4c
applied changes from 8543caa9958f323a231c630bebd65c74dec3401f
Richard Laager <rlaager@pidgin.im>
parents:
19897
diff
changeset
|
244 | #endif |
| 7014 | 245 | |
| 8006 | 246 | iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "jabber:iq:version"); |
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
247 | if (from) |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
248 | xmlnode_set_attrib(iq->node, "to", from); |
| 8006 | 249 | jabber_iq_set_id(iq, id); |
| 7014 | 250 | |
| 8006 | 251 | query = xmlnode_get_child(iq->node, "query"); |
| 7014 | 252 | |
|
18441
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
253 | ui_info = purple_core_get_ui_info(); |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
254 | |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
255 | if(NULL != ui_info) { |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
256 | ui_name = g_hash_table_lookup(ui_info, "name"); |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
257 | ui_version = g_hash_table_lookup(ui_info, "version"); |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
258 | } |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
259 | |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
260 | if(NULL != ui_name && NULL != ui_version) { |
| 18443 | 261 | char *version_complete = g_strdup_printf("%s (libpurple " VERSION ")", ui_version); |
| 262 | xmlnode_insert_data(xmlnode_new_child(query, "name"), ui_name, -1); | |
| 263 | xmlnode_insert_data(xmlnode_new_child(query, "version"), version_complete, -1); | |
| 264 | g_free(version_complete); | |
|
18441
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
265 | } else { |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
266 | xmlnode_insert_data(xmlnode_new_child(query, "name"), "libpurple", -1); |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
267 | xmlnode_insert_data(xmlnode_new_child(query, "version"), VERSION, -1); |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
268 | } |
|
d255d04c0aa1
core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents:
18317
diff
changeset
|
269 | |
|
20225
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
20116
diff
changeset
|
270 | #if 0 |
| 8006 | 271 | if(os) { |
| 272 | xmlnode_insert_data(xmlnode_new_child(query, "os"), os, -1); | |
| 273 | g_free(os); | |
| 274 | } | |
|
20225
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
20116
diff
changeset
|
275 | #endif |
| 10941 | 276 | |
| 8006 | 277 | jabber_iq_send(iq); |
| 7014 | 278 | } |
| 279 | } | |
| 280 | ||
| 13794 | 281 | void jabber_iq_remove_callback_by_id(JabberStream *js, const char *id) |
| 282 | { | |
| 283 | g_hash_table_remove(js->iq_callbacks, id); | |
| 284 | } | |
| 285 | ||
| 7014 | 286 | void jabber_iq_parse(JabberStream *js, xmlnode *packet) |
| 287 | { | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
288 | JabberIqCallbackData *jcd; |
|
25554
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
289 | xmlnode *child, *error, *x; |
| 7014 | 290 | const char *xmlns; |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
291 | const char *iq_type, *id, *from; |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
292 | JabberIqType type = JABBER_IQ_NONE; |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
293 | gboolean signal_return; |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
294 | JabberID *from_id; |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
295 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
296 | from = xmlnode_get_attrib(packet, "from"); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
297 | id = xmlnode_get_attrib(packet, "id"); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
298 | iq_type = xmlnode_get_attrib(packet, "type"); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
299 | |
|
25554
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
300 | /* |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
301 | * Ensure the 'from' attribute is valid. No point in handling a stanza |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
302 | * of which we don't understand where it came from. |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
303 | */ |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
304 | from_id = jabber_id_new(from); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
305 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
306 | if (from && !from_id) { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
307 | purple_debug_error("jabber", "Received an iq with an invalid from: %s\n", from); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
308 | return; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
309 | } |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
310 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
311 | /* |
|
25554
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
312 | * child will be either the first tag child or NULL if there is no child. |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
313 | * Historically, we used just the 'query' subchild, but newer XEPs use |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
314 | * differently named children. Grabbing the first child is (for the time |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
315 | * being) sufficient. |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
316 | */ |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
317 | for (child = packet->child; child; child = child->next) { |
|
25813
2e5e39a3107c
This is shorter and easier to read.
Paul Aurich <darkrain42@pidgin.im>
parents:
25557
diff
changeset
|
318 | if (child->type == XMLNODE_TYPE_TAG) |
|
2e5e39a3107c
This is shorter and easier to read.
Paul Aurich <darkrain42@pidgin.im>
parents:
25557
diff
changeset
|
319 | break; |
|
25554
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
320 | } |
|
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
321 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
322 | if (iq_type) { |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
323 | if (!strcmp(iq_type, "get")) |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
324 | type = JABBER_IQ_GET; |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
325 | else if (!strcmp(iq_type, "set")) |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
326 | type = JABBER_IQ_SET; |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
327 | else if (!strcmp(iq_type, "result")) |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
328 | type = JABBER_IQ_RESULT; |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
329 | else if (!strcmp(iq_type, "error")) |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
330 | type = JABBER_IQ_ERROR; |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
331 | } |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
332 | |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
333 | if (type == JABBER_IQ_NONE) { |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
334 | purple_debug_error("jabber", "IQ with invalid type ('%s') - ignoring.\n", |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
335 | iq_type ? iq_type : "(null)"); |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
336 | jabber_id_free(from_id); |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
337 | return; |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
338 | } |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
339 | |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
340 | /* All IQs must have an ID, so send an error for a set/get that doesn't */ |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
341 | if(!id || !*id) { |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
342 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
343 | if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) { |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
344 | JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
345 | |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
346 | xmlnode_free(iq->node); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
347 | iq->node = xmlnode_copy(packet); |
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
348 | if (from) { |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
349 | xmlnode_set_attrib(iq->node, "to", from); |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
350 | xmlnode_remove_attrib(iq->node, "from"); |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
351 | } |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
352 | |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
353 | xmlnode_set_attrib(iq->node, "type", "error"); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
354 | /* This id is clearly not useful, but we must put something there for a valid stanza */ |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
355 | iq->id = jabber_get_next_id(js); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
356 | xmlnode_set_attrib(iq->node, "id", iq->id); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
357 | error = xmlnode_new_child(iq->node, "error"); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
358 | xmlnode_set_attrib(error, "type", "modify"); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
359 | x = xmlnode_new_child(error, "bad-request"); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
360 | xmlnode_set_namespace(x, NS_XMPP_STANZAS); |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
361 | |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
362 | jabber_iq_send(iq); |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
363 | } else |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
364 | purple_debug_error("jabber", "IQ of type '%s' missing id - ignoring.\n", |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
365 | iq_type); |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
366 | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
367 | jabber_id_free(from_id); |
|
24520
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
368 | return; |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
369 | } |
|
726138a1c69b
Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents:
24254
diff
changeset
|
370 | |
|
28832
4e4b609b85e4
jabber: Use purple_connection_get_prpl() instead of jabber_plugin.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
371 | signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(purple_connection_get_prpl(js->gc), |
|
28155
de9b298ef02e
jabber: Emit jabber-receiving-iq after we've ensured id is !NULL
Paul Aurich <darkrain42@pidgin.im>
parents:
27433
diff
changeset
|
372 | "jabber-receiving-iq", js->gc, iq_type, id, from, packet)); |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
373 | if (signal_return) { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
374 | jabber_id_free(from_id); |
|
28155
de9b298ef02e
jabber: Emit jabber-receiving-iq after we've ensured id is !NULL
Paul Aurich <darkrain42@pidgin.im>
parents:
27433
diff
changeset
|
375 | return; |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
376 | } |
|
28155
de9b298ef02e
jabber: Emit jabber-receiving-iq after we've ensured id is !NULL
Paul Aurich <darkrain42@pidgin.im>
parents:
27433
diff
changeset
|
377 | |
| 8312 | 378 | /* First, lets see if a special callback got registered */ |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
379 | if(type == JABBER_IQ_RESULT || type == JABBER_IQ_ERROR) { |
|
25831
1ff20e8f93b5
Remove a "suggested parenthes around assignment" warning
Paul Aurich <darkrain42@pidgin.im>
parents:
25830
diff
changeset
|
380 | if((jcd = g_hash_table_lookup(js->iq_callbacks, id))) { |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
381 | if(jabber_id_equal(js, jcd->to, from_id)) { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
382 | jcd->callback(js, from, type, id, packet, jcd->data); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
383 | jabber_iq_remove_callback_by_id(js, id); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
384 | jabber_id_free(from_id); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
385 | return; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
386 | } else { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
387 | char *expected_to; |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
388 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
389 | if (jcd->to) { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
390 | expected_to = jabber_id_get_full_jid(jcd->to); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
391 | } else { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
392 | expected_to = jabber_id_get_bare_jid(js->user); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
393 | } |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
394 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
395 | purple_debug_error("jabber", "Got a result iq with id %s from %s instead of expected %s!\n", id, from ? from : "(null)", expected_to); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
396 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
397 | g_free(expected_to); |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
398 | } |
| 8312 | 399 | } |
| 400 | } | |
| 401 | ||
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
402 | /* |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
403 | * Apparently not, so let's see if we have a pre-defined handler |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
404 | * or if an outside plugin is interested. |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
405 | */ |
|
25554
53e161fc0658
Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents:
24520
diff
changeset
|
406 | if(child && (xmlns = xmlnode_get_namespace(child))) { |
|
25820
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
407 | char *key = g_strdup_printf("%s %s", child->name, xmlns); |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
408 | JabberIqHandler *jih = g_hash_table_lookup(iq_handlers, key); |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
409 | int signal_ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); |
|
25820
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
410 | g_free(key); |
| 7014 | 411 | |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
412 | if (signal_ref > 0) { |
|
28832
4e4b609b85e4
jabber: Use purple_connection_get_prpl() instead of jabber_plugin.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
413 | signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(purple_connection_get_prpl(js->gc), "jabber-watched-iq", |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
414 | js->gc, iq_type, id, from, child)); |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
415 | if (signal_return) { |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
416 | jabber_id_free(from_id); |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
417 | return; |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
418 | } |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
419 | } |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
420 | |
|
25820
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
421 | if(jih) { |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
422 | jih(js, from, type, id, child); |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
423 | jabber_id_free(from_id); |
| 8262 | 424 | return; |
| 425 | } | |
| 7395 | 426 | } |
|
26454
94130b583e0b
Clean up usage of USE_VV in the XMPP protocol.
Michael Ruprecht <maiku@pidgin.im>
parents:
26337
diff
changeset
|
427 | |
|
29359
cec28224afd4
jabber: Log a more useful message on unhandled IQs
Paul Aurich <darkrain42@pidgin.im>
parents:
29020
diff
changeset
|
428 | purple_debug_misc("jabber", "Unhandled IQ with id %s\n", id); |
|
17769
69d98a4da006
applied patch for supporting XEP-0199: XMPP Ping
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
429 | |
| 8312 | 430 | /* If we get here, send the default error reply mandated by XMPP-CORE */ |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
25815
diff
changeset
|
431 | if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) { |
| 8315 | 432 | JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR); |
| 8135 | 433 | |
| 8315 | 434 | xmlnode_free(iq->node); |
| 435 | iq->node = xmlnode_copy(packet); | |
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
436 | if (from) { |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
437 | xmlnode_set_attrib(iq->node, "to", from); |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
438 | xmlnode_remove_attrib(iq->node, "from"); |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
439 | } |
|
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
440 | |
| 8315 | 441 | xmlnode_set_attrib(iq->node, "type", "error"); |
| 442 | error = xmlnode_new_child(iq->node, "error"); | |
| 443 | xmlnode_set_attrib(error, "type", "cancel"); | |
| 444 | xmlnode_set_attrib(error, "code", "501"); | |
| 445 | x = xmlnode_new_child(error, "feature-not-implemented"); | |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
446 | xmlnode_set_namespace(x, NS_XMPP_STANZAS); |
| 8169 | 447 | |
| 8315 | 448 | jabber_iq_send(iq); |
| 449 | } | |
|
35235
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
450 | |
|
93d4bff19574
Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents:
29913
diff
changeset
|
451 | jabber_id_free(from_id); |
| 7014 | 452 | } |
| 453 | ||
|
25820
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
454 | void jabber_iq_register_handler(const char *node, const char *xmlns, JabberIqHandler *handlerfunc) |
| 14356 | 455 | { |
|
25820
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
456 | /* |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
457 | * This is valid because nodes nor namespaces cannot have spaces in them |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
458 | * (see http://www.w3.org/TR/2006/REC-xml-20060816/ and |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
459 | * http://www.w3.org/TR/REC-xml-names/) |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
460 | */ |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
461 | char *key = g_strdup_printf("%s %s", node, xmlns); |
|
c0ebe6bd49aa
Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents:
25814
diff
changeset
|
462 | g_hash_table_replace(iq_handlers, key, handlerfunc); |
| 14356 | 463 | } |
| 464 | ||
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
465 | void jabber_iq_signal_register(const gchar *node, const gchar *xmlns) |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
466 | { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
467 | gchar *key; |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
468 | int ref; |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
469 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
470 | g_return_if_fail(node != NULL && *node != '\0'); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
471 | g_return_if_fail(xmlns != NULL && *xmlns != '\0'); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
472 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
473 | key = g_strdup_printf("%s %s", node, xmlns); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
474 | ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
475 | if (ref == 0) { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
476 | g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(1)); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
477 | } else { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
478 | g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref + 1)); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
479 | g_free(key); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
480 | } |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
481 | } |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
482 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
483 | void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns) |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
484 | { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
485 | gchar *key; |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
486 | int ref; |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
487 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
488 | g_return_if_fail(node != NULL && *node != '\0'); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
489 | g_return_if_fail(xmlns != NULL && *xmlns != '\0'); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
490 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
491 | key = g_strdup_printf("%s %s", node, xmlns); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
492 | ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
493 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
494 | if (ref == 1) { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
495 | g_hash_table_remove(signal_iq_handlers, key); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
496 | } else if (ref > 1) { |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
497 | g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref - 1)); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
498 | } |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
499 | |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
500 | g_free(key); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
501 | } |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
502 | |
| 14356 | 503 | void jabber_iq_init(void) |
| 504 | { | |
| 505 | iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
506 | signal_iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); |
| 14356 | 507 | |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
508 | jabber_iq_register_handler("jingle", JINGLE, jingle_parse); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
509 | jabber_iq_register_handler("mailbox", NS_GOOGLE_MAIL_NOTIFY, |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
510 | jabber_gmail_poke); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
511 | jabber_iq_register_handler("new-mail", NS_GOOGLE_MAIL_NOTIFY, |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
512 | jabber_gmail_poke); |
|
28979
191942cc7747
jabber: Start putting all the namespaces in one location with consistent naming.
Paul Aurich <darkrain42@pidgin.im>
parents:
28832
diff
changeset
|
513 | jabber_iq_register_handler("ping", NS_PING, jabber_ping_parse); |
|
191942cc7747
jabber: Start putting all the namespaces in one location with consistent naming.
Paul Aurich <darkrain42@pidgin.im>
parents:
28832
diff
changeset
|
514 | jabber_iq_register_handler("query", NS_GOOGLE_JINGLE_INFO, |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
515 | jabber_google_handle_jingle_info); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
516 | jabber_iq_register_handler("query", NS_BYTESTREAMS, |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
517 | jabber_bytestreams_parse); |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
518 | jabber_iq_register_handler("query", NS_DISCO_INFO, jabber_disco_info_parse); |
|
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
519 | jabber_iq_register_handler("query", NS_DISCO_ITEMS, jabber_disco_items_parse); |
|
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
520 | jabber_iq_register_handler("query", NS_LAST_ACTIVITY, jabber_iq_last_parse); |
|
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
521 | jabber_iq_register_handler("query", NS_OOB_IQ_DATA, jabber_oob_parse); |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
522 | jabber_iq_register_handler("query", "jabber:iq:register", |
|
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
523 | jabber_register_parse); |
|
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
524 | jabber_iq_register_handler("query", "jabber:iq:roster", |
|
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
525 | jabber_roster_parse); |
|
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
526 | jabber_iq_register_handler("query", "jabber:iq:version", |
|
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
527 | jabber_iq_version_parse); |
|
26697
2f086177af37
Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents:
26695
diff
changeset
|
528 | #ifdef USE_VV |
|
28980
4a0f7340b539
jabber: Add the missing file and fix up the Google session namespaces
Paul Aurich <darkrain42@pidgin.im>
parents:
28979
diff
changeset
|
529 | jabber_iq_register_handler("session", NS_GOOGLE_SESSION, |
|
26697
2f086177af37
Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents:
26695
diff
changeset
|
530 | jabber_google_session_parse); |
|
2f086177af37
Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents:
26695
diff
changeset
|
531 | #endif |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
532 | jabber_iq_register_handler("block", NS_SIMPLE_BLOCKING, jabber_blocklist_parse_push); |
|
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
533 | jabber_iq_register_handler("unblock", NS_SIMPLE_BLOCKING, jabber_blocklist_parse_push); |
|
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28980
diff
changeset
|
534 | jabber_iq_register_handler("time", NS_ENTITY_TIME, jabber_time_parse); |
|
26704
e6dba3759625
Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents:
26701
diff
changeset
|
535 | |
| 14356 | 536 | } |
| 537 | ||
| 538 | void jabber_iq_uninit(void) | |
| 539 | { | |
| 540 | g_hash_table_destroy(iq_handlers); | |
|
27103
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
541 | g_hash_table_destroy(signal_iq_handlers); |
|
815af6acd59b
Add jabber signals for IQ, Message, and Presence stanzas. Lightly tested (it doesn't crash [Prove me wrong!]) and as you'll note, I refer to documentation that doesn't yet exist.
Paul Aurich <darkrain42@pidgin.im>
parents:
26704
diff
changeset
|
542 | iq_handlers = signal_iq_handlers = NULL; |
| 14356 | 543 | } |