Merge from Matthew. datamanager.simplesave fix

Thu, 09 Oct 2008 03:01:47 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Thu, 09 Oct 2008 03:01:47 +0500
changeset 87
059ef1c30844
parent 86
a2085854c72c (diff)
parent 82
cbf387f29d56 (current diff)
child 88
023320150c65

Merge from Matthew. datamanager.simplesave fix

util/datamanager.lua file | annotate | diff | comparison | revisions
--- a/core/modulemanager.lua	Wed Oct 08 22:42:51 2008 +0100
+++ b/core/modulemanager.lua	Thu Oct 09 03:01:47 2008 +0500
@@ -50,6 +50,7 @@
 	load("roster");
 	load("register");
 	load("tls");
+	load("vcard");
 end
 
 function load(name)
--- a/core/stanza_router.lua	Wed Oct 08 22:42:51 2008 +0100
+++ b/core/stanza_router.lua	Thu Oct 09 03:01:47 2008 +0500
@@ -16,9 +16,12 @@
 function core_process_stanza(origin, stanza)
 	log("debug", "Received: "..tostring(stanza))
 	-- TODO verify validity of stanza (as well as JID validity)
+	if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
+		error("Invalid IQ");
+	end
 
 	if origin.type == "c2s" and not origin.full_jid
-		and not(stanza.name == "iq" and stanza.tags[1] and stanza.tags[1].name == "bind"
+		and not(stanza.name == "iq" and stanza.tags[1].name == "bind"
 				and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
 		error("Client MUST bind resource after auth");
 	end
@@ -29,6 +32,8 @@
 	
 	if not to or (hosts[to] and hosts[to].type == "local") then
 		core_handle_stanza(origin, stanza);
+	elseif to and stanza.name == "iq" and not select(3, jid_split(to)) then
+		core_handle_stanza(origin, stanza);
 	elseif origin.type == "c2s" then
 		core_route_stanza(origin, stanza);
 	end
--- a/plugins/mod_register.lua	Wed Oct 08 22:42:51 2008 +0100
+++ b/plugins/mod_register.lua	Thu Oct 09 03:01:47 2008 +0500
@@ -29,7 +29,8 @@
 						if usermanager_create_user(username, password, session.host) then -- password change -- TODO is this the right way?
 							send(session, st.reply(stanza));
 						else
-							-- TODO internal error, unable to write file, file may be locked, etc
+							-- TODO unable to write file, file may be locked, etc, what's the correct error?
+							send(session, st.error_reply(stanza, "wait", "internal-server-error"));
 						end
 					else
 						send(session, st.error_reply(stanza, "modify", "bad-request"));
@@ -70,7 +71,8 @@
 						if usermanager_create_user(username, password, session.host) then
 							send(session, st.reply(stanza)); -- user created!
 						else
-							-- TODO internal error, unable to write file, file may be locked, etc
+							-- TODO unable to write file, file may be locked, etc, what's the correct error?
+							send(session, st.error_reply(stanza, "wait", "internal-server-error"));
 						end
 					end
 				else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/mod_vcard.lua	Thu Oct 09 03:01:47 2008 +0500
@@ -0,0 +1,54 @@
+
+require "util.datamanager"
+local datamanager = datamanager;
+
+local st = require "util.stanza"
+local send = require "core.sessionmanager".send_to_session
+local t_concat, t_insert = table.concat, table.insert;
+
+require "util.jid"
+local jid_split = jid.split;
+
+add_iq_handler("c2s", "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 = datamanager.load(node, host, "vCard"); -- load vCard for user or server
+						end
+					else
+						vCard = datamanager.load(session.username, session.host, "vCard");-- load user's own vCard
+					end
+					if vCard then
+						local iq = st.reply(stanza);
+						iq:add_child(vCard);
+						send(session, iq); -- send vCard!
+					else
+						send(session, 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", stanza.tags[1]) then
+							send(session, st.reply(stanza));
+						else
+							-- TODO unable to write file, file may be locked, etc, what's the correct error?
+							send(session, st.error_reply(stanza, "wait", "internal-server-error"));
+						end
+					else
+						send(session, st.error_reply(stanza, "auth", "forbidden"));
+					end
+				end
+				return true;
+			end
+		end);
+
+add_event_hook("stream-features", 
+					function (session, features)												
+						if session.full_jid then
+							t_insert(features, "<feature var='vcard-temp'/>");
+						end
+					end);
--- a/util/datamanager.lua	Wed Oct 08 22:42:51 2008 +0100
+++ b/util/datamanager.lua	Thu Oct 09 03:01:47 2008 +0500
@@ -56,7 +56,13 @@
 ------- API -------------
 
 function getpath(username, host, datastore)
-	return format("data/%s/%s/%s.dat", encode(host), datastore, encode(username));
+	if username then
+		return format("data/%s/%s/%s.dat", encode(host), datastore, encode(username));
+	elseif host then
+		return format("data/%s/%s.dat", encode(host), datastore);
+	else
+		return format("data/%s.dat", datastore);
+	end
 end
 
 function load(username, host, datastore)

mercurial