mod_remote_roster/mod_remote_roster.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 14 Jan 2023 14:31:37 +0000
changeset 5153 fa56ed2bacab
parent 758 295ae44b8a01
child 5380 ad6e9b0fd15b
permissions -rw-r--r--
mod_unified_push: Add support for multiple token backends, including stoage Now that we have ACLs by default, it is no longer necessary to be completely stateless. On 0.12, using storage has benefits over JWT, because it does not expose client JIDs to the push apps/services. In trunk, PASETO is stateless and does not expose client JIDs.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
--
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
-- mod_remote_roster
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
--
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
-- This is an experimental implementation of http://jkaluza.fedorapeople.org/remote-roster.html
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
--
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
local st = require "util.stanza";
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
local jid_split = require "util.jid".split;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
local jid_prep = require "util.jid".prep;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
local t_concat = table.concat;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local tonumber = tonumber;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
local pairs, ipairs = pairs, ipairs;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
local hosts = hosts;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
local load_roster = require "core.rostermanager".load_roster;
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    16
local save_roster = require "core.rostermanager".save_roster;
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
local rm_remove_from_roster = require "core.rostermanager".remove_from_roster;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
local rm_add_to_roster = require "core.rostermanager".add_to_roster;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
local rm_roster_push = require "core.rostermanager".roster_push;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
local user_exists = require "core.usermanager".user_exists;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
local add_task = require "util.timer".add_task;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
module:hook("iq-get/bare/jabber:iq:roster:query", function(event)
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
	local origin, stanza = event.origin, event.stanza;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
	
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
	if origin.type == "component" and stanza.attr.from == origin.host then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
		local node, host = jid_split(stanza.attr.to);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
		local roster = load_roster(node, host);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
		
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
		local reply = st.reply(stanza):query("jabber:iq:roster");
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
		for jid, item in pairs(roster) do
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
			if jid ~= "pending" and jid then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
				local node, host = jid_split(jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
				if host == origin.host then -- only include contacts which are on this component
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
					reply:tag("item", {
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
						jid = jid,
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
						subscription = item.subscription,
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
						ask = item.ask,
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
						name = item.name,
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    40
					});
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
					for group in pairs(item.groups) do
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
						reply:tag("group"):text(group):up();
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
					end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
					reply:up(); -- move out from item
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
				end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
			end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
		end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
		origin.send(reply);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
		--origin.interested = true; -- resource is interested in roster updates
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
		return true;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
	end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
end);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
module:hook("iq-set/bare/jabber:iq:roster:query", function(event)
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
	local session, stanza = event.origin, event.stanza;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
	
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
	if not(session.type == "component" and stanza.attr.from == session.host) then return; end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
	local from_node, from_host = jid_split(stanza.attr.to);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
	if not(user_exists(from_node, from_host)) then return; end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
	local roster = load_roster(from_node, from_host);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
	if not(roster) then return; end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
	local query = stanza.tags[1];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
	if #query.tags == 1 and query.tags[1].name == "item"
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
			and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
			-- Protection against overwriting roster.pending, until we move it
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
			and query.tags[1].attr.jid ~= "pending" then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
		local item = query.tags[1];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
		local jid = jid_prep(item.attr.jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
		local node, host, resource = jid_split(jid);
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    71
		if not resource and host == session.host then
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    72
			if jid ~= stanza.attr.to then -- not self-jid
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
				if item.attr.subscription == "remove" then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
					local r_item = roster[jid];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
					if r_item then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
						local to_bare = node and (node.."@"..host) or host; -- bare JID
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    77
						--if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then
758
295ae44b8a01 mod_remote_roster: Replace use of core_post_stanza() with module:send()
Kim Alvefur <zash@zash.se>
parents: 316
diff changeset
    78
						--	module:send(st.presence({type="unsubscribed", from=stanza.attr.to, to=to_bare}));
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    79
						--end
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    80
						--if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then
758
295ae44b8a01 mod_remote_roster: Replace use of core_post_stanza() with module:send()
Kim Alvefur <zash@zash.se>
parents: 316
diff changeset
    81
						--	module:send(st.presence({type="unsubscribe", from=stanza.attr.to, to=to_bare}));
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    82
						--end
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    83
						roster[jid] = nil;
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    84
						if save_roster(from_node, from_host, roster) then
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
							session.send(st.reply(stanza));
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
							rm_roster_push(from_node, from_host, jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
						else
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    88
							roster[jid] = item;
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
    89
							session.send(st.error_reply(stanza, "wait", "internal-server-error", "Unable to save roster"));
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
						end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
					else
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
						session.send(st.error_reply(stanza, "modify", "item-not-found"));
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
					end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
				else
316
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
    95
					local subscription = item.attr.subscription;
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
    96
					if subscription ~= "both" and subscription ~= "to" and subscription ~= "from" and subscription ~= "none" then -- TODO error on invalid
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
    97
						subscription = roster[jid] and roster[jid].subscription or "none";
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
    98
					end
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
					local r_item = {name = item.attr.name, groups = {}};
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
					if r_item.name == "" then r_item.name = nil; end
316
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
   101
					r_item.subscription = subscription;
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
   102
					if subscription ~= "both" and subscription ~= "to" then
c86fc337d56f mod_remote_roster: Let component set roster item subscription.
Waqas Hussain <waqas20@gmail.com>
parents: 315
diff changeset
   103
						r_item.ask = roster[jid] and roster[jid].ask;
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
					end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
					for _, child in ipairs(item) do
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
						if child.name == "group" then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
							local text = t_concat(child);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
							if text and text ~= "" then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
								r_item.groups[text] = true;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
							end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
						end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
					end
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
   113
					local olditem = roster[jid];
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
   114
					roster[jid] = r_item;
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
   115
					if save_roster(from_node, from_host, roster) then -- Ok, send success
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   116
						session.send(st.reply(stanza));
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   117
						-- and push change to all resources
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   118
						rm_roster_push(from_node, from_host, jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   119
					else -- Adding to roster failed
315
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
   120
						roster[jid] = olditem;
dead242beee3 mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents: 314
diff changeset
   121
						session.send(st.error_reply(stanza, "wait", "internal-server-error", "Unable to save roster"));
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   122
					end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   123
				end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   124
			else -- Trying to add self to roster
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   125
				session.send(st.error_reply(stanza, "cancel", "not-allowed"));
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   126
			end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   127
		else -- Invalid JID added to roster
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   128
			session.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME what's the correct error?
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   129
		end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   130
	else -- Roster set didn't include a single item, or its name wasn't  'item'
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   131
		session.send(st.error_reply(stanza, "modify", "bad-request"));
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   132
	end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   133
	return true;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   134
end);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   135
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   136
function component_roster_push(node, host, jid)
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   137
	local roster = load_roster(node, host);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   138
	if roster then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   139
		local item = roster[jid];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   140
		local contact_node, contact_host = jid_split(jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   141
		local stanza = st.iq({ type="set", from=node.."@"..host, to=contact_host }):query("jabber:iq:roster");
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   142
		if item then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   143
			stanza:tag("item", { jid = jid, subscription = item.subscription, name = item.name, ask = item.ask });
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   144
			for group in pairs(item.groups) do
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   145
				stanza:tag("group"):text(group):up();
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   146
			end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   147
		else
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   148
			stanza:tag("item", {jid = jid, subscription = "remove"});
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   149
		end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   150
		stanza:up(); -- move out from item
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   151
		stanza:up(); -- move out from stanza
758
295ae44b8a01 mod_remote_roster: Replace use of core_post_stanza() with module:send()
Kim Alvefur <zash@zash.se>
parents: 316
diff changeset
   152
		module:send(stanza);
314
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   153
	end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   154
end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   155
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   156
module:hook("iq-set/bare/jabber:iq:roster:query", function(event)
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   157
	local origin, stanza = event.origin, event.stanza;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   158
	local query = stanza.tags[1];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   159
	local item = query.tags[1];
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   160
	local contact_jid = item and item.name == "item" and item.attr.jid ~= "pending" and item.attr.jid;
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   161
	if contact_jid then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   162
		local contact_node, contact_host = jid_split(contact_jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   163
		if hosts[contact_host] and hosts[contact_host].type == "component" then
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   164
			local node, host = jid_split(stanza.attr.to or origin.full_jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   165
			add_task(0, function()
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   166
				component_roster_push(node, host, contact_jid);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   167
			end);
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   168
		end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   169
	end
df212e1fa576 mod_remote_roster: Initial commit. Implements 2.2, 2.3 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   170
end, 100);