diff --git a/app/shared/proguard-rules.pro b/app/shared/proguard-rules.pro index 708dc21be..f1b424510 100644 --- a/app/shared/proguard-rules.pro +++ b/app/shared/proguard-rules.pro @@ -19,7 +19,3 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile - --keepclassmembers class * extends javax.net.ssl.SSLSocketFactory { - ** delegate; -} diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/ProviderInstaller.java b/app/shared/src/main/java/com/topjohnwu/magisk/ProviderInstaller.java new file mode 100644 index 000000000..56ed00232 --- /dev/null +++ b/app/shared/src/main/java/com/topjohnwu/magisk/ProviderInstaller.java @@ -0,0 +1,21 @@ +package com.topjohnwu.magisk; + +import android.content.Context; + +public class ProviderInstaller { + + public static boolean install(Context context) { + try { + // Try installing new SSL provider from Google Play Service + Context gms = context.createPackageContext("com.google.android.gms", + Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); + gms.getClassLoader() + .loadClass("com.google.android.gms.common.security.ProviderInstallerImpl") + .getMethod("insertProvider", Context.class) + .invoke(null, gms); + } catch (Exception e) { + return false; + } + return true; + } +} diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/NoSSLv3SocketFactory.java b/app/shared/src/main/java/com/topjohnwu/magisk/net/NoSSLv3SocketFactory.java deleted file mode 100644 index c55bf4761..000000000 --- a/app/shared/src/main/java/com/topjohnwu/magisk/net/NoSSLv3SocketFactory.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.topjohnwu.magisk.net; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - -public class NoSSLv3SocketFactory extends SSLSocketFactory { - - private final static SSLSocketFactory delegate = HttpsURLConnection.getDefaultSSLSocketFactory(); - - @Override - public String[] getDefaultCipherSuites() { - return delegate.getDefaultCipherSuites(); - } - - @Override - public String[] getSupportedCipherSuites() { - return delegate.getSupportedCipherSuites(); - } - - private Socket createSafeSocket(Socket socket) { - if (socket instanceof SSLSocket) - return new SSLSocketWrapper((SSLSocket) socket) { - @Override - public void setEnabledProtocols(String[] protocols) { - List proto = new ArrayList<>(Arrays.asList(getSupportedProtocols())); - proto.remove("SSLv3"); - super.setEnabledProtocols(proto.toArray(new String[0])); - } - }; - return socket; - } - - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - return createSafeSocket(delegate.createSocket(s, host, port, autoClose)); - } - - @Override - public Socket createSocket() throws IOException { - return createSafeSocket(delegate.createSocket()); - } - - @Override - public Socket createSocket(String host, int port) throws IOException { - return createSafeSocket(delegate.createSocket(host, port)); - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { - return createSafeSocket(delegate.createSocket(host, port, localHost, localPort)); - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - return createSafeSocket(delegate.createSocket(host, port)); - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return createSafeSocket(delegate.createSocket(address, port, localAddress, localPort)); - } -} diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/SSLSocketWrapper.java b/app/shared/src/main/java/com/topjohnwu/magisk/net/SSLSocketWrapper.java deleted file mode 100644 index cb19e6512..000000000 --- a/app/shared/src/main/java/com/topjohnwu/magisk/net/SSLSocketWrapper.java +++ /dev/null @@ -1,333 +0,0 @@ -package com.topjohnwu.magisk.net; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.InetAddress; -import java.net.SocketAddress; -import java.net.SocketException; -import java.nio.channels.SocketChannel; - -import javax.net.ssl.HandshakeCompletedListener; -import javax.net.ssl.SSLParameters; -import javax.net.ssl.SSLSession; -import javax.net.ssl.SSLSocket; - -class SSLSocketWrapper extends SSLSocket { - - private SSLSocket mBase; - - SSLSocketWrapper(SSLSocket socket) { - mBase = socket; - } - - @Override - public String[] getSupportedCipherSuites() { - return mBase.getSupportedCipherSuites(); - } - - @Override - public String[] getEnabledCipherSuites() { - return mBase.getEnabledCipherSuites(); - } - - @Override - public void setEnabledCipherSuites(String[] suites) { - mBase.setEnabledCipherSuites(suites); - } - - @Override - public String[] getSupportedProtocols() { - return mBase.getSupportedProtocols(); - } - - @Override - public String[] getEnabledProtocols() { - return mBase.getEnabledProtocols(); - } - - @Override - public void setEnabledProtocols(String[] protocols) { - mBase.setEnabledProtocols(protocols); - } - - @Override - public SSLSession getSession() { - return mBase.getSession(); - } - - @Override - public SSLSession getHandshakeSession() { - throw new UnsupportedOperationException(); - } - - @Override - public void addHandshakeCompletedListener(HandshakeCompletedListener listener) { - mBase.addHandshakeCompletedListener(listener); - } - - @Override - public void removeHandshakeCompletedListener(HandshakeCompletedListener listener) { - mBase.removeHandshakeCompletedListener(listener); - } - - @Override - public void startHandshake() throws IOException { - mBase.startHandshake(); - } - - @Override - public void setUseClientMode(boolean mode) { - mBase.setUseClientMode(mode); - } - - @Override - public boolean getUseClientMode() { - return mBase.getUseClientMode(); - } - - @Override - public void setNeedClientAuth(boolean need) { - mBase.setNeedClientAuth(need); - } - - @Override - public boolean getNeedClientAuth() { - return mBase.getNeedClientAuth(); - } - - @Override - public void setWantClientAuth(boolean want) { - mBase.setWantClientAuth(want); - } - - @Override - public boolean getWantClientAuth() { - return mBase.getWantClientAuth(); - } - - @Override - public void setEnableSessionCreation(boolean flag) { - mBase.setEnableSessionCreation(flag); - } - - @Override - public boolean getEnableSessionCreation() { - return mBase.getEnableSessionCreation(); - } - - @Override - public SSLParameters getSSLParameters() { - return mBase.getSSLParameters(); - } - - @Override - public void setSSLParameters(SSLParameters params) { - mBase.setSSLParameters(params); - } - - @Override - public String toString() { - return mBase.toString(); - } - - @Override - public void connect(SocketAddress endpoint) throws IOException { - mBase.connect(endpoint); - } - - @Override - public void connect(SocketAddress endpoint, int timeout) throws IOException { - mBase.connect(endpoint, timeout); - } - - @Override - public void bind(SocketAddress bindpoint) throws IOException { - mBase.bind(bindpoint); - } - - @Override - public InetAddress getInetAddress() { - return mBase.getInetAddress(); - } - - @Override - public InetAddress getLocalAddress() { - return mBase.getLocalAddress(); - } - - @Override - public int getPort() { - return mBase.getPort(); - } - - @Override - public int getLocalPort() { - return mBase.getLocalPort(); - } - - @Override - public SocketAddress getRemoteSocketAddress() { - return mBase.getRemoteSocketAddress(); - } - - @Override - public SocketAddress getLocalSocketAddress() { - return mBase.getLocalSocketAddress(); - } - - @Override - public SocketChannel getChannel() { - return mBase.getChannel(); - } - - @Override - public InputStream getInputStream() throws IOException { - return mBase.getInputStream(); - } - - @Override - public OutputStream getOutputStream() throws IOException { - return mBase.getOutputStream(); - } - - @Override - public void setTcpNoDelay(boolean on) throws SocketException { - mBase.setTcpNoDelay(on); - } - - @Override - public boolean getTcpNoDelay() throws SocketException { - return mBase.getTcpNoDelay(); - } - - @Override - public void setSoLinger(boolean on, int linger) throws SocketException { - mBase.setSoLinger(on, linger); - } - - @Override - public int getSoLinger() throws SocketException { - return mBase.getSoLinger(); - } - - @Override - public void sendUrgentData(int data) throws IOException { - mBase.sendUrgentData(data); - } - - @Override - public void setOOBInline(boolean on) throws SocketException { - mBase.setOOBInline(on); - } - - @Override - public boolean getOOBInline() throws SocketException { - return mBase.getOOBInline(); - } - - @Override - public void setSoTimeout(int timeout) throws SocketException { - mBase.setSoTimeout(timeout); - } - - @Override - public int getSoTimeout() throws SocketException { - return mBase.getSoTimeout(); - } - - @Override - public void setSendBufferSize(int size) throws SocketException { - mBase.setSendBufferSize(size); - } - - @Override - public int getSendBufferSize() throws SocketException { - return mBase.getSendBufferSize(); - } - - @Override - public void setReceiveBufferSize(int size) throws SocketException { - mBase.setReceiveBufferSize(size); - } - - @Override - public int getReceiveBufferSize() throws SocketException { - return mBase.getReceiveBufferSize(); - } - - @Override - public void setKeepAlive(boolean on) throws SocketException { - mBase.setKeepAlive(on); - } - - @Override - public boolean getKeepAlive() throws SocketException { - return mBase.getKeepAlive(); - } - - @Override - public void setTrafficClass(int tc) throws SocketException { - mBase.setTrafficClass(tc); - } - - @Override - public int getTrafficClass() throws SocketException { - return mBase.getTrafficClass(); - } - - @Override - public void setReuseAddress(boolean on) throws SocketException { - mBase.setReuseAddress(on); - } - - @Override - public boolean getReuseAddress() throws SocketException { - return mBase.getReuseAddress(); - } - - @Override - public void close() throws IOException { - mBase.close(); - } - - @Override - public void shutdownInput() throws IOException { - mBase.shutdownInput(); - } - - @Override - public void shutdownOutput() throws IOException { - mBase.shutdownOutput(); - } - - @Override - public boolean isConnected() { - return mBase.isConnected(); - } - - @Override - public boolean isBound() { - return mBase.isBound(); - } - - @Override - public boolean isClosed() { - return mBase.isClosed(); - } - - @Override - public boolean isInputShutdown() { - return mBase.isInputShutdown(); - } - - @Override - public boolean isOutputShutdown() { - return mBase.isOutputShutdown(); - } - - @Override - public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) { - mBase.setPerformancePreferences(connectionTime, latency, bandwidth); - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt b/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt index f89b8d074..292df2d66 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt @@ -3,10 +3,10 @@ package com.topjohnwu.magisk.di import android.content.Context import com.squareup.moshi.Moshi import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.ProviderInstaller import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.ktx.precomputedText -import com.topjohnwu.magisk.net.Networking import com.topjohnwu.magisk.utils.MarkwonImagePlugin import io.noties.markwon.Markwon import io.noties.markwon.html.HtmlPlugin @@ -61,7 +61,7 @@ fun createOkHttpClient(context: Context): OkHttpClient { }) } - if (!Networking.init(context)) { + if (!ProviderInstaller.install(context)) { Info.hasGMS = false } builder.dns(DnsResolver(builder.build())) diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/BadRequest.java b/stub/src/main/java/com/topjohnwu/magisk/net/BadRequest.java similarity index 100% rename from app/shared/src/main/java/com/topjohnwu/magisk/net/BadRequest.java rename to stub/src/main/java/com/topjohnwu/magisk/net/BadRequest.java diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/ErrorHandler.java b/stub/src/main/java/com/topjohnwu/magisk/net/ErrorHandler.java similarity index 100% rename from app/shared/src/main/java/com/topjohnwu/magisk/net/ErrorHandler.java rename to stub/src/main/java/com/topjohnwu/magisk/net/ErrorHandler.java diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/Networking.java b/stub/src/main/java/com/topjohnwu/magisk/net/Networking.java similarity index 58% rename from app/shared/src/main/java/com/topjohnwu/magisk/net/Networking.java rename to stub/src/main/java/com/topjohnwu/magisk/net/Networking.java index 3e050658b..bc93dc48a 100644 --- a/app/shared/src/main/java/com/topjohnwu/magisk/net/Networking.java +++ b/stub/src/main/java/com/topjohnwu/magisk/net/Networking.java @@ -3,7 +3,6 @@ package com.topjohnwu.magisk.net; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -11,8 +10,6 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; -import javax.net.ssl.HttpsURLConnection; - public class Networking { private static final int READ_TIMEOUT = 15000; @@ -35,25 +32,6 @@ public class Networking { return request(url, "GET"); } - public static boolean init(Context context) { - try { - // Try installing new SSL provider from Google Play Service - Context gms = context.createPackageContext("com.google.android.gms", - Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); - gms.getClassLoader() - .loadClass("com.google.android.gms.common.security.ProviderInstallerImpl") - .getMethod("insertProvider", Context.class) - .invoke(null, gms); - } catch (Exception e) { - if (Build.VERSION.SDK_INT < 21) { - // Failed to update SSL provider, use NoSSLv3SocketFactory on SDK < 21 - HttpsURLConnection.setDefaultSSLSocketFactory(new NoSSLv3SocketFactory()); - } - return false; - } - return true; - } - public static boolean checkNetworkStatus(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/Request.java b/stub/src/main/java/com/topjohnwu/magisk/net/Request.java similarity index 100% rename from app/shared/src/main/java/com/topjohnwu/magisk/net/Request.java rename to stub/src/main/java/com/topjohnwu/magisk/net/Request.java diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/net/ResponseListener.java b/stub/src/main/java/com/topjohnwu/magisk/net/ResponseListener.java similarity index 100% rename from app/shared/src/main/java/com/topjohnwu/magisk/net/ResponseListener.java rename to stub/src/main/java/com/topjohnwu/magisk/net/ResponseListener.java