applications/splash: Fix blacklisting mechanism, expose status on public freifunk...
[project/luci.git] / applications / luci-splash / luasrc / controller / splash / splash.lua
index a41256a..aceeb4a 100644 (file)
@@ -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