aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-12-03 23:19:27 +0100
committerKim Alvefur <zash@zash.se>2023-12-03 23:19:27 +0100
commit83ee7e57394d381fe5a2156b3b3dadfa07c4cc57 (patch)
treeb008f80ca322ca693b100a436130c21eec2e678f
parentmod_announce: Suppress luacheck warnings (diff)
downloadprosody-83ee7e57394d381fe5a2156b3b3dadfa07c4cc57.tar.xz
prosody-83ee7e57394d381fe5a2156b3b3dadfa07c4cc57.zip
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.
-rw-r--r--CHANGES1
-rw-r--r--plugins/mod_pep.lua19
-rw-r--r--plugins/mod_pubsub/pubsub.lib.lua6
-rw-r--r--util/pubsub.lua2
4 files changed, 26 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 95b636ded..70aa13c31 100644
--- a/CHANGES
+++ b/CHANGES
@@ -67,6 +67,7 @@ TRUNK
- When mod_smacks is enabled, s2s connections not responding to ack requests are closed.
- Arguments to `prosodyctl shell` that start with ':' are now turned into method calls
- Support for Type=notify and notify-reload systemd service type added
+- Support for the roster *group* access_model in mod_pep
## Removed
diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua
index fbc06fdb3..33eee2ec4 100644
--- a/plugins/mod_pep.lua
+++ b/plugins/mod_pep.lua
@@ -5,7 +5,7 @@ local jid_join = require "prosody.util.jid".join;
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 = "http://jabber.org/protocol/pubsub";
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 @@ function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node
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 @@ function get_pep_service(username)
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;
diff --git a/plugins/mod_pubsub/pubsub.lib.lua b/plugins/mod_pubsub/pubsub.lib.lua
index 28b7be501..8ae0a896e 100644
--- a/plugins/mod_pubsub/pubsub.lib.lua
+++ b/plugins/mod_pubsub/pubsub.lib.lua
@@ -110,6 +110,12 @@ local node_config_form = dataform {
};
};
{
+ type = "list-multi"; -- TODO some way to inject options
+ name = "roster_groups_allowed";
+ var = "pubsub#roster_groups_allowed";
+ label = "Roster groups allowed to subscribe";
+ };
+ {
type = "list-single";
name = "publish_model";
var = "pubsub#publish_model";
diff --git a/util/pubsub.lua b/util/pubsub.lua
index e089b08c6..ccde8b537 100644
--- a/util/pubsub.lua
+++ b/util/pubsub.lua
@@ -263,7 +263,7 @@ function service:get_default_affiliation(node, actor) --> affiliation
if self.config.access_models then
local check = self.config.access_models[access_model];
if check then
- local aff = check(actor);
+ local aff = check(actor, node_obj);
if aff then
return aff;
end