Software /
code /
prosody
Comparison
core/stanza_router.lua @ 71:fbb4ef1da82e
Added: Local stanza routing
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Wed, 08 Oct 2008 04:49:55 +0500 |
parent | 68:ceb7a55676a4 |
child | 72:e78db62beebc |
comparison
equal
deleted
inserted
replaced
70:a6c00467a3f8 | 71:fbb4ef1da82e |
---|---|
5 | 5 |
6 require "core.servermanager" | 6 require "core.servermanager" |
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"; | |
11 local send = require "core.sessionmanager".send_to_session; | |
12 | |
10 require "util.jid" | 13 require "util.jid" |
11 local jid_split = jid.split; | 14 local jid_split = jid.split; |
12 | 15 |
13 function core_process_stanza(origin, stanza) | 16 function core_process_stanza(origin, stanza) |
14 log("debug", "Received: "..tostring(stanza)) | 17 log("debug", "Received: "..tostring(stanza)) |
18 -- TODO verify validity of stanza | |
19 | |
15 local to = stanza.attr.to; | 20 local to = stanza.attr.to; |
21 stanza.attr.from = origin.full_jid -- quick fix to prevent impersonation | |
16 | 22 |
17 if not to or (hosts[to] and hosts[to].type == "local") then | 23 if not to or (hosts[to] and hosts[to].type == "local") then |
18 core_handle_stanza(origin, stanza); | 24 core_handle_stanza(origin, stanza); |
19 elseif origin.type == "c2s" then | 25 elseif origin.type == "c2s" then |
20 core_route_stanza(origin, stanza); | 26 core_route_stanza(origin, stanza); |
21 end | 27 end |
22 | |
23 end | 28 end |
24 | 29 |
25 function core_handle_stanza(origin, stanza) | 30 function core_handle_stanza(origin, stanza) |
26 -- Handlers | 31 -- Handlers |
27 if origin.type == "c2s" or origin.type == "c2s_unauthed" then | 32 if origin.type == "c2s" or origin.type == "c2s_unauthed" then |
34 --if not to_host then error("Invalid destination JID: "..string.format("{ %q, %q, %q } == %q", to_node or "", to_host or "", to_resource or "", stanza.attr.to or "nil")); end | 39 --if not to_host then error("Invalid destination JID: "..string.format("{ %q, %q, %q } == %q", to_node or "", to_host or "", to_resource or "", stanza.attr.to or "nil")); end |
35 | 40 |
36 -- Stanza is to this server, or a user on this server | 41 -- Stanza is to this server, or a user on this server |
37 log("debug", "Routing stanza to local"); | 42 log("debug", "Routing stanza to local"); |
38 handle_stanza(session, stanza); | 43 handle_stanza(session, stanza); |
39 end | 44 end |
40 end | 45 end |
41 | 46 |
42 function core_route_stanza(origin, stanza) | 47 function core_route_stanza(origin, stanza) |
43 -- Hooks | 48 -- Hooks |
44 --- ...later | 49 --- ...later |
46 -- Deliver | 51 -- Deliver |
47 local node, host, resource = jid_split(stanza.attr.to); | 52 local node, host, resource = jid_split(stanza.attr.to); |
48 local host_session = hosts[host] | 53 local host_session = hosts[host] |
49 if host_session and host_session.type == "local" then | 54 if host_session and host_session.type == "local" then |
50 -- Local host | 55 -- Local host |
56 local user = host_session.sessions[node]; | |
57 if user then | |
58 local res = nil; | |
59 if resource then | |
60 res = user.sessions[resource]; | |
61 end | |
62 -- TODO do something about presence broadcast | |
63 if not res then | |
64 -- if we get here, resource was not specified or was unavailable | |
65 for k in pairs(user.sessions) do | |
66 res = user.sessions[k]; | |
67 break; | |
68 end | |
69 -- TODO find resource with greatest priority | |
70 end | |
71 stanza.attr.to = res.full_jid; | |
72 send(res, stanza); -- Yay \o/ | |
73 else | |
74 -- user not found | |
75 send(origin, st.error_reply(stanza, "cancel", "service-unavailable")); | |
76 end | |
51 else | 77 else |
52 -- Remote host | 78 -- Remote host |
53 if host_session then | 79 if host_session then |
54 -- Send to session | 80 -- Send to session |
55 else | 81 else |