util/pubsub.lua
author Kim Alvefur <zash@zash.se>
Fri, 13 Jul 2018 04:41:59 +0200
changeset 9034 d1a4b1b78695
parent 8959 82f92af4b0f3
child 9078 46d4322f7eed
permissions -rw-r--r--
util.pubsub: Support for returning *all* subscriptions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4365
6704b3cd032e util.pubsub: Support for events (currently subscription-added and subscription-removed)
Matthew Wild <mwild1@gmail.com>
parents: 4364
diff changeset
     1
local events = require "util.events";
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
     2
local cache = require "util.cache";
4365
6704b3cd032e util.pubsub: Support for events (currently subscription-added and subscription-removed)
Matthew Wild <mwild1@gmail.com>
parents: 4364
diff changeset
     3
8504
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
     4
local service_mt = {};
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
8503
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
     6
local default_config = {
8336
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
     7
	itemstore = function (config, _) return cache.new(config["max_items"]) end;
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
     8
	broadcaster = function () end;
8697
059183e5571e util.pubsub: Allow setting a callback for validating items to be published
Kim Alvefur <zash@zash.se>
parents: 8505
diff changeset
     9
	itemcheck = function () return true; end;
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    10
	get_affiliation = function () end;
8813
9f8a746f99c1 util.pubsub: Add a default/fallback JID normalization function
Kim Alvefur <zash@zash.se>
parents: 8812
diff changeset
    11
	normalize_jid = function (jid) return jid; end;
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    12
	capabilities = {};
8503
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    13
};
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    14
local default_config_mt = { __index = default_config };
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    15
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    16
local default_node_config = {
8336
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
    17
	["persist_items"] = false;
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8329
diff changeset
    18
	["max_items"] = 20;
8503
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    19
};
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    20
local default_node_config_mt = { __index = default_node_config };
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    21
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    22
-- Storage helper functions
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    23
8953
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    24
local function load_node_from_store(service, node_name)
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    25
	local node = service.config.nodestore:get(node_name);
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    26
	node.config = setmetatable(node.config or {}, {__index=service.node_defaults});
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    27
	return node;
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    28
end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    29
8953
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    30
local function save_node_to_store(service, node)
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    31
	return service.config.nodestore:set(node.name, {
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    32
		name = node.name;
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    33
		config = node.config;
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    34
		subscribers = node.subscribers;
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    35
		affiliations = node.affiliations;
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    36
	});
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    37
end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    38
8955
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
    39
local function delete_node_in_store(service, node_name)
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
    40
	return service.config.nodestore:set(node_name, nil);
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
    41
end
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
    42
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    43
-- Create and return a new service object
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6518
diff changeset
    44
local function new(config)
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    45
	config = config or {};
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    46
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    47
	local service = setmetatable({
8503
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    48
		config = setmetatable(config, default_config_mt);
9bf00d0734c8 util.pubsub: For clarity, split config tables from their metatables
Matthew Wild <mwild1@gmail.com>
parents: 8404
diff changeset
    49
		node_defaults = setmetatable(config.node_defaults or {}, default_node_config_mt);
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    50
		affiliations = {};
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
    51
		subscriptions = {};
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    52
		nodes = {};
5972
f365d3c8fd2c util.pubsub: Separate data from node configuration
Kim Alvefur <zash@zash.se>
parents: 5971
diff changeset
    53
		data = {};
4365
6704b3cd032e util.pubsub: Support for events (currently subscription-added and subscription-removed)
Matthew Wild <mwild1@gmail.com>
parents: 4364
diff changeset
    54
		events = events.new();
3909
c2dc7f7eed94 util.pubsub: Modify new() to take a config, and add a default config via a metatable
Matthew Wild <mwild1@gmail.com>
parents: 3759
diff changeset
    55
	}, service_mt);
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    56
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    57
	-- Load nodes from storage, if we have a store and it supports iterating over stored items
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    58
	if config.nodestore and config.nodestore.users then
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    59
		for node_name in config.nodestore:users() do
8953
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
    60
			service.nodes[node_name] = load_node_from_store(service, node_name);
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    61
			service.data[node_name] = config.itemstore(service.nodes[node_name].config, node_name);
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    62
		end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    63
	end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    64
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
    65
	return service;
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
end
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
8504
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
    68
--- Service methods
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
    69
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
    70
local service = {};
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
    71
service_mt.__index = service;
8d9e2c2095dd util.pubsub: Move service methods object creation (just code reorganisation)
Matthew Wild <mwild1@gmail.com>
parents: 8503
diff changeset
    72
