From db4aa3b519349abfd6d30678e67a849ec0a359be Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 18 Apr 2017 23:05:21 +0530 Subject: [PATCH] Installer: Use content URI on API >= 24 for DefaultInstaller fallback * When there's a permission mismatch (#951, #890), the fallback DefaultInstaller is invoked, which enforces file and content schemes for API < 24 and >= 24 respectively. * Use content URI in that case, which allows the fallback to work. --- .../fdroid/fdroid/installer/Installer.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java index 0b72bf157..e77b83634 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; +import android.os.Build; import android.os.PatternMatcher; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; @@ -228,6 +229,19 @@ public abstract class Installer { * installation of that specific APK */ public void installPackage(Uri localApkUri, Uri downloadUri) { + Uri sanitizedUri; + + try { + // move apk file to private directory for installation and check hash + sanitizedUri = ApkFileProvider.getSafeUri( + context, localApkUri, apk, supportsContentUri()); + } catch (IOException e) { + Log.e(TAG, e.getMessage(), e); + sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_INTERRUPTED, + e.getMessage()); + return; + } + try { // verify that permissions of the apk file match the ones from the apk object ApkVerifier apkVerifier = new ApkVerifier(context, localApkUri, apk); @@ -245,23 +259,18 @@ public abstract class Installer { Log.e(TAG, e.getMessage(), e); Log.e(TAG, "Falling back to AOSP DefaultInstaller!"); DefaultInstaller defaultInstaller = new DefaultInstaller(context, apk); - defaultInstaller.installPackageInternal(localApkUri, downloadUri); + // https://code.google.com/p/android/issues/detail?id=205827 + if (Build.VERSION.SDK_INT >= 24) { + // content scheme for N and above + defaultInstaller.installPackageInternal(sanitizedUri, downloadUri); + } else { + // file scheme for below N + defaultInstaller.installPackageInternal(localApkUri, downloadUri); + } return; } } - Uri sanitizedUri; - try { - // move apk file to private directory for installation and check hash - sanitizedUri = ApkFileProvider.getSafeUri( - context, localApkUri, apk, supportsContentUri()); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_INTERRUPTED, - e.getMessage()); - return; - } - installPackageInternal(sanitizedUri, downloadUri); }