Change NetworkCapabilities administrator UIDs to be stored as int[].

NetworkCapabilities#mAdministratorUids is used to track the UIDs that
are administrators of the given Network. This value was previously
stored as List<Integer>. However, general Android API Council guidelines
recommend using Arrays for primitive values. In order to be consistent
with the guidelines, updating the field to use an Array.

Bug: 147903575
Test: atest FrameworksNetTests
Change-Id: I2652a5b0f276b8944454af5cb4b1383a3e054cfa
This commit is contained in:
Cody Kesting
2020-03-16 18:15:28 -07:00
parent 6fb3f0aafa
commit 46a0db809f
4 changed files with 25 additions and 37 deletions

View File

@@ -37,9 +37,7 @@ import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.StringJoiner; import java.util.StringJoiner;
@@ -96,7 +94,7 @@ public final class NetworkCapabilities implements Parcelable {
mTransportInfo = null; mTransportInfo = null;
mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED; mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED;
mUids = null; mUids = null;
mAdministratorUids.clear(); mAdministratorUids = new int[0];
mOwnerUid = Process.INVALID_UID; mOwnerUid = Process.INVALID_UID;
mSSID = null; mSSID = null;
mPrivateDnsBroken = false; mPrivateDnsBroken = false;
@@ -884,10 +882,10 @@ public final class NetworkCapabilities implements Parcelable {
* empty unless the destination is 1) the System Server, or 2) Telephony. In either case, the * empty unless the destination is 1) the System Server, or 2) Telephony. In either case, the
* receiving entity must have the ACCESS_FINE_LOCATION permission and target R+. * receiving entity must have the ACCESS_FINE_LOCATION permission and target R+.
*/ */
private final List<Integer> mAdministratorUids = new ArrayList<>(); private int[] mAdministratorUids = new int[0];
/** /**
* Sets the list of UIDs that are administrators of this network. * Sets the int[] of UIDs that are administrators of this network.
* *
* <p>UIDs included in administratorUids gain administrator privileges over this Network. * <p>UIDs included in administratorUids gain administrator privileges over this Network.
* Examples of UIDs that should be included in administratorUids are: * Examples of UIDs that should be included in administratorUids are:
@@ -907,23 +905,21 @@ public final class NetworkCapabilities implements Parcelable {
*/ */
@NonNull @NonNull
@SystemApi @SystemApi
public NetworkCapabilities setAdministratorUids( public NetworkCapabilities setAdministratorUids(@NonNull final int[] administratorUids) {
@NonNull final List<Integer> administratorUids) { mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length);
mAdministratorUids.clear();
mAdministratorUids.addAll(administratorUids);
return this; return this;
} }
/** /**
* Retrieves the list of UIDs that are administrators of this Network. * Retrieves the UIDs that are administrators of this Network.
* *
* @return the List of UIDs that are administrators of this Network * @return the int[] of UIDs that are administrators of this Network
* @hide * @hide
*/ */
@NonNull @NonNull
@SystemApi @SystemApi
public List<Integer> getAdministratorUids() { public int[] getAdministratorUids() {
return Collections.unmodifiableList(mAdministratorUids); return Arrays.copyOf(mAdministratorUids, mAdministratorUids.length);
} }
/** /**
@@ -1584,7 +1580,7 @@ public final class NetworkCapabilities implements Parcelable {
dest.writeArraySet(mUids); dest.writeArraySet(mUids);
dest.writeString(mSSID); dest.writeString(mSSID);
dest.writeBoolean(mPrivateDnsBroken); dest.writeBoolean(mPrivateDnsBroken);
dest.writeList(mAdministratorUids); dest.writeIntArray(mAdministratorUids);
dest.writeInt(mOwnerUid); dest.writeInt(mOwnerUid);
dest.writeInt(mRequestorUid); dest.writeInt(mRequestorUid);
dest.writeString(mRequestorPackageName); dest.writeString(mRequestorPackageName);
@@ -1608,7 +1604,7 @@ public final class NetworkCapabilities implements Parcelable {
null /* ClassLoader, null for default */); null /* ClassLoader, null for default */);
netCap.mSSID = in.readString(); netCap.mSSID = in.readString();
netCap.mPrivateDnsBroken = in.readBoolean(); netCap.mPrivateDnsBroken = in.readBoolean();
netCap.setAdministratorUids(in.readArrayList(null)); netCap.setAdministratorUids(in.createIntArray());
netCap.mOwnerUid = in.readInt(); netCap.mOwnerUid = in.readInt();
netCap.mRequestorUid = in.readInt(); netCap.mRequestorUid = in.readInt();
netCap.mRequestorPackageName = in.readString(); netCap.mRequestorPackageName = in.readString();
@@ -1665,8 +1661,8 @@ public final class NetworkCapabilities implements Parcelable {
sb.append(" OwnerUid: ").append(mOwnerUid); sb.append(" OwnerUid: ").append(mOwnerUid);
} }
if (!mAdministratorUids.isEmpty()) { if (mAdministratorUids.length == 0) {
sb.append(" AdministratorUids: ").append(mAdministratorUids); sb.append(" AdministratorUids: ").append(Arrays.toString(mAdministratorUids));
} }
if (null != mSSID) { if (null != mSSID) {

View File

@@ -1666,7 +1666,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (newNc.getNetworkSpecifier() != null) { if (newNc.getNetworkSpecifier() != null) {
newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact()); newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact());
} }
newNc.setAdministratorUids(Collections.EMPTY_LIST); newNc.setAdministratorUids(new int[0]);
return newNc; return newNc;
} }
@@ -1727,7 +1727,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
nc.setSingleUid(callerUid); nc.setSingleUid(callerUid);
} }
nc.setRequestorUidAndPackageName(callerUid, callerPackageName); nc.setRequestorUidAndPackageName(callerUid, callerPackageName);
nc.setAdministratorUids(Collections.EMPTY_LIST); nc.setAdministratorUids(new int[0]);
// Clear owner UID; this can never come from an app. // Clear owner UID; this can never come from an app.
nc.setOwnerUid(INVALID_UID); nc.setOwnerUid(INVALID_UID);
@@ -7864,7 +7864,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void clearNetworkCapabilitiesUids(@NonNull NetworkCapabilities nc) { private void clearNetworkCapabilitiesUids(@NonNull NetworkCapabilities nc) {
nc.setUids(null); nc.setUids(null);
nc.setAdministratorUids(Collections.EMPTY_LIST); nc.setAdministratorUids(new int[0]);
nc.setOwnerUid(Process.INVALID_UID); nc.setOwnerUid(Process.INVALID_UID);
} }
@@ -7911,8 +7911,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
// Administrator UIDs also contains the Owner UID // Administrator UIDs also contains the Owner UID
if (nai.networkCapabilities.getAdministratorUids().contains(callbackUid)) { final int[] administratorUids = nai.networkCapabilities.getAdministratorUids();
return true; for (final int uid : administratorUids) {
if (uid == callbackUid) return true;
} }
return false; return false;

