From 8ef413bee3bcbd797c83adac46a455b80a3b6049 Mon Sep 17 00:00:00 2001 From: pablomartin4btc Date: Thu, 14 Nov 2024 15:23:01 -0300 Subject: [PATCH] qml, proxy: Persist proxy settings Addding the logic to persist the ip address and port values of both the default proxy and the tor proxy configuration into settings.js. --- src/qml/components/ProxySettings.qml | 16 +++-- src/qml/models/options_model.cpp | 98 ++++++++++++++++++++++++++++ src/qml/models/options_model.h | 24 +++++++ 3 files changed, 134 insertions(+), 4 deletions(-) diff --git a/src/qml/components/ProxySettings.qml b/src/qml/components/ProxySettings.qml index 6af147dd09..aa53efde4d 100644 --- a/src/qml/components/ProxySettings.qml +++ b/src/qml/components/ProxySettings.qml @@ -35,7 +35,9 @@ ColumnLayout { } else { defaultProxy.state = "FILLED" } + optionsModel.setIsProxySet(checked) } + checked: optionsModel.isProxySet } onClicked: { loadedItem.toggle() @@ -52,10 +54,12 @@ ColumnLayout { showErrorText: !defaultProxy.loadedItem.validInput && defaultProxyEnable.loadedItem.checked actionItem: IPAddressValueInput { parentState: defaultProxy.state - description: nodeModel.defaultProxyAddress() + text: optionsModel.proxyAddress activeFocusOnTab: true onTextChanged: { - validInput = nodeModel.validateProxyAddress(text); + if (validInput = nodeModel.validateProxyAddress(text)) { + optionsModel.setProxyAddress(text); + } } } onClicked: { @@ -86,7 +90,9 @@ ColumnLayout { } else { torProxy.state = "FILLED" } + optionsModel.setIsTorProxySet(checked) } + checked: optionsModel.isTorProxySet } onClicked: { loadedItem.toggle() @@ -103,10 +109,12 @@ ColumnLayout { showErrorText: !torProxy.loadedItem.validInput && torProxyEnable.loadedItem.checked actionItem: IPAddressValueInput { parentState: torProxy.state - description: nodeModel.defaultProxyAddress() + text: optionsModel.torProxyAddress activeFocusOnTab: true onTextChanged: { - validInput = nodeModel.validateProxyAddress(text); + if (validInput = nodeModel.validateProxyAddress(text)) { + optionsModel.setTorProxyAddress(text); + } } } onClicked: { diff --git a/src/qml/models/options_model.cpp b/src/qml/models/options_model.cpp index 9e95152311..77771f89e0 100644 --- a/src/qml/models/options_model.cpp +++ b/src/qml/models/options_model.cpp @@ -45,6 +45,14 @@ OptionsQmlModel::OptionsQmlModel(interfaces::Node& node, bool is_onboarded) m_upnp = SettingToBool(m_node.getPersistentSetting("upnp"), DEFAULT_UPNP); m_dataDir = getDefaultDataDirString(); + + m_proxy_address = QString::fromStdString(SettingToString(m_node.getPersistentSetting("proxy"), "")); + + m_is_proxy_set = evaluateIfProxyIsSet(); + + m_tor_proxy_address = QString::fromStdString(SettingToString(m_node.getPersistentSetting("onion"), "")); + + m_is_tor_proxy_set = evaluateIfTorProxyIsSet(); } void OptionsQmlModel::setDbcacheSizeMiB(int new_dbcache_size_mib) @@ -225,5 +233,95 @@ void OptionsQmlModel::onboard() if (m_upnp) { m_node.updateRwSetting("upnp", m_upnp); } + if (m_is_proxy_set && !m_proxy_address.isEmpty() && m_node.validateProxyAddress(m_proxy_address.toStdString())) { + m_node.updateRwSetting("proxy", m_proxy_address.toStdString()); + } + if (m_is_tor_proxy_set && !m_tor_proxy_address.isEmpty() && m_node.validateProxyAddress(m_tor_proxy_address.toStdString())) { + m_node.updateRwSetting("onion", m_tor_proxy_address.toStdString()); + } m_onboarded = true; } + +void OptionsQmlModel::setProxyAddress(QString new_proxy_address) +{ + if (new_proxy_address != m_proxy_address) { + m_proxy_address = new_proxy_address; + if (m_onboarded && m_node.validateProxyAddress(new_proxy_address.toStdString())) { + m_node.updateRwSetting("proxy", new_proxy_address.toStdString()); + } + Q_EMIT proxyAddressChanged(new_proxy_address); + } +} + +void OptionsQmlModel::setIsProxySet(bool is_set) +{ + if (is_set != m_is_proxy_set) { + m_is_proxy_set = is_set; + if (m_onboarded && m_is_proxy_set && m_node.validateProxyAddress(m_proxy_address.toStdString())) { + m_node.updateRwSetting("proxy", m_proxy_address.toStdString()); + } + if (!m_is_proxy_set) { + m_node.updateRwSetting("proxy", {}); + } + Q_EMIT isProxySetChanged(is_set); + } +} + +bool OptionsQmlModel::evaluateIfProxyIsSet() +{ + bool proxyHasBeenSet; + + if (!m_proxy_address.isEmpty()) { + if (!m_node.validateProxyAddress(m_proxy_address.toStdString())) { + m_proxy_address = ""; + } + } + + proxyHasBeenSet = !m_proxy_address.isEmpty(); + if (!proxyHasBeenSet) { + m_proxy_address = QString::fromStdString(m_node.defaultProxyAddress()); + } + return proxyHasBeenSet; +} + +void OptionsQmlModel::setTorProxyAddress(QString new_proxy_address) +{ + if (new_proxy_address != m_tor_proxy_address) { + m_tor_proxy_address = new_proxy_address; + if (m_onboarded && m_node.validateProxyAddress(new_proxy_address.toStdString())) { + m_node.updateRwSetting("onion", new_proxy_address.toStdString()); + } + Q_EMIT torProxyAddressChanged(new_proxy_address); + } +} + +void OptionsQmlModel::setIsTorProxySet(bool is_set) +{ + if (is_set != m_is_tor_proxy_set) { + m_is_tor_proxy_set = is_set; + if (m_onboarded && m_is_proxy_set && m_node.validateProxyAddress(m_tor_proxy_address.toStdString())) { + m_node.updateRwSetting("onion", m_tor_proxy_address.toStdString()); + } + if (!m_is_proxy_set) { + m_node.updateRwSetting("onion", {}); + } + Q_EMIT isTorProxySetChanged(is_set); + } +} + +bool OptionsQmlModel::evaluateIfTorProxyIsSet() +{ + bool proxyHasBeenSet; + + if (!m_tor_proxy_address.isEmpty()) { + if (!m_node.validateProxyAddress(m_tor_proxy_address.toStdString())) { + m_tor_proxy_address = ""; + } + } + + proxyHasBeenSet = !m_tor_proxy_address.isEmpty(); + if (!proxyHasBeenSet) { + m_tor_proxy_address = QString::fromStdString(m_node.defaultProxyAddress()); + } + return proxyHasBeenSet; +} diff --git a/src/qml/models/options_model.h b/src/qml/models/options_model.h index 459d40b574..ab3db0a9ea 100644 --- a/src/qml/models/options_model.h +++ b/src/qml/models/options_model.h @@ -37,6 +37,14 @@ class OptionsQmlModel : public QObject Q_PROPERTY(QString dataDir READ dataDir WRITE setDataDir NOTIFY dataDirChanged) Q_PROPERTY(QString getDefaultDataDirString READ getDefaultDataDirString CONSTANT) Q_PROPERTY(QUrl getDefaultDataDirectory READ getDefaultDataDirectory CONSTANT) + Q_PROPERTY(QString proxyAddress READ proxyAddress WRITE setProxyAddress NOTIFY proxyAddressChanged) + Q_PROPERTY(bool isProxySet READ isProxySet WRITE setIsProxySet NOTIFY isProxySetChanged) + Q_PROPERTY(QString torProxyAddress READ torProxyAddress WRITE setTorProxyAddress NOTIFY proxyAddressChanged) + Q_PROPERTY(bool isTorProxySet READ isTorProxySet WRITE setIsTorProxySet NOTIFY isTorProxySetChanged) + +protected: + bool evaluateIfProxyIsSet(); + bool evaluateIfTorProxyIsSet(); public: explicit OptionsQmlModel(interfaces::Node& node, bool is_onboarded); @@ -67,6 +75,14 @@ class OptionsQmlModel : public QObject QUrl getDefaultDataDirectory(); Q_INVOKABLE bool setCustomDataDirArgs(QString path); Q_INVOKABLE QString getCustomDataDirString(); + QString proxyAddress() const { return m_proxy_address; } + Q_INVOKABLE void setProxyAddress(QString new_proxy_address); + bool isProxySet() const { return m_is_proxy_set; } + Q_INVOKABLE void setIsProxySet(bool is_set); + QString torProxyAddress() const { return m_tor_proxy_address; } + Q_INVOKABLE void setTorProxyAddress(QString new_proxy_address); + bool isTorProxySet() const { return m_is_tor_proxy_set; } + Q_INVOKABLE void setIsTorProxySet(bool is_set); public Q_SLOTS: void setCustomDataDirString(const QString &new_custom_datadir_string) { @@ -85,6 +101,10 @@ public Q_SLOTS: void upnpChanged(bool new_upnp); void customDataDirStringChanged(QString new_custom_datadir_string); void dataDirChanged(QString new_data_dir); + void proxyAddressChanged(QString new_proxy_address); + void isProxySetChanged(bool is_set); + void torProxyAddressChanged(QString new_proxy_address); + void isTorProxySetChanged(bool is_set); private: interfaces::Node& m_node; @@ -105,6 +125,10 @@ public Q_SLOTS: bool m_upnp; QString m_custom_datadir_string; QString m_dataDir; + QString m_proxy_address; + bool m_is_proxy_set; + QString m_tor_proxy_address; + bool m_is_tor_proxy_set; common::SettingsValue pruneSetting() const; };