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 s.anonymous = true
serv = s:option(Value, "smtp_server", translate("SMTP Server Hostname or IP Address")) 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 = s:option(Value, "smtp_port", translate("SMTP Port Number"))
port.datatype = "port" 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, \ 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. \ 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.")) 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"), 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. \ 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 end
h = s:option(Value, "host", translate("SIP Server/Registrar")) 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)"), 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\) \ 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", from = s:option(Value, "fromdomain",
translate("SIP Realm (needed by some providers)")) translate("SIP Realm (needed by some providers)"))
from.optional = true from.optional = true
from.datatype = "host" from.datatype = "host(0)"
port = s:option(Value, "port", translate("SIP Server/Registrar Port")) port = s:option(Value, "port", translate("SIP Server/Registrar Port"))
port.optional = true port.optional = true
@ -111,6 +111,6 @@ port.datatype = "port"
op = s:option(Value, "outboundproxy", translate("Outbound Proxy")) op = s:option(Value, "outboundproxy", translate("Outbound Proxy"))
op.optional = true op.optional = true
op.datatype = "host" op.datatype = "host(0)"
return m 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 = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from"))
host.placeholder = "127.0.0.1" host.placeholder = "127.0.0.1"
host.datatype = "host" host.datatype = "host(1)"
host.rmempty = true host.rmempty = true
port = s:option(Value, "Port", translate("Port")) 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.rmempty = true
ta.placeholder = "0.0.0.0/0" ta.placeholder = "0.0.0.0/0"
ta.datatype = "host" ta.datatype = "host(1)"
v = s:option(Value, "via", translate("Via proxy"), 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:depends({type="proxy"})
v.placeholder = "10.0.0.1:8080" v.placeholder = "10.0.0.1:8080"
v.datatype = "ip4addrport"
return m return m

View file

@ -38,7 +38,7 @@ period = s:option(Value, "period",
pinghost = s:option(Value, "pinghosts", pinghost = s:option(Value, "pinghosts",
translate("Ping host"), translate("Ping host"),
translate("Host address to ping")) translate("Host address to ping"))
pinghost.datatype = "host" pinghost.datatype = "host(1)"
pinghost.default = "8.8.8.8" pinghost.default = "8.8.8.8"
pinghost:depends({mode="ping"}) 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); 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) || 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() 'hostname': function()
@ -161,12 +162,12 @@ var cbi_validators = {
cbi_validators.host.apply(this); cbi_validators.host.apply(this);
}, },
'hostport': function() 'hostport': function(ipv4only)
{ {
var hp = this.split(/:/); var hp = this.split(/:/);
if (hp.length == 2) 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])); cbi_validators.port.apply(hp[1]));
return false; return false;

View file

@ -176,17 +176,22 @@ function hostname(val)
return false return false
end end
function host(val) function host(val, ipv4only)
return hostname(val) or ipaddr(val) return hostname(val) or ((ipv4only == 1) and ip4addr(val)) or ((not (ipv4only == 1)) and ipaddr(val))
end end
function network(val) function network(val)
return uciname(val) or host(val) return uciname(val) or host(val)
end end
function hostport(val) function hostport(val, ipv4only)
local h, p = val:match("^([^:]+):([^:]+)$") 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 end
function ip4addrport(val) function ip4addrport(val)
@ -199,7 +204,7 @@ function ipaddrport(val, bracket)
if (h and p and ip4addr(h) and port(p)) then if (h and p and ip4addr(h) and port(p)) then
return true return true
elseif (bracket == 1) then elseif (bracket == 1) then
h, p = val:match("^(%[.+%]):([^:]+)$") h, p = val:match("^%[(.+)%]:([^:]+)$")
if (h and p and ip6addr(h) and port(p)) then if (h and p and ip6addr(h) and port(p)) then
return true return true
end end

View file

@ -135,7 +135,7 @@ rd = s:taboption("general", DynamicList, "rebind_domain",
translate("List of domains to allow RFC1918 responses for")) translate("List of domains to allow RFC1918 responses for"))
rd:depends("rebind_protection", "1") rd:depends("rebind_protection", "1")
rd.datatype = "host" rd.datatype = "host(1)"
rd.placeholder = "ihost.netflix.com" 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="wpa"})
auth_server:depends({mode="ap-wds", encryption="wpa2"}) auth_server:depends({mode="ap-wds", encryption="wpa2"})
auth_server.rmempty = true 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 = s:taboption("encryption", Value, "auth_port", translate("Radius-Authentication-Port"), translatef("Default %d", 1812))
auth_port:depends({mode="ap", encryption="wpa"}) 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="wpa"})
acct_server:depends({mode="ap-wds", encryption="wpa2"}) acct_server:depends({mode="ap-wds", encryption="wpa2"})
acct_server.rmempty = true 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 = s:taboption("encryption", Value, "acct_port", translate("Radius-Accounting-Port"), translatef("Default %d", 1813))
acct_port:depends({mode="ap", encryption="wpa"}) 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 = s:option(DynamicList, "server", translate("NTP server candidates"))
o.datatype = "host" o.datatype = "host(0)"
o:depends("enable", "1") o:depends("enable", "1")
-- retain server list even if disabled -- retain server list even if disabled

View file

@ -39,7 +39,7 @@ protocol.optional = true
server = section:taboption("general", Value, "server", server = section:taboption("general", Value, "server",
translate("Tunnel setup server"), translate("Tunnel setup server"),
translate("Optional, specify to override default server (tic.sixxs.net)")) translate("Optional, specify to override default server (tic.sixxs.net)"))
server.datatype = "host" server.datatype = "host(0)"
server.optional = true 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" oc_ca_file = "/etc/openconnect/ca-" .. ifc .. ".pem"
server = section:taboption("general", Value, "server", translate("VPN Server")) 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 = section:taboption("general", Value, "port", translate("VPN Server port"))
port.placeholder = "443" 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 = 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")) 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")) sshuser = section:taboption("general", Value, "sshuser", translate("SSH username"))
server = section:taboption("general", Value, "server", translate("SSH server address")) 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 = section:taboption("general", Value, "port", translate("SSH server port"))
port.datatype = "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 = 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")) username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))