aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2009-05-15 17:33:04 +0200
committerTobias Markmann <tm@ayena.de>2009-05-15 17:33:04 +0200
commit672ffb89624c3af6badb7354a6bcd9c0d7624e48 (patch)
tree74f77ffb11e96241a74cbf9136a424b3fe493cf5
parentb35bf3760e750fa55ea3ad5d4e97c59ba2eda9a1 (diff)
parentd836e5c09de5c45af4c76cc8cc66458bc0c5deec (diff)
downloadprosody-672ffb89624c3af6badb7354a6bcd9c0d7624e48.tar.gz
prosody-672ffb89624c3af6badb7354a6bcd9c0d7624e48.zip
Merging SASL buggy client workaround with current tip.
-rw-r--r--core/stanza_router.lua12
-rw-r--r--core/xmlhandlers.lua47
-rw-r--r--plugins/mod_presence.lua3
-rw-r--r--util/events.lua6
-rw-r--r--util/stanza.lua3
5 files changed, 27 insertions, 44 deletions
diff --git a/core/stanza_router.lua b/core/stanza_router.lua
index eb5bf410..8f3d2d1f 100644
--- a/core/stanza_router.lua
+++ b/core/stanza_router.lua
@@ -54,7 +54,7 @@ function core_process_stanza(origin, stanza)
if not stanza.attr.xmlns then stanza.attr.xmlns = "jabber:client"; end -- FIXME Hack. This should be removed when we fix namespace handling.
-- TODO verify validity of stanza (as well as JID validity)
- if stanza.attr.xmlns == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log
+ if stanza.attr.type == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log
if stanza.name == "iq" then
if (stanza.attr.type == "set" or stanza.attr.type == "get") and #stanza.tags ~= 1 then
origin.send(st.error_reply(stanza, "modify", "bad-request"));
@@ -106,10 +106,9 @@ function core_process_stanza(origin, stanza)
return; -- FIXME what should we do here?
end]] -- FIXME
- -- FIXME do stanzas not of jabber:client get handled by components?
if (origin.type == "s2sin" or origin.type == "c2s" or origin.type == "component") and (not xmlns or xmlns == "jabber:server" or xmlns == "jabber:client") then
local event_data = {origin=origin, stanza=stanza};
- fire_event(tostring(host or origin.host).."/"..stanza.name, event_data);
+ if fire_event(tostring(host or origin.host).."/"..stanza.name, event_data) then return; end
if origin.type == "s2sin" and not origin.dummy then
local host_status = origin.hosts[from_host];
if not host_status or not host_status.authed then -- remote server trying to impersonate some other server?
@@ -117,11 +116,6 @@ function core_process_stanza(origin, stanza)
return; -- FIXME what should we do here? does this work with subdomains?
end
end
- if origin.type == "c2s" and stanza.name == "presence" and to ~= nil and not(origin.roster[to_bare] and (origin.roster[to_bare].subscription == "both" or origin.roster[to_bare].subscription == "from")) then -- directed presence
- origin.directed = origin.directed or {};
- origin.directed[to] = true;
- --t_insert(origin.directed, to); -- FIXME does it make more sense to add to_bare rather than to?
- end
if not to then
core_handle_stanza(origin, stanza);
elseif hosts[to] and hosts[to].type == "local" then -- directed at a local server
@@ -134,8 +128,6 @@ function core_process_stanza(origin, stanza)
component_handle_stanza(origin, stanza);
elseif hosts[host] and hosts[host].type == "component" then -- directed at a component
component_handle_stanza(origin, stanza);
- elseif origin.type == "c2s" and stanza.name == "presence" and stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" and stanza.attr.type ~= "error" then
- handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza);
elseif hosts[host] and hosts[host].type == "local" and stanza.name == "iq" and not resource then -- directed at bare JID
core_handle_stanza(origin, stanza);
else
diff --git a/core/xmlhandlers.lua b/core/xmlhandlers.lua
index 7e09921c..573a9604 100644
--- a/core/xmlhandlers.lua
+++ b/core/xmlhandlers.lua
@@ -14,15 +14,8 @@ local st = stanza;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
-local type = type;
-local print = print;
-local format = string.format;
-local m_random = math.random;
local t_insert = table.insert;
-local t_remove = table.remove;
local t_concat = table.concat;
-local t_concatall = function (t, sep) local tt = {}; for _, s in ipairs(t) do t_insert(tt, tostring(s)); end return t_concat(tt, sep); end
-local sm_destroy_session = import("core.sessionmanager", "destroy_session");
local default_log = require "util.logger".init("xmlhandlers");
@@ -68,15 +61,13 @@ function init_xmlhandlers(session, stream_callbacks)
-- FIXME !!!!!
for i, k in ipairs(attr) do
- if type(k) == "string" then
- local ns, nm = k:match("^([^|]+)|?([^|]-)$")
- if ns and nm then
- ns = ns_prefixes[ns];
- if ns then
- attr[ns..":"..nm] = attr[k];
- attr[i] = ns..":"..nm;
- attr[k] = nil;
- end
+ local ns, nm = k:match("^([^|]+)|?([^|]-)$")
+ if ns and nm then
+ ns = ns_prefixes[ns];
+ if ns then
+ attr[ns..":"..nm] = attr[k];
+ attr[i] = ns..":"..nm;
+ attr[k] = nil;
end
end
end
@@ -129,19 +120,17 @@ function init_xmlhandlers(session, stream_callbacks)
cb_error(session, "parse-error", "unexpected-element-close", name);
end
end
- if stanza then
- if #chardata > 0 then
- -- We have some character data in the buffer
- stanza:text(t_concat(chardata));
- chardata = {};
- end
- -- Complete stanza
- if #stanza.last_add == 0 then
- cb_handlestanza(session, stanza);
- stanza = nil;
- else
- stanza:up();
- end
+ if #chardata > 0 then
+ -- We have some character data in the buffer
+ stanza:text(t_concat(chardata));
+ chardata = {};
+ end
+ -- Complete stanza
+ if #stanza.last_add == 0 then
+ cb_handlestanza(session, stanza);
+ stanza = nil;
+ else
+ stanza:up();
end
end
return xml_handlers;
diff --git a/plugins/mod_presence.lua b/plugins/mod_presence.lua
index 2fb976b5..7c34eefa 100644
--- a/plugins/mod_presence.lua
+++ b/plugins/mod_presence.lua
@@ -252,7 +252,7 @@ local function presence_handler(data)
if origin.type == "c2s" then
if to ~= nil and not(origin.roster[to_bare] and (origin.roster[to_bare].subscription == "both" or origin.roster[to_bare].subscription == "from")) then -- directed presence
origin.directed = origin.directed or {};
- origin.directed[to] = true;
+ origin.directed[to] = true; -- FIXME does it make more sense to add to_bare rather than to?
end
if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" and stanza.attr.type ~= "error" then
handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza);
@@ -268,6 +268,7 @@ local function presence_handler(data)
core_route_stanza(origin, stanza);
end
end
+ return true;
end
local add_handler = require "core.eventmanager2".add_handler;
diff --git a/util/events.lua b/util/events.lua
index b1f3811c..704d31a4 100644
--- a/util/events.lua
+++ b/util/events.lua
@@ -53,7 +53,8 @@ function new()
if not h then h = {}; handlers[event] = h; end
local dispatcher = function(data)
for _, handler in ipairs(h) do
- handler(data);
+ local ret = handler(data);
+ if ret ~= nil then return ret; end
end
end;
dispatchers[event] = dispatcher;
@@ -66,7 +67,8 @@ function new()
local h = handlers[event];
if h then
for _, handler in ipairs(h) do
- handler(data);
+ local ret = handler(data);
+ if ret ~= nil then return ret; end
end
end
end;
diff --git a/util/stanza.lua b/util/stanza.lua
index 7e40dfa4..526bb2f0 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -258,10 +258,9 @@ function reply(orig)
return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or orig.attr.type) });
end
-function error_reply(orig, type, condition, message, clone)
+function error_reply(orig, type, condition, message)
local t = reply(orig);
t.attr.type = "error";
- -- TODO use clone
t:tag("error", {type = type})
:tag(condition, {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up();
if (message) then t:tag("text"):text(message):up(); end