diff --git a/app/src/main/cpp/arm64-v8a/libnative.so b/app/src/main/cpp/arm64-v8a/libnative.so index d76f1cd..fb62ca2 100755 Binary files a/app/src/main/cpp/arm64-v8a/libnative.so and b/app/src/main/cpp/arm64-v8a/libnative.so differ diff --git a/app/src/main/cpp/armeabi-v7a/libnative.so b/app/src/main/cpp/armeabi-v7a/libnative.so index 54198c3..92cd664 100755 Binary files a/app/src/main/cpp/armeabi-v7a/libnative.so and b/app/src/main/cpp/armeabi-v7a/libnative.so differ diff --git a/app/src/main/java/com/lizongying/mytv/Request.kt b/app/src/main/java/com/lizongying/mytv/Request.kt index f6c181c..febd4ce 100644 --- a/app/src/main/java/com/lizongying/mytv/Request.kt +++ b/app/src/main/java/com/lizongying/mytv/Request.kt @@ -147,6 +147,7 @@ object Request { } fun fetchVideo(tvModel: TVViewModel, cookie: String) { + Log.i(TAG, "fetchVideo with cookie") call?.cancel() if (::btraceRunnable.isInitialized) { handler.removeCallbacks(btraceRunnable) @@ -420,6 +421,7 @@ object Request { } fun fetchData(tvModel: TVViewModel) { + Log.i(TAG, "fetchData") if (tvModel.getTV().channel == "港澳台") { fetchFAuth(tvModel) return diff --git a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt index fb22208..6833d58 100644 --- a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt +++ b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt @@ -1,7 +1,11 @@ package com.lizongying.mytv.api +import android.os.Build +import android.util.Log +import okhttp3.ConnectionSpec import okhttp3.OkHttpClient +import okhttp3.TlsVersion import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.protobuf.ProtoConverterFactory @@ -68,6 +72,36 @@ class ApiClient { .build().create(FAuthService::class.java) } + private fun enableTls12OnPreLollipop(client: OkHttpClient.Builder): OkHttpClient.Builder { + if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) { + try { + val sc = SSLContext.getInstance("TLSv1.2") + + sc.init(null, null, null) + + // a more robust version is to pass a custom X509TrustManager + // as the second parameter and make checkServerTrusted to accept your server. + // Credits: https://github.com/square/okhttp/issues/2372#issuecomment-1774955225 + client.sslSocketFactory(Tls12SocketFactory(sc.socketFactory)) + + val cs = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) + .tlsVersions(TlsVersion.TLS_1_2) + .build() + + val specs: MutableList = ArrayList() + specs.add(cs) + specs.add(ConnectionSpec.COMPATIBLE_TLS) + specs.add(ConnectionSpec.CLEARTEXT) + + client.connectionSpecs(specs) + } catch (exc: java.lang.Exception) { + Log.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc) + } + } + + return client + } + private fun getUnsafeOkHttpClient(): OkHttpClient { try { val trustAllCerts: Array = arrayOf( @@ -93,11 +127,12 @@ class ApiClient { val sslContext = SSLContext.getInstance("SSL") sslContext.init(null, trustAllCerts, java.security.SecureRandom()) - return OkHttpClient.Builder() + val builder = OkHttpClient.Builder() .sslSocketFactory(sslContext.socketFactory, trustAllCerts[0] as X509TrustManager) .hostnameVerifier { _, _ -> true } .dns(DnsCache()) - .build() + + return enableTls12OnPreLollipop(builder).build() } catch (e: Exception) { throw RuntimeException(e) diff --git a/app/src/main/java/com/lizongying/mytv/api/Tls12SocketFactory.kt b/app/src/main/java/com/lizongying/mytv/api/Tls12SocketFactory.kt new file mode 100644 index 0000000..f701f83 --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/api/Tls12SocketFactory.kt @@ -0,0 +1,74 @@ +package com.lizongying.mytv.api + +import java.io.IOException +import java.net.InetAddress +import java.net.Socket +import java.net.UnknownHostException +import javax.net.ssl.SSLSocket +import javax.net.ssl.SSLSocketFactory + + +/** + * Enables TLS v1.2 when creating SSLSockets. + * + * + * For some reason, android supports TLS v1.2 from API 16, but enables it by + * default only from API 20. + * @link https://developer.android.com/reference/javax/net/ssl/SSLSocket.html + * @see SSLSocketFactory + */ +class Tls12SocketFactory(val delegate: SSLSocketFactory) : SSLSocketFactory() { + override fun getDefaultCipherSuites(): Array { + return delegate.defaultCipherSuites + } + + override fun getSupportedCipherSuites(): Array { + return delegate.supportedCipherSuites + } + + @Throws(IOException::class) + override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket { + return patch(delegate.createSocket(s, host, port, autoClose)) + } + + @Throws(IOException::class, UnknownHostException::class) + override fun createSocket(host: String, port: Int): Socket { + return patch(delegate.createSocket(host, port)) + } + + @Throws(IOException::class, UnknownHostException::class) + override fun createSocket( + host: String, + port: Int, + localHost: InetAddress, + localPort: Int + ): Socket { + return patch(delegate.createSocket(host, port, localHost, localPort)) + } + + @Throws(IOException::class) + override fun createSocket(host: InetAddress, port: Int): Socket { + return patch(delegate.createSocket(host, port)) + } + + @Throws(IOException::class) + override fun createSocket( + address: InetAddress, + port: Int, + localAddress: InetAddress, + localPort: Int + ): Socket { + return patch(delegate.createSocket(address, port, localAddress, localPort)) + } + + private fun patch(s: Socket): Socket { + if (s is SSLSocket) { + s.enabledProtocols = TLS_V12_ONLY + } + return s + } + + companion object { + private val TLS_V12_ONLY = arrayOf("TLSv1.2") + } +} \ No newline at end of file