Sun, 10 Jan 2010 03:54:29 +0000
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 | 5 | -- This project is MIT/X11 licensed. Please see the |
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 | 15 | local pairs = pairs; |
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 | 20 | local default_log = require "util.logger".init("xmlhandlers"); |
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 | 26 | local ns_prefixes = { |
27 | ["http://www.w3.org/XML/1998/namespace"] = "xml"; | |
28 | } | |
29 | ||
331 | 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 | 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 | 37 | local cb_streamopened = stream_callbacks.streamopened; |
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 | 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 | 58 | attr.xmlns = curr_ns; |
59 | end | |
60 | ||
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 | 71 | end |
72 | end | |
73 | end | |
145 | 74 | |
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 | 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 | 90 | |
331 | 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 | 93 | else -- we are inside a stanza, so add a tag |
148 | 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 | 96 | attr.xmlns = curr_ns; |
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 | 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; |