validation: Add option ipv4only option to host and hostport datatypes

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.
This commit is contained in:
Daniel Dickinson 2015-12-14 22:51:29 -05:00
parent bbcfad7953
commit c481f3f343
16 changed files with 33 additions and 26 deletions

View 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"

View 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. \

View 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

View 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"))

View 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

View 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"})

View 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;

View 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

View 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"

View 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"})

View 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

View 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

View 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"

View 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"))

View 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"

View 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"))