diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/PermissionManagerService.java | 18 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/PermissionSettings.java | 15 |
2 files changed, 29 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 65a122e89c15..72c8b22f77e7 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -843,7 +843,23 @@ public class PermissionManagerService extends IPermissionManager.Stub { private boolean checkSinglePermissionInternal(int uid, @NonNull PermissionsState permissionsState, @NonNull String permissionName) { - if (!permissionsState.hasPermission(permissionName, UserHandle.getUserId(uid))) { + boolean hasPermission = permissionsState.hasPermission(permissionName, + UserHandle.getUserId(uid)); + + if (!hasPermission && mSettings.isPermissionRuntime(permissionName)) { + final String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid); + final int packageNamesSize = packageNames != null ? packageNames.length : 0; + for (int i = 0; i < packageNamesSize; i++) { + final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageNames[i]); + if (pkg != null && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M + && pkg.requestedPermissions.contains(permissionName)) { + hasPermission = true; + break; + } + } + } + + if (!hasPermission) { return false; } diff --git a/services/core/java/com/android/server/pm/permission/PermissionSettings.java b/services/core/java/com/android/server/pm/permission/PermissionSettings.java index 920803241b49..3d8cf2ddc2cc 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionSettings.java +++ b/services/core/java/com/android/server/pm/permission/PermissionSettings.java @@ -18,13 +18,11 @@ package com.android.server.pm.permission; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.Context; import android.content.pm.PackageParser; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; -import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.XmlUtils; import com.android.server.pm.DumpState; @@ -37,7 +35,6 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.io.PrintWriter; import java.util.Collection; -import java.util.Set; /** * Permissions and other related data. This class is not meant for @@ -249,6 +246,18 @@ public class PermissionSettings { } } + /** + * Check whether a permission is runtime. + * + * @see BasePermission#isRuntime() + */ + public boolean isPermissionRuntime(@NonNull String permName) { + synchronized (mLock) { + final BasePermission bp = mPermissions.get(permName); + return (bp != null && bp.isRuntime()); + } + } + public boolean isPermissionInstant(String permName) { synchronized (mLock) { final BasePermission bp = mPermissions.get(permName); |