moduleapi: in module:provides(), add the name of the module in item._provided_by
[prosody.git] / core / stanza_router.lua
index 54c5a1a6a8122db45cb96e6cfddbade83c980ec3..94753678b918facec4d70a5ec14822c4effc4225 100644 (file)
@@ -17,6 +17,18 @@ local jid_prepped_split = require "util.jid".prepped_split;
 local full_sessions = _G.prosody.full_sessions;
 local bare_sessions = _G.prosody.bare_sessions;
 
+local core_post_stanza, core_process_stanza, core_route_stanza;
+
+function deprecated_warning(f)
+       _G[f] = function(...)
+               log("warn", "Using the global %s() is deprecated, use module:send() or prosody.%s(). %s", f, f, debug.traceback());
+               return prosody[f](...);
+       end
+end
+deprecated_warning"core_post_stanza";
+deprecated_warning"core_process_stanza";
+deprecated_warning"core_route_stanza";
+
 local function handle_unhandled_stanza(host, origin, stanza)
        local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns or "jabber:client", origin.type;
        if name == "iq" and xmlns == "jabber:client" then
@@ -28,13 +40,13 @@ local function handle_unhandled_stanza(host, origin, stanza)
                        return true;
                end
        end
-       if stanza.attr.xmlns == nil then
+       if stanza.attr.xmlns == nil and origin.send then
                log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin.type, stanza.name, xmlns); -- we didn't handle it
                if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then
                        origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
                end
        elseif not((name == "features" or name == "error") and xmlns == "http://etherx.jabber.org/streams") then -- FIXME remove check once we handle S2S features
-               log("warn", "Unhandled %s stream element: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
+               log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
                origin:close("unsupported-stanza-type");
        end
 end
@@ -109,7 +121,12 @@ function core_process_stanza(origin, stanza)
                        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?
                                log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host);
-                               return; -- FIXME what should we do here? does this work with subdomains?
+                               origin:close("not-authorized");
+                               return;
+                       elseif not hosts[host] then
+                               log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, host);
+                               origin:close("host-unknown");
+                               return;
                        end
                end
                core_post_stanza(origin, stanza, origin.full_jid);
@@ -185,16 +202,22 @@ function core_route_stanza(origin, stanza)
                core_post_stanza(origin, stanza);
        else
                log("debug", "Routing to remote...");
-               if not hosts[from_host] then
+               local host_session = hosts[from_host];
+               if not host_session then
                        log("error", "No hosts[from_host] (please report): %s", tostring(stanza));
                else
                        local xmlns = stanza.attr.xmlns;
                        stanza.attr.xmlns = nil;
-                       local routed = prosody.events.fire_event("route/remote", { origin = origin, stanza = stanza, from_host = from_host, to_host = host }); --FIXME: Should be per-host (shared modules!)
+                       local routed = host_session.events.fire_event("route/remote", { origin = origin, stanza = stanza, from_host = from_host, to_host = host });
                        stanza.attr.xmlns = xmlns; -- reset
-                       if routed == nil then
-                               core_route_stanza(hosts[from_host], st.error_reply(stanza, "cancel", "not-allowed", "Communication with remote domains is not enabled"));
+                       if not routed then
+                               log("debug", "... no, just kidding.");
+                               if stanza.attr.type == "error" or (stanza.name == "iq" and stanza.attr.type == "result") then return; end
+                               core_route_stanza(host_session, st.error_reply(stanza, "cancel", "not-allowed", "Communication with remote domains is not enabled"));
                        end
                end
        end
 end
+prosody.core_process_stanza = core_process_stanza;
+prosody.core_post_stanza = core_post_stanza;
+prosody.core_route_stanza = core_route_stanza;