trunk

changeset 3472:61cf3e7d7f07

mod_bosh: Support for reading the client's real IP through HTTP proxies from X-Forwarded-For
author Matthew Wild <mwild1@gmail.com>
date Sat, 28 Aug 2010 22:25:12 +0100
parents 482275e38224
children 84fe4d5ac2ed
files plugins/mod_bosh.lua
diffstat 1 files changed, 19 insertions(+), 2 deletions(-) [+]
line diff
     1.1 --- a/plugins/mod_bosh.lua	Sat Aug 28 14:31:48 2010 +0100
     1.2 +++ b/plugins/mod_bosh.lua	Sat Aug 28 22:25:12 2010 +0100
     1.3 @@ -55,6 +55,22 @@
     1.4  	end
     1.5  end
     1.6  
     1.7 +local trusted_proxies = module:get_option_set("trusted_proxies", {"127.0.0.1"})._items;
     1.8 +
     1.9 +local function get_ip_from_request(request)
    1.10 +	local ip = request.handler:ip();
    1.11 +	local forwarded_for = request.headers["x-forwarded-for"];
    1.12 +	if forwarded_for then
    1.13 +		forwarded_for = forwarded_for..", "..ip;
    1.14 +		for forwarded_ip in forwarded_for:gmatch("[^%s,]+") do
    1.15 +			if not trusted_proxies[forwarded_ip] then
    1.16 +				ip = forwarded_ip;
    1.17 +			end
    1.18 +		end
    1.19 +	end
    1.20 +	return ip;
    1.21 +end
    1.22 +
    1.23  local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
    1.24  local os_time = os.time;
    1.25  
    1.26 @@ -216,10 +232,12 @@
    1.27  			bosh_hold = BOSH_DEFAULT_HOLD, bosh_max_inactive = BOSH_DEFAULT_INACTIVITY,
    1.28  			requests = { }, send_buffer = {}, reset_stream = bosh_reset_stream,
    1.29  			close = bosh_close_stream, dispatch_stanza = core_process_stanza,
    1.30 -			log = logger.init("bosh"..sid),	secure = consider_bosh_secure or request.secure
    1.31 +			log = logger.init("bosh"..sid),	secure = consider_bosh_secure or request.secure,
    1.32 +			ip = get_ip_from_request(request);
    1.33  		};
    1.34  		sessions[sid] = session;
    1.35  		
    1.36 +		session.log("debug", "BOSH session created for request from %s", session.ip);
    1.37  		log("info", "New BOSH session, assigned it sid '%s'", sid);
    1.38  		local r, send_buffer = session.requests, session.send_buffer;
    1.39  		local response = { headers = default_headers }
    1.40 @@ -324,7 +342,6 @@
    1.41  		if stanza.attr.xmlns == xmlns_bosh then
    1.42  			stanza.attr.xmlns = nil;
    1.43  		end
    1.44 -		session.ip = request.handler:ip();
    1.45  		core_process_stanza(session, stanza);
    1.46  	end
    1.47  end