Merge "Change NetworkCapabilties administrator UIDs to be stored as int[]."

This commit is contained in:
Cody Kesting
2020-03-19 18:09:26 +00:00
committed by Gerrit Code Review
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.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) {

View File

@@ -1671,7 +1671,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;
}
@@ -1732,7 +1732,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);
@@ -7902,7 +7902,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);
}
@@ -7952,8 +7952,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;

View File

@@ -56,7 +56,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;
@@ -251,7 +250,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);
}
@@ -294,14 +293,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.

View File

@@ -6870,7 +6870,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,
@@ -6892,7 +6892,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,
@@ -6945,7 +6945,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;
}));
}
@@ -6966,7 +6966,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;
}));
}