From cc81d5a0d4b73fc62e67c4659e08f653cbcdfaef Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 12 Sep 2019 14:00:47 +0200 Subject: luci-base: fix list method handling in ubus-rpc protocol proxy Signed-off-by: Jo-Philipp Wich --- .../luci-base/luasrc/controller/admin/index.lua | 35 ++++++++++++++-------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'modules/luci-base') diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua index b0427d6c05..928faa14b4 100644 --- a/modules/luci-base/luasrc/controller/admin/index.lua +++ b/modules/luci-base/luasrc/controller/admin/index.lua @@ -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 -- cgit v1.2.3