Loading services/core/java/com/android/server/pm/permission/PermissionsState.java +162 −111 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import com.android.internal.annotations.GuardedBy; /** * This class encapsulates the permissions for a package or a shared user. Loading Loading @@ -62,6 +63,9 @@ public final class PermissionsState { private static final int[] NO_GIDS = {}; private final Object mLock = new Object(); @GuardedBy("mLock") private ArrayMap<String, PermissionData> mPermissions; private int[] mGlobalGids = NO_GIDS; Loading Loading @@ -96,6 +100,8 @@ public final class PermissionsState { if (other == this) { return; } synchronized (mLock) { if (mPermissions != null) { if (other.mPermissions == null) { mPermissions = null; Loading @@ -114,6 +120,7 @@ public final class PermissionsState { mPermissions.put(name, new PermissionData(permissionData)); } } } mGlobalGids = NO_GIDS; if (other.mGlobalGids != NO_GIDS) { Loading Loading @@ -153,6 +160,7 @@ public final class PermissionsState { } final PermissionsState other = (PermissionsState) obj; synchronized (mLock) { if (mPermissions == null) { if (other.mPermissions != null) { return false; Loading @@ -160,6 +168,8 @@ public final class PermissionsState { } else if (!mPermissions.equals(other.mPermissions)) { return false; } } if (mPermissionReviewRequired == null) { if (other.mPermissionReviewRequired != null) { return false; Loading Loading @@ -266,19 +276,23 @@ public final class PermissionsState { public boolean hasPermission(String name, int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return false; } PermissionData permissionData = mPermissions.get(name); return permissionData != null && permissionData.isGranted(userId); } } /** * Returns whether the state has any known request for the given permission name, * whether or not it has been granted. */ public boolean hasRequestedPermission(ArraySet<String> names) { synchronized (mLock) { if (mPermissions == null) { return false; } Loading @@ -287,6 +301,8 @@ public final class PermissionsState { return true; } } } return false; } Loading @@ -300,6 +316,7 @@ public final class PermissionsState { public Set<String> getPermissions(int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return Collections.emptySet(); } Loading @@ -324,6 +341,7 @@ public final class PermissionsState { return permissions; } } /** * Gets the state for an install permission or null if no such. Loading Loading @@ -399,14 +417,20 @@ public final class PermissionsState { final boolean mayChangeFlags = flagValues != 0 || flagMask != 0; synchronized (mLock) { if (mPermissions == null) { if (!mayChangeFlags) { return false; } ensurePermissionData(permission); } } PermissionData permissionData = null; synchronized (mLock) { permissionData = mPermissions.get(permission.getName()); } PermissionData permissionData = mPermissions.get(permission.getName()); if (permissionData == null) { if (!mayChangeFlags) { return false; Loading Loading @@ -439,6 +463,7 @@ public final class PermissionsState { } private boolean hasPermissionRequiringReview(int userId) { synchronized (mLock) { final int permissionCount = mPermissions.size(); for (int i = 0; i < permissionCount; i++) { final PermissionData permission = mPermissions.valueAt(i); Loading @@ -447,6 +472,8 @@ public final class PermissionsState { return true; } } } return false; } Loading @@ -454,6 +481,7 @@ public final class PermissionsState { int userId, int flagMask, int flagValues) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return false; } Loading @@ -463,8 +491,10 @@ public final class PermissionsState { PermissionData permissionData = mPermissions.valueAt(i); changed |= permissionData.updateFlags(userId, flagMask, flagValues); } return changed; } } /** * Compute the Linux gids for a given device user from the permissions Loading @@ -479,6 +509,7 @@ public final class PermissionsState { int[] gids = mGlobalGids; synchronized (mLock) { if (mPermissions != null) { final int permissionCount = mPermissions.size(); for (int i = 0; i < permissionCount; i++) { Loading @@ -493,6 +524,7 @@ public final class PermissionsState { } } } } return gids; } Loading @@ -519,11 +551,16 @@ public final class PermissionsState { */ public void reset() { mGlobalGids = NO_GIDS; synchronized (mLock) { mPermissions = null; } mPermissionReviewRequired = null; } private PermissionState getPermissionState(String name, int userId) { synchronized (mLock) { if (mPermissions == null) { return null; } Loading @@ -531,12 +568,15 @@ public final class PermissionsState { if (permissionData == null) { return null; } return permissionData.getPermissionState(userId); } } private List<PermissionState> getPermissionStatesInternal(int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return Collections.emptyList(); } Loading @@ -555,6 +595,7 @@ public final class PermissionsState { return permissionStates; } } private int grantPermission(BasePermission permission, int userId) { if (hasPermission(permission.getName(), userId)) { Loading Loading @@ -589,7 +630,10 @@ public final class PermissionsState { final boolean hasGids = !ArrayUtils.isEmpty(permission.computeGids(userId)); final int[] oldGids = hasGids ? computeGids(userId) : NO_GIDS; PermissionData permissionData = mPermissions.get(permName); PermissionData permissionData = null; synchronized (mLock) { permissionData = mPermissions.get(permName); } if (!permissionData.revoke(userId)) { return PERMISSION_OPERATION_FAILURE; Loading Loading @@ -627,6 +671,8 @@ public final class PermissionsState { private PermissionData ensurePermissionData(BasePermission permission) { final String permName = permission.getName(); synchronized (mLock) { if (mPermissions == null) { mPermissions = new ArrayMap<>(); } Loading @@ -638,7 +684,10 @@ public final class PermissionsState { return permissionData; } } private void ensureNoPermissionData(String name) { synchronized (mLock) { if (mPermissions == null) { return; } Loading @@ -648,6 +697,8 @@ public final class PermissionsState { } } } private static final class PermissionData { private final BasePermission mPerm; private SparseArray<PermissionState> mUserStates = new SparseArray<>(); Loading Loading
services/core/java/com/android/server/pm/permission/PermissionsState.java +162 −111 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import com.android.internal.annotations.GuardedBy; /** * This class encapsulates the permissions for a package or a shared user. Loading Loading @@ -62,6 +63,9 @@ public final class PermissionsState { private static final int[] NO_GIDS = {}; private final Object mLock = new Object(); @GuardedBy("mLock") private ArrayMap<String, PermissionData> mPermissions; private int[] mGlobalGids = NO_GIDS; Loading Loading @@ -96,6 +100,8 @@ public final class PermissionsState { if (other == this) { return; } synchronized (mLock) { if (mPermissions != null) { if (other.mPermissions == null) { mPermissions = null; Loading @@ -114,6 +120,7 @@ public final class PermissionsState { mPermissions.put(name, new PermissionData(permissionData)); } } } mGlobalGids = NO_GIDS; if (other.mGlobalGids != NO_GIDS) { Loading Loading @@ -153,6 +160,7 @@ public final class PermissionsState { } final PermissionsState other = (PermissionsState) obj; synchronized (mLock) { if (mPermissions == null) { if (other.mPermissions != null) { return false; Loading @@ -160,6 +168,8 @@ public final class PermissionsState { } else if (!mPermissions.equals(other.mPermissions)) { return false; } } if (mPermissionReviewRequired == null) { if (other.mPermissionReviewRequired != null) { return false; Loading Loading @@ -266,19 +276,23 @@ public final class PermissionsState { public boolean hasPermission(String name, int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return false; } PermissionData permissionData = mPermissions.get(name); return permissionData != null && permissionData.isGranted(userId); } } /** * Returns whether the state has any known request for the given permission name, * whether or not it has been granted. */ public boolean hasRequestedPermission(ArraySet<String> names) { synchronized (mLock) { if (mPermissions == null) { return false; } Loading @@ -287,6 +301,8 @@ public final class PermissionsState { return true; } } } return false; } Loading @@ -300,6 +316,7 @@ public final class PermissionsState { public Set<String> getPermissions(int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return Collections.emptySet(); } Loading @@ -324,6 +341,7 @@ public final class PermissionsState { return permissions; } } /** * Gets the state for an install permission or null if no such. Loading Loading @@ -399,14 +417,20 @@ public final class PermissionsState { final boolean mayChangeFlags = flagValues != 0 || flagMask != 0; synchronized (mLock) { if (mPermissions == null) { if (!mayChangeFlags) { return false; } ensurePermissionData(permission); } } PermissionData permissionData = null; synchronized (mLock) { permissionData = mPermissions.get(permission.getName()); } PermissionData permissionData = mPermissions.get(permission.getName()); if (permissionData == null) { if (!mayChangeFlags) { return false; Loading Loading @@ -439,6 +463,7 @@ public final class PermissionsState { } private boolean hasPermissionRequiringReview(int userId) { synchronized (mLock) { final int permissionCount = mPermissions.size(); for (int i = 0; i < permissionCount; i++) { final PermissionData permission = mPermissions.valueAt(i); Loading @@ -447,6 +472,8 @@ public final class PermissionsState { return true; } } } return false; } Loading @@ -454,6 +481,7 @@ public final class PermissionsState { int userId, int flagMask, int flagValues) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return false; } Loading @@ -463,8 +491,10 @@ public final class PermissionsState { PermissionData permissionData = mPermissions.valueAt(i); changed |= permissionData.updateFlags(userId, flagMask, flagValues); } return changed; } } /** * Compute the Linux gids for a given device user from the permissions Loading @@ -479,6 +509,7 @@ public final class PermissionsState { int[] gids = mGlobalGids; synchronized (mLock) { if (mPermissions != null) { final int permissionCount = mPermissions.size(); for (int i = 0; i < permissionCount; i++) { Loading @@ -493,6 +524,7 @@ public final class PermissionsState { } } } } return gids; } Loading @@ -519,11 +551,16 @@ public final class PermissionsState { */ public void reset() { mGlobalGids = NO_GIDS; synchronized (mLock) { mPermissions = null; } mPermissionReviewRequired = null; } private PermissionState getPermissionState(String name, int userId) { synchronized (mLock) { if (mPermissions == null) { return null; } Loading @@ -531,12 +568,15 @@ public final class PermissionsState { if (permissionData == null) { return null; } return permissionData.getPermissionState(userId); } } private List<PermissionState> getPermissionStatesInternal(int userId) { enforceValidUserId(userId); synchronized (mLock) { if (mPermissions == null) { return Collections.emptyList(); } Loading @@ -555,6 +595,7 @@ public final class PermissionsState { return permissionStates; } } private int grantPermission(BasePermission permission, int userId) { if (hasPermission(permission.getName(), userId)) { Loading Loading @@ -589,7 +630,10 @@ public final class PermissionsState { final boolean hasGids = !ArrayUtils.isEmpty(permission.computeGids(userId)); final int[] oldGids = hasGids ? computeGids(userId) : NO_GIDS; PermissionData permissionData = mPermissions.get(permName); PermissionData permissionData = null; synchronized (mLock) { permissionData = mPermissions.get(permName); } if (!permissionData.revoke(userId)) { return PERMISSION_OPERATION_FAILURE; Loading Loading @@ -627,6 +671,8 @@ public final class PermissionsState { private PermissionData ensurePermissionData(BasePermission permission) { final String permName = permission.getName(); synchronized (mLock) { if (mPermissions == null) { mPermissions = new ArrayMap<>(); } Loading @@ -638,7 +684,10 @@ public final class PermissionsState { return permissionData; } } private void ensureNoPermissionData(String name) { synchronized (mLock) { if (mPermissions == null) { return; } Loading @@ -648,6 +697,8 @@ public final class PermissionsState { } } } private static final class PermissionData { private final BasePermission mPerm; private SparseArray<PermissionState> mUserStates = new SparseArray<>(); Loading