libpurple/protocols/jabber/iq.c

Tue, 19 May 2020 10:29:23 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 19 May 2020 10:29:23 +0000
changeset 40417
48c621e76141
parent 40358
e6fe6fc1f516
child 40439
e9838d634d5e
permissions
-rw-r--r--

Merged in default (pull request #697)

simple: Fix search for message headers

Approved-by: Gary Kramlich

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 */
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
23 #include "internal.h"
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
24 #include <purple.h>
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
25
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
26 #include "buddy.h"
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
27 #include "disco.h"
29913
58f5122fbcd3 First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents: 29399
diff changeset
28 #include "google/gmail.h"
58f5122fbcd3 First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents: 29399
diff changeset
29 #include "google/google.h"
58f5122fbcd3 First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents: 29399
diff changeset
30 #include "google/jingleinfo.h"
58f5122fbcd3 First shot at refactoring the Google-specific XMPP code.
Marcus Lundblad <malu@pidgin.im>
parents: 29399
diff changeset
31 #include "google/google_session.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 #include "iq.h"
26143
673b6665624d Restructure Jingle code to more easily support multiple application types.
Michael Ruprecht <maiku@pidgin.im>
parents: 23754
diff changeset
33 #include "jingle/jingle.h"
7170
93a12931a1fd [gaim-migrate @ 7737]
Nathan Walp <nwalp@pidgin.im>
parents: 7116
diff changeset
34 #include "oob.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
35 #include "roster.h"
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
36 #include "si.h"
17769
69d98a4da006 applied patch for supporting XEP-0199: XMPP Ping
Andreas Monitzer <am@adiumx.com>
parents: 15884
diff changeset
37 #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
38 #include "adhoccommands.h"
23626
e21afec2f485 Custom smileys for XMPP according to XEP 0231. Refs #5627.
Marcus Lundblad <malu@pidgin.im>
parents: 23076
diff changeset
39 #include "data.h"
24372
830701cec96f Implements file transfers using in-band bytestreams for XMPP
Marcus Lundblad <malu@pidgin.im>
parents: 23076
diff changeset
40 #include "ibb.h"
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
41
29399
cce925ddb58a These should be static
Paul Aurich <darkrain42@pidgin.im>
parents: 29359
diff changeset
42 static GHashTable *iq_handlers = NULL;
cce925ddb58a These should be static
Paul Aurich <darkrain42@pidgin.im>
parents: 29359
diff changeset
43 static GHashTable *signal_iq_handlers = NULL;
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
44
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
45 struct _JabberIqCallbackData {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
46 JabberIqCallback *callback;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
47 gpointer data;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
48 JabberID *to;
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
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
51 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
52 {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
53 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
54 g_free(jcd);
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
55 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
56
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
57 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
59 JabberIq *iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
60
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
61 iq = g_new0(JabberIq, 1);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
62
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
63 iq->type = type;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
64
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
65 iq->node = purple_xmlnode_new("iq");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
66 switch(iq->type) {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
67 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
68 purple_xmlnode_set_attrib(iq->node, "type", "set");
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_GET:
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", "get");
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_ERROR:
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", "error");
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_RESULT:
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
77 purple_xmlnode_set_attrib(iq->node, "type", "result");
7014
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 case JABBER_IQ_NONE:
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
80 /* this shouldn't ever happen */
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
81 break;
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
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
84 iq->js = js;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
85
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
86 if(type == JABBER_IQ_GET || type == JABBER_IQ_SET) {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
87 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
88 purple_xmlnode_set_attrib(iq->node, "id", iq->id);
7014
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 return iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
92 }
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 *jabber_iq_new_query(JabberStream *js, JabberIqType type,
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
95 const char *xmlns)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
96 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
97 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
98 PurpleXmlNode *query;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
99
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
100 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
101 purple_xmlnode_set_namespace(query, xmlns);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
102
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
103 return iq;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
104 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
105
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
106 void
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
107 jabber_iq_set_callback(JabberIq *iq, JabberIqCallback *callback, gpointer 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 iq->callback = callback;
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
110 iq->callback_data = data;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
111 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
112
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
113 void jabber_iq_set_id(JabberIq *iq, const char *id)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
114 {
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
115 g_free(iq->id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
116
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
117 if(id) {
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_set_attrib(iq->node, "id", id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
119 iq->id = g_strdup(id);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
120 } else {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
121 purple_xmlnode_remove_attrib(iq->node, "id");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
122 iq->id = NULL;
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
123 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
124 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
125
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
126 void jabber_iq_send(JabberIq *iq)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
127 {
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
128 JabberIqCallbackData *jcd;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
129 g_return_if_fail(iq != NULL);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
130
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
131 jabber_send(iq->js, iq->node);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
132
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
133 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
134 jcd = g_new0(JabberIqCallbackData, 1);
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
135 jcd->callback = iq->callback;
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
136 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
137 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
138
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
139 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
140 }
7014
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 jabber_iq_free(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
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
145 void jabber_iq_free(JabberIq *iq)
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
146 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
147 g_return_if_fail(iq != NULL);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
148
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
149 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
150 purple_xmlnode_free(iq->node);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
151 g_free(iq);
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
152 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
153
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
154 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
155 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
156 PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
157 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
158 JabberIq *iq;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
159 PurpleXmlNode *query;
14453
1cc75906700c [gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents: 14375
diff changeset
160 char *idle_time;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
161
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
162 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
163 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
164 jabber_iq_set_id(iq, id);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
165 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
166 purple_xmlnode_set_attrib(iq->node, "to", from);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
167
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
168 query = purple_xmlnode_get_child(iq->node, "query");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
169
14453
1cc75906700c [gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents: 14375
diff changeset
170 idle_time = g_strdup_printf("%ld", 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
171 purple_xmlnode_set_attrib(query, "seconds", idle_time);
14453
1cc75906700c [gaim-migrate @ 17098]
Mark Doliner <markdoliner@pidgin.im>
parents: 14375
diff changeset
172 g_free(idle_time);
7401
3328147f3d53 [gaim-migrate @ 7997]
Nathan Walp <nwalp@pidgin.im>
parents: 7395
diff changeset
173
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
174 jabber_iq_send(iq);
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
175 }
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
176 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
177
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
178 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
179 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
180 PurpleXmlNode *child)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
181 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
182 JabberIq *iq;
18317
6c814e134e56 support replying to XEP-0202 queries
Nathan Walp <nwalp@pidgin.im>
parents: 18194
diff changeset
183
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
184 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
185 PurpleXmlNode *tzo, *utc;
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
186 GDateTime *now, *now_utc;
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
187 gchar *date, *tz;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
188
25556
300d8959e04c Fix the implementation of XEP-0202 (Entity Time) (thanks again to Marcus)
Paul Aurich <darkrain42@pidgin.im>
parents: 25554
diff changeset
189 iq = jabber_iq_new(js, JABBER_IQ_RESULT);
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
190 jabber_iq_set_id(iq, id);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
191 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
192 purple_xmlnode_set_attrib(iq->node, "to", from);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
193
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
194 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
195 purple_xmlnode_set_namespace(child, NS_ENTITY_TIME);
10941
7a67db0a7f43 [gaim-migrate @ 12731]
Nathan Walp <nwalp@pidgin.im>
parents: 10487
diff changeset
196
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
197 /* <tzo>-06:00</tzo> */
39015
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
198 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
199 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
200 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
201 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
202 g_free(tz);
10941
7a67db0a7f43 [gaim-migrate @ 12731]
Nathan Walp <nwalp@pidgin.im>
parents: 10487
diff changeset
203
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
204 /* <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
205 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
206 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
207 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
208 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
209 g_free(date);
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
210
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);
bb929248da3d jabber: Port purple_get_tzoff_str() to GDateTime functions
Mike Ruprecht <cmaiku@gmail.com>
parents: 38358
diff changeset
212 g_date_time_unref(now_utc);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
213
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
214 jabber_iq_send(iq);
27433
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
215 } else {
8eaac1cf4214 Remove obsoleted XEP-0090 (Legacy Entity Time)
Paul Aurich <darkrain42@pidgin.im>
parents: 27175
diff changeset
216 /* TODO: Errors */
18181
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 }
736c6abf62f4 respond to XEP-0199 queries (XMPP ping)
Nathan Walp <nwalp@pidgin.im>
parents: 17753
diff changeset
219
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
220 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
221 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
222 PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
223 {
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
224 JabberIq *iq;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
225 PurpleXmlNode *query;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
226
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
227 if(type == JABBER_IQ_GET) {
40312
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
228 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
229 const char *ui_name = NULL, *ui_version = NULL;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
230
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
231 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
232 if (from)
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
233 purple_xmlnode_set_attrib(iq->node, "to", from);
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
234 jabber_iq_set_id(iq, id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
235
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
236 query = purple_xmlnode_get_child(iq->node, "query");
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
237
18441
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
238 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
239
40312
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
240 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
241 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
242 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
243 }
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
244
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
245 if(NULL != ui_name && NULL != ui_version) {
18443
8ddab006e3f1 I like this better
Nathan Walp <nwalp@pidgin.im>
parents: 18441
diff changeset
246 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
247 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
248 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
249 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
250 } else {
34935
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, "name"), "libpurple", -1);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
252 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
253 }
d255d04c0aa1 core support for UI info...now to do the UI piece
Nathan Walp <nwalp@pidgin.im>
parents: 18317
diff changeset
254
8006
39ba515743cd [gaim-migrate @ 8683]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
255 jabber_iq_send(iq);
40312
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
256
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
257 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
258 g_object_unref(G_OBJECT(ui_info));
956745ff3ee8 Replace the ui info GHashTable with a gobject.
Gary Kramlich <grim@reaperworld.com>
parents: 39015
diff changeset
259 }
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
260 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
261 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
262
13794
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
263 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
264 {
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
265 g_hash_table_remove(js->iq_callbacks, id);
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
266 }
7264393a2349 [gaim-migrate @ 16204]
Nathan Walp <nwalp@pidgin.im>
parents: 13105
diff changeset
267
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
268 /**
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
269 * 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
270 * 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
271 * 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
272 * 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
273 * - 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
274 * 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
275 * - 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
276 * - 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
277 * 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
278 * 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
279 * - 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
280 * 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
281 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
282 * 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
283 * ones.
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
284 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
285 * 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
286 * 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
287 * 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
288 *
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
289 * @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
290 */
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
291 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
292 {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
293 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
294 /* 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
295 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
296 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
297
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
298 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
299 && 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
300 /* 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
301 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
302 }
c6926e608dc4 Allow incoming IQ stanzas with an empty 'from' if they're in response to
Mark Doliner <mark@kingant.net>
parents: 35308
diff changeset
303
35308
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
304 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
305 /* 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
306
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
307 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
308 /* 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
309 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
310 }
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 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
313 && (!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
314 /* 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
315 return TRUE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
316 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
317 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
318
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
319 return FALSE;
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
320 }
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
321
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
322 void jabber_iq_parse(JabberStream *js, PurpleXmlNode *packet)
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
323 {
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
324 JabberIqCallbackData *jcd;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
325 PurpleXmlNode *child, *error, *x;
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
326 const char *xmlns;
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
327 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
328 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
329 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
330 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
331
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
332 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
333 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
334 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
335
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
336 /*
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
337 * 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
338 * 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
339 */
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
340 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
341
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
342 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
343 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
344 return;
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
345 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
346
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
347 /*
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
348 * 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
349 * 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
350 * 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
351 * being) sufficient.
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
352 */
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
353 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
354 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
355 break;
25554
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
356 }
53e161fc0658 Jabber IQ handlers should handle non-query child nodes
Paul Aurich <darkrain42@pidgin.im>
parents: 24520
diff changeset
357
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
358 if (iq_type) {
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
359 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
360 type = JABBER_IQ_GET;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
361 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
362 type = JABBER_IQ_SET;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
363 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
364 type = JABBER_IQ_RESULT;
38258
9a6551eba09c Replace !strcmp() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 36131
diff changeset
365 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
366 type = JABBER_IQ_ERROR;
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
367 }
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
368
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
369 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
370 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
371 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
372 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
373 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
374 }
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
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 /* 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
377 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
378
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
379 if(type == JABBER_IQ_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
380 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
381
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
382 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
383 iq->node = purple_xmlnode_copy(packet);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
384 if (from) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
385 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
386 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
387 }
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
388
34935
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(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
390 /* 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
391 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
392 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
393 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
394 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
395 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
396 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
397
726138a1c69b Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents: 24254
diff changeset
398 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
399 } else
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
400 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
401 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
402
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
403 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
404 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
405 }
726138a1c69b Perform some sanity checking on inbound IQs and send an error / drop as needed.
Daniel Atallah <datallah@pidgin.im>
parents: 24254
diff changeset
406
36623
caaadef03507 Renamed purple_connection_get_protocol_info() to purple_connection_get_protocol()
Ankit Vani <a@nevitus.org>
parents: 36362
diff changeset
407 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
408 "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
409 if (signal_return) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
410 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
411 return;
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
412 }
28155
de9b298ef02e jabber: Emit jabber-receiving-iq after we've ensured id is !NULL
Paul Aurich <darkrain42@pidgin.im>
parents: 27433
diff changeset
413
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
414 /* 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
415 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
416 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
417 if (jcd) {
b8e2a5fbffd3 Fix problems logging into some servers including jabber.org and
Mark Doliner <mark@kingant.net>
parents: 35235
diff changeset
418 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
419 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
420 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
421 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
422 return;
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 char *expected_to;
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 if (jcd->to) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
427 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
428 } else {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
429 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
430 }
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
431
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
432 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
433
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
434 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
435 }
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
436 }
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
437 }
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
438
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
439 /*
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
440 * 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
441 * 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
442 */
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
443 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
444 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
445 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
446 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
447 g_free(key);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
448
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 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
450 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
451 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
452 if (signal_return) {
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
453 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
454 return;
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
455 }
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
456 }
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
457
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
458 if(jih) {
25817
09d6a40a341d Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents: 25815
diff changeset
459 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
460 jabber_id_free(from_id);
8262
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8169
diff changeset
461 return;
fa907a654af9 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8169
diff changeset
462 }
7395
e5595e8e13e4 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7170
diff changeset
463 }
26454
94130b583e0b Clean up usage of USE_VV in the XMPP protocol.
Michael Ruprecht <maiku@pidgin.im>
parents: 26337
diff changeset
464
29359
cec28224afd4 jabber: Log a more useful message on unhandled IQs
Paul Aurich <darkrain42@pidgin.im>
parents: 29020
diff changeset
465 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
466
8312
3cb6d9d94694 [gaim-migrate @ 9036]
Nathan Walp <nwalp@pidgin.im>
parents: 8262
diff changeset
467 /* 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
468 if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) {
8315
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
469 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
8135
d4df7d1821a5 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8043
diff changeset
470
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
471 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
472 iq->node = purple_xmlnode_copy(packet);
25818
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
473 if (from) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 29913
diff changeset
474 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
475 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
476 }
d087a2754595 Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents: 25817
diff changeset
477
34935
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_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
479 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
480 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
481 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
482 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
483 purple_xmlnode_set_namespace(x, NS_XMPP_STANZAS);
8169
f079f992248d [gaim-migrate @ 8882]
Nathan Walp <nwalp@pidgin.im>
parents: 8135
diff changeset
484
8315
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
485 jabber_iq_send(iq);
39f375cfb8d7 [gaim-migrate @ 9039]
Nathan Walp <nwalp@pidgin.im>
parents: 8314
diff changeset
486 }
35235
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
487
93d4bff19574 Prevent spoofing of iq replies by verifying that the 'from' address
Mark Doliner <mark@kingant.net>
parents: 29913
diff changeset
488 jabber_id_free(from_id);
7014
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
489 }
11471fae7ba0 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
490
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
491 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
492 {
25820
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
493 /*
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
494 * 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
495 * (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
496 * 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
497 */
c0ebe6bd49aa Track the node name in addition to the namespace for handlers (try #2)
Paul Aurich <darkrain42@pidgin.im>
parents: 25814
diff changeset
498 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
499 g_hash_table_replace(iq_handlers, key, handlerfunc);
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
500 }
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
501
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
502 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
503 {
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 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
505 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
506
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 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
508 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
509
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 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
511 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
512 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
513 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
514 } 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
515 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
516 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
517 }
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 }
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 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
521 {
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 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
523 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
524
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 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
526 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
527
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 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
529 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
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 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
532 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
533 } 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
534 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
535 }
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
536
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
537 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
538 }
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
539
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
540 void jabber_iq_init(void)
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
541 {
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
542 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
543 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
544
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
545 jabber_iq_register_handler("jingle", JINGLE, jingle_parse);
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
546 jabber_iq_register_handler("mailbox", NS_GOOGLE_MAIL_NOTIFY,
26704
e6dba3759625 Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents: 26701
diff changeset
547 jabber_gmail_poke);
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
548 jabber_iq_register_handler("new-mail", NS_GOOGLE_MAIL_NOTIFY,
26704
e6dba3759625 Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents: 26701
diff changeset
549 jabber_gmail_poke);
28979
191942cc7747 jabber: Start putting all the namespaces in one location with consistent naming.
Paul Aurich <darkrain42@pidgin.im>
parents: 28832
diff changeset
550 jabber_iq_register_handler("ping", NS_PING, jabber_ping_parse);
191942cc7747 jabber: Start putting all the namespaces in one location with consistent naming.
Paul Aurich <darkrain42@pidgin.im>
parents: 28832
diff changeset
551 jabber_iq_register_handler("query", NS_GOOGLE_JINGLE_INFO,
26704
e6dba3759625 Gratuitous alphabetization of the IQ handlers (again!) and move the data handler to jabber_data_init
Paul Aurich <darkrain42@pidgin.im>
parents: 26701
diff changeset
552 jabber_google_handle_jingle_info);
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
553 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
554 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
555 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
556 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
557 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
558 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
559 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
560 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
561 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
562 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
563 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
564 jabber_iq_version_parse);
26697
2f086177af37 Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents: 26695
diff changeset
565 #ifdef USE_VV
28980
4a0f7340b539 jabber: Add the missing file and fix up the Google session namespaces
Paul Aurich <darkrain42@pidgin.im>
parents: 28979
diff changeset
566 jabber_iq_register_handler("session", NS_GOOGLE_SESSION,
26697
2f086177af37 Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents: 26695
diff changeset
567 jabber_google_session_parse);
2f086177af37 Fix-up the merge some more (*sigh*), readding <session/> handler
Paul Aurich <darkrain42@pidgin.im>
parents: 26695
diff changeset
568 #endif
28984
1d84517d56eb jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents: 28980
diff changeset
569 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
570 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
571 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
572
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
573 }
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
574
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
575 void jabber_iq_uninit(void)
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
576 {
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
577 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
578 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
579 iq_handlers = signal_iq_handlers = NULL;
14356
7f4abf922cfa [gaim-migrate @ 16984]
Nathan Walp <nwalp@pidgin.im>
parents: 14254
diff changeset
580 }

mercurial