libs/web: expose cbi map redirect property to page templates
[oweals/luci.git] / libs / web / luasrc / dispatcher.lua
index 5f48043c509b2bf76402db1d43a6a14bb5d11c12..d10b5c0b5f37eadca317ef447f43eeb353a88a33 100644 (file)
@@ -52,11 +52,25 @@ local fi
 -- @return             Relative URL
 function build_url(...)
        local path = {...}
-       local sn = http.getenv("SCRIPT_NAME") or ""
+       local url = { http.getenv("SCRIPT_NAME") or "" }
+
+       local k, v
        for k, v in pairs(context.urltoken) do
-               sn = sn .. "/;" .. k .. "=" .. http.urlencode(v)
+               url[#url+1] = "/;"
+               url[#url+1] = http.urlencode(k)
+               url[#url+1] = "="
+               url[#url+1] = http.urlencode(v)
+       end
+
+       local p
+       for _, p in ipairs(path) do
+               if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then
+                       url[#url+1] = "/"
+                       url[#url+1] = p
+               end
        end
-       return sn .. ((#path > 0) and "/" .. table.concat(path, "/") or "")
+
+       return table.concat(url, "")
 end
 
 --- Send a 404 error code and render the "error404" template if available.
@@ -149,7 +163,7 @@ function dispatch(request)
        assert(conf.main,
                "/etc/config/luci seems to be corrupt, unable to find section 'main'")
 
-       local lang = conf.main.lang
+       local lang = conf.main.lang or "auto"
        if lang == "auto" then
                local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or ""
                for lpat in aclang:gmatch("[%w-]+") do
@@ -159,7 +173,7 @@ function dispatch(request)
                                break
                        end
                end
-        end
+       end
        require "luci.i18n".setlanguage(lang)
 
        local c = ctx.tree
@@ -181,7 +195,7 @@ function dispatch(request)
        for i, s in ipairs(request) do
                local tkey, tval
                if t then
-                       tkey, tval = s:match(";(%w+)=(.*)")
+                       tkey, tval = s:match(";(%w+)=([a-fA-F0-9]*)")
                end
 
                if tkey then
@@ -237,6 +251,7 @@ function dispatch(request)
                   write       = luci.http.write;
                   include     = function(name) tpl.Template(name):render(getfenv(2)) end;
                   translate   = function(...) return require("luci.i18n").translate(...) end;
+                  export      = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end;
                   striptags   = util.striptags;
                   pcdata      = util.pcdata;
                   media       = media;
@@ -703,6 +718,7 @@ local function _cbi(self, ...)
                end
        end
 
+       local redirect
        local pageaction = true
        http.header("X-CBI-State", state or 0)
        if not config.noheader then
@@ -713,9 +729,18 @@ local function _cbi(self, ...)
                if res.pageaction == false then
                        pageaction = false
                end
+               if res.redirect then
+                       redirect = redirect or res.redirect
+               end
        end
        if not config.nofooter then
-               tpl.render("cbi/footer", {flow = config, pageaction=pageaction, state = state, autoapply = config.autoapply})
+               tpl.render("cbi/footer", {
+                       flow       = config,
+                       pageaction = pageaction,
+                       redirect   = redirect,
+                       state      = state,
+                       autoapply  = config.autoapply
+               })
        end
 end