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 |