3934
4bd994df7296 util.pubsub: Add service:jids_equal() and new config option normalize_jid
Matthew Wild <mwild1@gmail.com>
parents: 3931
diff changeset
    73
function service:jids_equal(jid1, jid2)
4bd994df7296 util.pubsub: Add service:jids_equal() and new config option normalize_jid
Matthew Wild <mwild1@gmail.com>
parents: 3931
diff changeset
    74
	local normalize = self.config.normalize_jid;
4bd994df7296 util.pubsub: Add service:jids_equal() and new config option normalize_jid
Matthew Wild <mwild1@gmail.com>
parents: 3931
diff changeset
    75
	return normalize(jid1) == normalize(jid2);
4bd994df7296 util.pubsub: Add service:jids_equal() and new config option normalize_jid
Matthew Wild <mwild1@gmail.com>
parents: 3931
diff changeset
    76
end
4bd994df7296 util.pubsub: Add service:jids_equal() and new config option normalize_jid
Matthew Wild <mwild1@gmail.com>
parents: 3931
diff changeset
    77
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    78
function service:may(node, actor, action)
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    79
	if actor == true then return true; end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5675
diff changeset
    80
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    81
	local node_obj = self.nodes[node];
8819
0f9d5cfa84f9 util.pubsub: Also check for affiliation set on bare JID
Kim Alvefur <zash@zash.se>
parents: 8816
diff changeset
    82
	local node_aff = node_obj and (node_obj.affiliations[actor]
0f9d5cfa84f9 util.pubsub: Also check for affiliation set on bare JID
Kim Alvefur <zash@zash.se>
parents: 8816
diff changeset
    83
	              or node_obj.affiliations[self.config.normalize_jid(actor)]);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    84
	local service_aff = self.affiliations[actor]
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    85
	                 or self.config.get_affiliation(actor, node, action)
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    86
	                 or "none";
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5675
diff changeset
    87
4099
5c0b7947f0ef util.pubsub: Some tidying/optimisation to service:may()
Matthew Wild <mwild1@gmail.com>
parents: 3945
diff changeset
    88
	-- Check if node allows/forbids it
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    89
	local node_capabilities = node_obj and node_obj.capabilities;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    90
	if node_capabilities then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    91
		local caps = node_capabilities[node_aff or service_aff];
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    92
		if caps then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    93
			local can = caps[action];
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    94
			if can ~= nil then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    95
				return can;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    96
			end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    97
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
    98
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5675
diff changeset
    99
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   100
	-- Check service-wide capabilities instead
4099
5c0b7947f0ef util.pubsub: Some tidying/optimisation to service:may()
Matthew Wild <mwild1@gmail.com>
parents: 3945
diff changeset
   101
	local service_capabilities = self.config.capabilities;
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   102
	local caps = service_capabilities[node_aff or service_aff];
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   103
	if caps then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   104
		local can = caps[action];
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   105
		if can ~= nil then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   106
			return can;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   107
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   108
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5675
diff changeset
   109
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   110
	return false;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   111
end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   112
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   113
function service:set_affiliation(node, actor, jid, affiliation)
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   114
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   115
	if not self:may(node, actor, "set_affiliation") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   116
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   117
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   118
	--
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   119
	local node_obj = self.nodes[node];
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   120
	if not node_obj then
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
		return false, "item-not-found";
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   122
	end
8944
f0beba9c2822 util.pubsub: Fix typo
Kim Alvefur <zash@zash.se>
parents: 8939
diff changeset
   123
	jid = self.config.normalize_jid(jid);
8957
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   124
	local old_affiliation = node_obj.affiliations[jid];
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   125
	node_obj.affiliations[jid] = affiliation;
8957
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   126
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   127
	if self.config.nodestore then
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   128
		local ok, err = save_node_to_store(self, node_obj);
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   129
		if not ok then
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   130
			node_obj.affiliations[jid] = old_affiliation;
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   131
			return ok, "internal-server-error";
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   132
		end
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   133
	end
3b6095686498 util.pubsub: Persistence on affiliation change
Kim Alvefur <zash@zash.se>
parents: 8955
diff changeset
   134
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   135
	local _, jid_sub = self:get_subscription(node, true, jid);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   136
	if not jid_sub and not self:may(node, jid, "be_unsubscribed") then
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   137
		local ok, err = self:add_subscription(node, true, jid);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   138
		if not ok then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   139
			return ok, err;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   140
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   141
	elseif jid_sub and not self:may(node, jid, "be_subscribed") then
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   142
		local ok, err = self:add_subscription(node, true, jid);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   143
		if not ok then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   144
			return ok, err;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   145
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   146
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   147
	return true;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   148
