luci-base: validation.js: add iprange, iprange4 and iprange6 validators
authorJo-Philipp Wich <jo@mein.io>
Wed, 21 Feb 2024 13:37:03 +0000 (14:37 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 21 Feb 2024 14:33:08 +0000 (15:33 +0100)
Add datatype validators for IP address ranges which are required for certain
firewall inputs.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/validation.js

index 9504e7f2c42678777a20392f6ee332c95f84d9b9..e4f8c7a2019e94480aab89dadbdb7929d2ad8325 100644 (file)
@@ -5,6 +5,19 @@ function bytelen(x) {
        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({
        __name__: 'Validation',
 
@@ -333,6 +346,23 @@ var ValidatorFactory = baseclass.extend({
                                _('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() {
                        var p = this.factory.parseInteger(this.value);
                        return this.assert(p >= 0 && p <= 65535, _('valid port value'));