diff options
| -rw-r--r-- | services/core/java/com/android/server/am/BroadcastSkipPolicy.java | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastSkipPolicy.java b/services/core/java/com/android/server/am/BroadcastSkipPolicy.java index fa5286fcc112..f4a931f89551 100644 --- a/services/core/java/com/android/server/am/BroadcastSkipPolicy.java +++ b/services/core/java/com/android/server/am/BroadcastSkipPolicy.java @@ -289,21 +289,22 @@ public class BroadcastSkipPolicy { if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID && r.requiredPermissions != null && r.requiredPermissions.length > 0) { - final AttributionSource attributionSource; + final AttributionSource[] attributionSources; if (usePermissionManagerForBroadcastDeliveryCheck()) { - attributionSource = - new AttributionSource.Builder(info.activityInfo.applicationInfo.uid) - .setPackageName(info.activityInfo.packageName) - .build(); + attributionSources = createAttributionSourcesForResolveInfo(info); } else { - attributionSource = null; + attributionSources = null; } for (int i = 0; i < r.requiredPermissions.length; i++) { String requiredPermission = r.requiredPermissions[i]; try { if (usePermissionManagerForBroadcastDeliveryCheck()) { - perm = checkPermissionForDataDelivery( - requiredPermission, attributionSource, null /* message */); + perm = hasPermissionForDataDelivery( + requiredPermission, + "Broadcast delivered to " + info.activityInfo.name, + attributionSources) + ? PackageManager.PERMISSION_GRANTED + : PackageManager.PERMISSION_DENIED; } else { perm = AppGlobals.getPackageManager() .checkPermission( @@ -466,10 +467,12 @@ public class BroadcastSkipPolicy { String requiredPermission = r.requiredPermissions[i]; final int perm; if (usePermissionManagerForBroadcastDeliveryCheck()) { - perm = checkPermissionForDataDelivery( + perm = hasPermissionForDataDelivery( requiredPermission, - attributionSource, - "Broadcast delivered to registered receiver " + filter.receiverId); + "Broadcast delivered to registered receiver " + filter.receiverId, + attributionSource) + ? PackageManager.PERMISSION_GRANTED + : PackageManager.PERMISSION_DENIED; } else { perm = checkComponentPermission( requiredPermission, @@ -743,6 +746,7 @@ public class BroadcastSkipPolicy { return false; } + @Nullable private PermissionManager getPermissionManager() { if (mPermissionManager == null) { mPermissionManager = mService.mContext.getSystemService(PermissionManager.class); @@ -750,13 +754,46 @@ public class BroadcastSkipPolicy { return mPermissionManager; } - private int checkPermissionForDataDelivery( - String permission, AttributionSource attributionSource, String message) { + private boolean hasPermissionForDataDelivery( + @NonNull String permission, + @NonNull String message, + @NonNull AttributionSource... attributionSources) { final PermissionManager permissionManager = getPermissionManager(); - if (permissionManager != null) { - return permissionManager.checkPermissionForDataDelivery( - permission, attributionSource, message); + if (permissionManager == null) { + return false; + } + + for (AttributionSource attributionSource : attributionSources) { + final int permissionCheckResult = + permissionManager.checkPermissionForDataDelivery( + permission, attributionSource, message); + if (permissionCheckResult != PackageManager.PERMISSION_GRANTED) { + return false; + } } - return PackageManager.PERMISSION_DENIED; + + return true; + } + + private AttributionSource[] createAttributionSourcesForResolveInfo(ResolveInfo info) { + final String[] attributionTags = info.activityInfo.attributionTags; + if (ArrayUtils.isEmpty(attributionTags)) { + return new AttributionSource[] { + new AttributionSource.Builder(info.activityInfo.applicationInfo.uid) + .setPackageName(info.activityInfo.packageName) + .build() + }; + } + + final AttributionSource[] attributionSources = + new AttributionSource[attributionTags.length]; + for (int i = 0; i < attributionTags.length; i++) { + attributionSources[i] = + new AttributionSource.Builder(info.activityInfo.applicationInfo.uid) + .setPackageName(info.activityInfo.packageName) + .setAttributionTag(attributionTags[i]) + .build(); + } + return attributionSources; } } |