libs/web: add range(min,max) datatype validator
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index 8b7cdb8..0f49b90 100644 (file)
@@ -35,6 +35,8 @@ local nixio = require "nixio", require "nixio.util"
 module("luci.dispatcher", package.seeall)
 context = util.threadlocal()
 uci = require "luci.model.uci"
+i18n = require "luci.i18n"
+_M.fs = fs
 
 authenticator = {}
 
@@ -50,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.
@@ -147,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
@@ -157,7 +173,7 @@ function dispatch(request)
                                break
                        end
                end
-        end
+       end
        require "luci.i18n".setlanguage(lang)
 
        local c = ctx.tree
@@ -179,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
@@ -235,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;