diff options
author | Manuel Munz <freifunk@somakoma.de> | 2011-11-30 05:50:43 +0000 |
---|---|---|
committer | Manuel Munz <freifunk@somakoma.de> | 2011-11-30 05:50:43 +0000 |
commit | c5329d85d5a3f4ac14d0a07b298167876d979413 (patch) | |
tree | 7f936bfa6bb6a5d0867231fff45e9a02c03c094c /applications/luci-splash | |
parent | f4b9de593d180a835fbf0ed549b1eceb3531a647 (diff) |
applications/splash: Fix blacklisting mechanism, expose status on public freifunk page, add json output and autoupdate.
Diffstat (limited to 'applications/luci-splash')
4 files changed, 167 insertions, 23 deletions
diff --git a/applications/luci-splash/luasrc/controller/splash/splash.lua b/applications/luci-splash/luasrc/controller/splash/splash.lua index a41256a09..aceeb4a8c 100644 --- a/applications/luci-splash/luasrc/controller/splash/splash.lua +++ b/applications/luci-splash/luasrc/controller/splash/splash.lua @@ -1,6 +1,9 @@ module("luci.controller.splash.splash", package.seeall) luci.i18n.loadc("splash") +local uci = luci.model.uci.cursor() +local util = require "luci.util" + function index() entry({"admin", "services", "splash"}, cbi("splash/splash"), _("Client-Splash"), 90).i18n = "freifunk" entry({"admin", "services", "splash", "splashtext" }, form("splash/splashtext"), _("Splashtext"), 10) @@ -13,8 +16,14 @@ function index() node("splash", "activate").target = call("action_activate") node("splash", "splash").target = template("splash_splash/splash") + node("splash", "blocked").target = template("splash/blocked") entry({"admin", "status", "splash"}, call("action_status_admin"), _("Client-Splash")).i18n = "freifunk" + + local page = node("splash", "publicstatus") + page.target = call("action_status_public") + page.i18n = "freifunk" + page.leaf = true end function action_dispatch() @@ -36,12 +45,28 @@ function action_dispatch() end end +function blacklist() + leased_macs = { } + uci:foreach("luci_splash", "blacklist", + function(s) leased_macs[s.mac:lower()] = true + end) + return leased_macs +end + function action_activate() local ip = luci.http.getenv("REMOTE_ADDR") or "127.0.0.1" local mac = luci.sys.net.ip4mac(ip:match("^[\[::ffff:]*(%d+.%d+%.%d+%.%d+)\]*$")) + local blacklisted = false if mac and luci.http.formvalue("accept") then - os.execute("luci-splash lease "..mac.." >/dev/null 2>&1") - luci.http.redirect(luci.model.uci.cursor():get("freifunk", "community", "homepage")) + uci:foreach("luci_splash", "blacklist", + function(s) if s.mac:lower() == mac or s.mac == mac then blacklisted = true end + end) + if blacklisted then + luci.http.redirect(luci.dispatcher.build_url("splash" ,"blocked")) + else + os.execute("luci-splash lease "..mac.." >/dev/null 2>&1") + luci.http.redirect(luci.model.uci.cursor():get("freifunk", "community", "homepage")) + end else luci.http.redirect(luci.dispatcher.build_url()) end @@ -93,3 +118,7 @@ function action_status_admin() luci.template.render("admin_status/splash", { is_admin = true }) end + +function action_status_public() + luci.template.render("admin_status/splash", { is_admin = false }) +end diff --git a/applications/luci-splash/luasrc/view/admin_status/splash.htm b/applications/luci-splash/luasrc/view/admin_status/splash.htm index 1b55e7b27..86cb9c83a 100644 --- a/applications/luci-splash/luasrc/view/admin_status/splash.htm +++ b/applications/luci-splash/luasrc/view/admin_status/splash.htm @@ -124,10 +124,98 @@ local function showmac(mac) return mac end +if luci.http.formvalue("status") == "1" then + local rv = {} + for _, c in utl.spairs(clients, + function(a,b) if clients[a].policy == clients[b].policy then + return (clients[a].start > clients[b].start) + else + return (clients[a].policy > clients[b].policy) + end + end) + do + if c.ip then + rv[#rv+1] = { + hostname = c.hostname or "?", + ip = c.ip or "?", + mac = showmac(c.mac) or "?", + timeleft = (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or (c.policy ~= "normal") and "-" or "expired", + trafficin = wat.byte_format(c.bytes_in) or "?", + trafficout = wat.byte_format(c.bytes_out) or "?", + policy = c.policy or "?" + } + end + end + luci.http.prepare_content("application/json") + luci.http.write_json(rv) + return +end -%> + + <%+header%> +<script type="text/javascript" src="<%=resource%>/cbi.js"></script> +<script type="text/javascript">//<![CDATA[ + + XHR.poll(10 , '<%=REQUEST_URI%>', { status: 1 }, + function(x, info) + { + var tbody = document.getElementById('splash_table'); + if (tbody) + { + var s = ''; + if (info.length == undefined) { + s += '<tr class="cbi-section-table-row"><td colspan="7" class="cbi-section-table-cell"><br /><em><%:No clients connected%></em><br /></td></tr>' + }; + for (var idx = 0; idx < info.length; idx++) + { + var splash = info[idx]; + s += String.format( + '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' + + '<td class="cbi-section-table-cell">%s</td>' + + '<td class="cbi-section-table-cell">%s</td>' + + '<td class="cbi-section-table-cell">%s</td>' + + '<td class="cbi-section-table-cell">%s</td>' + + '<td class="cbi-section-table-cell">%s/%s</td>' + + '<td class="cbi-section-table-cell">', + splash.hostname, splash.ip, splash.mac, splash.timeleft, splash.trafficin, splash.trafficout); + + <% if is_admin then %> + s += String.format('<select name="policy.%s" style="width:200px">', splash.mac.toLowerCase()); + if (splash.policy == 'whitelist') { + s += '<option value="whitelist" selected="selected"><%:whitelisted%></option>' + } else { + s += '<option value="whitelist"><%:whitelisted%></option>' + }; + if (splash.policy == 'normal') { + s += '<option value="normal" selected="selected"><%:splashed%></option>'; + s += '<option value="kicked"><%:temporarily blocked%></option>' + } else { + s += 'option value="normal"><%:splashed%></option>' + }; + if (splash.policy == 'blacklist') { + s+= '<option value="blacklist" selected="selected"><%:blacklisted%></option>' + } else { + s += '<option value="blacklist"><%:blacklisted%></option>' + }; + s += String.format( + '</select>' + + '<input type="submit" class="cbi-button cbi-button-save" name="save.%s" value="<%:Save%>" />', + splash.mac.toLowerCase()); + <% else %> + s += String.format('%s', splash.policy); + <% end %> + s += '</td></tr></tbody>' + } + tbody.innerHTML = s; + } + } + ); +//]]></script> + + <div id="cbi-splash-leases" class="cbi-map"> <h2><a id="content" name="content"><%:Client-Splash%></a></h2> <fieldset id="cbi-table-table" class="cbi-section"> @@ -135,14 +223,16 @@ end <div class="cbi-section-node"> <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><% end %> <table class="cbi-section-table"> - <tr class="cbi-section-table-titles"> - <th class="cbi-section-table-cell"><%:Hostname%></th> - <th class="cbi-section-table-cell"><%:IP Address%></th> - <th class="cbi-section-table-cell"><%:MAC Address%></th> - <th class="cbi-section-table-cell"><%:Time remaining%></th> - <th class="cbi-section-table-cell"><%:Traffic in/out%></th> - <th class="cbi-section-table-cell"><%:Policy%></th> - </tr> + <thead> + <tr class="cbi-section-table-titles"> + <th class="cbi-section-table-cell"><%:Hostname%></th> + <th class="cbi-section-table-cell"><%:IP Address%></th> + <th class="cbi-section-table-cell"><%:MAC Address%></th> + <th class="cbi-section-table-cell"><%:Time remaining%></th> + <th class="cbi-section-table-cell"><%:Traffic in/out%></th> + <th class="cbi-section-table-cell"><%:Policy%></th> + </tr> + </thead> <%- local count = 0 @@ -158,7 +248,8 @@ end if c.ip then count = count + 1 -%> - <tr class="cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>"> + <tbody id="splash_table"> + <tr class="cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>"> <td class="cbi-section-table-cell"><%=c.hostname or "<em>" .. translate("unknown") .. "</em>"%></td> <td class="cbi-section-table-cell"><%=c.ip or "<em>" .. translate("unknown") .. "</em>"%></td> <td class="cbi-section-table-cell"><%=showmac(c.mac)%></td> @@ -182,19 +273,19 @@ end <%=c.policy%> <% end %> </td> - </tr> - <%- + </tr> + <%- + end end - end - - if count == 0 then - -%> - <tr class="cbi-section-table-row"> - <td colspan="7" class="cbi-section-table-cell"> - <br /><em><%:No clients connected%></em><br /> - </td> - </tr> + if count == 0 then + -%> + <tr class="cbi-section-table-row"> + <td colspan="7" class="cbi-section-table-cell"> + <br /><em><%:No clients connected%></em><br /> + </td> + </tr> <%- end -%> + </tbody> </table> <% if is_admin then %></form><% end %> </div> diff --git a/applications/luci-splash/luasrc/view/splash/blocked.htm b/applications/luci-splash/luasrc/view/splash/blocked.htm new file mode 100644 index 000000000..de61ecf01 --- /dev/null +++ b/applications/luci-splash/luasrc/view/splash/blocked.htm @@ -0,0 +1,25 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2011 Manuel Munz <freifunk at somakoma dot de> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +-%> +<% +local contacturl = luci.dispatcher.build_url("freifunk", "contact") +%> + +<%+header%> + +<h2><a id="content" name="content"><%:Blocked%></a></h2> + +<p><%:Your access to this network has been blocked, most likely because you did something that our rules explicitly forbid.%></p> +<p><%:To ask for the reason why you have been blocked or ask for access again you can try to contact the owner of this access point:%> <a href="<%=contacturl%>"><%:Contact%></a></p> + +<%+footer%> + + + diff --git a/applications/luci-splash/root/usr/sbin/luci-splash b/applications/luci-splash/root/usr/sbin/luci-splash index 7738679f6..ae459ad72 100755 --- a/applications/luci-splash/root/usr/sbin/luci-splash +++ b/applications/luci-splash/root/usr/sbin/luci-splash @@ -315,7 +315,6 @@ end -- Add blacklist rules function add_blacklist_rule(mac) os.execute("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j DROP" % mac) - os.execute("iptables -t nat -I luci_splash_leases -m mac --mac-source %q -j DROP" % mac) end |