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

Commit 9dd718c5 authored by Qingxi Li's avatar Qingxi Li Committed by Gerrit Code Review
Browse files

Merge "NetworkRequest: Embed requestor uid & packageName"

parents 04ee8253 3e63df53
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -29160,7 +29160,7 @@ package android.net {
    method @NonNull public android.net.NetworkCapabilities setLinkDownstreamBandwidthKbps(int);
    method @NonNull public android.net.NetworkCapabilities setLinkUpstreamBandwidthKbps(int);
    method @NonNull public android.net.NetworkCapabilities setNetworkSpecifier(@NonNull android.net.NetworkSpecifier);
    method public void setOwnerUid(int);
    method @NonNull public android.net.NetworkCapabilities setOwnerUid(int);
    method @NonNull public android.net.NetworkCapabilities setSignalStrength(int);
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkCapabilities> CREATOR;
+5 −2
Original line number Diff line number Diff line
@@ -4649,7 +4649,9 @@ package android.net {
    method @Nullable public String getSSID();
    method @NonNull public int[] getTransportTypes();
    method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities);
    method public void setAdministratorUids(@NonNull java.util.List<java.lang.Integer>);
    method @NonNull public android.net.NetworkCapabilities setAdministratorUids(@NonNull java.util.List<java.lang.Integer>);
    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);
    method @NonNull public android.net.NetworkCapabilities setTransportInfo(@NonNull android.net.TransportInfo);
    field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
@@ -4701,6 +4703,8 @@ package android.net {
  }
  public class NetworkRequest implements android.os.Parcelable {
    method @Nullable public String getRequestorPackageName();
    method public int getRequestorUid();
    method public boolean satisfiedBy(@Nullable android.net.NetworkCapabilities);
  }
@@ -4735,7 +4739,6 @@ package android.net {
  }
  public abstract class NetworkSpecifier {
    method public void assertValidFromUid(int);
    method @Nullable public android.net.NetworkSpecifier redact();
    method public abstract boolean satisfiedBy(@Nullable android.net.NetworkSpecifier);
  }
