set App.preferredSigner when using index v0 #1086

This was an oversight when we added this functionality, though there was
a related TODO.

41f85f3c9df934daba0ee0d60c4c01bb071fa6e7
This commit is contained in:
Hans-Christoph Steiner 2017-09-02 22:23:51 +02:00
parent aa2d791531
commit 0730d3c676
5 changed files with 37 additions and 29 deletions

View File

@ -138,6 +138,10 @@ public class RepoXMLHandler extends DefaultHandler {
break; break;
case ApkTable.Cols.SIGNATURE: case ApkTable.Cols.SIGNATURE:
curapk.sig = str; curapk.sig = str;
// the first APK in the list provides the preferred signature
if (curapp.preferredSigner == null) {
curapp.preferredSigner = str;
}
break; break;
case ApkTable.Cols.SOURCE_NAME: case ApkTable.Cols.SOURCE_NAME:
curapk.srcname = str; curapk.srcname = str;

View File

@ -15,6 +15,7 @@ import android.os.Environment;
import android.os.LocaleList; import android.os.LocaleList;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -101,6 +102,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
@JsonIgnore @JsonIgnore
private AppPrefs prefs; private AppPrefs prefs;
@JsonIgnore @JsonIgnore
@NonNull
public String preferredSigner; public String preferredSigner;
@JacksonInject("repoId") @JacksonInject("repoId")
@ -159,6 +161,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
* The index-v1 metadata uses the term `suggestedVersionCode` but we need that * The index-v1 metadata uses the term `suggestedVersionCode` but we need that
* value to end up in the `upstreamVersionCode` property here. These variables * value to end up in the `upstreamVersionCode` property here. These variables
* need to be renamed across the whole F-Droid ecosystem to make sense. * need to be renamed across the whole F-Droid ecosystem to make sense.
*
* @see <a href="https://gitlab.com/fdroid/fdroidclient/issues/1063">issue #1063</a> * @see <a href="https://gitlab.com/fdroid/fdroidclient/issues/1063">issue #1063</a>
*/ */
@JsonProperty("suggestedVersionCode") @JsonProperty("suggestedVersionCode")
@ -210,7 +213,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
} }
@Override @Override
public int compareTo(App app) { public int compareTo(@NonNull App app) {
return name.compareToIgnoreCase(app.name); return name.compareToIgnoreCase(app.name);
} }
@ -1137,17 +1140,14 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
* However, if the app is installed, then we override this and instead want to only encourage * However, if the app is installed, then we override this and instead want to only encourage
* the user to try and install versions with that signature (because thats all the OS will let * the user to try and install versions with that signature (because thats all the OS will let
* them do). * them do).
* TODO: I don't think preferredSigner should ever be null, because if an app has apks then
* we should have chosen the first and used that. If so, then we should change to @NonNull and
* throw an exception if it is null.
*/ */
@Nullable @NonNull
public String getMostAppropriateSignature() { public String getMostAppropriateSignature() {
if (!TextUtils.isEmpty(installedSig)) { if (!TextUtils.isEmpty(installedSig)) {
return installedSig; return installedSig;
} else if (!TextUtils.isEmpty(preferredSigner)) { } else if (!TextUtils.isEmpty(preferredSigner)) {
return preferredSigner; return preferredSigner;
} }
return null; throw new IllegalStateException("Most Appropriate Signature not found!");
} }
} }

View File

