annotate mod_remote_roster/mod_remote_roster.lua @ 5296:0f5657db1cfc

mod_isolate_host: handle server-generated stanzas The hook for setting the no_host_isolation is only called for c2s sessions. This does not work for stanzas generated by the server, such as PEP notifications or presence probe answers. To handle that, we do per-stanza checks for the case that the origin is local.
author Jonas Schäfer <jonas@wielicki.name>
date Sat, 01 Apr 2023 12:03:08 +0200
parents 295ae44b8a01
children ad6e9b0fd15b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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);