Loading services/core/java/com/android/server/am/UserController.java +11 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import android.appwidget.AppWidgetManagerInternal; import android.content.Context; import android.content.IIntentReceiver; import android.content.Intent; import android.content.PermissionChecker; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.UserInfo; Loading Loading @@ -1756,7 +1757,7 @@ class UserController implements Handler.Callback { // We require full access, sucks to be you. allow = false; } else if (canInteractWithAcrossProfilesPermission( allowMode, isSameProfileGroup, callingPid, callingUid)) { allowMode, isSameProfileGroup, callingPid, callingUid, callerPackage)) { allow = true; } else if (mInjector.checkComponentPermission(INTERACT_ACROSS_USERS, callingPid, callingUid, -1, true) != PackageManager.PERMISSION_GRANTED) { Loading Loading @@ -1821,16 +1822,21 @@ class UserController implements Handler.Callback { } private boolean canInteractWithAcrossProfilesPermission( int allowMode, boolean isSameProfileGroup, int callingPid, int callingUid) { int allowMode, boolean isSameProfileGroup, int callingPid, int callingUid, String callingPackage) { if (allowMode != ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) { return false; } if (!isSameProfileGroup) { return false; } return mInjector.checkComponentPermission( INTERACT_ACROSS_PROFILES, callingPid, callingUid, /*owningUid= */-1, /*exported= */true) == PackageManager.PERMISSION_GRANTED; return PermissionChecker.PERMISSION_GRANTED == PermissionChecker.checkPermissionForPreflight( mInjector.getContext(), INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage); } int unsafeConvertIncomingUser(@UserIdInt int userId) { Loading services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java +22 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.app.admin.DevicePolicyManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.PermissionChecker; import android.content.pm.ActivityInfo; import android.content.pm.ICrossProfileApps; import android.content.pm.IPackageManager; Loading Loading @@ -114,6 +115,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { final int callerUserId = mInjector.getCallingUserId(); final int callingUid = mInjector.getCallingUid(); final int callingPid = mInjector.getCallingPid(); List<UserHandle> allowedTargetUsers = getTargetUserProfilesUnchecked( callingPackage, callerUserId); Loading Loading @@ -143,10 +145,13 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { // must have the required permission and the users must be in the same profile group // in order to launch any of its own activities. if (callerUserId != userId) { final int permissionFlag = mInjector.checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_PROFILES, callingUid, -1, true); if (permissionFlag != PackageManager.PERMISSION_GRANTED final int permissionFlag = PermissionChecker.checkPermissionForPreflight( mContext, android.Manifest.permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage); if (permissionFlag != PermissionChecker.PERMISSION_GRANTED || !isSameProfileGroup(callerUserId, userId)) { throw new SecurityException("Attempt to launch activity without required " + android.Manifest.permission.INTERACT_ACROSS_PROFILES + " permission" Loading Loading @@ -210,12 +215,15 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { return false; } final int callingUid = mInjector.getCallingUid(); final int callingPid = mInjector.getCallingPid(); return isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid) || isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS, callingUid) || isPermissionGranted(Manifest.permission.INTERACT_ACROSS_PROFILES, callingUid) || AppOpsManager.MODE_ALLOWED == getAppOpsService().noteOperation( OP_INTERACT_ACROSS_PROFILES, callingUid, callingPackage, /* featureId= */ null, /*shouldCollectAsyncNotedOp= */false, /*message= */null); || PermissionChecker.checkPermissionForPreflight( mContext, Manifest.permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage) == PermissionChecker.PERMISSION_GRANTED; } private boolean isCrossProfilePackageWhitelisted(String packageName) { Loading Loading @@ -436,6 +444,10 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { return Binder.getCallingUid(); } public int getCallingPid() { return Binder.getCallingPid(); } public int getCallingUserId() { return UserHandle.getCallingUserId(); } Loading Loading @@ -504,6 +516,8 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { public interface Injector { int getCallingUid(); int getCallingPid(); int getCallingUserId(); UserHandle getCallingUserHandle(); Loading services/core/java/com/android/server/pm/permission/PermissionManagerService.java +10 −3 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.app.IActivityManager; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; import android.content.Context; import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.PermissionGroupInfoFlags; Loading Loading @@ -4070,8 +4071,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { return; } final boolean isSameProfileGroup = isSameProfileGroup(callingUserId, userId); if (isSameProfileGroup && hasPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES)) { if (isSameProfileGroup && PermissionChecker.checkPermissionForPreflight( mContext, android.Manifest.permission.INTERACT_ACROSS_PROFILES, PermissionChecker.PID_UNKNOWN, callingUid, mPackageManagerInt.getPackage(callingUid).getPackageName()) == PermissionChecker.PERMISSION_GRANTED) { return; } String errorMessage = buildInvalidCrossUserOrProfilePermissionMessage( Loading Loading @@ -4349,7 +4355,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { @Override public void enforceCrossUserOrProfilePermission(int callingUid, int userId, boolean requireFullPermission, boolean checkShell, String message) { PermissionManagerService.this.enforceCrossUserOrProfilePermission(callingUid, PermissionManagerService.this.enforceCrossUserOrProfilePermission( callingUid, userId, requireFullPermission, checkShell, Loading services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +8 −3 Original line number Diff line number Diff line Loading @@ -9102,11 +9102,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } private void enforceAcrossUsersPermissions() { if (isCallerWithSystemUid() || mInjector.binderGetCallingUid() == Process.ROOT_UID) { final int callingUid = mInjector.binderGetCallingUid(); final int callingPid = mInjector.binderGetCallingPid(); final String packageName = mContext.getPackageName(); if (isCallerWithSystemUid() || callingUid == Process.ROOT_UID) { return; } if (mContext.checkCallingPermission(permission.INTERACT_ACROSS_PROFILES) == PackageManager.PERMISSION_GRANTED) { if (PermissionChecker.checkPermissionForPreflight( mContext, permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, packageName) == PermissionChecker.PERMISSION_GRANTED) { return; } if (mContext.checkCallingPermission(permission.INTERACT_ACROSS_USERS) Loading services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import java.util.Set; @Config(shadows = {ShadowUserManager.class, ShadowApplicationPackageManager.class}) public class CrossProfileAppsServiceImplRoboTest { private static final int CALLING_UID = 1111; private static final int CALLING_PID = 1000; private static final String CROSS_PROFILE_APP_PACKAGE_NAME = "com.android.server.pm.crossprofileappsserviceimplrobotest.crossprofileapp"; private static final int PERSONAL_PROFILE_USER_ID = 0; Loading Loading @@ -382,6 +383,11 @@ public class CrossProfileAppsServiceImplRoboTest { return CALLING_UID; } @Override public int getCallingPid() { return CALLING_PID; } @Override public @UserIdInt int getCallingUserId() { return PERSONAL_PROFILE_USER_ID; Loading Loading
services/core/java/com/android/server/am/UserController.java +11 −5 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import android.appwidget.AppWidgetManagerInternal; import android.content.Context; import android.content.IIntentReceiver; import android.content.Intent; import android.content.PermissionChecker; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.UserInfo; Loading Loading @@ -1756,7 +1757,7 @@ class UserController implements Handler.Callback { // We require full access, sucks to be you. allow = false; } else if (canInteractWithAcrossProfilesPermission( allowMode, isSameProfileGroup, callingPid, callingUid)) { allowMode, isSameProfileGroup, callingPid, callingUid, callerPackage)) { allow = true; } else if (mInjector.checkComponentPermission(INTERACT_ACROSS_USERS, callingPid, callingUid, -1, true) != PackageManager.PERMISSION_GRANTED) { Loading Loading @@ -1821,16 +1822,21 @@ class UserController implements Handler.Callback { } private boolean canInteractWithAcrossProfilesPermission( int allowMode, boolean isSameProfileGroup, int callingPid, int callingUid) { int allowMode, boolean isSameProfileGroup, int callingPid, int callingUid, String callingPackage) { if (allowMode != ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) { return false; } if (!isSameProfileGroup) { return false; } return mInjector.checkComponentPermission( INTERACT_ACROSS_PROFILES, callingPid, callingUid, /*owningUid= */-1, /*exported= */true) == PackageManager.PERMISSION_GRANTED; return PermissionChecker.PERMISSION_GRANTED == PermissionChecker.checkPermissionForPreflight( mInjector.getContext(), INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage); } int unsafeConvertIncomingUser(@UserIdInt int userId) { Loading
services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java +22 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.app.admin.DevicePolicyManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.PermissionChecker; import android.content.pm.ActivityInfo; import android.content.pm.ICrossProfileApps; import android.content.pm.IPackageManager; Loading Loading @@ -114,6 +115,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { final int callerUserId = mInjector.getCallingUserId(); final int callingUid = mInjector.getCallingUid(); final int callingPid = mInjector.getCallingPid(); List<UserHandle> allowedTargetUsers = getTargetUserProfilesUnchecked( callingPackage, callerUserId); Loading Loading @@ -143,10 +145,13 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { // must have the required permission and the users must be in the same profile group // in order to launch any of its own activities. if (callerUserId != userId) { final int permissionFlag = mInjector.checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_PROFILES, callingUid, -1, true); if (permissionFlag != PackageManager.PERMISSION_GRANTED final int permissionFlag = PermissionChecker.checkPermissionForPreflight( mContext, android.Manifest.permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage); if (permissionFlag != PermissionChecker.PERMISSION_GRANTED || !isSameProfileGroup(callerUserId, userId)) { throw new SecurityException("Attempt to launch activity without required " + android.Manifest.permission.INTERACT_ACROSS_PROFILES + " permission" Loading Loading @@ -210,12 +215,15 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { return false; } final int callingUid = mInjector.getCallingUid(); final int callingPid = mInjector.getCallingPid(); return isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid) || isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS, callingUid) || isPermissionGranted(Manifest.permission.INTERACT_ACROSS_PROFILES, callingUid) || AppOpsManager.MODE_ALLOWED == getAppOpsService().noteOperation( OP_INTERACT_ACROSS_PROFILES, callingUid, callingPackage, /* featureId= */ null, /*shouldCollectAsyncNotedOp= */false, /*message= */null); || PermissionChecker.checkPermissionForPreflight( mContext, Manifest.permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, callingPackage) == PermissionChecker.PERMISSION_GRANTED; } private boolean isCrossProfilePackageWhitelisted(String packageName) { Loading Loading @@ -436,6 +444,10 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { return Binder.getCallingUid(); } public int getCallingPid() { return Binder.getCallingPid(); } public int getCallingUserId() { return UserHandle.getCallingUserId(); } Loading Loading @@ -504,6 +516,8 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { public interface Injector { int getCallingUid(); int getCallingPid(); int getCallingUserId(); UserHandle getCallingUserHandle(); Loading
services/core/java/com/android/server/pm/permission/PermissionManagerService.java +10 −3 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.app.IActivityManager; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; import android.content.Context; import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.PermissionGroupInfoFlags; Loading Loading @@ -4070,8 +4071,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { return; } final boolean isSameProfileGroup = isSameProfileGroup(callingUserId, userId); if (isSameProfileGroup && hasPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES)) { if (isSameProfileGroup && PermissionChecker.checkPermissionForPreflight( mContext, android.Manifest.permission.INTERACT_ACROSS_PROFILES, PermissionChecker.PID_UNKNOWN, callingUid, mPackageManagerInt.getPackage(callingUid).getPackageName()) == PermissionChecker.PERMISSION_GRANTED) { return; } String errorMessage = buildInvalidCrossUserOrProfilePermissionMessage( Loading Loading @@ -4349,7 +4355,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { @Override public void enforceCrossUserOrProfilePermission(int callingUid, int userId, boolean requireFullPermission, boolean checkShell, String message) { PermissionManagerService.this.enforceCrossUserOrProfilePermission(callingUid, PermissionManagerService.this.enforceCrossUserOrProfilePermission( callingUid, userId, requireFullPermission, checkShell, Loading
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +8 −3 Original line number Diff line number Diff line Loading @@ -9102,11 +9102,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } private void enforceAcrossUsersPermissions() { if (isCallerWithSystemUid() || mInjector.binderGetCallingUid() == Process.ROOT_UID) { final int callingUid = mInjector.binderGetCallingUid(); final int callingPid = mInjector.binderGetCallingPid(); final String packageName = mContext.getPackageName(); if (isCallerWithSystemUid() || callingUid == Process.ROOT_UID) { return; } if (mContext.checkCallingPermission(permission.INTERACT_ACROSS_PROFILES) == PackageManager.PERMISSION_GRANTED) { if (PermissionChecker.checkPermissionForPreflight( mContext, permission.INTERACT_ACROSS_PROFILES, callingPid, callingUid, packageName) == PermissionChecker.PERMISSION_GRANTED) { return; } if (mContext.checkCallingPermission(permission.INTERACT_ACROSS_USERS) Loading
services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import java.util.Set; @Config(shadows = {ShadowUserManager.class, ShadowApplicationPackageManager.class}) public class CrossProfileAppsServiceImplRoboTest { private static final int CALLING_UID = 1111; private static final int CALLING_PID = 1000; private static final String CROSS_PROFILE_APP_PACKAGE_NAME = "com.android.server.pm.crossprofileappsserviceimplrobotest.crossprofileapp"; private static final int PERSONAL_PROFILE_USER_ID = 0; Loading Loading @@ -382,6 +383,11 @@ public class CrossProfileAppsServiceImplRoboTest { return CALLING_UID; } @Override public int getCallingPid() { return CALLING_PID; } @Override public @UserIdInt int getCallingUserId() { return PERSONAL_PROFILE_USER_ID; Loading