Merge pull request #2749 from dibdot/wg
[oweals/luci.git] / modules / luci-base / luasrc / dispatcher.lua
index 1e610e748919edd1601e5026ea12f62755b3bfe9..e8106b741d533541279597cf98dc8a8e4c7fedb0 100644 (file)
@@ -40,6 +40,28 @@ function build_url(...)
        return table.concat(url, "")
 end
 
+function _ordered_children(node)
+       local name, child, children = nil, nil, {}
+
+       for name, child in pairs(node.nodes) do
+               children[#children+1] = {
+                       name  = name,
+                       node  = child,
+                       order = child.order or 100
+               }
+       end
+
+       table.sort(children, function(a, b)
+               if a.order == b.order then
+                       return a.name < b.name
+               else
+                       return a.order < b.order
+               end
+       end)
+
+       return children
+end
+
 function node_visible(node)
    if node then
          return not (
@@ -55,15 +77,10 @@ end
 function node_childs(node)
        local rv = { }
        if node then
-               local k, v
-               for k, v in util.spairs(node.nodes,
-                       function(a, b)
-                               return (node.nodes[a].order or 100)
-                                    < (node.nodes[b].order or 100)
-                       end)
-               do
-                       if node_visible(v) then
-                               rv[#rv+1] = k
+               local _, child
+               for _, child in ipairs(_ordered_children(node)) do
+                       if node_visible(child.node) then
+                               rv[#rv+1] = child.name
                        end
                end
        end
@@ -311,7 +328,7 @@ function dispatch(request)
                        assert(media, "No valid theme found")
                end
 
-               local function _ifattr(cond, key, val)
+               local function _ifattr(cond, key, val, noescape)
                        if cond then
                                local env = getfenv(3)
                                local scope = (type(env.self) == "table") and env.self
@@ -322,13 +339,16 @@ function dispatch(request)
                                                val = util.serialize_json(val)
                                        end
                                end
-                               return string.format(
-                                       ' %s="%s"', tostring(key),
-                                       util.pcdata(tostring( val
-                                        or (type(env[key]) ~= "function" and env[key])
-                                        or (scope and type(scope[key]) ~= "function" and scope[key])
-                                        or "" ))
-                               )
+
+                               val = tostring(val or
+                                       (type(env[key]) ~= "function" and env[key]) or
+                                       (scope and type(scope[key]) ~= "function" and scope[key]) or "")
+
+                               if noescape ~= true then
+                                       val = util.pcdata(val)
+                               end
+
+                               return string.format(' %s="%s"', tostring(key), val)
                        else
                                return ''
                        end
@@ -417,6 +437,7 @@ function dispatch(request)
                                context.path = {}
 
                                http.status(403, "Forbidden")
+                               http.header("X-LuCI-Login-Required", "yes")
                                tmpl.render(track.sysauth_template or "sysauth", {
                                        duser = default_user,
                                        fuser = user
@@ -433,6 +454,7 @@ function dispatch(request)
 
                if not sid or not sdat then
                        http.status(403, "Forbidden")
+                       http.header("X-LuCI-Login-Required", "yes")
                        return
                end
 
@@ -593,11 +615,9 @@ function createtree()
 
        local ctx  = context
        local tree = {nodes={}, inreq=true}
-       local modi = {}
 
        ctx.treecache = setmetatable({}, {__mode="v"})
        ctx.tree = tree
-       ctx.modifiers = modi
 
        local scope = setmetatable({}, {__index = luci.dispatcher})
 
@@ -607,28 +627,9 @@ function createtree()
                v()
        end
 
-       local function modisort(a,b)
-               return modi[a].order < modi[b].order
-       end
-
-       for _, v in util.spairs(modi, modisort) do
-               scope._NAME = v.module
-               setfenv(v.func, scope)
-               v.func()
-       end
-
        return tree
 end
 
-function modifier(func, order)
-       context.modifiers[#context.modifiers+1] = {
-               func = func,
-               order = order or 0,
-               module
-                       = getfenv(2)._NAME
-       }
-end
-
 function assign(path, clone, title, order)
        local obj  = node(unpack(path))
        obj.nodes  = nil
@@ -718,24 +719,7 @@ end
 -- Subdispatchers --
 
 function _find_eligible_node(root, prefix, deep, types, descend)
-       local _, cur_name, cur_node
-       local childs = { }
-
-       for cur_name, cur_node in pairs(root.nodes) do
-               childs[#childs+1] = {
-                       node = cur_node,
-                       name = cur_name,
-                       order = cur_node.order or 100
-               }
-       end
-
-       table.sort(childs, function(a, b)
-               if a.order == b.order then
-                       return a.name < b.name
-               else
-                       return a.order < b.order
-               end
-       end)
+       local children = _ordered_children(root)
 
        if not root.leaf and deep ~= nil then
                local sub_path = { unpack(prefix) }
@@ -744,10 +728,11 @@ function _find_eligible_node(root, prefix, deep, types, descend)
                        deep = nil
                end
 
-               for _, cur_node in ipairs(childs) do
-                       sub_path[#prefix+1] = cur_node.name
+               local _, child
+               for _, child in ipairs(children) do
+                       sub_path[#prefix+1] = child.name
 
-                       local res_path = _find_eligible_node(cur_node.node, sub_path,
+                       local res_path = _find_eligible_node(child.node, sub_path,
                                                             deep, types, true)
 
                        if res_path then
@@ -872,6 +857,15 @@ function template(name)
 end
 
 
+local _view = function(self, ...)
+       require "luci.template".render("view", { view = self.view })
+end
+
+function view(name)
+       return {type = "view", view = name, target = _view}
+end
+
+
 local function _cbi(self, ...)
        local cbi = require "luci.cbi"
        local tpl = require "luci.template"