Mercurial > prosody-hg
comparison plugins/mod_disco.lua @ 12674:72f431b4dc2c
Merge role-auth->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 22 Aug 2022 13:53:35 +0100 |
| parents | 9061f9621330 |
| children | 74b9e05af71e |
comparison
equal
deleted
inserted
replaced
| 12639:6d9ee0a3eb4b | 12674:72f431b4dc2c |
|---|---|
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 local get_children = require "core.hostmanager".get_children; | 9 local get_children = require "core.hostmanager".get_children; |
| 10 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; | 10 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; |
| 11 local um_is_admin = require "core.usermanager".is_admin; | |
| 12 local jid_split = require "util.jid".split; | 11 local jid_split = require "util.jid".split; |
| 13 local jid_bare = require "util.jid".bare; | 12 local jid_bare = require "util.jid".bare; |
| 14 local st = require "util.stanza" | 13 local st = require "util.stanza" |
| 15 local calculate_hash = require "util.caps".calculate_hash; | 14 local calculate_hash = require "util.caps".calculate_hash; |
| 16 | 15 |
| 160 if event.origin.type == "s2sin" then | 159 if event.origin.type == "s2sin" then |
| 161 event.features:add_child(get_server_caps_feature()); | 160 event.features:add_child(get_server_caps_feature()); |
| 162 end | 161 end |
| 163 end); | 162 end); |
| 164 | 163 |
| 164 module:default_permission("prosody:admin", ":be-discovered-admin"); | |
| 165 | |
| 165 -- Handle disco requests to user accounts | 166 -- Handle disco requests to user accounts |
| 166 if module:get_host_type() ~= "local" then return end -- skip for components | 167 if module:get_host_type() ~= "local" then return end -- skip for components |
| 167 module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function(event) | 168 module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function(event) |
| 168 local origin, stanza = event.origin, event.stanza; | 169 local origin, stanza = event.origin, event.stanza; |
| 169 local node = stanza.tags[1].attr.node; | 170 local node = stanza.tags[1].attr.node; |
| 170 local username = jid_split(stanza.attr.to) or origin.username; | 171 local username = jid_split(stanza.attr.to) or origin.username; |
| 171 local is_admin = um_is_admin(stanza.attr.to or origin.full_jid, module.host) | 172 local target_is_admin = module:may(":be-discovered-admin", stanza.attr.to or origin.full_jid); |
| 172 if not stanza.attr.to or (expose_admins and is_admin) or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then | 173 if not stanza.attr.to or (expose_admins and target_is_admin) or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then |
| 173 if node and node ~= "" then | 174 if node and node ~= "" then |
| 174 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node}); | 175 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node}); |
| 175 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | 176 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account |
| 176 local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false}; | 177 local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false}; |
| 177 local ret = module:fire_event("account-disco-info-node", node_event); | 178 local ret = module:fire_event("account-disco-info-node", node_event); |
| 183 end | 184 end |
| 184 return true; | 185 return true; |
| 185 end | 186 end |
| 186 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'}); | 187 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'}); |
| 187 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | 188 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account |
| 188 if is_admin then | 189 if target_is_admin then |
| 189 reply:tag('identity', {category='account', type='admin'}):up(); | 190 reply:tag('identity', {category='account', type='admin'}):up(); |
| 190 elseif prosody.hosts[module.host].users.name == "anonymous" then | 191 elseif prosody.hosts[module.host].users.name == "anonymous" then |
| 191 reply:tag('identity', {category='account', type='anonymous'}):up(); | 192 reply:tag('identity', {category='account', type='anonymous'}):up(); |
| 192 else | 193 else |
| 193 reply:tag('identity', {category='account', type='registered'}):up(); | 194 reply:tag('identity', {category='account', type='registered'}):up(); |
