libpurple/protocols/jabber/iq.c

Fri, 20 May 2022 02:55:51 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 20 May 2022 02:55:51 -0500
changeset 41396
2ef3d6eeffb3
parent 40726
645607090674
child 41867
5375c1d58c50
permissions
-rw-r--r--

Update purple_core_init to take a PurpleUiInfo instance
Added an `id` property to `PurpleUiInfo`

Testing Done:
Ran the unit tests and verified I could run Pidgin and connect an account.

Reviewed at https://reviews.imfreedom.org/r/1456/

7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
1 /*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2 * purple - Jabber Protocol Plugin
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
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
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
7 *
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
11 * (at your option) any later version.
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
12 *
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
16 * GNU General Public License for more details.
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
17 *
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
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
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
21 *
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
22 */
40439
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
23 #include <glib/gi18n-lib.h>
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
24
40358
e6fe6fc1f516 move all protocols, purple plugins, and purple tests to use purple.h instead of including files individually
Gary Kramlich <grim@reaperworld.com>
parents: 40312
diff changeset
25 #include <purple.h>
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
26
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
27 #include "buddy.h"
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
28 #include "disco.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
29 #include "iq.h"
26143
673b6665624d Restructure Jingle code to more easily support multiple application types.
Michael Ruprecht <maiku@pidgin.im>
parents: 23754
diff changeset
30 #include "jingle/jingle.h"
7170
93a12931a1fd [gaim-migrate @ 7737]
Nathan Walp <nwalp@pidgin.im>
parents: 7116
diff changeset
31 #include "oob.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 #include "roster.h"
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
33 #include "si.h"
17769
69d98a4da006 applied patch for supporting XEP-0199: XMPP Ping
Andreas Monitzer <am@adiumx.com>
parents: 15884
diff changeset
34 #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
35 #include "adhoccommands.h"
23626
e21afec2f485 Custom smileys for XMPP according to XEP 0231. Refs #5627.
Marcus Lundblad <malu@pidgin.im>
parents: 23076
diff changeset
36 #include "data.h"
24372
830701cec96f Implements file transfers using in-band bytestreams for XMPP
Marcus Lundblad <malu@pidgin.im>
parents: 23076
diff changeset
37 #include "ibb.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
38
29399
cce925ddb58a These should be static
Paul Aurich <darkrain42@pidgin.im>
parents: 29359
diff changeset
39 static GHashTable *iq_handlers = NULL;
cce925ddb58a These should be static
Paul Aurich <darkrain42@pidgin.im>
parents: 29359
diff changeset
40 static GHashTable *signal_iq_handlers = NULL;
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
41
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
42 struct _JabberIqCallbackData {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
43 JabberIqCallback *callback;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
44 gpointer data;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
45 JabberID *to;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
46 };
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
47
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
48 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
49 {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
50 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
51 g_free(jcd);
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
52 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
53
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
54 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
55 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
56 JabberIq *iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
57
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58 iq = g_new0(JabberIq, 1);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
59
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
60 iq->type = type;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
61
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
62 iq->node = purple_xmlnode_new("iq");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
63 switch(iq->type) {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
64 case JABBER_IQ_SET:
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
65 purple_xmlnode_set_attrib(iq->node, "type", "set");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
66 break;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
67 case JABBER_IQ_GET:
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
68 purple_xmlnode_set_attrib(iq->node, "type", "get");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
69 break;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
70 case JABBER_IQ_ERROR:
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
71 purple_xmlnode_set_attrib(iq->node, "type", "error");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
72 break;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
73 case JABBER_IQ_RESULT:
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
74 purple_xmlnode_set_attrib(iq->node, "type", "result");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
75 break;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
76 case JABBER_IQ_NONE:
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
77 /* this shouldn't ever happen */
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
78 break;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
79 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
80
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
81 iq->js = js;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
82
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
83 if(type == JABBER_IQ_GET || type == JABBER_IQ_SET) {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
84 iq->id = jabber_get_next_id(js);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
85 purple_xmlnode_set_attrib(iq->node, "id", iq->id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
86 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
87
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
88 return iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
89 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
90
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
91 JabberIq *jabber_iq_new_query(JabberStream *js, JabberIqType type,
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
92 const char *xmlns)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
93 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
94 JabberIq *iq = jabber_iq_new(js, type);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
95 PurpleXmlNode *query;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
96
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
97 query = purple_xmlnode_new_child(iq->node, "query");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
98 purple_xmlnode_set_namespace(query, xmlns);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
99
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
100 return iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
101 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
102
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
103 void
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
104 jabber_iq_set_callback(JabberIq *iq, JabberIqCallback *callback, gpointer data)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
105 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
106 iq->callback = callback;
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
107 iq->callback_data = data;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
108 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
109
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
110 void jabber_iq_set_id(JabberIq *iq, const char *id)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
111 {
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
112 g_free(iq->id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
113
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
114 if(id) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
115 purple_xmlnode_set_attrib(iq->node, "id", id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
116 iq->id = g_strdup(id);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
117 } else {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
118 purple_xmlnode_remove_attrib(iq->node, "id");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
119 iq->id = NULL;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
120 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
121 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
122
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
123 void jabber_iq_send(JabberIq *iq)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
124 {
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
125 JabberIqCallbackData *jcd;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
126 g_return_if_fail(iq != NULL);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
127
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
128 jabber_send(iq->js, iq->node);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
129
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
130 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
131 jcd = g_new0(JabberIqCallbackData, 1);
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
132 jcd->callback = iq->callback;
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
133 jcd->data = iq->callback_data;
35265
77664079d0f0 Merge with a fair number of conflicts. Nothing too crazy.
Mark Doliner <mark@kingant.net>
parents: 34935 35235
diff changeset
134 jcd->to = jabber_id_new(purple_xmlnode_get_attrib(iq->node, "to"));
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
135
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
136 g_hash_table_insert(iq->js->iq_callbacks, g_strdup(iq->id), jcd);
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
137 }
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
138
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
139 jabber_iq_free(iq);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
140 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
141
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
142 void jabber_iq_free(JabberIq *iq)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
143 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
144 g_return_if_fail(iq != NULL);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
145
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
146 g_free(iq->id);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
147 purple_xmlnode_free(iq->node);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
148 g_free(iq);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
149 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
150
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
151 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
152 JabberIqType type, const char *id,
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
153 PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
154 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
155 JabberIq *iq;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
156 PurpleXmlNode *query;
14453
1cc75906700c [gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents: 14375
diff changeset
157 char *idle_time;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
158
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
159 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
160 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, NS_LAST_ACTIVITY);
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
161 jabber_iq_set_id(iq, id);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
162 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
163 purple_xmlnode_set_attrib(iq->node, "to", from);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
164
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
165 query = purple_xmlnode_get_child(iq->node, "query");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
166
40664
52feb9438df4 Fix time_t string formatting.
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40439
diff changeset
167 idle_time =
52feb9438df4 Fix time_t string formatting.
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40439
diff changeset
168 g_strdup_printf("%" G_GINT64_FORMAT,
52feb9438df4 Fix time_t string formatting.
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40439
diff changeset
169 (gint64)(js->idle ? time(NULL) - js->idle : 0));
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
170 purple_xmlnode_set_attrib(query, "seconds", idle_time);
14453
1cc75906700c [gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents: 14375
diff changeset
171 g_free(idle_time);
7401
3328147f3d53 [gaim-migrate @ 7997]
Nathan Walp <nwalp@pidgin.im>
parents: 7395
diff changeset
172
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
173 jabber_iq_send(iq);
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
174 }
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
175 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
176
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
177 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
178 JabberIqType type, const char *id,
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
179 PurpleXmlNode *child)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
180 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
181 JabberIq *iq;
18317
6c814e134e56 support replying to XEP-0202 queries
Nathan Walp <nwalp@pidgin.im>
parents: 18194
diff changeset
182
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
183 if(type == JABBER_IQ_GET) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
184 PurpleXmlNode *tzo, *utc;
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
185 GDateTime *now, *now_utc;
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
186 gchar *date, *tz;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
187
25556
300d8959e04c Fix the implementation of XEP-0202 (Entity Time) (thanks again to Marcus)
Paul Aurich <darkrain42@pidgin.im>
parents: 25554
diff changeset
188 iq = jabber_iq_new(js, JABBER_IQ_RESULT);
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
189 jabber_iq_set_id(iq, id);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
190 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
191 purple_xmlnode_set_attrib(iq->node, "to", from);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
192
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
193 child = purple_xmlnode_new_child(iq->node, child->name);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
194 purple_xmlnode_set_namespace(child, NS_ENTITY_TIME);
10941
7a67db0a7f43 [gaim-migrate @ 12731]
Nathan Walp <nwalp@pidgin.im>
parents: 10487
diff changeset
195
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
196 /* <tzo>-06:00</tzo> */
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
197 now = g_date_time_new_now_local();
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
198 tz = g_date_time_format(now, "%:z");
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
199 tzo = purple_xmlnode_new_child(child, "tzo");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
200 purple_xmlnode_insert_data(tzo, tz, -1);
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
201 g_free(tz);
10941
7a67db0a7f43 [gaim-migrate @ 12731]
Nathan Walp <nwalp@pidgin.im>
parents: 10487
diff changeset
202
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
203 /* <utc>2006-12-19T17:58:35Z</utc> */
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
204 now_utc = g_date_time_to_utc(now);
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
205 date = g_date_time_format(now_utc, "%FT%TZ");
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
206 utc = purple_xmlnode_new_child(child, "utc");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
207 purple_xmlnode_insert_data(utc, date, -1);
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
208 g_free(date);
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
209
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
210 g_date_time_unref(now);
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
211 g_date_time_unref(now_utc);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
212
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
213 jabber_iq_send(iq);
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
214 } else {
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
215 /* TODO: Errors */
18181
736c6abf62f4 respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents: 17753
diff changeset
216 }
736c6abf62f4 respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents: 17753
diff changeset
217 }
736c6abf62f4 respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents: 17753
diff changeset
218
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
219 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
220 JabberIqType type, const char *id,
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
221 PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
222 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
223 JabberIq *iq;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
224 PurpleXmlNode *query;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
225
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
226 if(type == JABBER_IQ_GET) {
40312
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
227 PurpleUiInfo *ui_info;
18441
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
228 const char *ui_name = NULL, *ui_version = NULL;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
229
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
230 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
231 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
232 purple_xmlnode_set_attrib(iq->node, "to", from);
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
233 jabber_iq_set_id(iq, id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
234
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
235 query = purple_xmlnode_get_child(iq->node, "query");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
236
18441
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
237 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
238
40312
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
239 if(PURPLE_IS_UI_INFO(ui_info)) {
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
240 ui_name = purple_ui_info_get_name(ui_info);
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
241 ui_version = purple_ui_info_get_version(ui_info);
18441
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
242 }
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
243
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
244 if(NULL != ui_name && NULL != ui_version) {
18443
8ddab006e3f1 I like this better
Nathan Walp <nwalp@pidgin.im>
parents: 18441
diff changeset
245 char *version_complete = g_strdup_printf("%s (libpurple " VERSION ")", ui_version);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
246 purple_xmlnode_insert_data(purple_xmlnode_new_child(query, "name"), ui_name, -1);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
247 purple_xmlnode_insert_data(purple_xmlnode_new_child(query, "version"), version_complete, -1);
18443
8ddab006e3f1 I like this better
Nathan Walp <nwalp@pidgin.im>
parents: 18441
diff changeset
248 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
249 } else {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
250 purple_xmlnode_insert_data(purple_xmlnode_new_child(query, "name"), "libpurple", -1);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
251 purple_xmlnode_insert_data(purple_xmlnode_new_child(query, "version"), VERSION, -1);
18441
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
252 }
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
253
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
254 jabber_iq_send(iq);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
255 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
256 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
257
13794
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
258 void jabber_iq_remove_callback_by_id(JabberStream *js, const char *id)
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
259 {
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
260 g_hash_table_remove(js->iq_callbacks, id);
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
261 }
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
262
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
263 /**
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
264 * Verify that the 'from' attribute of an IQ reply is a valid match for
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
265 * a given IQ request. The expected behavior is outlined in section
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
266 * 8.1.2.1 of the XMPP CORE spec (RFC 6120). We consider the reply to
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
267 * be a valid match if any of the following is true:
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
268 * - Request 'to' matches reply 'from' (including the case where
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
269 * neither are set).
36131
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
270 * - Request 'to' was my JID (bare or full) and reply 'from' is empty.
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
271 * - Request 'to' was empty and reply 'from' is my JID. The spec says
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
272 * we should only allow bare JID, but we also allow full JID for
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
273 * compatibility with some servers.
36131
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
274 * - Request 'to' was empty and reply 'from' is server JID. Not allowed by
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
275 * any spec, but for compatibility with some servers.
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
276 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
277 * These rules should allow valid IQ replies while preventing spoofed
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
278 * ones.
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
279 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
280 * For more discussion see the "Spoofing of iq ids and misbehaving
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
281 * servers" email thread from January 2014 on the jdev and security
36131
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
282 * mailing lists. Also see https://developer.pidgin.im/ticket/15879
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
283 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
284 * @return TRUE if this reply is valid for the given request.
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
285 */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
286 static gboolean does_reply_from_match_request_to(JabberStream *js, JabberID *to, JabberID *from)
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
287 {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
288 if (jabber_id_equal(to, from)) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
289 /* Request 'to' matches reply 'from' */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
290 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
291 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
292
36131
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
293 if (!from && purple_strequal(to->node, js->user->node)
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
294 && purple_strequal(to->domain, js->user->domain)) {
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
295 /* Request 'to' was my JID (bare or full) and reply 'from' is empty */
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
296 return TRUE;
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
297 }
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
298
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
299 if (!to && purple_strequal(from->domain, js->user->domain)) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
300 /* Request 'to' is empty and reply 'from' domain matches our domain */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
301
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
302 if (!from->node && !from->resource) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
303 /* Reply 'from' is server bare JID */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
304 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
305 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
306
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
307 if (purple_strequal(from->node, js->user->node)
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
308 && (!from->resource || purple_strequal(from->resource, js->user->resource))) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
309 /* Reply 'from' is my full or bare JID */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
310 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
311 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
312 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
313
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
314 return FALSE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
315 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
316
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
317 void jabber_iq_parse(JabberStream *js, PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
318 {
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
319 JabberIqCallbackData *jcd;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
320 PurpleXmlNode *child, *error, *x;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
321 const char *xmlns;
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
322 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
323 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
324 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
325 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
326
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
327 from = purple_xmlnode_get_attrib(packet, "from");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
328 id = purple_xmlnode_get_attrib(packet, "id");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
329 iq_type = purple_xmlnode_get_attrib(packet, "type");
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
330
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
331 /*
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
332 * 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
333 * 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
334 */
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
335 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
336
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
337 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
338 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
339 return;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
340 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
341
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
342 /*
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
343 * 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
344 * 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
345 * 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
346 * being) sufficient.
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
347 */
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
348 for (child = packet->child; child; child = child->next) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
349 if (child->type == PURPLE_XMLNODE_TYPE_TAG)
25813
2e5e39a3107c This is shorter and easier to read.
Paul Aurich <darkrain42@pidgin.im>
parents: 25557
diff changeset
350 break;
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
351 }
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
352
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
353 if (iq_type) {
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
354 if (purple_strequal(iq_type, "get"))
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
355 type = JABBER_IQ_GET;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
356 else if (purple_strequal(iq_type, "set"))
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
357 type = JABBER_IQ_SET;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
358 else if (purple_strequal(iq_type, "result"))
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
359 type = JABBER_IQ_RESULT;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
360 else if (purple_strequal(iq_type, "error"))
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
361 type = JABBER_IQ_ERROR;
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
362 }
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
363
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
364 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
365 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
366 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
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
726138a1c69b Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents: 24254
diff changeset
371 /* 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
372 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
373
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
374 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
375 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
376
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
377 purple_xmlnode_free(iq->node);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
378 iq->node = purple_xmlnode_copy(packet);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
379 if (from) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
380 purple_xmlnode_set_attrib(iq->node, "to", from);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
381 purple_xmlnode_remove_attrib(iq->node, "from");
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
382 }
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
383
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
384 purple_xmlnode_set_attrib(iq->node, "type", "error");
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
385 /* 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
386 iq->id = jabber_get_next_id(js);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
387 purple_xmlnode_set_attrib(iq->node, "id", iq->id);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
388 error = purple_xmlnode_new_child(iq->node, "error");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
389 purple_xmlnode_set_attrib(error, "type", "modify");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
390 x = purple_xmlnode_new_child(error, "bad-request");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
391 purple_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
392
726138a1c69b Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents: 24254
diff changeset
393 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
394 } else
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
395 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
396 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
397
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
398 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
399 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
400 }
726138a1c69b Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents: 24254
diff changeset
401
36623
caaadef03507 Renamed purple_connection_get_protocol_info() to purple_connection_get_protocol()
Ankit Vani <a@nevitus.org>
parents: 36362
diff changeset
402 signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(purple_connection_get_protocol(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
403 "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
404 if (signal_return) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
405 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
406 return;
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
407 }
28155
de9b298ef02e jabber: Emit jabber-receiving-iq after we've ensured id is !NULL
Paul Aurich <darkrain42@pidgin.im>
parents: 27433
diff changeset
408
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
409 /* 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
410 if(type == JABBER_IQ_RESULT || type == JABBER_IQ_ERROR) {
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
411 jcd = g_hash_table_lookup(js->iq_callbacks, id);
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
412 if (jcd) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
413 if (does_reply_from_match_request_to(js, jcd->to, from_id)) {
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
414 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
415 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
416 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
417 return;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
418 } else {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
419 char *expected_to;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
420
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
421 if (jcd->to) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
422 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
423 } else {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
424 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
425 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
426
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
427 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
428
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
429 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
430 }
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
431 }
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
432 }
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
433
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
434 /*
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
435 * 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
436 * 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
437 */
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
438 if(child && (xmlns = purple_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
439 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
440 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
441 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
442 g_free(key);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
443
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
444 if (signal_ref > 0) {
36623
caaadef03507 Renamed purple_connection_get_protocol_info() to purple_connection_get_protocol()
Ankit Vani <a@nevitus.org>
parents: 36362
diff changeset
445 signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(purple_connection_get_protocol(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
446 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
447 if (signal_return) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
448 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
449 return;
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
450 }
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
451 }
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
452
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
453 if(jih) {
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
454 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
455 jabber_id_free(from_id);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8169
diff changeset
456 return;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8169
diff changeset
457 }
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
458 }
26454
94130b583e0b Clean up usage of USE_VV in the XMPP protocol.
Michael Ruprecht <maiku@pidgin.im>
parents: 26337
diff changeset
459
29359
cec28224afd4 jabber: Log a more useful message on unhandled IQs
Paul Aurich <darkrain42@pidgin.im>
parents: 29020
diff changeset
460 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
461
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
462 /* 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
463 if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) {
8315
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
464 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8043
diff changeset
465
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
466 purple_xmlnode_free(iq->node);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
467 iq->node = purple_xmlnode_copy(packet);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
468 if (from) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
469 purple_xmlnode_set_attrib(iq->node, "to", from);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
470 purple_xmlnode_remove_attrib(iq->node, "from");
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
471 }
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
472
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
473 purple_xmlnode_set_attrib(iq->node, "type", "error");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
474 error = purple_xmlnode_new_child(iq->node, "error");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
475 purple_xmlnode_set_attrib(error, "type", "cancel");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
476 purple_xmlnode_set_attrib(error, "code", "501");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
477 x = purple_xmlnode_new_child(error, "feature-not-implemented");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
478 purple_xmlnode_set_namespace(x, NS_XMPP_STANZAS);
8169
f079f992248d [gaim-migrate @ 8882]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
479
8315
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
480 jabber_iq_send(iq);
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
481 }
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
482
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
483 jabber_id_free(from_id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
484 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
485
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
486 void jabber_iq_register_handler(const char *node, const char *xmlns, JabberIqHandler *handlerfunc)
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
487 {
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
488 /*
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
489 * 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
490 * (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
491 * 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
492 */
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
493 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
494 g_hash_table_replace(iq_handlers, key, handlerfunc);
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
495 }
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
496
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
497 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
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 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
500 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
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 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
503 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
504
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
505 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
506 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
507 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
508 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
509 } 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
510 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
511 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
512 }
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
513 }
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
514
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
515 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
516 {
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
517 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
518 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
519
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
520 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
521 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
522
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
523 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
524 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
525
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
526 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
527 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
528 } 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
529 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
530 }
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
531
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
532 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
533 }
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
534
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
535 void jabber_iq_init(void)
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
536 {
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
537 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
538 signal_iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
539
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
540 jabber_iq_register_handler("jingle", JINGLE, jingle_parse);
28979
191942cc7747 jabber: Start putting all the namespaces in one location with consistent naming.
Paul Aurich <darkrain42@pidgin.im>
parents: 28832
diff changeset
541 jabber_iq_register_handler("ping", NS_PING, jabber_ping_parse);
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
542 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
543 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
544 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
545 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
546 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
547 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
548 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
549 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
550 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
551 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
552 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
553 jabber_iq_version_parse);
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
554 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
555 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
556 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
557
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
558 }
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
559
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
560 void jabber_iq_uninit(void)
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
561 {
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
562 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
563 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
564 iq_handlers = signal_iq_handlers = NULL;
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
565 }

mercurial