mod_proxy65/mod_proxy65.lua
changeset 80 bed9a6b40fae
parent 79 34f5818c90e9
child 82 608dc38b6580
equal deleted inserted replaced
79:34f5818c90e9 80:bed9a6b40fae
    19 local sessions, transfers, component, replies_cache = {}, {}, nil, {};
    19 local sessions, transfers, component, replies_cache = {}, {}, nil, {};
    20 
    20 
    21 local proxy_port = config_get(host, "core", "proxy65_port") or 5000;
    21 local proxy_port = config_get(host, "core", "proxy65_port") or 5000;
    22 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*";
    22 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*";
    23 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host;
    23 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host;
       
    24 local proxy_acl = config_get(host, "core", "proxy65_acl");
    24 
    25 
    25 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" };
    26 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" };
    26 
    27 
    27 function connlistener.listener(conn, data)
    28 function connlistener.listener(conn, data)
    28 	local session = sessions[conn] or {};
    29 	local session = sessions[conn] or {};
   124 	reply.attr.id = stanza.attr.id;
   125 	reply.attr.id = stanza.attr.id;
   125 	reply.attr.to = stanza.attr.from;
   126 	reply.attr.to = stanza.attr.from;
   126 	return reply;
   127 	return reply;
   127 end
   128 end
   128 
   129 
   129 local function get_stream_host(stanza)
   130 local function get_stream_host(origin, stanza)
   130 	local reply = replies_cache.stream_host;
   131 	local reply = replies_cache.stream_host;
       
   132 	local err_reply = replies_cache.stream_host_err;
   131 	local sid = stanza.tags[1].attr.sid;
   133 	local sid = stanza.tags[1].attr.sid;
   132 	if reply == nil then
   134 	local allow = false;
   133 		reply = st.iq({type="result", from=host})
       
   134 			:query("http://jabber.org/protocol/bytestreams")
       
   135 			:tag("streamhost", {jid=host, host=proxy_address, port=proxy_port}); -- TODO get the correct data
       
   136 		replies_cache.stream_host = reply;
       
   137 	end
       
   138 	
   135 	
       
   136 	if proxy_acl then
       
   137 		for _, acl in ipairs(proxy_acl) do
       
   138 			local acl_node, acl_host, acl_resource = jid_split(acl);
       
   139 			if ((acl_node ~= nil and acl_node == origin.username) or acl_node == nil) and
       
   140 			   ((acl_host ~= nil and acl_host == origin.host) or acl_host == nil) and
       
   141 			   ((acl_resource ~= nil and acl_resource == origin.resource) or acl_resource == nil) then
       
   142 				allow = true;
       
   143 			end
       
   144 		end
       
   145 	else
       
   146 		allow = true;
       
   147 	end
       
   148 	if allow == true then
       
   149 		if reply == nil then
       
   150 			reply = st.iq({type="result", from=host})
       
   151 				:query("http://jabber.org/protocol/bytestreams")
       
   152 				:tag("streamhost", {jid=host, host=proxy_address, port=proxy_port});
       
   153 			replies_cache.stream_host = reply;
       
   154 		end
       
   155 	else
       
   156 		module:log("debug", "Denying use of proxy for %s@%s/%s", tostring(origin.username), tostring(origin.host), tostring(origin.resource));
       
   157 		if err_reply == nil then
       
   158 			err_reply = st.iq({type="error", from=host})
       
   159 				:query("http://jabber.org/protocol/bytestreams")
       
   160 				:tag("error", {code='403', type='auth'})
       
   161 				:tag("forbidden", {xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'});
       
   162 			replies_cache.stream_host_err = err_reply;
       
   163 		end
       
   164 		reply = err_reply;
       
   165 	end
   139 	reply.attr.id = stanza.attr.id;
   166 	reply.attr.id = stanza.attr.id;
   140 	reply.attr.to = stanza.attr.from;
   167 	reply.attr.to = stanza.attr.from;
   141 	reply.tags[1].attr.sid = sid;
   168 	reply.tags[1].attr.sid = sid;
   142 	return reply;
   169 	return reply;
   143 end
   170 end
   177 				return true;
   204 				return true;
   178 			elseif xmlns == "http://jabber.org/protocol/disco#items" then
   205 			elseif xmlns == "http://jabber.org/protocol/disco#items" then
   179 				origin.send(get_disco_items(stanza));
   206 				origin.send(get_disco_items(stanza));
   180 				return true;
   207 				return true;
   181 			elseif xmlns == "http://jabber.org/protocol/bytestreams" then
   208 			elseif xmlns == "http://jabber.org/protocol/bytestreams" then
   182 				origin.send(get_stream_host(stanza));
   209 				origin.send(get_stream_host(origin, stanza));
   183 				return true;
   210 				return true;
   184 			end
   211 			end
   185 		elseif stanza.name == "iq" and type == "set" then
   212 		elseif stanza.name == "iq" and type == "set" then
   186 			local reply, from, to, sid = set_activation(stanza);
   213 			local reply, from, to, sid = set_activation(stanza);
   187 			if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then
   214 			if reply ~= nil and from ~= nil and to ~= nil and sid ~= nil then