Comparison

plugins/mod_disco.lua @ 12017:b3f040e57835

mod_disco: Optionally return info on admin accounts to non-contacts If you already know the account, from say the server contact info, then this confirms their admin status.
author Kim Alvefur <zash@zash.se>
date Thu, 15 Apr 2021 15:39:35 +0200
parent 12016:b7e15abde27f
child 12388:50fcd3879482
comparison
equal deleted inserted replaced
12016:b7e15abde27f 12017:b3f040e57835
11 local um_is_admin = require "core.usermanager".is_admin; 11 local um_is_admin = require "core.usermanager".is_admin;
12 local jid_split = require "util.jid".split; 12 local jid_split = require "util.jid".split;
13 local jid_bare = require "util.jid".bare; 13 local jid_bare = require "util.jid".bare;
14 local st = require "util.stanza" 14 local st = require "util.stanza"
15 local calculate_hash = require "util.caps".calculate_hash; 15 local calculate_hash = require "util.caps".calculate_hash;
16
17 local expose_admins = module:get_option_boolean("disco_expose_admins", false);
16 18
17 local disco_items = module:get_option_array("disco_items", {}) 19 local disco_items = module:get_option_array("disco_items", {})
18 do -- validate disco_items 20 do -- validate disco_items
19 for _, item in ipairs(disco_items) do 21 for _, item in ipairs(disco_items) do
20 local err; 22 local err;
164 if module:get_host_type() ~= "local" then return end -- skip for components 166 if module:get_host_type() ~= "local" then return end -- skip for components
165 module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function(event) 167 module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function(event)
166 local origin, stanza = event.origin, event.stanza; 168 local origin, stanza = event.origin, event.stanza;
167 local node = stanza.tags[1].attr.node; 169 local node = stanza.tags[1].attr.node;
168 local username = jid_split(stanza.attr.to) or origin.username; 170 local username = jid_split(stanza.attr.to) or origin.username;
169 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then 171 local is_admin = um_is_admin(stanza.attr.to or origin.full_jid, module.host)
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
170 if node and node ~= "" then 173 if node and node ~= "" then
171 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node}); 174 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node});
172 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account 175 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account
173 local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false}; 176 local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false};
174 local ret = module:fire_event("account-disco-info-node", node_event); 177 local ret = module:fire_event("account-disco-info-node", node_event);
180 end 183 end
181 return true; 184 return true;
182 end 185 end
183 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'}); 186 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'});
184 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account 187 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account
185 if um_is_admin(stanza.attr.to or origin.full_jid, module.host) then 188 if is_admin then
186 reply:tag('identity', {category='account', type='admin'}):up(); 189 reply:tag('identity', {category='account', type='admin'}):up();
187 elseif prosody.hosts[module.host].users.name == "anonymous" then 190 elseif prosody.hosts[module.host].users.name == "anonymous" then
188 reply:tag('identity', {category='account', type='anonymous'}):up(); 191 reply:tag('identity', {category='account', type='anonymous'}):up();
189 else 192 else
190 reply:tag('identity', {category='account', type='registered'}):up(); 193 reply:tag('identity', {category='account', type='registered'}):up();