mod_remote_roster/mod_remote_roster.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:26:26 +0100
changeset 5063 5f1120c284c5
parent 758 295ae44b8a01
child 5380 ad6e9b0fd15b
permissions -rw-r--r--
mod_cloud_notify_extensions: Add note about dependency Noting here because people might not click through to see it on the mod_cloud_notify_encrypted page.
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);