Comparison

plugins/mod_pep.lua @ 13486:fdd1438d9ef7

mod_pep: Implement 'roster' (group) access_model Allows e.g. restricting your vcard4 to only family or similar. Notes: This does not include roster groups in the configuration form, so the client will have to get them from the actual roster.
author Kim Alvefur <zash@zash.se>
date Sun, 03 Dec 2023 23:19:27 +0100
parent 13213:50324f66ca2a
child 13586:c8a387912a33
comparison
equal deleted inserted replaced
13485:3bdbaba15c00 13486:fdd1438d9ef7
3 local jid_split = require "prosody.util.jid".split; 3 local jid_split = require "prosody.util.jid".split;
4 local jid_join = require "prosody.util.jid".join; 4 local jid_join = require "prosody.util.jid".join;
5 local set_new = require "prosody.util.set".new; 5 local set_new = require "prosody.util.set".new;
6 local st = require "prosody.util.stanza"; 6 local st = require "prosody.util.stanza";
7 local calculate_hash = require "prosody.util.caps".calculate_hash; 7 local calculate_hash = require "prosody.util.caps".calculate_hash;
8 local is_contact_subscribed = require "prosody.core.rostermanager".is_contact_subscribed; 8 local rostermanager = require "prosody.core.rostermanager";
9 local cache = require "prosody.util.cache"; 9 local cache = require "prosody.util.cache";
10 local set = require "prosody.util.set"; 10 local set = require "prosody.util.set";
11 local new_id = require "prosody.util.id".medium; 11 local new_id = require "prosody.util.id".medium;
12 local storagemanager = require "prosody.core.storagemanager"; 12 local storagemanager = require "prosody.core.storagemanager";
13 local usermanager = require "prosody.core.usermanager"; 13 local usermanager = require "prosody.core.usermanager";
14 14
15 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; 15 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
16 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; 16 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
17 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; 17 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
18
19 local is_contact_subscribed = rostermanager.is_contact_subscribed;
18 20
19 local lib_pubsub = module:require "pubsub"; 21 local lib_pubsub = module:require "pubsub";
20 22
21 local empty_set = set_new(); 23 local empty_set = set_new();
22 24
82 function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node 212/actor 84 function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node 212/actor
83 if (tonumber_max_items(new_config["max_items"]) or 1) > max_max_items then 85 if (tonumber_max_items(new_config["max_items"]) or 1) > max_max_items then
84 return false; 86 return false;
85 end 87 end
86 if new_config["access_model"] ~= "presence" 88 if new_config["access_model"] ~= "presence"
89 and new_config["access_model"] ~= "roster"
87 and new_config["access_model"] ~= "whitelist" 90 and new_config["access_model"] ~= "whitelist"
88 and new_config["access_model"] ~= "open" then 91 and new_config["access_model"] ~= "open" then
89 return false; 92 return false;
90 end 93 end
91 return true; 94 return true;
251 254
252 access_models = { 255 access_models = {
253 presence = function (jid) 256 presence = function (jid)
254 if subscription_presence(username, jid) then 257 if subscription_presence(username, jid) then
255 return "member"; 258 return "member";
259 end
260 return "outcast";
261 end;
262 roster = function (jid, node)
263 jid = jid_bare(jid);
264 local allowed_groups = set_new(node.config.roster_groups_allowed);
265 local roster = rostermanager.load_roster(username, host);
266 if not roster[jid] then
267 return "outcast";
268 end
269 for group in pairs(roster[jid].groups) do
270 if allowed_groups:contains(group) then
271 return "member";
272 end
256 end 273 end
257 return "outcast"; 274 return "outcast";
258 end; 275 end;
259 }; 276 };
260 277