From caa1ead689eedd2023fa5b6b29bde40517d84668 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 4 Jul 2017 15:36:26 +1000 Subject: [PATCH 01/12] Added anti-feature table + join onto apk. Not used yet, but will be used soon for known vulnerability anti features. --- .../main/java/org/fdroid/fdroid/data/Apk.java | 4 +- .../java/org/fdroid/fdroid/data/DBHelper.java | 46 ++++++++++++++--- .../java/org/fdroid/fdroid/data/Schema.java | 50 +++++++++++++++++-- 3 files changed, 87 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 6fc5ac197..bd2cd1419 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -241,7 +241,7 @@ public class Apk extends ValueObject implements Comparable, Parcelable { case Cols.Repo.ADDRESS: repoAddress = cursor.getString(i); break; - case Cols.ANTI_FEATURES: + case Cols.AntiFeatures.ANTI_FEATURES: antiFeatures = Utils.parseCommaSeparatedString(cursor.getString(i)); break; } @@ -348,7 +348,7 @@ public class Apk extends ValueObject implements Comparable, Parcelable { values.put(Cols.FEATURES, Utils.serializeCommaSeparatedString(features)); values.put(Cols.NATIVE_CODE, Utils.serializeCommaSeparatedString(nativecode)); values.put(Cols.INCOMPATIBLE_REASONS, Utils.serializeCommaSeparatedString(incompatibleReasons)); - values.put(Cols.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures)); + values.put(Cols.AntiFeatures.ANTI_FEATURES, Utils.serializeCommaSeparatedString(antiFeatures)); values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0); return values; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 7dddc07b6..3e487f594 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -34,6 +34,8 @@ import android.util.Log; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Schema.AntiFeatureTable; +import org.fdroid.fdroid.data.Schema.ApkAntiFeatureJoinTable; import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.CatJoinTable; import org.fdroid.fdroid.data.Schema.PackageTable; @@ -107,8 +109,7 @@ class DBHelper extends SQLiteOpenHelper { + ApkTable.Cols.HASH_TYPE + " string, " + ApkTable.Cols.ADDED_DATE + " string, " + ApkTable.Cols.IS_COMPATIBLE + " int not null, " - + ApkTable.Cols.INCOMPATIBLE_REASONS + " text, " - + ApkTable.Cols.ANTI_FEATURES + " string" + + ApkTable.Cols.INCOMPATIBLE_REASONS + " text" + ");"; static final String CREATE_TABLE_APP_METADATA = "CREATE TABLE " + AppMetadataTable.NAME @@ -194,7 +195,19 @@ class DBHelper extends SQLiteOpenHelper { + InstalledAppTable.Cols.HASH + " TEXT NOT NULL" + " );"; - protected static final int DB_VERSION = 74; + private static final String CREATE_TABLE_ANTI_FEATURE = "CREATE TABLE " + AntiFeatureTable.NAME + + " ( " + + AntiFeatureTable.Cols.NAME + " TEXT NOT NULL " + + " );"; + + private static final String CREATE_TABLE_APK_ANTI_FEATURE_JOIN = "CREATE TABLE " + ApkAntiFeatureJoinTable.NAME + + " ( " + + ApkAntiFeatureJoinTable.Cols.APK_ID + " INT NOT NULL, " + + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + " INT NOT NULL, " + + "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") " + + " );"; + + protected static final int DB_VERSION = 75; private final Context context; @@ -214,6 +227,8 @@ class DBHelper extends SQLiteOpenHelper { db.execSQL(CREATE_TABLE_INSTALLED_APP); db.execSQL(CREATE_TABLE_REPO); db.execSQL(CREATE_TABLE_APP_PREFS); + db.execSQL(CREATE_TABLE_ANTI_FEATURE); + db.execSQL(CREATE_TABLE_APK_ANTI_FEATURE_JOIN); ensureIndexes(db); String[] defaultRepos = context.getResources().getStringArray(R.array.default_repos); @@ -283,6 +298,16 @@ class DBHelper extends SQLiteOpenHelper { addPreferredSignerToApp(db, oldVersion); updatePreferredSignerIfEmpty(db, oldVersion); addIsAppToApp(db, oldVersion); + addApkAntiFeatures(db, oldVersion); + } + + private void addApkAntiFeatures(SQLiteDatabase db, int oldVersion) { + if (oldVersion >= 74) { + return; + } + + Log.i(TAG, "Adding anti features on a per-apk basis."); + resetTransient(db); } private void addIsAppToApp(SQLiteDatabase db, int oldVersion) { @@ -436,11 +461,6 @@ class DBHelper extends SQLiteOpenHelper { Utils.debugLog(TAG, "Adding " + RepoTable.Cols.MIRRORS + " field to " + RepoTable.NAME + " table in db."); db.execSQL("alter table " + RepoTable.NAME + " add column " + RepoTable.Cols.MIRRORS + " string;"); } - - if (!columnExists(db, ApkTable.NAME, ApkTable.Cols.ANTI_FEATURES)) { - Utils.debugLog(TAG, "Adding " + ApkTable.Cols.ANTI_FEATURES + " field to " + ApkTable.NAME + " table in db."); - db.execSQL("alter table " + ApkTable.NAME + " add column " + ApkTable.Cols.ANTI_FEATURES + " string;"); - } } /** @@ -1059,6 +1079,14 @@ class DBHelper extends SQLiteOpenHelper { db.execSQL("DROP TABLE " + PackageTable.NAME); } + if (tableExists(db, AntiFeatureTable.NAME)) { + db.execSQL("DROP TABLE " + AntiFeatureTable.NAME); + } + + if (tableExists(db, ApkAntiFeatureJoinTable.NAME)) { + db.execSQL("DROP TABLE " + ApkAntiFeatureJoinTable.NAME); + } + db.execSQL("DROP TABLE " + AppMetadataTable.NAME); db.execSQL("DROP TABLE " + ApkTable.NAME); @@ -1067,6 +1095,8 @@ class DBHelper extends SQLiteOpenHelper { db.execSQL(CREATE_TABLE_APK); db.execSQL(CREATE_TABLE_CATEGORY); db.execSQL(CREATE_TABLE_CAT_JOIN); + db.execSQL(CREATE_TABLE_ANTI_FEATURE); + db.execSQL(CREATE_TABLE_APK_ANTI_FEATURE_JOIN); clearRepoEtags(db); ensureIndexes(db); db.setTransactionSuccessful(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index fcfdfd6a3..6c26432c8 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -106,6 +106,47 @@ public interface Schema { } } + interface AntiFeatureTable { + + String NAME = "fdroid_antiFeature"; + + interface Cols { + String ROW_ID = "rowid"; + String NAME = "name"; + + String[] ALL = {ROW_ID, NAME}; + } + } + + /** + * An entry in this table signifies that an apk has a particular anti feature. + * @see AntiFeatureTable + * @see ApkTable + */ + interface ApkAntiFeatureJoinTable { + + String NAME = "fdroid_apkAntiFeatureJoin"; + + interface Cols { + /** + * Foreign key to {@link ApkTable}. + * @see ApkTable + */ + String APK_ID = "apkId"; + + /** + * Foreign key to {@link AntiFeatureTable}. + * @see AntiFeatureTable + */ + String ANTI_FEATURE_ID = "antiFeatureId"; + + /** + * @see AppMetadataTable.Cols#ALL_COLS + */ + String[] ALL_COLS = {APK_ID, ANTI_FEATURE_ID}; + } + } + interface AppMetadataTable { String NAME = "fdroid_app"; @@ -258,7 +299,6 @@ public interface Schema { String ADDED_DATE = "added"; String IS_COMPATIBLE = "compatible"; String INCOMPATIBLE_REASONS = "incompatibleReasons"; - String ANTI_FEATURES = "antiFeatures"; interface Repo { String VERSION = "repoVersion"; @@ -269,6 +309,10 @@ public interface Schema { String PACKAGE_NAME = "package_packageName"; } + interface AntiFeatures { + String ANTI_FEATURES = "antiFeatures_commaSeparated"; + } + /** * @see AppMetadataTable.Cols#ALL_COLS */ @@ -277,7 +321,7 @@ public interface Schema { SIZE, SIGNATURE, SOURCE_NAME, MIN_SDK_VERSION, TARGET_SDK_VERSION, MAX_SDK_VERSION, OBB_MAIN_FILE, OBB_MAIN_FILE_SHA256, OBB_PATCH_FILE, OBB_PATCH_FILE_SHA256, REQUESTED_PERMISSIONS, FEATURES, NATIVE_CODE, HASH_TYPE, ADDED_DATE, - IS_COMPATIBLE, INCOMPATIBLE_REASONS, ANTI_FEATURES, + IS_COMPATIBLE, INCOMPATIBLE_REASONS, }; /** @@ -289,7 +333,7 @@ public interface Schema { OBB_MAIN_FILE, OBB_MAIN_FILE_SHA256, OBB_PATCH_FILE, OBB_PATCH_FILE_SHA256, REQUESTED_PERMISSIONS, FEATURES, NATIVE_CODE, HASH_TYPE, ADDED_DATE, IS_COMPATIBLE, Repo.VERSION, Repo.ADDRESS, INCOMPATIBLE_REASONS, - ANTI_FEATURES, + AntiFeatures.ANTI_FEATURES, }; } } From 1fc882812205d3b898ce9df3579d22ab6e83f941 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 5 Jul 2017 10:31:44 +1000 Subject: [PATCH 02/12] Save per-apk anti features to join table + tests. Also use a newer version of testy.at.or.at index for the index-v1 test, because it includes apks with "KnownVuln" anti features whereas the older version did not. --- .../org/fdroid/fdroid/data/ApkProvider.java | 117 ++++++++++++++++++ .../java/org/fdroid/fdroid/data/DBHelper.java | 2 +- .../fdroid/fdroid/data/TempApkProvider.java | 17 +++ .../fdroid/fdroid/data/TempAppProvider.java | 21 ++++ .../org/fdroid/fdroid/AntiFeaturesTest.java | 67 ++++++++++ .../fdroid/fdroid/data/ApkProviderTest.java | 13 +- .../fdroid/updater/IndexV1UpdaterTest.java | 4 +- .../resources/testy.at.or.at_index-v1.jar | Bin 24734 -> 148196 bytes 8 files changed, 230 insertions(+), 11 deletions(-) create mode 100644 app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java diff --git a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java index 2b59e139d..f132c6c4d 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -9,6 +9,10 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; + +import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Schema.AntiFeatureTable; +import org.fdroid.fdroid.data.Schema.ApkAntiFeatureJoinTable; import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.ApkTable.Cols; import org.fdroid.fdroid.data.Schema.AppMetadataTable; @@ -17,8 +21,10 @@ import org.fdroid.fdroid.data.Schema.RepoTable; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; @SuppressWarnings("LineLength") public class ApkProvider extends FDroidProvider { @@ -266,6 +272,10 @@ public class ApkProvider extends FDroidProvider { return ApkTable.NAME; } + protected String getApkAntiFeatureJoinTableName() { + return ApkAntiFeatureJoinTable.NAME; + } + protected String getAppTableName() { return AppMetadataTable.NAME; } @@ -283,6 +293,18 @@ public class ApkProvider extends FDroidProvider { private class Query extends QueryBuilder { private boolean repoTableRequired; + private boolean antiFeaturesRequested; + + /** + * If the query includes anti features, then we group by apk id. This is because joining onto the anti-features + * table will result in multiple result rows for each apk (potentially), so we will GROUP_CONCAT each of the + * anti features into a single comma separated list for each apk. If we are _not_ including anti features, then + * don't group by apk, because when doing a COUNT(*) this will result in the wrong result. + */ + @Override + protected String groupBy() { + return antiFeaturesRequested ? "apk." + Cols.ROW_ID : null; + } @Override protected String getRequiredTables() { @@ -301,6 +323,9 @@ public class ApkProvider extends FDroidProvider { addPackageField(PACKAGE_FIELDS.get(field), field); } else if (REPO_FIELDS.containsKey(field)) { addRepoField(REPO_FIELDS.get(field), field); + } else if (Cols.AntiFeatures.ANTI_FEATURES.equals(field)) { + antiFeaturesRequested = true; + addAntiFeatures(); } else if (field.equals(Cols._ID)) { appendField("rowid", "apk", "_id"); } else if (field.equals(Cols._COUNT)) { @@ -324,6 +349,18 @@ public class ApkProvider extends FDroidProvider { appendField(field, "repo", alias); } + private void addAntiFeatures() { + String apkAntiFeature = "apkAntiFeatureJoin"; + String antiFeature = "antiFeature"; + + leftJoin(getApkAntiFeatureJoinTableName(), apkAntiFeature, + "apk." + Cols.ROW_ID + " = " + apkAntiFeature + "." + ApkAntiFeatureJoinTable.Cols.APK_ID); + + leftJoin(AntiFeatureTable.NAME, antiFeature, + apkAntiFeature + "." + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + " = " + antiFeature + "." + AntiFeatureTable.Cols.ROW_ID); + + appendField("group_concat(" + antiFeature + "." + AntiFeatureTable.Cols.NAME + ") as " + Cols.AntiFeatures.ANTI_FEATURES); + } } private QuerySelection queryPackage(String packageName) { @@ -508,15 +545,73 @@ public class ApkProvider extends FDroidProvider { @Override public Uri insert(Uri uri, ContentValues values) { + boolean saveAntiFeatures = false; + String[] antiFeatures = null; + if (values.containsKey(Cols.AntiFeatures.ANTI_FEATURES)) { + saveAntiFeatures = true; + String antiFeaturesString = values.getAsString(Cols.AntiFeatures.ANTI_FEATURES); + antiFeatures = Utils.parseCommaSeparatedString(antiFeaturesString); + values.remove(Cols.AntiFeatures.ANTI_FEATURES); + } + removeFieldsFromOtherTables(values); validateFields(Cols.ALL, values); long newId = db().insertOrThrow(getTableName(), null, values); + + if (saveAntiFeatures) { + ensureAntiFeatures(antiFeatures, newId); + } + if (!isApplyingBatch()) { getContext().getContentResolver().notifyChange(uri, null); } return getApkUri(newId); } + protected void ensureAntiFeatures(String[] antiFeatures, long apkId) { + db().delete(getApkAntiFeatureJoinTableName(), ApkAntiFeatureJoinTable.Cols.APK_ID + " = ?", new String[] {Long.toString(apkId)}); + if (antiFeatures != null) { + Set antiFeatureSet = new HashSet<>(); + for (String antiFeatureName : antiFeatures) { + + // There is nothing stopping a server repeating a category name in the metadata of + // an app. In order to prevent unique constraint violations, only insert once into + // the join table. + if (antiFeatureSet.contains(antiFeatureName)) { + continue; + } + + antiFeatureSet.add(antiFeatureName); + + long antiFeatureId = ensureAntiFeature(antiFeatureName); + ContentValues categoryValues = new ContentValues(2); + categoryValues.put(ApkAntiFeatureJoinTable.Cols.APK_ID, apkId); + categoryValues.put(ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID, antiFeatureId); + db().insert(getApkAntiFeatureJoinTableName(), null, categoryValues); + } + } + } + + protected long ensureAntiFeature(String antiFeatureName) { + long antiFeatureId = 0; + Cursor cursor = db().query(AntiFeatureTable.NAME, new String[] {AntiFeatureTable.Cols.ROW_ID}, AntiFeatureTable.Cols.NAME + " = ?", new String[]{antiFeatureName}, null, null, null); + if (cursor != null) { + if (cursor.getCount() > 0) { + cursor.moveToFirst(); + antiFeatureId = cursor.getLong(0); + } + cursor.close(); + } + + if (antiFeatureId <= 0) { + ContentValues values = new ContentValues(1); + values.put(AntiFeatureTable.Cols.NAME, antiFeatureName); + antiFeatureId = db().insert(AntiFeatureTable.NAME, null, values); + } + + return antiFeatureId; + } + @Override public int delete(Uri uri, String where, String[] whereArgs) { @@ -549,6 +644,15 @@ public class ApkProvider extends FDroidProvider { throw new UnsupportedOperationException("Cannot update anything other than a single apk."); } + boolean saveAntiFeatures = false; + String[] antiFeatures = null; + if (values.containsKey(Cols.AntiFeatures.ANTI_FEATURES)) { + saveAntiFeatures = true; + String antiFeaturesString = values.getAsString(Cols.AntiFeatures.ANTI_FEATURES); + antiFeatures = Utils.parseCommaSeparatedString(antiFeaturesString); + values.remove(Cols.AntiFeatures.ANTI_FEATURES); + } + validateFields(Cols.ALL, values); removeFieldsFromOtherTables(values); @@ -556,6 +660,19 @@ public class ApkProvider extends FDroidProvider { query = query.add(querySingleWithAppId(uri)); int numRows = db().update(getTableName(), values, query.getSelection(), query.getArgs()); + + if (saveAntiFeatures) { + // Get the database ID of the row we just updated, so that we can join relevant anti features to it. + Cursor result = db().query(getTableName(), new String[]{Cols.ROW_ID}, + query.getSelection(), query.getArgs(), null, null, null); + if (result != null) { + result.moveToFirst(); + long apkId = result.getLong(0); + ensureAntiFeatures(antiFeatures, apkId); + result.close(); + } + } + if (!isApplyingBatch()) { getContext().getContentResolver().notifyChange(uri, null); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 3e487f594..139869e5c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -200,7 +200,7 @@ class DBHelper extends SQLiteOpenHelper { + AntiFeatureTable.Cols.NAME + " TEXT NOT NULL " + " );"; - private static final String CREATE_TABLE_APK_ANTI_FEATURE_JOIN = "CREATE TABLE " + ApkAntiFeatureJoinTable.NAME + static final String CREATE_TABLE_APK_ANTI_FEATURE_JOIN = "CREATE TABLE " + ApkAntiFeatureJoinTable.NAME + " ( " + ApkAntiFeatureJoinTable.Cols.APK_ID + " INT NOT NULL, " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + " INT NOT NULL, " diff --git a/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java index 5a45c827b..3c00ea546 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempApkProvider.java @@ -36,6 +36,11 @@ public class TempApkProvider extends ApkProvider { return TABLE_TEMP_APK; } + @Override + protected String getApkAntiFeatureJoinTableName() { + return TempAppProvider.TABLE_TEMP_APK_ANTI_FEATURE_JOIN; + } + @Override protected String getAppTableName() { return TempAppProvider.TABLE_TEMP_APP; @@ -93,11 +98,23 @@ public class TempApkProvider extends ApkProvider { final SQLiteDatabase db = db(); final String memoryDbName = TempAppProvider.DB; db.execSQL(DBHelper.CREATE_TABLE_APK.replaceFirst(ApkTable.NAME, memoryDbName + "." + getTableName())); + db.execSQL(DBHelper.CREATE_TABLE_APK_ANTI_FEATURE_JOIN.replaceFirst(Schema.ApkAntiFeatureJoinTable.NAME, memoryDbName + "." + getApkAntiFeatureJoinTableName())); String where = ApkTable.NAME + "." + Cols.REPO_ID + " != ?"; String[] whereArgs = new String[]{Long.toString(repoIdBeingUpdated)}; db.execSQL(TempAppProvider.copyData(Cols.ALL_COLS, ApkTable.NAME, memoryDbName + "." + getTableName(), where), whereArgs); + String antiFeaturesWhere = + Schema.ApkAntiFeatureJoinTable.NAME + "." + Schema.ApkAntiFeatureJoinTable.Cols.APK_ID + " IN " + + "(SELECT innerApk." + Cols.ROW_ID + " FROM " + ApkTable.NAME + " AS innerApk " + + "WHERE innerApk." + Cols.REPO_ID + " != ?)"; + + db.execSQL(TempAppProvider.copyData( + Schema.ApkAntiFeatureJoinTable.Cols.ALL_COLS, + Schema.ApkAntiFeatureJoinTable.NAME, + memoryDbName + "." + getApkAntiFeatureJoinTableName(), + antiFeaturesWhere), whereArgs); + db.execSQL("CREATE INDEX IF NOT EXISTS " + memoryDbName + ".apk_appId on " + getTableName() + " (" + Cols.APP_ID + ");"); db.execSQL("CREATE INDEX IF NOT EXISTS " + memoryDbName + ".apk_compatible ON " + getTableName() + " (" + Cols.IS_COMPATIBLE + ");"); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java index 1f5ebb3a4..7c0843be1 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java @@ -30,6 +30,7 @@ public class TempAppProvider extends AppProvider { private static final String PROVIDER_NAME = "TempAppProvider"; static final String TABLE_TEMP_APP = "temp_" + AppMetadataTable.NAME; + static final String TABLE_TEMP_APK_ANTI_FEATURE_JOIN = "temp_" + Schema.ApkAntiFeatureJoinTable.NAME; static final String TABLE_TEMP_CAT_JOIN = "temp_" + CatJoinTable.NAME; private static final String PATH_INIT = "init"; @@ -218,6 +219,7 @@ public class TempAppProvider extends AppProvider { final String tempApp = DB + "." + TABLE_TEMP_APP; final String tempApk = DB + "." + TempApkProvider.TABLE_TEMP_APK; final String tempCatJoin = DB + "." + TABLE_TEMP_CAT_JOIN; + final String tempAntiFeatureJoin = DB + "." + TABLE_TEMP_APK_ANTI_FEATURE_JOIN; final String[] repoArgs = new String[]{Long.toString(repoIdToCommit)}; @@ -230,6 +232,16 @@ public class TempAppProvider extends AppProvider { db.execSQL("DELETE FROM " + CatJoinTable.NAME + " WHERE " + getCatRepoWhere(CatJoinTable.NAME), repoArgs); db.execSQL(copyData(CatJoinTable.Cols.ALL_COLS, tempCatJoin, CatJoinTable.NAME, getCatRepoWhere(tempCatJoin)), repoArgs); + db.execSQL( + "DELETE FROM " + Schema.ApkAntiFeatureJoinTable.NAME + " " + + "WHERE " + getAntiFeatureRepoWhere(Schema.ApkAntiFeatureJoinTable.NAME), repoArgs); + + db.execSQL(copyData( + Schema.ApkAntiFeatureJoinTable.Cols.ALL_COLS, + tempAntiFeatureJoin, + Schema.ApkAntiFeatureJoinTable.NAME, + getAntiFeatureRepoWhere(tempAntiFeatureJoin))); + db.setTransactionSuccessful(); getContext().getContentResolver().notifyChange(AppProvider.getContentUri(), null); @@ -250,4 +262,13 @@ public class TempAppProvider extends AppProvider { return CatJoinTable.Cols.ROW_ID + " IN (" + catRepoSubquery + ")"; } + + private String getAntiFeatureRepoWhere(String antiFeatureTable) { + String subquery = + "SELECT innerApk." + ApkTable.Cols.ROW_ID + " " + + "FROM " + ApkTable.NAME + " AS innerApk " + + "WHERE innerApk." + ApkTable.Cols.REPO_ID + " != ?"; + + return antiFeatureTable + "." + Schema.ApkAntiFeatureJoinTable.Cols.APK_ID + " IN (" + subquery + ")"; + } } diff --git a/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java b/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java new file mode 100644 index 000000000..a751c03c6 --- /dev/null +++ b/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java @@ -0,0 +1,67 @@ +package org.fdroid.fdroid; + +import android.app.Application; +import android.content.ContentValues; + +import org.fdroid.fdroid.data.Apk; +import org.fdroid.fdroid.data.ApkProvider; +import org.fdroid.fdroid.data.App; +import org.fdroid.fdroid.data.FDroidProviderTest; +import org.fdroid.fdroid.data.Schema; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +@Config(constants = BuildConfig.class, application = Application.class, sdk = 24) +@RunWith(RobolectricTestRunner.class) +public class AntiFeaturesTest extends FDroidProviderTest { + + @Test + public void testPerApkAntiFeatures() throws IOException, RepoUpdater.UpdateException { + ContentValues vulnValues = new ContentValues(1); + vulnValues.put(Schema.ApkTable.Cols.AntiFeatures.ANTI_FEATURES, "KnownVuln,ContainsGreenButtons"); + + App vulnAtV2 = Assert.insertApp(context, "com.vuln", "Fixed it"); + Assert.insertApk(context, vulnAtV2, 1); + Assert.insertApk(context, vulnAtV2, 2, vulnValues); + Assert.insertApk(context, vulnAtV2, 3); + + App notVuln = Assert.insertApp(context, "com.not-vuln", "It's Fine"); + Assert.insertApk(context, notVuln, 5); + Assert.insertApk(context, notVuln, 10); + Assert.insertApk(context, notVuln, 15); + + App allVuln = Assert.insertApp(context, "com.all-vuln", "Oops"); + Assert.insertApk(context, allVuln, 100, vulnValues); + Assert.insertApk(context, allVuln, 101, vulnValues); + Assert.insertApk(context, allVuln, 105, vulnValues); + + List notVulnApks = ApkProvider.Helper.findByPackageName(context, notVuln.packageName); + assertEquals(3, notVulnApks.size()); + + List allVulnApks = ApkProvider.Helper.findByPackageName(context, allVuln.packageName); + assertEquals(3, allVulnApks.size()); + for (Apk apk : allVulnApks) { + assertArrayEquals(new String[]{"KnownVuln", "ContainsGreenButtons"}, apk.antiFeatures); + } + + List vulnAtV2Apks = ApkProvider.Helper.findByPackageName(context, vulnAtV2.packageName); + assertEquals(3, vulnAtV2Apks.size()); + for (Apk apk : vulnAtV2Apks) { + if (apk.versionCode == 2) { + assertArrayEquals(new String[]{"KnownVuln", "ContainsGreenButtons"}, apk.antiFeatures); + } else { + assertNull(apk.antiFeatures); + } + } + } + +} diff --git a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java index 3e1057e58..bd0f2b86e 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/ApkProviderTest.java @@ -22,6 +22,7 @@ import java.util.List; import static org.fdroid.fdroid.Assert.assertCantDelete; import static org.fdroid.fdroid.Assert.assertResultCount; import static org.fdroid.fdroid.Assert.insertApp; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -309,10 +310,12 @@ public class ApkProviderTest extends FDroidProviderTest { assertEquals("com.example", apk.packageName); assertEquals(10, apk.versionCode); + assertNull(apk.antiFeatures); assertNull(apk.features); assertNull(apk.added); assertNull(apk.hashType); + apk.antiFeatures = new String[] {"KnownVuln", "Other anti feature"}; apk.features = new String[] {"one", "two", "three" }; long dateTimestamp = System.currentTimeMillis(); apk.added = new Date(dateTimestamp); @@ -335,14 +338,8 @@ public class ApkProviderTest extends FDroidProviderTest { assertEquals("com.example", updatedApk.packageName); assertEquals(10, updatedApk.versionCode); - assertNotNull(updatedApk.features); - assertNotNull(updatedApk.added); - assertNotNull(updatedApk.hashType); - - assertEquals(3, updatedApk.features.length); - assertEquals("one", updatedApk.features[0]); - assertEquals("two", updatedApk.features[1]); - assertEquals("three", updatedApk.features[2]); + assertArrayEquals(new String[]{"KnownVuln", "Other anti feature"}, updatedApk.antiFeatures); + assertArrayEquals(new String[]{"one", "two", "three"}, updatedApk.features); assertEquals(new Date(dateTimestamp).getYear(), updatedApk.added.getYear()); assertEquals(new Date(dateTimestamp).getMonth(), updatedApk.added.getMonth()); assertEquals(new Date(dateTimestamp).getDay(), updatedApk.added.getDay()); diff --git a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java index c070fea20..100c4257c 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java @@ -91,7 +91,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { updater.processIndexV1(indexInputStream, indexEntry, "fakeEtag"); IOUtils.closeQuietly(indexInputStream); List apps = AppProvider.Helper.all(context.getContentResolver()); - assertEquals("53 apps present", 53, apps.size()); + assertEquals("63 apps present", 63, apps.size()); String[] packages = { "fake.app.one", @@ -110,7 +110,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { repos = RepoProvider.Helper.all(context); assertEquals("One repo", 1, repos.size()); Repo repoFromDb = repos.get(0); - assertEquals("repo.timestamp should be set", 1481222111, repoFromDb.timestamp); + assertEquals("repo.timestamp should be set", 1497639511, repoFromDb.timestamp); assertEquals("repo.address should be the same", repo.address, repoFromDb.address); assertEquals("repo.name should be set", "non-public test repo", repoFromDb.name); assertEquals("repo.maxage should be set", 0, repoFromDb.maxage); diff --git a/app/src/test/resources/testy.at.or.at_index-v1.jar b/app/src/test/resources/testy.at.or.at_index-v1.jar index 11cfd5f2cd13106fae484f1f69334d19399f4322..a2813137e1af6badb7699a4efb1f52bce7585713 100644 GIT binary patch literal 148196 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Πb!4A!!lw7c>=qB&>CkC(AR<_*?&TI{ZY{2 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 From 504854547bc0908bdbd5a6240b4b3d9031d3ba75 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 5 Jul 2017 13:56:45 +1000 Subject: [PATCH 03/12] Add query to get installed apps with known vuln + tests. Note that I don't think the query will work correctly across multiple repos, because it is currently only querying the app with the "preferred metadata". --- .../org/fdroid/fdroid/data/AppProvider.java | 68 +++++++++++++ .../fdroid/fdroid/data/TempAppProvider.java | 4 + .../org/fdroid/fdroid/AntiFeaturesTest.java | 95 ++++++++++++++++--- .../fdroid/data/InstalledAppTestUtils.java | 14 ++- 4 files changed, 165 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 3180d57d2..d552647d2 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -11,6 +11,7 @@ import android.text.TextUtils; import android.util.Log; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Schema.ApkAntiFeatureJoinTable; import org.fdroid.fdroid.data.Schema.ApkTable; import org.fdroid.fdroid.data.Schema.AppMetadataTable; import org.fdroid.fdroid.data.Schema.AppMetadataTable.Cols; @@ -133,6 +134,12 @@ public class AppProvider extends FDroidProvider { Uri uri = Uri.withAppendedPath(AppProvider.getContentUri(), PATH_CALC_PREFERRED_METADATA); context.getContentResolver().query(uri, null, null, null, null); } + + public static List findInstalledAppsWithKnownVulns(Context context) { + Uri uri = getInstalledWithKnownVulnsUri(); + Cursor cursor = context.getContentResolver().query(uri, Cols.ALL, null, null, null); + return cursorToList(cursor); + } } /** @@ -150,6 +157,7 @@ public class AppProvider extends FDroidProvider { protected static class AppQuerySelection extends QuerySelection { private boolean naturalJoinToInstalled; + private boolean naturalJoinAntiFeatures; private boolean leftJoinPrefs; AppQuerySelection() { @@ -170,6 +178,10 @@ public class AppProvider extends FDroidProvider { return naturalJoinToInstalled; } + public boolean naturalJoinAntiFeatures() { + return naturalJoinAntiFeatures; + } + /** * Tells the query selection that it will need to join onto the installed apps table * when used. This should be called when your query makes use of fields from that table @@ -182,6 +194,11 @@ public class AppProvider extends FDroidProvider { return this; } + public AppQuerySelection requireNatrualJoinAntiFeatures() { + naturalJoinAntiFeatures = true; + return this; + } + public boolean leftJoinToPrefs() { return leftJoinPrefs; } @@ -201,6 +218,11 @@ public class AppProvider extends FDroidProvider { if (this.leftJoinToPrefs() || query.leftJoinToPrefs()) { bothWithJoin.requireLeftJoinPrefs(); } + + if (this.naturalJoinAntiFeatures() || query.naturalJoinAntiFeatures()) { + bothWithJoin.requireNatrualJoinAntiFeatures(); + } + return bothWithJoin; } @@ -210,6 +232,7 @@ public class AppProvider extends FDroidProvider { private boolean isSuggestedApkTableAdded; private boolean requiresInstalledTable; + private boolean requiresAntiFeatures; private boolean requiresLeftJoinToPrefs; private boolean countFieldAppended; @@ -243,6 +266,9 @@ public class AppProvider extends FDroidProvider { if (selection.leftJoinToPrefs()) { leftJoinToPrefs(); } + if (selection.naturalJoinAntiFeatures()) { + naturalJoinAntiFeatures(); + } } // TODO: What if the selection requires a natural join, but we first get a left join @@ -277,6 +303,22 @@ public class AppProvider extends FDroidProvider { } } + public void naturalJoinAntiFeatures() { + if (!requiresAntiFeatures) { + join( + getApkAntiFeatureJoinTableName(), + "apkAntiFeature", + "apkAntiFeature." + ApkAntiFeatureJoinTable.Cols.APK_ID + " = " + getApkTableName() + "." + ApkTable.Cols.ROW_ID); + + join( + Schema.AntiFeatureTable.NAME, + "antiFeature", + "antiFeature." + Schema.AntiFeatureTable.Cols.ROW_ID + " = " + "apkAntiFeature." + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID); + + requiresAntiFeatures = true; + } + } + @Override public void addField(String field) { switch (field) { @@ -370,6 +412,7 @@ public class AppProvider extends FDroidProvider { private static final String PATH_CALC_PREFERRED_METADATA = "calcPreferredMetadata"; private static final String PATH_CALC_SUGGESTED_APKS = "calcNonRepoDetailsFromIndex"; private static final String PATH_TOP_FROM_CATEGORY = "topFromCategory"; + private static final String PATH_INSTALLED_WITH_KNOWN_VULNS = "installedWithKnownVulns"; private static final int CAN_UPDATE = CODE_SINGLE + 1; private static final int INSTALLED = CAN_UPDATE + 1; @@ -383,6 +426,7 @@ public class AppProvider extends FDroidProvider { private static final int HIGHEST_PRIORITY = SEARCH_REPO + 1; private static final int CALC_PREFERRED_METADATA = HIGHEST_PRIORITY + 1; private static final int TOP_FROM_CATEGORY = CALC_PREFERRED_METADATA + 1; + private static final int INSTALLED_WITH_KNOWN_VULNS = TOP_FROM_CATEGORY + 1; static { MATCHER.addURI(getAuthority(), null, CODE_LIST); @@ -400,6 +444,7 @@ public class AppProvider extends FDroidProvider { MATCHER.addURI(getAuthority(), PATH_SPECIFIC_APP + "/#/*", CODE_SINGLE); MATCHER.addURI(getAuthority(), PATH_CALC_PREFERRED_METADATA, CALC_PREFERRED_METADATA); MATCHER.addURI(getAuthority(), PATH_TOP_FROM_CATEGORY + "/#/*", TOP_FROM_CATEGORY); + MATCHER.addURI(getAuthority(), PATH_INSTALLED_WITH_KNOWN_VULNS, INSTALLED_WITH_KNOWN_VULNS); } public static Uri getContentUri() { @@ -421,6 +466,12 @@ public class AppProvider extends FDroidProvider { .build(); } + public static Uri getInstalledWithKnownVulnsUri() { + return getContentUri().buildUpon() + .appendPath(PATH_INSTALLED_WITH_KNOWN_VULNS) + .build(); + } + public static Uri getTopFromCategoryUri(String category, int limit) { return getContentUri().buildUpon() .appendPath(PATH_TOP_FROM_CATEGORY) @@ -505,6 +556,10 @@ public class AppProvider extends FDroidProvider { return ApkTable.NAME; } + protected String getApkAntiFeatureJoinTableName() { + return ApkAntiFeatureJoinTable.NAME; + } + @Override protected String getProviderName() { return "AppProvider"; @@ -652,6 +707,14 @@ public class AppProvider extends FDroidProvider { return new AppQuerySelection(selection, args); } + private AppQuerySelection queryInstalledWithKnownVulns() { + // Include the hash in this check because otherwise any app with any vulnerable version will + // get returned. + String selection = " antiFeature." + Schema.AntiFeatureTable.Cols.NAME + " = 'KnownVuln' AND " + + getApkTableName() + "." + ApkTable.Cols.HASH + " = installed." + InstalledAppTable.Cols.HASH; + return new AppQuerySelection(selection).requireNaturalInstalledTable().requireNatrualJoinAntiFeatures(); + } + static AppQuerySelection queryPackageNames(String packageNames, String packageNameField) { String[] args = packageNames.split(","); String selection = packageNameField + " IN (" + generateQuestionMarksForInClause(args.length) + ")"; @@ -739,6 +802,11 @@ public class AppProvider extends FDroidProvider { includeSwap = false; break; + case INSTALLED_WITH_KNOWN_VULNS: + selection = selection.add(queryInstalledWithKnownVulns()); + includeSwap = false; + break; + case RECENTLY_UPDATED: String table = getTableName(); String isNew = table + "." + Cols.LAST_UPDATED + " <= " + table + "." + Cols.ADDED + " DESC"; diff --git a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java index 7c0843be1..064523b93 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/TempAppProvider.java @@ -126,6 +126,10 @@ public class TempAppProvider extends AppProvider { return TempApkProvider.TABLE_TEMP_APK; } + protected String getApkAntiFeatureJoinTableName() { + return TempApkProvider.TABLE_TEMP_APK; + } + @Override public Uri insert(Uri uri, ContentValues values) { switch (MATCHER.match(uri)) { diff --git a/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java b/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java index a751c03c6..622a4ab7f 100644 --- a/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java +++ b/app/src/test/java/org/fdroid/fdroid/AntiFeaturesTest.java @@ -6,14 +6,17 @@ import android.content.ContentValues; import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.App; +import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.FDroidProviderTest; +import org.fdroid.fdroid.data.InstalledAppTestUtils; import org.fdroid.fdroid.data.Schema; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.io.IOException; import java.util.List; import static org.junit.Assert.assertNull; @@ -24,26 +27,88 @@ import static org.junit.Assert.assertEquals; @RunWith(RobolectricTestRunner.class) public class AntiFeaturesTest extends FDroidProviderTest { - @Test - public void testPerApkAntiFeatures() throws IOException, RepoUpdater.UpdateException { + private App notVuln; + private App allVuln; + private App vulnAtV2; + + @Before + public void setup() { + Preferences.setup(context); + ContentValues vulnValues = new ContentValues(1); vulnValues.put(Schema.ApkTable.Cols.AntiFeatures.ANTI_FEATURES, "KnownVuln,ContainsGreenButtons"); - App vulnAtV2 = Assert.insertApp(context, "com.vuln", "Fixed it"); - Assert.insertApk(context, vulnAtV2, 1); - Assert.insertApk(context, vulnAtV2, 2, vulnValues); - Assert.insertApk(context, vulnAtV2, 3); + vulnAtV2 = Assert.insertApp(context, "com.vuln", "Fixed it"); + insertApk(vulnAtV2, 1, false); + insertApk(vulnAtV2, 2, true); + insertApk(vulnAtV2, 3, false); - App notVuln = Assert.insertApp(context, "com.not-vuln", "It's Fine"); - Assert.insertApk(context, notVuln, 5); - Assert.insertApk(context, notVuln, 10); - Assert.insertApk(context, notVuln, 15); + notVuln = Assert.insertApp(context, "com.not-vuln", "It's Fine"); + insertApk(notVuln, 5, false); + insertApk(notVuln, 10, false); + insertApk(notVuln, 15, false); - App allVuln = Assert.insertApp(context, "com.all-vuln", "Oops"); - Assert.insertApk(context, allVuln, 100, vulnValues); - Assert.insertApk(context, allVuln, 101, vulnValues); - Assert.insertApk(context, allVuln, 105, vulnValues); + allVuln = Assert.insertApp(context, "com.all-vuln", "Oops"); + insertApk(allVuln, 100, true); + insertApk(allVuln, 101, true); + insertApk(allVuln, 105, true); + AppProvider.Helper.recalculatePreferredMetadata(context); + } + + @After + public void tearDown() { + Preferences.clearSingletonForTesting(); + } + + private static String generateHash(String packageName, int versionCode) { + return packageName + "-" + versionCode; + } + + private void insertApk(App app, int versionCode, boolean isVuln) { + ContentValues values = new ContentValues(); + values.put(Schema.ApkTable.Cols.HASH, generateHash(app.packageName, versionCode)); + if (isVuln) { + values.put(Schema.ApkTable.Cols.AntiFeatures.ANTI_FEATURES, "KnownVuln,ContainsGreenButtons"); + } + Assert.insertApk(context, app, versionCode, values); + } + + private void install(App app, int versionCode) { + String hash = generateHash(app.packageName, versionCode); + InstalledAppTestUtils.install(context, app.packageName, versionCode, "v" + versionCode, null, hash); + } + + @Test + public void noVulnerableApps() { + List installed = AppProvider.Helper.findInstalledAppsWithKnownVulns(context); + assertEquals(0, installed.size()); + } + + @Test + public void futureVersionIsVulnerable() { + install(vulnAtV2, 1); + List installed = AppProvider.Helper.findInstalledAppsWithKnownVulns(context); + assertEquals(0, installed.size()); + } + + @Test + public void vulnerableAndAbleToBeUpdated() { + install(vulnAtV2, 2); + List installed = AppProvider.Helper.findInstalledAppsWithKnownVulns(context); + assertEquals(1, installed.size()); + assertEquals(vulnAtV2.packageName, installed.get(0).packageName); + } + + @Test + public void vulnerableButUpToDate() { + install(vulnAtV2, 3); + List installed = AppProvider.Helper.findInstalledAppsWithKnownVulns(context); + assertEquals(0, installed.size()); + } + + @Test + public void antiFeaturesSaveCorrectly() { List notVulnApks = ApkProvider.Helper.findByPackageName(context, notVuln.packageName); assertEquals(3, notVulnApks.size()); diff --git a/app/src/test/java/org/fdroid/fdroid/data/InstalledAppTestUtils.java b/app/src/test/java/org/fdroid/fdroid/data/InstalledAppTestUtils.java index f4b599ae4..5926899de 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/InstalledAppTestUtils.java +++ b/app/src/test/java/org/fdroid/fdroid/data/InstalledAppTestUtils.java @@ -22,6 +22,14 @@ public class InstalledAppTestUtils { String packageName, int versionCode, String versionName, @Nullable String signingCert) { + install(context, packageName, versionCode, versionName, signingCert, null); + } + + public static void install(Context context, + String packageName, + int versionCode, String versionName, + @Nullable String signingCert, + @Nullable String hash) { PackageInfo info = new PackageInfo(); info.packageName = packageName; info.versionCode = versionCode; @@ -31,8 +39,12 @@ public class InstalledAppTestUtils { if (signingCert != null) { info.signatures = new Signature[]{new Signature(signingCert)}; } + String hashType = "sha256"; - String hash = "00112233445566778899aabbccddeeff"; + if (hash == null) { + hash = "00112233445566778899aabbccddeeff"; + } + InstalledAppProviderService.insertAppIntoDb(context, info, hashType, hash); } From 073cb199fccd50fff239b4d6e117f4acc69b87df Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 5 Jul 2017 17:18:51 +1000 Subject: [PATCH 04/12] Move comment to correct field. --- app/src/main/java/org/fdroid/fdroid/data/App.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 11a8ac0d0..ed3797860 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -82,13 +82,6 @@ public class App extends ValueObject implements Comparable, Parcelable { */ @JsonIgnore public boolean compatible; - /** - * This is primarily for the purpose of saving app metadata when parsing an index.xml file. - * At most other times, we don't particularly care which repo an {@link App} object came from. - * It is pretty much transparent, because the metadata will be populated from the repo with - * the highest priority. The UI doesn't care normally _which_ repo provided the metadata. - * This is required for getting the full URL to the various graphics and screenshots. - */ @JsonIgnore public Apk installedApk; // might be null if not installed @JsonIgnore @@ -107,6 +100,13 @@ public class App extends ValueObject implements Comparable, Parcelable { @JsonIgnore public boolean isApk; + /** + * This is primarily for the purpose of saving app metadata when parsing an index.xml file. + * At most other times, we don't particularly care which repo an {@link App} object came from. + * It is pretty much transparent, because the metadata will be populated from the repo with + * the highest priority. The UI doesn't care normally _which_ repo provided the metadata. + * This is required for getting the full URL to the various graphics and screenshots. + */ @JacksonInject("repoId") public long repoId; From 9b20142fd9b1199deda1faedd545b83c32e4bd58 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 5 Jul 2017 17:28:46 +1000 Subject: [PATCH 05/12] Extract getInstalledApk() from AppDetails2 to App --- .../java/org/fdroid/fdroid/AppDetails2.java | 44 ++----------------- .../main/java/org/fdroid/fdroid/data/App.java | 31 +++++++++++++ 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 1f993b4c8..2a4f6b2f7 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -29,13 +29,10 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; @@ -60,8 +57,6 @@ import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.AppPrefsProvider; import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.data.InstalledApp; -import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.installer.InstallManagerService; import org.fdroid.fdroid.installer.Installer; @@ -740,40 +735,6 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog installApk(apkToInstall); } - /** - * Attempts to find the installed {@link Apk} from the database. If not found, will lookup the - * {@link InstalledAppProvider} to find the details of the installed app and use that to - * instantiate an {@link Apk} to be returned. - * - * Cases where an {@link Apk} will not be found in the database and for which we fall back to - * the {@link InstalledAppProvider} include: - * + System apps which are provided by a repository, but for which the version code bundled - * with the system is not included in the repository. - * + Regular apps from a repository, where the installed version is old enough that it is no - * longer available in the repository. - * - * @throws IllegalStateException If neither the {@link PackageManager} or the - * {@link InstalledAppProvider} can't find a reference to the installed apk. - */ - @NonNull - private Apk getInstalledApk() { - try { - PackageInfo pi = getPackageManager().getPackageInfo(app.packageName, 0); - Apk apk = ApkProvider.Helper.findApkFromAnyRepo(this, pi.packageName, pi.versionCode); - if (apk == null) { - InstalledApp installedApp = InstalledAppProvider.Helper.findByPackageName(this, pi.packageName); - if (installedApp == null) { - throw new IllegalStateException("No installed app found when trying to uninstall"); - } - apk = new Apk(installedApp); - } - return apk; - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - throw new IllegalStateException("Couldn't find installed apk for " + app.packageName, e); - } - } - @Override public void uninstallApk() { Apk apk = app.installedApk; @@ -783,7 +744,10 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog apk = app.getMediaApkifInstalled(getApplicationContext()); if (apk == null) { // When the app isn't a media file - the above workaround refers to this. - apk = getInstalledApk(); + apk = app.getInstalledApk(this); + if (apk == null) { + throw new IllegalStateException("Couldn't find installed apk for " + app.packageName); + } } app.installedApk = apk; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index ed3797860..5a7109683 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -796,6 +796,37 @@ public class App extends ValueObject implements Comparable, Parcelable { apk.sig = Utils.hashBytes(fdroidSig, "md5"); } + /** + * Attempts to find the installed {@link Apk} from the database. If not found, will lookup the + * {@link InstalledAppProvider} to find the details of the installed app and use that to + * instantiate an {@link Apk} to be returned. + * + * Cases where an {@link Apk} will not be found in the database and for which we fall back to + * the {@link InstalledAppProvider} include: + * + System apps which are provided by a repository, but for which the version code bundled + * with the system is not included in the repository. + * + Regular apps from a repository, where the installed version is old enough that it is no + * longer available in the repository. + * + */ + @Nullable + public Apk getInstalledApk(Context context) { + try { + PackageInfo pi = context.getPackageManager().getPackageInfo(this.packageName, 0); + Apk apk = ApkProvider.Helper.findApkFromAnyRepo(context, pi.packageName, pi.versionCode); + if (apk == null) { + InstalledApp installedApp = InstalledAppProvider.Helper.findByPackageName(context, pi.packageName); + if (installedApp == null) { + throw new IllegalStateException("No installed app found when trying to uninstall"); + } + apk = new Apk(installedApp); + } + return apk; + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } + public boolean isValid() { if (TextUtils.isEmpty(this.name) || TextUtils.isEmpty(this.packageName)) { From 7424220c0212da7c773e88568dec8a461fca92a5 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 5 Jul 2017 17:21:09 +1000 Subject: [PATCH 06/12] Add apps with known vulnerabilities to updates tab. Currently only supports "Uninstall", but will soon also support "Upgrade to a newer version". --- .../views/apps/AppListItemController.java | 96 ++++++++++--------- .../fdroid/views/updates/UpdatesAdapter.java | 79 ++++++++++----- .../views/updates/items/KnownVulnApp.java | 60 ++++++++++++ .../items/KnownVulnAppListItemController.java | 78 +++++++++++++++ .../res/drawable/ic_known_vuln_overlay.xml | 19 ++++ .../res/layout/known_vuln_app_list_item.xml | 66 +++++++++++++ app/src/main/res/values/strings.xml | 3 +- .../fdroid/updater/IndexV1UpdaterTest.java | 7 ++ 8 files changed, 335 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnApp.java create mode 100644 app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java create mode 100644 app/src/main/res/drawable/ic_known_vuln_overlay.xml create mode 100644 app/src/main/res/layout/known_vuln_app_list_item.xml diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index 93c2f7489..8476e04ad 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -388,55 +388,59 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { return; } - // When the button says "Run", then launch the app. - if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Installed) { - Intent intent = activity.getPackageManager().getLaunchIntentForPackage(currentApp.packageName); - if (intent != null) { - activity.startActivity(intent); - - // Once it is explicitly launched by the user, then we can pretty much forget about - // any sort of notification that the app was successfully installed. It should be - // apparent to the user because they just launched it. - AppUpdateStatusManager.getInstance(activity).removeApk(currentStatus.getUniqueKey()); - } - return; - } - - if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.ReadyToInstall) { - Uri apkDownloadUri = Uri.parse(currentStatus.apk.getUrl()); - File apkFilePath = ApkCache.getApkDownloadPath(activity, apkDownloadUri); - Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getUrl() + - " to " + apkFilePath); - - // TODO: This seems like a bit of a hack. Is there a better way to do this by changing - // the Installer API so that we can ask it to install without having to get it to fire - // off an intent which we then listen for and action? - final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(activity); - final BroadcastReceiver receiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - broadcastManager.unregisterReceiver(this); - - if (Installer.ACTION_INSTALL_USER_INTERACTION.equals(intent.getAction())) { - PendingIntent pendingIntent = - intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI); - try { - pendingIntent.send(); - } catch (PendingIntent.CanceledException ignored) { } - } - } - }; - - broadcastManager.registerReceiver(receiver, Installer.getInstallIntentFilter(apkDownloadUri)); - Installer installer = InstallerFactory.create(activity, currentStatus.apk); - installer.installPackage(Uri.parse(apkFilePath.toURI().toString()), apkDownloadUri); - } else { - final Apk suggestedApk = ApkProvider.Helper.findSuggestedApk(activity, currentApp); - InstallManagerService.queue(activity, currentApp, suggestedApk); - } + onActionButtonPressed(currentApp); } }; + protected void onActionButtonPressed(@NonNull App app) { + // When the button says "Run", then launch the app. + if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Installed) { + Intent intent = activity.getPackageManager().getLaunchIntentForPackage(app.packageName); + if (intent != null) { + activity.startActivity(intent); + + // Once it is explicitly launched by the user, then we can pretty much forget about + // any sort of notification that the app was successfully installed. It should be + // apparent to the user because they just launched it. + AppUpdateStatusManager.getInstance(activity).removeApk(currentStatus.getUniqueKey()); + } + return; + } + + if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.ReadyToInstall) { + Uri apkDownloadUri = Uri.parse(currentStatus.apk.getUrl()); + File apkFilePath = ApkCache.getApkDownloadPath(activity, apkDownloadUri); + Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getUrl() + + " to " + apkFilePath); + + // TODO: This seems like a bit of a hack. Is there a better way to do this by changing + // the Installer API so that we can ask it to install without having to get it to fire + // off an intent which we then listen for and action? + final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(activity); + final BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + broadcastManager.unregisterReceiver(this); + + if (Installer.ACTION_INSTALL_USER_INTERACTION.equals(intent.getAction())) { + PendingIntent pendingIntent = + intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI); + try { + pendingIntent.send(); + } catch (PendingIntent.CanceledException ignored) { } + } + } + }; + + broadcastManager.registerReceiver(receiver, Installer.getInstallIntentFilter(apkDownloadUri)); + Installer installer = InstallerFactory.create(activity, currentStatus.apk); + installer.installPackage(Uri.parse(apkFilePath.toURI().toString()), apkDownloadUri); + } else { + final Apk suggestedApk = ApkProvider.Helper.findSuggestedApk(activity, app); + InstallManagerService.queue(activity, app, suggestedApk); + } + } + @SuppressWarnings("FieldCanBeLocal") private final View.OnClickListener onCancelDownload = new View.OnClickListener() { @Override diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java index dfa046171..a993910a6 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; +import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; @@ -20,6 +21,7 @@ import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.views.updates.items.AppStatus; import org.fdroid.fdroid.views.updates.items.AppUpdateData; +import org.fdroid.fdroid.views.updates.items.KnownVulnApp; import org.fdroid.fdroid.views.updates.items.UpdateableApp; import org.fdroid.fdroid.views.updates.items.UpdateableAppsHeader; @@ -65,6 +67,9 @@ import java.util.Set; public class UpdatesAdapter extends RecyclerView.Adapter implements LoaderManager.LoaderCallbacks { + private static final int LOADER_CAN_UPDATE = 289753982; + private static final int LOADER_KNOWN_VULN = 520389740; + private final AdapterDelegatesManager> delegatesManager = new AdapterDelegatesManager<>(); private final List items = new ArrayList<>(); @@ -72,6 +77,7 @@ public class UpdatesAdapter extends RecyclerView.Adapter appsToShowStatus = new ArrayList<>(); private final List updateableApps = new ArrayList<>(); + private final List knownVulnApps = new ArrayList<>(); private boolean showAllUpdateableApps = false; @@ -80,9 +86,11 @@ public class UpdatesAdapter extends RecyclerView.Adapter onCreateLoader(int id, Bundle args) { + Uri uri; + switch (id) { + case LOADER_CAN_UPDATE: + uri = AppProvider.getCanUpdateUri(); + break; + + case LOADER_KNOWN_VULN: + uri = AppProvider.getInstalledWithKnownVulnsUri(); + break; + + default: + throw new IllegalStateException("Unknown loader requested: " + id); + } + return new CursorLoader( - activity, - AppProvider.getCanUpdateUri(), - new String[]{ - Schema.AppMetadataTable.Cols._ID, // Required for cursor loader to work. - Schema.AppMetadataTable.Cols.Package.PACKAGE_NAME, - Schema.AppMetadataTable.Cols.NAME, - Schema.AppMetadataTable.Cols.SUMMARY, - Schema.AppMetadataTable.Cols.IS_COMPATIBLE, - Schema.AppMetadataTable.Cols.LICENSE, - Schema.AppMetadataTable.Cols.ICON, - Schema.AppMetadataTable.Cols.ICON_URL, - Schema.AppMetadataTable.Cols.InstalledApp.VERSION_CODE, - Schema.AppMetadataTable.Cols.InstalledApp.VERSION_NAME, - Schema.AppMetadataTable.Cols.SuggestedApk.VERSION_NAME, - Schema.AppMetadataTable.Cols.SUGGESTED_VERSION_CODE, - Schema.AppMetadataTable.Cols.REQUIREMENTS, // Needed for filtering apps that require root. - Schema.AppMetadataTable.Cols.ANTI_FEATURES, // Needed for filtering apps that require anti-features. - }, - null, - null, - Schema.AppMetadataTable.Cols.NAME - ); + activity, uri, Schema.AppMetadataTable.Cols.ALL, null, null, Schema.AppMetadataTable.Cols.NAME); } @Override public void onLoadFinished(Loader loader, Cursor cursor) { + switch (loader.getId()) { + case LOADER_CAN_UPDATE: + onCanUpdateLoadFinished(cursor); + break; + + case LOADER_KNOWN_VULN: + onKnownVulnLoadFinished(cursor); + break; + } + + populateItems(); + notifyDataSetChanged(); + } + + private void onCanUpdateLoadFinished(Cursor cursor) { updateableApps.clear(); cursor.moveToFirst(); @@ -220,9 +240,16 @@ public class UpdatesAdapter extends RecyclerView.Adapter> { + + private final Activity activity; + + public Delegate(Activity activity) { + this.activity = activity; + } + + @Override + protected boolean isForViewType(@NonNull List items, int position) { + return items.get(position) instanceof KnownVulnApp; + } + + @NonNull + @Override + protected RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) { + return new KnownVulnAppListItemController(activity, activity.getLayoutInflater() + .inflate(R.layout.known_vuln_app_list_item, parent, false)); + } + + @Override + protected void onBindViewHolder(@NonNull List items, int position, + @NonNull RecyclerView.ViewHolder holder, @NonNull List payloads) { + KnownVulnApp app = (KnownVulnApp) items.get(position); + ((KnownVulnAppListItemController) holder).bindModel(app.app); + } + } + +} diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java new file mode 100644 index 000000000..1641001d9 --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java @@ -0,0 +1,78 @@ +package org.fdroid.fdroid.views.updates.items; + +import android.app.Activity; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.content.LocalBroadcastManager; +import android.view.View; + +import org.fdroid.fdroid.AppUpdateStatusManager; +import org.fdroid.fdroid.R; +import org.fdroid.fdroid.data.App; +import org.fdroid.fdroid.data.AppProvider; +import org.fdroid.fdroid.installer.Installer; +import org.fdroid.fdroid.installer.InstallerService; +import org.fdroid.fdroid.views.apps.AppListItemController; +import org.fdroid.fdroid.views.apps.AppListItemState; + +/** + * Tell the user that an app they have installed has a known vulnerability. + * The role of this controller is to prompt the user what it is that should be done in response to this + * (e.g. uninstall, update, disable). + */ +public class KnownVulnAppListItemController extends AppListItemController { + public KnownVulnAppListItemController(Activity activity, View itemView) { + super(activity, itemView); + } + + @NonNull + @Override + protected AppListItemState getCurrentViewState( + @NonNull App app, @Nullable AppUpdateStatusManager.AppUpdateStatus appStatus) { + return new AppListItemState(app) + .setMainText(activity.getString(R.string.updates__app_with_known_vulnerability__uninstall, app.name)) + .showActionButton(activity.getString(R.string.menu_uninstall)); + } + + @Override + protected void onActionButtonPressed(@NonNull App app) { + LocalBroadcastManager.getInstance(activity).registerReceiver(uninstallReceiver, + Installer.getUninstallIntentFilter(app.packageName)); + InstallerService.uninstall(activity, app.getInstalledApk(activity)); + } + + private void unregisterUninstallReceiver() { + LocalBroadcastManager.getInstance(activity).unregisterReceiver(uninstallReceiver); + } + + private final BroadcastReceiver uninstallReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + switch (intent.getAction()) { + case Installer.ACTION_UNINSTALL_COMPLETE: + // This will cause the LoaderManager in UpdatesAdapter to automatically requery for the list of + // apps with known vulnerabilities (i.e. this app should no longer be in that list). + activity.getContentResolver().notifyChange(AppProvider.getInstalledWithKnownVulnsUri(), null); + unregisterUninstallReceiver(); + break; + + case Installer.ACTION_UNINSTALL_INTERRUPTED: + unregisterUninstallReceiver(); + break; + + case Installer.ACTION_UNINSTALL_USER_INTERACTION: + PendingIntent uninstallPendingIntent = + intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI); + + try { + uninstallPendingIntent.send(); + } catch (PendingIntent.CanceledException ignored) { } + break; + } + } + }; +} diff --git a/app/src/main/res/drawable/ic_known_vuln_overlay.xml b/app/src/main/res/drawable/ic_known_vuln_overlay.xml new file mode 100644 index 000000000..382d6dfe3 --- /dev/null +++ b/app/src/main/res/drawable/ic_known_vuln_overlay.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/layout/known_vuln_app_list_item.xml b/app/src/main/res/layout/known_vuln_app_list_item.xml new file mode 100644 index 000000000..6420162fd --- /dev/null +++ b/app/src/main/res/layout/known_vuln_app_list_item.xml @@ -0,0 +1,66 @@ + + + + + + + + + + +