core/stanza_router.lua

branch
s2s
changeset 148
4c0dcd245d34
parent 147
ccebb2720741
child 150
d09b8a1ab046
equal deleted inserted replaced
147:ccebb2720741 148:4c0dcd245d34
24 log("debug", "Received: "..tostring(stanza)) 24 log("debug", "Received: "..tostring(stanza))
25 -- TODO verify validity of stanza (as well as JID validity) 25 -- TODO verify validity of stanza (as well as JID validity)
26 if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then 26 if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
27 if stanza.attr.type == "set" or stanza.attr.type == "get" then 27 if stanza.attr.type == "set" or stanza.attr.type == "get" then
28 error("Invalid IQ"); 28 error("Invalid IQ");
29 elseif #stanza.tags > 1 or not(stanza.attr.type == "error" or stanza.attr.type == "result") then 29 elseif #stanza.tags > 1 and not(stanza.attr.type == "error" or stanza.attr.type == "result") then
30 error("Invalid IQ"); 30 error("Invalid IQ");
31 end 31 end
32 end 32 end
33 33
34 if origin.type == "c2s" and not origin.full_jid 34 if origin.type == "c2s" and not origin.full_jid
47 core_handle_stanza(origin, stanza); 47 core_handle_stanza(origin, stanza);
48 elseif hosts[to] and hosts[to].type == "local" then 48 elseif hosts[to] and hosts[to].type == "local" then
49 core_handle_stanza(origin, stanza); 49 core_handle_stanza(origin, stanza);
50 elseif stanza.name == "iq" and not select(3, jid_split(to)) then 50 elseif stanza.name == "iq" and not select(3, jid_split(to)) then
51 core_handle_stanza(origin, stanza); 51 core_handle_stanza(origin, stanza);
52 elseif origin.type == "c2s" then 52 elseif origin.type == "c2s" or origin.type == "s2sin" then
53 core_route_stanza(origin, stanza); 53 core_route_stanza(origin, stanza);
54 elseif origin.type == "s2sin" then
55 core_deliver_stanza(origin, stanza);
56 end 54 end
57 end 55 end
58 56
59 -- This function handles stanzas which are not routed any further, 57 -- This function handles stanzas which are not routed any further,
60 -- that is, they are handled by this server 58 -- that is, they are handled by this server
96 end 94 end
97 else 95 else
98 log("debug", "Routing stanza to local"); 96 log("debug", "Routing stanza to local");
99 handle_stanza(session, stanza); 97 handle_stanza(session, stanza);
100 end 98 end
101 elseif origin.type == "s2sin_unauthed" then 99 elseif origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
102 if stanza.attr.xmlns == "jabber:server:dialback" then 100 if stanza.attr.xmlns == "jabber:server:dialback" then
103 if stanza.name == "verify" then 101 if stanza.name == "verify" then
104 -- We are being asked to verify the key, to ensure it was generated by us 102 -- We are being asked to verify the key, to ensure it was generated by us
105 log("debug", "verifying dialback key..."); 103 log("debug", "verifying dialback key...");
106 local attr = stanza.attr; 104 local attr = stanza.attr;
111 local type = "invalid"; 109 local type = "invalid";
112 if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then 110 if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then
113 type = "valid" 111 type = "valid"
114 end 112 end
115 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])); 113 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]));
116 elseif stanza.name == "result" then 114 elseif stanza.name == "result" and origin.type == "s2sin_unauthed" then
115 -- he wants to be identified through dialback
117 -- We need to check the key with the Authoritative server 116 -- We need to check the key with the Authoritative server
118 local attr = stanza.attr; 117 local attr = stanza.attr;
119 origin.from_host = attr.from; 118 origin.from_host = attr.from;
120 origin.to_host = attr.to; 119 origin.to_host = attr.to;
121 origin.dialback_key = stanza[1]; 120 origin.dialback_key = stanza[1];
242 else 241 else
243 send(origin, st.error_reply(stanza, "cancel", "service-unavailable")); 242 send(origin, st.error_reply(stanza, "cancel", "service-unavailable"));
244 end 243 end
245 end 244 end
246 end 245 end
246 elseif origin.type == "c2s" then
247 -- Remote host
248 --stanza.attr.xmlns = "jabber:server";
249 stanza.attr.xmlns = nil;
250 log("debug", "sending s2s stanza: %s", tostring(stanza));
251 send_s2s(origin.host, host, stanza);
247 else 252 else
248 -- Remote host 253 log("warn", "received stanza from unhandled connection type: %s", origin.type);
249 log("debug", "sending s2s stanza: %s", tostring(stanza));
250 stanza.attr.xmlns = "jabber:server";
251 send_s2s(origin.host, host, stanza);
252 end 254 end
253 stanza.attr.to = to; -- reset 255 stanza.attr.to = to; -- reset
254 end
255
256 function core_deliver_stanza(origin, stanza)
257 local name, attr = stanza.name, stanza.attr;
258 if name == "message" then
259
260 end
261 end 256 end
262 257
263 function handle_stanza_toremote(stanza) 258 function handle_stanza_toremote(stanza)
264 log("error", "Stanza bound for remote host, but s2s is not implemented"); 259 log("error", "Stanza bound for remote host, but s2s is not implemented");
265 end 260 end

mercurial