modules/luci-base: Fix ipaddrport validator to support ipv6
authorDaniel Dickinson <openwrt@daniel.thecshore.com>
Mon, 14 Dec 2015 12:38:31 +0000 (07:38 -0500)
committerDaniel Dickinson <openwrt@daniel.thecshore.com>
Wed, 16 Dec 2015 01:40:14 +0000 (20:40 -0500)
The previous versiono of ipaddrport validator only worked for ipv4
due to disallowing colons (:) in ip address which obvious fails for
ipv6.  We now instead allow either ipv4 address or an ipv6 address of
the form [<ipv6address>]:port

modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/luasrc/cbi/datatypes.lua

index 4b7227f..19a1ede 100644 (file)
@@ -172,17 +172,38 @@ var cbi_validators = {
                return false;
        },
 
                return false;
        },
 
-       'ipaddrport': function()
+       'ip4addrport': function()
        {
                var hp = this.split(/:/);
 
                if (hp.length == 2)
                        return (cbi_validators.ipaddr.apply(hp[0]) &&
                                cbi_validators.port.apply(hp[1]));
        {
                var hp = this.split(/:/);
 
                if (hp.length == 2)
                        return (cbi_validators.ipaddr.apply(hp[0]) &&
                                cbi_validators.port.apply(hp[1]));
-
                return false;
        },
 
                return false;
        },
 
+       'ipaddrport': function(bracket)
+       {
+               if (this.match(/^([^\[\]:]+):([^:]+)$/)) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip4addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+                } else if ((bracket == 1) && (this.match(/^\[(.+)\]:([^:]+)$/))) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip6addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+                } else if ((bracket != 1) && (this.match(/^([^\[\]]+):([^:]+)$/))) {
+                       var addr = RegExp.$1
+                       var port = RegExp.$2
+                       return (cbi_validators.ip6addr.apply(addr) &&
+                               cbi_validators.port.apply(port));
+               } else {
+                       return false;
+               }
+       },
+
        'wpakey': function()
        {
                var v = this;
        'wpakey': function()
        {
                var v = this;
index 4c003be..95d19d8 100644 (file)
@@ -189,9 +189,23 @@ function hostport(val)
        return not not (h and p and host(h) and port(p))
 end
 
        return not not (h and p and host(h) and port(p))
 end
 
-function ipaddrport(val)
+function ip4addrport(val)
        local h, p = val:match("^([^:]+):([^:]+)$")
        local h, p = val:match("^([^:]+):([^:]+)$")
-       return not not (h and p and ipaddr(h) and port(p))
+       return (h and p and ip4addr(h) and port(p))
+end
+
+function ipaddrport(val, bracket)
+       local h, p = val:match("^([^%[%]:]+):([^:]+)$")
+       if (h and p and ip4addr(h) and port(p)) then
+               return true
+       elseif (bracket == 1) then
+               h, p = val:match("^(%[.+%]):([^:]+)$")
+               if  (h and p and ip6addr(h) and port(p)) then
+                       return true
+               end
+       end
+       h, p = val:match("^([^%[%]]+):([^:]+)$")
+       return (h and p and ip6addr(h) and port(p))
 end
 
 function wpakey(val)
 end
 
 function wpakey(val)