Loading core/java/android/net/UidRange.java +9 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.os.UserHandle.PER_USER_RANGE; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import java.util.Collection; Loading @@ -45,6 +46,14 @@ public final class UidRange implements Parcelable { return new UidRange(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1); } /** Creates a UidRange for the specified user. */ public static UidRange createForUser(UserHandle user) { final UserHandle nextUser = UserHandle.of(user.getIdentifier() + 1); final int start = UserHandle.getUid(user, 0 /* appId */); final int end = UserHandle.getUid(nextUser, 0) - 1; return new UidRange(start, end); } /** Returns the smallest user Id which is contained in this UidRange */ public int getStartUser() { return start / PER_USER_RANGE; Loading services/core/java/com/android/server/ConnectivityService.java +12 −9 Original line number Diff line number Diff line Loading @@ -4973,12 +4973,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } } private void onUserAdded(int userId) { mPermissionMonitor.onUserAdded(userId); private void onUserAdded(UserHandle user) { mPermissionMonitor.onUserAdded(user); } private void onUserRemoved(int userId) { mPermissionMonitor.onUserRemoved(userId); private void onUserRemoved(UserHandle user) { mPermissionMonitor.onUserRemoved(user); } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { Loading @@ -4986,15 +4986,18 @@ public class ConnectivityService extends IConnectivityManager.Stub public void onReceive(Context context, Intent intent) { ensureRunningOnConnectivityServiceThread(); final String action = intent.getAction(); final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); final UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); // UserId should be filled for below intents, check the existence. if (userId == UserHandle.USER_NULL) return; // User should be filled for below intents, check the existence. if (user == null) { Log.wtf(TAG, intent.getAction() + " broadcast without EXTRA_USER"); return; } if (Intent.ACTION_USER_ADDED.equals(action)) { onUserAdded(userId); onUserAdded(user); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { onUserRemoved(userId); onUserRemoved(user); } else { Log.wtf(TAG, "received unexpected intent: " + action); } Loading services/core/java/com/android/server/connectivity/PermissionMonitor.java +10 −23 Original line number Diff line number Diff line Loading @@ -83,9 +83,8 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse private final INetd mNetd; private final Dependencies mDeps; // Values are User IDs. @GuardedBy("this") private final Set<Integer> mUsers = new HashSet<>(); private final Set<UserHandle> mUsers = new HashSet<>(); // Keys are app uids. Values are true for SYSTEM permission and false for NETWORK permission. @GuardedBy("this") Loading Loading @@ -173,10 +172,7 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms); } final List<UserHandle> users = mUserManager.getUserHandles(true /* excludeDying */); for (UserHandle user : users) { mUsers.add(user.getIdentifier()); } mUsers.addAll(mUserManager.getUserHandles(true /* excludeDying */)); final SparseArray<ArraySet<String>> systemPermission = SystemConfig.getInstance().getSystemPermissions(); Loading Loading @@ -259,16 +255,15 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse return array; } private void update(Set<Integer> users, Map<Integer, Boolean> apps, boolean add) { private void update(Set<UserHandle> users, Map<Integer, Boolean> apps, boolean add) { List<Integer> network = new ArrayList<>(); List<Integer> system = new ArrayList<>(); for (Entry<Integer, Boolean> app : apps.entrySet()) { List<Integer> list = app.getValue() ? system : network; for (int user : users) { final UserHandle handle = UserHandle.of(user); if (handle == null) continue; for (UserHandle user : users) { if (user == null) continue; list.add(UserHandle.getUid(handle, app.getKey())); list.add(UserHandle.getUid(user, app.getKey())); } } try { Loading @@ -291,14 +286,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse * * @hide */ public synchronized void onUserAdded(int user) { if (user < 0) { loge("Invalid user in onUserAdded: " + user); return; } public synchronized void onUserAdded(@NonNull UserHandle user) { mUsers.add(user); Set<Integer> users = new HashSet<>(); Set<UserHandle> users = new HashSet<>(); users.add(user); update(users, mApps, true); } Loading @@ -310,14 +301,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse * * @hide */ public synchronized void onUserRemoved(int user) { if (user < 0) { loge("Invalid user in onUserRemoved: " + user); return; } public synchronized void onUserRemoved(@NonNull UserHandle user) { mUsers.remove(user); Set<Integer> users = new HashSet<>(); Set<UserHandle> users = new HashSet<>(); users.add(user); update(users, mApps, false); } Loading tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java +32 −32 Original line number Diff line number Diff line Loading @@ -89,8 +89,8 @@ import java.util.Set; @RunWith(AndroidJUnit4.class) @SmallTest public class PermissionMonitorTest { private static final int MOCK_USER1 = 0; private static final int MOCK_USER2 = 1; private static final UserHandle MOCK_USER1 = UserHandle.of(0); private static final UserHandle MOCK_USER2 = UserHandle.of(1); private static final int MOCK_UID1 = 10001; private static final int MOCK_UID2 = 10086; private static final int SYSTEM_UID1 = 1000; Loading Loading @@ -123,10 +123,7 @@ public class PermissionMonitorTest { when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); when(mUserManager.getUserHandles(eq(true))).thenReturn( Arrays.asList(new UserHandle[] { new UserHandle(MOCK_USER1), new UserHandle(MOCK_USER2), })); Arrays.asList(new UserHandle[] { MOCK_USER1, MOCK_USER2 })); mPermissionMonitor = spy(new PermissionMonitor(mContext, mNetdService, mDeps)); Loading Loading @@ -184,7 +181,8 @@ public class PermissionMonitorTest { return packageInfo; } private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid, int userId) { private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid, UserHandle user) { final PackageInfo pkgInfo; if (hasSystemPermission) { pkgInfo = systemPackageInfoWithPermissions( Loading @@ -192,7 +190,7 @@ public class PermissionMonitorTest { } else { pkgInfo = packageInfoWithPermissions(REQUESTED_PERMISSION_GRANTED, new String[] {}, ""); } pkgInfo.applicationInfo.uid = UserHandle.getUid(userId, UserHandle.getAppId(uid)); pkgInfo.applicationInfo.uid = UserHandle.getUid(user, UserHandle.getAppId(uid)); return pkgInfo; } Loading Loading @@ -382,8 +380,8 @@ public class PermissionMonitorTest { }).when(mockNetd).networkClearPermissionForUser(any(int[].class)); } public void expectPermission(Boolean permission, int[] users, int[] apps) { for (final int user : users) { public void expectPermission(Boolean permission, UserHandle[] users, int[] apps) { for (final UserHandle user : users) { for (final int app : apps) { final int uid = UserHandle.getUid(user, app); if (!mApps.containsKey(uid)) { Loading @@ -396,8 +394,8 @@ public class PermissionMonitorTest { } } public void expectNoPermission(int[] users, int[] apps) { for (final int user : users) { public void expectNoPermission(UserHandle[] users, int[] apps) { for (final UserHandle user : users) { for (final int app : apps) { final int uid = UserHandle.getUid(user, app); if (mApps.containsKey(uid)) { Loading Loading @@ -425,46 +423,48 @@ public class PermissionMonitorTest { // Add SYSTEM_PACKAGE2, expect only have network permission. mPermissionMonitor.onUserAdded(MOCK_USER1); addPackageForUsers(new int[]{MOCK_USER1}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1}, new int[]{SYSTEM_UID}); addPackageForUsers(new UserHandle[]{MOCK_USER1}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1}, new int[]{SYSTEM_UID}); // Add SYSTEM_PACKAGE1, expect permission escalate. addPackageForUsers(new int[]{MOCK_USER1}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1}, new int[]{SYSTEM_UID}); addPackageForUsers(new UserHandle[]{MOCK_USER1}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1}, new int[]{SYSTEM_UID}); mPermissionMonitor.onUserAdded(MOCK_USER2); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); addPackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1, MOCK_USER2}, addPackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); // Remove MOCK_UID1, expect no permission left for all user. mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1); removePackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); // Remove SYSTEM_PACKAGE1, expect permission downgrade. when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(new String[]{SYSTEM_PACKAGE2}); removePackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1, MOCK_USER2}, removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); mPermissionMonitor.onUserRemoved(MOCK_USER1); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER2}, new int[]{SYSTEM_UID}); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER2}, new int[]{SYSTEM_UID}); // Remove all packages, expect no permission left. when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(new String[]{}); removePackageForUsers(new int[]{MOCK_USER2}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, removePackageForUsers(new UserHandle[]{MOCK_USER2}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID, MOCK_UID1}); // Remove last user, expect no redundant clearPermission is invoked. mPermissionMonitor.onUserRemoved(MOCK_USER2); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID, MOCK_UID1}); } Loading Loading @@ -548,14 +548,14 @@ public class PermissionMonitorTest { // Normal package add/remove operations will trigger multiple intent for uids corresponding to // each user. To simulate generic package operations, the onPackageAdded/Removed will need to be // called multiple times with the uid corresponding to each user. private void addPackageForUsers(int[] users, String packageName, int uid) { for (final int user : users) { private void addPackageForUsers(UserHandle[] users, String packageName, int uid) { for (final UserHandle user : users) { mPermissionMonitor.onPackageAdded(packageName, UserHandle.getUid(user, uid)); } } private void removePackageForUsers(int[] users, String packageName, int uid) { for (final int user : users) { private void removePackageForUsers(UserHandle[] users, String packageName, int uid) { for (final UserHandle user : users) { mPermissionMonitor.onPackageRemoved(packageName, UserHandle.getUid(user, uid)); } } Loading Loading
core/java/android/net/UidRange.java +9 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.os.UserHandle.PER_USER_RANGE; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import java.util.Collection; Loading @@ -45,6 +46,14 @@ public final class UidRange implements Parcelable { return new UidRange(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1); } /** Creates a UidRange for the specified user. */ public static UidRange createForUser(UserHandle user) { final UserHandle nextUser = UserHandle.of(user.getIdentifier() + 1); final int start = UserHandle.getUid(user, 0 /* appId */); final int end = UserHandle.getUid(nextUser, 0) - 1; return new UidRange(start, end); } /** Returns the smallest user Id which is contained in this UidRange */ public int getStartUser() { return start / PER_USER_RANGE; Loading
services/core/java/com/android/server/ConnectivityService.java +12 −9 Original line number Diff line number Diff line Loading @@ -4973,12 +4973,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } } private void onUserAdded(int userId) { mPermissionMonitor.onUserAdded(userId); private void onUserAdded(UserHandle user) { mPermissionMonitor.onUserAdded(user); } private void onUserRemoved(int userId) { mPermissionMonitor.onUserRemoved(userId); private void onUserRemoved(UserHandle user) { mPermissionMonitor.onUserRemoved(user); } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { Loading @@ -4986,15 +4986,18 @@ public class ConnectivityService extends IConnectivityManager.Stub public void onReceive(Context context, Intent intent) { ensureRunningOnConnectivityServiceThread(); final String action = intent.getAction(); final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); final UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); // UserId should be filled for below intents, check the existence. if (userId == UserHandle.USER_NULL) return; // User should be filled for below intents, check the existence. if (user == null) { Log.wtf(TAG, intent.getAction() + " broadcast without EXTRA_USER"); return; } if (Intent.ACTION_USER_ADDED.equals(action)) { onUserAdded(userId); onUserAdded(user); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { onUserRemoved(userId); onUserRemoved(user); } else { Log.wtf(TAG, "received unexpected intent: " + action); } Loading
services/core/java/com/android/server/connectivity/PermissionMonitor.java +10 −23 Original line number Diff line number Diff line Loading @@ -83,9 +83,8 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse private final INetd mNetd; private final Dependencies mDeps; // Values are User IDs. @GuardedBy("this") private final Set<Integer> mUsers = new HashSet<>(); private final Set<UserHandle> mUsers = new HashSet<>(); // Keys are app uids. Values are true for SYSTEM permission and false for NETWORK permission. @GuardedBy("this") Loading Loading @@ -173,10 +172,7 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms); } final List<UserHandle> users = mUserManager.getUserHandles(true /* excludeDying */); for (UserHandle user : users) { mUsers.add(user.getIdentifier()); } mUsers.addAll(mUserManager.getUserHandles(true /* excludeDying */)); final SparseArray<ArraySet<String>> systemPermission = SystemConfig.getInstance().getSystemPermissions(); Loading Loading @@ -259,16 +255,15 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse return array; } private void update(Set<Integer> users, Map<Integer, Boolean> apps, boolean add) { private void update(Set<UserHandle> users, Map<Integer, Boolean> apps, boolean add) { List<Integer> network = new ArrayList<>(); List<Integer> system = new ArrayList<>(); for (Entry<Integer, Boolean> app : apps.entrySet()) { List<Integer> list = app.getValue() ? system : network; for (int user : users) { final UserHandle handle = UserHandle.of(user); if (handle == null) continue; for (UserHandle user : users) { if (user == null) continue; list.add(UserHandle.getUid(handle, app.getKey())); list.add(UserHandle.getUid(user, app.getKey())); } } try { Loading @@ -291,14 +286,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse * * @hide */ public synchronized void onUserAdded(int user) { if (user < 0) { loge("Invalid user in onUserAdded: " + user); return; } public synchronized void onUserAdded(@NonNull UserHandle user) { mUsers.add(user); Set<Integer> users = new HashSet<>(); Set<UserHandle> users = new HashSet<>(); users.add(user); update(users, mApps, true); } Loading @@ -310,14 +301,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse * * @hide */ public synchronized void onUserRemoved(int user) { if (user < 0) { loge("Invalid user in onUserRemoved: " + user); return; } public synchronized void onUserRemoved(@NonNull UserHandle user) { mUsers.remove(user); Set<Integer> users = new HashSet<>(); Set<UserHandle> users = new HashSet<>(); users.add(user); update(users, mApps, false); } Loading
tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java +32 −32 Original line number Diff line number Diff line Loading @@ -89,8 +89,8 @@ import java.util.Set; @RunWith(AndroidJUnit4.class) @SmallTest public class PermissionMonitorTest { private static final int MOCK_USER1 = 0; private static final int MOCK_USER2 = 1; private static final UserHandle MOCK_USER1 = UserHandle.of(0); private static final UserHandle MOCK_USER2 = UserHandle.of(1); private static final int MOCK_UID1 = 10001; private static final int MOCK_UID2 = 10086; private static final int SYSTEM_UID1 = 1000; Loading Loading @@ -123,10 +123,7 @@ public class PermissionMonitorTest { when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); when(mUserManager.getUserHandles(eq(true))).thenReturn( Arrays.asList(new UserHandle[] { new UserHandle(MOCK_USER1), new UserHandle(MOCK_USER2), })); Arrays.asList(new UserHandle[] { MOCK_USER1, MOCK_USER2 })); mPermissionMonitor = spy(new PermissionMonitor(mContext, mNetdService, mDeps)); Loading Loading @@ -184,7 +181,8 @@ public class PermissionMonitorTest { return packageInfo; } private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid, int userId) { private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid, UserHandle user) { final PackageInfo pkgInfo; if (hasSystemPermission) { pkgInfo = systemPackageInfoWithPermissions( Loading @@ -192,7 +190,7 @@ public class PermissionMonitorTest { } else { pkgInfo = packageInfoWithPermissions(REQUESTED_PERMISSION_GRANTED, new String[] {}, ""); } pkgInfo.applicationInfo.uid = UserHandle.getUid(userId, UserHandle.getAppId(uid)); pkgInfo.applicationInfo.uid = UserHandle.getUid(user, UserHandle.getAppId(uid)); return pkgInfo; } Loading Loading @@ -382,8 +380,8 @@ public class PermissionMonitorTest { }).when(mockNetd).networkClearPermissionForUser(any(int[].class)); } public void expectPermission(Boolean permission, int[] users, int[] apps) { for (final int user : users) { public void expectPermission(Boolean permission, UserHandle[] users, int[] apps) { for (final UserHandle user : users) { for (final int app : apps) { final int uid = UserHandle.getUid(user, app); if (!mApps.containsKey(uid)) { Loading @@ -396,8 +394,8 @@ public class PermissionMonitorTest { } } public void expectNoPermission(int[] users, int[] apps) { for (final int user : users) { public void expectNoPermission(UserHandle[] users, int[] apps) { for (final UserHandle user : users) { for (final int app : apps) { final int uid = UserHandle.getUid(user, app); if (mApps.containsKey(uid)) { Loading Loading @@ -425,46 +423,48 @@ public class PermissionMonitorTest { // Add SYSTEM_PACKAGE2, expect only have network permission. mPermissionMonitor.onUserAdded(MOCK_USER1); addPackageForUsers(new int[]{MOCK_USER1}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1}, new int[]{SYSTEM_UID}); addPackageForUsers(new UserHandle[]{MOCK_USER1}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1}, new int[]{SYSTEM_UID}); // Add SYSTEM_PACKAGE1, expect permission escalate. addPackageForUsers(new int[]{MOCK_USER1}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1}, new int[]{SYSTEM_UID}); addPackageForUsers(new UserHandle[]{MOCK_USER1}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1}, new int[]{SYSTEM_UID}); mPermissionMonitor.onUserAdded(MOCK_USER2); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); addPackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectPermission(SYSTEM, new int[]{MOCK_USER1, MOCK_USER2}, addPackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectPermission(SYSTEM, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); // Remove MOCK_UID1, expect no permission left for all user. mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1); removePackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1); mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{MOCK_UID1}); // Remove SYSTEM_PACKAGE1, expect permission downgrade. when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(new String[]{SYSTEM_PACKAGE2}); removePackageForUsers(new int[]{MOCK_USER1, MOCK_USER2}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER1, MOCK_USER2}, removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, SYSTEM_PACKAGE1, SYSTEM_UID); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID}); mPermissionMonitor.onUserRemoved(MOCK_USER1); mNetdMonitor.expectPermission(NETWORK, new int[]{MOCK_USER2}, new int[]{SYSTEM_UID}); mNetdMonitor.expectPermission(NETWORK, new UserHandle[]{MOCK_USER2}, new int[]{SYSTEM_UID}); // Remove all packages, expect no permission left. when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(new String[]{}); removePackageForUsers(new int[]{MOCK_USER2}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, removePackageForUsers(new UserHandle[]{MOCK_USER2}, SYSTEM_PACKAGE2, SYSTEM_UID); mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID, MOCK_UID1}); // Remove last user, expect no redundant clearPermission is invoked. mPermissionMonitor.onUserRemoved(MOCK_USER2); mNetdMonitor.expectNoPermission(new int[]{MOCK_USER1, MOCK_USER2}, mNetdMonitor.expectNoPermission(new UserHandle[]{MOCK_USER1, MOCK_USER2}, new int[]{SYSTEM_UID, MOCK_UID1}); } Loading Loading @@ -548,14 +548,14 @@ public class PermissionMonitorTest { // Normal package add/remove operations will trigger multiple intent for uids corresponding to // each user. To simulate generic package operations, the onPackageAdded/Removed will need to be // called multiple times with the uid corresponding to each user. private void addPackageForUsers(int[] users, String packageName, int uid) { for (final int user : users) { private void addPackageForUsers(UserHandle[] users, String packageName, int uid) { for (final UserHandle user : users) { mPermissionMonitor.onPackageAdded(packageName, UserHandle.getUid(user, uid)); } } private void removePackageForUsers(int[] users, String packageName, int uid) { for (final int user : users) { private void removePackageForUsers(UserHandle[] users, String packageName, int uid) { for (final UserHandle user : users) { mPermissionMonitor.onPackageRemoved(packageName, UserHandle.getUid(user, uid)); } } Loading