end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   149
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   150
function service:add_subscription(node, actor, jid, options)
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   151
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   152
	local cap;
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   153
	if actor == true or jid == actor or self:jids_equal(actor, jid) then
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   154
		cap = "subscribe";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   155
	else
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   156
		cap = "subscribe_other";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   157
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   158
	if not self:may(node, actor, cap) then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   159
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   160
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   161
	if not self:may(node, jid, "be_subscribed") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   162
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   163
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   164
	--
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   165
	local node_obj = self.nodes[node];
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   166
	if not node_obj then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   167
		if not self.config.autocreate_on_subscribe then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   168
			return false, "item-not-found";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   169
		else
4364
af40cf682eba util.pubsub: Use built-in actor for auto-creating nodes on publish and subscribe (so they never fail due to permissions)
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   170
			local ok, err = self:create(node, true);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   171
			if not ok then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   172
				return ok, err;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   173
			end
3936
61f12f8a8539 util.pubsub: Fix traceback when using autocreate-on-subscribe
Matthew Wild <mwild1@gmail.com>
parents: 3934
diff changeset
   174
			node_obj = self.nodes[node];
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   175
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   176
	end
8958
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   177
	local old_subscription = node_obj.subscribers[jid];
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   178
	node_obj.subscribers[jid] = options or true;
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   179
	local normal_jid = self.config.normalize_jid(jid);
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   180
	local subs = self.subscriptions[normal_jid];
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   181
	if subs then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   182
		if not subs[jid] then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   183
			subs[jid] = { [node] = true };
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   184
		else
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   185
			subs[jid][node] = true;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   186
		end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   187
	else
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   188
		self.subscriptions[normal_jid] = { [jid] = { [node] = true } };
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   189
	end
8958
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   190
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   191
	if self.config.nodestore then
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   192
		local ok, err = save_node_to_store(self, node_obj);
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   193
		if not ok then
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   194
			node_obj.subscribers[jid] = old_subscription;
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   195
			self.subscriptions[normal_jid][jid][node] = old_subscription and true or nil;
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   196
			return ok, "internal-server-error";
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   197
		end
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   198
	end
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   199
4365
6704b3cd032e util.pubsub: Support for events (currently subscription-added and subscription-removed)
Matthew Wild <mwild1@gmail.com>
parents: 4364
diff changeset
   200
	self.events.fire_event("subscription-added", { node = node, jid = jid, normalized_jid = normal_jid, options = options });
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
	return true;
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
end
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
function service:remove_subscription(node, actor, jid)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   205
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   206
	local cap;
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   207
	if actor == true or jid == actor or self:jids_equal(actor, jid) then
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   208
		cap = "unsubscribe";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   209
	else
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   210
		cap = "unsubscribe_other";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   211
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   212
	if not self:may(node, actor, cap) then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   213
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   214
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   215
	if not self:may(node, jid, "be_unsubscribed") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   216
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   217
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   218
	--
3698
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   219
	local node_obj = self.nodes[node];
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   220
	if not node_obj then
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   221
		return false, "item-not-found";
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   222
	end
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   223
	if not node_obj.subscribers[jid] then
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   224
		return false, "not-subscribed";
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   225
	end
8958
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   226
	local old_subscription = node_obj.subscribers[jid];
3698
77171fd1dc3c mod_pubsub, util.pubsub: Support for unsubscribing
Florian Zeitz <florob@babelmonkeys.de>
parents: 3672
diff changeset
   227
	node_obj.subscribers[jid] = nil;
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   228
	local normal_jid = self.config.normalize_jid(jid);
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   229
	local subs = self.subscriptions[normal_jid];
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   230
	if subs then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   231
		local jid_subs = subs[jid];
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   232
		if jid_subs then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   233
			jid_subs[node] = nil;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   234
			if next(jid_subs) == nil then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   235
				subs[jid] = nil;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   236
			end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   237
		end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   238
		if next(subs) == nil then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   239
			self.subscriptions[normal_jid] = nil;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   240
		end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   241
	end
8958
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   242
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   243
	if self.config.nodestore then
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   244
		local ok, err = save_node_to_store(self, node_obj);
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   245
		if not ok then
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   246
			node_obj.subscribers[jid] = old_subscription;
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   247
			self.subscriptions[normal_jid][jid][node] = old_subscription and true or nil;
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   248
			return ok, "internal-server-error";
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   249
		end
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   250
	end
ca6a09cf2829 util.pubsub: Store subscription changes
Kim Alvefur <zash@zash.se>
parents: 8957
diff changeset
   251
