Limit access to package names in brightness slider data.
Only allow access to package names if the calling package
has PACKAGE_USAGE_STATS.
Bug: 69405990
Test: runtest -c com.android.server.display.BrightnessTrackerTest frameworks-services
Change-Id: I1c924d408a7c74620b9aa9d672c99a6424bb85ca
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 379aaad..19a74d7 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -29,6 +29,7 @@
import android.Manifest;
import android.annotation.NonNull;
+import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
@@ -1752,14 +1753,30 @@
}
@Override // Binder call
- public ParceledListSlice<BrightnessChangeEvent> getBrightnessEvents() {
+ public ParceledListSlice<BrightnessChangeEvent> getBrightnessEvents(String callingPackage) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.BRIGHTNESS_SLIDER_USAGE,
"Permission to read brightness events.");
- int userId = UserHandle.getUserId(Binder.getCallingUid());
+
+ final int callingUid = Binder.getCallingUid();
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ final int mode = appOpsManager.checkOp(AppOpsManager.OP_GET_USAGE_STATS,
+ callingUid, callingPackage);
+ final boolean hasUsageStats;
+ if (mode == AppOpsManager.MODE_DEFAULT) {
+ // The default behavior here is to check if PackageManager has given the app
+ // permission.
+ hasUsageStats = mContext.checkCallingPermission(
+ Manifest.permission.PACKAGE_USAGE_STATS)
+ == PackageManager.PERMISSION_GRANTED;
+ } else {
+ hasUsageStats = mode == AppOpsManager.MODE_ALLOWED;
+ }
+
+ final int userId = UserHandle.getUserId(callingUid);
final long token = Binder.clearCallingIdentity();
try {
- return mBrightnessTracker.getEvents(userId);
+ return mBrightnessTracker.getEvents(userId, hasUsageStats);
} finally {
Binder.restoreCallingIdentity(token);
}