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; |
|
13 local user_exists = require "core.usermanager".user_exists; |
12 local user_exists = require "core.usermanager".user_exists; |
14 |
13 |
15 local jid_split = require "util.jid".split; |
14 local jid_split = require "util.jid".split; |
16 local print = print; |
15 local print = print; |
17 |
16 |
116 if user then |
115 if user then |
117 local res = user.sessions[resource]; |
116 local res = user.sessions[resource]; |
118 if not res then |
117 if not res then |
119 -- if we get here, resource was not specified or was unavailable |
118 -- if we get here, resource was not specified or was unavailable |
120 if stanza.name == "presence" then |
119 if stanza.name == "presence" then |
121 if stanza.attr.type == "probe" then |
120 if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then |
122 if is_authorized_to_see_presence(origin, node, host) then |
121 if stanza.attr.type == "probe" then |
123 for k in pairs(user.sessions) do -- return presence for all resources |
122 if is_authorized_to_see_presence(origin, node, host) then |
124 if user.sessions[k].presence then |
123 for k in pairs(user.sessions) do -- return presence for all resources |
125 local pres = user.sessions[k].presence; |
124 if user.sessions[k].presence then |
126 pres.attr.to = origin.full_jid; |
125 local pres = user.sessions[k].presence; |
127 pres.attr.from = user.sessions[k].full_jid; |
126 pres.attr.to = origin.full_jid; |
128 send(origin, pres); |
127 pres.attr.from = user.sessions[k].full_jid; |
129 pres.attr.to = nil; |
128 send(origin, pres); |
130 pres.attr.from = nil; |
129 pres.attr.to = nil; |
|
130 pres.attr.from = nil; |
|
131 end |
131 end |
132 end |
|
133 else |
|
134 send(origin, st.presence({from=user.."@"..host, to=origin.username.."@"..origin.host, type="unsubscribed"})); |
132 end |
135 end |
133 else |
136 elseif stanza.attr.type == "subscribe" then |
134 send(origin, st.presence({from = user.."@"..host, to = origin.username.."@"..origin.host, type = "unsubscribed"})); |
137 -- TODO |
135 end |
138 elseif stanza.attr.type == "unsubscribe" then |
136 else |
139 -- TODO |
|
140 elseif stanza.attr.type == "subscribed" then |
|
141 -- TODO |
|
142 elseif stanza.attr.type == "unsubscribed" then |
|
143 -- TODO |
|
144 end -- discard any other type |
|
145 else -- sender is available or unavailable |
137 for k in pairs(user.sessions) do -- presence broadcast to all user resources |
146 for k in pairs(user.sessions) do -- presence broadcast to all user resources |
138 if user.sessions[k].full_jid then |
147 if user.sessions[k].full_jid then |
139 stanza.attr.to = user.sessions[k].full_jid; |
148 stanza.attr.to = user.sessions[k].full_jid; |
140 send(user.sessions[k], stanza); |
149 send(user.sessions[k], stanza); |
141 end |
150 end |