4365
6704b3cd032e util.pubsub: Support for events (currently subscription-added and subscription-removed)
Matthew Wild <mwild1@gmail.com>
parents: 4364
diff changeset
   252
	self.events.fire_event("subscription-removed", { node = node, jid = jid, normalized_jid = normal_jid });
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   253
	return true;
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   254
end
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   255
3626
444f965baed8 util.pubsub: Add :get_subscription() to return the current subscription for a JID, if any
Matthew Wild <mwild1@gmail.com>
parents: 3619
diff changeset
   256
function service:get_subscription(node, actor, jid)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   257
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   258
	local cap;
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   259
	if actor == true or jid == actor or self:jids_equal(actor, jid) then
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   260
		cap = "get_subscription";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   261
	else
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   262
		cap = "get_subscription_other";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   263
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   264
	if not self:may(node, actor, cap) then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   265
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   266
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   267
	--
3626
444f965baed8 util.pubsub: Add :get_subscription() to return the current subscription for a JID, if any
Matthew Wild <mwild1@gmail.com>
parents: 3619
diff changeset
   268
	local node_obj = self.nodes[node];
3937
843ee23cc91a util.pubsub: Small code tidying for :get_subscription()
Matthew Wild <mwild1@gmail.com>
parents: 3936
diff changeset
   269
	if not node_obj then
843ee23cc91a util.pubsub: Small code tidying for :get_subscription()
Matthew Wild <mwild1@gmail.com>
parents: 3936
diff changeset
   270
		return false, "item-not-found";
3626
444f965baed8 util.pubsub: Add :get_subscription() to return the current subscription for a JID, if any
Matthew Wild <mwild1@gmail.com>
parents: 3619
diff changeset
   271
	end
3937
843ee23cc91a util.pubsub: Small code tidying for :get_subscription()
Matthew Wild <mwild1@gmail.com>
parents: 3936
diff changeset
   272
	return true, node_obj.subscribers[jid];
3626
444f965baed8 util.pubsub: Add :get_subscription() to return the current subscription for a JID, if any
Matthew Wild <mwild1@gmail.com>
parents: 3619
diff changeset
   273
end
444f965baed8 util.pubsub: Add :get_subscription() to return the current subscription for a JID, if any
Matthew Wild <mwild1@gmail.com>
parents: 3619
diff changeset
   274
6440
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   275
function service:create(node, actor, options)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   276
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   277
	if not self:may(node, actor, "create") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   278
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   279
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   280
	--
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   281
	if self.nodes[node] then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   282
		return false, "conflict";
3672
b24db47995ac mod_pubsub, util.pubsub: Support node creation
Florian Zeitz <florob@babelmonkeys.de>
parents: 3641
diff changeset
   283
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5675
diff changeset
   284
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   285
	self.nodes[node] = {
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   286
		name = node;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   287
		subscribers = {};
6440
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   288
		config = setmetatable(options or {}, {__index=self.node_defaults});
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   289
		affiliations = {};
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   290
	};
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   291
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   292
	if self.config.nodestore then
8953
03ba5b4f131a util.pubsub: Fix applying per service node defaults when loading from nodestore
Kim Alvefur <zash@zash.se>
parents: 8944
diff changeset
   293
		local ok, err = save_node_to_store(self, self.nodes[node]);
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   294
		if not ok then
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   295
			self.nodes[node] = nil;
8959
82f92af4b0f3 util.pubsub: Return error code known by pubsub.lib if persistent creation fails
Kim Alvefur <zash@zash.se>
parents: 8958
diff changeset
   296
			return ok, "internal-server-error";
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   297
		end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   298
	end
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   299
8214
5cbbe825d9d1 util.pubsub: Add a node parameter to itemstore().
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7730
diff changeset
   300
	self.data[node] = self.config.itemstore(self.nodes[node].config, node);
5971
637731f0b9a3 util.pubsub: Fire events on more actions
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   301
	self.events.fire_event("node-created", { node = node, actor = actor });
8812
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   302
	if actor ~= true then
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   303
		local ok, err = self:set_affiliation(node, true, actor, "owner");
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   304
		if not ok then
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   305
			self.nodes[node] = nil;
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   306
			self.data[node] = nil;
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   307
			return ok, err;
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   308
		end
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   309
	end
8505
6c2c2fc4b8dd util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
Matthew Wild <mwild1@gmail.com>
parents: 8504
diff changeset
   310
8812
6cba2df3817c util.pubsub: Don't record the superuser as owner on creation
Kim Alvefur <zash@zash.se>
parents: 8697
diff changeset
   311
	return true;
3672
b24db47995ac mod_pubsub, util.pubsub: Support node creation
Florian Zeitz <florob@babelmonkeys.de>
parents: 3641
diff changeset
   312
