From 53cbb26209fd49bd95484fa5904252108fbae251 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Aug 2016 22:56:31 +0200 Subject: [PATCH 1/6] check whether installed APKs exist and are readable before hashing I guess APKs could disappear, or perhaps not be readable. closes #699 Here's the stacktrace: java.io.FileNotFoundException: /system/priv-app/ATT_Ready2Go/ATT_Ready2Go.apk: open failed: ENOENT (No such file or directory) at org.fdroid.fdroid.Utils.getBinaryHash(Utils.java:405) at org.fdroid.fdroid.data.InstalledAppProviderService.onHandleIntent(InstalledAppProviderService.java:164) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.os.HandlerThread.run(HandlerThread.java:61) --- .../fdroid/fdroid/data/InstalledAppProviderService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index 44dc8e642..74aeb18c4 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -160,9 +160,12 @@ public class InstalledAppProviderService extends IntentService { if (ACTION_INSERT.equals(action)) { PackageInfo packageInfo = getPackageInfo(intent, packageName); if (packageInfo != null) { - String hashType = "sha256"; - String hash = Utils.getBinaryHash(new File(packageInfo.applicationInfo.publicSourceDir), hashType); - insertAppIntoDb(this, packageInfo, hashType, hash); + File apk = new File(packageInfo.applicationInfo.publicSourceDir); + if (apk.exists() && apk.canRead()) { + String hashType = "sha256"; + String hash = Utils.getBinaryHash(apk, hashType); + insertAppIntoDb(this, packageInfo, hashType, hash); + } } } else if (ACTION_DELETE.equals(action)) { deleteAppFromDb(this, packageName); From 3adfbc66aac2fce6d47009c7ab4898dfd6b716c8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Aug 2016 10:42:39 +0200 Subject: [PATCH 2/6] sort gradle-witness lines so its easy to see changes --- app/build.gradle | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e0bdcd669..80e15dd7d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,23 +82,23 @@ if (!hasProperty('sourceDeps')) { // source code don't need to be here. dependencyVerification { verify = [ - 'com.android.support:support-v4:246c99385a84fe179d7b833c9ddaf2576f217b0abba5e74b5353cc78756f5880', - 'com.android.support:appcompat-v7:bf8db89d678286043778990fc967346e94321cc8d8bad99e9b0db20588509156', - 'com.android.support:support-annotations:bac4e534657165b0c4c362c97db389dcb152e43273435d2ccaa939a82e03f42c', - 'com.nostra13.universalimageloader:universal-image-loader:dbd5197ffec3a8317533190870a7c00ff3750dd6a31241448c6a5522d51b65b4', - 'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259', - 'eu.chainfire:libsuperuser:018344ff19ee94d252c14b4a503ee8b519184db473a5af83513f5837c413b128', - 'cc.mvdan.accesspoint:library:0837b38adb48b66bb1385adb6ade8ecce7002ad815c55abf13517c82193458ea', - 'commons-io:commons-io:a10418348d234968600ccb1d988efcbbd08716e1d96936ccc1880e7d22513474', - 'commons-net:commons-net:c25b0da668b3c5649f002d504def22d1b4cb30d206f05428d2fe168fa1a901c2', - 'info.guardianproject.netcipher:netcipher:611ec5bde9d799fd57e1efec5c375f9f460de2cdda98918541decc9a7d02f2ad', - 'org.openhab.jmdns:jmdns:7a4b34b5606bbd2aff7fdfe629edcb0416fccd367fb59a099f210b9aba4f0bce', - 'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905', - 'com.madgag.spongycastle:prov:029f26cd6b67c06ffa05702d426d472c141789001bcb15b7262ed86c868e5643', - 'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b', - 'ch.acra:acra:98e71bd00a713b9f848abbae4874601533aaf8492bf9b508e14d07f844a53839', - 'io.reactivex:rxjava:2c162afd78eba217cdfee78b60e85d3bfb667db61e12bc95e3cf2ddc5beeadf6', - 'io.reactivex:rxandroid:35c1a90f8c1f499db3c1f3d608e1f191ac8afddb10c02dd91ef04c03a0a4bcda', + 'cc.mvdan.accesspoint:library:0837b38adb48b66bb1385adb6ade8ecce7002ad815c55abf13517c82193458ea', + 'ch.acra:acra:98e71bd00a713b9f848abbae4874601533aaf8492bf9b508e14d07f844a53839', + 'commons-io:commons-io:a10418348d234968600ccb1d988efcbbd08716e1d96936ccc1880e7d22513474', + 'commons-net:commons-net:c25b0da668b3c5649f002d504def22d1b4cb30d206f05428d2fe168fa1a901c2', + 'com.android.support:appcompat-v7:bf8db89d678286043778990fc967346e94321cc8d8bad99e9b0db20588509156', + 'com.android.support:support-annotations:bac4e534657165b0c4c362c97db389dcb152e43273435d2ccaa939a82e03f42c', + 'com.android.support:support-v4:246c99385a84fe179d7b833c9ddaf2576f217b0abba5e74b5353cc78756f5880', + 'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259', + 'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b', + 'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905', + 'com.madgag.spongycastle:prov:029f26cd6b67c06ffa05702d426d472c141789001bcb15b7262ed86c868e5643', + 'com.nostra13.universalimageloader:universal-image-loader:dbd5197ffec3a8317533190870a7c00ff3750dd6a31241448c6a5522d51b65b4', + 'eu.chainfire:libsuperuser:018344ff19ee94d252c14b4a503ee8b519184db473a5af83513f5837c413b128', + 'info.guardianproject.netcipher:netcipher:611ec5bde9d799fd57e1efec5c375f9f460de2cdda98918541decc9a7d02f2ad', + 'io.reactivex:rxandroid:35c1a90f8c1f499db3c1f3d608e1f191ac8afddb10c02dd91ef04c03a0a4bcda', + 'io.reactivex:rxjava:2c162afd78eba217cdfee78b60e85d3bfb667db61e12bc95e3cf2ddc5beeadf6', + 'org.openhab.jmdns:jmdns:7a4b34b5606bbd2aff7fdfe629edcb0416fccd367fb59a099f210b9aba4f0bce', ] } From 691545f0657f7551fc07fac16bea978ec6f88981 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Aug 2016 23:23:38 +0200 Subject: [PATCH 3/6] use gradle-witness for all included libs use the automatic method for generating the gradle-witness block so its easy to keep it updated. --- app/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 80e15dd7d..1807eb366 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,15 +80,18 @@ if (!hasProperty('sourceDeps')) { // Only do the libraries imported from maven repositories. Our own libraries // (like privileged-api-lib) and the prebuilt jars already checked into the // source code don't need to be here. + // generate using: `gradle -q calculateChecksums | sort -V` dependencyVerification { verify = [ 'cc.mvdan.accesspoint:library:0837b38adb48b66bb1385adb6ade8ecce7002ad815c55abf13517c82193458ea', 'ch.acra:acra:98e71bd00a713b9f848abbae4874601533aaf8492bf9b508e14d07f844a53839', 'commons-io:commons-io:a10418348d234968600ccb1d988efcbbd08716e1d96936ccc1880e7d22513474', 'commons-net:commons-net:c25b0da668b3c5649f002d504def22d1b4cb30d206f05428d2fe168fa1a901c2', + 'com.android.support:animated-vector-drawable:4fcd1fc36034a804200ef3e552b0f2f688a0a7a8a007de43201e40bfedda73b3', 'com.android.support:appcompat-v7:bf8db89d678286043778990fc967346e94321cc8d8bad99e9b0db20588509156', 'com.android.support:support-annotations:bac4e534657165b0c4c362c97db389dcb152e43273435d2ccaa939a82e03f42c', 'com.android.support:support-v4:246c99385a84fe179d7b833c9ddaf2576f217b0abba5e74b5353cc78756f5880', + 'com.android.support:support-vector-drawable:45b1f180b437a750429f6c1457181c167ba211c17fcb992f83cdbefef5eb1519', 'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259', 'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b', 'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905', From 0577ecfc536b94b2031e7e326a3467550a9110a3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Aug 2016 23:28:04 +0200 Subject: [PATCH 4/6] update support libs to latest (24.2.0) to hopefully fix crashes Based on ACRA reports, there are some mystery UI related stacktraces that do not have org.fdroid.fdroid lines in them. --- app/build.gradle | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1807eb366..48c5f21be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,9 +18,9 @@ repositories { } dependencies { - compile 'com.android.support:support-v4:24.1.1' - compile 'com.android.support:appcompat-v7:24.1.1' - compile 'com.android.support:support-annotations:24.1.1' + compile 'com.android.support:support-v4:24.2.0' + compile 'com.android.support:appcompat-v7:24.2.0' + compile 'com.android.support:support-annotations:24.2.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.google.zxing:core:3.2.1' @@ -43,7 +43,7 @@ dependencies { testCompile "org.mockito:mockito-core:1.10.19" - androidTestCompile 'com.android.support:support-annotations:24.1.1' + androidTestCompile 'com.android.support:support-annotations:24.2.0' androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test:rules:0.5' } @@ -87,11 +87,16 @@ if (!hasProperty('sourceDeps')) { 'ch.acra:acra:98e71bd00a713b9f848abbae4874601533aaf8492bf9b508e14d07f844a53839', 'commons-io:commons-io:a10418348d234968600ccb1d988efcbbd08716e1d96936ccc1880e7d22513474', 'commons-net:commons-net:c25b0da668b3c5649f002d504def22d1b4cb30d206f05428d2fe168fa1a901c2', - 'com.android.support:animated-vector-drawable:4fcd1fc36034a804200ef3e552b0f2f688a0a7a8a007de43201e40bfedda73b3', - 'com.android.support:appcompat-v7:bf8db89d678286043778990fc967346e94321cc8d8bad99e9b0db20588509156', - 'com.android.support:support-annotations:bac4e534657165b0c4c362c97db389dcb152e43273435d2ccaa939a82e03f42c', - 'com.android.support:support-v4:246c99385a84fe179d7b833c9ddaf2576f217b0abba5e74b5353cc78756f5880', - 'com.android.support:support-vector-drawable:45b1f180b437a750429f6c1457181c167ba211c17fcb992f83cdbefef5eb1519', + 'com.android.support:animated-vector-drawable:af39eb9a350084eae2a9e119db762633bbf1ad25eed5305dcc3af2411442ba68', + 'com.android.support:appcompat-v7:29b1e21852ace88ad406bbe32d7791b518118f0a61a61453aca0affa8ef909e0', + 'com.android.support:support-annotations:af5868da6750bdf42aec5d85fa87ac30de2b72939ca80437a6247e5753a07cad', + 'com.android.support:support-compat:de70ac981118229b70ca29961b6df510d6f498c0ececd1e11e19a8073d1580c9', + 'com.android.support:support-core-ui:6cd8723abdeafbd8d05816d7b4a307dd4dbebba9cb145f98e12834ab3ebd9212', + 'com.android.support:support-core-utils:20dd25988a360df5887e8ad5d9cf9b77b54fb014a17163f2125ecde8aa635846', + 'com.android.support:support-fragment:50aa9d408d33b82acda71423ce2980e54186caaae50f689ecd90e6692dcc3ed4', + 'com.android.support:support-media-compat:b6b4ed6dd8e0678bb5fd6457ea9155766cc12d5bc5df9c283c01e0dc782ffb19', + 'com.android.support:support-v4:989888d1b48badd790b8386e9ab61ec793a453ce782faa11e89634d889db3a44', + 'com.android.support:support-vector-drawable:049b53487c07d6270f4b85896c0871645cfb2c6300bbd83f7e5ebf91f069d6a4', 'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259', 'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b', 'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905', From b45f7ba27cd046204e07c8b980c162ce22b3f04a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Aug 2016 10:50:43 +0200 Subject: [PATCH 5/6] remove confusing messages when Privileged Extension not installed This was saying that the Privileged Extension is enabled but not properly configured. This is because the preference logic changed to default to on unless the user explicitly disabled it. So using the Privileged Extension based on whether its installed and whether the user has disabled it. related to ea0700d406101b7ed6907b1dbd2918dbc214f435 --- .../fdroid/installer/InstallerFactory.java | 17 +++++------------ .../fdroid/installer/PrivilegedInstaller.java | 1 - 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java index b35686e4e..c2ff1f8a8 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java @@ -20,7 +20,6 @@ package org.fdroid.fdroid.installer; import android.content.Context; -import android.util.Log; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Utils; @@ -47,17 +46,11 @@ public class InstallerFactory { && apk.packageName.equals(PrivilegedInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME)) { // special case for "F-Droid Privileged Extension" installer = new ExtensionInstaller(context); - } else if (isPrivilegedInstallerEnabled()) { - if (PrivilegedInstaller.isExtensionInstalledCorrectly(context) - == PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES) { - Utils.debugLog(TAG, "privileged extension correctly installed -> PrivilegedInstaller"); - - installer = new PrivilegedInstaller(context); - } else { - Log.e(TAG, "PrivilegedInstaller is enabled in prefs, but not working correctly!"); - // fallback to default installer - installer = new DefaultInstaller(context); - } + } else if (isPrivilegedInstallerEnabled() + && PrivilegedInstaller.isExtensionInstalledCorrectly(context) + == PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES) { + Utils.debugLog(TAG, "privileged extension correctly installed -> PrivilegedInstaller"); + installer = new PrivilegedInstaller(context); } else { installer = new DefaultInstaller(context); } diff --git a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java index ee409c1c9..f964bed03 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java @@ -271,7 +271,6 @@ public class PrivilegedInstaller extends Installer { public static int isExtensionInstalledCorrectly(Context context) { // check if installed if (!isExtensionInstalled(context)) { - Log.e(TAG, "IS_EXTENSION_INSTALLED_NO"); return IS_EXTENSION_INSTALLED_NO; } From 45b083546f36b4df62954a77a05b7615ca048e2f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Aug 2016 11:30:18 +0200 Subject: [PATCH 6/6] get ACRA reports without crashing to debug #698 This should be reverted once #698 is fixed. If execution has gotten this far into InstallManagerService, there should always be App and Apk instances. That is enforced when Intents are received by this Service. --- .../installer/InstallManagerService.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index ff6c98e07..d8a5d8bc0 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -16,6 +16,7 @@ import android.support.v4.app.TaskStackBuilder; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; +import org.acra.ACRA; import org.fdroid.fdroid.AppDetails; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; @@ -140,6 +141,7 @@ public class InstallManagerService extends Service { if ((flags & START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY && !DownloaderService.isQueuedOrActive(urlString)) { + // TODO is there a case where we should allow an active urlString to pass through? Utils.debugLog(TAG, urlString + " finished downloading while InstallManagerService was killed."); cancelNotification(urlString); return START_NOT_STICKY; @@ -247,16 +249,22 @@ public class InstallManagerService extends Service { // show notification if app details is not visible if (!TextUtils.isEmpty(errorMessage)) { - App app = getAppFromActive(downloadUrl); + try { + // temp setup to debug https://gitlab.com/fdroid/fdroidclient/issues/698 + App app = getAppFromActive(downloadUrl); - // show notification if app details is not visible - if (AppDetails.isAppVisible(app.packageName)) { - cancelNotification(downloadUrl); - } else { - String title = String.format( - getString(R.string.install_error_notify_title), - app.name); - notifyError(downloadUrl, title, errorMessage); + // show notification if app details is not visible + if (AppDetails.isAppVisible(app.packageName)) { + cancelNotification(downloadUrl); + } else { + String title = String.format( + getString(R.string.install_error_notify_title), + app.name); + notifyError(downloadUrl, title, errorMessage); + } + } catch (NullPointerException e) { //NOPMD + ACRA.getErrorReporter().handleException( + new IllegalStateException(errorMessage, e)); } } removeFromActive(downloadUrl);