author | Matthew Wild <mwild1@gmail.com> |
Fri, 20 Mar 2009 20:16:25 +0000 | |
changeset 896 | 2c0b9e3c11c3 |
parent 760 | 90ce865eebd8 |
child 916 | f0743928ef7e |
permissions | -rw-r--r-- |
896 | 1 |
-- Prosody IM v0.4 |
760
90ce865eebd8
Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
2 |
-- Copyright (C) 2008-2009 Matthew Wild |
90ce865eebd8
Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
3 |
-- Copyright (C) 2008-2009 Waqas Hussain |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
438
diff
changeset
|
4 |
-- |
758 | 5 |
-- This project is MIT/X11 licensed. Please see the |
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 | 10 |
|
11 |
local st = require "util.stanza" |
|
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 | 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 | 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 | 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 | 83 |
r_item.subscription = session.roster[item.attr.jid].subscription; |
132 | 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 | 114 |
end |
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); |