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();