end
b24db47995ac mod_pubsub, util.pubsub: Support node creation
Florian Zeitz <florob@babelmonkeys.de>
parents: 3641
diff changeset
   313
5320
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   314
function service:delete(node, actor)
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   315
	-- Access checking
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   316
	if not self:may(node, actor, "delete") then
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   317
		return false, "forbidden";
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   318
	end
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   319
	--
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   320
	local node_obj = self.nodes[node];
5675
e29ece65e3b0 util.pubsub: Check whether node exists, when deleting
Florian Zeitz <florob@babelmonkeys.de>
parents: 5628
diff changeset
   321
	if not node_obj then
e29ece65e3b0 util.pubsub: Check whether node exists, when deleting
Florian Zeitz <florob@babelmonkeys.de>
parents: 5628
diff changeset
   322
		return false, "item-not-found";
e29ece65e3b0 util.pubsub: Check whether node exists, when deleting
Florian Zeitz <florob@babelmonkeys.de>
parents: 5628
diff changeset
   323
	end
5320
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   324
	self.nodes[node] = nil;
8315
6fd36e73082b util.pubsub: Clear data on node deletion
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
   325
	if self.data[node] and self.data[node].clear then
6fd36e73082b util.pubsub: Clear data on node deletion
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
   326
		self.data[node]:clear();
6fd36e73082b util.pubsub: Clear data on node deletion
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
   327
	end
5972
f365d3c8fd2c util.pubsub: Separate data from node configuration
Kim Alvefur <zash@zash.se>
parents: 5971
diff changeset
   328
	self.data[node] = nil;
8955
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   329
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   330
	if self.config.nodestore then
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   331
		local ok, err = delete_node_in_store(self, node);
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   332
		if not ok then
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   333
			self.nodes[node] = nil;
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   334
			return ok, err;
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   335
		end
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   336
	end
15bb54f96dd1 util.pubsub: Remove node from persistent storage on deletion
Kim Alvefur <zash@zash.se>
parents: 8954
diff changeset
   337
5971
637731f0b9a3 util.pubsub: Fire events on more actions
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   338
	self.events.fire_event("node-deleted", { node = node, actor = actor });
8816
2c55fccb0c0c util.pubsub: Pass node and service objects to broadcaster to allow eg config access
Kim Alvefur <zash@zash.se>
parents: 8813
diff changeset
   339
	self.config.broadcaster("delete", node, node_obj.subscribers, nil, actor, node_obj, self);
5320
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   340
	return true;
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   341
end
518d864b2ab8 mod_pubsub, util.pubsub: Add delete action
Kim Alvefur <zash@zash.se>
parents: 5315
diff changeset
   342
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   343
function service:publish(node, actor, id, item)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   344
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   345
	if not self:may(node, actor, "publish") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   346
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   347
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   348
	--
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   349
	local node_obj = self.nodes[node];
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   350
	if not node_obj then
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   351
		if not self.config.autocreate_on_publish then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   352
			return false, "item-not-found";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   353
		end
4364
af40cf682eba util.pubsub: Use built-in actor for auto-creating nodes on publish and subscribe (so they never fail due to permissions)
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   354
		local ok, err = self:create(node, true);
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   355
		if not ok then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   356
			return ok, err;
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   357
		end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   358
		node_obj = self.nodes[node];
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   359
	end
8697
059183e5571e util.pubsub: Allow setting a callback for validating items to be published
Kim Alvefur <zash@zash.se>
parents: 8505
diff changeset
   360
	if not self.config.itemcheck(item) then
059183e5571e util.pubsub: Allow setting a callback for validating items to be published
Kim Alvefur <zash@zash.se>
parents: 8505
diff changeset
   361
		return nil, "internal-server-error";
059183e5571e util.pubsub: Allow setting a callback for validating items to be published
Kim Alvefur <zash@zash.se>
parents: 8505
diff changeset
   362
	end
5972
f365d3c8fd2c util.pubsub: Separate data from node configuration
Kim Alvefur <zash@zash.se>
parents: 5971
diff changeset
   363
	local node_data = self.data[node];
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   364
	local ok = node_data:set(id, item);
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   365
	if not ok then
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   366
		return nil, "internal-server-error";
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   367
	end
8220
5f4e0d67b82a util.pubsub: Catch overriden id from storage
Kim Alvefur <zash@zash.se>
parents: 8215
diff changeset
   368
	if type(ok) == "string" then id = ok; end
5181
1e9508ae44cc util.pubsub: Add item-published event
Matthew Wild <mwild1@gmail.com>
parents: 4367
diff changeset
   369
	self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item });
