Allow cross-profile interaction when called from the system process.

This is done by allowing INTERACT_ACROSS_USERS_FULL to interact
cross-profile and make system_server use INTERACT_ACROSS_USERS_FULL.

Bug: 148279634
Test: manually verified the icons are loading cross-profile
Test: atest ManagedProfileTest#testCanGetWorkShortcutIconDrawableFromPersonalProfile
Test: atest ManagedProfileTest#testCanGetPersonalShortcutIconDrawableFromWorkProfile

Change-Id: I8da69a7cabd00bc3422cdd53af35604c248029af
This commit is contained in:
arangelov
2020-01-24 17:09:56 +00:00
parent c5f436ec5e
commit 08abd0f05f
3 changed files with 14 additions and 3 deletions

View File

@@ -16,6 +16,7 @@
package android.content.pm;
import static android.Manifest.permission;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -485,11 +486,15 @@ public class LauncherApps {
}
/**
* Show an error log on logcat, when the calling user is a managed profile, and the target
* user is different from the calling user, in order to help developers to detect it.
* Show an error log on logcat, when the calling user is a managed profile, the target
* user is different from the calling user, and it is not called from a package that has the
* {@link permission.INTERACT_ACROSS_USERS_FULL} permission, in order to help
* developers to detect it.
*/
private void logErrorForInvalidProfileAccess(@NonNull UserHandle target) {
if (UserHandle.myUserId() != target.getIdentifier() && mUserManager.isManagedProfile()) {
if (UserHandle.myUserId() != target.getIdentifier() && mUserManager.isManagedProfile()
&& mContext.checkSelfPermission(permission.INTERACT_ACROSS_USERS_FULL)
!= PackageManager.PERMISSION_GRANTED) {
Log.w(TAG, "Accessing other profiles/users from managed profile is no longer allowed.");
}
}

View File

@@ -2377,6 +2377,7 @@
@hide -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
android:protectionLevel="signature|installer|telephony" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<!-- Allows interaction across profiles in the same profile group. -->
<permission android:name="android.permission.INTERACT_ACROSS_PROFILES"

View File

@@ -16,6 +16,7 @@
package com.android.server.pm;
import android.Manifest.permission;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -303,6 +304,10 @@ public class LauncherAppsService extends SystemService {
final int callingUserId = injectCallingUserId();
if (targetUserId == callingUserId) return true;
if (mContext.checkCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS_FULL)
== PackageManager.PERMISSION_GRANTED) {
return true;
}
long ident = injectClearCallingIdentity();
try {