Software /
code /
prosody
Changeset
13549:3b357ab6b6eb
util.pubsub: Add method returning subset of config as metadata
Allows granting read only access to other sets of users using a separate
access control capability, which makes sense as some properties may be
intended to be public but read-only.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 08 Nov 2024 02:11:00 +0100 |
parents | 13548:84ee435f284e |
children | 13550:eae0272b87e3 |
files | spec/util_pubsub_spec.lua util/pubsub.lua |
diffstat | 2 files changed, 29 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/spec/util_pubsub_spec.lua Fri Nov 08 10:31:25 2024 +0000 +++ b/spec/util_pubsub_spec.lua Fri Nov 08 02:11:00 2024 +0100 @@ -605,4 +605,14 @@ end); end) + + describe("metadata", function() + it("works", function() + local service = pubsub.new { metadata_subset = { "title" } }; + assert.truthy(service:create("node", true, { title = "Hello", secret = "hidden" })) + local ok, meta = service:get_node_metadata("node", "nobody"); + assert.truthy(ok, meta); + assert.same({ title = "Hello" }, meta); + end) + end); end);
--- a/util/pubsub.lua Fri Nov 08 10:31:25 2024 +0000 +++ b/util/pubsub.lua Fri Nov 08 02:11:00 2024 +0100 @@ -11,6 +11,7 @@ itemcheck = function () return true; end; get_affiliation = function () end; normalize_jid = function (jid) return jid; end; + metadata_subset = {}; capabilities = { outcast = { create = false; @@ -45,6 +46,7 @@ get_subscription = true; get_subscriptions = true; get_items = false; + get_metadata = true; subscribe_other = false; unsubscribe_other = false; @@ -67,6 +69,7 @@ get_subscription = true; get_subscriptions = true; get_items = true; + get_metadata = true; subscribe_other = false; unsubscribe_other = false; @@ -90,6 +93,7 @@ get_subscription = true; get_subscriptions = true; get_items = true; + get_metadata = true; subscribe_other = false; unsubscribe_other = false; @@ -115,6 +119,7 @@ get_subscription = true; get_subscriptions = true; get_items = true; + get_metadata = true; subscribe_other = true; @@ -872,6 +877,20 @@ return true, config_table; end +function service:get_node_metadata(node, actor) + if not self:may(node, actor, "get_metadata") then + return false, "forbidden"; + end + + local ok, config = self:get_node_config(node, true); + if not ok then return ok, config; end + local meta = {}; + for _, k in ipairs(self.config.metadata_subset) do + meta[k] = config[k]; + end + return true, meta; +end + return { new = new; };