From 501e9d634bdbbe40cbbedb930f5479a5bd383c33 Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Sat, 29 Dec 2018 21:47:51 +0100
Subject: util.pubsub: Restore subscription index from stored data (fixes
 #1281)

---
 spec/util_pubsub_spec.lua | 30 ++++++++++++++++++++++++++++++
 util/pubsub.lua           | 14 ++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/spec/util_pubsub_spec.lua b/spec/util_pubsub_spec.lua
index c44832f7..6386100b 100644
--- a/spec/util_pubsub_spec.lua
+++ b/spec/util_pubsub_spec.lua
@@ -375,4 +375,34 @@ describe("util.pubsub", function ()
 			end);
 		end);
 	end);
+
+	describe("restoring data from nodestore", function ()
+		local nodestore = {
+			data = {
+				test = {
+					name = "test";
+					config = {};
+					affiliations = {};
+					subscribers = {
+						["someone"] = true;
+					};
+				}
+			}
+		};
+		function nodestore:users()
+			return pairs(self.data)
+		end
+		function nodestore:get(key)
+			return self.data[key];
+		end
+		local service = pubsub.new({
+			nodestore = nodestore;
+		});
+		it("subscriptions", function ()
+			local ok, ret = service:get_subscriptions(nil, true, nil)
+			assert.is_true(ok);
+			assert.same({ { node = "test", jid = "someone", subscription = true, } }, ret);
+		end);
+	end);
+
 end);
diff --git a/util/pubsub.lua b/util/pubsub.lua
index fafae50a..47e526a7 100644
--- a/util/pubsub.lua
+++ b/util/pubsub.lua
@@ -177,6 +177,20 @@ local function new(config)
 		for node_name in config.nodestore:users() do
 			service.nodes[node_name] = load_node_from_store(service, node_name);
 			service.data[node_name] = config.itemstore(service.nodes[node_name].config, node_name);
+
+			for jid in pairs(service.nodes[node_name].subscribers) do
+				local normal_jid = service.config.normalize_jid(jid);
+				local subs = service.subscriptions[normal_jid];
+				if subs then
+					if not subs[jid] then
+						subs[jid] = { [node_name] = true };
+					else
+						subs[jid][node_name] = true;
+					end
+				else
+					service.subscriptions[normal_jid] = { [jid] = { [node_name] = true } };
+				end
+			end
 		end
 	end
 
-- 
cgit v1.2.3