X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_roster.lua;h=52c61a2601daacefd54bc4a4f20e51ecd58879ba;hb=04cac3474b5d2ef6b40863e683ddb78997d739ee;hp=554ef2e59044a85cf2a37918880792c331356498;hpb=5dd6384aa54a7245faa18b685dce6544f9cb66d7;p=prosody.git diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua index 554ef2e5..52c61a26 100644 --- a/plugins/mod_roster.lua +++ b/plugins/mod_roster.lua @@ -1,4 +1,4 @@ --- Prosody IM v0.4 +-- Prosody IM -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 Waqas Hussain -- @@ -15,17 +15,16 @@ local jid_prep = require "util.jid".prep; local t_concat = table.concat; local tostring = tostring; -local handle_presence = require "core.presencemanager".handle_presence; local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; local rm_add_to_roster = require "core.rostermanager".add_to_roster; local rm_roster_push = require "core.rostermanager".roster_push; -local core_route_stanza = core_route_stanza; +local core_post_stanza = core_post_stanza; module:add_feature("jabber:iq:roster"); local rosterver_stream_feature = st.stanza("ver", {xmlns="urn:xmpp:features:rosterver"}):tag("optional"):up(); module:add_event_hook("stream-features", - function (session, features) + function (session, features) if session.username then features:add_child(rosterver_stream_feature); end @@ -35,12 +34,12 @@ module:add_iq_handler("c2s", "jabber:iq:roster", function (session, stanza) if stanza.tags[1].name == "query" then if stanza.attr.type == "get" then - local roster = st.reply(stanza) - :query("jabber:iq:roster"); + local roster = st.reply(stanza); local ver = stanza.tags[1].attr.ver if (not ver) or tonumber(ver) ~= (session.roster[false].version or 1) then + roster:query("jabber:iq:roster"); -- Client does not support versioning, or has stale roster for jid in pairs(session.roster) do if jid ~= "pending" and jid then @@ -75,20 +74,20 @@ module:add_iq_handler("c2s", "jabber:iq:roster", if not resource and host then if jid ~= from_node.."@"..from_host then if item.attr.subscription == "remove" then - local r_item = session.roster[jid]; + local roster = session.roster; + local r_item = roster[jid]; if r_item then + local to_bare = node and (node.."@"..host) or host; -- bare JID + if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then + core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); + end + if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then + core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=to_bare})); + end local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, jid); if success then session.send(st.reply(stanza)); rm_roster_push(from_node, from_host, jid); - local to_bare = node and (node.."@"..host) or host; -- bare JID - if r_item.subscription == "both" or r_item.subscription == "from" then - handle_presence(session, st.presence({type="unsubscribed"}), from_bare, to_bare, - core_route_stanza, false); - elseif r_item.subscription == "both" or r_item.subscription == "to" then - handle_presence(session, st.presence({type="unsubscribe"}), from_bare, to_bare, - core_route_stanza, false); - end else session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); end @@ -114,19 +113,25 @@ module:add_iq_handler("c2s", "jabber:iq:roster", end local success, err_type, err_cond, err_msg = rm_add_to_roster(session, jid, r_item); if success then + -- Ok, send success session.send(st.reply(stanza)); + -- and push change to all resources rm_roster_push(from_node, from_host, jid); else + -- Adding to roster failed session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); end end else + -- Trying to add self to roster session.send(st.error_reply(stanza, "cancel", "not-allowed")); end else + -- Invalid JID added to roster session.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME what's the correct error? end else + -- Roster set didn't include a single item, or its name wasn't 'item' session.send(st.error_reply(stanza, "modify", "bad-request")); end return true;