@ -95,12 +95,9 @@ public class TestUtils {
} }
public static App insertApp(Context context, String packageName, String appName, int upstreamVersionCode, public static App insertApp(Context context, String packageName, String appName, int upstreamVersionCode,
String repoUrl) { String repoUrl, String preferredSigner) {
Repo repo = ensureRepo(context, repoUrl); Repo repo = ensureRepo(context, repoUrl);
ContentValues values = new ContentValues(); return insertApp(context, packageName, appName, upstreamVersionCode, repo, preferredSigner);
values.put(Schema.AppMetadataTable.Cols.REPO_ID, repo.getId());
values.put(Schema.AppMetadataTable.Cols.UPSTREAM_VERSION_CODE, upstreamVersionCode);
return Assert.insertApp(context, packageName, appName, values);
} }
public static App insertApp(Context context, String packageName, String appName, int upstreamVersionCode, public static App insertApp(Context context, String packageName, String appName, int upstreamVersionCode,

View File

@ -6,7 +6,6 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.TestUtils; import org.fdroid.fdroid.TestUtils;
@ -135,11 +134,11 @@ public class AppProviderTest extends FDroidProviderTest {
assertResultCount(contentResolver, 2, AppProvider.getCanUpdateUri(), PROJ); assertResultCount(contentResolver, 2, AppProvider.getCanUpdateUri(), PROJ);
assertResultCount(contentResolver, 9, AppProvider.getInstalledUri(), PROJ); assertResultCount(contentResolver, 9, AppProvider.getInstalledUri(), PROJ);
App installedOnlyOneVersionAvailable = AppProvider.Helper.findSpecificApp(r, "installed, only one version available", 1, Cols.ALL); App installedOnlyOneVersionAvailable = AppProvider.Helper.findSpecificApp(r, "installed, only one version available", 1, Cols.ALL);
App installedAlreadyLatestNoIgnore = AppProvider.Helper.findSpecificApp(r, "installed, already latest, no ignore", 1, Cols.ALL); App installedAlreadyLatestNoIgnore = AppProvider.Helper.findSpecificApp(r, "installed, already latest, no ignore", 1, Cols.ALL);
App installedAlreadyLatestIgnoreAll = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore all", 1, Cols.ALL); App installedAlreadyLatestIgnoreAll = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore all", 1, Cols.ALL);
App installedAlreadyLatestIgnoreLatest = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore latest", 1, Cols.ALL); App installedAlreadyLatestIgnoreLatest = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore latest", 1, Cols.ALL);
App installedAlreadyLatestIgnoreOld = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore old", 1, Cols.ALL); App installedAlreadyLatestIgnoreOld = AppProvider.Helper.findSpecificApp(r, "installed, already latest, ignore old", 1, Cols.ALL);
assertFalse(installedOnlyOneVersionAvailable.canAndWantToUpdate(context)); assertFalse(installedOnlyOneVersionAvailable.canAndWantToUpdate(context));
assertFalse(installedAlreadyLatestNoIgnore.canAndWantToUpdate(context)); assertFalse(installedAlreadyLatestNoIgnore.canAndWantToUpdate(context));
@ -147,9 +146,9 @@ public class AppProviderTest extends FDroidProviderTest {
assertFalse(installedAlreadyLatestIgnoreLatest.canAndWantToUpdate(context)); assertFalse(installedAlreadyLatestIgnoreLatest.canAndWantToUpdate(context));
assertFalse(installedAlreadyLatestIgnoreOld.canAndWantToUpdate(context)); assertFalse(installedAlreadyLatestIgnoreOld.canAndWantToUpdate(context));
App installedOldNoIgnore = AppProvider.Helper.findSpecificApp(r, "installed, old version, no ignore", 1, Cols.ALL); App installedOldNoIgnore = AppProvider.Helper.findSpecificApp(r, "installed, old version, no ignore", 1, Cols.ALL);
App installedOldIgnoreAll = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore all", 1, Cols.ALL); App installedOldIgnoreAll = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore all", 1, Cols.ALL);
App installedOldIgnoreLatest = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore latest", 1, Cols.ALL); App installedOldIgnoreLatest = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore latest", 1, Cols.ALL);
App installedOldIgnoreNewerNotLatest = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore newer, but not latest", 1, Cols.ALL); App installedOldIgnoreNewerNotLatest = AppProvider.Helper.findSpecificApp(r, "installed, old version, ignore newer, but not latest", 1, Cols.ALL);
assertTrue(installedOldNoIgnore.canAndWantToUpdate(context)); assertTrue(installedOldNoIgnore.canAndWantToUpdate(context));
@ -280,7 +279,7 @@ public class AppProviderTest extends FDroidProviderTest {
} }
private Cursor queryAllApps() { private Cursor queryAllApps() {
String[] projection = new String[] { String[] projection = new String[]{
Cols._ID, Cols._ID,
Cols.NAME, Cols.NAME,
Cols.Package.PACKAGE_NAME, Cols.Package.PACKAGE_NAME,
@ -314,6 +313,8 @@ public class AppProviderTest extends FDroidProviderTest {
values.put(Cols.LICENSE, "GPL?"); values.put(Cols.LICENSE, "GPL?");
values.put(Cols.IS_COMPATIBLE, 1); values.put(Cols.IS_COMPATIBLE, 1);
values.put(Cols.PREFERRED_SIGNER, "eaa1d713b9c2a0475234a86d6539f910");
values.putAll(additionalValues); values.putAll(additionalValues);
Uri uri = AppProvider.getContentUri(); Uri uri = AppProvider.getContentUri();

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.data; package org.fdroid.fdroid.data;
import android.app.Application; import android.app.Application;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.TestUtils; import org.fdroid.fdroid.TestUtils;
@ -44,7 +43,7 @@ public class SuggestedVersionTest extends FDroidProviderTest {
@Test @Test
public void singleRepoSingleSig() { public void singleRepoSingleSig() {
App singleApp = TestUtils.insertApp( App singleApp = TestUtils.insertApp(
context, "single.app", "Single App (with beta)", 2, "https://beta.simple.repo"); context, "single.app", "Single App (with beta)", 2, "https://beta.simple.repo", TestUtils.FDROID_SIG);
TestUtils.insertApk(context, singleApp, 1, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 1, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, singleApp, 2, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 2, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, singleApp, 3, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 3, TestUtils.FDROID_SIG);
@ -59,10 +58,12 @@ public class SuggestedVersionTest extends FDroidProviderTest {
@Test @Test
public void singleRepoMultiSig() { public void singleRepoMultiSig() {
App unrelatedApp = TestUtils.insertApp(context, "noisy.app", "Noisy App", 3, "https://simple.repo"); App unrelatedApp = TestUtils.insertApp(context, "noisy.app", "Noisy App", 3, "https://simple.repo",
TestUtils.FDROID_SIG);
TestUtils.insertApk(context, unrelatedApp, 3, TestUtils.FDROID_SIG); TestUtils.insertApk(context, unrelatedApp, 3, TestUtils.FDROID_SIG);
App singleApp = TestUtils.insertApp(context, "single.app", "Single App", 4, "https://simple.repo"); App singleApp = TestUtils.insertApp(context, "single.app", "Single App", 4, "https://simple.repo",
TestUtils.UPSTREAM_SIG);
TestUtils.insertApk(context, singleApp, 1, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 1, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, singleApp, 2, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 2, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, singleApp, 3, TestUtils.FDROID_SIG); TestUtils.insertApk(context, singleApp, 3, TestUtils.FDROID_SIG);
@ -93,12 +94,15 @@ public class SuggestedVersionTest extends FDroidProviderTest {
@Test @Test
public void multiRepoMultiSig() { public void multiRepoMultiSig() {
App unrelatedApp = TestUtils.insertApp(context, "noisy.app", "Noisy App", 3, "https://simple.repo"); App unrelatedApp = TestUtils.insertApp(context, "noisy.app", "Noisy App", 3, "https://simple.repo",
TestUtils.FDROID_SIG);
TestUtils.insertApk(context, unrelatedApp, 3, TestUtils.FDROID_SIG); TestUtils.insertApk(context, unrelatedApp, 3, TestUtils.FDROID_SIG);
App mainApp = TestUtils.insertApp(context, "single.app", "Single App (Main repo)", 4, "https://main.repo"); App mainApp = TestUtils.insertApp(context, "single.app", "Single App (Main repo)", 4, "https://main.repo",
TestUtils.FDROID_SIG);
App thirdPartyApp = TestUtils.insertApp( App thirdPartyApp = TestUtils.insertApp(
context, "single.app", "Single App (3rd party)", 4, "https://3rd-party.repo"); context, "single.app", "Single App (3rd party)", 4, "https://3rd-party.repo",
TestUtils.THIRD_PARTY_SIG);
TestUtils.insertApk(context, mainApp, 1, TestUtils.FDROID_SIG); TestUtils.insertApk(context, mainApp, 1, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, mainApp, 2, TestUtils.FDROID_SIG); TestUtils.insertApk(context, mainApp, 2, TestUtils.FDROID_SIG);
@ -147,7 +151,8 @@ public class SuggestedVersionTest extends FDroidProviderTest {
@Test @Test
public void dontSuggestUpstreamVersions() { public void dontSuggestUpstreamVersions() {
// By setting the "upstreamVersionCode" to 0, we are letting F-Droid choose the highest compatible version. // By setting the "upstreamVersionCode" to 0, we are letting F-Droid choose the highest compatible version.
App mainApp = TestUtils.insertApp(context, "single.app", "Single App (Main repo)", 0, "https://main.repo"); App mainApp = TestUtils.insertApp(context, "single.app", "Single App (Main repo)", 0, "https://main.repo",
TestUtils.UPSTREAM_SIG);
TestUtils.insertApk(context, mainApp, 1, TestUtils.FDROID_SIG); TestUtils.insertApk(context, mainApp, 1, TestUtils.FDROID_SIG);
TestUtils.insertApk(context, mainApp, 2, TestUtils.FDROID_SIG); TestUtils.insertApk(context, mainApp, 2, TestUtils.FDROID_SIG);
@ -180,6 +185,7 @@ public class SuggestedVersionTest extends FDroidProviderTest {
/** /**
* Same as {@link #assertSuggested(String, int, String, int)} except only for non installed apps. * Same as {@link #assertSuggested(String, int, String, int)} except only for non installed apps.
*
* @see #assertSuggested(String, int, String, int) * @see #assertSuggested(String, int, String, int)
*/ */
private void assertSuggested(String packageName, int suggestedVersion) { private void assertSuggested(String packageName, int suggestedVersion) {
@ -189,7 +195,7 @@ public class SuggestedVersionTest extends FDroidProviderTest {
/** /**
* Checks that the app exists, that its suggested version code is correct, and that the apk which is "suggested" * Checks that the app exists, that its suggested version code is correct, and that the apk which is "suggested"
* has the correct signature. * has the correct signature.
* * <p>
* If {@param installedSig} is null then {@param installedVersion} is ignored and the signature of the suggested * If {@param installedSig} is null then {@param installedVersion} is ignored and the signature of the suggested
* apk is not checked. * apk is not checked.
*/ */