diff options
author | Sergey Ponomarev <stokito@gmail.com> | 2023-12-04 21:09:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-04 20:09:55 +0100 |
commit | 3283cb2ebdb3dbd8ae744125ecd577a0025d14ad (patch) | |
tree | bffba1626a2ffeab830ab888b0ac8b794e68f8db /applications/luci-app-tor/htdocs/luci-static/resources | |
parent | 7d14746ae88a83163a7e34daae70b264285bbe56 (diff) |
luci-app-tor: Manage tor-hs onion services (#6476)
* luci-app-tor: Manage Onion services (tor-hs)
The tor-hs packages provides Tor Onion (Hidden) Services.
This is a good option to bypass NAT and have stable access to a router.
Later once the main Tor package gains a support of a Proxy/Bridge configuration.
We can add this to the same luci app as a different view.
Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
Diffstat (limited to 'applications/luci-app-tor/htdocs/luci-static/resources')
-rw-r--r-- | applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js b/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js new file mode 100644 index 0000000000..ef8368ec1c --- /dev/null +++ b/applications/luci-app-tor/htdocs/luci-static/resources/view/tor/tor-hs.js @@ -0,0 +1,108 @@ +'use strict'; +'require view'; +'require form'; +'require rpc'; +'require uci'; + +var callTorHsList = rpc.declare({ + object: 'tor-hs-rpc', + method: 'list-hs', +}); + + +return view.extend({ + load: function () { + return Promise.all([ + L.resolveDefault(callTorHsList(), {}), + ]); + }, + + render: function (data) { + var hsList = []; + if (data[0]['hs-list']) { + hsList = data[0]['hs-list']; + } + var hsMap = new Map(); + hsList.forEach(function (hs) { + hsMap.set(hs.name, hs.hostname); + }); + + var m, s, o; + + m = new form.Map('tor-hs', _('Tor Onion Services'), + _('Tor Onion (Hidden) Services are proxy tunnels to your local website, SSH and other services.') + '<br />' + + _('For further information <a %s>check the documentation</a>') + .format('href="https://openwrt.org/docs/guide-user/services/tor/hs" target="_blank" rel="noreferrer"') + ); + + s = m.section(form.GridSection, 'hidden-service', _('Tor Onion Services')); + s.addremove = true; + s.nodescriptions = true; + s.sectiontitle = function (section_id) { + let tor = uci.get('tor-hs', section_id); + let sectionName = section_id; + if (tor['.anonymous']) { + sectionName = tor['Name']; + } + return sectionName; + }; + + o = s.option(form.Flag, 'Enabled', _('Enabled')); + o.default = '1'; + o.rmempty = false; + // We also need to set Name field with the same name as section + // The only option to do that is to override write() for some other field i.e. Enabled + o.write = function (section_id, formvalue) { + // first save the Enabled + uci.set('tor-hs', section_id, 'Enabled', formvalue); + // set Name field + var name = this.map.data.get(this.map.config, section_id, 'Name') || ''; + if (!name) { + // Typically the empty Name happens for new unsaved sections + name = section_id; + // manually set Name to trigger change + uci.set('tor-hs', section_id, 'Name', name); + } + return name; + }; + + o = s.option(form.DummyValue, '_Domain', _('Onion domain')); + o.modalonly = false; + o.rawhtml = true; + o.textvalue = function (section_id) { + var name = uci.get('tor-hs', section_id, 'Name'); + if (!name) + return ''; + var hostname = hsMap.get(name); + if (!hostname) + return ''; + return '<a href="http://' + hostname + '" target="_blank" rel="noreferrer">' + _('Link') + '</a>'; + }; + + o = s.option(form.Value, 'Description', _('Description')); + o.modalonly = true; + + o = s.option(form.Value, 'IPv4', _('Destination address'), + _('Traffic will be forwarded to the target hostname') + ); + o.datatype = 'host'; + o.default = '127.0.0.1'; + + o = s.option(form.DynamicList, 'PublicLocalPort', _('Public ports to local'), + _('A single <code>Port</code> when the public port is the same as local e.g. <code>80</code>.') + '<br />' + + _('A pair <code>PublicPort;LocalPort</code> e.g. <code>80;8080</code>.') + '<br />' + + _('A pair <code>PublicPort;unix:Socket</code> e.g. <code>80;unix:/var/run/nginx.sock</code>.') + ); + o.datatype = 'list(string)'; + o.default = ['80', '443']; // by default expose http and https ports + o.rmempty = false; + + o = s.option(form.Value, 'HookScript', _('Hook Script'), + _('Path to script which is executed after starting Tor.') + '<br />' + + _('The .onion domain is passed into the script via parameter <code>--update-onion HOSTNAME</code>.') + ); + o.modalonly = true; + + return m.render(); + }, +}); |