core/stanza_router.lua

branch
s2s
changeset 145
fbb3a4ff9cf1
parent 144
ed78c1a0401e
child 146
3826ca244eb6
equal deleted inserted replaced
144:ed78c1a0401e 145:fbb3a4ff9cf1
9 9
10 local st = require "util.stanza"; 10 local st = require "util.stanza";
11 local send = require "core.sessionmanager".send_to_session; 11 local send = require "core.sessionmanager".send_to_session;
12 local send_s2s = require "core.s2smanager".send_to_host; 12 local send_s2s = require "core.s2smanager".send_to_host;
13 local user_exists = require "core.usermanager".user_exists; 13 local user_exists = require "core.usermanager".user_exists;
14
15 local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
16 local format = string.format;
17 local tostring = tostring;
14 18
15 local jid_split = require "util.jid".split; 19 local jid_split = require "util.jid".split;
16 local print = print; 20 local print = print;
17 21
18 function core_process_stanza(origin, stanza) 22 function core_process_stanza(origin, stanza)
31 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then 35 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
32 error("Client MUST bind resource after auth"); 36 error("Client MUST bind resource after auth");
33 end 37 end
34 38
35 local to = stanza.attr.to; 39 local to = stanza.attr.to;
36 stanza.attr.from = origin.full_jid; -- quick fix to prevent impersonation (FIXME this would be incorrect when the origin is not c2s)
37 -- TODO also, stazas should be returned to their original state before the function ends 40 -- TODO also, stazas should be returned to their original state before the function ends
41 if origin.type == "c2s" then
42 stanza.attr.from = origin.full_jid; -- quick fix to prevent impersonation (FIXME this would be incorrect when the origin is not c2s)
43 end
38 44
39 -- TODO presence subscriptions
40 if not to then 45 if not to then
41 core_handle_stanza(origin, stanza); 46 core_handle_stanza(origin, stanza);
42 elseif hosts[to] and hosts[to].type == "local" then 47 elseif hosts[to] and hosts[to].type == "local" then
43 core_handle_stanza(origin, stanza); 48 core_handle_stanza(origin, stanza);
44 elseif stanza.name == "iq" and not select(3, jid_split(to)) then 49 elseif stanza.name == "iq" and not select(3, jid_split(to)) then
88 end 93 end
89 else 94 else
90 log("debug", "Routing stanza to local"); 95 log("debug", "Routing stanza to local");
91 handle_stanza(session, stanza); 96 handle_stanza(session, stanza);
92 end 97 end
98 elseif origin.type == "s2sin_unauthed" then
99 if stanza.name == "verify" and stanza.attr.xmlns == "jabber:server:dialback" then
100 log("debug", "verifying dialback key...");
101 local attr = stanza.attr;
102 print(tostring(attr.to), tostring(attr.from))
103 print(tostring(origin.to_host), tostring(origin.from_host))
104 -- FIXME: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34
105 --if attr.from ~= origin.to_host then error("invalid-from"); end
106 local type = "invalid";
107 if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then
108 type = "valid"
109 end
110 origin.send(format("<db:verify from='%s' to='%s' id='%s' type='%s'>%s</db:verify>", attr.to, attr.from, attr.id, type, stanza[1]));
111 end
112 else
113 log("warn", "Unhandled origin: %s", origin.type);
93 end 114 end
94 end 115 end
95 116
96 -- TODO: Does this function belong here? 117 -- TODO: Does this function belong here?
97 function is_authorized_to_see_presence(origin, username, host) 118 function is_authorized_to_see_presence(origin, username, host)

mercurial