MD5 校验值:d555a6389a0a865314e2706996812829
AndroidPlatform.java 文件包含反编译后的源代码,请注意,该内容仅供学习和参考使用,不得用于非法用途。
package kkhttp3.internal.platform; import android.os.Build; import android.security.NetworkSecurityPolicy; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.InetSocketAddress; import java.net.Socket; import java.security.cert.TrustAnchor; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import kavax.net.ssl.SSLSocket; import kavax.net.ssl.SSLSocketFactory; import kavax.net.ssl.X509TrustManager; import kkhttp3.Protocol; import kkhttp3.internal.platform.android.AndroidCertificateChainCleaner; import kkhttp3.internal.platform.android.AndroidSocketAdapter; import kkhttp3.internal.platform.android.BouncyCastleSocketAdapter; import kkhttp3.internal.platform.android.CloseGuard; import kkhttp3.internal.platform.android.ConscryptSocketAdapter; import kkhttp3.internal.platform.android.DeferredSocketAdapter; import kkhttp3.internal.platform.android.SocketAdapter; import kkhttp3.internal.platform.android.StandardAndroidSocketAdapter; import kkhttp3.internal.tls.CertificateChainCleaner; import kkhttp3.internal.tls.TrustRootIndex; import kotlin.Metadata; import kotlin.collections.CollectionsKt; import kotlin.jvm.internal.DefaultConstructorMarker; import kotlin.jvm.internal.Intrinsics; @Metadata(bv = {1, 0, 3}, d1 = {"\u0000x\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\b\n\u0002\b\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000b\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0003\b\u0007\u0018\u0000 )2\u00020\u0001:\u0002)*B\u0005¢\u0006\u0002\u0010\u0002J\u0010\u0010\b\u001a\u00020\t2\u0006\u0010\n\u001a\u00020\u000bH\u0016J\u0010\u0010\f\u001a\u00020\r2\u0006\u0010\n\u001a\u00020\u000bH\u0016J-\u0010\u000e\u001a\u00020\u000f2\u0006\u0010\u0010\u001a\u00020\u00112\b\u0010\u0012\u001a\u0004\u0018\u00010\u00132\u0011\u0010\u0014\u001a\r\u0012\t\u0012\u00070\u0015¢\u0006\u0002\b\u00160\u0006H\u0016J \u0010\u0017\u001a\u00020\u000f2\u0006\u0010\u0018\u001a\u00020\u00192\u0006\u0010\u001a\u001a\u00020\u001b2\u0006\u0010\u001c\u001a\u00020\u001dH\u0016J\u0012\u0010\u001e\u001a\u0004\u0018\u00010\u00132\u0006\u0010\u0010\u001a\u00020\u0011H\u0016J\u0012\u0010\u001f\u001a\u0004\u0018\u00010 2\u0006\u0010!\u001a\u00020\u0013H\u0016J\u0010\u0010\"\u001a\u00020#2\u0006\u0010\u0012\u001a\u00020\u0013H\u0016J\u001a\u0010$\u001a\u00020\u000f2\u0006\u0010%\u001a\u00020\u00132\b\u0010&\u001a\u0004\u0018\u00010 H\u0016J\u0012\u0010\n\u001a\u0004\u0018\u00010\u000b2\u0006\u0010'\u001a\u00020(H\u0016R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004¢\u0006\u0002\n\u0000R\u0014\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\u00070\u0006X\u0082\u0004¢\u0006\u0002\n\u0000¨\u0006+"}, d2 = {"Lkkhttp3/internal/platform/AndroidPlatform;", "Lkkhttp3/internal/platform/Platform;", "()V", "closeGuard", "Lkkhttp3/internal/platform/android/CloseGuard;", "socketAdapters", "", "Lkkhttp3/internal/platform/android/SocketAdapter;", "buildCertificateChainCleaner", "Lkkhttp3/internal/tls/CertificateChainCleaner;", "trustManager", "Lkavax/net/ssl/X509TrustManager;", "buildTrustRootIndex", "Lkkhttp3/internal/tls/TrustRootIndex;", "configureTlsExtensions", "", "sslSocket", "Lkavax/net/ssl/SSLSocket;", "hostname", "", "protocols", "Lkkhttp3/Protocol;", "Lkotlin/jvm/JvmSuppressWildcards;", "connectSocket", "socket", "Ljava/net/Socket;", "address", "Ljava/net/InetSocketAddress;", "connectTimeout", "", "getSelectedProtocol", "getStackTraceForCloseable", "", "closer", "isCleartextTrafficPermitted", "", "logCloseableLeak", "message", "stackTrace", "sslSocketFactory", "Lkavax/net/ssl/SSLSocketFactory;", "Companion", "CustomTrustRootIndex", "okhttp"}, k = 1, mv = {1, 4, 0}) public final class AndroidPlatform extends Platform { public static final Companion INSTANCE = new Companion(null); private static final boolean isSupported; private final CloseGuard closeGuard; private final List<SocketAdapter> socketAdapters; public AndroidPlatform() { List listOfNotNull = CollectionsKt.listOfNotNull(new SocketAdapter[]{StandardAndroidSocketAdapter.Companion.buildIfSupported$default(StandardAndroidSocketAdapter.INSTANCE, null, 1, null), new DeferredSocketAdapter(AndroidSocketAdapter.INSTANCE.getPlayProviderFactory()), new DeferredSocketAdapter(ConscryptSocketAdapter.INSTANCE.getFactory()), new DeferredSocketAdapter(BouncyCastleSocketAdapter.INSTANCE.getFactory())}); ArrayList arrayList = new ArrayList(); for (Object obj : listOfNotNull) { if (((SocketAdapter) obj).isSupported()) { arrayList.add(obj); } } this.socketAdapters = arrayList; this.closeGuard = CloseGuard.INSTANCE.get(); } @Override public void connectSocket(Socket socket, InetSocketAddress address, int connectTimeout) throws IOException { Intrinsics.checkNotNullParameter(socket, "socket"); Intrinsics.checkNotNullParameter(address, "address"); try { socket.connect(address, connectTimeout); } catch (ClassCastException e) { if (Build.VERSION.SDK_INT == 26) { throw new IOException("Exception in connect", e); } throw e; } } @Override public X509TrustManager trustManager(SSLSocketFactory sslSocketFactory) { Object obj; Intrinsics.checkNotNullParameter(sslSocketFactory, "sslSocketFactory"); Iterator<T> it = this.socketAdapters.iterator(); while (true) { if (!it.hasNext()) { obj = null; break; } obj = it.next(); if (((SocketAdapter) obj).matchesSocketFactory(sslSocketFactory)) { break; } } SocketAdapter socketAdapter = (SocketAdapter) obj; if (socketAdapter != null) { return socketAdapter.trustManager(sslSocketFactory); } return null; } @Override public void configureTlsExtensions(SSLSocket sslSocket, String hostname, List<Protocol> protocols) { Object obj; Intrinsics.checkNotNullParameter(sslSocket, "sslSocket"); Intrinsics.checkNotNullParameter(protocols, "protocols"); Iterator<T> it = this.socketAdapters.iterator(); while (true) { if (!it.hasNext()) { obj = null; break; } else { obj = it.next(); if (((SocketAdapter) obj).matchesSocket(sslSocket)) { break; } } } SocketAdapter socketAdapter = (SocketAdapter) obj; if (socketAdapter != null) { socketAdapter.configureTlsExtensions(sslSocket, hostname, protocols); } } @Override public String getSelectedProtocol(SSLSocket sslSocket) { Object obj; Intrinsics.checkNotNullParameter(sslSocket, "sslSocket"); Iterator<T> it = this.socketAdapters.iterator(); while (true) { if (!it.hasNext()) { obj = null; break; } obj = it.next(); if (((SocketAdapter) obj).matchesSocket(sslSocket)) { break; } } SocketAdapter socketAdapter = (SocketAdapter) obj; if (socketAdapter != null) { return socketAdapter.getSelectedProtocol(sslSocket); } return null; } @Override public Object getStackTraceForCloseable(String closer) { Intrinsics.checkNotNullParameter(closer, "closer"); return this.closeGuard.createAndOpen(closer); } @Override public void logCloseableLeak(String message, Object stackTrace) { Intrinsics.checkNotNullParameter(message, "message"); if (this.closeGuard.warnIfOpen(stackTrace)) { return; } Platform.log$default(this, message, 5, null, 4, null); } @Override public boolean isCleartextTrafficPermitted(String hostname) { Intrinsics.checkNotNullParameter(hostname, "hostname"); if (Build.VERSION.SDK_INT >= 24) { return NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(hostname); } if (Build.VERSION.SDK_INT < 23) { return true; } NetworkSecurityPolicy networkSecurityPolicy = NetworkSecurityPolicy.getInstance(); Intrinsics.checkNotNullExpressionValue(networkSecurityPolicy, "NetworkSecurityPolicy.getInstance()"); return networkSecurityPolicy.isCleartextTrafficPermitted(); } @Override public CertificateChainCleaner buildCertificateChainCleaner(X509TrustManager trustManager) { Intrinsics.checkNotNullParameter(trustManager, "trustManager"); AndroidCertificateChainCleaner buildIfSupported = AndroidCertificateChainCleaner.INSTANCE.buildIfSupported(trustManager); return buildIfSupported != null ? buildIfSupported : super.buildCertificateChainCleaner(trustManager); } @Override public TrustRootIndex buildTrustRootIndex(X509TrustManager trustManager) { Intrinsics.checkNotNullParameter(trustManager, "trustManager"); try { Method declaredMethod = trustManager.getClass().getDeclaredMethod("findTrustAnchorByIssuerAndSignature", X509Certificate.class); Intrinsics.checkNotNullExpressionValue(declaredMethod, "method"); declaredMethod.setAccessible(true); return new CustomTrustRootIndex(trustManager, declaredMethod); } catch (NoSuchMethodException unused) { return super.buildTrustRootIndex(trustManager); } } @Metadata(bv = {1, 0, 3}, d1 = {"\u00008\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0010\u000b\n\u0000\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\b\n\u0000\n\u0002\u0010\u000e\n\u0000\b\u0080\b\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\u0007\u001a\u00020\u0003HÂ\u0003J\t\u0010\b\u001a\u00020\u0005HÂ\u0003J\u001d\u0010\t\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001J\u0013\u0010\n\u001a\u00020\u000b2\b\u0010\f\u001a\u0004\u0018\u00010\rHÖ\u0003J\u0012\u0010\u000e\u001a\u0004\u0018\u00010\u000f2\u0006\u0010\u0010\u001a\u00020\u000fH\u0016J\t\u0010\u0011\u001a\u00020\u0012HÖ\u0001J\t\u0010\u0013\u001a\u00020\u0014HÖ\u0001R\u000e\u0010\u0004\u001a\u00020\u0005X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0002\u001a\u00020\u0003X\u0082\u0004¢\u0006\u0002\n\u0000¨\u0006\u0015"}, d2 = {"Lkkhttp3/internal/platform/AndroidPlatform$CustomTrustRootIndex;", "Lkkhttp3/internal/tls/TrustRootIndex;", "trustManager", "Lkavax/net/ssl/X509TrustManager;", "findByIssuerAndSignatureMethod", "Ljava/lang/reflect/Method;", "(Lkavax/net/ssl/X509TrustManager;Ljava/lang/reflect/Method;)V", "component1", "component2", "copy", "equals", "", "other", "", "findByIssuerAndSignature", "Ljava/security/cert/X509Certificate;", "cert", "hashCode", "", "toString", "", "okhttp"}, k = 1, mv = {1, 4, 0}) public static final class CustomTrustRootIndex implements TrustRootIndex { private final Method findByIssuerAndSignatureMethod; private final X509TrustManager trustManager; private final X509TrustManager getTrustManager() { return this.trustManager; } private final Method getFindByIssuerAndSignatureMethod() { return this.findByIssuerAndSignatureMethod; } public static CustomTrustRootIndex copy$default(CustomTrustRootIndex customTrustRootIndex, X509TrustManager x509TrustManager, Method method, int i, Object obj) { if ((i & 1) != 0) { x509TrustManager = customTrustRootIndex.trustManager; } if ((i & 2) != 0) { method = customTrustRootIndex.findByIssuerAndSignatureMethod; } return customTrustRootIndex.copy(x509TrustManager, method); } public final CustomTrustRootIndex copy(X509TrustManager trustManager, Method findByIssuerAndSignatureMethod) { Intrinsics.checkNotNullParameter(trustManager, "trustManager"); Intrinsics.checkNotNullParameter(findByIssuerAndSignatureMethod, "findByIssuerAndSignatureMethod"); return new CustomTrustRootIndex(trustManager, findByIssuerAndSignatureMethod); } public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof CustomTrustRootIndex)) { return false; } CustomTrustRootIndex customTrustRootIndex = (CustomTrustRootIndex) other; return Intrinsics.areEqual(this.trustManager, customTrustRootIndex.trustManager) && Intrinsics.areEqual(this.findByIssuerAndSignatureMethod, customTrustRootIndex.findByIssuerAndSignatureMethod); } public int hashCode() { X509TrustManager x509TrustManager = this.trustManager; int hashCode = (x509TrustManager != null ? x509TrustManager.hashCode() : 0) * 31; Method method = this.findByIssuerAndSignatureMethod; return hashCode + (method != null ? method.hashCode() : 0); } public String toString() { return "CustomTrustRootIndex(trustManager=" + this.trustManager + ", findByIssuerAndSignatureMethod=" + this.findByIssuerAndSignatureMethod + ")"; } public CustomTrustRootIndex(X509TrustManager x509TrustManager, Method method) { Intrinsics.checkNotNullParameter(x509TrustManager, "trustManager"); Intrinsics.checkNotNullParameter(method, "findByIssuerAndSignatureMethod"); this.trustManager = x509TrustManager; this.findByIssuerAndSignatureMethod = method; } @Override public X509Certificate findByIssuerAndSignature(X509Certificate cert) { Intrinsics.checkNotNullParameter(cert, "cert"); try { Object invoke = this.findByIssuerAndSignatureMethod.invoke(this.trustManager, cert); if (invoke == null) { throw new NullPointerException("null cannot be cast to non-null type java.security.cert.TrustAnchor"); } return ((TrustAnchor) invoke).getTrustedCert(); } catch (IllegalAccessException e) { throw new AssertionError("unable to get issues and signature", e); } catch (InvocationTargetException unused) { return null; } } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\b\u0010\u0006\u001a\u0004\u0018\u00010\u0007R\u0011\u0010\u0003\u001a\u00020\u0004¢\u0006\b\n\u0000\u001a\u0004\b\u0003\u0010\u0005¨\u0006\b"}, d2 = {"Lkkhttp3/internal/platform/AndroidPlatform$Companion;", "", "()V", "isSupported", "", "()Z", "buildIfSupported", "Lkkhttp3/internal/platform/Platform;", "okhttp"}, k = 1, mv = {1, 4, 0}) public static final class Companion { private Companion() { } public Companion(DefaultConstructorMarker defaultConstructorMarker) { this(); } public final boolean isSupported() { return AndroidPlatform.isSupported; } public final Platform buildIfSupported() { if (isSupported()) { return new AndroidPlatform(); } return null; } } static { boolean z = true; if (Platform.INSTANCE.isAndroid() && Build.VERSION.SDK_INT < 30) { if (!(Build.VERSION.SDK_INT >= 21)) { throw new IllegalStateException(("Expected Android API level 21+ but was " + Build.VERSION.SDK_INT).toString()); } } else { z = false; } isSupported = z; } }