From 63b2e52eaf23b968576810324d31ee620fe86b42 Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 28 Nov 2022 10:03:16 +0800 Subject: [PATCH] DomainFronting tweaks --- .../com/hippo/ehviewer/EhApplication.java | 32 +++---- .../ehviewer/client/EhSSLSocketFactory.kt | 85 +++++++++---------- .../ehviewer/client/EhX509TrustManager.kt | 27 +++--- 3 files changed, 65 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.java b/app/src/main/java/com/hippo/ehviewer/EhApplication.java index 072071984..404fb2c16 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.java +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.java @@ -77,14 +77,12 @@ import com.hippo.yorozuya.OSUtils; import com.hippo.yorozuya.SimpleHandler; import java.io.File; -import java.io.IOException; import java.security.KeyStore; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.concurrent.TimeUnit; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; @@ -165,27 +163,29 @@ public class EhApplication extends SceneApplication { EhApplication application = ((EhApplication) context.getApplicationContext()); if (application.mOkHttpClient == null) { OkHttpClient.Builder builder = new OkHttpClient.Builder() - .connectTimeout(5, TimeUnit.SECONDS) - .readTimeout(5, TimeUnit.SECONDS) - .writeTimeout(5, TimeUnit.SECONDS) - .callTimeout(10, TimeUnit.SECONDS) .cookieJar(getEhCookieStore(application)) .cache(getOkHttpCache(application)) .dns(new EhDns(application)) .proxySelector(getEhProxySelector(application)); - try { - TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - trustManagerFactory.init((KeyStore) null); - TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); - if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager trustManager)) { - throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); + + if (Settings.getDF()) { + X509TrustManager trustManager; + try { + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init((KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager trustManager1)) { + throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); + } + trustManager = trustManager1; + } catch (Exception e) { + e.printStackTrace(); + trustManager = new EhX509TrustManager(); } builder.sslSocketFactory(new EhSSLSocketFactory(), trustManager); - } catch (Exception e) { - e.printStackTrace(); - builder.sslSocketFactory(new EhSSLSocketFactory(), new EhX509TrustManager()); } + application.mOkHttpClient = builder.build(); } return application.mOkHttpClient; diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhSSLSocketFactory.kt b/app/src/main/java/com/hippo/ehviewer/client/EhSSLSocketFactory.kt index ed917edc9..d2ec934e6 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhSSLSocketFactory.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhSSLSocketFactory.kt @@ -15,65 +15,58 @@ * You should have received a copy of the GNU General Public License along with EhViewer. * If not, see . */ +package com.hippo.ehviewer.client -package com.hippo.ehviewer.client; +import android.util.Log +import java.net.InetAddress +import java.net.Socket +import javax.net.ssl.SSLSocket +import javax.net.ssl.SSLSocketFactory -import android.util.Log; - -import com.hippo.ehviewer.Settings; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; - -import javax.net.ssl.SSLSession; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - -public class EhSSLSocketFactory extends SSLSocketFactory { - @Override - public String[] getDefaultCipherSuites() { - return ((SSLSocketFactory) getDefault()).getDefaultCipherSuites(); +class EhSSLSocketFactory : SSLSocketFactory() { + private val sslSocketFactory = getDefault() as SSLSocketFactory + override fun getDefaultCipherSuites(): Array { + return sslSocketFactory.defaultCipherSuites } - @Override - public String[] getSupportedCipherSuites() { - return ((SSLSocketFactory) getDefault()).getSupportedCipherSuites(); + override fun getSupportedCipherSuites(): Array { + return sslSocketFactory.supportedCipherSuites } - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - SSLSocketFactory defaultFactory = (SSLSocketFactory) getDefault(); - if (!Settings.getDF()) { - return defaultFactory.createSocket(s, host, port, autoClose); - } - String address = s.getInetAddress().getHostAddress(); - SSLSocket socket = (SSLSocket) defaultFactory.createSocket(s, address, port, autoClose); - SSLSession sslSession = socket.getSession(); - Log.d("EhSSLSocketFactory", "Host: " + host + " Address: " + address + " Protocol:" + sslSession.getProtocol() + " CipherSuite:" + sslSession.getCipherSuite()); - socket.setEnabledProtocols(socket.getSupportedProtocols()); - return socket; + override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket { + val address = s.inetAddress.hostAddress + val socket = sslSocketFactory.createSocket(s, address, port, autoClose) as SSLSocket + val sslSession = socket.session + Log.d( + "EhSSLSocketFactory", + "Host: " + host + " Address: " + address + " Protocol:" + sslSession.protocol + " CipherSuite:" + sslSession.cipherSuite + ) + return socket } - @Override - public Socket createSocket(String host, int port) throws IOException { - return getDefault().createSocket(host, port); + override fun createSocket(host: String, port: Int): Socket { + return sslSocketFactory.createSocket(host, port) } - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { - return getDefault().createSocket(host, port, localHost, localPort); + override fun createSocket( + host: String, + port: Int, + localHost: InetAddress, + localPort: Int + ): Socket { + return sslSocketFactory.createSocket(host, port, localHost, localPort) } - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - return getDefault().createSocket(host, port); + override fun createSocket(host: InetAddress, port: Int): Socket { + return sslSocketFactory.createSocket(host, port) } - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return getDefault().createSocket(address, port, localAddress, localPort); + override fun createSocket( + address: InetAddress, + port: Int, + localAddress: InetAddress, + localPort: Int + ): Socket { + return sslSocketFactory.createSocket(address, port, localAddress, localPort) } - - } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhX509TrustManager.kt b/app/src/main/java/com/hippo/ehviewer/client/EhX509TrustManager.kt index 70b28a6f3..af7b1385e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhX509TrustManager.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhX509TrustManager.kt @@ -15,30 +15,23 @@ * You should have received a copy of the GNU General Public License along with EhViewer. * If not, see . */ +package com.hippo.ehviewer.client -package com.hippo.ehviewer.client; +import android.annotation.SuppressLint +import java.security.cert.X509Certificate +import javax.net.ssl.X509TrustManager -import android.annotation.SuppressLint; - -import java.security.cert.X509Certificate; - -import javax.net.ssl.X509TrustManager; - -public class EhX509TrustManager implements X509TrustManager { +@SuppressLint("CustomX509TrustManager") +class EhX509TrustManager : X509TrustManager { @SuppressLint("TrustAllX509TrustManager") - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - + override fun checkClientTrusted(chain: Array, authType: String) { } @SuppressLint("TrustAllX509TrustManager") - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) { - + override fun checkServerTrusted(chain: Array, authType: String) { } - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; + override fun getAcceptedIssuers(): Array { + return arrayOfNulls(0) } }