Diff

plugins/mod_roster.lua @ 916:f0743928ef7e

core.rostermanager/mod_roster: Support for roster versioning
author Matthew Wild <mwild1@gmail.com>
date Mon, 23 Mar 2009 00:31:29 +0000
parent 896:2c0b9e3c11c3
child 928:92288c13d7bc
line wrap: on
line diff
--- a/plugins/mod_roster.lua	Sun Mar 22 20:50:37 2009 +0000
+++ b/plugins/mod_roster.lua	Mon Mar 23 00:31:29 2009 +0000
@@ -12,6 +12,7 @@
 
 local jid_split = require "util.jid".split;
 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;
@@ -27,19 +28,26 @@
 				if stanza.attr.type == "get" then
 					local roster = st.reply(stanza)
 								:query("jabber:iq:roster");
-					for jid in pairs(session.roster) do
-						if jid ~= "pending" then
-							roster:tag("item", {
-								jid = jid,
-								subscription = session.roster[jid].subscription,
-								ask = session.roster[jid].ask,
-								name = session.roster[jid].name,
-							});
-							for group in pairs(session.roster[jid].groups) do
-								roster:tag("group"):text(group):up();
+					
+					local ver = stanza.tags[1].attr.ver
+					
+					if (not ver) or tonumber(ver) ~= (session.roster[false].version or 1) then
+						-- Client does not support versioning, or has stale roster
+						for jid in pairs(session.roster) do
+							if jid ~= "pending" and jid then
+								roster:tag("item", {
+									jid = jid,
+									subscription = session.roster[jid].subscription,
+									ask = session.roster[jid].ask,
+									name = session.roster[jid].name,
+								});
+								for group in pairs(session.roster[jid].groups) do
+									roster:tag("group"):text(group):up();
+								end
+								roster:up(); -- move out from item
 							end
-							roster:up(); -- move out from item
 						end
+						roster.tags[1].attr.ver = tostring(session.roster[false].version or "1");
 					end
 					session.send(roster);
 					session.interested = true; -- resource is interested in roster updates
@@ -47,7 +55,8 @@
 				elseif stanza.attr.type == "set" then
 					local query = stanza.tags[1];
 					if #query.tags == 1 and query.tags[1].name == "item"
-							and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid
+							and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid 
+							-- Protection against overwriting roster.pending, until we move it
 							and query.tags[1].attr.jid ~= "pending" then
 						local item = query.tags[1];
 						local from_node, from_host = jid_split(stanza.attr.from);