'require rpc';
'require form';
'require network';
+'require validation';
var callGetCertificateFiles = rpc.declare({
object: 'luci.openconnect',
o.value('pulse', 'Pulse Connect Secure SSL VPN');
o = s.taboption('general', form.Value, 'server', _('VPN Server'));
- o.datatype = 'host(0)';
+ o.validate = function(section_id, value) {
+ var m = String(value).match(/^(?:(\w+):\/\/|)(?:\[([0-9a-f:.]{2,45})\]|([^\/:]+))(?::([0-9]{1,5}))?(?:\/.*)?$/i);
+
+ if (!m)
+ return _('Invalid server URL');
+
+ if (m[1] != null) {
+ if (!m[1].match(/^(?:http|https|socks|socks4|socks5)$/i))
+ return _('Unsupported protocol');
+ }
+
+ if (m[2] != null) {
+ if (!validation.parseIPv6(m[2]))
+ return _('Invalid IPv6 address');
+ }
+
+ if (m[3] != null) {
+ if (!validation.parseIPv4(m[3])) {
+ if (!(m[3].length <= 253 &&
+ (m[3].match(/^[a-zA-Z0-9_]+$/) != null ||
+ (m[3].match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
+ m[3].match(/[^0-9.]/)))))
+ return _('Invalid hostname or IPv4 address');
+ }
+ }
+
+ if (m[4] != null) {
+ var p = +m[4];
+
+ if (p < 0 || p > 65535)
+ return _('Invalid port');
+ }
+
+ return true;
+ };
o = s.taboption('general', form.Value, 'port', _('VPN Server port'));
o.placeholder = '443';
o = s.taboption('general', form.Value, 'password2', _('Password2'));
o.password = true;
-
+
o = s.taboption('general', form.Value, 'proxy', _('Proxy Server'));
o.optional = true;
o.optional = true;
o.placeholder = 1406;
o.datatype = 'range(68, 9200)';
-
+
o = s.taboption('advanced', form.Value, 'reconnect_timeout', _('Reconnect Timeout'));
o.optional = true;
o.placeholder = 300;