Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8fcc7683 authored by Cody Kesting's avatar Cody Kesting
Browse files

Change NetworkCapabilties 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
Merged-In: I2652a5b0f276b8944454af5cb4b1383a3e054cfa
parent c070b1de
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4659,11 +4659,11 @@ package android.net {
  }
  public final class NetworkCapabilities implements android.os.Parcelable {
    method @NonNull public java.util.List<java.lang.Integer> getAdministratorUids();
    method @NonNull public int[] getAdministratorUids();
    method @Nullable public String getSSID();
    method @NonNull public int[] getTransportTypes();
    method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities);
    method @NonNull public android.net.NetworkCapabilities setAdministratorUids(@NonNull java.util.List<java.lang.Integer>);
    method @NonNull public android.net.NetworkCapabilities setAdministratorUids(@NonNull int[]);
    method @NonNull public android.net.NetworkCapabilities setRequestorPackageName(@NonNull String);
    method @NonNull public android.net.NetworkCapabilities setRequestorUid(int);
    method @NonNull public android.net.NetworkCapabilities setSSID(@Nullable String);
+14 −18
Original line number Diff line number Diff line
@@ -37,9 +37,7 @@ import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
import java.util.Objects;
import java.util.Set;
import java.util.StringJoiner;
@@ -96,7 +94,7 @@ public final class NetworkCapabilities implements Parcelable {
        mTransportInfo = null;
        mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED;
        mUids = null;
        mAdministratorUids.clear();
        mAdministratorUids = new int[0];
        mOwnerUid = Process.INVALID_UID;
        mSSID = null;
        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
     * 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.
     * Examples of UIDs that should be included in administratorUids are:
@@ -907,23 +905,21 @@ public final class NetworkCapabilities implements Parcelable {
     */
    @NonNull
    @SystemApi
    public NetworkCapabilities setAdministratorUids(
            @NonNull final List<Integer> administratorUids) {
        mAdministratorUids.clear();
        mAdministratorUids.addAll(administratorUids);
    public NetworkCapabilities setAdministratorUids(@NonNull final int[] administratorUids) {
        mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length);
        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
     */
    @NonNull
    @SystemApi
    public List<Integer> getAdministratorUids() {
        return Collections.unmodifiableList(mAdministratorUids);
    public int[] getAdministratorUids() {
        return Arrays.copyOf(mAdministratorUids, mAdministratorUids.length);
    }

    /**
@@ -1584,7 +1580,7 @@ public final class NetworkCapabilities implements Parcelable {
        dest.writeArraySet(mUids);
        dest.writeString(mSSID);
        dest.writeBoolean(mPrivateDnsBroken);
        dest.writeList(mAdministratorUids);
        dest.writeIntArray(mAdministratorUids);
        dest.writeInt(mOwnerUid);
        dest.writeInt(mRequestorUid);
        dest.writeString(mRequestorPackageName);
@@ -1608,7 +1604,7 @@ public final class NetworkCapabilities implements Parcelable {
                        null /* ClassLoader, null for default */);
                netCap.mSSID = in.readString();
                netCap.mPrivateDnsBroken = in.readBoolean();
                netCap.setAdministratorUids(in.readArrayList(null));
                netCap.setAdministratorUids(in.createIntArray());
                netCap.mOwnerUid = in.readInt();
                netCap.mRequestorUid = in.readInt();
                netCap.mRequestorPackageName = in.readString();
@@ -1665,8 +1661,8 @@ public final class NetworkCapabilities implements Parcelable {
            sb.append(" OwnerUid: ").append(mOwnerUid);
        }

        if (!mAdministratorUids.isEmpty()) {
            sb.append(" AdministratorUids: ").append(mAdministratorUids);
        if (mAdministratorUids.length == 0) {
            sb.append(" AdministratorUids: ").append(Arrays.toString(mAdministratorUids));
        }

        if (null != mSSID) {
+6 −5
Original line number Diff line number Diff line
@@ -1668,7 +1668,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        if (newNc.getNetworkSpecifier() != null) {
            newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact());
        }
        newNc.setAdministratorUids(Collections.EMPTY_LIST);
        newNc.setAdministratorUids(new int[0]);

        return newNc;
    }
@@ -1729,7 +1729,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            nc.setSingleUid(callerUid);
        }
        nc.setRequestorUidAndPackageName(callerUid, callerPackageName);
        nc.setAdministratorUids(Collections.EMPTY_LIST);
        nc.setAdministratorUids(new int[0]);

        // Clear owner UID; this can never come from an app.
        nc.setOwnerUid(INVALID_UID);
@@ -7857,7 +7857,7 @@ public class ConnectivityService extends IConnectivityManager.Stub

    private void clearNetworkCapabilitiesUids(@NonNull NetworkCapabilities nc) {
        nc.setUids(null);
        nc.setAdministratorUids(Collections.EMPTY_LIST);
        nc.setAdministratorUids(new int[0]);
        nc.setOwnerUid(Process.INVALID_UID);
    }

@@ -7904,8 +7904,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }

        // Administrator UIDs also contains the Owner UID
        if (nai.networkCapabilities.getAdministratorUids().contains(callbackUid)) {
            return true;
        final int[] administratorUids = nai.networkCapabilities.getAdministratorUids();
        for (final int uid : administratorUids) {
            if (uid == callbackUid) return true;
        }

        return false;
+1 −10
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
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_RESTRICTED);
        nc.setNetworkSpecifier(new StringNetworkSpecifier(iface));
        nc.setAdministratorUids(intArrayToList(administratorUids));
        nc.setAdministratorUids(administratorUids);
        if (!isMetered) {
            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);
    }

    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
     * permission.
+4 −4
Original line number Diff line number Diff line
@@ -6847,7 +6847,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testCheckConnectivityDiagnosticsPermissionsNetworkAdministrator() throws Exception {
        final NetworkCapabilities nc = new NetworkCapabilities();
        nc.setAdministratorUids(Arrays.asList(Process.myUid()));
        nc.setAdministratorUids(new int[] {Process.myUid()});
        final NetworkAgentInfo naiWithUid =
                new NetworkAgentInfo(
                        null, null, null, null, null, nc, 0, mServiceContext, null, null,
@@ -6869,7 +6869,7 @@ public class ConnectivityServiceTest {
    public void testCheckConnectivityDiagnosticsPermissionsFails() throws Exception {
        final NetworkCapabilities nc = new NetworkCapabilities();
        nc.setOwnerUid(Process.myUid());
        nc.setAdministratorUids(Arrays.asList(Process.myUid()));
        nc.setAdministratorUids(new int[] {Process.myUid()});
        final NetworkAgentInfo naiWithUid =
                new NetworkAgentInfo(
                        null, null, null, null, null, nc, 0, mServiceContext, null, null,
@@ -6922,7 +6922,7 @@ public class ConnectivityServiceTest {
                argThat(report -> {
                    final NetworkCapabilities nc = report.getNetworkCapabilities();
                    return nc.getUids() == null
                            && nc.getAdministratorUids().isEmpty()
                            && nc.getAdministratorUids().length == 0
                            && nc.getOwnerUid() == Process.INVALID_UID;
                }));
    }
@@ -6943,7 +6943,7 @@ public class ConnectivityServiceTest {
                argThat(report -> {
                    final NetworkCapabilities nc = report.getNetworkCapabilities();
                    return nc.getUids() == null
                            && nc.getAdministratorUids().isEmpty()
                            && nc.getAdministratorUids().length == 0
                            && nc.getOwnerUid() == Process.INVALID_UID;
                }));
    }