diff --git a/webui-src/app/config/config_network.js b/webui-src/app/config/config_network.js index f6d821f..5af8f6d 100644 --- a/webui-src/app/config/config_network.js +++ b/webui-src/app/config/config_network.js @@ -5,21 +5,148 @@ const util = require('config/config_util'); // for future use /* eslint-disable no-unused-vars */ +const networkModes = [ + 'Public: DHT & Discovery', + 'Private: Discovery only', + 'Inverted: DHT only', + 'Dark Net: None', +]; + const SetNwMode = () => { + let vs_disc = 0; + let vs_dht = 0; + let selectedMode; let sslId; + let details; return { oninit: async () => { - // const res = await rs.rsJsonApiRequest('/rsPeers/getOwnId'); - console.log(util.getSslId()); + const res = await rs.rsJsonApiRequest('/rsaccounts/getCurrentAccountId'); + if (res.body.retval) { + sslId = res.body.id; + } + if (sslId) { + const res2 = await rs.rsJsonApiRequest('/rsPeers/getPeerDetails', { + sslId: sslId, + }); + if (res2.body.retval) { + details = res2.body.det; + } + } + if (details) { + if ( + details.vs_dht === util.RS_VS_DHT_FULL && + details.vs_disc === util.RS_VS_DISC_FULL + ) { + selectedMode = networkModes[0]; + } + else if ( + details.vs_dht === util.RS_VS_DHT_OFF && + details.vs_disc === util.RS_VS_DISC_FULL + ) { + selectedMode = networkModes[1]; + } + else if ( + details.vs_dht === util.RS_VS_DHT_FULL && + details.vs_disc === util.RS_VS_DISC_OFF + ) { + selectedMode = networkModes[2]; + } + else if ( + details.vs_dht === util.RS_VS_DHT_OFF && + details.vs_disc === util.RS_VS_DISC_OFF + ) { + selectedMode = networkModes[3]; + } + } }, - view: () => [ + view: (vnode) => [ m('p', 'Network mode:'), - + m( + 'select', + { + value: selectedMode, + onchange: async (e) => { + selectedMode = networkModes[e.target.selectedIndex]; + if (e.target.selectedIndex === 0) { + vs_disc = util.RS_VS_DISC_FULL; + vs_dht = util.RS_VS_DHT_FULL; + // Public: DHT & Discovery + } else if (e.target.selectedIndex === 1) { + vs_disc = util.RS_VS_DISC_FULL; + vs_dht = util.RS_VS_DHT_OFF; + // Private: Discovery only + } else if (e.target.selectedIndex === 2) { + vs_disc = util.RS_VS_DISC_OFF; + vs_dht = util.RS_VS_DHT_FULL; + // Inverted: DHT only + } else if (e.target.selectedIndex === 3) { + vs_disc = util.RS_VS_DISC_OFF; + vs_dht = util.RS_VS_DHT_OFF; + // Dark Net: None + } + if (sslId) { + const res2 = await rs.rsJsonApiRequest('/rsPeers/getPeerDetails', { + sslId: sslId, + }); + if (res2.body.retval) { + details = res2.body.det; + } + } + if ( + details && + (vs_dht != details.vs_dht || vs_disc != details.vs_disc) && + sslId !== undefined + ) { + const res = await rs.rsJsonApiRequest('/rsPeers/setVisState', { + sslId: sslId, + vsDisc: vs_disc, + vsDht: vs_dht, + }); + } + }, + }, + [networkModes.map((o) => m('option', { value: o }, o))] + ), ], }; }; +const NATmodes = ['Automatic (UPnP)', 'FireWalled', 'Manually Forwarded Port']; +const SetNAT = () => { + let sslId; + let selectedMode = NATmodes[0]; + + return { + oninit: async () => { + const res = await rs.rsJsonApiRequest('/rsIdentity/GetOwnSignedIds'); + if (res.body.retval) { + sslId = res.body.ids[0]; + } + }, + view: () => [ + m('p', 'NAT:'), + m( + 'select', + { + value: selectedMode, + onchange: (e) => { + selectedMode = NATmodes[e.target.selectedIndex]; + // console.log(selectedMode, e.target.selectedIndex); + if (e.target.selectedIndex === 0) { + // Automatic (UPnP) + } else if (e.target.selectedIndex === 1) { + // FireWalled + } else if (e.target.selectedIndex === 2) { + // Manually Forwarded Port + } + }, + }, + [NATmodes.map((o) => m('option', { value: o }, o))] + ), + ], + }; +}; const SetLimits = () => { let dlim = undefined; let ulim = undefined; @@ -109,17 +236,15 @@ Low traffic: 10% standard traffic and TODO: pause all file transfers\n` }; const Component = () => { + let details; + let sslId; return { view: () => m('.widget.widget-half', [ m('h3', 'Network Configuration'), m('hr'), - m('.grid-2col', [ - m(SetLimits), - m(SetOpMode), - m(SetNwMode), - ]), + m('.grid-2col', [m(SetLimits), m(SetOpMode), m(SetNwMode), m(SetNAT)]), ]), }; }; diff --git a/webui-src/app/config/config_util.js b/webui-src/app/config/config_util.js index b8d8be7..7de5531 100644 --- a/webui-src/app/config/config_util.js +++ b/webui-src/app/config/config_util.js @@ -1,17 +1,25 @@ const m = require('mithril'); const rs = require('rswebui'); +/* Visibility parameter for discovery */ +const RS_VS_DISC_OFF = 0x0000; +const RS_VS_DISC_MINIMAL = 0x0001; +const RS_VS_DISC_FULL = 0x0002; + +const RS_VS_DHT_OFF = 0x0000; +const RS_VS_DHT_PASSIVE = 0x0001; +const RS_VS_DHT_FULL = 0x0002; + function tooltip(text) { return m('.tooltip', [m('i.fas.fa-info-circle'), m('.tooltiptext', text)]); } -async function getSslId() { - let id = ''; - await rs.rsJsonApiRequest('/rsIdentity/GetOwnSignedIds', {}, (data) => (id = data.ids[0])); - return id; -} - module.exports = { tooltip, - getSslId, + RS_VS_DHT_FULL, + RS_VS_DHT_OFF, + RS_VS_DISC_FULL, + RS_VS_DHT_PASSIVE, + RS_VS_DISC_OFF, + RS_VS_DISC_MINIMAL }; diff --git a/webui-src/app/files/files_util.js b/webui-src/app/files/files_util.js index 16e8a11..fb8b291 100644 --- a/webui-src/app/files/files_util.js +++ b/webui-src/app/files/files_util.js @@ -17,6 +17,7 @@ const FT_STATE_CHECKING_HASH = 0x0007; const RS_FILE_REQ_ANONYMOUS_ROUTING = 0x00000040; const RS_FILE_HINTS_REMOTE = 0x00000008; +const RS_FILE_HINTS_LOCAL = 0x00000004; function makeFriendlyUnit(bytes) { let cnt = bytes; @@ -329,6 +330,7 @@ module.exports = { FT_STATE_CHECKING_HASH, RS_FILE_REQ_ANONYMOUS_ROUTING, RS_FILE_HINTS_REMOTE, + RS_FILE_HINTS_LOCAL, makeFriendlyUnit, File, SearchBar, diff --git a/webui-src/app/files/my_files.js b/webui-src/app/files/my_files.js index 8e532af..2ce916b 100644 --- a/webui-src/app/files/my_files.js +++ b/webui-src/app/files/my_files.js @@ -25,6 +25,7 @@ function displayfiles() { parStruct.details.children.map(async (child) => { const res = await rs.rsJsonApiRequest('/rsfiles/requestDirDetails', { handle: child.handle.xint64, + flags: util.RS_FILE_HINTS_LOCAL, }); childrenList.push(res.body.details); loaded = true;