8816
2c55fccb0c0c util.pubsub: Pass node and service objects to broadcaster to allow eg config access
Kim Alvefur <zash@zash.se>
parents: 8813
diff changeset
   370
	self.config.broadcaster("items", node, node_obj.subscribers, item, actor, node_obj, self);
3619
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   371
	return true;
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   372
end
291ae816d800 mod_pubsub: It's aliiiive!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   373
3699
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   374
function service:retract(node, actor, id, retract)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   375
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   376
	if not self:may(node, actor, "retract") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   377
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   378
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   379
	--
3699
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   380
	local node_obj = self.nodes[node];
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   381
	if (not node_obj) or (not self.data[node]:get(id)) then
3699
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   382
		return false, "item-not-found";
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   383
	end
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   384
	local ok = self.data[node]:set(id, nil);
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   385
	if not ok then
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   386
		return nil, "internal-server-error";
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   387
	end
5971
637731f0b9a3 util.pubsub: Fire events on more actions
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   388
	self.events.fire_event("item-retracted", { node = node, actor = actor, id = id });
3699
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   389
	if retract then
8816
2c55fccb0c0c util.pubsub: Pass node and service objects to broadcaster to allow eg config access
Kim Alvefur <zash@zash.se>
parents: 8813
diff changeset
   390
		self.config.broadcaster("items", node, node_obj.subscribers, retract, actor, node_obj, self);
3699
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   391
	end
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   392
	return true
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   393
end
150e58d69e60 mod_pubsub: Support item retraction
Florian Zeitz <florob@babelmonkeys.de>
parents: 3698
diff changeset
   394
5312
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   395
function service:purge(node, actor, notify)
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   396
	-- Access checking
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   397
	if not self:may(node, actor, "retract") then
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   398
		return false, "forbidden";
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   399
	end
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   400
	--
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   401
	local node_obj = self.nodes[node];
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   402
	if not node_obj then
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   403
		return false, "item-not-found";
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   404
	end
8300
ac5c90230c2c util.pubsub: Clear data store if it supports being cleared, otherwise fall back to creating a new one
Kim Alvefur <zash@zash.se>
parents: 8223
diff changeset
   405
	if self.data[node] and self.data[node].clear then
ac5c90230c2c util.pubsub: Clear data store if it supports being cleared, otherwise fall back to creating a new one
Kim Alvefur <zash@zash.se>
parents: 8223
diff changeset
   406
		self.data[node]:clear()
ac5c90230c2c util.pubsub: Clear data store if it supports being cleared, otherwise fall back to creating a new one
Kim Alvefur <zash@zash.se>
parents: 8223
diff changeset
   407
	else
ac5c90230c2c util.pubsub: Clear data store if it supports being cleared, otherwise fall back to creating a new one
Kim Alvefur <zash@zash.se>
parents: 8223
diff changeset
   408
		self.data[node] = self.config.itemstore(self.nodes[node].config, node);
ac5c90230c2c util.pubsub: Clear data store if it supports being cleared, otherwise fall back to creating a new one
Kim Alvefur <zash@zash.se>
parents: 8223
diff changeset
   409
	end
5971
637731f0b9a3 util.pubsub: Fire events on more actions
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   410
	self.events.fire_event("node-purged", { node = node, actor = actor });
5312
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   411
	if notify then
8816
2c55fccb0c0c util.pubsub: Pass node and service objects to broadcaster to allow eg config access
Kim Alvefur <zash@zash.se>
parents: 8813
diff changeset
   412
		self.config.broadcaster("purge", node, node_obj.subscribers, nil, actor, node_obj, self);
5312
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   413
	end
fdcd2ac7c22d mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
Florian Zeitz <florob@babelmonkeys.de>
parents: 5305
diff changeset
   414
	return true
5305
391b72fede9f mod_pubsub, util.pubsub: Implement the purge action
Kim Alvefur <zash@zash.se>
parents: 5181
diff changeset
   415
end
391b72fede9f mod_pubsub, util.pubsub: Implement the purge action
Kim Alvefur <zash@zash.se>
parents: 5181
diff changeset
   416
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   417
function service:get_items(node, actor, id)
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   418
	-- Access checking
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   419
	if not self:may(node, actor, "get_items") then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   420
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   421
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   422
	--
3641
3603aeb325de mod_pubsub, util.pubsub: Support for fetching items
Florian Zeitz <florob@babelmonkeys.de>
parents: 3626
diff changeset
   423
	local node_obj = self.nodes[node];
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   424
	if not node_obj then
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   425
		return false, "item-not-found";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   426
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   427
	if id then -- Restrict results to a single specific item
