plugins/mod_pep.lua
changeset 13490 fdd1438d9ef7
parent 13217 50324f66ca2a
--- a/plugins/mod_pep.lua	Fri Apr 26 10:37:20 2024 +0100
+++ b/plugins/mod_pep.lua	Sun Dec 03 23:19:27 2023 +0100
@@ -5,7 +5,7 @@
 local set_new = require "prosody.util.set".new;
 local st = require "prosody.util.stanza";
 local calculate_hash = require "prosody.util.caps".calculate_hash;
-local is_contact_subscribed = require "prosody.core.rostermanager".is_contact_subscribed;
+local rostermanager = require "prosody.core.rostermanager";
 local cache = require "prosody.util.cache";
 local set = require "prosody.util.set";
 local new_id = require "prosody.util.id".medium;
@@ -16,6 +16,8 @@
 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
 
+local is_contact_subscribed = rostermanager.is_contact_subscribed;
+
 local lib_pubsub = module:require "pubsub";
 
 local empty_set = set_new();
@@ -84,6 +86,7 @@
 		return false;
 	end
 	if new_config["access_model"] ~= "presence"
+	and new_config["access_model"] ~= "roster"
 	and new_config["access_model"] ~= "whitelist"
 	and new_config["access_model"] ~= "open" then
 		return false;
@@ -256,6 +259,20 @@
 				end
 				return "outcast";
 			end;
+			roster = function (jid, node)
+				jid = jid_bare(jid);
+				local allowed_groups = set_new(node.config.roster_groups_allowed);
+				local roster = rostermanager.load_roster(username, host);
+				if not roster[jid] then
+					return "outcast";
+				end
+				for group in pairs(roster[jid].groups) do
+					if allowed_groups:contains(group) then
+						return "member";
+					end
+				end
+				return "outcast";
+			end;
 		};
 
 		jid = user_bare;