diff --git a/mobile/src/main/java/com/github/shadowsocks/App.kt b/mobile/src/main/java/com/github/shadowsocks/App.kt index f721adc5..26fa164b 100644 --- a/mobile/src/main/java/com/github/shadowsocks/App.kt +++ b/mobile/src/main/java/com/github/shadowsocks/App.kt @@ -34,6 +34,7 @@ import android.os.Build import android.os.Handler import android.os.Looper import android.support.annotation.RequiresApi +import android.support.v4.os.BuildCompat import android.support.v4.os.UserManagerCompat import android.support.v7.app.AppCompatDelegate import android.util.Log @@ -73,8 +74,8 @@ class App : Application() { private val tracker: Tracker by lazy { GoogleAnalytics.getInstance(deviceContext).newTracker(R.xml.tracker) } val info: PackageInfo by lazy { getPackageInfo(packageName) } - fun getPackageInfo(packageName: String) = - packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)!! + fun getPackageInfo(packageName: String) = packageManager.getPackageInfo(packageName, if (BuildCompat.isAtLeastP()) + PackageManager.GET_SIGNING_CERTIFICATES else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES)!! fun startService() { val intent = Intent(this, BaseService.serviceClass.java) diff --git a/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt b/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt index b31511bb..cd6721f5 100644 --- a/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt +++ b/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt @@ -354,7 +354,7 @@ object BaseService { .readTimeout(30, TimeUnit.SECONDS) .build() val mdg = MessageDigest.getInstance("SHA-1") - mdg.update(app.info.signatures[0].toByteArray()) + mdg.update(app.info.signaturesCompat.first().toByteArray()) val requestBody = FormBody.Builder() .add("sig", String(Base64.encode(mdg.digest(), 0))) .build() diff --git a/mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt b/mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt index 3b9e4bda..b1f64809 100644 --- a/mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt +++ b/mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt @@ -32,6 +32,7 @@ import android.util.Base64 import android.util.Log import com.github.shadowsocks.App.Companion.app import com.github.shadowsocks.utils.Commandline +import com.github.shadowsocks.utils.signaturesCompat import eu.chainfire.libsuperuser.Shell import java.io.File import java.io.FileNotFoundException @@ -47,7 +48,7 @@ object PluginManager { * public key yet since it will also automatically trust packages signed by the same signatures, e.g. debug keys. */ val trustedSignatures by lazy { - app.info.signatures.toSet() + + app.info.signaturesCompat.toSet() + Signature(Base64.decode( // @Mygod """ |MIIDWzCCAkOgAwIBAgIEUzfv8DANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD diff --git a/mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt b/mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt index b023eacb..e023060c 100644 --- a/mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt +++ b/mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt @@ -24,6 +24,7 @@ import android.content.pm.ResolveInfo import android.graphics.drawable.Drawable import android.os.Bundle import com.github.shadowsocks.App.Companion.app +import com.github.shadowsocks.utils.signaturesCompat abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() { protected abstract val metaData: Bundle @@ -34,6 +35,6 @@ abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() override val defaultConfig: String by lazy { metaData.getString(PluginContract.METADATA_KEY_DEFAULT_CONFIG) } override val packageName: String get() = resolveInfo.resolvePackageName override val trusted by lazy { - app.getPackageInfo(packageName).signatures.any(PluginManager.trustedSignatures::contains) + app.getPackageInfo(packageName).signaturesCompat.any(PluginManager.trustedSignatures::contains) } } diff --git a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt index cf8e9c6b..985ad392 100644 --- a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt +++ b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt @@ -3,12 +3,14 @@ package com.github.shadowsocks.utils import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.pm.PackageInfo import android.content.res.Resources import android.os.Build import android.support.annotation.AttrRes import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager import android.support.v4.content.ContextCompat +import android.support.v4.os.BuildCompat import android.support.v7.util.SortedList import android.util.TypedValue import com.github.shadowsocks.App.Companion.app @@ -53,6 +55,10 @@ val URLConnection.responseLength: Long inline fun Context.systemService() = ContextCompat.getSystemService(this, T::class.java)!! +val PackageInfo.signaturesCompat get() = + if (BuildCompat.isAtLeastP()) signingCertificateHistory.flatten() + else @Suppress("DEPRECATION") signatures.asIterable() + /** * Based on: https://stackoverflow.com/a/15656428/2245107 */