diff --git a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java index ad8224a249..d212c06822 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java @@ -3,12 +3,11 @@ package com.tangem.data.network; import android.util.Log; import com.tangem.App; -import com.tangem.domain.wallet.btc.BitcoinNode; -import com.tangem.domain.wallet.btc.BitcoinNodeSsl; -import com.tangem.domain.wallet.btc.BitcoinNodeTestNet; -import com.tangem.domain.wallet.bch.BitcoinCashNode; import com.tangem.domain.wallet.Blockchain; import com.tangem.domain.wallet.TangemCard; +import com.tangem.domain.wallet.bch.BitcoinCashNode; +import com.tangem.domain.wallet.btc.BitcoinNode; +import com.tangem.domain.wallet.btc.BitcoinNodeTestNet; import java.io.BufferedReader; import java.io.IOException; @@ -29,12 +28,9 @@ import java.util.Collections; import java.util.List; import java.util.Random; -import javax.net.SocketFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLHandshakeException; -import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; @@ -49,12 +45,12 @@ public class ServerApiElectrum { private static String TAG = ServerApiElectrum.class.getSimpleName(); /** - * TCP - * Used in BTC + * TCP, SSL + * Used in BTC, BCH */ + private ElectrumRequestDataListener electrumRequestDataListener; private String host; private int port; - private ElectrumRequestDataListener electrumRequestDataListener; public interface ElectrumRequestDataListener { void onSuccess(ElectrumRequest electrumRequest); @@ -68,8 +64,7 @@ public class ServerApiElectrum { public void electrumRequestData(TangemCard card, ElectrumRequest electrumRequest) { Observable checkElectrumDataObserver = Observable.just(electrumRequest) -// .doOnNext(electrumRequest1 -> doElectrumRequestTcp(card, electrumRequest)) - .doOnNext(electrumRequest1 -> doElectrumRequestSsl(card, electrumRequest)) + .doOnNext(electrumRequest1 -> doElectrumRequest(card, electrumRequest)) .flatMap(electrumRequest1 -> { if (electrumRequest1.answerData == null) { @@ -111,21 +106,52 @@ public class ServerApiElectrum { }); } - private List doElectrumRequestTcp(TangemCard card, ElectrumRequest electrumRequest) { + private List doElectrumRequest(TangemCard card, ElectrumRequest electrumRequest) { + String host; + int port; + String proto; if (card.getBlockchain() == Blockchain.BitcoinTestNet) { BitcoinNodeTestNet bitcoinNodeTestNet = BitcoinNodeTestNet.values()[new Random().nextInt(BitcoinNodeTestNet.values().length)]; - this.host = bitcoinNodeTestNet.getHost(); - this.port = bitcoinNodeTestNet.getPort(); + host = bitcoinNodeTestNet.getHost(); + port = bitcoinNodeTestNet.getPort(); + + this.host = host; + this.port = port; + + return doElectrumRequestTcp(electrumRequest, host, port); + } else if (card.getBlockchain() == Blockchain.BitcoinCash) { BitcoinCashNode bitcoinCashNode = BitcoinCashNode.values()[new Random().nextInt(BitcoinCashNode.values().length)]; - this.host = bitcoinCashNode.getHost(); - this.port = bitcoinCashNode.getPort(); + host = bitcoinCashNode.getHost(); + port = bitcoinCashNode.getPort(); + + this.host = host; + this.port = port; + + return doElectrumRequestTcp(electrumRequest, host, port); + } else if (card.getBlockchain() == Blockchain.Bitcoin) { BitcoinNode bitcoinNode = BitcoinNode.values()[new Random().nextInt(BitcoinNode.values().length)]; - this.host = bitcoinNode.getHost(); - this.port = bitcoinNode.getPort(); - } + host = bitcoinNode.getHost(); + port = bitcoinNode.getPort(); + proto = bitcoinNode.getProto(); + if (proto.equals("tcp")) { + this.host = host; + this.port = port; + + return doElectrumRequestTcp(electrumRequest, host, port); + } else { + this.host = host; + this.port = port; + + return doElectrumRequestSsl(electrumRequest, host, port); + } + } + return null; + } + + private List doElectrumRequestTcp(ElectrumRequest electrumRequest, String host, int port) { List result = new ArrayList<>(); Collections.addAll(result, electrumRequest); @@ -170,15 +196,10 @@ public class ServerApiElectrum { return result; } - private List doElectrumRequestSsl(TangemCard card, ElectrumRequest electrumRequest) { - BitcoinNodeSsl bitcoinNodeSsl = BitcoinNodeSsl.values()[new Random().nextInt(BitcoinNodeSsl.values().length)]; - - this.host = bitcoinNodeSsl.getHost(); - this.port = bitcoinNodeSsl.getPort(); - + private List doElectrumRequestSsl(ElectrumRequest electrumRequest, String host, int port) { try { // create a trust manager that does not validate certificate chains - TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { @@ -193,8 +214,7 @@ public class ServerApiElectrum { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } - - } }; + }}; // install the all-trusting trust manager SSLContext sc = SSLContext.getInstance("SSL"); @@ -203,11 +223,7 @@ public class ServerApiElectrum { HttpsURLConnection.setDefaultSSLSocketFactory(sf); // create all-trusting host name verifier - HostnameVerifier allHostsValid = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - return true; - } - }; + HostnameVerifier allHostsValid = (hostname, session) -> true; // install the all-trusting host verifier HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); @@ -219,7 +235,6 @@ public class ServerApiElectrum { try { sslSocket = (SSLSocket) sf.createSocket(host, port); - Log.i(TAG, host + " " + port); try { OutputStream os = sslSocket.getOutputStream(); @@ -261,65 +276,6 @@ public class ServerApiElectrum { return null; } - private List testSslSocket(TangemCard card, ElectrumRequest electrumRequest) { - BitcoinNodeSsl bitcoinNodeSsl = BitcoinNodeSsl.values()[new Random().nextInt(BitcoinNodeSsl.values().length)]; - - this.host = bitcoinNodeSsl.getHost(); - this.port = bitcoinNodeSsl.getPort(); - -// System.setProperty("javax.net.debug", "ssl,handshake"); - - SocketFactory sf = SSLSocketFactory.getDefault(); - SSLSocket sslSocket; - - List result = new ArrayList<>(); - Collections.addAll(result, electrumRequest); - - try { - sslSocket = (SSLSocket) sf.createSocket(host, port); - - HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); - SSLSession sslSession = sslSocket.getSession(); - - if (!hv.verify(host, sslSession)) { - throw new SSLHandshakeException("Expected " + host + " , found " + sslSession.getPeerPrincipal()); - } - - Log.i(TAG, host + " " + port); - try { - OutputStream os = sslSocket.getOutputStream(); - OutputStreamWriter out = new OutputStreamWriter(os, "UTF-8"); - InputStream is = sslSocket.getInputStream(); - BufferedReader in = new BufferedReader(new InputStreamReader(is)); - electrumRequest.setID(1); - - out.write(electrumRequest.getAsString() + "\n"); - out.flush(); - - electrumRequest.answerData = in.readLine(); - if (electrumRequest.answerData != null) { - Log.i(TAG, ">> " + electrumRequest.answerData); - } else { - electrumRequest.error = "No answer from server"; - Log.i(TAG, ">> "); - } - - } catch (ConnectException e) { - e.printStackTrace(); - Log.e(TAG, "electrumRequestData " + electrumRequest.getMethod() + " ConnectException " + e.getMessage()); - } finally { - Log.i(TAG, "electrumRequestData " + electrumRequest.getMethod() + " CLOSE"); - sslSocket.close(); - } - - } catch (IOException e) { - e.printStackTrace(); - Log.e(TAG, "electrumRequestData " + electrumRequest.getMethod() + " IOException " + e.getMessage()); - } - - return result; - } - public String getValidationNodeDescription() { return "Electrum, " + host + ":" + String.valueOf(port); } diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNode.kt b/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNode.kt index 36a6bbf307..e03b6df8d2 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNode.kt +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNode.kt @@ -1,22 +1,19 @@ package com.tangem.domain.wallet.btc enum class BitcoinNode(val host: String, val port: Int, val proto: String) { - n1("electrum.anduck.net", 50001, "tcp"), - n2("electrum-server.ninja", 50001, "tcp"), - n3("btc.cihar.com", 50001, "tcp"), - n4("vps.hsmiths.com", 50001, "tcp"), - n5("electrum.hsmiths.com", 50001, "tcp"), - n6("electrum.vom-stausee.de", 50001, "tcp"), - n7("node.ispol.sk", 50001, "tcp"), - n8("electrum2.eff.ro", 50001, "tcp"), - n9("electrumx.nmdps.net", 50001, "tcp"), - n10("kirsche.emzy.de", 50001, "tcp"), - n11("electrum.petrkr.net", 50001, "tcp"), - n12("electrum.dk", 50001, "tcp"), - -// n13("electrum.anduck.net", 50012, "ssl"), -// n14("electrum.eff.ro", 50002, "ssl"), -// n15("vps.hsmiths.com", 50002, "ssl"), - - + N_001("electrum.anduck.net", 50001, "tcp"), + N_002("electrum-server.ninja", 50001, "tcp"), + N_003("btc.cihar.com", 50001, "tcp"), + N_004("vps.hsmiths.com", 50001, "tcp"), + N_005("electrum.hsmiths.com", 50001, "tcp"), + N_006("electrum.vom-stausee.de", 50001, "tcp"), + N_007("node.ispol.sk", 50001, "tcp"), + N_008("electrum2.eff.ro", 50001, "tcp"), + N_009("electrumx.nmdps.net", 50001, "tcp"), + N_010("kirsche.emzy.de", 50001, "tcp"), + N_011("electrum.petrkr.net", 50001, "tcp"), + N_012("electrum.dk", 50001, "tcp"), + N_013("electrum.anduck.net", 50012, "ssl"), + N_014("electrum.eff.ro", 50002, "ssl"), + N_015("vps.hsmiths.com", 50002, "ssl"), } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNodeSsl.kt b/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNodeSsl.kt deleted file mode 100644 index ce7656323f..0000000000 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinNodeSsl.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.tangem.domain.wallet.btc - -enum class BitcoinNodeSsl(val host: String, val port: Int) { - n1("electrum.anduck.net", 50012), - n2("electrum.eff.ro", 50002), - n3("vps.hsmiths.com", 50002) -} \ No newline at end of file