luci-compat: fix evaluating `or()` and `and()` datatype expressions

Fixes: #5705
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
pull/5720/head
Jo-Philipp Wich 2022-03-10 13:22:25 +01:00
parent 315a592d9b
commit 03bb0e2493
1 changed files with 28 additions and 13 deletions

View File

@ -13,34 +13,49 @@ module "luci.cbi.datatypes"
_M['or'] = function(v, ...)
local i
for i = 1, select('#', ...), 2 do
local i, n = 1, select('#', ...)
while i <= n do
local f = select(i, ...)
local a = select(i+1, ...)
if type(f) ~= "function" then
if f == v then
i = i + 1
local c = v
if type(f) == "number" then
c = tonumber(c)
end
if f == c then
return true
end
else
i = i + 2
local a = select(i-1, ...)
if f(v, unpack(a)) then
return true
end
i = i - 1
elseif f(v, unpack(a)) then
return true
end
end
return false
end
_M['and'] = function(v, ...)
local i
for i = 1, select('#', ...), 2 do
local i, n = 1, select('#', ...)
while i <= n do
local f = select(i, ...)
local a = select(i+1, ...)
if type(f) ~= "function" then
if f ~= v then
i = i + 1
local c = v
if type(f) == "number" then
c = tonumber(c)
end
if f ~= c then
return false
end
i = i - 1
elseif not f(v, unpack(a)) then
return false
else
i = i + 2
local a = select(i-1, ...)
if not f(v, unpack(a)) then
return false
end
end
end
return true