diff options
| author | 2024-09-10 12:30:29 +0000 | |
|---|---|---|
| committer | 2024-09-10 12:30:29 +0000 | |
| commit | 529e1eb7536b4bffb24d3ecca79e22841b8d9d2c (patch) | |
| tree | 5fc919b43cc87f5cf0c1e751d10032eefae2e045 | |
| parent | 92e4b2dbb8b0bdeefa6ec981e916951e1d6af6ff (diff) | |
| parent | a196b6392fa39e76a689ede14962381388d543d8 (diff) | |
Merge "Properly check MANAGE_EXTERNAL_STORAGE for wallpaper" into main
| -rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 4dcc6e112ecc..78359bd15717 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -2224,15 +2224,21 @@ public class WallpaperManagerService extends IWallpaperManager.Stub public ParcelFileDescriptor getWallpaperWithFeature(String callingPkg, String callingFeatureId, IWallpaperManagerCallback cb, final int which, Bundle outParams, int wallpaperUserId, boolean getCropped) { - final boolean hasPrivilege = hasPermission(READ_WALLPAPER_INTERNAL) - || hasPermission(MANAGE_EXTERNAL_STORAGE); + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final boolean hasPrivilege = hasPermission(READ_WALLPAPER_INTERNAL); if (!hasPrivilege) { - mContext.getSystemService(StorageManager.class).checkPermissionReadImages(true, - Binder.getCallingPid(), Binder.getCallingUid(), callingPkg, callingFeatureId); + boolean hasManageExternalStorage = hasPermission(MANAGE_EXTERNAL_STORAGE) + || hasAppOpPermission(MANAGE_EXTERNAL_STORAGE, callingUid, callingPkg, + callingFeatureId, "getWallpaperWithFeature from package: " + callingPkg); + if (!hasManageExternalStorage) { + mContext.getSystemService(StorageManager.class).checkPermissionReadImages(true, + callingPid, callingUid, callingPkg, callingFeatureId); + } } - wallpaperUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), - Binder.getCallingUid(), wallpaperUserId, false, true, "getWallpaper", null); + wallpaperUserId = ActivityManager.handleIncomingUser(callingPid, callingUid, + wallpaperUserId, false, true, "getWallpaper", null); if (which != FLAG_SYSTEM && which != FLAG_LOCK) { throw new IllegalArgumentException("Must specify exactly one kind of wallpaper to read"); @@ -2348,6 +2354,22 @@ public class WallpaperManagerService extends IWallpaperManager.Stub return mContext.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED; } + private boolean hasAppOpPermission(String permission, int callingUid, String callingPackage, + String attributionTag, String message) { + final String op = AppOpsManager.permissionToOp(permission); + final int opMode = mAppOpsManager.noteOpNoThrow(op, callingUid, callingPackage, + attributionTag, message); + switch (opMode) { + case AppOpsManager.MODE_ALLOWED: + case AppOpsManager.MODE_FOREGROUND: + return true; + case AppOpsManager.MODE_DEFAULT: + return hasPermission(permission); + default: + return false; + } + } + @Override public WallpaperInfo getWallpaperInfo(int userId) { return getWallpaperInfoWithFlags(FLAG_SYSTEM, userId); |