From dfe21804fe9558ac19d2327d2cf4ed16267bc3fc Mon Sep 17 00:00:00 2001 From: matthew Date: Sun, 24 Aug 2008 14:52:02 +0000 Subject: Presence unavailable on disconnect --- TODO | 2 ++ core/stanza_dispatch.lua | 2 +- main.lua | 11 +++++++++-- util/stanza.lua | 15 +++++++++++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/TODO b/TODO index 82d39c0f..ed349dad 100644 --- a/TODO +++ b/TODO @@ -4,3 +4,5 @@ Further down the line: - Clustering +- Pubsub/PEP +- Plugins! diff --git a/core/stanza_dispatch.lua b/core/stanza_dispatch.lua index 5f61f5fb..2c835517 100644 --- a/core/stanza_dispatch.lua +++ b/core/stanza_dispatch.lua @@ -106,7 +106,7 @@ function init_stanza_dispatcher(session) --local probe = st.presence { from = broadcast.attr.from, type = "probe" }; for child in stanza:childtags() do - broadcast:text(tostring(child)); + broadcast:add_child(child); end for contact_jid in pairs(session.roster) do broadcast.attr.to = contact_jid; diff --git a/main.lua b/main.lua index 0df6bbd1..7a423f47 100644 --- a/main.lua +++ b/main.lua @@ -132,6 +132,12 @@ function handler(conn, data, err) session.parser = lxp.new(session.xml_handlers, ":"); function session.disconnect(err) + if session.last_presence.attr.type ~= "unavailable" then + local pres = st.presence{ type = "unavailable" }; + if err == "closed" then err = "connection closed"; end + pres:tag("status"):text("Disconnected: "..err); + session.stanza_dispatch(pres); + end hosts[session.host].sessions[session.username] = nil; session = nil; print("Disconnected: "..err); @@ -154,8 +160,9 @@ setmetatable(_G, { __index = function (t, k) print("WARNING: ATTEMPT TO READ A N local protected_handler = function (...) local success, ret = pcall(handler, ...); if not success then print("ERROR on "..tostring((select(1, ...)))..": "..ret); end end; +local protected_disconnect = function (...) local success, ret = pcall(disconnect, ...); if not success then print("ERROR on "..tostring((select(1, ...))).." disconnect: "..ret); end end; -print( server.add( { listener = protected_handler, disconnect = disconnect }, 5222, "*", 1, nil ) ) -- server.add will send a status message -print( server.add( { listener = protected_handler, disconnect = disconnect }, 5223, "*", 1, ssl_ctx ) ) -- server.add will send a status message +print( server.add( { listener = protected_handler, disconnect = protected_disconnect }, 5222, "*", 1, nil ) ) -- server.add will send a status message +print( server.add( { listener = protected_handler, disconnect = protected_disconnect }, 5223, "*", 1, ssl_ctx ) ) -- server.add will send a status message server.loop(); diff --git a/util/stanza.lua b/util/stanza.lua index b4deda39..35277e9c 100644 --- a/util/stanza.lua +++ b/util/stanza.lua @@ -6,7 +6,7 @@ local setmetatable = setmetatable; local pairs = pairs; local ipairs = ipairs; local type = type; - +local s_gsub = string.gsub; module "stanza" stanza_mt = {}; @@ -78,10 +78,21 @@ function stanza_mt:childtags() end +do + local xml_entities = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; + function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end +end + +local xml_escape = xml_escape; + function stanza_mt.__tostring(t) local children_text = ""; for n, child in ipairs(t) do - children_text = children_text .. tostring(child); + if type(child) == "string" then + children_text = children_text .. xml_escape(child); + else + children_text = children_text .. tostring(child); + end end local attr_string = ""; -- cgit v1.2.3