Publish nixio.fs in index-scope
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index c863d9ff724e2dd2c2c51ebc64315026f688eaff..1374270b9ede423a6c04b7845ff60c60f687ee5c 100644 (file)
@@ -34,6 +34,8 @@ local nixio = require "nixio", require "nixio.util"
 
 module("luci.dispatcher", package.seeall)
 context = util.threadlocal()
+uci = require "luci.model.uci"
+_M.fs = fs
 
 authenticator = {}
 
@@ -108,13 +110,21 @@ end
 
 --- Dispatch an HTTP request.
 -- @param request      LuCI HTTP Request object
-function httpdispatch(request)
+function httpdispatch(request, prefix)
        luci.http.context.request = request
-       context.request = {}
+
+       local r = {}
+       context.request = r
        local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
 
+       if prefix then
+               for _, node in ipairs(prefix) do
+                       r[#r+1] = node
+               end
+       end
+
        for node in pathinfo:gmatch("[^/]+") do
-               table.insert(context.request, node)
+               r[#r+1] = node
        end
 
        local stat, err = util.coxpcall(function()
@@ -200,7 +210,7 @@ function dispatch(request)
                end
        end
 
-       ctx.requestpath = freq
+       ctx.requestpath = ctx.requestpath or freq
        ctx.path = preq
 
        if track.i18n then
@@ -211,8 +221,7 @@ function dispatch(request)
        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 tpl.Template("themes/%s/header" % fs.basename(media)) then 
-               --if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
+               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,
@@ -228,6 +237,7 @@ function dispatch(request)
                   include     = function(name) tpl.Template(name):render(getfenv(2)) end;
                   translate   = function(...) return require("luci.i18n").translate(...) end;
                   striptags   = util.striptags;
+                  pcdata      = util.pcdata;
                   media       = media;
                   theme       = fs.basename(media);
                   resource    = luci.config.main.resourcebase
@@ -258,7 +268,7 @@ function dispatch(request)
                local verifytoken = false
                if not sess then
                        sess = luci.http.getcookie("sysauth")
-                       sess = sess and sess:match("^[a-f0-9]+$")
+                       sess = sess and sess:match("^[a-f0-9]*$")
                        verifytoken = true
                end
 
@@ -272,6 +282,12 @@ function dispatch(request)
                        if not verifytoken or ctx.urltoken.stok == sdat.token then
                                user = sdat.user
                        end
+               else
+                       local eu = http.getenv("HTTP_AUTH_USER")
+                       local ep = http.getenv("HTTP_AUTH_PASS")
+                       if eu and ep and luci.sys.user.checkpasswd(eu, ep) then
+                               authen = function() return eu end
+                       end
                end
 
                if not util.contains(accs, user) then
@@ -293,6 +309,7 @@ function dispatch(request)
                                        end
                                        luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path="..build_url())
                                        ctx.authsession = sid
+                                       ctx.authuser = user
                                end
                        else
                                luci.http.status(403, "Forbidden")
@@ -300,6 +317,7 @@ function dispatch(request)
                        end
                else
                        ctx.authsession = sess
+                       ctx.authuser = user
                end
        end
 
@@ -459,7 +477,7 @@ function createtree()
        ctx.modifiers = modi
 
        -- Load default translation
-       require "luci.i18n".loadc("default")
+       require "luci.i18n".loadc("base")
 
        local scope = setmetatable({}, {__index = luci.dispatcher})