Software /
code /
prosody
Annotate
util/xmppstream.lua @ 11547:dd21eb632f52 0.11
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
This may be useful for any plugins that want to experiment with different policies
for stanza size limits (e.g. unauthenticated vs authenticated streams).
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 10 May 2021 17:03:27 +0100 |
parent | 11546:b21d8c286973 |
child | 11560:3bbb1af92514 |
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"; |
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
10 local st = require "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 |
11543
63fd4c8465fb
util.xmppstream: Reduce default xmppstream limit to 1MB
Matthew Wild <mwild1@gmail.com>
parents:
9071
diff
changeset
|
25 local default_stanza_size_limit = 1024*1024*1; -- 1MB |
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 |
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
|
46 local function new_sax_handlers(session, stream_callbacks, cb_handleprogress) |
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 |
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
67 local stack = {}; |
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
68 local chardata, stanza = {}; |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
69 local stanza_size = 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
|
70 local non_streamns_depth = 0; |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
71 function xml_handlers:StartElement(tagname, attr) |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
72 if stanza and #chardata > 0 then |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
73 -- 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
|
74 t_insert(stanza, t_concat(chardata)); |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
75 chardata = {}; |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
76 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
77 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
|
78 if name == "" then |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
79 curr_ns, name = "", curr_ns; |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
80 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
81 |
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
|
82 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
|
83 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
|
84 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
|
85 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
86 |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
87 for i=1,#attr do |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
88 local k = attr[i]; |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
89 attr[i] = nil; |
4484
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
90 local xmlk = xml_namespace[k]; |
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
91 if xmlk then |
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
92 attr[xmlk] = attr[k]; |
0da4e0f0f0ef
util.xmppstream: Optimize attribute processing.
Waqas Hussain <waqas20@gmail.com>
parents:
4483
diff
changeset
|
93 attr[k] = nil; |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
94 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
95 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
96 |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
97 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
|
98 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
99 stanza_size = self:getcurrentbytecount(); |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
100 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
101 if session.notopen then |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
102 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
|
103 non_streamns_depth = 0; |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
104 if cb_streamopened then |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
105 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
106 cb_handleprogress(stanza_size); |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
107 stanza_size = 0; |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
108 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
109 cb_streamopened(session, attr); |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
110 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
111 else |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
112 -- 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
|
113 cb_error(session, "no-stream", tagname); |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
114 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
115 return; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
116 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
117 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
|
118 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
|
119 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
120 |
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
121 stanza = setmetatable({ name = name, attr = attr, tags = {} }, stanza_mt); |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
122 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
|
123 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
124 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
|
125 end |
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
126 t_insert(stack, stanza); |
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
127 local oldstanza = stanza; |
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
128 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
|
129 t_insert(oldstanza, stanza); |
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
130 t_insert(oldstanza.tags, stanza); |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
131 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
132 end |
9020
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
133 |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
134 function xml_handlers:StartCdataSection() |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
135 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
136 if stanza then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
137 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
|
138 else |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
139 cb_handleprogress(self:getcurrentbytecount()); |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
140 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
141 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
142 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
143 function xml_handlers:EndCdataSection() |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
144 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
145 if stanza then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
146 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
|
147 else |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
148 cb_handleprogress(self:getcurrentbytecount()); |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
149 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
150 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
151 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
152 function xml_handlers:CharacterData(data) |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
153 if stanza then |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
154 if lxp_supports_bytecount then |
6052
ce3244c084f9
util.xmppstream: Disable LuaExpat's buffering (if possible)
Matthew Wild <mwild1@gmail.com>
parents:
6042
diff
changeset
|
155 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
|
156 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
157 t_insert(chardata, data); |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
158 elseif lxp_supports_bytecount then |
6052
ce3244c084f9
util.xmppstream: Disable LuaExpat's buffering (if possible)
Matthew Wild <mwild1@gmail.com>
parents:
6042
diff
changeset
|
159 cb_handleprogress(self:getcurrentbytecount()); |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
160 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
161 end |
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
162 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
|
163 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 end |
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
169 if stanza then |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
170 if #chardata > 0 then |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
171 -- 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
|
172 t_insert(stanza, t_concat(chardata)); |
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
173 chardata = {}; |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
174 end |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
175 -- Complete stanza |
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
176 if #stack == 0 then |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
177 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
178 cb_handleprogress(stanza_size); |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
179 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
180 stanza_size = 0; |
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
181 if tagname ~= stream_error_tag then |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
182 cb_handlestanza(session, stanza); |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
183 else |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
184 cb_error(session, "stream-error", stanza); |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
185 end |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
186 stanza = nil; |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
187 else |
3987
8fbf57722368
util.xmppstream: Optimized stanza building by bypassing the stanza API.
Waqas Hussain <waqas20@gmail.com>
parents:
3927
diff
changeset
|
188 stanza = t_remove(stack); |
2493
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
189 end |
ec09d16a51e1
xmlhandlers: Rearranged a little code.
Waqas Hussain <waqas20@gmail.com>
parents:
2492
diff
changeset
|
190 else |
11546
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
191 if lxp_supports_bytecount then |
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
192 cb_handleprogress(stanza_size); |
b21d8c286973
util.xmppstream: Mark bytes for stream closure as handled
Matthew Wild <mwild1@gmail.com>
parents:
11543
diff
changeset
|
193 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
|
194 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
|
195 cb_streamclosed(session); |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
196 end |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
197 end |
2492
b5e2d1919ec3
xmlhandlers: Fixed indentation and added some semicolons.
Waqas Hussain <waqas20@gmail.com>
parents:
2468
diff
changeset
|
198 end |
4277 | 199 |
4288 | 200 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
|
201 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
|
202 if not parser.stop or not parser:stop() then |
4288 | 203 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
|
204 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
|
205 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
206 |
9020
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
207 if lxp_supports_xmldecl then |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
208 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
|
209 if lxp_supports_bytecount then |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
210 cb_handleprogress(self:getcurrentbytecount()); |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
211 end |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
212 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
|
213 or (standalone == "no") |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
214 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
|
215 return restricted_handler(self); |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
216 end |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
217 end |
19e51d8f8947
util.xmppstream: Perfom validation of XML declaration parameters
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 xml_handlers.ProcessingInstruction = restricted_handler; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
224 |
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
225 local function reset() |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
226 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
|
227 stack = {}; |
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
228 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
229 |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
230 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
|
231 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
|
232 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5311
diff
changeset
|
233 |
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
|
234 return xml_handlers, { reset = reset, set_session = set_session }; |
1
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
235 end |
b8787e859fd2
Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff
changeset
|
236 |
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
|
237 local function new(session, stream_callbacks, stanza_size_limit) |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
238 -- 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
|
239 local n_outstanding_bytes = 0; |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
240 local handle_progress; |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
241 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
242 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
|
243 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
|
244 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
245 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
|
246 elseif stanza_size_limit then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
247 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
|
248 end |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
249 |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
250 local handlers, meta = new_sax_handlers(session, stream_callbacks, handle_progress); |
6052
ce3244c084f9
util.xmppstream: Disable LuaExpat's buffering (if possible)
Matthew Wild <mwild1@gmail.com>
parents:
6042
diff
changeset
|
251 local 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
|
252 local parse = parser.parse; |
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
253 |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
254 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
|
255 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
|
256 |
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
|
257 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
|
258 ["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
|
259 ["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
|
260 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
|
261 version = session.version and (session.version > 0 and "1.0" or nil), |
6355
c2d144d3f8dd
util.xmppstream: Don't include empty stream ID in stream header (got here from mod_c2s)
Kim Alvefur <zash@zash.se>
parents:
6084
diff
changeset
|
262 id = session.streamid, |
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
|
263 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
|
264 }; |
6084
3c02a9ed399e
util.xmppstream: Check for callback that may add stream header attributes
Kim Alvefur <zash@zash.se>
parents:
6063
diff
changeset
|
265 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
|
266 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
|
267 end |
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
|
268 send("<?xml version='1.0'?>"); |
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
|
269 send(st.stanza("stream:stream", attr):top_tag()); |
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
|
270 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
|
271 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
|
272 |
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
273 return { |
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
274 reset = function () |
6053
2f93a04564b2
util.xmppstream: Also disable CharacterData merging after stream restarts
Matthew Wild <mwild1@gmail.com>
parents:
6052
diff
changeset
|
275 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
|
276 parse = parser.parse; |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
277 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
|
278 meta.reset(); |
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
279 end, |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7240
diff
changeset
|
280 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
|
281 if lxp_supports_bytecount then |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
282 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
|
283 end |
9071
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
284 local _parser = parser; |
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
285 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
|
286 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
|
287 return nil, "stanza-too-large"; |
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
288 end |
9071
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
289 if parser ~= _parser then |
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
290 _parser:parse(); |
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
291 _parser:close(); |
db61e33bbd41
util.xmppstream: Explicitly release old parser object on stream reset
Matthew Wild <mwild1@gmail.com>
parents:
9020
diff
changeset
|
292 end |
6042
1107d66d2ab2
util.xmppstream: Implement stanza size limiting, default limit 10MB
Matthew Wild <mwild1@gmail.com>
parents:
5311
diff
changeset
|
293 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
|
294 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
|
295 set_session = meta.set_session; |
11547
dd21eb632f52
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
Matthew Wild <mwild1@gmail.com>
parents:
11546
diff
changeset
|
296 set_stanza_size_limit = function (_, new_stanza_size_limit) |
dd21eb632f52
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
Matthew Wild <mwild1@gmail.com>
parents:
11546
diff
changeset
|
297 stanza_size_limit = new_stanza_size_limit; |
dd21eb632f52
util.xmppstream: Allow dynamically configuring the stanza size limit for a stream
Matthew Wild <mwild1@gmail.com>
parents:
11546
diff
changeset
|
298 end; |
3032
38459cffaf67
util.xmppstream: Stream objects now just have feed/reset methods
Matthew Wild <mwild1@gmail.com>
parents:
2926
diff
changeset
|
299 }; |
2921
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
300 end |
f0ddfd7739ea
util.xmppstream: new() now returns a parser object
Matthew Wild <mwild1@gmail.com>
parents:
2920
diff
changeset
|
301 |
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
|
302 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
|
303 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
|
304 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
|
305 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
|
306 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
|
307 }; |