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:
parent
bbcfad7953
commit
c481f3f343
16 changed files with 33 additions and 26 deletions
|
@ -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"
|
||||||
|
|
|
@ -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. \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"})
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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"})
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
Loading…
Reference in a new issue