From 087391049e337ac24089954398b5d71297732c4d Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Thu, 7 May 2020 14:52:27 +0100 Subject: Kill app if cross profile app op gets revoked Kill the app in both profiles if user/admin revokes the cross profile app op permission, this is to ensure that any cross profile bound services gets unbound as soon as the app op is revoked. Fixes: 154693902 Test: atest ManagedProfileCrossProfileTest Test: atest FrameworksServicesTests:com.android.server.pm.CrossProfileAppsServiceImplTest Test: atest CrossProfileAppsServiceImplRoboTest Change-Id: Iaa3b9196468149c1cec51e9101989f1877374cc5 --- .../pm/CrossProfileAppsServiceImplRoboTest.java | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'services/robotests/src') diff --git a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java index f8d197acf883..d78dad55e181 100644 --- a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java +++ b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java @@ -46,6 +46,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.os.Process; import android.os.UserHandle; @@ -106,6 +107,7 @@ public class CrossProfileAppsServiceImplRoboTest { new CrossProfileAppsServiceImpl(mContext, mInjector); private final Map> mSentUserBroadcasts = new HashMap<>(); private final Map> installedApplications = new HashMap<>(); + private final Set mKilledUids = new HashSet<>(); @Mock private PackageManagerInternal mPackageManagerInternal; @Mock private IPackageManager mIPackageManager; @@ -388,6 +390,33 @@ public class CrossProfileAppsServiceImplRoboTest { assertThat(receivedManifestCanInteractAcrossProfilesChangedBroadcast()).isTrue(); } + @Test + public void setInteractAcrossProfilesAppOp_toAllowed_doesNotKillApp() { + mCrossProfileAppsServiceImpl.setInteractAcrossProfilesAppOp( + CROSS_PROFILE_APP_PACKAGE_NAME, MODE_ALLOWED); + assertThat(mKilledUids).isEmpty(); + } + + @Test + public void setInteractAcrossProfilesAppOp_toDisallowed_killsAppsInBothProfiles() { + shadowOf(mPackageManager).addPermissionInfo(createCrossProfilesPermissionInfo()); + mCrossProfileAppsServiceImpl.setInteractAcrossProfilesAppOp( + CROSS_PROFILE_APP_PACKAGE_NAME, MODE_ALLOWED); + + mCrossProfileAppsServiceImpl.setInteractAcrossProfilesAppOp( + CROSS_PROFILE_APP_PACKAGE_NAME, MODE_DEFAULT); + + assertThat(mKilledUids).contains(WORK_PROFILE_UID); + assertThat(mKilledUids).contains(PERSONAL_PROFILE_UID); + } + + private PermissionInfo createCrossProfilesPermissionInfo() { + PermissionInfo permissionInfo = new PermissionInfo(); + permissionInfo.name = Manifest.permission.INTERACT_ACROSS_PROFILES; + permissionInfo.protectionLevel = PermissionInfo.PROTECTION_FLAG_APPOP; + return permissionInfo; + } + @Test public void canConfigureInteractAcrossProfiles_packageNotInstalledInProfile_returnsFalse() { mockUninstallCrossProfileAppFromWorkProfile(); @@ -678,5 +707,10 @@ public class CrossProfileAppsServiceImplRoboTest { // ShadowActivityThread with Robolectric. This method is currently not supported there. return mContext.checkPermission(permission, Process.myPid(), uid); } + + @Override + public void killUid(String packageName, int uid) { + mKilledUids.add(uid); + } } } -- cgit v1.2.3-59-g8ed1b