luci-base: datatypes: add cidr, ipnet validator type
[project/luci.git] / modules / luci-base / luasrc / cbi / datatypes.lua
index 62b0e0f..df23aaf 100644 (file)
@@ -132,38 +132,40 @@ function ip6prefix(val)
        return ( val and val >= 0 and val <= 128 )
 end
 
-function ipmask(val)
-       return ipmask4(val) or ipmask6(val)
+function cidr4(val)
+       local ip, mask = val:match("^([^/]+)/([^/]+)$")
+
+       return ip4addr(ip) and ip4prefix(mask)
 end
 
-function ipmask4(val)
+function cidr6(val)
        local ip, mask = val:match("^([^/]+)/([^/]+)$")
-       local bits = tonumber(mask)
 
-       if bits and (bits < 0 or bits > 32) then
-               return false
-       end
+       return ip6addr(ip) and ip6prefix(mask)
+end
 
-       if not bits and mask and not ip4addr(mask) then
-               return false
-       end
+function ipnet4(val)
+       local ip, mask = val:match("^([^/]+)/([^/]+)$")
 
-       return ip4addr(ip or val)
+       return ip4addr(ip) and ip4addr(mask)
 end
 
-function ipmask6(val)
+function ipnet6(val)
        local ip, mask = val:match("^([^/]+)/([^/]+)$")
-       local bits = tonumber(mask)
 
-       if bits and (bits < 0 or bits > 128) then
-               return false
-       end
+       return ip6addr(ip) and ip6addr(mask)
+end
 
-       if not bits and mask and not ip6addr(mask) then
-               return false
-       end
+function ipmask(val)
+       return ipmask4(val) or ipmask6(val)
+end
+
+function ipmask4(val)
+       return cidr4(val) or ipnet4(val) or ip4addr(val)
+end
 
-       return ip6addr(ip or val)
+function ipmask6(val)
+       return cidr6(val) or ipnet6(val) or ip6addr(val)
 end
 
 function ip6hostid(val)
@@ -283,6 +285,14 @@ function hexstring(val)
        return false
 end
 
+function hex(val, maxbytes)
+       maxbytes = tonumber(maxbytes)
+       if val and maxbytes ~= nil then
+               return ((val:match("^0x[a-fA-F0-9]+$") ~= nil) and (#val <= 2 + maxbytes * 2))
+       end
+       return false
+end
+
 function base64(val)
        if val then
                return (val:match("^[a-zA-Z0-9/+]+=?=?$") ~= nil) and (math.fmod(#val, 4) == 0)