Loading services/core/java/com/android/server/wm/ActivityRecord.java +14 −1 Original line number Diff line number Diff line Loading @@ -4148,7 +4148,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The activity now gets access to the data associated with this Intent. mAtmService.mUgmInternal.grantUriPermissionUncheckedFromIntent(intentGrants, getUriPermissionsLocked()); final ReferrerIntent rintent = new ReferrerIntent(intent, referrer); final ReferrerIntent rintent = new ReferrerIntent(intent, getFilteredReferrer(referrer)); boolean unsent = true; final boolean isTopActivityWhileSleeping = isTopRunningActivity() && isSleeping(); Loading Loading @@ -8504,6 +8504,19 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return launchedFromUid; } /** * Gets the referrer package name with respect to package visibility. This method returns null * if the given package is not visible to this activity. */ String getFilteredReferrer(String referrerPackage) { if (referrerPackage == null || (!referrerPackage.equals(packageName) && mWmService.mPmInternal.filterAppAccess( referrerPackage, info.applicationInfo.uid, mUserId))) { return null; } return referrerPackage; } /** * Determines whether this ActivityRecord can turn the screen on. It checks whether the flag * {@link ActivityRecord#getTurnScreenOnFlag} is set and checks whether the ActivityRecord Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +3 −3 Original line number Diff line number Diff line Loading @@ -848,9 +848,9 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // and override configs. mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat, r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(), results, newIntents, r.takeOptions(), isTransitionForward, r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor, proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(), results, newIntents, r.takeOptions(), isTransitionForward, proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController, r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken, r.getLaunchedFromBubble())); Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -40,8 +41,10 @@ import static org.mockito.Mockito.timeout; import android.app.WaitResult; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.ConditionVariable; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.view.Display; Loading Loading @@ -187,6 +190,24 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { verify(taskChangeNotifier, never()).notifyActivityDismissingDockedRootTask(); } /** Ensures that the calling package name passed to client complies with package visibility. */ @Test public void testFilteredReferred() { final ActivityRecord activity = new ActivityBuilder(mAtm) .setLaunchedFromPackage("other.package").setCreateTask(true).build(); assertNotNull(activity.launchedFromPackage); try { mSupervisor.realStartActivityLocked(activity, activity.app, false /* andResume */, false /* checkConfig */); } catch (RemoteException ignored) { } verify(activity).getFilteredReferrer(eq(activity.launchedFromPackage)); activity.deliverNewIntentLocked(ActivityBuilder.DEFAULT_FAKE_UID, new Intent(), null /* intentGrants */, "other.package2"); verify(activity).getFilteredReferrer(eq("other.package2")); } /** * Ensures that notify focus task changes. */ Loading services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +7 −0 Original line number Diff line number Diff line Loading @@ -801,6 +801,7 @@ class WindowTestsBase extends SystemServiceTestsBase { private int mConfigChanges; private int mLaunchedFromPid; private int mLaunchedFromUid; private String mLaunchedFromPackage; private WindowProcessController mWpc; private Bundle mIntentExtras; private boolean mOnTop = false; Loading Loading @@ -911,6 +912,11 @@ class WindowTestsBase extends SystemServiceTestsBase { return this; } ActivityBuilder setLaunchedFromPackage(String packageName) { mLaunchedFromPackage = packageName; return this; } ActivityBuilder setUseProcess(WindowProcessController wpc) { mWpc = wpc; return this; Loading Loading @@ -1000,6 +1006,7 @@ class WindowTestsBase extends SystemServiceTestsBase { final ActivityRecord activity = new ActivityRecord.Builder(mService) .setLaunchedFromPid(mLaunchedFromPid) .setLaunchedFromUid(mLaunchedFromUid) .setLaunchedFromPackage(mLaunchedFromPackage) .setIntent(intent) .setActivityInfo(aInfo) .setActivityOptions(options) Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +14 −1 Original line number Diff line number Diff line Loading @@ -4148,7 +4148,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The activity now gets access to the data associated with this Intent. mAtmService.mUgmInternal.grantUriPermissionUncheckedFromIntent(intentGrants, getUriPermissionsLocked()); final ReferrerIntent rintent = new ReferrerIntent(intent, referrer); final ReferrerIntent rintent = new ReferrerIntent(intent, getFilteredReferrer(referrer)); boolean unsent = true; final boolean isTopActivityWhileSleeping = isTopRunningActivity() && isSleeping(); Loading Loading @@ -8504,6 +8504,19 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return launchedFromUid; } /** * Gets the referrer package name with respect to package visibility. This method returns null * if the given package is not visible to this activity. */ String getFilteredReferrer(String referrerPackage) { if (referrerPackage == null || (!referrerPackage.equals(packageName) && mWmService.mPmInternal.filterAppAccess( referrerPackage, info.applicationInfo.uid, mUserId))) { return null; } return referrerPackage; } /** * Determines whether this ActivityRecord can turn the screen on. It checks whether the flag * {@link ActivityRecord#getTurnScreenOnFlag} is set and checks whether the ActivityRecord Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +3 −3 Original line number Diff line number Diff line Loading @@ -848,9 +848,9 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // and override configs. mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat, r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(), results, newIntents, r.takeOptions(), isTransitionForward, r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor, proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(), results, newIntents, r.takeOptions(), isTransitionForward, proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController, r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken, r.getLaunchedFromBubble())); Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -40,8 +41,10 @@ import static org.mockito.Mockito.timeout; import android.app.WaitResult; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.ConditionVariable; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.view.Display; Loading Loading @@ -187,6 +190,24 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { verify(taskChangeNotifier, never()).notifyActivityDismissingDockedRootTask(); } /** Ensures that the calling package name passed to client complies with package visibility. */ @Test public void testFilteredReferred() { final ActivityRecord activity = new ActivityBuilder(mAtm) .setLaunchedFromPackage("other.package").setCreateTask(true).build(); assertNotNull(activity.launchedFromPackage); try { mSupervisor.realStartActivityLocked(activity, activity.app, false /* andResume */, false /* checkConfig */); } catch (RemoteException ignored) { } verify(activity).getFilteredReferrer(eq(activity.launchedFromPackage)); activity.deliverNewIntentLocked(ActivityBuilder.DEFAULT_FAKE_UID, new Intent(), null /* intentGrants */, "other.package2"); verify(activity).getFilteredReferrer(eq("other.package2")); } /** * Ensures that notify focus task changes. */ Loading
services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +7 −0 Original line number Diff line number Diff line Loading @@ -801,6 +801,7 @@ class WindowTestsBase extends SystemServiceTestsBase { private int mConfigChanges; private int mLaunchedFromPid; private int mLaunchedFromUid; private String mLaunchedFromPackage; private WindowProcessController mWpc; private Bundle mIntentExtras; private boolean mOnTop = false; Loading Loading @@ -911,6 +912,11 @@ class WindowTestsBase extends SystemServiceTestsBase { return this; } ActivityBuilder setLaunchedFromPackage(String packageName) { mLaunchedFromPackage = packageName; return this; } ActivityBuilder setUseProcess(WindowProcessController wpc) { mWpc = wpc; return this; Loading Loading @@ -1000,6 +1006,7 @@ class WindowTestsBase extends SystemServiceTestsBase { final ActivityRecord activity = new ActivityRecord.Builder(mService) .setLaunchedFromPid(mLaunchedFromPid) .setLaunchedFromUid(mLaunchedFromUid) .setLaunchedFromPackage(mLaunchedFromPackage) .setIntent(intent) .setActivityInfo(aInfo) .setActivityOptions(options) Loading