From 8297be5485c6444a24bc890099336271012cb9e1 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 23 Jan 2017 16:10:36 +0100 Subject: [PATCH] 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 --- .../htdocs/luci-static/resources/cbi.js | 44 +++++++++++++++++++ modules/luci-base/luasrc/cbi/datatypes.lua | 34 ++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/modules/luci-base/htdocs/luci-static/resources/cbi.js b/modules/luci-base/htdocs/luci-static/resources/cbi.js index 0ca7e264a7..8e66cbc380 100644 --- a/modules/luci-base/htdocs/luci-static/resources/cbi.js +++ b/modules/luci-base/htdocs/luci-static/resources/cbi.js @@ -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); diff --git a/modules/luci-base/luasrc/cbi/datatypes.lua b/modules/luci-base/luasrc/cbi/datatypes.lua index 9b48643607..2039a3516b 100644 --- a/modules/luci-base/luasrc/cbi/datatypes.lua +++ b/modules/luci-base/luasrc/cbi/datatypes.lua @@ -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 ) -- 2.30.2