Mercurial > prosody-hg
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 |
| parents | 50324f66ca2a |
| children | 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 |
