Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdb57890 authored by Geremy Condra's avatar Geremy Condra
Browse files

Remove keysets from PackageKeySetData when KeySetManager removes them.

This fixes a bug where the KeySets in PackageKeySetData would get
out of sync with those in KeySetManager when repeatedly installed and
uninstalled.

Change-Id: I16cfe6d11f37d908ee5635ebcb6e784cebc252c0
parent ee6a2a91
Loading
Loading
Loading
Loading
+24 −9
Original line number Original line Diff line number Diff line
@@ -328,13 +328,16 @@ public class KeySetManager {
    }
    }


    public void removeAppKeySetData(String packageName) {
    public void removeAppKeySetData(String packageName) {
        Log.e(TAG, "Removing application " + packageName);
        synchronized (mLockObject) {
        synchronized (mLockObject) {
            // Get the package's known keys and KeySets
            // Get the package's known keys and KeySets
            Set<Long> deletableKeySets = getKnownKeySetsByPackageName(packageName);
            Set<Long> deletableKeySets = getKnownKeySetsByPackageNameLocked(packageName);
            Set<Long> deletableKeys = new HashSet<Long>();
            Set<Long> deletableKeys = new HashSet<Long>();
            Set<Long> knownKeys = null;
            for (Long ks : deletableKeySets) {
            for (Long ks : deletableKeySets) {
                deletableKeys.addAll(mKeySetMapping.get(ks));
                knownKeys = mKeySetMapping.get(ks);
                if (knownKeys != null) {
                    deletableKeys.addAll(knownKeys);
                }
            }
            }


            // Now remove the keys and KeySets known to any other package
            // Now remove the keys and KeySets known to any other package
@@ -342,11 +345,14 @@ public class KeySetManager {
                if (pkgName.equals(packageName)) {
                if (pkgName.equals(packageName)) {
                    continue;
                    continue;
                }
                }
                Set<Long> knownKeySets = getKnownKeySetsByPackageName(pkgName);
                Set<Long> knownKeySets = getKnownKeySetsByPackageNameLocked(pkgName);
                deletableKeySets.removeAll(knownKeySets);
                deletableKeySets.removeAll(knownKeySets);
                Set<Long> knownKeys = new HashSet<Long>();
                knownKeys = new HashSet<Long>();
                for (Long ks : knownKeySets) {
                for (Long ks : knownKeySets) {
                    deletableKeys.removeAll(mKeySetMapping.get(ks));
                    knownKeys = mKeySetMapping.get(ks);
                    if (knownKeys != null) {
                        deletableKeys.removeAll(knownKeys);
                    }
                }
                }
            }
            }


@@ -359,10 +365,19 @@ public class KeySetManager {
            for (Long keyId : deletableKeys) {
            for (Long keyId : deletableKeys) {
                mPublicKeys.delete(keyId);
                mPublicKeys.delete(keyId);
            }
            }

            // Now remove them from the KeySets known to each package
            for (String pkgName : mPackages.keySet()) {
                PackageSetting p = mPackages.get(packageName);
                for (Long ks : deletableKeySets) {
                    p.keySetData.removeSigningKeySet(ks);
                    p.keySetData.removeDefinedKeySet(ks);
                }
            }
        }
        }
    }
    }


    private Set<Long> getKnownKeySetsByPackageName(String packageName) {
    private Set<Long> getKnownKeySetsByPackageNameLocked(String packageName) {
        PackageSetting p = mPackages.get(packageName);
        PackageSetting p = mPackages.get(packageName);
        if (p == null) {
        if (p == null) {
            throw new NullPointerException("Unknown package");
            throw new NullPointerException("Unknown package");
@@ -371,10 +386,10 @@ public class KeySetManager {
            throw new IllegalArgumentException("Package has no keySet data");
            throw new IllegalArgumentException("Package has no keySet data");
        }
        }
        Set<Long> knownKeySets = new HashSet<Long>();
        Set<Long> knownKeySets = new HashSet<Long>();
        for (Long ks : p.keySetData.getSigningKeySets()) {
        for (long ks : p.keySetData.getSigningKeySets()) {
            knownKeySets.add(ks);
            knownKeySets.add(ks);
        }
        }
        for (Long ks : p.keySetData.getDefinedKeySets()) {
        for (long ks : p.keySetData.getDefinedKeySets()) {
            knownKeySets.add(ks);
            knownKeySets.add(ks);
        }
        }
        return knownKeySets;
        return knownKeySets;
+34 −0
Original line number Original line Diff line number Diff line
@@ -55,6 +55,20 @@ public class PackageKeySetData {
        mSigningKeySets[end] = ks;
        mSigningKeySets[end] = ks;
    }
    }


    public void removeSigningKeySet(long ks) {
        if (packageIsSignedBy(ks)) {
            long[] keysets = new long[mSigningKeySets.length - 1];
            int index = 0;
            for (long signingKeySet : mSigningKeySets) {
                if (signingKeySet != ks) {
                    keysets[index] = signingKeySet;
                    index += 1;
                }
            }
            mSigningKeySets = keysets;
        }
    }

    public void addDefinedKeySet(long ks, String alias) {
    public void addDefinedKeySet(long ks, String alias) {
        // deduplicate
        // deduplicate
        for (long knownKeySet : mDefinedKeySets) {
        for (long knownKeySet : mDefinedKeySets) {
@@ -68,6 +82,26 @@ public class PackageKeySetData {
        mKeySetAliases.put(alias, ks);
        mKeySetAliases.put(alias, ks);
    }
    }


    public void removeDefinedKeySet(long ks) {
        if (mKeySetAliases.containsValue(ks)) {
            long[] keysets = new long[mDefinedKeySets.length - 1];
            int index = 0;
            for (long definedKeySet : mDefinedKeySets) {
                if (definedKeySet != ks) {
                    keysets[index] = definedKeySet;
                    index += 1;
                }
            }
            mDefinedKeySets = keysets;
            for (String alias : mKeySetAliases.keySet()) {
                if (mKeySetAliases.get(alias) == ks) {
                    mKeySetAliases.remove(alias);
                    break;
                }
            }
        }
    }

    public boolean packageIsSignedBy(long ks) {
    public boolean packageIsSignedBy(long ks) {
        for (long signingKeySet : mSigningKeySets) {
        for (long signingKeySet : mSigningKeySets) {
            if (ks == signingKeySet) {
            if (ks == signingKeySet) {