plugins/mod_roster.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 30 Jan 2009 17:22:56 +0000
changeset 758 b1885732e979
parent 615 4ae3e81513f3
child 759 5cccfb5da6cb
permissions -rw-r--r--
GPL->MIT!
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
615
4ae3e81513f3 0.1 -> 0.2
Matthew Wild <mwild1@gmail.com>
parents: 609
diff changeset
     1
-- Prosody IM v0.2
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     2
-- Copyright (C) 2008 Matthew Wild
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     3
-- Copyright (C) 2008 Waqas Hussain
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     4
-- 
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     8
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     9
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
local st = require "util.stanza"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    13
local jid_split = require "util.jid".split;
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    14
local t_concat = table.concat;
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    15
609
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    16
local handle_presence = require "core.presencemanager".handle_presence;
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    17
local rm_remove_from_roster = require "core.rostermanager".remove_from_roster;
110
bb5ac5976a97 Fixed: Roster support
Waqas Hussain <waqas20@gmail.com>
parents: 108
diff changeset
    18
local rm_add_to_roster = require "core.rostermanager".add_to_roster;
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    19
local rm_roster_push = require "core.rostermanager".roster_push;
609
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    20
local core_route_stanza = core_route_stanza;
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    21
541
3521e0851c9e Change modules to use the new add_feature module API method.
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
    22
module:add_feature("jabber:iq:roster");
421
63be85693710 Modules now sending disco replies
Waqas Hussain <waqas20@gmail.com>
parents: 326
diff changeset
    23
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 421
diff changeset
    24
module:add_iq_handler("c2s", "jabber:iq:roster", 
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
		function (session, stanza)
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    26
			if stanza.tags[1].name == "query" then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    27
				if stanza.attr.type == "get" then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    28
					local roster = st.reply(stanza)
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    29
								:query("jabber:iq:roster");
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    30
					for jid in pairs(session.roster) do
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    31
						if jid ~= "pending" then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    32
							roster:tag("item", {
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    33
								jid = jid,
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    34
								subscription = session.roster[jid].subscription,
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    35
								ask = session.roster[jid].ask,
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    36
								name = session.roster[jid].name,
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    37
							});
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    38
							for group in pairs(session.roster[jid].groups) do
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    39
								roster:tag("group"):text(group):up();
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    40
							end
193
13ac34255c37 mod_roster fix
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    41
							roster:up(); -- move out from item
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    42
						end
102
a5b914370db5 Fixed: mod_roster now outputs all roster data (instead of just the JIDs)
Waqas Hussain <waqas20@gmail.com>
parents: 79
diff changeset
    43
					end
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
    44
					session.send(roster);
114
bed2a8508cf5 Added session property for interested resources
Waqas Hussain <waqas20@gmail.com>
parents: 110
diff changeset
    45
					session.interested = true; -- resource is interested in roster updates
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    46
					return true;
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    47
				elseif stanza.attr.type == "set" then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    48
					local query = stanza.tags[1];
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    49
					if #query.tags == 1 and query.tags[1].name == "item"
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    50
							and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 132
diff changeset
    51
							and query.tags[1].attr.jid ~= "pending" then
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    52
						local item = query.tags[1];
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    53
						local from_node, from_host = jid_split(stanza.attr.from);
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    54
						local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    55
						local node, host, resource = jid_split(item.attr.jid);
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    56
						local to_bare = node and (node.."@"..host) or host; -- bare JID
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    57
						if not resource and host then
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    58
							if item.attr.jid ~= from_node.."@"..from_host then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    59
								if item.attr.subscription == "remove" then
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    60
									local r_item = session.roster[item.attr.jid];
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    61
									if r_item then
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    62
										local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, item.attr.jid);
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    63
										if success then
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
    64
											session.send(st.reply(stanza));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    65
											rm_roster_push(from_node, from_host, item.attr.jid);
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    66
											if r_item.subscription == "both" or r_item.subscription == "from" then
609
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    67
												handle_presence(session, st.presence({type="unsubscribed"}), from_bare, to_bare,
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    68
													core_route_stanza, false);
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    69
											elseif r_item.subscription == "both" or r_item.subscription == "to" then
609
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    70
												handle_presence(session, st.presence({type="unsubscribe"}), from_bare, to_bare,
64849cfa9869 Changed mod_roster to use the newer presence manager API
Waqas Hussain <waqas20@gmail.com>
parents: 541
diff changeset
    71
													core_route_stanza, false);
326
99a8317d1235 Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
Waqas Hussain <waqas20@gmail.com>
parents: 299
diff changeset
    72
											end
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    73
										else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
    74
											session.send(st.error_reply(stanza, err_type, err_cond, err_msg));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    75
										end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    76
									else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
    77
										session.send(st.error_reply(stanza, "modify", "item-not-found"));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    78
									end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    79
								else
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    80
									local r_item = {name = item.attr.name, groups = {}};
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    81
									if r_item.name == "" then r_item.name = nil; end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    82
									if session.roster[item.attr.jid] then
110
bb5ac5976a97 Fixed: Roster support
Waqas Hussain <waqas20@gmail.com>
parents: 108
diff changeset
    83
										r_item.subscription = session.roster[item.attr.jid].subscription;
132
9a4aa57af367 Roster updates
Waqas Hussain <waqas20@gmail.com>
parents: 114
diff changeset
    84
										r_item.ask = session.roster[item.attr.jid].ask;
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    85
									else
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    86
										r_item.subscription = "none";
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    87
									end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    88
									for _, child in ipairs(item) do	
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    89
										if child.name == "group" then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    90
											local text = t_concat(child);
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    91
											if text and text ~= "" then
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    92
												r_item.groups[text] = true;
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    93
											end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    94
										end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    95
									end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    96
									local success, err_type, err_cond, err_msg = rm_add_to_roster(session, item.attr.jid, r_item);
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    97
									if success then
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
    98
										session.send(st.reply(stanza));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
    99
										rm_roster_push(from_node, from_host, item.attr.jid);
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   100
									else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
   101
										session.send(st.error_reply(stanza, err_type, err_cond, err_msg));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   102
									end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   103
								end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   104
							else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
   105
								session.send(st.error_reply(stanza, "cancel", "not-allowed"));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   106
							end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   107
						else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
   108
							session.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME what's the correct error?
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   109
						end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   110
					else
299
300b5a201ad3 Fix mod_roster to use session.send for sending stanzas
Matthew Wild <mwild1@gmail.com>
parents: 193
diff changeset
   111
						session.send(st.error_reply(stanza, "modify", "bad-request"));
108
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   112
					end
1d79da482c5d Added: More complete implementation for mod_roster
Waqas Hussain <waqas20@gmail.com>
parents: 102
diff changeset
   113
					return true;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
				end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
			end
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 421
diff changeset
   116
		end);