comparison 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
parents a35eb0764ac6
children 0df3e4d1f1a3
comparison
equal deleted inserted replaced
65:a35eb0764ac6 66:b86ae5e21a56
55 55
56 return session; 56 return session;
57 end 57 end
58 58
59 function connlistener.listener(conn, data) 59 function connlistener.listener(conn, data)
60 module:log("debug", "listener called....")
61 local session = sessions[conn]; 60 local session = sessions[conn];
62 61
63 if data ~= nil then module:log("debug", bin2hex(data)); end 62 if session == nil and data ~= nil and data:sub(1):byte() == 0x05 and data:len() > 2 then
64 if not session and data ~= nil and data:byte() == string.char(5):byte() and data:len() > 2 then
65 local nmethods = data:sub(2):byte(); 63 local nmethods = data:sub(2):byte();
66 local methods = data:sub(3); 64 local methods = data:sub(3);
67 local supported = false; 65 local supported = false;
68 for i=1, nmethods, 1 do 66 for i=1, nmethods, 1 do
69 if(methods:sub(i):byte() == string.char(0):byte()) then 67 if(methods:sub(i):byte() == 0x00) then -- 0x00 == method: NO AUTH
70 supported = true; 68 supported = true;
71 break; 69 break;
72 end 70 end
73 end 71 end
74 if(supported) then 72 if(supported) then
75 module:log("debug", "new session found ... ") 73 module:log("debug", "new session found ... ")
76 session = new_session(conn); 74 session = new_session(conn);
77 sessions[conn] = session; 75 sessions[conn] = session;
78 session.send(string.char(5, 0)); 76 session.send(string.char(5, 0));
79 end 77 end
80 elseif data ~= nil and data:len() > 6 and 78 return;
81 data:sub(1):byte() == string.char(5):byte() and -- SOCKS5 has 5 in first byte 79 end
82 data:sub(2):byte() == string.char(1):byte() and -- CMD must be 1 80 if session ~= nil then
83 data:sub(3):byte() == string.char(0):byte() and -- RSV must be 0 81 if session.sha ~= nil and transfers[session.sha] ~= nil then
84 data:sub(4):byte() == string.char(3):byte() and -- ATYP must be 3 82 local sha = session.sha;
85 data:sub(-2):byte() == string.char(0):byte() and data:sub(-1):byte() == string.char(0):byte() -- PORT must be 0, size 2 byte 83 if transfers[sha].activated == true and transfers[sha].initiator == conn and transfers[sha].target ~= nil then
86 then 84 transfers[sha].target.write(data);
87 local sha = data:sub(6, data:len() - 2); 85 return;
88 module:log("debug", "gotten sha: >%s<", sha); 86 end
89 if transfers[sha] == nil then 87 end
90 transfers[sha] = {}; 88 if data ~= nil and data:len() == 0x2F and -- 40 == length of SHA1 HASH, and 7 other bytes => 47 => 0x2F
91 transfers[sha].target = conn; 89 data:sub(1):byte() == 0x05 and -- SOCKS5 has 5 in first byte
92 module:log("debug", "target connected ... "); 90 data:sub(2):byte() == 0x01 and -- CMD must be 1
93 elseif transfers[sha].target ~= nil then 91 data:sub(3):byte() == 0x00 and -- RSV must be 0
94 transfers[sha].initiator = conn; 92 data:sub(4):byte() == 0x03 and -- ATYP must be 3
95 module:log("debug", "initiator connected ... "); 93 data:sub(5):byte() == 40 and -- SHA1 HASH length must be 64 (0x40)
96 end 94 data:sub(-2):byte() == 0x00 and -- PORT must be 0, size 2 byte
97 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) 95 data:sub(-1):byte() == 0x00
96 then
97 local sha = data:sub(6, 45); -- second param is not count! it's the ending index (included!)
98 if transfers[sha] == nil then
99 transfers[sha] = {};
100 transfers[sha].activated = false;
101 transfers[sha].target = conn;
102 session.sha = sha;
103 module:log("debug", "target connected ... ");
104 elseif transfers[sha].target ~= nil then
105 transfers[sha].initiator = conn;
106 session.sha = sha;
107 module:log("debug", "initiator connected ... ");
108 end
109 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)
110 end
98 end 111 end
99 end 112 end
100 113
101 function connlistener.disconnect(conn, err) 114 function connlistener.disconnect(conn, err)
102 115
184 connlistener.registered = connlisteners_register('proxy65', connlistener); 197 connlistener.registered = connlisteners_register('proxy65', connlistener);
185 if(connlistener.registered == false) then 198 if(connlistener.registered == false) then
186 error("Proxy65: Could not establish a connection listener. Check your configuration please."); 199 error("Proxy65: Could not establish a connection listener. Check your configuration please.");
187 else 200 else
188 connlistener.handler = connlisteners_start('proxy65'); 201 connlistener.handler = connlisteners_start('proxy65');
189 module:log("debug", "Connection listener registered ... ")
190 module:add_item("proxy65", {jid=_host, name=_name}) 202 module:add_item("proxy65", {jid=_host, name=_name})
191 component = component_register(_host, function(origin, stanza) 203 component = component_register(_host, function(origin, stanza)
192 local to_node, to_host, to_resource = jid_split(stanza.attr.to); 204 local to_node, to_host, to_resource = jid_split(stanza.attr.to);
193 if to_node == nil then 205 if to_node == nil then
194 local type = stanza.attr.type; 206 local type = stanza.attr.type;
206 return true; 218 return true;
207 end 219 end
208 elseif stanza.name == "iq" and type == "set" then 220 elseif stanza.name == "iq" and type == "set" then
209 local reply, from, to, sid = set_activation(stanza); 221 local reply, from, to, sid = set_activation(stanza);
210 if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then 222 if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then
211 module:log("debug", "need to build sha1 of data: from: %s, to: %s, sid: %s", from, to, sid);
212 local sha = sha1(sid .. from .. to, true); 223 local sha = sha1(sid .. from .. to, true);
213 module:log("debug", "generated sha: %s", sha); 224 if transfers[sha] == nil then
214 if(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then 225 module:log("error", "transfers[sha]: nil");
226 elseif(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then
215 origin.send(reply); 227 origin.send(reply);
216 forward(transfers[sha].initiator, transfers[sha].target); 228 transfers[sha].activated = true;
217 transfers[sha] = nil;
218 end 229 end
219 end 230 end
220 end 231 end
221 end 232 end
222 return; 233 return;