Improve Tor support
[novacoin.git] / src / qt / optionsmodel.cpp
index f988c92..07a2072 100644 (file)
@@ -24,6 +24,7 @@ bool static ApplyProxySettings()
     }
     if (nSocksVersion && !addrProxy.IsValid())
         return false;
+
     if (!IsLimited(NET_IPV4))
         SetProxy(NET_IPV4, addrProxy, nSocksVersion);
     if (nSocksVersion > 4) {
@@ -31,8 +32,27 @@ bool static ApplyProxySettings()
         if (!IsLimited(NET_IPV6))
             SetProxy(NET_IPV6, addrProxy, nSocksVersion);
 #endif
-        SetNameProxy(addrProxy, nSocksVersion);
     }
+
+    SetNameProxy(addrProxy, nSocksVersion);
+
+    return true;
+}
+
+bool static ApplyTorSettings()
+{
+    QSettings settings;
+    CService addrTor(settings.value("addrTor", "127.0.0.1:9050").toString().toStdString());
+    if (!settings.value("fUseTor", false).toBool()) {
+        addrTor = CService();
+        return false;
+    }
+    if (!addrTor.IsValid())
+        return false;
+
+    SetProxy(NET_TOR, addrTor, 5);
+    SetReachable(NET_TOR);
+
     return true;
 }
 
@@ -47,9 +67,9 @@ void OptionsModel::Init()
         if(fTestNet)
             settings.setValue("strThirdPartyTxUrls", "");
         else
-            settings.setValue("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s");
+            settings.setValue("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s");
     }
-    strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s").toString();
+    strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s").toString();
     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
@@ -60,10 +80,19 @@ void OptionsModel::Init()
     // command-line options to override the GUI settings:
     if (settings.contains("fUseUPnP"))
         SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
-    if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
-        SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
-    if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
-        SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
+    if ( !(settings.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
+        if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
+            SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
+        if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
+            SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
+    }
+
+    if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
+        SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
+        if (settings.value("fTorOnly").toBool())
+            SoftSetArg("-onlynet", "tor");
+    }
+
     if (settings.contains("detachDB"))
         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
     if (!language.isEmpty())
@@ -94,7 +123,7 @@ bool OptionsModel::Upgrade()
         }
     }
     QList<QString> boolOptions;
-    boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseUPnP";
+    boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseTor" << "fTorOnly" << "fUseUPnP";
     foreach(QString key, boolOptions)
     {
         bool value = false;
@@ -106,24 +135,38 @@ bool OptionsModel::Upgrade()
     }
     try
     {
-        CAddress addrProxyAddress;
+        CAddress addrProxyAddress, addrTorAddress;
         if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
         {
             settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
             walletdb.EraseSetting("addrProxy");
         }
+
+        if (walletdb.ReadSetting("addrTor", addrTorAddress))
+        {
+            settings.setValue("addrTor", addrTorAddress.ToStringIPPort().c_str());
+            walletdb.EraseSetting("addrTor");
+        }
     }
     catch (std::ios_base::failure &e)
     {
         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
-        CService addrProxy;
+        CService addrProxy, addrTor;
         if (walletdb.ReadSetting("addrProxy", addrProxy))
         {
             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
             walletdb.EraseSetting("addrProxy");
         }
+
+        if (walletdb.ReadSetting("addrTor", addrTor))
+        {
+            settings.setValue("addrTor", addrTor.ToStringIPPort().c_str());
+            walletdb.EraseSetting("addrTor");
+        }
     }
+
     ApplyProxySettings();
+    ApplyTorSettings();
     Init();
 
     return true;
@@ -168,6 +211,24 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
         }
         case ProxySocksVersion:
             return settings.value("nSocksVersion", 5);
+        case TorUse:
+            return settings.value("fUseTor", false);
+        case TorIP: {
+            proxyType proxy;
+            if (GetProxy(NET_TOR, proxy))
+                return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
+            else
+                return QVariant(QString::fromStdString("127.0.0.1"));
+        }
+        case TorPort: {
+            proxyType proxy;
+            if (GetProxy(NET_TOR, proxy))
+                return QVariant(proxy.first.GetPort());
+            else
+                return QVariant(9050);
+        }
+        case TorOnly:
+            return settings.value("fTorOnly", false);
         case Fee:
             return QVariant(static_cast<qlonglong>(nTransactionFee));
         case DisplayUnit:
@@ -248,6 +309,37 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
             successful = ApplyProxySettings();
         }
         break;
+        case TorUse: {
+            settings.setValue("fUseTor", value.toBool());
+            ApplyTorSettings();
+        }
+        break;
+        case TorIP: {
+            proxyType proxy;
+            proxy.first = CService("127.0.0.1", 9050);
+            GetProxy(NET_IPV4, proxy);
+
+            CNetAddr addr(value.toString().toStdString());
+            proxy.first.SetIP(addr);
+            settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
+            successful = ApplyTorSettings();
+        }
+        break;
+        case TorPort: {
+            proxyType proxy;
+            proxy.first = CService("127.0.0.1", 9050);
+            GetProxy(NET_IPV4, proxy);
+
+            proxy.first.SetPort(value.toInt());
+            settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
+            successful = ApplyTorSettings();
+        }
+        break;
+        case TorOnly: {
+            settings.setValue("fTorOnly", value.toBool());
+            ApplyTorSettings();
+        }
+        break;
         case Fee:
             nTransactionFee = value.toLongLong();
             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));