]]--
+local module = module;
+local tostring = tostring;
local jid_split, jid_join, jid_compare = require "util.jid".split, require "util.jid".join, require "util.jid".compare;
local st = require "util.stanza";
local connlisteners = require "net.connlisteners";
function connlistener.onincoming(conn, data)
local session = sessions[conn] or {};
- if session.setup == nil and data ~= nil and data:sub(1):byte() == 0x05 and data:len() > 2 then
- local nmethods = data:sub(2):byte();
+ if session.setup == nil and data ~= nil and data:byte(1) == 0x05 and #data > 2 then
+ local nmethods = data:byte(2);
local methods = data:sub(3);
local supported = false;
for i=1, nmethods, 1 do
- if(methods:sub(i):byte() == 0x00) then -- 0x00 == method: NO AUTH
+ if(methods:byte(i) == 0x00) then -- 0x00 == method: NO AUTH
supported = true;
break;
end
return;
end
end
- 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 40 (0x28)
- data:sub(-2):byte() == 0x00 and -- PORT must be 0, size 2 byte
- data:sub(-1):byte() == 0x00
+ if data ~= nil and #data == 0x2F and -- 40 == length of SHA1 HASH, and 7 other bytes => 47 => 0x2F
+ data:byte(1) == 0x05 and -- SOCKS5 has 5 in first byte
+ data:byte(2) == 0x01 and -- CMD must be 1
+ data:byte(3) == 0x00 and -- RSV must be 0
+ data:byte(4) == 0x03 and -- ATYP must be 3
+ data:byte(5) == 40 and -- SHA1 HASH length must be 40 (0x28)
+ data:byte(-2) == 0x00 and -- PORT must be 0, size 2 byte
+ data:byte(-1) == 0x00
then
local sha = data:sub(6, 45); -- second param is not count! it's the ending index (included!)
if transfers[sha] == nil then
server.link(conn, transfers[sha].target, max_buffer_size);
server.link(transfers[sha].target, conn, max_buffer_size);
end
- 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)
+ conn:write(string.char(5, 0, 0, 3, #sha) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte)
conn:lock_read(true)
else
module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.")
end
end
+module:add_identity("proxy", "bytestreams", name);
+module:add_feature("http://jabber.org/protocol/bytestreams");
+
module:hook("iq-get/host/http://jabber.org/protocol/disco#info:query", function(event)
local origin, stanza = event.origin, event.stanza;
local reply = replies_cache.disco_info;
end
local function set_activation(stanza)
- local from, to, sid, reply = nil;
- from = stanza.attr.from;
- if stanza.tags[1] ~= nil and tostring(stanza.tags[1].name) == "query" then
- if stanza.tags[1].attr ~= nil then
- sid = stanza.tags[1].attr.sid;
- end
- if stanza.tags[1].tags[1] ~= nil and tostring(stanza.tags[1].tags[1].name) == "activate" then
- to = stanza.tags[1].tags[1][1];
- end
+ local to, reply;
+ local from = stanza.attr.from;
+ local query = stanza.tags[1];
+ local sid = query.attr.sid;
+ if query.tags[1] and query.tags[1].name == "activate" then
+ to = query.tags[1][1];
end
if from ~= nil and to ~= nil and sid ~= nil then
reply = st.iq({type="result", from=host, to=from});