Software /
code /
prosody-modules
Comparison
mod_proxy65/mod_proxy65.lua @ 80:bed9a6b40fae
mod_proxy65: basic white list - access control list
author | Thilo Cestonaro <thilo@cestona.ro> |
---|---|
date | Sun, 01 Nov 2009 16:42:04 +0100 |
parent | 79:34f5818c90e9 |
child | 82:608dc38b6580 |
comparison
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 |