8319
8648cb171213 util.pubsub: Return item-not-found if a single item is requested, and not there
Kim Alvefur <zash@zash.se>
parents: 8315
diff changeset
   428
		local with_id = self.data[node]:get(id);
8648cb171213 util.pubsub: Return item-not-found if a single item is requested, and not there
Kim Alvefur <zash@zash.se>
parents: 8315
diff changeset
   429
		if not with_id then
8346
5df2f240173b util.pubsub: Return an empty list if specific item asked for does not exist (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   430
			return true, { };
8319
8648cb171213 util.pubsub: Return item-not-found if a single item is requested, and not there
Kim Alvefur <zash@zash.se>
parents: 8315
diff changeset
   431
		end
8648cb171213 util.pubsub: Return item-not-found if a single item is requested, and not there
Kim Alvefur <zash@zash.se>
parents: 8315
diff changeset
   432
		return true, { id, [id] = with_id };
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   433
	else
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   434
		local data = {}
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   435
		for key, value in self.data[node]:items() do
7729
29c20eefa306 util.pubsub: Fix item retrieval by including the item order as it was before using util.cache (thanks walduhu)
Kim Alvefur <zash@zash.se>
parents: 7706
diff changeset
   436
			data[#data+1] = key;
7698
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   437
			data[key] = value;
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   438
		end
56ce32cfd6d9 util.pubsub: Switch to use util.cache for item data
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   439
		return true, data;
3641
3603aeb325de mod_pubsub, util.pubsub: Support for fetching items
Florian Zeitz <florob@babelmonkeys.de>
parents: 3626
diff changeset
   440
	end
3603aeb325de mod_pubsub, util.pubsub: Support for fetching items
Florian Zeitz <florob@babelmonkeys.de>
parents: 3626
diff changeset
   441
end
3603aeb325de mod_pubsub, util.pubsub: Support for fetching items
Florian Zeitz <florob@babelmonkeys.de>
parents: 3626
diff changeset
   442
8379
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   443
function service:get_last_item(node, actor)
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   444
	-- Access checking
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   445
	if not self:may(node, actor, "get_items") then
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   446
		return false, "forbidden";
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   447
	end
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   448
	--
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   449
	return true, self.data[node]:tail();
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   450
end
eb6a9c314c86 util.pubsub: Add method for retreiving the last item (useful for sending on subscribe)
Kim Alvefur <zash@zash.se>
parents: 8346
diff changeset
   451
3759
1f7305784e12 util.pubsub: Add service:get_nodes()
Matthew Wild <mwild1@gmail.com>
parents: 3699
diff changeset
   452
function service:get_nodes(actor)
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   453
	-- Access checking
3917
263a133bdf5a util.pubsub: Fix nil global access in get_nodes()
Matthew Wild <mwild1@gmail.com>
parents: 3910
diff changeset
   454
	if not self:may(nil, actor, "get_nodes") then
3910
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   455
		return false, "forbidden";
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   456
	end
80fe910f912a util.pubsub: Too many changes to list or split sensibly. Added access control to all methods, with capabilities support. Renamed get() -> get_items() and changed it to return true, result on success. Support for autocreate_on_subscribe and autocreate_on_publish config options.
Matthew Wild <mwild1@gmail.com>
parents: 3909
diff changeset
   457
	--
3759
1f7305784e12 util.pubsub: Add service:get_nodes()
Matthew Wild <mwild1@gmail.com>
parents: 3699
diff changeset
   458
	return true, self.nodes;
1f7305784e12 util.pubsub: Add service:get_nodes()
Matthew Wild <mwild1@gmail.com>
parents: 3699
diff changeset
   459
end
1f7305784e12 util.pubsub: Add service:get_nodes()
Matthew Wild <mwild1@gmail.com>
parents: 3699
diff changeset
   460
9034
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   461
local function flatten_subscriptions(ret, serv, subs, node, node_obj)
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   462
	for subscribed_jid, subscribed_nodes in pairs(subs) do
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   463
		if node then -- Return only subscriptions to this node
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   464
			if subscribed_nodes[node] then
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   465
				ret[#ret+1] = {
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   466
					node = node;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   467
					jid = subscribed_jid;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   468
					subscription = node_obj.subscribers[subscribed_jid];
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   469
				};
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   470
			end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   471
		else -- Return subscriptions to all nodes
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   472
			local nodes = serv.nodes;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   473
			for subscribed_node in pairs(subscribed_nodes) do
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   474
				ret[#ret+1] = {
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   475
					node = subscribed_node;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   476
					jid = subscribed_jid;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   477
					subscription = nodes[subscribed_node].subscribers[subscribed_jid];
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   478
				};
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   479
			end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   480
		end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   481
	end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   482
end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   483
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   484
function service:get_subscriptions(node, actor, jid)
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   485
	-- Access checking
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   486
	local cap;
4100
69e3f1e7111e util.pubsub: Pass true instead of nil as the actor in a bunch of places, and fix a bunch of methods to not traceback on this (those with *_other capability checking).
Matthew Wild <mwild1@gmail.com>
parents: 4099
diff changeset
   487
	if actor == true or jid == actor or self:jids_equal(actor, jid) then
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   488
		cap = "get_subscriptions";
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   489
	else
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   490
		cap = "get_subscriptions_other";
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   491
	end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   492
	if not self:may(node, actor, cap) then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   493
		return false, "forbidden";
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   494
	end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   495
	--
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   496
	local node_obj;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   497
	if node then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   498
		node_obj = self.nodes[node];
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   499
		if not node_obj then
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   500
			return false, "item-not-found";
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   501
		end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   502
	end
9034
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   503
	local ret = {};
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   504
	if jid == nil then
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   505
		for _, subs in pairs(self.subscriptions) do
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   506
			flatten_subscriptions(ret, self, subs, node, node_obj)
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   507
		end
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   508
		return true, ret;
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   509
	end
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   510
	local normal_jid = self.config.normalize_jid(jid);
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   511
	local subs = self.subscriptions[normal_jid];
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   512
	-- We return the subscription object from the node to save
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   513
	-- a get_subscription() call for each node.
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   514
	if subs then
9034
d1a4b1b78695 util.pubsub: Support for returning *all* subscriptions
Kim Alvefur <zash@zash.se>
parents: 8959
diff changeset
   515
		flatten_subscriptions(ret, self, subs, node, node_obj)
3938
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   516
	end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   517
	return true, ret;
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   518
end
a3ecaf46bd82 util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
Matthew Wild <mwild1@gmail.com>
parents: 3937
diff changeset
   519
3928
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   520
-- Access models only affect 'none' affiliation caps, service/default access level...
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   521
function service:set_node_capabilities(node, actor, capabilities)
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   522
	-- Access checking
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   523
	if not self:may(node, actor, "configure") then
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   524
		return false, "forbidden";
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   525
	end
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   526
	--
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   527
	local node_obj = self.nodes[node];
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   528
	if not node_obj then
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   529
		return false, "item-not-found";
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   530
	end
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   531
	node_obj.capabilities = capabilities;
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   532
	return true;
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   533
end
4dfb345e33ec util.pubsub: Add service:set_node_capabilities()
Matthew Wild <mwild1@gmail.com>
parents: 3917
diff changeset
   534
6440
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   535
function service:set_node_config(node, actor, new_config)
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   536
	if not self:may(node, actor, "configure") then
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   537
		return false, "forbidden";
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   538
	end
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   539
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   540
	local node_obj = self.nodes[node];
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   541
	if not node_obj then
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   542
		return false, "item-not-found";
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   543
	end
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   544
8954
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   545
	local old_config = node_obj.config;
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   546
	node_obj.config = setmetatable(new_config, {__index=self.node_defaults});
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   547
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   548
	if self.config.nodestore then
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   549
		local ok, err = save_node_to_store(self, node_obj);
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   550
		if not ok then
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   551
			node_obj.config = old_config;
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   552
			return ok, "internal-server-error";
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   553
		end
6440
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   554
	end
8404
f1923a79c93d util.pubsub: Recreate itemstore if persist_items changes or resize it if max_items changes
Kim Alvefur <zash@zash.se>
parents: 8385
diff changeset
   555
8954
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   556
	if old_config["persist_items"] ~= node_obj.config["persist_items"] then
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   557
		self.data[node] = self.config.itemstore(self.nodes[node].config, node);
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   558
	elseif old_config["max_items"] ~= node_obj.config["max_items"] then
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   559
		self.data[node]:resize(self.nodes[node].config["max_items"]);
9baac001fccb util.pubsub: Persist nodes on configuration change
Kim Alvefur <zash@zash.se>
parents: 8953
diff changeset
   560
	end
8404
f1923a79c93d util.pubsub: Recreate itemstore if persist_items changes or resize it if max_items changes
Kim Alvefur <zash@zash.se>
parents: 8385
diff changeset
   561
6440
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   562
	return true;
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   563
end
3f1f11dfdf10 util.pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 6439
diff changeset
   564
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6518
diff changeset
   565
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6518
diff changeset
   566
	new = new;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6518
diff changeset
   567
};