View File

@@ -53,7 +53,6 @@ import java.net.InterfaceAddress;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@@ -250,7 +249,7 @@ class TestNetworkService extends ITestNetworkManager.Stub {
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
nc.setNetworkSpecifier(new StringNetworkSpecifier(iface)); nc.setNetworkSpecifier(new StringNetworkSpecifier(iface));
nc.setAdministratorUids(intArrayToList(administratorUids)); nc.setAdministratorUids(administratorUids);
if (!isMetered) { if (!isMetered) {
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
} }
@@ -293,14 +292,6 @@ class TestNetworkService extends ITestNetworkManager.Stub {
return new TestNetworkAgent(looper, context, ni, nc, lp, callingUid, binder); return new TestNetworkAgent(looper, context, ni, nc, lp, callingUid, binder);
} }
private List<Integer> intArrayToList(@NonNull int[] array) {
final List<Integer> list = new ArrayList<>(array.length);
for (final int i : array) {
list.add(i);
}
return list;
}
/** /**
* Sets up a Network with extremely limited privileges, guarded by the MANAGE_TEST_NETWORKS * Sets up a Network with extremely limited privileges, guarded by the MANAGE_TEST_NETWORKS
* permission. * permission.

View File

@@ -6851,7 +6851,7 @@ public class ConnectivityServiceTest {
@Test @Test
public void testCheckConnectivityDiagnosticsPermissionsNetworkAdministrator() throws Exception { public void testCheckConnectivityDiagnosticsPermissionsNetworkAdministrator() throws Exception {
final NetworkCapabilities nc = new NetworkCapabilities(); final NetworkCapabilities nc = new NetworkCapabilities();
nc.setAdministratorUids(Arrays.asList(Process.myUid())); nc.setAdministratorUids(new int[] {Process.myUid()});
final NetworkAgentInfo naiWithUid = final NetworkAgentInfo naiWithUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, nc, 0, mServiceContext, null, null, null, null, null, null, null, nc, 0, mServiceContext, null, null,
@@ -6873,7 +6873,7 @@ public class ConnectivityServiceTest {
public void testCheckConnectivityDiagnosticsPermissionsFails() throws Exception { public void testCheckConnectivityDiagnosticsPermissionsFails() throws Exception {
final NetworkCapabilities nc = new NetworkCapabilities(); final NetworkCapabilities nc = new NetworkCapabilities();
nc.setOwnerUid(Process.myUid()); nc.setOwnerUid(Process.myUid());
nc.setAdministratorUids(Arrays.asList(Process.myUid())); nc.setAdministratorUids(new int[] {Process.myUid()});
final NetworkAgentInfo naiWithUid = final NetworkAgentInfo naiWithUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, nc, 0, mServiceContext, null, null, null, null, null, null, null, nc, 0, mServiceContext, null, null,
@@ -6926,7 +6926,7 @@ public class ConnectivityServiceTest {
argThat(report -> { argThat(report -> {
final NetworkCapabilities nc = report.getNetworkCapabilities(); final NetworkCapabilities nc = report.getNetworkCapabilities();
return nc.getUids() == null return nc.getUids() == null
&& nc.getAdministratorUids().isEmpty() && nc.getAdministratorUids().length == 0
&& nc.getOwnerUid() == Process.INVALID_UID; && nc.getOwnerUid() == Process.INVALID_UID;
})); }));
} }
@@ -6947,7 +6947,7 @@ public class ConnectivityServiceTest {
argThat(report -> { argThat(report -> {
final NetworkCapabilities nc = report.getNetworkCapabilities(); final NetworkCapabilities nc = report.getNetworkCapabilities();
return nc.getUids() == null return nc.getUids() == null
&& nc.getAdministratorUids().isEmpty() && nc.getAdministratorUids().length == 0
&& nc.getOwnerUid() == Process.INVALID_UID; && nc.getOwnerUid() == Process.INVALID_UID;
})); }));
} }