Add API for apps to check if they are the network owner
This CL extends NetworkCapabilities#mEstablishingVpnAppUid to the network owner app UID and introduces a new public API to get this owner app's UID. Bug: 142072839 Test: atest FrameworksNetTests Change-Id: Id83cdea62b89b586aff74e51e3fee60e53d37d4c
This commit is contained in:
parent
c3ce33eaa9
commit
bb3347b118
1 changed files with 62 additions and 36 deletions
|
|
@ -26,6 +26,7 @@ import android.net.ConnectivityManager.NetworkCallback;
|
|||
import android.os.Build;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.os.Process;
|
||||
import android.util.ArraySet;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
|
|
@ -58,7 +59,6 @@ import java.util.StringJoiner;
|
|||
*/
|
||||
public final class NetworkCapabilities implements Parcelable {
|
||||
private static final String TAG = "NetworkCapabilities";
|
||||
private static final int INVALID_UID = -1;
|
||||
|
||||
// Set to true when private DNS is broken.
|
||||
private boolean mPrivateDnsBroken;
|
||||
|
|
@ -85,8 +85,8 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
mTransportInfo = null;
|
||||
mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED;
|
||||
mUids = null;
|
||||
mEstablishingVpnAppUid = INVALID_UID;
|
||||
mAdministratorUids.clear();
|
||||
mOwnerUid = Process.INVALID_UID;
|
||||
mSSID = null;
|
||||
mPrivateDnsBroken = false;
|
||||
}
|
||||
|
|
@ -104,8 +104,8 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
mTransportInfo = nc.mTransportInfo;
|
||||
mSignalStrength = nc.mSignalStrength;
|
||||
setUids(nc.mUids); // Will make the defensive copy
|
||||
mEstablishingVpnAppUid = nc.mEstablishingVpnAppUid;
|
||||
setAdministratorUids(nc.mAdministratorUids);
|
||||
mOwnerUid = nc.mOwnerUid;
|
||||
mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities;
|
||||
mSSID = nc.mSSID;
|
||||
mPrivateDnsBroken = nc.mPrivateDnsBroken;
|
||||
|
|
@ -810,31 +810,26 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
}
|
||||
|
||||
/**
|
||||
* UID of the app that manages this network, or INVALID_UID if none/unknown.
|
||||
* UID of the app that owns this network, or INVALID_UID if none/unknown.
|
||||
*
|
||||
* This field keeps track of the UID of the app that created this network and is in charge
|
||||
* of managing it. In the practice, it is used to store the UID of VPN apps so it is named
|
||||
* accordingly, but it may be renamed if other mechanisms are offered for third party apps
|
||||
* to create networks.
|
||||
*
|
||||
* Because this field is only used in the services side (and to avoid apps being able to
|
||||
* set this to whatever they want), this field is not parcelled and will not be conserved
|
||||
* across the IPC boundary.
|
||||
* @hide
|
||||
* <p>This field keeps track of the UID of the app that created this network and is in charge of
|
||||
* its lifecycle. This could be the UID of apps such as the Wifi network suggestor, the running
|
||||
* VPN, or Carrier Service app managing a cellular data connection.
|
||||
*/
|
||||
private int mEstablishingVpnAppUid = INVALID_UID;
|
||||
private int mOwnerUid = Process.INVALID_UID;
|
||||
|
||||
/**
|
||||
* Set the UID of the managing app.
|
||||
* @hide
|
||||
* Set the UID of the owner app.
|
||||
*/
|
||||
public void setEstablishingVpnAppUid(final int uid) {
|
||||
mEstablishingVpnAppUid = uid;
|
||||
public void setOwnerUid(final int uid) {
|
||||
mOwnerUid = uid;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public int getEstablishingVpnAppUid() {
|
||||
return mEstablishingVpnAppUid;
|
||||
/**
|
||||
* Retrieves the UID of the owner app.
|
||||
*/
|
||||
public int getOwnerUid() {
|
||||
return mOwnerUid;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1157,7 +1152,7 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
* member is null, then the network is not restricted by app UID. If it's an empty list, then
|
||||
* it means nobody can use it.
|
||||
* As a special exception, the app managing this network (as identified by its UID stored in
|
||||
* mEstablishingVpnAppUid) can always see this network. This is embodied by a special check in
|
||||
* mOwnerUid) can always see this network. This is embodied by a special check in
|
||||
* satisfiedByUids. That still does not mean the network necessarily <strong>applies</strong>
|
||||
* to the app that manages it as determined by #appliesToUid.
|
||||
* <p>
|
||||
|
|
@ -1264,7 +1259,7 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
* in the passed nc (representing the UIDs that this network is available to).
|
||||
* <p>
|
||||
* As a special exception, the UID that created the passed network (as represented by its
|
||||
* mEstablishingVpnAppUid field) always satisfies a NetworkRequest requiring it (of LISTEN
|
||||
* mOwnerUid field) always satisfies a NetworkRequest requiring it (of LISTEN
|
||||
* or REQUEST types alike), even if the network does not apply to it. That is so a VPN app
|
||||
* can see its own network when it listens for it.
|
||||
* <p>
|
||||
|
|
@ -1275,7 +1270,7 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
public boolean satisfiedByUids(@NonNull NetworkCapabilities nc) {
|
||||
if (null == nc.mUids || null == mUids) return true; // The network satisfies everything.
|
||||
for (UidRange requiredRange : mUids) {
|
||||
if (requiredRange.contains(nc.mEstablishingVpnAppUid)) return true;
|
||||
if (requiredRange.contains(nc.mOwnerUid)) return true;
|
||||
if (!nc.appliesToUidRange(requiredRange)) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1541,6 +1536,7 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
dest.writeString(mSSID);
|
||||
dest.writeBoolean(mPrivateDnsBroken);
|
||||
dest.writeList(mAdministratorUids);
|
||||
dest.writeInt(mOwnerUid);
|
||||
}
|
||||
|
||||
public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR =
|
||||
|
|
@ -1562,6 +1558,7 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
netCap.mSSID = in.readString();
|
||||
netCap.mPrivateDnsBroken = in.readBoolean();
|
||||
netCap.setAdministratorUids(in.readArrayList(null));
|
||||
netCap.mOwnerUid = in.readInt();
|
||||
return netCap;
|
||||
}
|
||||
@Override
|
||||
|
|
@ -1611,8 +1608,8 @@ public final class NetworkCapabilities implements Parcelable {
|
|||
sb.append(" Uids: <").append(mUids).append(">");
|
||||
}
|
||||
}
|
||||
if (mEstablishingVpnAppUid != INVALID_UID) {
|
||||
sb.append(" EstablishingAppUid: ").append(mEstablishingVpnAppUid);
|
||||
if (mOwnerUid != Process.INVALID_UID) {
|
||||
sb.append(" OwnerUid: ").append(mOwnerUid);
|
||||
}
|
||||
|
||||
if (!mAdministratorUids.isEmpty()) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue