aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatthew <devnull@localhost>2008-08-24 14:52:02 +0000
committermatthew <devnull@localhost>2008-08-24 14:52:02 +0000
commitdfe21804fe9558ac19d2327d2cf4ed16267bc3fc (patch)
treefa5e1bff817fd4c02459b874eb69f602e4de97ca
parent86ea5e7911605e1ff7bb1366d8357449a9139897 (diff)
downloadprosody-dfe21804fe9558ac19d2327d2cf4ed16267bc3fc.tar.gz
prosody-dfe21804fe9558ac19d2327d2cf4ed16267bc3fc.zip
Presence unavailable on disconnect
-rw-r--r--TODO2
-rw-r--r--core/stanza_dispatch.lua2
-rw-r--r--main.lua11
-rw-r--r--util/stanza.lua15
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 = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
+ 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 = "";