Comparison

mod_proxy65/mod_proxy65.lua @ 77:85b8622ccffd

mod_proxy65: close unknown connection with no authentication data, close target if initator hangs up and vica versa
author Thilo Cestonaro <thilo@cestona.ro>
date Sun, 01 Nov 2009 10:38:51 +0100
parent 74:d70813f7d90a
child 79:34f5818c90e9
comparison
equal deleted inserted replaced
76:1fc4e8dc66a6 77:85b8622ccffd
11 local jid_split = require "util.jid".split; 11 local jid_split = require "util.jid".split;
12 local st = require "util.stanza"; 12 local st = require "util.stanza";
13 local componentmanager = require "core.componentmanager"; 13 local componentmanager = require "core.componentmanager";
14 local config_get = require "core.configmanager".get; 14 local config_get = require "core.configmanager".get;
15 local connlisteners = require "net.connlisteners"; 15 local connlisteners = require "net.connlisteners";
16 local adns, dns = require "net.adns", require "net.dns";
17 local add_task = require "util.timer".add_task;
18 local max_dns_depth = config.get("*", "core", "dns_max_depth") or 3;
19 local dns_timeout = config.get("*", "core", "dns_timeout") or 60;
20 local sha1 = require "util.hashes".sha1; 16 local sha1 = require "util.hashes".sha1;
21 17
22 local host, name = module:get_host(), "SOCKS5 Bytestreams Service"; 18 local host, name = module:get_host(), "SOCKS5 Bytestreams Service";
23 local sessions, transfers, component, replies_cache = {}, {}, nil, {}; 19 local sessions, transfers, component, replies_cache = {}, {}, nil, {};
24 20
25 local proxy_port = config_get(host, "core", "proxy65_port") or 5000; 21 local proxy_port = config_get(host, "core", "proxy65_port") or 5000;
26 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*"; 22 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*";
27 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or module.host; 23 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host;
28 24
29 local connlistener = { default_port = proxy_port, 25 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" };
30 default_interface = proxy_interface,
31 default_mode = "*a" };
32 26
33 function connlistener.listener(conn, data) 27 function connlistener.listener(conn, data)
34 local session = sessions[conn] or {}; 28 local session = sessions[conn] or {};
35 29
36 if session.setup == false and data ~= nil and data:sub(1):byte() == 0x05 and data:len() > 2 then 30 if session.setup == nil and data ~= nil and data:sub(1):byte() == 0x05 and data:len() > 2 then
37 local nmethods = data:sub(2):byte(); 31 local nmethods = data:sub(2):byte();
38 local methods = data:sub(3); 32 local methods = data:sub(3);
39 local supported = false; 33 local supported = false;
40 for i=1, nmethods, 1 do 34 for i=1, nmethods, 1 do
41 if(methods:sub(i):byte() == 0x00) then -- 0x00 == method: NO AUTH 35 if(methods:sub(i):byte() == 0x00) then -- 0x00 == method: NO AUTH
62 if data ~= nil and data:len() == 0x2F and -- 40 == length of SHA1 HASH, and 7 other bytes => 47 => 0x2F 56 if data ~= nil and data:len() == 0x2F and -- 40 == length of SHA1 HASH, and 7 other bytes => 47 => 0x2F
63 data:sub(1):byte() == 0x05 and -- SOCKS5 has 5 in first byte 57 data:sub(1):byte() == 0x05 and -- SOCKS5 has 5 in first byte
64 data:sub(2):byte() == 0x01 and -- CMD must be 1 58 data:sub(2):byte() == 0x01 and -- CMD must be 1
65 data:sub(3):byte() == 0x00 and -- RSV must be 0 59 data:sub(3):byte() == 0x00 and -- RSV must be 0
66 data:sub(4):byte() == 0x03 and -- ATYP must be 3 60 data:sub(4):byte() == 0x03 and -- ATYP must be 3
67 data:sub(5):byte() == 40 and -- SHA1 HASH length must be 64 (0x40) 61 data:sub(5):byte() == 40 and -- SHA1 HASH length must be 40 (0x28)
68 data:sub(-2):byte() == 0x00 and -- PORT must be 0, size 2 byte 62 data:sub(-2):byte() == 0x00 and -- PORT must be 0, size 2 byte
69 data:sub(-1):byte() == 0x00 63 data:sub(-1):byte() == 0x00
70 then 64 then
71 local sha = data:sub(6, 45); -- second param is not count! it's the ending index (included!) 65 local sha = data:sub(6, 45); -- second param is not count! it's the ending index (included!)
72 if transfers[sha] == nil then 66 if transfers[sha] == nil then
80 session.sha = sha; 74 session.sha = sha;
81 module:log("debug", "initiator connected ... "); 75 module:log("debug", "initiator connected ... ");
82 end 76 end
83 conn.write(string.char(5, 0, 0, 3, sha:len()) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte) 77 conn.write(string.char(5, 0, 0, 3, sha:len()) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte)
84 end 78 end
79 else
80 if data ~= nil then
81 module:log("debug", "unknown connection with no authentication data -> closing it");
82 conn.close();
83 end
85 end 84 end
86 end 85 end
87 86
88 function connlistener.disconnect(conn, err) 87 function connlistener.disconnect(conn, err)
89 if sessions[conn] then 88 local session = sessions[conn];
89 if session then
90 if session.sha and transfers[session.sha] then
91 local initiator, target = transfers[session.sha].initiator, transfers[session.sha].target;
92 if initiator == conn then
93 target.close();
94 elseif target == conn then
95 initiator.close();
96 end
97 end
90 -- Clean up any session-related stuff here 98 -- Clean up any session-related stuff here
91 sessions[conn] = nil; 99 sessions[conn] = nil;
92 end 100 end
93 end 101 end
94 102