Diff

plugins/muc/muc.lib.lua @ 1778:f4213d84ba8a

MUC: Correct routing of vCard requests to bare JID.
author Waqas Hussain <waqas20@gmail.com>
date Sun, 13 Sep 2009 23:52:09 +0500
parent 1769:39865fbbb2f7
child 1808:e164fdb2d18f
line wrap: on
line diff
--- a/plugins/muc/muc.lib.lua	Sat Sep 12 03:45:19 2009 +0500
+++ b/plugins/muc/muc.lib.lua	Sun Sep 13 23:52:09 2009 +0500
@@ -16,6 +16,8 @@
 local multitable_new = require "util.multitable".new;
 local t_insert, t_remove = table.insert, table.remove;
 local setmetatable = setmetatable;
+local base64 = require "util.encodings".base64;
+local md5 = require "util.hashes".md5;
 
 local muc_domain = nil; --module:get_host();
 local history_length = 20;
@@ -291,8 +293,28 @@
 		elseif type ~= 'result' then -- bad type
 			origin.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME correct error?
 		end
-	elseif not current_nick and type ~= "error" and type ~= "result" then -- not in room
-		origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
+	elseif not current_nick then -- not in room
+		if type == "error" or type == "result" then
+			local id = stanza.name == "iq" and stanza.attr.id and base64.decode(stanza.attr.id);
+			local _nick, _id, _hash = (id or ""):match("^(.+)%z(.*)%z(.+)$");
+			local occupant = self._occupants[stanza.attr.to];
+			if occupant and _nick and self._jid_nick[_nick] and _id and _hash then
+				local id, _to = stanza.attr.id;
+				for jid in pairs(occupant.sessions) do
+					if md5(jid) == _hash then
+						_to = jid;
+						break;
+					end
+				end
+				if _to then
+					stanza.attr.to, stanza.attr.from, stanza.attr.id = _to, self._jid_nick[_nick], _id;
+					self:route_stanza(stanza);
+					stanza.attr.to, stanza.attr.from, stanza.attr.id = to, from, id;
+				end
+			end
+		else
+			origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
+		end
 	elseif stanza.name == "message" and type == "groupchat" then -- groupchat messages not allowed in PM
 		origin.send(st.error_reply(stanza, "modify", "bad-request"));
 	else -- private stanza
@@ -300,10 +322,15 @@
 		if o_data then
 			log("debug", "%s sent private stanza to %s (%s)", from, to, o_data.jid);
 			local jid = o_data.jid;
+			local bare = jid_bare(jid);
 			stanza.attr.to, stanza.attr.from = jid, current_nick;
-			-- TODO if stanza.name=='iq' and type=='get' and stanza.tags[1].attr.xmlns == 'vcard-temp' then jid = jid_bare(jid); end
+			local id = stanza.attr.id;
+			if stanza.name=='iq' and type=='get' and stanza.tags[1].attr.xmlns == 'vcard-temp' and bare ~= jid then
+				stanza.attr.to = bare;
+				stanza.attr.id = base64.encode(jid.."\0"..id.."\0"..md5(from));
+			end
 			self:route_stanza(stanza);
-			stanza.attr.to, stanza.attr.from = to, from;
+			stanza.attr.to, stanza.attr.from, stanza.attr.id = to, from, id;
 		elseif type ~= "error" and type ~= "result" then -- recipient not in room
 			origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room"));
 		end