annotate libpurple/protocols/jabber/parser.c @ 32330:a5b556ac1de5

Rename purple_connection_error_reason to purple_connection_error
author Mark Doliner <mark@kingant.net>
date Sun, 21 Aug 2011 08:00:53 +0000
parents a8cc50c2279f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
1 /*
15823
32c366eeeb99 sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@gmail.com>
parents: 15635
diff changeset
2 * purple - Jabber XML parser stuff
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
3 *
28398
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27219
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27219
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
c585572e80dd Remove specific copyright lines from the XMPP prpl.
Paul Aurich <paul@darkrain42.org>
parents: 27219
diff changeset
6 * source distribution.
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
7 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
11 * (at your option) any later version.
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
12 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
16 * GNU General Public License for more details.
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
17 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
19680
44b4e8bd759b The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 15823
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
21 *
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
22 */
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
23 #include "internal.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
24
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
25 #include <libxml/parser.h>
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
26
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
27 #include "connection.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
28 #include "debug.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
29 #include "jabber.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
30 #include "parser.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
31 #include "util.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
32 #include "xmlnode.h"
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
33
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
34 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
35 jabber_parser_element_start_libxml(void *user_data,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
36 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *namespace,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
37 int nb_namespaces, const xmlChar **namespaces,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
38 int nb_attributes, int nb_defaulted, const xmlChar **attributes)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
39 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
40 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
41 xmlnode *node;
24818
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
42 int i, j;
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
43
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
44 if(!element_name) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
45 return;
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
46 } else if (js->stream_id == NULL) {
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
47 /* Sanity checking! */
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
48 if (0 != xmlStrcmp(element_name, (xmlChar *) "stream") ||
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
49 0 != xmlStrcmp(namespace, (xmlChar *) NS_XMPP_STREAMS)) {
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
50 /* We were expecting a <stream:stream/> opening stanza, but
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
51 * didn't get it. Bad!
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
52 */
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
53 purple_debug_error("jabber", "Expecting stream header, got %s with "
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
54 "xmlns %s\n", element_name, namespace);
32330
a5b556ac1de5 Rename purple_connection_error_reason to purple_connection_error
Mark Doliner <mark@kingant.net>
parents: 31534
diff changeset
55 purple_connection_error(js->gc,
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
56 PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
57 _("XMPP stream header missing"));
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
58 return;
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
59 }
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
60
29961
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
61 js->protocol_version.major = 0;
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
62 js->protocol_version.minor = 9;
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
63
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
64 for (i = 0; i < nb_attributes * 5; i += 5) {
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
65 int attrib_len = attributes[i+4] - attributes[i+3];
29108
f6f35d5960e9 Use g_strndup() for great justice.
Paul Aurich <paul@darkrain42.org>
parents: 29062
diff changeset
66 char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
67
29961
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
68 if(!xmlStrcmp(attributes[i], (xmlChar*) "version")) {
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
69 const char *dot = strchr(attrib, '.');
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
70
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
71 js->protocol_version.major = atoi(attrib);
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
72 js->protocol_version.minor = dot ? atoi(dot + 1) : 0;
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
73
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
74 if (js->protocol_version.major > 1) {
29964
9d1794da1d10 jabber: Connected again; checked section 5.4.5 of the bis.
Paul Aurich <paul@darkrain42.org>
parents: 29963
diff changeset
75 /* TODO: Send <unsupported-version/> error */
32330
a5b556ac1de5 Rename purple_connection_error_reason to purple_connection_error
Mark Doliner <mark@kingant.net>
parents: 31534
diff changeset
76 purple_connection_error(js->gc,
29961
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
77 PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
78 _("XMPP Version Mismatch"));
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
79 g_free(attrib);
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
80 return;
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
81 }
29962
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
82
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
83 if (js->protocol_version.major == 0 && js->protocol_version.minor != 9) {
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
84 purple_debug_warning("jabber", "Treating version %s as 0.9 for backward "
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
85 "compatibility\n", attrib);
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
86 }
32fe87f58d06 jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <paul@darkrain42.org>
parents: 29961
diff changeset
87 g_free(attrib);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
88 } else if(!xmlStrcmp(attributes[i], (xmlChar*) "id")) {
15635
baec42670246 Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evan.s@dreskin.net>
parents: 15498
diff changeset
89 g_free(js->stream_id);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
90 js->stream_id = attrib;
15635
baec42670246 Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evan.s@dreskin.net>
parents: 15498
diff changeset
91 } else {
24818
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
92 g_free(attrib);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
93 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
94 }
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
95
30882
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
96 if (js->stream_id == NULL) {
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
97 #if 0
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
98 /* This was underspecified in rfc3920 as only being a SHOULD, so
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
99 * we cannot rely on it. See #12331 and Oracle's server.
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
100 */
32330
a5b556ac1de5 Rename purple_connection_error_reason to purple_connection_error
Mark Doliner <mark@kingant.net>
parents: 31534
diff changeset
101 purple_connection_error(js->gc,
30003
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
102 PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
6e598ca344b3 jabber: Clear the stream header when restarting a stream, and be
Paul Aurich <paul@darkrain42.org>
parents: 29964
diff changeset
103 _("XMPP stream missing ID"));
30882
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
104 #else
30896
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
105 /* Instead, let's make up a placeholder stream ID, which we need
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
106 * to do because we flag on it being NULL as a special case
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
107 * in this parsing code.
30882
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
108 */
30896
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
109 js->stream_id = g_strdup("");
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
110 purple_debug_info("jabber", "Server failed to specify a stream "
4072761e3454 jabber: Slight improvements to the stream ID fix
Paul Aurich <paul@darkrain42.org>
parents: 30882
diff changeset
111 "ID (underspecified in rfc3920, but intended "
31534
a8cc50c2279f Remove trailing whitespace
Richard Laager <rlaager@wiktel.com>
parents: 31026
diff changeset
112 "to be a MUST; digest legacy auth may fail.\n");
30882
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
113 #endif
ec12d2883266 jabber: Make the reliance on stream ID laxer. Closes #12331
Paul Aurich <paul@darkrain42.org>
parents: 30003
diff changeset
114 }
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
115 } else {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
116
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
117 if(js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
118 node = xmlnode_new_child(js->current, (const char*) element_name);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
119 else
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
120 node = xmlnode_new((const char*) element_name);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
121 xmlnode_set_namespace(node, (const char*) namespace);
24818
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
122 xmlnode_set_prefix(node, (const char *)prefix);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
123
24818
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
124 if (nb_namespaces != 0) {
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
125 node->namespace_map = g_hash_table_new_full(
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
126 g_str_hash, g_str_equal, g_free, g_free);
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
127
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
128 for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
129 const char *key = (const char *)namespaces[j];
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
130 const char *val = (const char *)namespaces[j + 1];
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
131 g_hash_table_insert(node->namespace_map,
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
132 g_strdup(key ? key : ""), g_strdup(val ? val : ""));
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
133 }
f5c0cdaef99a Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents: 24425
diff changeset
134 }
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
135 for(i=0; i < nb_attributes * 5; i+=5) {
26262
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25110
diff changeset
136 const char *name = (const char *)attributes[i];
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25110
diff changeset
137 const char *prefix = (const char *)attributes[i+1];
25110
b096f7fb6899 Don't set an attribute prefix on the node, and remove an unnecessary call
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 24898
diff changeset
138 const char *attrib_ns = (const char *)attributes[i+2];
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
139 char *txt;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
140 int attrib_len = attributes[i+4] - attributes[i+3];
29108
f6f35d5960e9 Use g_strndup() for great justice.
Paul Aurich <paul@darkrain42.org>
parents: 29062
diff changeset
141 char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
142
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
143 txt = attrib;
29398
e1c01f236674 Correctly parse "&lt;br&gt;" in an XML attribute. Closes #11318.
Paul Aurich <paul@darkrain42.org>
parents: 29126
diff changeset
144 attrib = purple_unescape_text(txt);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
145 g_free(txt);
26262
b03430dae08e Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 25110
diff changeset
146 xmlnode_set_attrib_full(node, name, attrib_ns, prefix, attrib);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
147 g_free(attrib);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
148 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
149
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
150 js->current = node;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
151 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
152 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
153
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
154 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
155 jabber_parser_element_end_libxml(void *user_data, const xmlChar *element_name,
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
156 const xmlChar *prefix, const xmlChar *namespace)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
157 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
158 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
159
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
160 if(!js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
161 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
162
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
163 if(js->current->parent) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
164 if(!xmlStrcmp((xmlChar*) js->current->name, element_name))
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
165 js->current = js->current->parent;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
166 } else {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
167 xmlnode *packet = js->current;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
168 js->current = NULL;
17621
bbd92ee894f2 Fixed a bug in the XMPP parser involving event handlers that replace the xmlnode packet. This caused double frees in this situation. The replacing function must free the xmlnode, since multiple event handlers could do this, and the intermediate xml trees would leak otherwise.
Andreas Monitzer <pidgin@monitzer.com>
parents: 17606
diff changeset
169 jabber_process_packet(js, &packet);
24425
7cf760f3560e Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <will.thompson@collabora.co.uk>
parents: 24419
diff changeset
170 if (packet != NULL)
7cf760f3560e Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <will.thompson@collabora.co.uk>
parents: 24419
diff changeset
171 xmlnode_free(packet);
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
172 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
173 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
174
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
175 static void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
176 jabber_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
177 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
178 JabberStream *js = user_data;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
179
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
180 if(!js->current)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
181 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
182
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
183 if(!text || !text_len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
184 return;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
185
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
186 xmlnode_insert_data(js->current, (const char*) text, text_len);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
187 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
188
23426
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
189 static void
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
190 jabber_parser_structured_error_handler(void *user_data, xmlErrorPtr error)
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
191 {
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
192 JabberStream *js = user_data;
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
193
24416
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
194 if (error->level == XML_ERR_WARNING && error->message != NULL
29062
f043c5a07042 Use g_str_equal()
Paul Aurich <paul@darkrain42.org>
parents: 29033
diff changeset
195 && g_str_equal(error->message, "xmlns: URI vcard-temp is not absolute\n"))
24416
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
196 /*
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
197 * This message happens when parsing vcards, and is normal, so don't
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
198 * bother logging it because people scare easily.
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
199 */
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
200 return;
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
201
29109
6ebacc1710b2 jabber: Use the error code instead of string matching.
Paul Aurich <paul@darkrain42.org>
parents: 29108
diff changeset
202 if (error->level == XML_ERR_FATAL && error->code == XML_ERR_DOCUMENT_END)
29033
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
203 /*
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
204 * This is probably more annoying than the vcard-temp error; it occurs
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
205 * because we disconnect in most cases without waiting for the receiving
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
206 * </stream:stream> (limitations of libpurple)
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
207 */
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
208 return;
61cd675b73df jabber: Don't print "Extra content at the end of the document".
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
209
23426
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
210 purple_debug_error("jabber", "XML parser error for JabberStream %p: "
24416
e2f5a4a091b5 Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <mark@kingant.net>
parents: 23884
diff changeset
211 "Domain %i, code %i, level %i: %s",
23426
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
212 js,
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
213 error->domain, error->code, error->level,
24419
8de8ca65e1d9 I know Mark was trying to save newlines, but I had one to spare.
Richard Laager <rlaager@wiktel.com>
parents: 24416
diff changeset
214 (error->message ? error->message : "(null)\n"));
23426
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
215 }
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
216
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
217 static xmlSAXHandler jabber_parser_libxml = {
22914
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
218 NULL, /*internalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
219 NULL, /*isStandalone*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
220 NULL, /*hasInternalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
221 NULL, /*hasExternalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
222 NULL, /*resolveEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
223 NULL, /*getEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
224 NULL, /*entityDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
225 NULL, /*notationDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
226 NULL, /*attributeDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
227 NULL, /*elementDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
228 NULL, /*unparsedEntityDecl*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
229 NULL, /*setDocumentLocator*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
230 NULL, /*startDocument*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
231 NULL, /*endDocument*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
232 NULL, /*startElement*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
233 NULL, /*endElement*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
234 NULL, /*reference*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
235 jabber_parser_element_text_libxml, /*characters*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
236 NULL, /*ignorableWhitespace*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
237 NULL, /*processingInstruction*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
238 NULL, /*comment*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
239 NULL, /*warning*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
240 NULL, /*error*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
241 NULL, /*fatalError*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
242 NULL, /*getParameterEntity*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
243 NULL, /*cdataBlock*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
244 NULL, /*externalSubset*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
245 XML_SAX2_MAGIC, /*initialized*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
246 NULL, /*_private*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
247 jabber_parser_element_start_libxml, /*startElementNs*/
ada1640fa260 Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <daniel.atallah@gmail.com>
parents: 21358
diff changeset
248 jabber_parser_element_end_libxml, /*endElementNs*/
23426
1b3aea146613 Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evan.s@dreskin.net>
parents: 22914
diff changeset
249 jabber_parser_structured_error_handler /*serror*/
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
250 };
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
251
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
252 void
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
253 jabber_parser_setup(JabberStream *js)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
254 {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
255 /* This seems backwards, but it makes sense. The libxml code creates
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
256 * the parser context when you try to use it (this way, it can figure
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
257 * out the encoding at creation time. So, setting up the parser is
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
258 * just a matter of destroying any current parser. */
17603
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15823
diff changeset
259 jabber_parser_free(js);
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15823
diff changeset
260 }
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15823
diff changeset
261
7a3a66c6530a Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <pidgin@monitzer.com>
parents: 15823
diff changeset
262 void jabber_parser_free(JabberStream *js) {
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
263 if (js->context) {
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
264 xmlParseChunk(js->context, NULL,0,1);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
265 xmlFreeParserCtxt(js->context);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
266 js->context = NULL;
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
267 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
268 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
269
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
270 void jabber_parser_process(JabberStream *js, const char *buf, int len)
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
271 {
23427
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23426
diff changeset
272 int ret;
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23426
diff changeset
273
23429
76dbcdd86fe2 Whitespace fix
Evan Schoenberg <evan.s@dreskin.net>
parents: 23428
diff changeset
274 if (js->context == NULL) {
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
275 /* libxml inconsistently starts parsing on creating the
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
276 * parser, so do a ParseChunk right afterwards to force it. */
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
277 js->context = xmlCreatePushParserCtxt(&jabber_parser_libxml, js, buf, len, NULL);
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
278 xmlParseChunk(js->context, "", 0, 0);
23427
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23426
diff changeset
279 } else if ((ret = xmlParseChunk(js->context, buf, len, 0)) != XML_ERR_OK) {
23884
08c50482d5a2 Only disconnect xmpp connections during xml parsing if the error is an
Stu Tomlinson <stu@nosnilmot.com>
parents: 23429
diff changeset
280 xmlError *err = xmlCtxtGetLastError(js->context);
25871
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
281 /*
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
282 * libxml2 uses a global setting to determine whether or not to store
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
283 * warnings. Other libraries may set this, which causes err to be
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
284 * NULL. See #8136 for details.
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
285 */
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
286 xmlErrorLevel level = XML_ERR_WARNING;
23427
0eca6c183d60 xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evan.s@dreskin.net>
parents: 23426
diff changeset
287
25871
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
288 if (err)
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
289 level = err->level;
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
290
f424f26dd329 *** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <paul@darkrain42.org>
parents: 25110
diff changeset
291 switch (level) {
24898
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
292 case XML_ERR_NONE:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
293 purple_debug_info("jabber", "xmlParseChunk returned info %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
294 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
295 case XML_ERR_WARNING:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
296 purple_debug_warning("jabber", "xmlParseChunk returned warning %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
297 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
298 case XML_ERR_ERROR:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
299 purple_debug_error("jabber", "xmlParseChunk returned error %i\n", ret);
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
300 break;
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
301 case XML_ERR_FATAL:
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
302 purple_debug_error("jabber", "xmlParseChunk returned fatal %i\n", ret);
32330
a5b556ac1de5 Rename purple_connection_error_reason to purple_connection_error
Mark Doliner <mark@kingant.net>
parents: 31534
diff changeset
303 purple_connection_error (js->gc,
24898
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
304 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
305 _("XML Parse error"));
ee9b00cc4298 Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <stu@nosnilmot.com>
parents: 24818
diff changeset
306 break;
23428
ce361cc8e43b Drop and then recover from XML messages which trigger invalid character
Evan Schoenberg <evan.s@dreskin.net>
parents: 23427
diff changeset
307 }
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
308 }
28694
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
309
29961
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
310 if (js->protocol_version.major == 0 && js->protocol_version.minor == 9 &&
618c4165d4f8 jabber: Treat the version properly.
Paul Aurich <paul@darkrain42.org>
parents: 29753
diff changeset
311 !js->gc->disconnect_timeout &&
28694
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
312 (js->state == JABBER_STREAM_INITIALIZING ||
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
313 js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION)) {
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
314 /*
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
315 * Legacy servers don't advertise features, so if we've just gotten
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
316 * the opening <stream:stream> and there was no version, we need to
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
317 * immediately start legacy IQ auth.
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
318 */
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
319 jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
29078
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents: 28694
diff changeset
320 jabber_auth_start_old(js);
28694
c7aaad89a2f8 jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <paul@darkrain42.org>
parents: 28398
diff changeset
321 }
15374
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
322 }
5fe8042783c1 Rename gtk/ and libgaim/ to pidgin/ and libpurple/
Sean Egan <seanegan@gmail.com>
parents:
diff changeset
323