Diff

mod_proxy65/mod_proxy65.lua @ 66:b86ae5e21a56

mod_proxy65: done! Who wants to test? :)
author Thilo Cestonaro <thilo@cestona.ro>
date Wed, 28 Oct 2009 23:29:37 +0100
parent 65:a35eb0764ac6
child 68:0df3e4d1f1a3
line wrap: on
line diff
--- a/mod_proxy65/mod_proxy65.lua	Wed Oct 28 00:03:28 2009 +0100
+++ b/mod_proxy65/mod_proxy65.lua	Wed Oct 28 23:29:37 2009 +0100
@@ -57,16 +57,14 @@
 end
 
 function connlistener.listener(conn, data)
-	module:log("debug", "listener called....")
 	local session = sessions[conn];
-
-	if data ~= nil then module:log("debug", bin2hex(data)); end
-	if not session and data ~= nil and data:byte() == string.char(5):byte() and data:len() > 2 then
+	
+	if session == nil and data ~= nil and data:sub(1):byte() == 0x05 and data:len() > 2 then
 		local nmethods = data:sub(2):byte();
 		local methods = data:sub(3);
 		local supported = false;
 		for i=1, nmethods, 1 do
-			if(methods:sub(i):byte() == string.char(0):byte()) then
+			if(methods:sub(i):byte() == 0x00) then -- 0x00 == method: NO AUTH
 				supported = true;
 				break;
 			end
@@ -77,24 +75,39 @@
 			sessions[conn] = session;
 			session.send(string.char(5, 0));
 		end
-	elseif data ~= nil and data:len() > 6 and 
-		data:sub(1):byte() == string.char(5):byte() and -- SOCKS5 has 5 in first byte
-		data:sub(2):byte() == string.char(1):byte() and -- CMD must be 1
-		data:sub(3):byte() == string.char(0):byte() and -- RSV must be 0
-		data:sub(4):byte() == string.char(3):byte() and -- ATYP must be 3		
-		data:sub(-2):byte() == string.char(0):byte() and data:sub(-1):byte() == string.char(0):byte() -- PORT must be 0, size 2 byte		
-	then
-		local sha = data:sub(6, data:len() - 2);
-		module:log("debug", "gotten sha: >%s<", sha);
-		if transfers[sha] == nil then
-			transfers[sha] = {};
-			transfers[sha].target = conn;
-			module:log("debug", "target connected ... ");
-		elseif transfers[sha].target ~= nil then
-			transfers[sha].initiator = conn;
-			module:log("debug", "initiator connected ... ");
+		return;
+	end
+	if session ~= nil then
+		if session.sha ~= nil and transfers[session.sha] ~= nil then
+			local sha = session.sha;
+			if transfers[sha].activated == true and transfers[sha].initiator == conn and transfers[sha].target ~= nil then
+				transfers[sha].target.write(data);
+				return;
+			end
 		end
-		session.send(string.char(5, 0, 0, 3, 40) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte)
+		if data ~= nil and data:len() == 0x2F and  -- 40 == length of SHA1 HASH, and 7 other bytes => 47 => 0x2F
+			data:sub(1):byte() == 0x05 and -- SOCKS5 has 5 in first byte
+			data:sub(2):byte() == 0x01 and -- CMD must be 1
+			data:sub(3):byte() == 0x00 and -- RSV must be 0
+			data:sub(4):byte() == 0x03 and -- ATYP must be 3
+			data:sub(5):byte() == 40 and -- SHA1 HASH length must be 64 (0x40)
+			data:sub(-2):byte() == 0x00 and -- PORT must be 0, size 2 byte
+			data:sub(-1):byte() == 0x00 		
+		then
+			local sha = data:sub(6, 45); -- second param is not count! it's the ending index (included!)
+			if transfers[sha] == nil then
+				transfers[sha] = {};
+				transfers[sha].activated = false;
+				transfers[sha].target = conn;
+				session.sha = sha;
+				module:log("debug", "target connected ... ");
+			elseif transfers[sha].target ~= nil then
+				transfers[sha].initiator = conn;
+				session.sha = sha;
+				module:log("debug", "initiator connected ... ");
+			end
+			session.send(string.char(5, 0, 0, 3, sha:len()) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte)
+		end
 	end
 end
 
@@ -186,7 +199,6 @@
 		error("Proxy65: Could not establish a connection listener. Check your configuration please.");
 	else
 		connlistener.handler = connlisteners_start('proxy65');
-		module:log("debug", "Connection listener registered ... ")
 		module:add_item("proxy65", {jid=_host, name=_name})
 		component = component_register(_host, function(origin, stanza)
 			local to_node, to_host, to_resource = jid_split(stanza.attr.to);
@@ -208,13 +220,12 @@
 				elseif stanza.name == "iq" and type == "set" then
 					local reply, from, to, sid = set_activation(stanza);
 					if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then
-						module:log("debug", "need to build sha1 of data: from: %s, to: %s, sid: %s", from, to, sid);
 						local sha = sha1(sid .. from .. to, true);
-						module:log("debug", "generated sha: %s", sha);
-						if(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then
+						if transfers[sha] == nil then
+							module:log("error", "transfers[sha]: nil");
+						elseif(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then
 							origin.send(reply);
-							forward(transfers[sha].initiator, transfers[sha].target);
-							transfers[sha] = nil;
+							transfers[sha].activated = true;
 						end
 					end
 				end