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

Commit 5678bacd authored by Kenny Root's avatar Kenny Root Committed by Gerrit Code Review
Browse files

Merge "Remove keystore entries when app data cleared"

parents caf0496d e28b084d
Loading
Loading
Loading
Loading
+45 −23
Original line number Diff line number Diff line
@@ -8224,15 +8224,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        if (outInfo != null) {
            // A user ID was deleted here. Go through all users and remove it
            // from KeyStore.
            final int appId = outInfo.removedAppId;
            if (appId != -1) {
                final KeyStore keyStore = KeyStore.getInstance();
                if (keyStore != null) {
                    for (final int userId : sUserManager.getUserIds()) {
                        keyStore.clearUid(UserHandle.getUid(userId, appId));
                    }
                }
            }
            removeKeystoreDataIfNeeded(UserHandle.USER_ALL, outInfo.removedAppId);
        }
    }

@@ -8371,6 +8363,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                outInfo.removedUsers = new int[] {removeUser};
            }
            mInstaller.clearUserData(packageName, removeUser);
            removeKeystoreDataIfNeeded(removeUser, appId);
            schedulePackageCleaning(packageName, removeUser, false);
            return true;
        }
@@ -8522,6 +8515,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
        PackageParser.Package p;
        boolean dataOnly = false;
        final int appId;
        synchronized (mPackages) {
            p = mPackages.get(packageName);
            if (p == null) {
@@ -8533,8 +8527,6 @@ public class PackageManagerService extends IPackageManager.Stub {
                }
                p = ps.pkg;
            }
        }

            if (!dataOnly) {
                // need to check this only for fully installed applications
                if (p == null) {
@@ -8547,15 +8539,45 @@ public class PackageManagerService extends IPackageManager.Stub {
                    return false;
                }
            }
            if (p != null && p.applicationInfo != null) {
                appId = p.applicationInfo.uid;
            } else {
                appId = -1;
            }
        }
        int retCode = mInstaller.clearUserData(packageName, userId);
        if (retCode < 0) {
            Slog.w(TAG, "Couldn't remove cache files for package: "
                    + packageName);
            return false;
        }
        removeKeystoreDataIfNeeded(userId, appId);
        return true;
    }

    /**
     * Remove entries from the keystore daemon. Will only remove it if the
     * {@code appId} is valid.
     */
    private static void removeKeystoreDataIfNeeded(int userId, int appId) {
        if (appId < 0) {
            return;
        }

        final KeyStore keyStore = KeyStore.getInstance();
        if (keyStore != null) {
            if (userId == UserHandle.USER_ALL) {
                for (final int individual : sUserManager.getUserIds()) {
                    keyStore.clearUid(UserHandle.getUid(individual, appId));
                }
            } else {
                keyStore.clearUid(UserHandle.getUid(userId, appId));
            }
        } else {
            Slog.w(TAG, "Could not contact keystore to clear entries for app id " + appId);
        }
    }

    public void deleteApplicationCacheFiles(final String packageName,
            final IPackageDataObserver observer) {
        mContext.enforceCallingOrSelfPermission(