mod_vcard: Add vcard_compatibility option to handle vcard stanzas routed to the full JID by ejabberd MUC rooms

Thu, 15 Oct 2009 23:21:55 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 15 Oct 2009 23:21:55 +0100
changeset 1956
ec04b571fa86
parent 1955
a9a8ef70d14c
child 1957
5856b2dcf81e

mod_vcard: Add vcard_compatibility option to handle vcard stanzas routed to the full JID by ejabberd MUC rooms

plugins/mod_vcard.lua file | annotate | diff | comparison | revisions
--- a/plugins/mod_vcard.lua	Thu Oct 15 14:20:08 2009 +0100
+++ b/plugins/mod_vcard.lua	Thu Oct 15 23:21:55 2009 +0100
@@ -17,44 +17,58 @@
 local jid = require "util.jid"
 local jid_split = jid.split;
 
-module:add_feature("vcard-temp");
+local xmlns_vcard = "vcard-temp";
+
+module:add_feature(xmlns_vcard);
 
-module:add_iq_handler({"c2s", "s2sin", "component"}, "vcard-temp", 
-		function (session, stanza)
-			if stanza.tags[1].name == "vCard" then
-				local to = stanza.attr.to;
-				if stanza.attr.type == "get" then
-					local vCard;
-					if to then
-						local node, host = jid_split(to);
-						if hosts[host] and hosts[host].type == "local" then
-							vCard = st.deserialize(datamanager.load(node, host, "vcard")); -- load vCard for user or server
-						end
-					else
-						vCard = st.deserialize(datamanager.load(session.username, session.host, "vcard"));-- load user's own vCard
-					end
-					if vCard then
-						session.send(st.reply(stanza):add_child(vCard)); -- send vCard!
-					else
-						session.send(st.error_reply(stanza, "cancel", "item-not-found"));
-					end
-				elseif stanza.attr.type == "set" then
-					if not to or to == session.username.."@"..session.host then
-						if datamanager.store(session.username, session.host, "vcard", st.preserialize(stanza.tags[1])) then
-							session.send(st.reply(stanza));
-						else
-							-- TODO unable to write file, file may be locked, etc, what's the correct error?
-							session.send(st.error_reply(stanza, "wait", "internal-server-error"));
-						end
-					else
-						session.send(st.error_reply(stanza, "auth", "forbidden"));
-					end
+function handle_vcard(session, stanza)
+	if stanza.tags[1].name == "vCard" then
+		local to = stanza.attr.to;
+		if stanza.attr.type == "get" then
+			local vCard;
+			if to then
+				local node, host = jid_split(to);
+				if hosts[host] and hosts[host].type == "local" then
+					vCard = st.deserialize(datamanager.load(node, host, "vcard")); -- load vCard for user or server
 				end
-				return true;
+			else
+				vCard = st.deserialize(datamanager.load(session.username, session.host, "vcard"));-- load user's own vCard
+			end
+			if vCard then
+				session.send(st.reply(stanza):add_child(vCard)); -- send vCard!
+			else
+				session.send(st.error_reply(stanza, "cancel", "item-not-found"));
+			end
+		elseif stanza.attr.type == "set" then
+			if not to or to == session.username.."@"..session.host then
+				if datamanager.store(session.username, session.host, "vcard", st.preserialize(stanza.tags[1])) then
+					session.send(st.reply(stanza));
+				else
+					-- TODO unable to write file, file may be locked, etc, what's the correct error?
+					session.send(st.error_reply(stanza, "wait", "internal-server-error"));
+				end
+			else
+				session.send(st.error_reply(stanza, "auth", "forbidden"));
 			end
-		end);
+		end
+		return true;
+	end
+end
+
+module:add_iq_handler({"c2s", "s2sin", "component"}, xmlns_vcard, handle_vcard);
 
-local feature_vcard_attr = { var='vcard-temp' };
+-- COMPAT: https://support.process-one.net/browse/EJAB-1045
+if module:get_option("vcard_compatibility") then
+	module:hook("iq/full", function (data)
+		local stanza = data.stanza;
+		if stanza.attr.type == "get" and stanza.tags[1] 
+			and stanza.tags[1].attr.xmlns == xmlns_vcard then
+				return handle_vcard(data.origin, stanza);
+		end
+	end, 1);
+end
+
+local feature_vcard_attr = { var=xmlns_vcard };
 module:add_event_hook("stream-features",
 					function (session, features)
 						if session.type == "c2s" then

mercurial