Mercurial > prosody-modules
comparison mod_privilege/mod_privilege.lua @ 1708:ad7afcf86131
mod_privilege: fixed bad handling of presence permissions / component authentication between different hosts
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 17 Apr 2015 21:00:34 +0200 |
parents | 64b3d1eb0cfe |
children | 0d78bb31348e |
comparison
equal
deleted
inserted
replaced
1707:64b3d1eb0cfe | 1708:ad7afcf86131 |
---|---|
16 local hosts = prosody.hosts | 16 local hosts = prosody.hosts |
17 local full_sessions = prosody.full_sessions; | 17 local full_sessions = prosody.full_sessions; |
18 | 18 |
19 local priv_session = module:shared("/*/privilege/session") | 19 local priv_session = module:shared("/*/privilege/session") |
20 | 20 |
21 if priv_session.connected_cb == nil then | |
22 -- set used to have connected event listeners | |
23 -- which allows a host to react on events from | |
24 -- other hosts | |
25 priv_session.connected_cb = set.new() | |
26 end | |
27 local connected_cb = priv_session.connected_cb | |
28 | |
21 -- the folowing sets are used to forward presence stanza | 29 -- the folowing sets are used to forward presence stanza |
22 if not priv_session.presence_man_ent then | 30 -- the folowing sets are used to forward presence stanza |
23 priv_session.presence_man_ent = set.new() | 31 local presence_man_ent = set.new() |
24 end | 32 local presence_roster = set.new() |
25 local presence_man_ent = priv_session.presence_man_ent | |
26 if not priv_session.presence_roster then | |
27 priv_session.presence_roster = set.new() | |
28 end | |
29 local presence_roster = priv_session.presence_roster | |
30 | 33 |
31 local _ALLOWED_ROSTER = set.new({'none', 'get', 'set', 'both'}) | 34 local _ALLOWED_ROSTER = set.new({'none', 'get', 'set', 'both'}) |
32 local _ROSTER_GET_PERM = set.new({'get', 'both'}) | 35 local _ROSTER_GET_PERM = set.new({'get', 'both'}) |
33 local _ROSTER_SET_PERM = set.new({'set', 'both'}) | 36 local _ROSTER_SET_PERM = set.new({'set', 'both'}) |
34 local _ALLOWED_MESSAGE = set.new({'none', 'outgoing'}) | 37 local _ALLOWED_MESSAGE = set.new({'none', 'outgoing'}) |
47 local privileges = module:get_option("privileged_entities", {}) | 50 local privileges = module:get_option("privileged_entities", {}) |
48 | 51 |
49 local function advertise_perm(session, to_jid, perms) | 52 local function advertise_perm(session, to_jid, perms) |
50 -- send <message/> stanza to advertise permissions | 53 -- send <message/> stanza to advertise permissions |
51 -- as expained in § 4.2 | 54 -- as expained in § 4.2 |
52 local message = st.message({to=to_jid}) | 55 local message = st.message({from=module.host, to=to_jid}) |
53 :tag("privilege", {xmlns=_PRIV_ENT_NS}) | 56 :tag("privilege", {xmlns=_PRIV_ENT_NS}) |
54 | 57 |
55 for _, perm in pairs({'roster', 'message', 'presence'}) do | 58 for _, perm in pairs({'roster', 'message', 'presence'}) do |
56 if perms[perm] then | 59 if perms[perm] then |
57 message:tag("perm", {access=perm, type=perms[perm]}):up() | 60 message:tag("perm", {access=perm, type=perms[perm]}):up() |
59 end | 62 end |
60 session.send(message) | 63 session.send(message) |
61 end | 64 end |
62 | 65 |
63 local function set_presence_perm_set(to_jid, perms) | 66 local function set_presence_perm_set(to_jid, perms) |
64 -- fill the global presence sets according to perms | 67 -- fill the presence sets according to perms |
65 if _PRESENCE_MANAGED:contains(perms.presence) then | 68 if _PRESENCE_MANAGED:contains(perms.presence) then |
66 presence_man_ent:add(to_jid) | 69 presence_man_ent:add(to_jid) |
67 end | 70 end |
68 if perms.presence == 'roster' then | 71 if perms.presence == 'roster' then |
69 presence_roster:add(to_jid) | 72 presence_roster:add(to_jid) |
162 set_presence_perm_set(session.full_jid, session.privileges) | 165 set_presence_perm_set(session.full_jid, session.privileges) |
163 advertise_presences(session, session.full_jid, session.privileges) | 166 advertise_presences(session, session.full_jid, session.privileges) |
164 end | 167 end |
165 end | 168 end |
166 | 169 |
170 local function on_component_auth(event) | |
171 -- react to component-authenticated event from this host | |
172 -- and call the on_auth methods from all other hosts | |
173 -- needed for the component to get delegations advertising | |
174 for callback in connected_cb:items() do | |
175 callback(event) | |
176 end | |
177 end | |
178 | |
179 connected_cb:add(on_auth) | |
167 module:hook('authentication-success', on_auth) | 180 module:hook('authentication-success', on_auth) |
168 module:hook('component-authenticated', on_auth) | 181 module:hook('component-authenticated', on_component_auth) |
169 module:hook('presence/initial', on_presence) | 182 module:hook('presence/initial', on_presence) |
170 | 183 |
171 | 184 |
172 --> roster permission <-- | 185 --> roster permission <-- |
173 | 186 |