+ -- Init template engine
+ if (c and c.index) or not track.notemplate then
+ local tpl = require("luci.template")
+ local media = track.mediaurlbase or luci.config.main.mediaurlbase
+ if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
+ media = nil
+ for name, theme in pairs(luci.config.themes) do
+ if name:sub(1,1) ~= "." and pcall(tpl.Template,
+ "themes/%s/header" % fs.basename(theme)) then
+ media = theme
+ end
+ end
+ assert(media, "No valid theme found")
+ end
+
+ local viewns = setmetatable({}, {__index=_G})
+ tpl.context.viewns = viewns
+ viewns.write = luci.http.write
+ viewns.include = function(name) tpl.Template(name):render(getfenv(2)) end
+ viewns.translate = function(...) return require("luci.i18n").translate(...) end
+ viewns.striptags = util.striptags
+ viewns.controller = luci.http.getenv("SCRIPT_NAME")
+ viewns.media = media
+ viewns.theme = fs.basename(media)
+ viewns.resource = luci.config.main.resourcebase
+ viewns.REQUEST_URI = (luci.http.getenv("SCRIPT_NAME") or "") .. (luci.http.getenv("PATH_INFO") or "")
+ end
+
+ track.dependent = (track.dependent ~= false)
+ assert(not track.dependent or not track.auto, "Access Violation")
+
+ if track.sysauth then
+ local sauth = require "luci.sauth"
+
+ local authen = type(track.sysauth_authenticator) == "function"
+ and track.sysauth_authenticator
+ or authenticator[track.sysauth_authenticator]
+
+ local def = (type(track.sysauth) == "string") and track.sysauth
+ local accs = def and {track.sysauth} or track.sysauth
+ local sess = ctx.authsession or luci.http.getcookie("sysauth")
+ sess = sess and sess:match("^[A-F0-9]+$")
+ local user = sauth.read(sess)
+
+ if not util.contains(accs, user) then
+ if authen then
+ local user, sess = authen(luci.sys.user.checkpasswd, accs, def)
+ if not user or not util.contains(accs, user) then
+ return
+ else
+ local sid = sess or luci.sys.uniqueid(16)
+ luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
+ if not sess then
+ sauth.write(sid, user)
+ end
+ ctx.authsession = sid
+ end
+ else
+ luci.http.status(403, "Forbidden")
+ return
+ end
+ end
+ end
+