-- Builds a URL
function build_url(...)
- return luci.http.dispatcher() .. "/" .. table.concat(arg, "/")
-end
-
--- Prints an error message or renders the "error401" template if available
-function error401(message)
- message = message or "Unauthorized"
-
- require("luci.template")
- if not luci.util.copcall(luci.template.render, "error401") then
- luci.http.prepare_content("text/plain")
- luci.http.write(message)
- end
- return false
+ return luci.http.getenv("SCRIPT_NAME") .. "/" .. table.concat(arg, "/")
end
-- Sends a 404 error code and renders the "error404" template if available
return false
end
+-- Renders an authorization form
+function sysauth(default)
+ local user = luci.http.formvalue("username")
+ local pass = luci.http.formvalue("password")
+
+ if user and luci.sys.user.checkpasswd(user, pass) then
+ local sid = luci.sys.uniqueid(16)
+ luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
+ luci.sauth.write(sid, user)
+ return true
+ else
+ require("luci.i18n")
+ require("luci.template")
+ context.path = {}
+ luci.template.render("sysauth", {duser=default, fuser=user})
+ return false
+ end
+end
+
-- Creates a request object for dispatching
function httpdispatch(request)
luci.http.context.request = request
context.request = {}
- local pathinfo = request.env.PATH_INFO or ""
+ local pathinfo = request:getenv("PATH_INFO") or ""
for node in pathinfo:gmatch("[^/]+") do
table.insert(context.request, node)
end
end
- if track.sysauth then
- local accs = track.sysauth
- accs = (type(accs) == "string") and {accs} or accs
-
- --[[
- local function sysauth(user, password)
- return (luci.util.contains(accs, user)
- and luci.sys.user.checkpasswd(user, password))
- end
-
- if not luci.http.basic_auth(sysauth) then
- error401()
- return
- end
- ]]--
- end
-
if track.i18n then
require("luci.i18n").loadc(track.i18n)
end
-
- if track.setgroup then
- luci.sys.process.setgroup(track.setgroup)
- end
-
- if track.setuser then
- luci.sys.process.setuser(track.setuser)
- end
-- Init template engine
local tpl = require("luci.template")
viewns.resource = luci.config.main.resourcebase
viewns.REQUEST_URI = luci.http.getenv("SCRIPT_NAME") .. (luci.http.getenv("PATH_INFO") or "")
+ if track.sysauth then
+ require("luci.sauth")
+ local def = (type(track.sysauth) == "string") and track.sysauth
+ local accs = def and {track.sysauth} or track.sysauth
+ local user = luci.sauth.read(luci.http.getcookie("sysauth"))
+
+
+ if not luci.util.contains(accs, user) then
+ if not sysauth(def) then
+ return
+ end
+ end
+ end
+
+ if track.setgroup then
+ luci.sys.process.setgroup(track.setgroup)
+ end
+
+ if track.setuser then
+ luci.sys.process.setuser(track.setuser)
+ end
if c and type(c.target) == "function" then
context.dispatched = c
luci.i18n.loadc("default")
local scope = luci.util.clone(_G)
- for k,v in pairs(_M) do
+ for k,v in pairs(luci.dispatcher) do
if type(v) == "function" then
scope[k] = v
end
for k, v in pairs(index) do
scope._NAME = k
setfenv(v, scope)
-
+
local stat, err = luci.util.copcall(v)
if not stat then
- error500(err)
+ error500("createtree failed: " .. k .. ": " .. err)
+ luci.http.close()
os.exit(1)
end
end
-- Reassigns a node to another position
function assign(path, clone, title, order)
- local obj = node(path)
+ local obj = node(unpack(path))
obj.nodes = nil
obj.module = nil
-- Shortcut for creating a dispatching node
function entry(path, target, title, order)
- local c = node(path)
+ local c = node(unpack(path))
c.target = target
c.title = title
function node(...)
local c = context.tree
arg.n = nil
- if arg[1] then
- if type(arg[1]) == "table" then
- arg = arg[1]
- end
- end
for k,v in ipairs(arg) do
if not c.nodes[v] then
require("luci.template")
return function()
- local stat, res = luci.util.copcall(luci.cbi.load, model)
+ local stat, maps = luci.util.copcall(luci.cbi.load, model)
if not stat then
- error500(res)
+ error500(maps)
return true
end
- local stat, err = luci.util.copcall(res.parse, res)
- if not stat then
- error500(err)
- return true
+ for i, res in ipairs(maps) do
+ local stat, err = luci.util.copcall(res.parse, res)
+ if not stat then
+ error500(err)
+ return true
+ end
end
luci.template.render("cbi/header")
- res:render()
+ for i, res in ipairs(maps) do
+ res:render()
+ end
luci.template.render("cbi/footer")
end
end