luci-base: dispatcher.lua: pass permission state to legacy CBI templates
authorJo-Philipp Wich <jo@mein.io>
Mon, 20 Apr 2020 07:33:30 +0000 (09:33 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 7 May 2020 17:40:49 +0000 (19:40 +0200)
Ref: https://github.com/openwrt/luci/issues/3937
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit c48a8d58132b4f175ec0a4b4ec4e15eb199edeb8)

modules/luci-base/luasrc/dispatcher.lua

index d4ba0a95e4e06bcd2c8bba3896a82b53f8ffb05f..d14a866737a15e438249e0cb4d71f30363fb6d53 100644 (file)
@@ -1329,12 +1329,23 @@ function _cbi(self, ...)
        local cbi = require "luci.cbi"
        local tpl = require "luci.template"
        local http = require "luci.http"
+       local util = require "luci.util"
 
        local config = self.config or {}
        local maps = cbi.load(self.model, ...)
 
        local state = nil
 
+       local function has_uci_access(config, level)
+               local rv = util.ubus("session", "access", {
+                       ubus_rpc_session = context.authsession,
+                       scope = "uci", object = config,
+                       ["function"] = level
+               })
+
+               return (type(rv) == "table" and rv.access == true) or false
+       end
+
        local i, res
        for i, res in ipairs(maps) do
                if util.instanceof(res, cbi.SimpleForm) then
@@ -1388,6 +1399,7 @@ function _cbi(self, ...)
        local applymap   = false
        local pageaction = true
        local parsechain = { }
+       local writable   = false
 
        for i, res in ipairs(maps) do
                if res.apply_needed and res.parsechain then
@@ -1413,12 +1425,19 @@ function _cbi(self, ...)
        end
 
        for i, res in ipairs(maps) do
+               local is_readable_map = has_uci_access(res.config, "read")
+               local is_writable_map = has_uci_access(res.config, "write")
+
+               writable = writable or is_writable_map
+
                res:render({
                        firstmap   = (i == 1),
                        redirect   = redirect,
                        messages   = messages,
                        pageaction = pageaction,
-                       parsechain = parsechain
+                       parsechain = parsechain,
+                       readable   = is_readable_map,
+                       writable   = is_writable_map
                })
        end
 
@@ -1429,7 +1448,8 @@ function _cbi(self, ...)
                        redirect      = redirect,
                        state         = state,
                        autoapply     = config.autoapply,
-                       trigger_apply = applymap
+                       trigger_apply = applymap,
+                       writable      = writable
                })
        end
 end