luci-base: fix list method handling in ubus-rpc protocol proxy
authorJo-Philipp Wich <jo@mein.io>
Thu, 12 Sep 2019 12:00:47 +0000 (14:00 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 12 Sep 2019 12:00:47 +0000 (14:00 +0200)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/luasrc/controller/admin/index.lua

index b0427d6c058515197bae8ff61133dffbd0baa80f..928faa14b40e78fd243e36172272304ccc14c340 100644 (file)
@@ -147,6 +147,8 @@ local function ubus_reply(id, data, code, errmsg)
                        code = code,
                        message = errmsg
                }
+       elseif type(code) == "table" then
+               reply.result = code
        else
                reply.result = { code, data }
        end
@@ -178,11 +180,14 @@ local function ubus_access(sid, obj, fun)
 end
 
 local function ubus_request(req)
-       if type(req) ~= "table" or type(req.method) ~= "string" or type(req.params) ~= "table" or
-          #req.params < 2 or req.jsonrpc ~= "2.0" or req.id == nil then
+       if type(req) ~= "table" or type(req.method) ~= "string" or req.jsonrpc ~= "2.0" or req.id == nil then
                return ubus_reply(nil, nil, -32600, "Invalid request")
 
        elseif req.method == "call" then
+               if type(req.params) ~= "table" or #req.params < 3 then
+                       return ubus_reply(nil, nil, -32600, "Invalid parameters")
+               end
+
                local sid, obj, fun, arg =
                        req.params[1], req.params[2], req.params[3], req.params[4] or {}
                if type(arg) ~= "table" or arg.ubus_rpc_session ~= nil then
@@ -203,34 +208,38 @@ local function ubus_request(req)
                return ubus_reply(req.id, res, code or 0)
 
        elseif req.method == "list" then
-               if type(params) ~= "table" or #params == 0 then
-                       local objs = { luci.util.ubus() }
-                       return ubus_reply(req.id, objs, 0)
-               else
+               if req.params == nil or (type(req.params) == "table" and #req.params == 0) then
+                       local objs = luci.util.ubus()
+                       return ubus_reply(req.id, nil, objs)
+
+               elseif type(req.params) == "table" then
                        local n, rv = nil, {}
-                       for n = 1, #params do
-                               if type(params[n]) ~= "string" then
+                       for n = 1, #req.params do
+                               if type(req.params[n]) ~= "string" then
                                        return ubus_reply(req.id, nil, -32602, "Invalid parameters")
                                end
 
-                               local sig = luci.util.ubus(params[n])
+                               local sig = luci.util.ubus(req.params[n])
                                if sig and type(sig) == "table" then
-                                       rv[params[n]] = {}
+                                       rv[req.params[n]] = {}
 
                                        local m, p
                                        for m, p in pairs(sig) do
                                                if type(p) == "table" then
-                                                       rv[params[n]][m] = {}
+                                                       rv[req.params[n]][m] = {}
 
                                                        local pn, pt
                                                        for pn, pt in pairs(p) do
-                                                               rv[params[n]][m][pn] = ubus_types[pt] or "unknown"
+                                                               rv[req.params[n]][m][pn] = ubus_types[pt] or "unknown"
                                                        end
                                                end
                                        end
                                end
                        end
-                       return ubus_reply(req.id, rv, 0)
+                       return ubus_reply(req.id, nil, rv)
+
+               else
+                       return ubus_reply(req.id, nil, -32602, "Invalid parameters")
                end
        end