luci-base: validation.js: add iprange, iprange4 and iprange6 validators

Add datatype validators for IP address ranges which are required for certain
firewall inputs.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2024-02-21 14:37:03 +01:00
parent 5ef203a46e
commit cf09f89df3

View file

@ -5,6 +5,19 @@ function bytelen(x) {
return new Blob([x]).size; return new Blob([x]).size;
} }
function arrayle(a, b) {
if (!Array.isArray(a) || !Array.isArray(b))
return false;
for (var i = 0; i < a.length; i++)
if (a[i] > b[i])
return false;
else if (a[i] < b[i])
return true;
return true;
}
var Validator = baseclass.extend({ var Validator = baseclass.extend({
__name__: 'Validation', __name__: 'Validation',
@ -333,6 +346,23 @@ var ValidatorFactory = baseclass.extend({
_('valid IPv6 network')); _('valid IPv6 network'));
}, },
iprange: function(negative) {
return this.assert(this.apply('iprange4', null, [negative]) || this.apply('iprange6', null, [negative]),
_('valid IP address range'));
},
iprange4: function(negative) {
var m = this.value.split('-');
return this.assert(m.length == 2 && arrayle(this.factory.parseIPv4(m[0]), this.factory.parseIPv4(m[1])),
_('valid IPv4 address range'));
},
iprange6: function(negative) {
var m = this.value.split('-');
return this.assert(m.length == 2 && arrayle(this.factory.parseIPv6(m[0]), this.factory.parseIPv6(m[1])),
_('valid IPv6 address range'));
},
port: function() { port: function() {
var p = this.factory.parseInteger(this.value); var p = this.factory.parseInteger(this.value);
return this.assert(p >= 0 && p <= 65535, _('valid port value')); return this.assert(p >= 0 && p <= 65535, _('valid port value'));