local ip = require "luci.ip"
local math = require "math"
local util = require "luci.util"
+local tonumber, tostring, type, unpack, select = tonumber, tostring, type, unpack, select
-local tonumber = tonumber
module "luci.cbi.datatypes"
+_M['or'] = function(v, ...)
+ local i
+ for i = 1, select('#', ...), 2 do
+ local f = select(i, ...)
+ local a = select(i+1, ...)
+ if type(f) ~= "function" then
+ if f == v 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 f = select(i, ...)
+ local a = select(i+1, ...)
+ if type(f) ~= "function" then
+ if f ~= v then
+ return false
+ end
+ i = i - 1
+ elseif not f(v, unpack(a)) then
+ return false
+ end
+ end
+ return true
+end
+
+function neg(v, ...)
+ return _M['or'](v:gsub("^%s*!%s*", ""), ...)
+end
+
+function list(v, subvalidator, subargs)
+ if type(subvalidator) ~= "function" then
+ return false
+ end
+ local token
+ for token in v:gmatch("%S+") do
+ if not subvalidator(token, unpack(subargs)) then
+ return false
+ end
+ end
+ return true
+end
+
function bool(val)
if val == "1" or val == "yes" or val == "on" or val == "true" then
return true
function port(val)
val = tonumber(val)
- return ( val and val >= 1 and val <= 65535 )
+ return ( val and val >= 0 and val <= 65535 )
end
function portrange(val)
end
function hostname(val)
- if val and val:match("[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*") then
- return true -- XXX: ToDo: need better solution
+ if val and (#val < 254) and (
+ val:match("^[a-zA-Z_]+$") or
+ (val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and
+ val:match("[^0-9%.]"))
+ ) then
+ return true
end
-
return false
end
return hostname(val) or ipaddr(val)
end
+function network(val)
+ return uciname(val) or host(val)
+end
+
function wpakey(val)
if #val == 64 then
return (val:match("^[a-fA-F0-9]+$") ~= nil)
if (#val == 10) or (#val == 26) then
return (val:match("^[a-fA-F0-9]+$") ~= nil)
else
- return (#v == 5) or (#v == 13)
+ return (#val == 5) or (#val == 13)
end
end
return false
end
+
+function min(val, min)
+ val = tonumber(val)
+ min = tonumber(min)
+
+ if val ~= nil and min ~= nil then
+ return (val >= min)
+ end
+
+ return false
+end
+
+function max(val, max)
+ val = tonumber(val)
+ max = tonumber(max)
+
+ if val ~= nil and max ~= nil then
+ return (val <= max)
+ end
+
+ return false
+end
+
+function rangelength(val, min, max)
+ val = tostring(val)
+ min = tonumber(min)
+ max = tonumber(max)
+
+ if val ~= nil and min ~= nil and max ~= nil then
+ return ((#val >= min) and (#val <= max))
+ end
+
+ return false
+end
+
+function minlength(val, min)
+ val = tostring(val)
+ min = tonumber(min)
+
+ if val ~= nil and min ~= nil then
+ return (#val >= min)
+ end
+
+ return false
+end
+
+function maxlength(val, max)
+ val = tostring(val)
+ max = tonumber(max)
+
+ if val ~= nil and max ~= nil then
+ return (#val <= max)
+ end
+
+ return false
+end
+
+function phonedigit(val)
+ return (val:match("^[0-9\*#]+$") ~= nil)
+end