core/stanza_router.lua

changeset 130
907cff6b5359
parent 128
77a1778b16e8
child 135
bf10d42dd41b
equal deleted inserted replaced
129:0f119bece309 130:907cff6b5359
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 user_exists = require "core.usermanager".user_exists; 12 local user_exists = require "core.usermanager".user_exists;
13 13
14 local jid_split = require "util.jid".split; 14 local jid_split = require "util.jid".split;
15 local print = print; 15 local print, debug = print, debug;
16 16
17 function core_process_stanza(origin, stanza) 17 function core_process_stanza(origin, stanza)
18 log("debug", "Received: "..tostring(stanza)) 18 log("debug", "Received: "..tostring(stanza))
19 -- TODO verify validity of stanza (as well as JID validity) 19 -- TODO verify validity of stanza (as well as JID validity)
20 if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then 20 if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
61 if subscription == "both" or subscription == "from" then 61 if subscription == "both" or subscription == "from" then
62 stanza.attr.to = jid; 62 stanza.attr.to = jid;
63 core_route_stanza(origin, stanza); 63 core_route_stanza(origin, stanza);
64 end 64 end
65 end 65 end
66 --[[local node, host = jid_split(stanza.attr.from); 66 local node, host = jid_split(stanza.attr.from);
67 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources 67 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources and from resources
68 if res.full_jid then 68 if res ~= origin then
69 res = user.sessions[k]; 69 if res.full_jid then -- to resource. FIXME is this check correct? Maybe it should be res.presence
70 break; 70 stanza.attr.to = res.full_jid;
71 end 71 core_route_stanza(origin, stanza);
72 end]] 72 end
73 if res.presence then -- from all resources for which we have presence
74 res.presence.attr.to = origin.full_jid;
75 core_route_stanza(res, res.presence);
76 res.presence.attr.to = nil;
77 end
78 end
79 end
73 if not origin.presence then -- presence probes on initial presence 80 if not origin.presence then -- presence probes on initial presence
74 local probe = st.presence({from = origin.full_jid, type = "probe"}); 81 local probe = st.presence({from = origin.full_jid, type = "probe"});
75 for jid in pairs(origin.roster) do 82 for jid in pairs(origin.roster) do
76 local subscription = origin.roster[jid].subscription; 83 local subscription = origin.roster[jid].subscription;
77 if subscription == "both" or subscription == "to" then 84 if subscription == "both" or subscription == "to" then
104 111
105 -- Deliver 112 -- Deliver
106 local to = stanza.attr.to; 113 local to = stanza.attr.to;
107 local node, host, resource = jid_split(to); 114 local node, host, resource = jid_split(to);
108 115
109 if stanza.name == "presence" and stanza.attr.type == "probe" then resource = nil; end 116 if stanza.name == "presence" and (stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable") then resource = nil; end
110 117
111 local host_session = hosts[host] 118 local host_session = hosts[host]
112 if host_session and host_session.type == "local" then 119 if host_session and host_session.type == "local" then
113 -- Local host 120 -- Local host
114 local user = host_session.sessions[node]; 121 local user = host_session.sessions[node];

mercurial