Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-uhttpd: migrate to js spaces to tab Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-uhttpd: migrate to js Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-uhttpd: migrate to JavaScript-based implementation tab spaces Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-uhttpd: migrate to js luci-app-uhttpd: migrate to JavaScript-based implementation formatting Signed-off-by: Ayushman Tripathi <ayushmantripathi7724@gmail.com> luci-app-uhttpd: migrate to js luci-app-uhttpd: migrate to JavaScript-based implementation fix formatting bug luci-app-uhttpd: migrate to js luci-app-uhttpd: migrate to JavaScript-based implementation fix upload bug luci-app-uhttpd: migrate to js luci-app-uhttpd: migrate to js update dependency luci-app-uhttpd: migrate to js
- Loading branch information
1 parent
ad3509b
commit 678657b
Showing
5 changed files
with
272 additions
and
240 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
258 changes: 258 additions & 0 deletions
258
applications/luci-app-uhttpd/htdocs/luci-static/resources/view/uhttpd/uhttpd.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
'use strict'; | ||
'require view'; | ||
'require form'; | ||
'require fs'; | ||
'require uci'; | ||
|
||
return view.extend({ | ||
load: function () { | ||
return Promise.all([uci.load('uhttpd')]); | ||
}, | ||
render: function () { | ||
var lhttp = null; | ||
var lhttps = null; | ||
var cert_file = null; | ||
var key_file = null; | ||
var ucs = null; | ||
var uhttpdMap = new form.Map('uhttpd', _('uHTTPd'), _('A lightweight single-threaded HTTP(S) server')); | ||
|
||
ucs = uhttpdMap.section(form.TypedSection, 'uhttpd'); | ||
ucs.addremove = true; | ||
ucs.anonymous = false; | ||
|
||
ucs.tab('general', _('General Settings')); | ||
ucs.tab('server', _('Full Web Server Settings'), _('For settings primarily geared to serving more than the web UI')); | ||
ucs.tab('advanced', _('Advanced Settings'), _('Settings which are either rarely needed or which affect serving the WebUI')); | ||
|
||
lhttp = ucs.taboption('general', form.DynamicList, 'listen_http', _('HTTP listeners (address:port)'), _('Bind to specific interface:port (by specifying interface address')); | ||
lhttp.datatype = 'list(ipaddrport(1))'; | ||
|
||
lhttp.validate = function (section_id, value) { | ||
var have_https_listener = false; | ||
var have_http_listener = false; | ||
if (lhttp && lhttp.formvalue(section_id) && lhttp.formvalue(section_id).length > 0) { | ||
lhttp.formvalue(section_id).forEach(function (v) { | ||
if (v && v !== '') { | ||
have_http_listener = true; | ||
return false; | ||
} | ||
}); | ||
} | ||
if (lhttps && lhttps.formvalue(section_id) && lhttps.formvalue(section_id).length > 0) { | ||
lhttps.formvalue(section_id).forEach(function (v) { | ||
if (v && v !== '') { | ||
have_https_listener = true; | ||
return false; | ||
} | ||
}); | ||
} | ||
if (!(have_http_listener || have_https_listener)) { | ||
return [null, 'must listen on at least one address:port']; | ||
} | ||
return true; | ||
}; | ||
|
||
lhttps = ucs.taboption('general', form.DynamicList, 'listen_https', _('HTTPS listener (address:port)'), _('Bind to specific interface:port (by specifying interface address')); | ||
lhttps.datatype = 'list(ipaddrport(1))'; | ||
|
||
var cert = uci.get('uhttpd', 'main', 'cert'); | ||
var key = uci.get('uhttpd', 'main', 'key'); | ||
|
||
lhttps.validate = function (section_id, value) { | ||
let have_https_listener = false; | ||
let have_http_listener = false; | ||
|
||
if (lhttps && lhttps.formvalue(section_id) && lhttps.formvalue(section_id).length > 0) { | ||
lhttps.formvalue(section_id).forEach(function (v) { | ||
if (v && v !== '') { | ||
have_https_listener = true; | ||
return false; | ||
} | ||
}); | ||
if (have_https_listener && (!cert_file || !cert_file.formvalue(section_id) || cert_file.formvalue(section_id) === '')) { | ||
return [null, 'must have certificate when using https']; | ||
} | ||
if (have_https_listener && (!key_file || !key_file.formvalue(section_id) || key_file.formvalue(section_id) === '')) { | ||
return [null, 'must have key when using https']; | ||
} | ||
} | ||
|
||
if (lhttp && lhttp.formvalue(section_id) && lhttp.formvalue(section_id).length > 0) { | ||
lhttp.formvalue(section_id).forEach(function (v) { | ||
if (v && v !== '') { | ||
have_http_listener = true; | ||
return false; | ||
} | ||
}); | ||
} | ||
|
||
if (!(have_http_listener || have_https_listener)) { | ||
return [null, 'must listen on at least one address:port']; | ||
} | ||
|
||
return true; | ||
}; | ||
|
||
lhttps.depends({ cert, key }); | ||
|
||
var httptoHttps = ucs.taboption('general', form.Flag, 'redirect_https', _('Redirect all HTTP to HTTPS')); | ||
httptoHttps.default = httptoHttps.enabled; | ||
httptoHttps.rmempty = false; | ||
|
||
var rfc1918Filter = ucs.taboption('general', form.Flag, 'rfc1918_filter', _('Ignore private IPs on public interface'), _('Prevent access from private (RFC1918) IPs on an interface if it has an public IP address')); | ||
rfc1918Filter.default = rfc1918Filter.enabled; | ||
rfc1918Filter.rmempty = false; | ||
|
||
cert_file = ucs.taboption('general', form.FileUpload, 'cert', _('HTTPS Certificate (DER or PEM format)')); | ||
cert_file.root_directory = '/'; | ||
cert_file.enable_delete = false; | ||
|
||
key_file = ucs.taboption('general', form.FileUpload, 'key', _('HTTPS Private Key (DER or PEM format)')); | ||
key_file.root_directory = '/'; | ||
key_file.enable_delete = false; | ||
|
||
var removeOld = ucs.taboption('general', form.Button, 'remove_old', _('Remove old certificate and key'), _('uHTTPd will generate a new self-signed certificate using the configuration shown below.')); | ||
removeOld.inputstyle = 'remove'; | ||
|
||
removeOld.onclick = function (section_id) { | ||
fs.remove(`${uci.get('uhttpd', 'main', 'cert')}`) | ||
.then(() => fs.remove(`${uci.get('uhttpd', 'main', 'key')}`)) | ||
.then(() => { | ||
return fs.exec('/etc/init.d/uhttpd', ['restart']); | ||
}) | ||
.finally(() => { | ||
window.location.reload(); | ||
}); | ||
}; | ||
|
||
var removeConf = ucs.taboption('general', form.Button, 'remove_conf', _('Remove configuration for certificate and key'), _('This permanently deletes the cert, key, and configuration to use same.')); | ||
removeConf.inputstyle = 'remove'; | ||
removeConf.onclick = function (section_id) { | ||
fs.remove(`${uci.get('uhttpd', 'main', 'cert')}`) | ||
.then(() => fs.remove(`${uci.get('uhttpd', 'main', 'key')}`)) | ||
.then(() => { | ||
uci.unset('uhttpd', 'main', 'cert'); | ||
uci.unset('uhttpd', 'main', 'key'); | ||
uci.unset('uhttpd', 'main', 'listen_https'); | ||
return uci.save(); | ||
}) | ||
.then(() => { | ||
return fs.exec('/etc/init.d/uhttpd', ['restart']); | ||
}) | ||
.finally(() => { | ||
window.location.reload(); | ||
}); | ||
}; | ||
|
||
var indexPage = ucs.taboption('server', form.DynamicList, 'index_page', _('Index page(s)'), _('E.g specify with index.html and index.php when using PHP')); | ||
indexPage.optional = true; | ||
indexPage.placeholder = 'index.html'; | ||
|
||
var interpreter = ucs.taboption('server', form.DynamicList, 'interpreter', _('CGI filetype handler'), _("Interpreter to associate with file endings ('suffix=handler', e.g. '.php=/usr/bin/php-cgi')")); | ||
interpreter.optional = true; | ||
|
||
var noSymlinks = ucs.taboption('server', form.Flag, 'no_symlinks', _('Do not follow symlinks outside document root')); | ||
noSymlinks.optional = true; | ||
|
||
var noDirlists = ucs.taboption('server', form.Flag, 'no_dirlists', _('Do not generate directory listings.')); | ||
noDirlists.default = noDirlists.disabled; | ||
|
||
var alias = ucs.taboption('server', form.DynamicList, 'alias', _('Aliases'), _('(/old/path=/new/path) or (just /old/path which becomes /cgi-prefix/old/path)')); | ||
alias.optional = true; | ||
|
||
var realm = ucs.taboption('server', form.Value, 'realm', _('Realm for Basic Auth')); | ||
realm.optional = true; | ||
realm.placeholder = window.location.hostname || 'OpenWrt'; | ||
|
||
var httpconfig = ucs.taboption('server', form.Value, 'config', _('Config file (e.g. for credentials for Basic Auth)'), _('Will not use HTTP authentication if not present')); | ||
httpconfig.optional = true; | ||
|
||
var errorPage = ucs.taboption('server', form.Value, 'error_page', _('404 Error'), _("Virtual URL or CGI script to display on status '404 Not Found'. Must begin with '/'")); | ||
errorPage.optional = true; | ||
|
||
var docRoot = ucs.taboption('advanced', form.Value, 'home', _('Document root'), _('Base directory for files to be served')); | ||
docRoot.default = '/www'; | ||
docRoot.datatype = 'directory'; | ||
|
||
var cgiPrefix = ucs.taboption('advanced', form.Value, 'cgi_prefix', _('Path prefix for CGI scripts'), _('CGI is disabled if not present.')); | ||
cgiPrefix.optional = true; | ||
|
||
var luaPrefix = ucs.taboption('advanced', form.Value, 'lua_prefix', _('Virtual path prefix for Lua scripts')); | ||
luaPrefix.placeholder = '/lua'; | ||
luaPrefix.optional = true; | ||
|
||
var luaHandler = ucs.taboption('advanced', form.Value, 'lua_handler', _('Full real path to handler for Lua scripts'), _('Embedded Lua interpreter is disabled if not present.')); | ||
luaHandler.optional = true; | ||
|
||
var ubusPrefix = ucs.taboption('advanced', form.Value, 'ubus_prefix', _('Virtual path prefix for ubus via JSON-RPC integration'), _('ubus integration is disabled if not present')); | ||
ubusPrefix.optional = true; | ||
|
||
var ubusSocket = ucs.taboption('advanced', form.Value, 'ubus_socket', _('Override path for ubus socket')); | ||
ubusSocket.optional = true; | ||
|
||
var ubusCors = ucs.taboption('advanced', form.Flag, 'ubus_cors', _('Enable JSON-RPC Cross-Origin Resource Support')); | ||
ubusCors.default = ubusCors.disabled; | ||
ubusCors.optional = true; | ||
|
||
var noUbusauth = ucs.taboption('advanced', form.Flag, 'no_ubusauth', _('Disable JSON-RPC authorization via ubus session API')); | ||
noUbusauth.optional = true; | ||
noUbusauth.default = noUbusauth.disabled; | ||
|
||
var scriptTimeout = ucs.taboption('advanced', form.Value, 'script_timeout', _('Maximum wait time for Lua, CGI, or ubus execution')); | ||
scriptTimeout.placeholder = 60; | ||
scriptTimeout.datatype = 'uinteger'; | ||
scriptTimeout.optional = true; | ||
|
||
var networkTimeout = ucs.taboption('advanced', form.Value, 'network_timeout', _('Maximum wait time for network activity')); | ||
networkTimeout.placeholder = 30; | ||
networkTimeout.datatype = 'uinteger'; | ||
networkTimeout.optional = true; | ||
|
||
var httpKeepalive = ucs.taboption('advanced', form.Value, 'http_keepalive', _('Connection reuse')); | ||
httpKeepalive.placeholder = 20; | ||
httpKeepalive.datatype = 'uinteger'; | ||
httpKeepalive.optional = true; | ||
|
||
var tcpKeepalive = ucs.taboption('advanced', form.Value, 'tcp_keepalive', _('TCP Keepalive')); | ||
tcpKeepalive.optional = true; | ||
tcpKeepalive.datatype = 'uinteger'; | ||
tcpKeepalive.default = 1; | ||
|
||
var maxConnections = ucs.taboption('advanced', form.Value, 'max_connections', _('Maximum number of connections')); | ||
maxConnections.optional = true; | ||
maxConnections.datatype = 'uinteger'; | ||
|
||
var maxRequests = ucs.taboption('advanced', form.Value, 'max_requests', _('Maximum number of script requests')); | ||
maxRequests.optional = true; | ||
maxRequests.datatype = 'uinteger'; | ||
|
||
var certParam = uhttpdMap.section(form.TypedSection, 'cert', _('uHTTPd Self-signed Certificate Parameters')); | ||
|
||
certParam.template = 'cbi/tsection'; | ||
certParam.anonymous = true; | ||
|
||
var days = certParam.option(form.Value, 'days', _('Valid for # of Days')); | ||
days.default = 730; | ||
days.datatype = 'uinteger'; | ||
|
||
var bits = certParam.option(form.Value, 'bits', _('Length of key in bits')); | ||
bits.default = 2048; | ||
bits.datatype = 'min(1024)'; | ||
|
||
var commonname = certParam.option(form.Value, 'commonname', _('Server Hostname'), _('a.k.a CommonName')); | ||
commonname.default = window.location.hostname || 'OpenWrt'; | ||
|
||
var organization = certParam.option(form.Value, 'organization', _('Organization'), _('If empty, a random/unique value is used in cert generation')); | ||
|
||
var location = certParam.option(form.Value, 'location', _('Location')); | ||
location.default = 'Unknown'; | ||
|
||
var state = certParam.option(form.Value, 'state', _('State')); | ||
state.default = 'Unknown'; | ||
|
||
var country = certParam.option(form.Value, 'country', _('Country')); | ||
country.default = 'ZZ'; | ||
|
||
return uhttpdMap.render(); | ||
}, | ||
}); |
Oops, something went wrong.