+10 −4
Original line number Diff line number Diff line
@@ -3746,6 +3746,7 @@ public class ConnectivityManager {
        checkCallbackNotNull(callback);
        Preconditions.checkArgument(action == REQUEST || need != null, "null NetworkCapabilities");
        final NetworkRequest request;
        final String callingPackageName = mContext.getOpPackageName();
        try {
            synchronized(sCallbacks) {
                if (callback.networkRequest != null
@@ -3757,10 +3758,11 @@ public class ConnectivityManager {
                Messenger messenger = new Messenger(handler);
                Binder binder = new Binder();
                if (action == LISTEN) {
                    request = mService.listenForNetwork(need, messenger, binder);
                    request = mService.listenForNetwork(
                            need, messenger, binder, callingPackageName);
                } else {
                    request = mService.requestNetwork(
                            need, messenger, timeoutMs, binder, legacyType);
                            need, messenger, timeoutMs, binder, legacyType, callingPackageName);
                }
                if (request != null) {
                    sCallbacks.put(request, callback);
@@ -4033,8 +4035,10 @@ public class ConnectivityManager {
            @NonNull PendingIntent operation) {
        printStackTrace();
        checkPendingIntentNotNull(operation);
        final String callingPackageName = mContext.getOpPackageName();
        try {
            mService.pendingRequestForNetwork(request.networkCapabilities, operation);
            mService.pendingRequestForNetwork(
                    request.networkCapabilities, operation, callingPackageName);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        } catch (ServiceSpecificException e) {
@@ -4146,8 +4150,10 @@ public class ConnectivityManager {
            @NonNull PendingIntent operation) {
        printStackTrace();
        checkPendingIntentNotNull(operation);
        final String callingPackageName = mContext.getOpPackageName();
        try {
            mService.pendingListenForNetwork(request.networkCapabilities, operation);
            mService.pendingListenForNetwork(
                    request.networkCapabilities, operation, callingPackageName);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        } catch (ServiceSpecificException e) {
+5 −4
Original line number Diff line number Diff line
@@ -166,18 +166,19 @@ interface IConnectivityManager
            in int factorySerialNumber);

    NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
            in Messenger messenger, int timeoutSec, in IBinder binder, int legacy);
            in Messenger messenger, int timeoutSec, in IBinder binder, int legacy,
            String callingPackageName);

    NetworkRequest pendingRequestForNetwork(in NetworkCapabilities networkCapabilities,
            in PendingIntent operation);
            in PendingIntent operation, String callingPackageName);

    void releasePendingNetworkRequest(in PendingIntent operation);

    NetworkRequest listenForNetwork(in NetworkCapabilities networkCapabilities,
            in Messenger messenger, in IBinder binder);
            in Messenger messenger, in IBinder binder, String callingPackageName);

    void pendingListenForNetwork(in NetworkCapabilities networkCapabilities,
            in PendingIntent operation);
            in PendingIntent operation, String callingPackageName);

    void releaseNetworkRequest(in NetworkRequest networkRequest);

+154 −7
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.proto.ProtoOutputStream;

@@ -63,6 +64,16 @@ public final class NetworkCapabilities implements Parcelable {
    // Set to true when private DNS is broken.
    private boolean mPrivateDnsBroken;

    /**
     * Uid of the app making the request.
     */
    private int mRequestorUid;

    /**
     * Package name of the app making the request.
     */
    private String mRequestorPackageName;

    public NetworkCapabilities() {
        clearAll();
        mNetworkCapabilities = DEFAULT_CAPABILITIES;
@@ -89,6 +100,8 @@ public final class NetworkCapabilities implements Parcelable {
        mOwnerUid = Process.INVALID_UID;
        mSSID = null;
        mPrivateDnsBroken = false;
        mRequestorUid = Process.INVALID_UID;
        mRequestorPackageName = null;
    }

    /**
@@ -109,6 +122,8 @@ public final class NetworkCapabilities implements Parcelable {
        mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities;
        mSSID = nc.mSSID;
        mPrivateDnsBroken = nc.mPrivateDnsBroken;
        mRequestorUid = nc.mRequestorUid;
        mRequestorPackageName = nc.mRequestorPackageName;
    }

    /**
@@ -810,7 +825,7 @@ public final class NetworkCapabilities implements Parcelable {
    }

    /**
     * UID of the app that owns this network, or INVALID_UID if none/unknown.
     * UID of the app that owns this network, or Process#INVALID_UID if none/unknown.
     *
     * <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
@@ -821,8 +836,9 @@ public final class NetworkCapabilities implements Parcelable {
    /**
     * Set the UID of the owner app.
     */
    public void setOwnerUid(final int uid) {
    public @NonNull NetworkCapabilities setOwnerUid(final int uid) {
        mOwnerUid = uid;
        return this;
    }

    /**
@@ -865,9 +881,11 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    @SystemApi
    public void setAdministratorUids(@NonNull final List<Integer> administratorUids) {
    public @NonNull NetworkCapabilities setAdministratorUids(
            @NonNull final List<Integer> administratorUids) {
        mAdministratorUids.clear();
        mAdministratorUids.addAll(administratorUids);
        return this;
    }

    /**
@@ -1385,6 +1403,7 @@ public final class NetworkCapabilities implements Parcelable {
        combineSignalStrength(nc);
        combineUids(nc);
        combineSSIDs(nc);
        combineRequestor(nc);
    }

    /**
@@ -1404,7 +1423,8 @@ public final class NetworkCapabilities implements Parcelable {
                && satisfiedBySpecifier(nc)
                && (onlyImmutable || satisfiedBySignalStrength(nc))
                && (onlyImmutable || satisfiedByUids(nc))
                && (onlyImmutable || satisfiedBySSID(nc)));
                && (onlyImmutable || satisfiedBySSID(nc)))
                && (onlyImmutable || satisfiedByRequestor(nc));
    }

    /**
@@ -1488,7 +1508,7 @@ public final class NetworkCapabilities implements Parcelable {
    public boolean equals(@Nullable Object obj) {
        if (obj == null || (obj instanceof NetworkCapabilities == false)) return false;
        NetworkCapabilities that = (NetworkCapabilities) obj;
        return (equalsNetCapabilities(that)
        return equalsNetCapabilities(that)
                && equalsTransportTypes(that)
                && equalsLinkBandwidths(that)
                && equalsSignalStrength(that)
@@ -1496,7 +1516,8 @@ public final class NetworkCapabilities implements Parcelable {
                && equalsTransportInfo(that)
                && equalsUids(that)
                && equalsSSID(that)
                && equalsPrivateDnsBroken(that));
                && equalsPrivateDnsBroken(that)
                && equalsRequestor(that);
    }

    @Override
@@ -1514,7 +1535,9 @@ public final class NetworkCapabilities implements Parcelable {
                + Objects.hashCode(mUids) * 31
                + Objects.hashCode(mSSID) * 37
                + Objects.hashCode(mTransportInfo) * 41
                + Objects.hashCode(mPrivateDnsBroken) * 43;
                + Objects.hashCode(mPrivateDnsBroken) * 43
                + Objects.hashCode(mRequestorUid) * 47
                + Objects.hashCode(mRequestorPackageName) * 53;
    }

    @Override
@@ -1537,6 +1560,8 @@ public final class NetworkCapabilities implements Parcelable {
        dest.writeBoolean(mPrivateDnsBroken);
        dest.writeList(mAdministratorUids);
        dest.writeInt(mOwnerUid);
        dest.writeInt(mRequestorUid);
        dest.writeString(mRequestorPackageName);
    }

    public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR =
@@ -1559,6 +1584,8 @@ public final class NetworkCapabilities implements Parcelable {
                netCap.mPrivateDnsBroken = in.readBoolean();
                netCap.setAdministratorUids(in.readArrayList(null));
                netCap.mOwnerUid = in.readInt();
                netCap.mRequestorUid = in.readInt();
                netCap.mRequestorPackageName = in.readString();
                return netCap;
            }
            @Override
@@ -1624,6 +1651,9 @@ public final class NetworkCapabilities implements Parcelable {
            sb.append(" Private DNS is broken");
        }

        sb.append(" RequestorUid: ").append(mRequestorUid);
        sb.append(" RequestorPackageName: ").append(mRequestorPackageName);

        sb.append("]");
        return sb.toString();
    }
@@ -1632,6 +1662,7 @@ public final class NetworkCapabilities implements Parcelable {
    private interface NameOf {
        String nameOf(int value);
    }

    /**
     * @hide
     */
@@ -1799,4 +1830,120 @@ public final class NetworkCapabilities implements Parcelable {
    private boolean equalsPrivateDnsBroken(NetworkCapabilities nc) {
        return mPrivateDnsBroken == nc.mPrivateDnsBroken;
    }

    /**
     * Set the uid of the app making the request.
     *
     * Note: This works only for {@link NetworkAgent} instances. Any capabilities passed in
     * via the public {@link ConnectivityManager} API's will have this field overwritten.
     *
     * @param uid UID of the app.
     * @hide
     */
    @SystemApi
    public @NonNull NetworkCapabilities setRequestorUid(int uid) {
        mRequestorUid = uid;
        return this;
    }

    /**
     * @return the uid of the app making the request.
     *
     * Note: This could return {@link Process#INVALID_UID} if the {@link NetworkRequest}
     * object was not obtained from {@link ConnectivityManager}.
     * @hide
     */
    public int getRequestorUid() {
        return mRequestorUid;
    }

    /**
     * Set the package name of the app making the request.
     *
     * Note: This works only for {@link NetworkAgent} instances. Any capabilities passed in
     * via the public {@link ConnectivityManager} API's will have this field overwritten.
     *
     * @param packageName package name of the app.
     * @hide
     */
    @SystemApi
    public @NonNull NetworkCapabilities setRequestorPackageName(@NonNull String packageName) {
        mRequestorPackageName = packageName;
        return this;
    }

    /**
     * @return the package name of the app making the request.
     *
     * Note: This could return {@code null} if the {@link NetworkRequest} object was not obtained
     * from {@link ConnectivityManager}.
     * @hide
     */
    @Nullable
    public String getRequestorPackageName() {
        return mRequestorPackageName;
    }

    /**
     * Set the uid and package name of the app making the request.
     *
     * Note: This is intended to be only invoked from within connectivitiy service.
     *
     * @param uid UID of the app.
     * @param packageName package name of the app.
     * @hide
     */
    public @NonNull NetworkCapabilities setRequestorUidAndPackageName(
            int uid, @NonNull String packageName) {
        return setRequestorUid(uid).setRequestorPackageName(packageName);
    }

    /**
     * Test whether the passed NetworkCapabilities satisfies the requestor restrictions of this
     * capabilities.
     *
     * This method is called on the NetworkCapabilities embedded in a request with the
     * capabilities of an available network. If the available network, sets a specific
     * requestor (by uid and optionally package name), then this will only match a request from the
     * same app. If either of the capabilities have an unset uid or package name, then it matches
     * everything.
     * <p>
     * nc is assumed nonnull. Else, NPE.
     */
    private boolean satisfiedByRequestor(NetworkCapabilities nc) {
        // No uid set, matches everything.
        if (mRequestorUid == Process.INVALID_UID || nc.mRequestorUid == Process.INVALID_UID) {
            return true;
        }
        // uids don't match.
        if (mRequestorUid != nc.mRequestorUid) return false;
        // No package names set, matches everything
        if (null == nc.mRequestorPackageName || null == mRequestorPackageName) return true;
        // check for package name match.
        return TextUtils.equals(mRequestorPackageName, nc.mRequestorPackageName);
    }

    /**
     * Combine requestor info of the capabilities.
     * <p>
     * This is only legal if either the requestor info of this object is reset, or both info are
     * equal.
     * nc is assumed nonnull.
     */
    private void combineRequestor(@NonNull NetworkCapabilities nc) {
        if (mRequestorUid != Process.INVALID_UID && mRequestorUid != nc.mOwnerUid) {
            throw new IllegalStateException("Can't combine two uids");
        }
        if (mRequestorPackageName != null
                && !mRequestorPackageName.equals(nc.mRequestorPackageName)) {
            throw new IllegalStateException("Can't combine two package names");
        }
        setRequestorUid(nc.mRequestorUid);
        setRequestorPackageName(nc.mRequestorPackageName);
    }

    private boolean equalsRequestor(NetworkCapabilities nc) {
        return mRequestorUid == nc.mRequestorUid
                && TextUtils.equals(mRequestorPackageName, nc.mRequestorPackageName);
    }
}
Loading