Comparison

plugins/mod_proxy65.lua @ 3007:9d122a6ae674

Merge 0.7->trunk
author Matthew Wild <mwild1@gmail.com>
date Wed, 05 May 2010 15:33:58 +0100
parent 3006:a3580f556c27
child 3377:9328179c9c76
comparison
equal deleted inserted replaced
2999:9a8f942433c4 3007:9d122a6ae674
18 local st = require "util.stanza"; 18 local st = require "util.stanza";
19 local componentmanager = require "core.componentmanager"; 19 local componentmanager = require "core.componentmanager";
20 local config_get = require "core.configmanager".get; 20 local config_get = require "core.configmanager".get;
21 local connlisteners = require "net.connlisteners"; 21 local connlisteners = require "net.connlisteners";
22 local sha1 = require "util.hashes".sha1; 22 local sha1 = require "util.hashes".sha1;
23 local server = require "net.server";
23 24
24 local host, name = module:get_host(), "SOCKS5 Bytestreams Service"; 25 local host, name = module:get_host(), "SOCKS5 Bytestreams Service";
25 local sessions, transfers, component, replies_cache = {}, {}, nil, {}; 26 local sessions, transfers, component, replies_cache = {}, {}, nil, {};
26 27
27 local proxy_port = config_get(host, "core", "proxy65_port") or 5000; 28 local proxy_port = config_get(host, "core", "proxy65_port") or 5000;
28 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*"; 29 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*";
29 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host; 30 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host;
30 local proxy_acl = config_get(host, "core", "proxy65_acl"); 31 local proxy_acl = config_get(host, "core", "proxy65_acl");
32 local max_buffer_size = 4096;
31 33
32 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" }; 34 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" };
33 35
34 function connlistener.onincoming(conn, data) 36 function connlistener.onincoming(conn, data)
35 local session = sessions[conn] or {}; 37 local session = sessions[conn] or {};
82 module:log("debug", "target connected ... "); 84 module:log("debug", "target connected ... ");
83 elseif transfers[sha].target ~= nil then 85 elseif transfers[sha].target ~= nil then
84 transfers[sha].initiator = conn; 86 transfers[sha].initiator = conn;
85 session.sha = sha; 87 session.sha = sha;
86 module:log("debug", "initiator connected ... "); 88 module:log("debug", "initiator connected ... ");
87 throttle_sending(conn, transfers[sha].target); 89 server.link(conn, transfers[sha].target, max_buffer_size);
88 throttle_sending(transfers[sha].target, conn); 90 server.link(transfers[sha].target, conn, max_buffer_size);
89 end 91 end
90 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) 92 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)
91 conn:lock_read(true) 93 conn:lock_read(true)
92 else 94 else
93 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.") 95 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.")
232 origin.send(get_disco_items(stanza)); 234 origin.send(get_disco_items(stanza));
233 return true; 235 return true;
234 elseif xmlns == "http://jabber.org/protocol/bytestreams" then 236 elseif xmlns == "http://jabber.org/protocol/bytestreams" then
235 origin.send(get_stream_host(origin, stanza)); 237 origin.send(get_stream_host(origin, stanza));
236 return true; 238 return true;
239 else
240 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
241 return true;
237 end 242 end
238 elseif stanza.name == "iq" and type == "set" then 243 elseif stanza.name == "iq" and type == "set" then
244 module:log("debug", "Received activation request from %s", stanza.attr.from);
239 local reply, from, to, sid = set_activation(stanza); 245 local reply, from, to, sid = set_activation(stanza);
240 if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then 246 if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then
241 local sha = sha1(sid .. from .. to, true); 247 local sha = sha1(sid .. from .. to, true);
242 if transfers[sha] == nil then 248 if transfers[sha] == nil then
243 module:log("error", "transfers[sha]: nil"); 249 module:log("error", "transfers[sha]: nil");
244 elseif(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then 250 elseif(transfers[sha] ~= nil and transfers[sha].initiator ~= nil and transfers[sha].target ~= nil) then
245 origin.send(reply); 251 origin.send(reply);
246 transfers[sha].activated = true; 252 transfers[sha].activated = true;
247 transfers[sha].target:lock_read(false); 253 transfers[sha].target:lock_read(false);
248 transfers[sha].initiator:lock_read(false); 254 transfers[sha].initiator:lock_read(false);
255 else
256 module:log("debug", "Both parties were not yet connected");
257 local message = "Neither party is connected to the proxy";
258 if transfers[sha].initiator then
259 message = "The recipient is not connected to the proxy";
260 elseif transfers[sha].target then
261 message = "The sender (you) is not connected to the proxy";
262 end
263 origin.send(st.error_reply(stanza, "cancel", "not-allowed", message));
249 end 264 end
250 else 265 else
251 module:log("error", "activation failed: sid: %s, initiator: %s, target: %s", tostring(sid), tostring(from), tostring(to)); 266 module:log("error", "activation failed: sid: %s, initiator: %s, target: %s", tostring(sid), tostring(from), tostring(to));
252 end 267 end
253 end 268 end
260 module:log("error", "Possibly two proxy65 components are configured to share the same port."); 275 module:log("error", "Possibly two proxy65 components are configured to share the same port.");
261 end 276 end
262 277
263 connlisteners.start(module.host .. ':proxy65'); 278 connlisteners.start(module.host .. ':proxy65');
264 component = componentmanager.register_component(host, handle_to_domain); 279 component = componentmanager.register_component(host, handle_to_domain);
265 local sender_lock_threshold = 4096;
266 function throttle_sending(sender, receiver)
267 sender:pattern(sender_lock_threshold);
268 local sender_locked;
269 local _sendbuffer = receiver.sendbuffer;
270 function receiver.sendbuffer()
271 _sendbuffer();
272 if sender_locked and receiver.bufferlen() < sender_lock_threshold then
273 sender:lock_read(false); -- Unlock now
274 sender_locked = nil;
275 end
276 end
277
278 local _readbuffer = sender.readbuffer;
279 function sender.readbuffer()
280 _readbuffer();
281 if not sender_locked and receiver.bufferlen() >= sender_lock_threshold then
282 sender_locked = true;
283 sender:lock_read(true);
284 end
285 end
286 end