Merge "Add list of Administrator UIDs to NetworkCapabilities."

This commit is contained in:
Cody Kesting
2020-01-23 17:52:58 +00:00
committed by Gerrit Code Review
3 changed files with 66 additions and 1 deletions

View File

@@ -35,6 +35,9 @@ 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.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;
@@ -83,6 +86,7 @@ public final class NetworkCapabilities implements Parcelable {
mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED; mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED;
mUids = null; mUids = null;
mEstablishingVpnAppUid = INVALID_UID; mEstablishingVpnAppUid = INVALID_UID;
mAdministratorUids.clear();
mSSID = null; mSSID = null;
mPrivateDnsBroken = false; mPrivateDnsBroken = false;
} }
@@ -101,6 +105,7 @@ public final class NetworkCapabilities implements Parcelable {
mSignalStrength = nc.mSignalStrength; mSignalStrength = nc.mSignalStrength;
setUids(nc.mUids); // Will make the defensive copy setUids(nc.mUids); // Will make the defensive copy
mEstablishingVpnAppUid = nc.mEstablishingVpnAppUid; mEstablishingVpnAppUid = nc.mEstablishingVpnAppUid;
setAdministratorUids(nc.mAdministratorUids);
mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities; mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities;
mSSID = nc.mSSID; mSSID = nc.mSSID;
mPrivateDnsBroken = nc.mPrivateDnsBroken; mPrivateDnsBroken = nc.mPrivateDnsBroken;
@@ -832,6 +837,56 @@ public final class NetworkCapabilities implements Parcelable {
return mEstablishingVpnAppUid; return mEstablishingVpnAppUid;
} }
/**
* UIDs of packages that are administrators of this network, or empty if none.
*
* <p>This field tracks the UIDs of packages that have permission to manage this network.
*
* <p>Network owners will also be listed as administrators.
*
* <p>For NetworkCapability instances being sent from the System Server, this value MUST be
* 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<>();
/**
* Sets the list 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:
* <ul>
* <li>Carrier apps with privileges for the relevant subscription
* <li>Active VPN apps
* <li>Other application groups with a particular Network-related role
* </ul>
*
* <p>In general, user-supplied networks (such as WiFi networks) do not have an administrator.
*
* <p>An app is granted owner privileges over Networks that it supplies. Owner privileges
* implicitly include administrator privileges.
*
* @param administratorUids the UIDs to be set as administrators of this Network.
* @hide
*/
@SystemApi
public void setAdministratorUids(@NonNull final List<Integer> administratorUids) {
mAdministratorUids.clear();
mAdministratorUids.addAll(administratorUids);
}
/**
* Retrieves the list of UIDs that are administrators of this Network.
*
* @return the List of UIDs that are administrators of this Network
* @hide
*/
@NonNull
@SystemApi
public List<Integer> getAdministratorUids() {
return Collections.unmodifiableList(mAdministratorUids);
}
/** /**
* Value indicating that link bandwidth is unspecified. * Value indicating that link bandwidth is unspecified.
* @hide * @hide
@@ -1471,6 +1526,7 @@ public final class NetworkCapabilities implements Parcelable {
public int describeContents() { public int describeContents() {
return 0; return 0;
} }
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(mNetworkCapabilities); dest.writeLong(mNetworkCapabilities);
@@ -1484,6 +1540,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);
} }
public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR = public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR =
@@ -1504,6 +1561,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));
return netCap; return netCap;
} }
@Override @Override
@@ -1557,6 +1615,10 @@ public final class NetworkCapabilities implements Parcelable {
sb.append(" EstablishingAppUid: ").append(mEstablishingVpnAppUid); sb.append(" EstablishingAppUid: ").append(mEstablishingVpnAppUid);
} }
if (!mAdministratorUids.isEmpty()) {
sb.append(" AdministratorUids: ").append(mAdministratorUids);
}
if (null != mSSID) { if (null != mSSID) {
sb.append(" SSID: ").append(mSSID); sb.append(" SSID: ").append(mSSID);
} }

View File

@@ -212,6 +212,7 @@ import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.ConcurrentModificationException; import java.util.ConcurrentModificationException;
import java.util.HashMap; import java.util.HashMap;
@@ -1634,6 +1635,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);
return newNc; return newNc;
} }
@@ -1664,6 +1666,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (!checkSettingsPermission()) { if (!checkSettingsPermission()) {
nc.setSingleUid(Binder.getCallingUid()); nc.setSingleUid(Binder.getCallingUid());
} }
nc.setAdministratorUids(Collections.EMPTY_LIST);
} }
private void restrictBackgroundRequestForCaller(NetworkCapabilities nc) { private void restrictBackgroundRequestForCaller(NetworkCapabilities nc) {

View File

@@ -271,7 +271,7 @@ public class NetworkCapabilitiesTest {
.addCapability(NET_CAPABILITY_NOT_METERED); .addCapability(NET_CAPABILITY_NOT_METERED);
assertParcelingIsLossless(netCap); assertParcelingIsLossless(netCap);
netCap.setSSID(TEST_SSID); netCap.setSSID(TEST_SSID);
assertParcelSane(netCap, 12); assertParcelSane(netCap, 13);
} }
@Test @Test