File

plugins/mod_authz_internal.lua @ 11769:071715a18394

mod_pubsub: Move reversal of item order in <items> Examples in XEP-0060 suggest that items should be listed in chronological order, but we get them from the archive in reverse order. However when requesting specific items by id the results keep that order and we don't want to flip it again. At some point it would likely be best to use the archive API directly instead of this util.cache-compatible wrapper.
author Kim Alvefur <zash@zash.se>
date Sun, 05 Sep 2021 18:42:44 +0200
parent 11745:3a2d58a39872
child 12642:9061f9621330
line wrap: on
line source

local array = require "util.array";
local it = require "util.iterators";
local set = require "util.set";
local jid_split = require "util.jid".split;
local normalize = require "util.jid".prep;
local config_admin_jids = module:get_option_inherited_set("admins", {}) / normalize;
local host = module.host;
local role_store = module:open_store("roles");
local role_map_store = module:open_store("roles", "map");

local admin_role = { ["prosody:admin"] = true };

function get_user_roles(user)
	if config_admin_jids:contains(user.."@"..host) then
		return admin_role;
	end
	return role_store:get(user);
end

function set_user_roles(user, roles)
	role_store:set(user, roles)
	return true;
end

function get_users_with_role(role)
	local storage_role_users = it.to_array(it.keys(role_map_store:get_all(role) or {}));
	if role == "prosody:admin" then
		local config_admin_users = config_admin_jids / function (admin_jid)
			local j_node, j_host = jid_split(admin_jid);
			if j_host == host then
				return j_node;
			end
		end;
		return it.to_array(config_admin_users + set.new(storage_role_users));
	end
	return storage_role_users;
end

function get_jid_roles(jid)
	if config_admin_jids:contains(jid) then
		return admin_role;
	end
	return nil;
end

function set_jid_roles(jid) -- luacheck: ignore 212
	return false;
end

function get_jids_with_role(role)
	-- Fetch role users from storage
	local storage_role_jids = array.map(get_users_with_role(role), function (username)
		return username.."@"..host;
	end);
	if role == "prosody:admin" then
		return it.to_array(config_admin_jids + set.new(storage_role_jids));
	end
	return storage_role_jids;
end