luci-base: add ipmask, ipmask4 and ipmask6 validators

These validators accept IP address specifications in the form

 - address
 - address/bits
 - address/netmask

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2017-01-23 16:10:36 +01:00
parent 07ceede1be
commit 8297be5485
2 changed files with 78 additions and 0 deletions

View file

@ -118,6 +118,50 @@ var cbi_validators = {
return false;
},
'ipmask': function()
{
return cbi_validators.ipmask4.apply(this) ||
cbi_validators.ipmask6.apply(this);
},
'ipmask4': function()
{
var ip = this, mask = 32;
if (ip.match(/^(\S+)\/(\S+)$/))
{
ip = RegExp.$1;
mask = RegExp.$2;
}
if (!isNaN(mask) && (mask < 0 || mask > 32))
return false;
if (isNaN(mask) && !cbi_validators.ip4addr.apply(mask))
return false;
return cbi_validators.ip4addr.apply(ip);
},
'ipmask6': function()
{
var ip = this, mask = 128;
if (ip.match(/^(\S+)\/(\S+)$/))
{
ip = RegExp.$1;
mask = RegExp.$2;
}
if (!isNaN(mask) && (mask < 0 || mask > 128))
return false;
if (isNaN(mask) && !cbi_validators.ip6addr.apply(mask))
return false;
return cbi_validators.ip6addr.apply(ip);
},
'port': function()
{
var p = Int(this);

View file

@ -131,6 +131,40 @@ function ip6prefix(val)
return ( val and val >= 0 and val <= 128 )
end
function ipmask(val)
return ipmask4(val) or ipmask6(val)
end
function ipmask4(val)
local ip, mask = val:match("^([^/]+)/([^/]+)$")
local bits = tonumber(mask)
if bits and bits < 0 or bits > 32 then
return false
end
if not bits and not ip4addr(mask) then
return false
end
return ip4addr(ip or val)
end
function ipmask6(val)
local ip, mask = val:match("^([^/]+)/([^/]+)$")
local bits = tonumber(mask)
if bits and bits < 0 or bits > 128 then
return false
end
if not bits and not ip6addr(mask) then
return false
end
return ip6addr(ip or val)
end
function port(val)
val = tonumber(val)
return ( val and val >= 0 and val <= 65535 )