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

Commit 416a04e4 authored by Hai Zhang's avatar Hai Zhang
Browse files

Fix permission state missing when backup is restored.

The BackupAgent of an application may run before package post
installation, so the permission state must be ready by then. So
instead of calling onPackageInstalled() in post install, we can revert
to calling it in updateSettingsInternalLI() as in R (before
ag/13144022 which introduced the regression).

This changes the grant permissions etc to be done before package
post-installation, but this might be actually a correct change as
application code may expect permissions, and we are already doing it
like this in installExistingPackageAsUser() so this change is making
it consistent.

Fixes: 175932103
Test: manual
Test: Wipe and restore a backup and ensure Keep is no longer crashing.
Test: presubmit
Change-Id: Ie2e0dbd7a1a8454f9935527b9c303c26010ff592
parent fdcfd2a2
Loading
Loading
Loading
Loading
+35 −41
Original line number Diff line number Diff line
@@ -5092,23 +5092,12 @@ public class PackageManagerService extends IPackageManager.Stub
                        InstallArgs args = data.args;
                        PackageInstalledInfo parentRes = data.res;
                        final boolean grantPermissions = (args.installFlags
                                & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
                        final boolean killApp = (args.installFlags
                                & PackageManager.INSTALL_DONT_KILL_APP) == 0;
                        final boolean virtualPreload = ((args.installFlags
                                & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);
                        final String[] grantedPermissions = args.installGrantPermissions;
                        final List<String> whitelistedRestrictedPermissions = ((args.installFlags
                                & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0
                                    && parentRes.pkg != null)
                                ? parentRes.pkg.getRequestedPermissions()
                                : args.whitelistedRestrictedPermissions;
                        int autoRevokePermissionsMode = args.autoRevokePermissionsMode;
                        handlePackagePostInstall(parentRes, grantPermissions,
                                killApp, virtualPreload, grantedPermissions,
                                whitelistedRestrictedPermissions, autoRevokePermissionsMode,
                        handlePackagePostInstall(parentRes, killApp, virtualPreload,
                                didRestore, args.installSource.installerPackageName, args.observer,
                                args.mDataLoaderType);
@@ -5387,11 +5376,8 @@ public class PackageManagerService extends IPackageManager.Stub
        }
    }
    private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions,
            boolean killApp, boolean virtualPreload,
            String[] grantedPermissions, List<String> allowlistedRestrictedPermissions,
            int autoRevokePermissionsMode,
            boolean launchedForRestore, String installerPackage,
    private void handlePackagePostInstall(PackageInstalledInfo res, boolean killApp,
            boolean virtualPreload, boolean launchedForRestore, String installerPackage,
            IPackageInstallObserver2 installObserver, int dataLoaderType) {
        boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED;
        final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null;
@@ -5422,29 +5408,6 @@ public class PackageManagerService extends IPackageManager.Stub
                res.removedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/);
            }
            final PermissionManagerServiceInternal.PackageInstalledParams.Builder
                    permissionParamsBuilder =
                    new PermissionManagerServiceInternal.PackageInstalledParams.Builder();
            final List<String> grantedPermissionsList;
            if (grantPermissions) {
                if (grantedPermissions != null) {
                    permissionParamsBuilder.setGrantedPermissions(Arrays.asList(
                            grantedPermissions));
                } else {
                    permissionParamsBuilder.setGrantedPermissions(
                            res.pkg.getRequestedPermissions());
                }
            }
            if (allowlistedRestrictedPermissions != null) {
                permissionParamsBuilder.setAllowlistedRestrictedPermissions(
                        allowlistedRestrictedPermissions);
            }
            permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode);
            for (final int userId : res.newUsers) {
                mPermissionManager.onPackageInstalled(res.pkg, permissionParamsBuilder.build(),
                        userId);
            }
            final String installerPackageName =
                    res.installerPackageName != null
                            ? res.installerPackageName
@@ -18445,6 +18408,37 @@ public class PackageManagerService extends IPackageManager.Stub
                }
                mSettings.writeKernelMappingLPr(ps);
                final PermissionManagerServiceInternal.PackageInstalledParams.Builder
                        permissionParamsBuilder =
                        new PermissionManagerServiceInternal.PackageInstalledParams.Builder();
                final boolean grantPermissions = (installArgs.installFlags
                        & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
                if (grantPermissions) {
                    final List<String> grantedPermissions =
                            installArgs.installGrantPermissions != null
                                    ? Arrays.asList(installArgs.installGrantPermissions)
                                    : pkg.getRequestedPermissions();
                    permissionParamsBuilder.setGrantedPermissions(grantedPermissions);
                }
                final boolean allowlistAllRestrictedPermissions =
                        (installArgs.installFlags
                                & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0;
                final List<String> allowlistedRestrictedPermissions =
                        allowlistAllRestrictedPermissions ? pkg.getRequestedPermissions()
                        : installArgs.whitelistedRestrictedPermissions;
                if (allowlistedRestrictedPermissions != null) {
                    permissionParamsBuilder.setAllowlistedRestrictedPermissions(
                            allowlistedRestrictedPermissions);
                }
                final int autoRevokePermissionsMode = installArgs.autoRevokePermissionsMode;
                permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode);
                for (int currentUserId : allUsersList) {
                    if (ps.getInstalled(currentUserId)) {
                        mPermissionManager.onPackageInstalled(pkg, permissionParamsBuilder.build(),
                                currentUserId);
                    }
                }
            }
            res.name = pkgName;
            res.uid = pkg.getUid();