From 8630254ec87d1f407cb5a818eb8e5fad19e0a87d Mon Sep 17 00:00:00 2001 From: Andy Yu Date: Thu, 5 Jan 2023 12:55:25 -0800 Subject: [PATCH] Add QUERY_ALL_PACKAGES permission to getInterventionList To guard query information from apps and only allow system and shell command. Bug: 249056757 Test: atest GameManagerServiceTests Change-Id: I5855b887d99b5fae0471bda98dcd2d86134032ba --- .../server/app/GameManagerService.java | 2 ++ .../server/app/GameManagerServiceTests.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index 46d3ff1273ec5..d7386183e905c 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -1762,7 +1762,9 @@ public final class GameManagerService extends IGameManagerService.Stub { /** * Returns the string listing all the interventions currently set to a game. */ + @RequiresPermission(Manifest.permission.QUERY_ALL_PACKAGES) public String getInterventionList(String packageName, int userId) { + checkPermission(Manifest.permission.QUERY_ALL_PACKAGES); final GamePackageConfiguration packageConfig = getConfig(packageName, userId); final StringBuilder listStrSb = new StringBuilder(); if (packageConfig == null) { diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index d3fa92ce68d71..94cfa42868b0c 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -262,6 +262,16 @@ public class GameManagerServiceTests { mTestLooper.dispatchAll(); } + private void mockQueryAllPackageGranted() { + mMockContext.setPermission(Manifest.permission.QUERY_ALL_PACKAGES, + PackageManager.PERMISSION_GRANTED); + } + + private void mockQueryAllPackageDenied() { + mMockContext.setPermission(Manifest.permission.QUERY_ALL_PACKAGES, + PackageManager.PERMISSION_DENIED); + } + private void mockManageUsersGranted() { mMockContext.setPermission(Manifest.permission.MANAGE_USERS, PackageManager.PERMISSION_GRANTED); @@ -2180,4 +2190,22 @@ public class GameManagerServiceTests { verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); } + + @Test + public void testGetInterventionList_permissionDenied() throws Exception { + String configString = "mode=2,downscaleFactor=0.5"; + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + mockQueryAllPackageDenied(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + assertThrows(SecurityException.class, + () -> gameManagerService.getInterventionList(mPackageName, USER_ID_1)); + + mockQueryAllPackageGranted(); + String expectedInterventionListOutput = "\n[Name:" + mPackageName + + " Modes: {2=[Game Mode:2,Scaling:0.5,Use Angle:false," + + "Fps:,Loading Boost Duration:-1]}]"; + assertEquals(expectedInterventionListOutput, + gameManagerService.getInterventionList(mPackageName, USER_ID_1)); + } }