SimpleMode: automatic public nodes discovering and switching

This commit is contained in:
xiphon
2019-09-02 21:32:36 +00:00
parent a5b2d5e727
commit 0d247a9b8a
10 changed files with 67 additions and 289 deletions

View File

@@ -72,7 +72,6 @@ Rectangle {
wizardController.tmpWalletFilename = '';
wizardController.walletRestoreMode = 'seed'
wizardController.walletOptionsSubaddressLookahead = '';
wizardController.remoteNodes = {};
disconnect();
if (typeof wizardController.m_wallet !== 'undefined'){
@@ -107,7 +106,6 @@ Rectangle {
property string walletOptionsDeviceName: ''
property bool walletOptionsDeviceIsRestore: false
property string tmpWalletFilename: ''
property var remoteNodes: ''
// language settings, updated via sidebar
property string language_locale: 'en_US'
@@ -560,87 +558,6 @@ Rectangle {
passwordDialog.open(appWindow.usefulName(appWindow.walletPath()));
}
function fetchRemoteNodes(cb, cb_err){
// Fetch remote nodes, parse JSON, store in result `wizardController.remoteNodes`, call setAutNode(), call callback
var url = appWindow.remoteNodeService + 'api/nodes.json';
console.log("HTTP request: " + url);
var xhr = new XMLHttpRequest();
xhr.timeout = 3500;
// Unfortunately we cannot spoof User-Agent since it is hardcoded in Qt
//xhr.setRequestHeader("User-Agent", "-");
xhr.onreadystatechange = function() {
var msg;
if (xhr.readyState != 4) {
return;
} else if(xhr.status != 200){
msg = "Error fetching remote nodes; status code was not 200";
console.log(msg);
if(typeof cb_err === 'function')
return cb_err(msg);
} else {
var body = xhr.responseText;
if(typeof body === 'undefined' || body === ''){
msg = "Error fetching remote nodes; response body was empty";
console.log(msg);
if(typeof cb_err === 'function')
return cb_err(msg);
}
var data = JSON.parse(body);
wizardController.remoteNodes = data;
console.log("node list updated");
setAutoNode();
return cb();
}
}
xhr.open('GET', url, true);
xhr.send(null);
}
function setAutoNode(){
var node;
var nodes;
var nodeObject = wizardController.remoteNodes;
var region = persistentSettings.remoteNodeRegion;
if(typeof region !== 'undefined' && region !== ""){
if(nodeObject.hasOwnProperty(region) && nodeObject[region].length > 0){
nodes = nodeObject[region];
} else {
console.log("No suitable nodes found for region " + region + ". Defaulting to random node.");
}
}
if(typeof nodes === 'undefined'){
nodes = [];
Object.keys(nodeObject).forEach(function(obj, i){
nodes = nodes.concat(nodeObject[obj]);
});
}
// 18089 has precedence
var filteredNodes = Utils.filterNodes(nodes, "18089");
if(filteredNodes.length > 0){
node = Utils.randomChoice(filteredNodes);
console.log('Choosing remote node \''+ node +'\' from a list of ' + filteredNodes.length);
} else if(nodes.length > 0){
node = Utils.randomChoice(nodes);
console.log('Choosing remote node \''+ node +'\' from a list of ' + nodes.length);
} else {
console.log("No suitable nodes found.")
return ''
}
if(appWindow.walletMode === 0)
persistentSettings.remoteNodeAddress = node;
else if(appWindow.walletMode === 1)
persistentSettings.bootstrapNodeAddress = node;
}
Component.onCompleted: {
//
}

View File

@@ -74,12 +74,7 @@ Rectangle {
wizardController.walletOptionsPassword = passwordFields.password;
if(appWindow.walletMode === 0 || appWindow.walletMode === 1){
wizardController.fetchRemoteNodes(function(){
wizardStateView.state = "wizardCreateWallet4";
}, function(){
appWindow.showStatusMessage(qsTr("Failed to fetch remote nodes from third-party server."), 5);
wizardStateView.state = "wizardCreateWallet4";
});
wizardStateView.state = "wizardCreateWallet4";
} else {
wizardStateView.state = "wizardCreateWallet3";
}

View File

@@ -97,49 +97,6 @@ Rectangle {
text: qsTr("Remain aware of these limitations. <b>Users who prioritize privacy and decentralization must use a full node instead</b>.") + translationManager.emptyString
}
MoneroComponents.TextPlain {
text: qsTr("For enhanced node performance you may specify your region:") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.topMargin: 8
Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor
}
GridLayout {
columns: 3
columnSpacing: 20
ColumnLayout {
Layout.fillWidth: true
spacing: 0
MoneroComponents.StandardDropdown {
id: regionDropdown
Layout.fillWidth: true
dataModel: regionModel
currentIndex: 0
onChanged: {
var region = regionModel.get(currentIndex).region;
persistentSettings.remoteNodeRegion = region;
}
}
}
Item {
Layout.fillWidth: true
}
Item {
Layout.fillWidth: true
}
z: parent.z + 1
}
MoneroComponents.CheckBox {
id: understoodCheckbox
Layout.topMargin: 20
@@ -184,22 +141,4 @@ Rectangle {
wizardModeBootstrapWarning.understood = false;
understoodCheckbox.checked = false;
}
Component.onCompleted: {
var region = persistentSettings.remoteNodeRegion;
if(region){
for(var i = 0; i !== regionDropdown.dataModel.count; i++){
var item = regionDropdown.dataModel.get(i);
if(item['region'] === region){
regionDropdown.currentIndex = i;
break;
}
}
} else {
regionDropdown.currentIndex = 0;
}
regionDropdown.update();
}
}

View File

@@ -100,49 +100,6 @@ Rectangle {
text: qsTr("Remain aware of these limitations. <b>Users who prioritize privacy and decentralization must use a full node instead</b>.") + translationManager.emptyString
}
MoneroComponents.TextPlain {
text: qsTr("For enhanced node performance you may specify your region:") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.topMargin: 8
Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor
}
GridLayout {
columns: 3
columnSpacing: 20
ColumnLayout {
Layout.fillWidth: true
spacing: 0
MoneroComponents.StandardDropdown {
id: regionDropdown
Layout.fillWidth: true
dataModel: regionModel
currentIndex: 0
onChanged: {
var region = regionModel.get(currentIndex).region;
persistentSettings.remoteNodeRegion = region;
}
}
}
Item {
Layout.fillWidth: true
}
Item {
Layout.fillWidth: true
}
z: parent.z + 1
}
MoneroComponents.CheckBox {
id: understoodCheckbox
Layout.topMargin: 20
@@ -187,22 +144,4 @@ Rectangle {
wizardModeRemoteNodeWarning.understood = false;
understoodCheckbox.checked = false;
}
Component.onCompleted: {
var region = persistentSettings.remoteNodeRegion;
if(region){
for(var i = 0; i !== regionDropdown.dataModel.count; i++){
var item = regionDropdown.dataModel.get(i);
if(item['region'] === region){
regionDropdown.currentIndex = i;
break;
}
}
} else {
regionDropdown.currentIndex = 0;
}
regionDropdown.update();
}
}

View File

@@ -282,16 +282,7 @@ Rectangle {
onClicked: {
persistentSettings.nettype = parseInt(networktype)
if(appWindow.walletMode === 0 || appWindow.walletMode === 1){
wizardController.fetchRemoteNodes(function(){
wizardController.openWalletFile(item.filePath);
}, function(){
appWindow.showStatusMessage(qsTr("Failed to fetch remote nodes from third-party server."), 5);
wizardController.openWalletFile(item.filePath);
});
} else {
wizardController.openWalletFile(item.filePath);
}
wizardController.openWalletFile(item.filePath);
}
}
}

View File

@@ -73,12 +73,7 @@ Rectangle {
wizardController.walletOptionsPassword = passwordFields.password;
if(appWindow.walletMode === 0 || appWindow.walletMode === 1){
wizardController.fetchRemoteNodes(function(){
wizardStateView.state = "wizardRestoreWallet4";
}, function(){
appWindow.showStatusMessage(qsTr("Failed to fetch remote nodes from third-party server."), 5);
wizardStateView.state = "wizardRestoreWallet4";
});
wizardStateView.state = "wizardRestoreWallet4";
} else {
wizardStateView.state = "wizardRestoreWallet3";
}