Software / code / prosody
Comparison
core/stanza_router.lua @ 150:d09b8a1ab046
Merging more s2s
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 24 Oct 2008 07:36:48 +0100 |
| parent | 149:40e443eacbbd |
| parent | 148:4c0dcd245d34 |
| child | 153:8310bfddaba8 |
comparison
equal
deleted
inserted
replaced
| 149:40e443eacbbd | 150:d09b8a1ab046 |
|---|---|
| 7 | 7 |
| 8 local log = require "util.logger".init("stanzarouter") | 8 local log = require "util.logger".init("stanzarouter") |
| 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 s2s_make_authenticated = require "core.s2smanager".make_authenticated; | |
| 17 local format = string.format; | |
| 18 local tostring = tostring; | |
| 14 | 19 |
| 15 local jid_split = require "util.jid".split; | 20 local jid_split = require "util.jid".split; |
| 16 local print = print; | 21 local print = print; |
| 17 | 22 |
| 18 function core_process_stanza(origin, stanza) | 23 function core_process_stanza(origin, stanza) |
| 31 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then | 36 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then |
| 32 error("Client MUST bind resource after auth"); | 37 error("Client MUST bind resource after auth"); |
| 33 end | 38 end |
| 34 | 39 |
| 35 local to = stanza.attr.to; | 40 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 | 41 -- TODO also, stazas should be returned to their original state before the function ends |
| 42 if origin.type == "c2s" then | |
| 43 stanza.attr.from = origin.full_jid; -- quick fix to prevent impersonation (FIXME this would be incorrect when the origin is not c2s) | |
| 44 end | |
| 38 | 45 |
| 39 -- TODO presence subscriptions | |
| 40 if not to then | 46 if not to then |
| 41 core_handle_stanza(origin, stanza); | 47 core_handle_stanza(origin, stanza); |
| 42 elseif hosts[to] and hosts[to].type == "local" then | 48 elseif hosts[to] and hosts[to].type == "local" then |
| 43 core_handle_stanza(origin, stanza); | 49 core_handle_stanza(origin, stanza); |
| 44 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 |
| 45 core_handle_stanza(origin, stanza); | 51 core_handle_stanza(origin, stanza); |
| 46 elseif origin.type == "c2s" then | 52 elseif origin.type == "c2s" or origin.type == "s2sin" then |
| 47 core_route_stanza(origin, stanza); | 53 core_route_stanza(origin, stanza); |
| 48 end | 54 end |
| 49 end | 55 end |
| 50 | 56 |
| 51 -- This function handles stanzas which are not routed any further, | 57 -- This function handles stanzas which are not routed any further, |
| 88 end | 94 end |
| 89 else | 95 else |
| 90 log("debug", "Routing stanza to local"); | 96 log("debug", "Routing stanza to local"); |
| 91 handle_stanza(session, stanza); | 97 handle_stanza(session, stanza); |
| 92 end | 98 end |
| 99 elseif origin.type == "s2sin_unauthed" or origin.type == "s2sin" then | |
| 100 if stanza.attr.xmlns == "jabber:server:dialback" then | |
| 101 if stanza.name == "verify" then | |
| 102 -- We are being asked to verify the key, to ensure it was generated by us | |
| 103 log("debug", "verifying dialback key..."); | |
| 104 local attr = stanza.attr; | |
| 105 print(tostring(attr.to), tostring(attr.from)) | |
| 106 print(tostring(origin.to_host), tostring(origin.from_host)) | |
| 107 -- FIXME: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34 | |
| 108 --if attr.from ~= origin.to_host then error("invalid-from"); end | |
| 109 local type = "invalid"; | |
| 110 if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then | |
| 111 type = "valid" | |
| 112 end | |
| 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])); | |
| 114 elseif stanza.name == "result" and origin.type == "s2sin_unauthed" then | |
| 115 -- he wants to be identified through dialback | |
| 116 -- We need to check the key with the Authoritative server | |
| 117 local attr = stanza.attr; | |
| 118 origin.from_host = attr.from; | |
| 119 origin.to_host = attr.to; | |
| 120 origin.dialback_key = stanza[1]; | |
| 121 log("debug", "asking %s if key %s belongs to them", attr.from, stanza[1]); | |
| 122 send_s2s(attr.to, attr.from, format("<db:verify from='%s' to='%s' id='%s'>%s</db:verify>", attr.to, attr.from, origin.streamid, stanza[1])); | |
| 123 hosts[attr.from].dialback_verifying = origin; | |
| 124 end | |
| 125 end | |
| 126 elseif origin.type == "s2sout_unauthed" or origin.type == "s2sout" then | |
| 127 if stanza.attr.xmlns == "jabber:server:dialback" then | |
| 128 if stanza.name == "result" then | |
| 129 if stanza.attr.type == "valid" then | |
| 130 s2s_make_authenticated(origin); | |
| 131 else | |
| 132 -- FIXME | |
| 133 error("dialback failed!"); | |
| 134 end | |
| 135 elseif stanza.name == "verify" and origin.dialback_verifying then | |
| 136 local valid; | |
| 137 local attr = stanza.attr; | |
| 138 if attr.type == "valid" then | |
| 139 s2s_make_authenticated(origin.dialback_verifying); | |
| 140 valid = "valid"; | |
| 141 else | |
| 142 -- Warn the original connection that is was not verified successfully | |
| 143 log("warn", "dialback for "..(origin.dialback_verifying.from_host or "(unknown)").." failed"); | |
| 144 valid = "invalid"; | |
| 145 end | |
| 146 origin.dialback_verifying.send(format("<db:result from='%s' to='%s' id='%s' type='%s'>%s</db:result>", attr.from, attr.to, attr.id, valid, origin.dialback_verifying.dialback_key)); | |
| 147 end | |
| 148 end | |
| 149 else | |
| 150 log("warn", "Unhandled origin: %s", origin.type); | |
| 93 end | 151 end |
| 94 end | 152 end |
| 95 | 153 |
| 96 function is_authorized_to_see_presence(origin, username, host) | 154 function is_authorized_to_see_presence(origin, username, host) |
| 97 local roster = datamanager.load(username, host, "roster") or {}; | 155 local roster = datamanager.load(username, host, "roster") or {}; |
| 182 else | 240 else |
| 183 send(origin, st.error_reply(stanza, "cancel", "service-unavailable")); | 241 send(origin, st.error_reply(stanza, "cancel", "service-unavailable")); |
| 184 end | 242 end |
| 185 end | 243 end |
| 186 end | 244 end |
| 245 elseif origin.type == "c2s" then | |
| 246 -- Remote host | |
| 247 --stanza.attr.xmlns = "jabber:server"; | |
| 248 stanza.attr.xmlns = nil; | |
| 249 log("debug", "sending s2s stanza: %s", tostring(stanza)); | |
| 250 send_s2s(origin.host, host, stanza); | |
| 187 else | 251 else |
| 188 -- Remote host | 252 log("warn", "received stanza from unhandled connection type: %s", origin.type); |
| 189 if host_session then | |
| 190 -- Send to session | |
| 191 else | |
| 192 -- Need to establish the connection | |
| 193 end | |
| 194 end | 253 end |
| 195 stanza.attr.to = to; -- reset | 254 stanza.attr.to = to; -- reset |
| 196 end | 255 end |
| 197 | 256 |
| 198 function handle_stanza_toremote(stanza) | 257 function handle_stanza_toremote(stanza) |