Tue, 09 Mar 2010 23:13:42 +0000
jabber: This is more correct[er]
| 7014 | 1 | /* |
| 15884 | 2 | * purple - Jabber XML parser stuff |
| 7014 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27361
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:
27361
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:
27361
diff
changeset
|
6 | * source distribution. |
| 7014 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15884
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7014 | 21 | * |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 24 | ||
| 13808 | 25 | #include <libxml/parser.h> |
| 26 | ||
| 7014 | 27 | #include "connection.h" |
| 13808 | 28 | #include "debug.h" |
| 7014 | 29 | #include "jabber.h" |
| 30 | #include "parser.h" | |
| 15159 | 31 | #include "util.h" |
| 7014 | 32 | #include "xmlnode.h" |
| 33 | ||
| 13808 | 34 | static void |
| 35 | jabber_parser_element_start_libxml(void *user_data, | |
| 36 | const xmlChar *element_name, const xmlChar *prefix, const xmlChar *namespace, | |
| 37 | int nb_namespaces, const xmlChar **namespaces, | |
| 38 | int nb_attributes, int nb_defaulted, const xmlChar **attributes) | |
| 39 | { | |
| 40 | JabberStream *js = user_data; | |
| 41 | xmlnode *node; | |
|
25288
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
42 | int i, j; |
| 13808 | 43 | |
| 44 | if(!element_name) { | |
| 45 | return; | |
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
46 | } else if(!xmlStrcmp(element_name, (xmlChar*) "stream")) { |
|
29849
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
47 | js->protocol_version.major = 0; |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
48 | js->protocol_version.minor = 9; |
| 13808 | 49 | for(i=0; i < nb_attributes * 5; i += 5) { |
| 50 | int attrib_len = attributes[i+4] - attributes[i+3]; | |
|
29057
a8de6baeee63
Use g_strndup() for great justice.
Paul Aurich <darkrain42@pidgin.im>
parents:
29025
diff
changeset
|
51 | char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len); |
|
14498
ede839a78714
[gaim-migrate @ 17150]
Mark Doliner <markdoliner@pidgin.im>
parents:
14476
diff
changeset
|
52 | |
|
29849
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
53 | if(!xmlStrcmp(attributes[i], (xmlChar*) "version")) { |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
54 | const char *dot = strchr(attrib, '.'); |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
55 | |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
56 | js->protocol_version.major = atoi(attrib); |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
57 | js->protocol_version.minor = dot ? atoi(dot + 1) : 0; |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
58 | |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
59 | /* TODO: Check this against the spec; I'm not sure if the check |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
60 | * against minor is accurate. |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
61 | */ |
|
29851
de1f19dc73d5
jabber: This is more correct[er]
Paul Aurich <darkrain42@pidgin.im>
parents:
29850
diff
changeset
|
62 | if (js->protocol_version.major > 1 || (js->protocol_version == 1 && js->protocol_version.minor > 0)) |
|
29849
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
63 | purple_connection_error_reason(js->gc, |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
64 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
65 | _("XMPP Version Mismatch")); |
|
29850
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
66 | |
|
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
67 | if (js->protocol_version.major == 0 && js->protocol_version.minor != 9) { |
|
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
68 | purple_debug_warning("jabber", "Treating version %s as 0.9 for backward " |
|
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
69 | "compatibility\n", attrib); |
|
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
70 | } |
|
a7b5b8035f30
jabber: Backward compatibility in case any servers advertise other random 0.## versions
Paul Aurich <darkrain42@pidgin.im>
parents:
29849
diff
changeset
|
71 | g_free(attrib); |
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
72 | } else if(!xmlStrcmp(attributes[i], (xmlChar*) "id")) { |
|
15698
bcec3cb58d30
Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evands@pidgin.im>
parents:
15558
diff
changeset
|
73 | g_free(js->stream_id); |
|
14685
7622a9ca1794
[gaim-migrate @ 17352]
Daniel Atallah <datallah@pidgin.im>
parents:
14538
diff
changeset
|
74 | js->stream_id = attrib; |
|
15698
bcec3cb58d30
Patch from MatsMattsson (Adium Trac #6429) which fixes a leak of attrib for any attribute that isn't 'id' or 'version'.
Evan Schoenberg <evands@pidgin.im>
parents:
15558
diff
changeset
|
75 | } else { |
|
25288
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
76 | g_free(attrib); |
| 13808 | 77 | } |
| 78 | } | |
| 79 | } else { | |
| 80 | ||
| 81 | if(js->current) | |
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
82 | node = xmlnode_new_child(js->current, (const char*) element_name); |
| 13808 | 83 | else |
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
84 | node = xmlnode_new((const char*) element_name); |
|
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
85 | xmlnode_set_namespace(node, (const char*) namespace); |
|
25288
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
86 | xmlnode_set_prefix(node, (const char *)prefix); |
| 13808 | 87 | |
|
25288
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
88 | if (nb_namespaces != 0) { |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
89 | node->namespace_map = g_hash_table_new_full( |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
90 | g_str_hash, g_str_equal, g_free, g_free); |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
91 | |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
92 | for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) { |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
93 | const char *key = (const char *)namespaces[j]; |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
94 | const char *val = (const char *)namespaces[j + 1]; |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
95 | g_hash_table_insert(node->namespace_map, |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
96 | g_strdup(key ? key : ""), g_strdup(val ? val : "")); |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
97 | } |
|
2cd805f52348
Don't ignore XML namespace and prefix information when parsing incoming XMPP
Michal Witkowski <neuro@o2.pl>
parents:
24738
diff
changeset
|
98 | } |
| 13808 | 99 | for(i=0; i < nb_attributes * 5; i+=5) { |
|
26393
7420fd99903a
Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25620
diff
changeset
|
100 | const char *name = (const char *)attributes[i]; |
|
7420fd99903a
Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25620
diff
changeset
|
101 | const char *prefix = (const char *)attributes[i+1]; |
|
25620
fb9118dea0ed
Don't set an attribute prefix on the node, and remove an unnecessary call
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25365
diff
changeset
|
102 | const char *attrib_ns = (const char *)attributes[i+2]; |
| 15158 | 103 | char *txt; |
| 13808 | 104 | int attrib_len = attributes[i+4] - attributes[i+3]; |
|
29057
a8de6baeee63
Use g_strndup() for great justice.
Paul Aurich <darkrain42@pidgin.im>
parents:
29025
diff
changeset
|
105 | char *attrib = g_strndup((gchar *)attributes[i+3], attrib_len); |
| 15265 | 106 | |
| 15158 | 107 | txt = attrib; |
|
29328
cf4435714f5f
Correctly parse "<br>" in an XML attribute. Closes #11318.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
108 | attrib = purple_unescape_text(txt); |
| 15158 | 109 | g_free(txt); |
|
26393
7420fd99903a
Add xmlnode_set_attrib_full that enables you to set an attribute with both
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25620
diff
changeset
|
110 | xmlnode_set_attrib_full(node, name, attrib_ns, prefix, attrib); |
| 13808 | 111 | g_free(attrib); |
| 112 | } | |
| 113 | ||
| 114 | js->current = node; | |
| 115 | } | |
| 116 | } | |
| 117 | ||
| 118 | static void | |
|
14498
ede839a78714
[gaim-migrate @ 17150]
Mark Doliner <markdoliner@pidgin.im>
parents:
14476
diff
changeset
|
119 | jabber_parser_element_end_libxml(void *user_data, const xmlChar *element_name, |
| 13808 | 120 | const xmlChar *prefix, const xmlChar *namespace) |
| 121 | { | |
| 122 | JabberStream *js = user_data; | |
| 123 | ||
| 124 | if(!js->current) | |
| 125 | return; | |
| 126 | ||
| 127 | if(js->current->parent) { | |
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
128 | if(!xmlStrcmp((xmlChar*) js->current->name, element_name)) |
| 13808 | 129 | js->current = js->current->parent; |
| 130 | } else { | |
| 131 | xmlnode *packet = js->current; | |
| 132 | js->current = NULL; | |
|
17828
6957bf9d7330
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 <am@adiumx.com>
parents:
17813
diff
changeset
|
133 | jabber_process_packet(js, &packet); |
|
24738
b642b5aa2a42
Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <resiak@pidgin.im>
parents:
24706
diff
changeset
|
134 | if (packet != NULL) |
|
b642b5aa2a42
Don't try to free NULL xmlnodes stolen by jabber-receiving-xmlnode handlers
Will Thompson <resiak@pidgin.im>
parents:
24706
diff
changeset
|
135 | xmlnode_free(packet); |
| 13808 | 136 | } |
| 137 | } | |
| 138 | ||
| 139 | static void | |
| 140 | jabber_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len) | |
| 141 | { | |
| 142 | JabberStream *js = user_data; | |
| 143 | ||
| 144 | if(!js->current) | |
| 145 | return; | |
| 146 | ||
| 147 | if(!text || !text_len) | |
| 148 | return; | |
| 149 | ||
|
14690
9287ecc4adb1
[gaim-migrate @ 17369]
Daniel Atallah <datallah@pidgin.im>
parents:
14685
diff
changeset
|
150 | xmlnode_insert_data(js->current, (const char*) text, text_len); |
| 13808 | 151 | } |
| 152 | ||
|
23567
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
153 | static void |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
154 | jabber_parser_structured_error_handler(void *user_data, xmlErrorPtr error) |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
155 | { |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
156 | JabberStream *js = user_data; |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
157 | |
|
24703
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
158 | if (error->level == XML_ERR_WARNING && error->message != NULL |
| 29025 | 159 | && g_str_equal(error->message, "xmlns: URI vcard-temp is not absolute\n")) |
|
24703
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
160 | /* |
|
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
161 | * This message happens when parsing vcards, and is normal, so don't |
|
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
162 | * bother logging it because people scare easily. |
|
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
163 | */ |
|
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
164 | return; |
|
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
165 | |
|
29058
48b95d503303
jabber: Use the error code instead of string matching.
Paul Aurich <darkrain42@pidgin.im>
parents:
29057
diff
changeset
|
166 | if (error->level == XML_ERR_FATAL && error->code == XML_ERR_DOCUMENT_END) |
|
28986
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
167 | /* |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
168 | * This is probably more annoying than the vcard-temp error; it occurs |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
169 | * because we disconnect in most cases without waiting for the receiving |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
170 | * </stream:stream> (limitations of libpurple) |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
171 | */ |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
172 | return; |
|
57ed606f526d
jabber: Don't print "Extra content at the end of the document".
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
173 | |
|
23567
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
174 | purple_debug_error("jabber", "XML parser error for JabberStream %p: " |
|
24703
26998f3425f7
Don't log an error when parsing vcard data. Also, these messages
Mark Doliner <markdoliner@pidgin.im>
parents:
24149
diff
changeset
|
175 | "Domain %i, code %i, level %i: %s", |
|
23567
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
176 | js, |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
177 | error->domain, error->code, error->level, |
|
24706
9fbd313398fe
I know Mark was trying to save newlines, but I had one to spare.
Richard Laager <rlaager@pidgin.im>
parents:
24703
diff
changeset
|
178 | (error->message ? error->message : "(null)\n")); |
|
23567
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
179 | } |
|
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
180 | |
| 13808 | 181 | static xmlSAXHandler jabber_parser_libxml = { |
|
23077
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
182 | NULL, /*internalSubset*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
183 | NULL, /*isStandalone*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
184 | NULL, /*hasInternalSubset*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
185 | NULL, /*hasExternalSubset*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
186 | NULL, /*resolveEntity*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
187 | NULL, /*getEntity*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
188 | NULL, /*entityDecl*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
189 | NULL, /*notationDecl*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
190 | NULL, /*attributeDecl*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
191 | NULL, /*elementDecl*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
192 | NULL, /*unparsedEntityDecl*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
193 | NULL, /*setDocumentLocator*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
194 | NULL, /*startDocument*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
195 | NULL, /*endDocument*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
196 | NULL, /*startElement*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
197 | NULL, /*endElement*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
198 | NULL, /*reference*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
199 | jabber_parser_element_text_libxml, /*characters*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
200 | NULL, /*ignorableWhitespace*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
201 | NULL, /*processingInstruction*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
202 | NULL, /*comment*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
203 | NULL, /*warning*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
204 | NULL, /*error*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
205 | NULL, /*fatalError*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
206 | NULL, /*getParameterEntity*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
207 | NULL, /*cdataBlock*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
208 | NULL, /*externalSubset*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
209 | XML_SAX2_MAGIC, /*initialized*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
210 | NULL, /*_private*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
211 | jabber_parser_element_start_libxml, /*startElementNs*/ |
|
431e35debb40
Using named elements in a struct initialization doesn't work in MSVC.
Daniel Atallah <datallah@pidgin.im>
parents:
21279
diff
changeset
|
212 | jabber_parser_element_end_libxml, /*endElementNs*/ |
|
23567
9189d89be26f
Added a structured error handler callback to the xmlSAXHandler struct.
Evan Schoenberg <evands@pidgin.im>
parents:
23077
diff
changeset
|
213 | jabber_parser_structured_error_handler /*serror*/ |
| 13808 | 214 | }; |
| 7014 | 215 | |
| 216 | void | |
| 217 | jabber_parser_setup(JabberStream *js) | |
| 218 | { | |
| 14538 | 219 | /* This seems backwards, but it makes sense. The libxml code creates |
| 220 | * the parser context when you try to use it (this way, it can figure | |
| 221 | * out the encoding at creation time. So, setting up the parser is | |
| 222 | * just a matter of destroying any current parser. */ | |
|
17810
c8d4297080cb
Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
223 | jabber_parser_free(js); |
|
c8d4297080cb
Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
224 | } |
|
c8d4297080cb
Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
225 | |
|
c8d4297080cb
Fixed a leak: The XML parser was never cleaned up on disconnect.
Andreas Monitzer <am@adiumx.com>
parents:
15884
diff
changeset
|
226 | void jabber_parser_free(JabberStream *js) { |
| 13808 | 227 | if (js->context) { |
| 228 | xmlParseChunk(js->context, NULL,0,1); | |
| 229 | xmlFreeParserCtxt(js->context); | |
| 230 | js->context = NULL; | |
| 231 | } | |
| 7014 | 232 | } |
| 233 | ||
| 234 | void jabber_parser_process(JabberStream *js, const char *buf, int len) | |
| 235 | { | |
|
23568
bd3e623fa265
xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evands@pidgin.im>
parents:
23567
diff
changeset
|
236 | int ret; |
|
bd3e623fa265
xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evands@pidgin.im>
parents:
23567
diff
changeset
|
237 | |
| 23570 | 238 | if (js->context == NULL) { |
| 14538 | 239 | /* libxml inconsistently starts parsing on creating the |
| 240 | * parser, so do a ParseChunk right afterwards to force it. */ | |
| 13808 | 241 | js->context = xmlCreatePushParserCtxt(&jabber_parser_libxml, js, buf, len, NULL); |
| 14700 | 242 | xmlParseChunk(js->context, "", 0, 0); |
|
23568
bd3e623fa265
xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evands@pidgin.im>
parents:
23567
diff
changeset
|
243 | } else if ((ret = xmlParseChunk(js->context, buf, len, 0)) != XML_ERR_OK) { |
|
24149
7ee629835390
Only disconnect xmpp connections during xml parsing if the error is an
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
23570
diff
changeset
|
244 | xmlError *err = xmlCtxtGetLastError(js->context); |
|
25726
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
245 | /* |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
246 | * libxml2 uses a global setting to determine whether or not to store |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
247 | * warnings. Other libraries may set this, which causes err to be |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
248 | * NULL. See #8136 for details. |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
249 | */ |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
250 | xmlErrorLevel level = XML_ERR_WARNING; |
|
23568
bd3e623fa265
xmlParseChunk() never returns less than 0. It retusn an error code from
Evan Schoenberg <evands@pidgin.im>
parents:
23567
diff
changeset
|
251 | |
|
25726
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
252 | if (err) |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
253 | level = err->level; |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
254 | |
|
19e0c9302a43
*** Plucked rev d34a1589 (darkrain42@pidgin.im):
Paul Aurich <darkrain42@pidgin.im>
parents:
25620
diff
changeset
|
255 | switch (level) { |
|
25365
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
256 | case XML_ERR_NONE: |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
257 | purple_debug_info("jabber", "xmlParseChunk returned info %i\n", ret); |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
258 | break; |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
259 | case XML_ERR_WARNING: |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
260 | purple_debug_warning("jabber", "xmlParseChunk returned warning %i\n", ret); |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
261 | break; |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
262 | case XML_ERR_ERROR: |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
263 | purple_debug_error("jabber", "xmlParseChunk returned error %i\n", ret); |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
264 | break; |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
265 | case XML_ERR_FATAL: |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
266 | purple_debug_error("jabber", "xmlParseChunk returned fatal %i\n", ret); |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
267 | purple_connection_error_reason (js->gc, |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
268 | PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
269 | _("XML Parse error")); |
|
e941a99c74b3
Make XML parsing error levels match libxml2's levels, making less important
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
25288
diff
changeset
|
270 | break; |
|
23569
b76c41ef45d4
Drop and then recover from XML messages which trigger invalid character
Evan Schoenberg <evands@pidgin.im>
parents:
23568
diff
changeset
|
271 | } |
| 13808 | 272 | } |
|
28623
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
273 | |
|
29849
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
274 | if (js->protocol_version.major == 0 && js->protocol_version.minor == 9 && |
|
d7b910200dc5
jabber: Treat the version properly.
Paul Aurich <darkrain42@pidgin.im>
parents:
29697
diff
changeset
|
275 | !js->gc->disconnect_timeout && |
|
28623
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
276 | (js->state == JABBER_STREAM_INITIALIZING || |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
277 | js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION)) { |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
278 | /* |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
279 | * Legacy servers don't advertise features, so if we've just gotten |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
280 | * the opening <stream:stream> and there was no version, we need to |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
281 | * immediately start legacy IQ auth. |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
282 | */ |
|
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
283 | jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28623
diff
changeset
|
284 | jabber_auth_start_old(js); |
|
28623
4f7f9d7bb23d
jabber: Re-arrange the code that detects legacy servers so that we don't stomp over "Host Unknown" errors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
285 | } |
| 7014 | 286 | } |
| 287 |