# HG changeset patch # User Kim Alvefur # Date 1548636544 -3600 # Node ID eb4724f20b1e24da3a36a8b0a1c7e5df3481c529 # Parent fed614598f884da4d5fdc922a01a637985440c37# Parent 7aad9eb7f050c87093eaebce3cceff594f3d6526 Merge 0.11->trunk diff -r fed614598f88 -r eb4724f20b1e plugins/mod_pubsub/pubsub.lib.lua --- a/plugins/mod_pubsub/pubsub.lib.lua Sat Jan 26 15:07:11 2019 +0100 +++ b/plugins/mod_pubsub/pubsub.lib.lua Mon Jan 28 01:49:04 2019 +0100 @@ -295,14 +295,20 @@ function handlers.get_items(origin, stanza, items, service) local node = items.attr.node; - local item = items:get_child("item"); - local item_id = item and item.attr.id; + + local requested_items = {}; + for item in items:childtags("item") do + table.insert(requested_items, item.attr.id); + end + if requested_items[1] == nil then + requested_items = nil; + end if not node then origin.send(pubsub_error_reply(stanza, "nodeid-required")); return true; end - local ok, results = service:get_items(node, stanza.attr.from, item_id); + local ok, results = service:get_items(node, stanza.attr.from, requested_items); if not ok then origin.send(pubsub_error_reply(stanza, results)); return true; diff -r fed614598f88 -r eb4724f20b1e spec/util_pubsub_spec.lua --- a/spec/util_pubsub_spec.lua Sat Jan 26 15:07:11 2019 +0100 +++ b/spec/util_pubsub_spec.lua Mon Jan 28 01:49:04 2019 +0100 @@ -170,6 +170,37 @@ end); + describe("the thing", function () + randomize(false); -- These tests are ordered + + local service = pubsub.new(); + + it("creates a node with some items", function () + assert.truthy(service:create("node", true, { max_items = 3 })); + assert.truthy(service:publish("node", true, "1", "item 1")); + assert.truthy(service:publish("node", true, "2", "item 2")); + assert.truthy(service:publish("node", true, "3", "item 3")); + end); + + it("should return the requested item", function () + local ok, ret = service:get_items("node", true, "1"); + assert.truthy(ok); + assert.same({ "1", ["1"] = "item 1" }, ret); + end); + + it("should return multiple requested items", function () + local ok, ret = service:get_items("node", true, { "1", "2" }); + assert.truthy(ok); + assert.same({ + "1", + "2", + ["1"] = "item 1", + ["2"] = "item 2", + }, ret); + end); + end); + + describe("node config", function () local service; before_each(function () diff -r fed614598f88 -r eb4724f20b1e util/pubsub.lua --- a/util/pubsub.lua Sat Jan 26 15:07:11 2019 +0100 +++ b/util/pubsub.lua Mon Jan 28 01:49:04 2019 +0100 @@ -600,7 +600,7 @@ return true end -function service:get_items(node, actor, id) --> (true, { id, [id] = node }) or (false, err) +function service:get_items(node, actor, ids) --> (true, { id, [id] = node }) or (false, err) -- Access checking if not self:may(node, actor, "get_items") then return false, "forbidden"; @@ -610,20 +610,25 @@ if not node_obj then return false, "item-not-found"; end - if id then -- Restrict results to a single specific item - local with_id = self.data[node]:get(id); - if not with_id then - return true, { }; + if type(ids) == "string" then -- COMPAT see #1305 + ids = { ids }; + end + local data = {}; + if ids then + for _, key in ipairs(ids) do + local value = self.data[node]:get(key); + if value then + data[#data+1] = key; + data[key] = value; + end end - return true, { id, [id] = with_id }; else - local data = {} for key, value in self.data[node]:items() do data[#data+1] = key; data[key] = value; end - return true, data; end + return true, data; end function service:get_last_item(node, actor) --> (true, id, node) or (false, err)