Software /
code /
prosody
Comparison
plugins/mod_roster.lua @ 108:1d79da482c5d
Added: More complete implementation for mod_roster
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Fri, 17 Oct 2008 22:20:03 +0500 |
parent | 102:a5b914370db5 |
child | 110:bb5ac5976a97 |
comparison
equal
deleted
inserted
replaced
107:8d8debda3df2 | 108:1d79da482c5d |
---|---|
1 | 1 |
2 local st = require "util.stanza" | 2 local st = require "util.stanza" |
3 local send = require "core.sessionmanager".send_to_session | 3 local send = require "core.sessionmanager".send_to_session |
4 | 4 |
5 local jid_split = require "util.jid".split; | |
6 local t_concat = table.concat; | |
7 | |
8 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; | |
9 local rm_roster_push = require "core.rostermanager".roster_push; | |
10 | |
5 add_iq_handler("c2s", "jabber:iq:roster", | 11 add_iq_handler("c2s", "jabber:iq:roster", |
6 function (session, stanza) | 12 function (session, stanza) |
7 if stanza.attr.type == "get" then | 13 if stanza.tags[1].name == "query" then |
8 local roster = st.reply(stanza) | 14 if stanza.attr.type == "get" then |
9 :query("jabber:iq:roster"); | 15 local roster = st.reply(stanza) |
10 for jid in pairs(session.roster) do | 16 :query("jabber:iq:roster"); |
11 local item = st.stanza("item", { | 17 for jid in pairs(session.roster) do |
12 jid = jid, | 18 local item = st.stanza("item", { |
13 subscription = session.roster[jid].subscription, | 19 jid = jid, |
14 name = session.roster[jid].name, | 20 subscription = session.roster[jid].subscription, |
15 }); | 21 name = session.roster[jid].name, |
16 for group in pairs(session.roster[jid].groups) do | 22 }); |
17 item:tag("group"):text(group):up(); | 23 for group in pairs(session.roster[jid].groups) do |
24 item:tag("group"):text(group):up(); | |
25 end | |
26 roster:add_child(item); | |
18 end | 27 end |
19 roster:add_child(item); | 28 send(session, roster); |
29 return true; | |
30 elseif stanza.attr.type == "set" then | |
31 local query = stanza.tags[1]; | |
32 if #query.tags == 1 and query.tags[1].name == "item" | |
33 and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid then | |
34 local item = query.tags[1]; | |
35 local from_node, from_host = jid_split(stanza.attr.from); | |
36 local node, host, resource = jid_split(item.attr.jid); | |
37 if not resource then | |
38 if item.attr.jid ~= from_node.."@"..from_host then | |
39 if item.attr.subscription == "remove" then | |
40 if session.roster[item.attr.jid] then | |
41 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, item.attr.jid); | |
42 if success then | |
43 send(session, st.reply(stanza)); | |
44 rm_roster_push(from_node, from_host, item.attr.jid); | |
45 else | |
46 send(session, st.error_reply(stanza, err_type, err_cond, err_msg)); | |
47 end | |
48 else | |
49 send(session, st.error_reply(stanza, "modify", "item-not-found")); | |
50 end | |
51 else | |
52 local r_item = {name = item.attr.name, groups = {}}; | |
53 if r_item.name == "" then r_item.name = nil; end | |
54 if session.roster[item.attr.jid] then | |
55 r_item.subscription = session.roster[item.attr.jid]; | |
56 else | |
57 r_item.subscription = "none"; | |
58 end | |
59 for _, child in ipairs(item) do | |
60 if child.name == "group" then | |
61 local text = t_concat(child); | |
62 if text and text ~= "" then | |
63 r_item.groups[text] = true; | |
64 end | |
65 end | |
66 end | |
67 local success, err_type, err_cond, err_msg = rm_add_to_roster(session, item.attr.jid, r_item); | |
68 if success then | |
69 send(session, st.reply(stanza)); | |
70 rm_roster_push(from_node, from_host, item.attr.jid); | |
71 else | |
72 send(session, st.error_reply(stanza, err_type, err_cond, err_msg)); | |
73 end | |
74 end | |
75 else | |
76 send(session, st.error_reply(stanza, "cancel", "not-allowed")); | |
77 end | |
78 else | |
79 send(session, st.error_reply(stanza, "modify", "bad-request")); -- FIXME what's the correct error? | |
80 end | |
81 else | |
82 send(session, st.error_reply(stanza, "modify", "bad-request")); | |
83 end | |
84 return true; | |
20 end | 85 end |
21 send(session, roster); | |
22 return true; | |
23 end | 86 end |
24 end); | 87 end); |