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]; |