Software / code / prosody
Comparison
util/xmppstream.lua @ 6054:7a5ddbaf758d
Merge 0.9->0.10
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 02 Apr 2014 17:41:38 +0100 |
| parent | 6053:2f93a04564b2 |
| parent | 5776:bd0ff8ae98a8 |
| child | 6063:e626ee2fe106 |
comparison
equal
deleted
inserted
replaced
| 6053:2f93a04564b2 | 6054:7a5ddbaf758d |
|---|---|
| 1 -- Prosody IM | 1 -- Prosody IM |
| 2 -- Copyright (C) 2008-2010 Matthew Wild | 2 -- Copyright (C) 2008-2010 Matthew Wild |
| 3 -- Copyright (C) 2008-2010 Waqas Hussain | 3 -- Copyright (C) 2008-2010 Waqas Hussain |
| 4 -- | 4 -- |
| 5 -- This project is MIT/X11 licensed. Please see the | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 local lxp = require "lxp"; | 9 local lxp = require "lxp"; |
| 45 | 45 |
| 46 local function dummy_cb() end | 46 local function dummy_cb() end |
| 47 | 47 |
| 48 function new_sax_handlers(session, stream_callbacks, cb_handleprogress) | 48 function new_sax_handlers(session, stream_callbacks, cb_handleprogress) |
| 49 local xml_handlers = {}; | 49 local xml_handlers = {}; |
| 50 | 50 |
| 51 local cb_streamopened = stream_callbacks.streamopened; | 51 local cb_streamopened = stream_callbacks.streamopened; |
| 52 local cb_streamclosed = stream_callbacks.streamclosed; | 52 local cb_streamclosed = stream_callbacks.streamclosed; |
| 53 local cb_error = stream_callbacks.error or function(session, e, stanza) error("XML stream error: "..tostring(e)..(stanza and ": "..tostring(stanza) or ""),2); end; | 53 local cb_error = stream_callbacks.error or function(session, e, stanza) error("XML stream error: "..tostring(e)..(stanza and ": "..tostring(stanza) or ""),2); end; |
| 54 local cb_handlestanza = stream_callbacks.handlestanza; | 54 local cb_handlestanza = stream_callbacks.handlestanza; |
| 55 cb_handleprogress = cb_handleprogress or dummy_cb; | 55 cb_handleprogress = cb_handleprogress or dummy_cb; |
| 56 | 56 |
| 57 local stream_ns = stream_callbacks.stream_ns or xmlns_streams; | 57 local stream_ns = stream_callbacks.stream_ns or xmlns_streams; |
| 58 local stream_tag = stream_callbacks.stream_tag or "stream"; | 58 local stream_tag = stream_callbacks.stream_tag or "stream"; |
| 59 if stream_ns ~= "" then | 59 if stream_ns ~= "" then |
| 60 stream_tag = stream_ns..ns_separator..stream_tag; | 60 stream_tag = stream_ns..ns_separator..stream_tag; |
| 61 end | 61 end |
| 62 local stream_error_tag = stream_ns..ns_separator..(stream_callbacks.error_tag or "error"); | 62 local stream_error_tag = stream_ns..ns_separator..(stream_callbacks.error_tag or "error"); |
| 63 | 63 |
| 64 local stream_default_ns = stream_callbacks.default_ns; | 64 local stream_default_ns = stream_callbacks.default_ns; |
| 65 | 65 |
| 66 local stack = {}; | 66 local stack = {}; |
| 67 local chardata, stanza = {}; | 67 local chardata, stanza = {}; |
| 68 local stanza_size = 0; | 68 local stanza_size = 0; |
| 69 local non_streamns_depth = 0; | 69 local non_streamns_depth = 0; |
| 70 function xml_handlers:StartElement(tagname, attr) | 70 function xml_handlers:StartElement(tagname, attr) |
| 80 | 80 |
| 81 if curr_ns ~= stream_default_ns or non_streamns_depth > 0 then | 81 if curr_ns ~= stream_default_ns or non_streamns_depth > 0 then |
| 82 attr.xmlns = curr_ns; | 82 attr.xmlns = curr_ns; |
| 83 non_streamns_depth = non_streamns_depth + 1; | 83 non_streamns_depth = non_streamns_depth + 1; |
| 84 end | 84 end |
| 85 | 85 |
| 86 for i=1,#attr do | 86 for i=1,#attr do |
| 87 local k = attr[i]; | 87 local k = attr[i]; |
| 88 attr[i] = nil; | 88 attr[i] = nil; |
| 89 local xmlk = xml_namespace[k]; | 89 local xmlk = xml_namespace[k]; |
| 90 if xmlk then | 90 if xmlk then |
| 91 attr[xmlk] = attr[k]; | 91 attr[xmlk] = attr[k]; |
| 92 attr[k] = nil; | 92 attr[k] = nil; |
| 93 end | 93 end |
| 94 end | 94 end |
| 95 | 95 |
| 96 if not stanza then --if we are not currently inside a stanza | 96 if not stanza then --if we are not currently inside a stanza |
| 97 if lxp_supports_bytecount then | 97 if lxp_supports_bytecount then |
| 98 stanza_size = self:getcurrentbytecount(); | 98 stanza_size = self:getcurrentbytecount(); |
| 99 end | 99 end |
| 100 if session.notopen then | 100 if session.notopen then |
| 114 return; | 114 return; |
| 115 end | 115 end |
| 116 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then | 116 if curr_ns == "jabber:client" and name ~= "iq" and name ~= "presence" and name ~= "message" then |
| 117 cb_error(session, "invalid-top-level-element"); | 117 cb_error(session, "invalid-top-level-element"); |
| 118 end | 118 end |
| 119 | 119 |
| 120 stanza = setmetatable({ name = name, attr = attr, tags = {} }, stanza_mt); | 120 stanza = setmetatable({ name = name, attr = attr, tags = {} }, stanza_mt); |
| 121 else -- we are inside a stanza, so add a tag | 121 else -- we are inside a stanza, so add a tag |
| 122 if lxp_supports_bytecount then | 122 if lxp_supports_bytecount then |
| 123 stanza_size = stanza_size + self:getcurrentbytecount(); | 123 stanza_size = stanza_size + self:getcurrentbytecount(); |
| 124 end | 124 end |
| 203 cb_error(session, "parse-error", "restricted-xml", "Restricted XML, see RFC 6120 section 11.1."); | 203 cb_error(session, "parse-error", "restricted-xml", "Restricted XML, see RFC 6120 section 11.1."); |
| 204 if not parser.stop or not parser:stop() then | 204 if not parser.stop or not parser:stop() then |
| 205 error("Failed to abort parsing"); | 205 error("Failed to abort parsing"); |
| 206 end | 206 end |
| 207 end | 207 end |
| 208 | 208 |
| 209 if lxp_supports_doctype then | 209 if lxp_supports_doctype then |
| 210 xml_handlers.StartDoctypeDecl = restricted_handler; | 210 xml_handlers.StartDoctypeDecl = restricted_handler; |
| 211 end | 211 end |
| 212 xml_handlers.Comment = restricted_handler; | 212 xml_handlers.Comment = restricted_handler; |
| 213 xml_handlers.ProcessingInstruction = restricted_handler; | 213 xml_handlers.ProcessingInstruction = restricted_handler; |
| 214 | 214 |
| 215 local function reset() | 215 local function reset() |
| 216 stanza, chardata, stanza_size = nil, {}, 0; | 216 stanza, chardata, stanza_size = nil, {}, 0; |
| 217 stack = {}; | 217 stack = {}; |
| 218 end | 218 end |
| 219 | 219 |
| 220 local function set_session(stream, new_session) | 220 local function set_session(stream, new_session) |
| 221 session = new_session; | 221 session = new_session; |
| 222 end | 222 end |
| 223 | 223 |
| 224 return xml_handlers, { reset = reset, set_session = set_session }; | 224 return xml_handlers, { reset = reset, set_session = set_session }; |
| 225 end | 225 end |
| 226 | 226 |
| 227 function new(session, stream_callbacks, stanza_size_limit) | 227 function new(session, stream_callbacks, stanza_size_limit) |
| 228 -- Used to track parser progress (e.g. to enforce size limits) | 228 -- Used to track parser progress (e.g. to enforce size limits) |