X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fxmppstream.lua;h=3d97acef1c87fde71187170435f8a3ac2c779707;hb=2b120230b5ec5bcd129344ae908e73b89867d600;hp=6982aae30732abac9a8b17afcb5d56892700e7e4;hpb=2812d8d444f3408276eba8108b2535a5446e82b3;p=prosody.git diff --git a/util/xmppstream.lua b/util/xmppstream.lua index 6982aae3..3d97acef 100644 --- a/util/xmppstream.lua +++ b/util/xmppstream.lua @@ -24,7 +24,7 @@ local lxp_supports_bytecount = not not lxp.new({}).getcurrentbytecount; local default_stanza_size_limit = 1024*1024*10; -- 10MB -module "xmppstream" +local _ENV = nil; local new_parser = lxp.new; @@ -40,12 +40,9 @@ local xmlns_streams = "http://etherx.jabber.org/streams"; local ns_separator = "\1"; local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; -_M.ns_separator = ns_separator; -_M.ns_pattern = ns_pattern; - local function dummy_cb() end -function new_sax_handlers(session, stream_callbacks, cb_handleprogress) +local function new_sax_handlers(session, stream_callbacks, cb_handleprogress) local xml_handlers = {}; local cb_streamopened = stream_callbacks.streamopened; @@ -109,7 +106,7 @@ function new_sax_handlers(session, stream_callbacks, cb_handleprogress) end else -- Garbage before stream? - cb_error(session, "no-stream"); + cb_error(session, "no-stream", tagname); end return; end @@ -199,6 +196,29 @@ function new_sax_handlers(session, stream_callbacks, cb_handleprogress) end end + if stream_callbacks.track_namespaces then + local namespaces = {} + function xml_handlers:StartNamespaceDecl(prefix, url) + if prefix ~= nil then + namespaces[prefix] = url + end + end + function xml_handlers:EndNamespaceDecl(prefix) + if prefix ~= nil then + namespaces[prefix] = nil + end + end + local old_startelement = xml_handlers.StartElement + function xml_handlers:StartElement(tagname, attr) + old_startelement(self, tagname, attr) + local n = {} + for prefix, url in pairs(namespaces) do + n[prefix] = url + end + stanza.namespaces = n + end + end + local function restricted_handler(parser) cb_error(session, "parse-error", "restricted-xml", "Restricted XML, see RFC 6120 section 11.1."); if not parser.stop or not parser:stop() then @@ -224,7 +244,7 @@ function new_sax_handlers(session, stream_callbacks, cb_handleprogress) return xml_handlers, { reset = reset, set_session = set_session }; end -function new(session, stream_callbacks, stanza_size_limit) +local function new(session, stream_callbacks, stanza_size_limit) -- Used to track parser progress (e.g. to enforce size limits) local n_outstanding_bytes = 0; local handle_progress; @@ -249,7 +269,7 @@ function new(session, stream_callbacks, stanza_size_limit) ["xml:lang"] = "en", xmlns = stream_callbacks.default_ns, version = session.version and (session.version > 0 and "1.0" or nil), - id = session.streamid or "", + id = session.streamid, from = from or session.host, to = to, }; if session.stream_attrs then @@ -281,4 +301,9 @@ function new(session, stream_callbacks, stanza_size_limit) }; end -return _M; +return { + ns_separator = ns_separator; + ns_pattern = ns_pattern; + new_sax_handlers = new_sax_handlers; + new = new; +};