validation: Add option ipv4only option to host and hostport datatypes
authorDaniel Dickinson <openwrt@daniel.thecshore.com>
Tue, 15 Dec 2015 03:51:29 +0000 (22:51 -0500)
committerDaniel Dickinson <openwrt@daniel.thecshore.com>
Wed, 16 Dec 2015 01:41:01 +0000 (20:41 -0500)
Some applications only support ipv4 so add ipv4only option
to host and hostport datatypes so that for thos applications
that when an IP address is specified only and ipv4 ip address
gets accepted.

16 files changed:
applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua
applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua
applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua
applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua
applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua
applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua
modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/luasrc/cbi/datatypes.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua
protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppossh.lua
protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua

index 9ff2ed97fe6aaa73d0a3fb992cc5b7cc6dcf2e41..a6087e9aec11524051a209dcb8a69e6afda67d76 100644 (file)
@@ -92,7 +92,7 @@ s = m:section(NamedSection, "voicemail_smtp", "voicemail", translate("Outgoing m
 s.anonymous = true
 
 serv = s:option(Value, "smtp_server", translate("SMTP Server Hostname or IP Address"))
-serv.datatype = "host"
+serv.datatype = "host(0)"
 
 port = s:option(Value, "smtp_port", translate("SMTP Port Number"))
 port.datatype = "port"
index 5d4f135c5b7bfa8d96abece5c6175513521e9972..34288c6632339fb08be75441a8d0776a7427afae 100644 (file)
@@ -264,7 +264,7 @@ h = s:taboption("remote_usage", Value, "externhost", translate("Domain/IP Addres
                 The best thing to input is a static IP address. If your IP address is dynamic and it changes, \
                 your configuration will become invalid. Hence, it's recommended to set up Dynamic DNS in this case. \
                 and enter your Dynamic DNS hostname here. You can configure Dynamic DNS with the luci-app-ddns package."))
-h.datatype = "host"
+h.datatype = "host(0)"
 
 p = s:taboption("remote_usage", Value, "bindport", translate("External SIP Port"),
                 translate("Pick a random port number between 6500 and 9500 for the service to listen on. \
index ed1ed1edb1715b592da08f968ec3ff9bea4fd25b..9b46202855837c4c92a870e73062624d404b1775 100644 (file)
@@ -84,7 +84,7 @@ function pwd.write(self, section, value)
 end
 
 h = s:option(Value, "host", translate("SIP Server/Registrar"))
-h.datatype = "host"
+h.datatype = "host(0)"
 
 p = s:option(ListValue, "register", translate("Enable Incoming Calls (Register via SIP)"),
              translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\) \
@@ -103,7 +103,7 @@ p.default = "yes"
 from = s:option(Value, "fromdomain",
                 translate("SIP Realm (needed by some providers)"))
 from.optional = true
-from.datatype = "host"
+from.datatype = "host(0)"
 
 port = s:option(Value, "port", translate("SIP Server/Registrar Port"))
 port.optional = true
@@ -111,6 +111,6 @@ port.datatype = "port"
 
 op = s:option(Value, "outboundproxy", translate("Outbound Proxy"))
 op.optional = true
-op.datatype = "host"
+op.datatype = "host(0)"
 
 return m
index 59266e553c45193ca351ddd2b62e1afdbfcff661..950d7a7971a363677e422dd2caae450a887924db 100644 (file)
@@ -12,7 +12,7 @@ enable.default = 0
 
 host = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from"))
 host.placeholder = "127.0.0.1"
-host.datatype = "host"
+host.datatype = "host(1)"
 host.rmempty = true
 
 port = s:option(Value, "Port", translate("Port"))
index 19bdd9afc1e4591743b206702b04b8239fb21aff..11f34fbad4591edf411047be421d55c8b7b992cd 100644 (file)
@@ -227,7 +227,7 @@ ta = s:option(Value, "target", translate("Target host"),
 
 ta.rmempty = true
 ta.placeholder = "0.0.0.0/0"
-ta.datatype = "host"
+ta.datatype = "host(1)"
 
 
 v = s:option(Value, "via", translate("Via proxy"),
@@ -235,5 +235,6 @@ v = s:option(Value, "via", translate("Via proxy"),
 
 v:depends({type="proxy"})
 v.placeholder = "10.0.0.1:8080"
+v.datatype = "ip4addrport"
 
 return m
index 883416b2194e1af5f4c4ed2b538ba69cedee0dd1..f64370bfe3a06b93e74facd69c45b188976e4f40 100644 (file)
@@ -38,7 +38,7 @@ period = s:option(Value, "period",
 pinghost = s:option(Value, "pinghosts", 
                    translate("Ping host"),
                    translate("Host address to ping"))
-pinghost.datatype = "host"
+pinghost.datatype = "host(1)"
 pinghost.default = "8.8.8.8"
 pinghost:depends({mode="ping"})
 
index 19a1edec4cf947d3a5a62206b14a655d8ac5acbd..1c4123bdadcb3cd7465e1277678ddede2b67137f 100644 (file)
@@ -139,10 +139,11 @@ var cbi_validators = {
                return (this.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null);
        },
 
-       'host': function()
+       'host': function(ipv4only)
        {
                return cbi_validators.hostname.apply(this) ||
-                       cbi_validators.ipaddr.apply(this);
+                       ((ipv4only != 1) && cbi_validators.ipaddr.apply(this)) ||
+                       ((ipv4only == 1) && cb_validators.ip4addr.apply(this));
        },
 
        'hostname': function()
@@ -161,12 +162,12 @@ var cbi_validators = {
                        cbi_validators.host.apply(this);
        },
 
-       'hostport': function()
+       'hostport': function(ipv4only)
        {
                var hp = this.split(/:/);
 
                if (hp.length == 2)
-                       return (cbi_validators.host.apply(hp[0]) &&
+                       return (cbi_validators.host.apply(hp[0], ipv4only) &&
                                cbi_validators.port.apply(hp[1]));
 
                return false;
index 95d19d88e0562aa2d1de71e5c24a868eb2fa068a..626ad91c756dac87272f5bcf3094b4105cfac087 100644 (file)
@@ -176,17 +176,22 @@ function hostname(val)
        return false
 end
 
-function host(val)
-       return hostname(val) or ipaddr(val)
+function host(val, ipv4only)
+       return hostname(val) or ((ipv4only == 1) and ip4addr(val)) or ((not (ipv4only == 1)) and ipaddr(val))
 end
 
 function network(val)
        return uciname(val) or host(val)
 end
 
-function hostport(val)
+function hostport(val, ipv4only)
        local h, p = val:match("^([^:]+):([^:]+)$")
-       return not not (h and p and host(h) and port(p))
+       return not not (h and p and host(h, ipv4only) and port(p))
+end
+
+function ip4addrport(val, bracket)
+       local h, p = val:match("^([^:]+):([^:]+)$")
+       return (h and p and ip4addr(h) and port(p))
 end
 
 function ip4addrport(val)
@@ -199,7 +204,7 @@ function ipaddrport(val, bracket)
        if (h and p and ip4addr(h) and port(p)) then
                return true
        elseif (bracket == 1) then
-               h, p = val:match("^(%[.+%]):([^:]+)$")
+               h, p = val:match("^%[(.+)%]:([^:]+)$")
                if  (h and p and ip6addr(h) and port(p)) then
                        return true
                end
index 4dc52ada06673829a363ad3a90504f61bdadbc47..572446feff30694bfb579bc1482c3cd95d52d73d 100644 (file)
@@ -135,7 +135,7 @@ rd = s:taboption("general", DynamicList, "rebind_domain",
        translate("List of domains to allow RFC1918 responses for"))
 
 rd:depends("rebind_protection", "1")
-rd.datatype = "host"
+rd.datatype = "host(1)"
 rd.placeholder = "ihost.netflix.com"
 
 
index b91c29b0884305705ba6c719454caad9df67036d..44528927e7ffc8ab657e03bb223ae22a839f3efc 100644 (file)
@@ -749,7 +749,7 @@ auth_server:depends({mode="ap", encryption="wpa2"})
 auth_server:depends({mode="ap-wds", encryption="wpa"})
 auth_server:depends({mode="ap-wds", encryption="wpa2"})
 auth_server.rmempty = true
-auth_server.datatype = "host"
+auth_server.datatype = "host(0)"
 
 auth_port = s:taboption("encryption", Value, "auth_port", translate("Radius-Authentication-Port"), translatef("Default %d", 1812))
 auth_port:depends({mode="ap", encryption="wpa"})
@@ -773,7 +773,7 @@ acct_server:depends({mode="ap", encryption="wpa2"})
 acct_server:depends({mode="ap-wds", encryption="wpa"})
 acct_server:depends({mode="ap-wds", encryption="wpa2"})
 acct_server.rmempty = true
-acct_server.datatype = "host"
+acct_server.datatype = "host(0)"
 
 acct_port = s:taboption("encryption", Value, "acct_port", translate("Radius-Accounting-Port"), translatef("Default %d", 1813))
 acct_port:depends({mode="ap", encryption="wpa"})
index 94ba8053ad84f698ec36271b0745da4e682e2da5..2874b5607e31716051393cc14fc6364f9ff661b5 100644 (file)
@@ -204,7 +204,7 @@ if has_ntpd then
 
 
                o = s:option(DynamicList, "server", translate("NTP server candidates"))
-               o.datatype = "host"
+               o.datatype = "host(0)"
                o:depends("enable", "1")
 
                -- retain server list even if disabled
index 9315dc25bfd50c13b0635994eb31e8962903174b..7b5e6043ccfef973fef090c3419425f3c8527cc0 100644 (file)
@@ -39,7 +39,7 @@ protocol.optional = true
 server = section:taboption("general", Value, "server",
        translate("Tunnel setup server"),
        translate("Optional, specify to override default server (tic.sixxs.net)"))
-server.datatype = "host"
+server.datatype = "host(0)"
 server.optional = true
 
 
index 4ed34ae3bcbb79368fc00ff848b3fd15276ca265..ad3f2edf0b33a1cbc6e888728549340c6b72f8e9 100644 (file)
@@ -13,7 +13,7 @@ oc_key_file = "/etc/openconnect/user-key-" .. ifc .. ".pem"
 oc_ca_file = "/etc/openconnect/ca-" .. ifc .. ".pem"
 
 server = section:taboption("general", Value, "server", translate("VPN Server"))
-server.datatype = "host"
+server.datatype = "host(0)"
 
 port = section:taboption("general", Value, "port", translate("VPN Server port"))
 port.placeholder = "443"
index 5e8b3fcaae5e79f0b58a33aab0049277b08093fc..506170c2de395f9e21b258083a2d674e1e8ced15 100644 (file)
@@ -8,7 +8,7 @@ local ipv6, defaultroute, metric, peerdns, dns, mtu
 
 
 server = section:taboption("general", Value, "server", translate("L2TP Server"))
-server.datatype = "or(host, hostport)"
+server.datatype = "or(host(1), hostport(1))"
 
 
 username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
index c93353af9076c6d7dab60fb4a847a3996debcd27..eca7bdd4d331b51b8bfc0ff2add96329bb8618cf 100644 (file)
@@ -8,7 +8,7 @@ local sshuser, server, port, ssh_options, identity, ipaddr, peeraddr
 sshuser = section:taboption("general", Value, "sshuser", translate("SSH username"))
 
 server = section:taboption("general", Value, "server", translate("SSH server address"))
-server.datatype = "host"
+server.datatype = "host(0)"
 
 port = section:taboption("general", Value, "port", translate("SSH server port"))
 port.datatype = "port"
index d81db1faeeaae7def27981b96272d2d6f0474885..462d7019f08fe7022aa73e3fce283c29c27b8cdb 100644 (file)
@@ -9,7 +9,7 @@ local defaultroute, metric, peerdns, dns,
 
 
 server = section:taboption("general", Value, "server", translate("VPN Server"))
-server.datatype = "host"
+server.datatype = "host(0)"
 
 
 username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))