core/xmlhandlers.lua

Sun, 10 Jan 2010 03:54:29 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 10 Jan 2010 03:54:29 +0000
changeset 2432
1e045b3e9dce
parent 2261
13d55c66bf81
child 2463
d9ff0190eb4a
child 2923
b7049746bd29
permissions
-rw-r--r--

util.signal: Restore the old debug hook earlier, just in case we receive another signal between clearing the signal queue and restoring it

1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1414
diff changeset
1 -- Prosody IM
760
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
2 -- Copyright (C) 2008-2009 Matthew Wild
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
3 -- Copyright (C) 2008-2009 Waqas Hussain
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 355
diff changeset
4 --
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 625
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 625
diff changeset
6 -- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 355
diff changeset
7 --
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 355
diff changeset
8
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 355
diff changeset
9
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
10
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
11 require "util.stanza"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
12
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
13 local st = stanza;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
14 local tostring = tostring;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
15 local pairs = pairs;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
16 local ipairs = ipairs;
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
17 local t_insert = table.insert;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
18 local t_concat = table.concat;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
19
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
20 local default_log = require "util.logger".init("xmlhandlers");
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
21
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
22 local error = error;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
23
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
24 module "xmlhandlers"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
25
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
26 local ns_prefixes = {
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
27 ["http://www.w3.org/XML/1998/namespace"] = "xml";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
28 }
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
29
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
30 function init_xmlhandlers(session, stream_callbacks)
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
31 local ns_stack = { "" };
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
32 local curr_tag;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
33 local chardata = {};
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
34 local xml_handlers = {};
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
35 local log = session.log or default_log;
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
36
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
37 local cb_streamopened = stream_callbacks.streamopened;
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
38 local cb_streamclosed = stream_callbacks.streamclosed;
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
39 local cb_error = stream_callbacks.error or function (session, e) error("XML stream error: "..tostring(e)); end;
545
60002993be04 Abstract xmlhandlers a bit more, also add error callbacks
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
40 local cb_handlestanza = stream_callbacks.handlestanza;
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
41
625
cad4dcfbf295 Change xmlhandlers to match stream opening tag with ns+tag
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
42 local stream_tag = stream_callbacks.stream_tag;
899
b95368f199a1 core.xmlhandlers: Filter out default stream namespace from stanzas
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
43 local stream_default_ns = stream_callbacks.default_ns;
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
44
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
45 local stanza
625
cad4dcfbf295 Change xmlhandlers to match stream opening tag with ns+tag
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
46 function xml_handlers:StartElement(tagname, attr)
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
47 if stanza and #chardata > 0 then
31
aaccbf07849b Remove now useless debug output
Matthew Wild <mwild1@gmail.com>
parents: 20
diff changeset
48 -- We have some character data in the buffer
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
49 stanza:text(t_concat(chardata));
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
50 chardata = {};
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
51 end
2077
e33658f6052c Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents: 2037
diff changeset
52 local curr_ns,name = tagname:match("^([^\1]*)\1?(.*)$");
2261
13d55c66bf81 core.xmlhandlers: Fixed processing of empty namespaces (which caused an issue with jwchat).
Waqas Hussain <waqas20@gmail.com>
parents: 2077
diff changeset
53 if name == "" then
1051
0327c569eb1a xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents: 1008
diff changeset
54 curr_ns, name = "", curr_ns;
0327c569eb1a xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents: 1008
diff changeset
55 end
0327c569eb1a xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents: 1008
diff changeset
56
899
b95368f199a1 core.xmlhandlers: Filter out default stream namespace from stanzas
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
57 if curr_ns ~= stream_default_ns then
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
58 attr.xmlns = curr_ns;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
59 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
60
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
61 -- FIXME !!!!!
1414
6f653b8beac9 xmlhandlers: Remove numeric attributes
Waqas Hussain <waqas20@gmail.com>
parents: 1155
diff changeset
62 for i=1,#attr do
6f653b8beac9 xmlhandlers: Remove numeric attributes
Waqas Hussain <waqas20@gmail.com>
parents: 1155
diff changeset
63 local k = attr[i];
6f653b8beac9 xmlhandlers: Remove numeric attributes
Waqas Hussain <waqas20@gmail.com>
parents: 1155
diff changeset
64 attr[i] = nil;
2077
e33658f6052c Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents: 2037
diff changeset
65 local ns, nm = k:match("^([^\1]*)\1?(.*)$");
2261
13d55c66bf81 core.xmlhandlers: Fixed processing of empty namespaces (which caused an issue with jwchat).
Waqas Hussain <waqas20@gmail.com>
parents: 2077
diff changeset
66 if nm ~= "" then
1154
570c0427fcb8 xmlhandlers: Removed an unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1153
diff changeset
67 ns = ns_prefixes[ns];
570c0427fcb8 xmlhandlers: Removed an unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1153
diff changeset
68 if ns then
570c0427fcb8 xmlhandlers: Removed an unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1153
diff changeset
69 attr[ns..":"..nm] = attr[k];
570c0427fcb8 xmlhandlers: Removed an unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1153
diff changeset
70 attr[k] = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
71 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
72 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
73 end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
74
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
75 if not stanza then --if we are not currently inside a stanza
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
76 if session.notopen then
625
cad4dcfbf295 Change xmlhandlers to match stream opening tag with ns+tag
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
77 if tagname == stream_tag then
341
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
78 if cb_streamopened then
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
79 cb_streamopened(session, attr);
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
80 end
545
60002993be04 Abstract xmlhandlers a bit more, also add error callbacks
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
81 else
60002993be04 Abstract xmlhandlers a bit more, also add error callbacks
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
82 -- Garbage before stream?
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
83 cb_error(session, "no-stream");
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
84 end
545
60002993be04 Abstract xmlhandlers a bit more, also add error callbacks
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
85 return;
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
86 end
38
Matthew Wild <mwild1@gmail.com>
parents: 31
diff changeset
87 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
88 cb_error(session, "invalid-top-level-element");
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
89 end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
90
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
91 stanza = st.stanza(name, attr);
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
92 curr_tag = stanza;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
93 else -- we are inside a stanza, so add a tag
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
94 attr.xmlns = nil;
899
b95368f199a1 core.xmlhandlers: Filter out default stream namespace from stanzas
Matthew Wild <mwild1@gmail.com>
parents: 894
diff changeset
95 if curr_ns ~= stream_default_ns then
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
96 attr.xmlns = curr_ns;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
97 end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
98 stanza:tag(name, attr);
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
99 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
100 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
101 function xml_handlers:CharacterData(data)
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
102 if stanza then
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
103 t_insert(chardata, data);
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
104 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
105 end
625
cad4dcfbf295 Change xmlhandlers to match stream opening tag with ns+tag
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
106 function xml_handlers:EndElement(tagname)
2077
e33658f6052c Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
Waqas Hussain <waqas20@gmail.com>
parents: 2037
diff changeset
107 local curr_ns,name = tagname:match("^([^\1]*)\1?(.*)$");
2261
13d55c66bf81 core.xmlhandlers: Fixed processing of empty namespaces (which caused an issue with jwchat).
Waqas Hussain <waqas20@gmail.com>
parents: 2077
diff changeset
108 if name == "" then
1051
0327c569eb1a xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents: 1008
diff changeset
109 curr_ns, name = "", curr_ns;
0327c569eb1a xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents: 1008
diff changeset
110 end
334
bffd80e8c7a3 *ahem* Yes, move along please... though really, quite a classic. :)
Matthew Wild <mwild1@gmail.com>
parents: 331
diff changeset
111 if (not stanza) or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then
625
cad4dcfbf295 Change xmlhandlers to match stream opening tag with ns+tag
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
112 if tagname == stream_tag then
341
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
113 if cb_streamclosed then
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
114 cb_streamclosed(session);
a9e02b5c58d2 Don't error if streamopened/streamclosed callback is not specified for a session
Matthew Wild <mwild1@gmail.com>
parents: 334
diff changeset
115 end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 99
diff changeset
116 elseif name == "error" then
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
117 cb_error(session, "stream-error", stanza);
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 40
diff changeset
118 else
557
c9b3ffb08fe3 Disconnect with stream errors on bad XML, or invalid stream namespace
Matthew Wild <mwild1@gmail.com>
parents: 545
diff changeset
119 cb_error(session, "parse-error", "unexpected-element-close", name);
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 40
diff changeset
120 end
2037
a919511c45ac xmlhandlers: Reset state on error or stream close, fixes possible traceback
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
121 stanza, chardata = nil, {};
a919511c45ac xmlhandlers: Reset state on error or stream close, fixes possible traceback
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
122 return;
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 40
diff changeset
123 end
1155
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
124 if #chardata > 0 then
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
125 -- We have some character data in the buffer
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
126 stanza:text(t_concat(chardata));
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
127 chardata = {};
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
128 end
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
129 -- Complete stanza
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
130 if #stanza.last_add == 0 then
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
131 cb_handlestanza(session, stanza);
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
132 stanza = nil;
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
133 else
a93b25f1528e xmlhandlers: Removed another unnecessary check
Waqas Hussain <waqas20@gmail.com>
parents: 1154
diff changeset
134 stanza:up();
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
135 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
136 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
137 return xml_handlers;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
138 end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
139
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
140 return init_xmlhandlers;

mercurial