Mercurial > prosody-hg
annotate util/xmppstream.lua @ 14174:604bed81808e 13.0
util.datamanager: Fix listing of host stores
lfs returns the basename of the directory entry, and the check neglected to
prefix the data path directory before calling lfs.attribute(), which resulted
in checking Prosody's current working directory for the file instead.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 25 May 2026 13:23:03 +0100 |
| parents | e3ddbf7f2d3f |
| children |
| rev | line source |
|---|---|
|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1414
diff
changeset
|
1 -- Prosody IM |
|
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2261
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
|
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2261
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
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 |
|
2921
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
9 local lxp = require "lxp"; |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
11560
diff
changeset
|
10 local st = require "prosody.util.stanza"; |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
11 local stanza_mt = st.stanza_mt; |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
12 |
|
4425
6f5ed0f4a3e6
util.xmppstream: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
4306
diff
changeset
|
13 local error = error; |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
14 local tostring = tostring; |
|
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
15 local t_insert = table.insert; |
|
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
16 local t_concat = table.concat; |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
17 local t_remove = table.remove; |
|
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
18 local setmetatable = setmetatable; |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
19 |
|
4275
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
20 -- COMPAT: w/LuaExpat 1.1.0 |
|
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
21 local lxp_supports_doctype = pcall(lxp.new, { StartDoctypeDecl = false }); |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
22 local lxp_supports_xmldecl = pcall(lxp.new, { XmlDecl = false }); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
23 local lxp_supports_bytecount = not not lxp.new({}).getcurrentbytecount; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
24 |
|
14123
166ac7d65cb6
util.xmppstream: Reduce default stanza size limit to 10k for safety
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
25 local default_stanza_size_limit = 10000; -- Minimum stanza size limit |
|
4275
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
26 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
27 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8382
diff
changeset
|
28 -- luacheck: std none |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
29 |
|
2921
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
30 local new_parser = lxp.new; |
|
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
31 |
|
4484
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
32 local xml_namespace = { |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
33 ["http://www.w3.org/XML/1998/namespace\1lang"] = "xml:lang"; |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
34 ["http://www.w3.org/XML/1998/namespace\1space"] = "xml:space"; |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
35 ["http://www.w3.org/XML/1998/namespace\1base"] = "xml:base"; |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
36 ["http://www.w3.org/XML/1998/namespace\1id"] = "xml:id"; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
37 }; |
|
2464
0b5f0ae7a6b1
xmlhandlers: More refactoring, split up stream_ns and stream_tag, add stream_error_tag so that callers don't need to be so worried about the separator we use
Matthew Wild <mwild1@gmail.com>
parents:
2463
diff
changeset
|
38 |
|
0b5f0ae7a6b1
xmlhandlers: More refactoring, split up stream_ns and stream_tag, add stream_error_tag so that callers don't need to be so worried about the separator we use
Matthew Wild <mwild1@gmail.com>
parents:
2463
diff
changeset
|
39 local xmlns_streams = "http://etherx.jabber.org/streams"; |
|
0b5f0ae7a6b1
xmlhandlers: More refactoring, split up stream_ns and stream_tag, add stream_error_tag so that callers don't need to be so worried about the separator we use
Matthew Wild <mwild1@gmail.com>
parents:
2463
diff
changeset
|
40 |
|
2463
d9ff0190eb4a
xmlhandlers: Define ns_separator and ns_pattern to save repeating it in literal form throughout the file
Matthew Wild <mwild1@gmail.com>
parents:
2261
diff
changeset
|
41 local ns_separator = "\1"; |
|
d9ff0190eb4a
xmlhandlers: Define ns_separator and ns_pattern to save repeating it in literal form throughout the file
Matthew Wild <mwild1@gmail.com>
parents:
2261
diff
changeset
|
42 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; |
| 148 | 43 |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
44 local function dummy_cb() end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
45 |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
46 local function new_sax_handlers(session, stream_callbacks, cb_handleprogress, max_elements) |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
47 local xml_handlers = {}; |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
48 |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
49 local cb_streamopened = stream_callbacks.streamopened; |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
50 local cb_streamclosed = stream_callbacks.streamclosed; |
|
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
51 local cb_error = stream_callbacks.error or |
|
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
52 function(_, e, stanza) |
|
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
53 error("XML stream error: "..tostring(e)..(stanza and ": "..tostring(stanza) or ""),2); |
|
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
54 end; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
55 local cb_handlestanza = stream_callbacks.handlestanza; |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
56 cb_handleprogress = cb_handleprogress or dummy_cb; |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
57 |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
58 local stream_ns = stream_callbacks.stream_ns or xmlns_streams; |
|
3927
1b57e83266f0
util.xmppstream: Allow stream_ns = "" for parsing streams with no xmlns
Matthew Wild <mwild1@gmail.com>
parents:
3708
diff
changeset
|
59 local stream_tag = stream_callbacks.stream_tag or "stream"; |
|
1b57e83266f0
util.xmppstream: Allow stream_ns = "" for parsing streams with no xmlns
Matthew Wild <mwild1@gmail.com>
parents:
3708
diff
changeset
|
60 if stream_ns ~= "" then |
|
1b57e83266f0
util.xmppstream: Allow stream_ns = "" for parsing streams with no xmlns
Matthew Wild <mwild1@gmail.com>
parents:
3708
diff
changeset
|
61 stream_tag = stream_ns..ns_separator..stream_tag; |
|
1b57e83266f0
util.xmppstream: Allow stream_ns = "" for parsing streams with no xmlns
Matthew Wild <mwild1@gmail.com>
parents:
3708
diff
changeset
|
62 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
63 local stream_error_tag = stream_ns..ns_separator..(stream_callbacks.error_tag or "error"); |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
64 |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
65 local stream_default_ns = stream_callbacks.default_ns; |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
66 |
|
10093
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
67 local stream_lang = "en"; |
|
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
68 |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
69 local stack = {}; |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
70 local chardata, stanza = {}; |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
71 local stanza_size = 0; |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
72 local child_quota = 0; |
|
3633
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
73 local non_streamns_depth = 0; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
74 function xml_handlers:StartElement(tagname, attr) |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
75 if stanza and #chardata > 0 then |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
76 -- We have some character data in the buffer |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
77 t_insert(stanza, t_concat(chardata)); |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
78 chardata = {}; |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
79 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
80 local curr_ns,name = tagname:match(ns_pattern); |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
81 if name == "" then |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
82 curr_ns, name = "", curr_ns; |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
83 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
84 |
|
3633
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
85 if curr_ns ~= stream_default_ns or non_streamns_depth > 0 then |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
86 attr.xmlns = curr_ns; |
|
3633
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
87 non_streamns_depth = non_streamns_depth + 1; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
88 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
89 |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
90 if stanza and child_quota then |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
91 -- Check stanza complexity limits |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
92 child_quota = child_quota - 1; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
93 if child_quota <= 0 then |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
94 cb_error(session, "parse-error", "resource-constraint", "Stanza exceeds permitted children"); |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
95 if not self.stop or not self:stop() then |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
96 error("Failed to abort parsing"); |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
97 end |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
98 return; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
99 end |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
100 end |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
101 |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
102 for i=1,#attr do |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
103 local k = attr[i]; |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
104 attr[i] = nil; |
|
4484
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
105 local xmlk = xml_namespace[k]; |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
106 if xmlk then |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
107 attr[xmlk] = attr[k]; |
|
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
108 attr[k] = nil; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
109 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
110 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
111 |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
112 if not stanza then --if we are not currently inside a stanza |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
113 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
114 stanza_size = self:getcurrentbytecount(); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
115 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
116 if session.notopen then |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
117 if tagname == stream_tag then |
|
3633
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
118 non_streamns_depth = 0; |
|
10093
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
119 stream_lang = attr["xml:lang"] or stream_lang; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
120 if cb_streamopened then |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
121 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
122 cb_handleprogress(stanza_size); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
123 stanza_size = 0; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
124 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
125 cb_streamopened(session, attr); |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
126 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
127 else |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
128 -- Garbage before stream? |
|
6363
ec446efc15e1
util.xmppstream: When error is 'no-stream', pass the received tagname to the error handler
Matthew Wild <mwild1@gmail.com>
parents:
6053
diff
changeset
|
129 cb_error(session, "no-stream", tagname); |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
130 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
131 return; |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
132 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
133 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
134 cb_error(session, "invalid-top-level-element"); |
|
1051
0327c569eb1a
xmlhandlers: Fix tag pattern again for the default namespace
Matthew Wild <mwild1@gmail.com>
parents:
1003
diff
changeset
|
135 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
136 |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
137 stanza = setmetatable({ name = name, attr = attr, tags = {} }, stanza_mt); |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
138 child_quota = max_elements; |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
139 else -- we are inside a stanza, so add a tag |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
140 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
141 stanza_size = stanza_size + self:getcurrentbytecount(); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
142 end |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
143 t_insert(stack, stanza); |
|
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
144 local oldstanza = stanza; |
|
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
145 stanza = setmetatable({ name = name, attr = attr, tags = {} }, stanza_mt); |
|
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
146 t_insert(oldstanza, stanza); |
|
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
147 t_insert(oldstanza.tags, stanza); |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
148 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
149 end |
|
9020
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
150 |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
151 function xml_handlers:StartCdataSection() |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
152 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
153 if stanza then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
154 stanza_size = stanza_size + self:getcurrentbytecount(); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
155 else |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
156 cb_handleprogress(self:getcurrentbytecount()); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
157 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
158 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
159 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
160 function xml_handlers:EndCdataSection() |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
161 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
162 if stanza then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
163 stanza_size = stanza_size + self:getcurrentbytecount(); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
164 else |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
165 cb_handleprogress(self:getcurrentbytecount()); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
166 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
167 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
168 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
169 function xml_handlers:CharacterData(data) |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
170 if stanza then |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
171 if lxp_supports_bytecount then |
|
6052
ce3244c084f9
util.xmppstream: Disable LuaExpat's buffering (if possible)
Matthew Wild <mwild1@gmail.com>
parents:
6042
diff
changeset
|
172 stanza_size = stanza_size + self:getcurrentbytecount(); |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
173 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
174 t_insert(chardata, data); |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
175 elseif lxp_supports_bytecount then |
|
6052
ce3244c084f9
util.xmppstream: Disable LuaExpat's buffering (if possible)
Matthew Wild <mwild1@gmail.com>
parents:
6042
diff
changeset
|
176 cb_handleprogress(self:getcurrentbytecount()); |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
177 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
178 end |
|
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
179 function xml_handlers:EndElement(tagname) |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
180 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
181 stanza_size = stanza_size + self:getcurrentbytecount() |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
182 end |
|
3633
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
183 if non_streamns_depth > 0 then |
|
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
184 non_streamns_depth = non_streamns_depth - 1; |
|
4069c37c54bc
util.xmppstream: Preserve the stream content namespace on descendents of elements which are in another namespace.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
185 end |
|
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
186 if stanza then |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
187 if #chardata > 0 then |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
188 -- We have some character data in the buffer |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
189 t_insert(stanza, t_concat(chardata)); |
|
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
190 chardata = {}; |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
191 end |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
192 -- Complete stanza |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
193 if #stack == 0 then |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
194 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
195 cb_handleprogress(stanza_size); |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
196 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
197 stanza_size = 0; |
|
10093
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
198 if stanza.attr["xml:lang"] == nil then |
|
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
199 stanza.attr["xml:lang"] = stream_lang; |
|
1266a63ba567
util.xmppstream: Inherit xml:lang from stream to stanzas (fixes #1401)
Kim Alvefur <zash@zash.se>
parents:
9071
diff
changeset
|
200 end |
|
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
201 if tagname ~= stream_error_tag then |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
202 cb_handlestanza(session, stanza); |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
203 else |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
204 cb_error(session, "stream-error", stanza); |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
205 end |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
206 stanza = nil; |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
207 else |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
208 stanza = t_remove(stack); |
|
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
209 end |
|
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
210 else |
|
11546
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
211 if lxp_supports_bytecount then |
|
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
212 cb_handleprogress(stanza_size); |
|
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
213 end |
|
4483
1dbd06eedaa4
util.xmppstream: Have faith in the XML parser matching start and end tags.
Waqas Hussain <waqas20@gmail.com>
parents:
4482
diff
changeset
|
214 if cb_streamclosed then |
|
1dbd06eedaa4
util.xmppstream: Have faith in the XML parser matching start and end tags.
Waqas Hussain <waqas20@gmail.com>
parents:
4482
diff
changeset
|
215 cb_streamclosed(session); |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
216 end |
|
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
217 end |
|
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
218 end |
| 4277 | 219 |
| 4288 | 220 local function restricted_handler(parser) |
|
4275
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
221 cb_error(session, "parse-error", "restricted-xml", "Restricted XML, see RFC 6120 section 11.1."); |
|
4305
e3ffa91517cc
util.xmppstream: Check to make sure parser.stop is present before calling it.
Waqas Hussain <waqas20@gmail.com>
parents:
4289
diff
changeset
|
222 if not parser.stop or not parser:stop() then |
| 4288 | 223 error("Failed to abort parsing"); |
|
4276
a37522bf6b1b
xmlhandlers: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning. [Backport of 7cc426988bcc in trunk]
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
224 end |
|
4275
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
225 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
226 |
|
9020
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
227 if lxp_supports_xmldecl then |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
228 function xml_handlers:XmlDecl(version, encoding, standalone) |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
229 if lxp_supports_bytecount then |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
230 cb_handleprogress(self:getcurrentbytecount()); |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
231 end |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
232 if (encoding and encoding:lower() ~= "utf-8") |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
233 or (standalone == "no") |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
234 or (version and version ~= "1.0") then |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
235 return restricted_handler(self); |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
236 end |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
237 end |
|
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
238 end |
|
4275
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
239 if lxp_supports_doctype then |
|
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
240 xml_handlers.StartDoctypeDecl = restricted_handler; |
|
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
241 end |
|
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
242 xml_handlers.Comment = restricted_handler; |
|
5305a665bdd4
util.xmppstream: Reject XML comments, processing instructions and (if supported by LuaExpat) DTDs. If not supported, log a warning.
Matthew Wild <mwild1@gmail.com>
parents:
3927
diff
changeset
|
243 xml_handlers.ProcessingInstruction = restricted_handler; |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
244 |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
245 local function reset() |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
246 stanza, chardata, stanza_size = nil, {}, 0; |
|
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
247 stack = {}; |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
248 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
249 |
|
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
250 local function set_session(stream, new_session) -- luacheck: ignore 212/stream |
|
3424
9e0df614e5d0
util.xmppstream: Add set_session() method to change the session that a stream is associated with
Matthew Wild <mwild1@gmail.com>
parents:
3032
diff
changeset
|
251 session = new_session; |
|
9e0df614e5d0
util.xmppstream: Add set_session() method to change the session that a stream is associated with
Matthew Wild <mwild1@gmail.com>
parents:
3032
diff
changeset
|
252 end |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
253 |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
254 local function set_max_elements(new_max_elements) |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
255 max_elements = new_max_elements; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
256 end |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
257 |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
258 return xml_handlers, { |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
259 reset = reset; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
260 set_session = set_session; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
261 set_max_elements = set_max_elements; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
262 }; |
|
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
263 end |
|
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
264 |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
265 local function new(session, stream_callbacks, stanza_size_limit, ex) |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
266 -- Used to track parser progress (e.g. to enforce size limits) |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
267 local n_outstanding_bytes = 0; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
268 local handle_progress; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
269 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
270 function handle_progress(n_parsed_bytes) |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
271 n_outstanding_bytes = n_outstanding_bytes - n_parsed_bytes; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
272 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
273 stanza_size_limit = stanza_size_limit or default_stanza_size_limit; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
274 elseif stanza_size_limit then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
275 error("Stanza size limits are not supported on this version of LuaExpat") |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
276 end |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
277 |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
278 local max_elements = ex and ex.max_elements; |
|
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
279 |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
280 local handlers, meta = new_sax_handlers(session, stream_callbacks, handle_progress); |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
281 local parser = new_parser(handlers, ns_separator, false, max_elements); |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
282 local parse = parser.parse; |
|
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
283 |
|
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
284 function session.open_stream(session, from, to) -- luacheck: ignore 432/session |
|
6063
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
285 local send = session.sends2s or session.send; |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
286 |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
287 local attr = { |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
288 ["xmlns:stream"] = "http://etherx.jabber.org/streams", |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
289 ["xml:lang"] = "en", |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
290 xmlns = stream_callbacks.default_ns, |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
291 version = session.version and (session.version > 0 and "1.0" or nil), |
|
11358
ebbf8dca33d2
util.xmppstream: Ensure stream 'id' is always present (fix #1626)
Kim Alvefur <zash@zash.se>
parents:
10093
diff
changeset
|
292 id = session.streamid or "", |
|
6063
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
293 from = from or session.host, to = to, |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
294 }; |
|
6084
3c02a9ed399e
util.xmppstream: Check for callback that may add stream header attributes
Kim Alvefur <zash@zash.se>
parents:
6063
diff
changeset
|
295 if session.stream_attrs then |
|
3c02a9ed399e
util.xmppstream: Check for callback that may add stream header attributes
Kim Alvefur <zash@zash.se>
parents:
6063
diff
changeset
|
296 session:stream_attrs(from, to, attr) |
|
3c02a9ed399e
util.xmppstream: Check for callback that may add stream header attributes
Kim Alvefur <zash@zash.se>
parents:
6063
diff
changeset
|
297 end |
|
11516
83822be7704d
util.xmppstream: Send <?xml?> declaration in same call as stream open
Kim Alvefur <zash@zash.se>
parents:
11358
diff
changeset
|
298 send("<?xml version='1.0'?>"..st.stanza("stream:stream", attr):top_tag()); |
|
6063
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
299 return true; |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
300 end |
|
e626ee2fe106
mod_c2s, mod_s2s, mod_component, util.xmppstream: Move all session:open_stream() functions to util.xmppstream
Kim Alvefur <zash@zash.se>
parents:
6054
diff
changeset
|
301 |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
302 return { |
|
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
303 reset = function () |
|
6053
2f93a04564b2
util.xmppstream: Also disable CharacterData merging after stream restarts
Matthew Wild <mwild1@gmail.com>
parents:
6052
diff
changeset
|
304 parser = new_parser(handlers, ns_separator, false); |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
305 parse = parser.parse; |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
306 n_outstanding_bytes = 0; |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
307 meta.reset(); |
|
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
308 end, |
|
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
309 feed = function (self, data) -- luacheck: ignore 212/self |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
310 if lxp_supports_bytecount then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
311 n_outstanding_bytes = n_outstanding_bytes + #data; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
312 end |
|
9071
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
313 local _parser = parser; |
|
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
314 local ok, err = parse(_parser, data); |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
315 if lxp_supports_bytecount and n_outstanding_bytes > stanza_size_limit then |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
316 return nil, "stanza-too-large"; |
|
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
317 end |
|
9071
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
318 if parser ~= _parser then |
|
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
319 _parser:parse(); |
|
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
320 _parser:close(); |
|
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
321 end |
|
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
322 return ok, err; |
|
3424
9e0df614e5d0
util.xmppstream: Add set_session() method to change the session that a stream is associated with
Matthew Wild <mwild1@gmail.com>
parents:
3032
diff
changeset
|
323 end, |
|
9e0df614e5d0
util.xmppstream: Add set_session() method to change the session that a stream is associated with
Matthew Wild <mwild1@gmail.com>
parents:
3032
diff
changeset
|
324 set_session = meta.set_session; |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
325 set_stanza_size_limit = function (_, new_stanza_size_limit, new_max_elements) |
|
11547
dd21eb632f52
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
Matthew Wild <mwild1@gmail.com>
parents:
11546
diff
changeset
|
326 stanza_size_limit = new_stanza_size_limit; |
|
14153
aa29d5144c20
util.xmppstream: Support limiting total number of descendent elements in a stanza
Matthew Wild <mwild1@gmail.com>
parents:
11560
diff
changeset
|
327 meta.set_max_elements(new_max_elements); |
|
11547
dd21eb632f52
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
Matthew Wild <mwild1@gmail.com>
parents:
11546
diff
changeset
|
328 end; |
|
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
329 }; |
|
2921
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
330 end |
|
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
331 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
332 return { |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
333 ns_separator = ns_separator; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
334 ns_pattern = ns_pattern; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
335 new_sax_handlers = new_sax_handlers; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
336 new = new; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6367
diff
changeset
|
337 }; |
