Comparison

mod_privilege/mod_privilege.lua @ 1665:746d94f37a4c

mod_privilege: presence already known are advertised to privileged entity (for "maneger_entity" permission only so far)
author Goffi <goffi@goffi.org>
date Tue, 07 Apr 2015 12:47:51 +0200
parent 1664:6bdcb1418029
child 1666:0b1b4b7d5fe0
comparison
equal deleted inserted replaced
1664:6bdcb1418029 1665:746d94f37a4c
11 local set = require("util/set") 11 local set = require("util/set")
12 local st = require("util/stanza") 12 local st = require("util/stanza")
13 local roster_manager = require("core/rostermanager") 13 local roster_manager = require("core/rostermanager")
14 local user_manager = require("core/usermanager") 14 local user_manager = require("core/usermanager")
15 local hosts = prosody.hosts 15 local hosts = prosody.hosts
16 local full_sessions = prosody.full_sessions;
16 -- the folowing sets are used to forward presence stanza 17 -- the folowing sets are used to forward presence stanza
17 if not prosody._privilege_presence_man_ent then 18 if not prosody._privilege_presence_man_ent then
18 prosody._privilege_presence_man_ent = set.new() 19 prosody._privilege_presence_man_ent = set.new()
19 end 20 end
20 local presence_man_ent = prosody._privilege_presence_man_ent 21 local presence_man_ent = prosody._privilege_presence_man_ent
26 local _ALLOWED_ROSTER = set.new({'none', 'get', 'set', 'both'}) 27 local _ALLOWED_ROSTER = set.new({'none', 'get', 'set', 'both'})
27 local _ROSTER_GET_PERM = set.new({'get', 'both'}) 28 local _ROSTER_GET_PERM = set.new({'get', 'both'})
28 local _ROSTER_SET_PERM = set.new({'set', 'both'}) 29 local _ROSTER_SET_PERM = set.new({'set', 'both'})
29 local _ALLOWED_MESSAGE = set.new({'none', 'outgoing'}) 30 local _ALLOWED_MESSAGE = set.new({'none', 'outgoing'})
30 local _ALLOWED_PRESENCE = set.new({'none', 'managed_entity', 'roster'}) 31 local _ALLOWED_PRESENCE = set.new({'none', 'managed_entity', 'roster'})
32 local _PRESENCE_MANAGED = set.new({'managed_entity', 'roster'})
31 local _TO_CHECK = {roster=_ALLOWED_ROSTER, message=_ALLOWED_MESSAGE, presence=_ALLOWED_PRESENCE} 33 local _TO_CHECK = {roster=_ALLOWED_ROSTER, message=_ALLOWED_MESSAGE, presence=_ALLOWED_PRESENCE}
32 local _PRIV_ENT_NS = 'urn:xmpp:privilege:1' 34 local _PRIV_ENT_NS = 'urn:xmpp:privilege:1'
33 local _FORWARDED_NS = 'urn:xmpp:forward:0' 35 local _FORWARDED_NS = 'urn:xmpp:forward:0'
34 36
35 37
40 42
41 privileges = module:get_option("privileged_entities", {}) 43 privileges = module:get_option("privileged_entities", {})
42 44
43 function advertise_perm(session, to_jid, perms) 45 function advertise_perm(session, to_jid, perms)
44 -- send <message/> stanza to advertise permissions 46 -- send <message/> stanza to advertise permissions
45 -- as expained in section 4.2 47 -- as expained in § 4.2
46 local message = st.message({to=to_jid}) 48 local message = st.message({to=to_jid})
47 :tag("privilege", {xmlns=_PRIV_ENT_NS}) 49 :tag("privilege", {xmlns=_PRIV_ENT_NS})
48 50
49 for _, perm in pairs({'roster', 'message', 'presence'}) do 51 for _, perm in pairs({'roster', 'message', 'presence'}) do
50 if perms[perm] then 52 if perms[perm] then
59 if perms.presence == 'managed_entity' then 61 if perms.presence == 'managed_entity' then
60 presence_man_ent:add(to_jid) 62 presence_man_ent:add(to_jid)
61 elseif perms.presence == 'roster' then 63 elseif perms.presence == 'roster' then
62 presence_man_ent:add(to_jid) -- roster imply managed_entity 64 presence_man_ent:add(to_jid) -- roster imply managed_entity
63 presence_roster:add(to_jid) 65 presence_roster:add(to_jid)
66 end
67 end
68
69 function advertise_presences(session, to_jid, perms)
70 -- send presence status for already conencted entities
71 -- as explained in § 7.1
72 for _, user_session in pairs(full_sessions) do
73 if user_session.presence then
74 if _PRESENCE_MANAGED:contains(perms.presence) then
75 local presence = st.clone(user_session.presence)
76 presence.attr.to = to_jid
77 module:log("debug", "sending current presence for "..tostring(user_session.full_jid))
78 session.send(presence)
79 end
80 end
64 end 81 end
65 end 82 end
66 83
67 function on_auth(event) 84 function on_auth(event)
68 -- Check if entity is privileged according to configuration, 85 -- Check if entity is privileged according to configuration,
97 if session.type == "component" then 114 if session.type == "component" then
98 -- we send the message stanza only for component 115 -- we send the message stanza only for component
99 -- it will be sent at first <presence/> for other entities 116 -- it will be sent at first <presence/> for other entities
100 advertise_perm(session, bare_jid, ent_priv) 117 advertise_perm(session, bare_jid, ent_priv)
101 set_presence_perm_set(bare_jid, ent_priv) 118 set_presence_perm_set(bare_jid, ent_priv)
119 advertise_presences(session, bare_jid, ent_priv)
102 end 120 end
103 end 121 end
104 122
105 session.privileges = ent_priv 123 session.privileges = ent_priv
106 end 124 end
110 -- we only advertise them to the entity 128 -- we only advertise them to the entity
111 local session, stanza = event.origin, event.stanza; 129 local session, stanza = event.origin, event.stanza;
112 if session.privileges then 130 if session.privileges then
113 advertise_perm(session, session.full_jid, session.privileges) 131 advertise_perm(session, session.full_jid, session.privileges)
114 set_presence_perm_set(session.full_jid, session.privileges) 132 set_presence_perm_set(session.full_jid, session.privileges)
133 advertise_presences(session, session.full_jid, session.privileges)
115 end 134 end
116 end 135 end
117 136
118 module:hook('authentication-success', on_auth) 137 module:hook('authentication-success', on_auth)
119 module:hook('component-authenticated', on_auth) 138 module:hook('component-authenticated', on_auth)