Merge 0.9->0.10
[prosody.git] / core / stanza_router.lua
index cea38166117effb8885213d7ac903f7f7a83fede..c78a657af48051591165100f07f9cbe696f93f9d 100644 (file)
@@ -1,7 +1,7 @@
 -- Prosody IM
 -- Copyright (C) 2008-2010 Matthew Wild
 -- Copyright (C) 2008-2010 Waqas Hussain
--- 
+--
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 --
@@ -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,9 +121,10 @@ 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?
-                       elseif not hosts[to_host] then
-                               log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, to_host);
+                               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
@@ -183,7 +196,7 @@ function core_route_stanza(origin, stanza)
        -- Auto-detect origin if not specified
        origin = origin or hosts[from_host];
        if not origin then return false; end
-       
+
        if hosts[host] then
                -- old stanza routing code removed
                core_post_stanza(origin, stanza);
@@ -198,8 +211,13 @@ function core_route_stanza(origin, stanza)
                        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 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;