Merge changes I638ed5cd,I29f15571,I21a22ed1 am: 71996469d2 am: 068f44831d

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1648068

Change-Id: Ia0b6ffa74536e3f20f13282d08bd858fc9e979bf
This commit is contained in:
Lorenzo Colitti
2021-03-23 02:10:45 +00:00
committed by Automerger Merge Worker
6 changed files with 231 additions and 83 deletions

View File

@@ -11,6 +11,7 @@ package android.net {
method @Nullable public android.net.ProxyInfo getGlobalProxy(); method @Nullable public android.net.ProxyInfo getGlobalProxy();
method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange(); method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange();
method @NonNull public static String getPrivateDnsMode(@NonNull android.content.Context); method @NonNull public static String getPrivateDnsMode(@NonNull android.content.Context);
method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackAsUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler); method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback); method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAcceptPartialConnectivity(@NonNull android.net.Network, boolean, boolean); method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAcceptPartialConnectivity(@NonNull android.net.Network, boolean, boolean);

View File

@@ -3700,8 +3700,9 @@ public class ConnectivityManager {
private static final HashMap<NetworkRequest, NetworkCallback> sCallbacks = new HashMap<>(); private static final HashMap<NetworkRequest, NetworkCallback> sCallbacks = new HashMap<>();
private static CallbackHandler sCallbackHandler; private static CallbackHandler sCallbackHandler;
private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, NetworkCallback callback, private NetworkRequest sendRequestForNetwork(int asUid, NetworkCapabilities need,
int timeoutMs, NetworkRequest.Type reqType, int legacyType, CallbackHandler handler) { NetworkCallback callback, int timeoutMs, NetworkRequest.Type reqType, int legacyType,
CallbackHandler handler) {
printStackTrace(); printStackTrace();
checkCallbackNotNull(callback); checkCallbackNotNull(callback);
if (reqType != TRACK_DEFAULT && reqType != TRACK_SYSTEM_DEFAULT && need == null) { if (reqType != TRACK_DEFAULT && reqType != TRACK_SYSTEM_DEFAULT && need == null) {
@@ -3726,8 +3727,8 @@ public class ConnectivityManager {
getAttributionTag()); getAttributionTag());
} else { } else {
request = mService.requestNetwork( request = mService.requestNetwork(
need, reqType.ordinal(), messenger, timeoutMs, binder, legacyType, asUid, need, reqType.ordinal(), messenger, timeoutMs, binder,
callbackFlags, callingPackageName, getAttributionTag()); legacyType, callbackFlags, callingPackageName, getAttributionTag());
} }
if (request != null) { if (request != null) {
sCallbacks.put(request, callback); sCallbacks.put(request, callback);
@@ -3742,6 +3743,12 @@ public class ConnectivityManager {
return request; return request;
} }
private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, NetworkCallback callback,
int timeoutMs, NetworkRequest.Type reqType, int legacyType, CallbackHandler handler) {
return sendRequestForNetwork(Process.INVALID_UID, need, callback, timeoutMs, reqType,
legacyType, handler);
}
/** /**
* Helper function to request a network with a particular legacy type. * Helper function to request a network with a particular legacy type.
* *
@@ -4227,8 +4234,40 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
@NonNull Handler handler) { @NonNull Handler handler) {
registerDefaultNetworkCallbackAsUid(Process.INVALID_UID, networkCallback, handler);
}
/**
* Registers to receive notifications about changes in the default network for the specified
* UID. This may be a physical network or a virtual network, such as a VPN that applies to the
* UID. The callbacks will continue to be called until either the application exits or
* {@link #unregisterNetworkCallback(NetworkCallback)} is called.
*
* <p>To avoid performance issues due to apps leaking callbacks, the system will limit the
* number of outstanding requests to 100 per app (identified by their UID), shared with
* all variants of this method, of {@link #requestNetwork} as well as
* {@link ConnectivityDiagnosticsManager#registerConnectivityDiagnosticsCallback}.
* Requesting a network with this method will count toward this limit. If this limit is
* exceeded, an exception will be thrown. To avoid hitting this issue and to conserve resources,
* make sure to unregister the callbacks with
* {@link #unregisterNetworkCallback(NetworkCallback)}.
*
* @param uid the UID for which to track default network changes.
* @param networkCallback The {@link NetworkCallback} that the system will call as the
* UID's default network changes.
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
* @throws RuntimeException if the app already has too many callbacks registered.
* @hide
*/
@SystemApi(client = MODULE_LIBRARIES)
@SuppressLint({"ExecutorRegistration", "PairedRegistration"})
@RequiresPermission(anyOf = {
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
android.Manifest.permission.NETWORK_SETTINGS})
public void registerDefaultNetworkCallbackAsUid(int uid,
@NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
CallbackHandler cbHandler = new CallbackHandler(handler); CallbackHandler cbHandler = new CallbackHandler(handler);
sendRequestForNetwork(null /* NetworkCapabilities need */, networkCallback, 0, sendRequestForNetwork(uid, null /* need */, networkCallback, 0 /* timeoutMs */,
TRACK_DEFAULT, TYPE_NONE, cbHandler); TRACK_DEFAULT, TYPE_NONE, cbHandler);
} }

View File

@@ -142,7 +142,7 @@ interface IConnectivityManager
in NetworkCapabilities nc, in NetworkScore score, in NetworkAgentConfig config, in NetworkCapabilities nc, in NetworkScore score, in NetworkAgentConfig config,
in int factorySerialNumber); in int factorySerialNumber);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities, int reqType, NetworkRequest requestNetwork(int uid, in NetworkCapabilities networkCapabilities, int reqType,
in Messenger messenger, int timeoutSec, in IBinder binder, int legacy, in Messenger messenger, int timeoutSec, in IBinder binder, int legacy,
int callbackFlags, String callingPackageName, String callingAttributionTag); int callbackFlags, String callingPackageName, String callingAttributionTag);

View File

@@ -1203,7 +1203,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mNetworkRanker = new NetworkRanker(); mNetworkRanker = new NetworkRanker();
final NetworkRequest defaultInternetRequest = createDefaultRequest(); final NetworkRequest defaultInternetRequest = createDefaultRequest();
mDefaultRequest = new NetworkRequestInfo( mDefaultRequest = new NetworkRequestInfo(
defaultInternetRequest, null, Process.myUid(), defaultInternetRequest, null,
new Binder(), NetworkCallback.FLAG_INCLUDE_LOCATION_INFO, new Binder(), NetworkCallback.FLAG_INCLUDE_LOCATION_INFO,
null /* attributionTags */); null /* attributionTags */);
mNetworkRequests.put(defaultInternetRequest, mDefaultRequest); mNetworkRequests.put(defaultInternetRequest, mDefaultRequest);
@@ -1410,8 +1410,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (enable) { if (enable) {
handleRegisterNetworkRequest(new NetworkRequestInfo( handleRegisterNetworkRequest(new NetworkRequestInfo(
networkRequest, null, Process.myUid(), networkRequest, null, new Binder(),
new Binder(),
NetworkCallback.FLAG_INCLUDE_LOCATION_INFO, NetworkCallback.FLAG_INCLUDE_LOCATION_INFO,
null /* attributionTags */)); null /* attributionTags */));
} else { } else {
@@ -1558,7 +1557,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int requestId = nri.getActiveRequest() != null final int requestId = nri.getActiveRequest() != null
? nri.getActiveRequest().requestId : nri.mRequests.get(0).requestId; ? nri.getActiveRequest().requestId : nri.mRequests.get(0).requestId;
mNetworkInfoBlockingLogs.log(String.format( mNetworkInfoBlockingLogs.log(String.format(
"%s %d(%d) on netId %d", action, nri.mUid, requestId, net.getNetId())); "%s %d(%d) on netId %d", action, nri.mAsUid, requestId, net.getNetId()));
} }
/** /**
@@ -2073,6 +2072,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void restrictRequestUidsForCallerAndSetRequestorInfo(NetworkCapabilities nc, private void restrictRequestUidsForCallerAndSetRequestorInfo(NetworkCapabilities nc,
int callerUid, String callerPackageName) { int callerUid, String callerPackageName) {
if (!checkSettingsPermission()) { if (!checkSettingsPermission()) {
// There is no need to track the effective UID of the request here. If the caller lacks
// the settings permission, the effective UID is the same as the calling ID.
nc.setSingleUid(callerUid); nc.setSingleUid(callerUid);
} }
nc.setRequestorUidAndPackageName(callerUid, callerPackageName); nc.setRequestorUidAndPackageName(callerUid, callerPackageName);
@@ -5363,6 +5364,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
boolean mPendingIntentSent; boolean mPendingIntentSent;
@Nullable @Nullable
final Messenger mMessenger; final Messenger mMessenger;
// Information about the caller that caused this object to be created.
@Nullable @Nullable
private final IBinder mBinder; private final IBinder mBinder;
final int mPid; final int mPid;
@@ -5370,6 +5373,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
final @NetworkCallback.Flag int mCallbackFlags; final @NetworkCallback.Flag int mCallbackFlags;
@Nullable @Nullable
final String mCallingAttributionTag; final String mCallingAttributionTag;
// Effective UID of this request. This is different from mUid when a privileged process
// files a request on behalf of another UID. This UID is used to determine blocked status,
// UID matching, and so on. mUid above is used for permission checks and to enforce the
// maximum limit of registered callbacks per UID.
final int mAsUid;
// In order to preserve the mapping of NetworkRequest-to-callback when apps register // In order to preserve the mapping of NetworkRequest-to-callback when apps register
// callbacks using a returned NetworkRequest, the original NetworkRequest needs to be // callbacks using a returned NetworkRequest, the original NetworkRequest needs to be
// maintained for keying off of. This is only a concern when the original nri // maintained for keying off of. This is only a concern when the original nri
@@ -5397,12 +5407,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
return (null == uids) ? new ArraySet<>() : uids; return (null == uids) ? new ArraySet<>() : uids;
} }
NetworkRequestInfo(@NonNull final NetworkRequest r, @Nullable final PendingIntent pi, NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r,
@Nullable String callingAttributionTag) { @Nullable final PendingIntent pi, @Nullable String callingAttributionTag) {
this(Collections.singletonList(r), r, pi, callingAttributionTag); this(asUid, Collections.singletonList(r), r, pi, callingAttributionTag);
} }
NetworkRequestInfo(@NonNull final List<NetworkRequest> r, NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
@NonNull final NetworkRequest requestForCallback, @Nullable final PendingIntent pi, @NonNull final NetworkRequest requestForCallback, @Nullable final PendingIntent pi,
@Nullable String callingAttributionTag) { @Nullable String callingAttributionTag) {
ensureAllNetworkRequestsHaveType(r); ensureAllNetworkRequestsHaveType(r);
@@ -5413,6 +5423,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mBinder = null; mBinder = null;
mPid = getCallingPid(); mPid = getCallingPid();
mUid = mDeps.getCallingUid(); mUid = mDeps.getCallingUid();
mAsUid = asUid;
mNetworkRequestCounter.incrementCountOrThrow(mUid); mNetworkRequestCounter.incrementCountOrThrow(mUid);
/** /**
* Location sensitive data not included in pending intent. Only included in * Location sensitive data not included in pending intent. Only included in
@@ -5422,14 +5433,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
mCallingAttributionTag = callingAttributionTag; mCallingAttributionTag = callingAttributionTag;
} }
NetworkRequestInfo(@NonNull final NetworkRequest r, @Nullable final Messenger m, NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r, @Nullable final Messenger m,
@Nullable final IBinder binder, @Nullable final IBinder binder,
@NetworkCallback.Flag int callbackFlags, @NetworkCallback.Flag int callbackFlags,
@Nullable String callingAttributionTag) { @Nullable String callingAttributionTag) {
this(Collections.singletonList(r), r, m, binder, callbackFlags, callingAttributionTag); this(asUid, Collections.singletonList(r), r, m, binder, callbackFlags,
callingAttributionTag);
} }
NetworkRequestInfo(@NonNull final List<NetworkRequest> r, NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
@NonNull final NetworkRequest requestForCallback, @Nullable final Messenger m, @NonNull final NetworkRequest requestForCallback, @Nullable final Messenger m,
@Nullable final IBinder binder, @Nullable final IBinder binder,
@NetworkCallback.Flag int callbackFlags, @NetworkCallback.Flag int callbackFlags,
@@ -5442,6 +5454,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mBinder = binder; mBinder = binder;
mPid = getCallingPid(); mPid = getCallingPid();
mUid = mDeps.getCallingUid(); mUid = mDeps.getCallingUid();
mAsUid = asUid;
mPendingIntent = null; mPendingIntent = null;
mNetworkRequestCounter.incrementCountOrThrow(mUid); mNetworkRequestCounter.incrementCountOrThrow(mUid);
mCallbackFlags = callbackFlags; mCallbackFlags = callbackFlags;
@@ -5484,18 +5497,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
mBinder = nri.mBinder; mBinder = nri.mBinder;
mPid = nri.mPid; mPid = nri.mPid;
mUid = nri.mUid; mUid = nri.mUid;
mAsUid = nri.mAsUid;
mPendingIntent = nri.mPendingIntent; mPendingIntent = nri.mPendingIntent;
mNetworkRequestCounter.incrementCountOrThrow(mUid); mNetworkRequestCounter.incrementCountOrThrow(mUid);
mCallbackFlags = nri.mCallbackFlags; mCallbackFlags = nri.mCallbackFlags;
mCallingAttributionTag = nri.mCallingAttributionTag; mCallingAttributionTag = nri.mCallingAttributionTag;
} }
NetworkRequestInfo(@NonNull final NetworkRequest r) { NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r) {
this(Collections.singletonList(r)); this(asUid, Collections.singletonList(r));
} }
NetworkRequestInfo(@NonNull final List<NetworkRequest> r) { NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r) {
this(r, r.get(0), null /* pi */, null /* callingAttributionTag */); this(asUid, r, r.get(0), null /* pi */, null /* callingAttributionTag */);
} }
// True if this NRI is being satisfied. It also accounts for if the nri has its satisifer // True if this NRI is being satisfied. It also accounts for if the nri has its satisifer
@@ -5531,9 +5545,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public String toString() { public String toString() {
return "uid/pid:" + mUid + "/" + mPid + " active request Id: " final String asUidString = (mAsUid == mUid) ? "" : " asUid: " + mAsUid;
return "uid/pid:" + mUid + "/" + mPid + asUidString + " activeRequest: "
+ (mActiveRequest == null ? null : mActiveRequest.requestId) + (mActiveRequest == null ? null : mActiveRequest.requestId)
+ " callback request Id: " + " callbackRequest: "
+ mNetworkRequestForCallback.requestId + mNetworkRequestForCallback.requestId
+ " " + mRequests + " " + mRequests
+ (mPendingIntent == null ? "" : " to trigger " + mPendingIntent) + (mPendingIntent == null ? "" : " to trigger " + mPendingIntent)
@@ -5634,7 +5649,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
@Override @Override
public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities, public NetworkRequest requestNetwork(int asUid, NetworkCapabilities networkCapabilities,
int reqTypeInt, Messenger messenger, int timeoutMs, IBinder binder, int reqTypeInt, Messenger messenger, int timeoutMs, IBinder binder,
int legacyType, int callbackFlags, @NonNull String callingPackageName, int legacyType, int callbackFlags, @NonNull String callingPackageName,
@Nullable String callingAttributionTag) { @Nullable String callingAttributionTag) {
@@ -5646,6 +5661,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
final NetworkCapabilities defaultNc = mDefaultRequest.mRequests.get(0).networkCapabilities; final NetworkCapabilities defaultNc = mDefaultRequest.mRequests.get(0).networkCapabilities;
final int callingUid = mDeps.getCallingUid(); final int callingUid = mDeps.getCallingUid();
// Privileged callers can track the default network of another UID by passing in a UID.
if (asUid != Process.INVALID_UID) {
enforceSettingsPermission();
} else {
asUid = callingUid;
}
final NetworkRequest.Type reqType; final NetworkRequest.Type reqType;
try { try {
reqType = NetworkRequest.Type.values()[reqTypeInt]; reqType = NetworkRequest.Type.values()[reqTypeInt];
@@ -5655,10 +5676,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
switch (reqType) { switch (reqType) {
case TRACK_DEFAULT: case TRACK_DEFAULT:
// If the request type is TRACK_DEFAULT, the passed {@code networkCapabilities} // If the request type is TRACK_DEFAULT, the passed {@code networkCapabilities}
// is unused and will be replaced by ones appropriate for the caller. // is unused and will be replaced by ones appropriate for the UID (usually, the
// This allows callers to keep track of the default network for their app. // calling app). This allows callers to keep track of the default network.
networkCapabilities = copyDefaultNetworkCapabilitiesForUid( networkCapabilities = copyDefaultNetworkCapabilitiesForUid(
defaultNc, callingUid, callingPackageName); defaultNc, asUid, callingUid, callingPackageName);
enforceAccessPermission(); enforceAccessPermission();
break; break;
case TRACK_SYSTEM_DEFAULT: case TRACK_SYSTEM_DEFAULT:
@@ -5710,7 +5731,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType, final NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
nextNetworkRequestId(), reqType); nextNetworkRequestId(), reqType);
final NetworkRequestInfo nri = getNriToRegister( final NetworkRequestInfo nri = getNriToRegister(
networkRequest, messenger, binder, callbackFlags, callingAttributionTag); asUid, networkRequest, messenger, binder, callbackFlags,
callingAttributionTag);
if (DBG) log("requestNetwork for " + nri); if (DBG) log("requestNetwork for " + nri);
// For TRACK_SYSTEM_DEFAULT callbacks, the capabilities have been modified since they were // For TRACK_SYSTEM_DEFAULT callbacks, the capabilities have been modified since they were
@@ -5737,25 +5759,27 @@ public class ConnectivityService extends IConnectivityManager.Stub
* requests registered to track the default request. If there is currently a per-app default * requests registered to track the default request. If there is currently a per-app default
* tracking the app requestor, then we need to create a version of this nri that mirrors that of * tracking the app requestor, then we need to create a version of this nri that mirrors that of
* the tracking per-app default so that callbacks are sent to the app requestor appropriately. * the tracking per-app default so that callbacks are sent to the app requestor appropriately.
* @param asUid the uid on behalf of which to file the request. Different from requestorUid
* when a privileged caller is tracking the default network for another uid.
* @param nr the network request for the nri. * @param nr the network request for the nri.
* @param msgr the messenger for the nri. * @param msgr the messenger for the nri.
* @param binder the binder for the nri. * @param binder the binder for the nri.
* @param callingAttributionTag the calling attribution tag for the nri. * @param callingAttributionTag the calling attribution tag for the nri.
* @return the nri to register. * @return the nri to register.
*/ */
private NetworkRequestInfo getNriToRegister(@NonNull final NetworkRequest nr, private NetworkRequestInfo getNriToRegister(final int asUid, @NonNull final NetworkRequest nr,
@Nullable final Messenger msgr, @Nullable final IBinder binder, @Nullable final Messenger msgr, @Nullable final IBinder binder,
@NetworkCallback.Flag int callbackFlags, @NetworkCallback.Flag int callbackFlags,
@Nullable String callingAttributionTag) { @Nullable String callingAttributionTag) {
final List<NetworkRequest> requests; final List<NetworkRequest> requests;
if (NetworkRequest.Type.TRACK_DEFAULT == nr.type) { if (NetworkRequest.Type.TRACK_DEFAULT == nr.type) {
requests = copyDefaultNetworkRequestsForUid( requests = copyDefaultNetworkRequestsForUid(
nr.getRequestorUid(), nr.getRequestorPackageName()); asUid, nr.getRequestorUid(), nr.getRequestorPackageName());
} else { } else {
requests = Collections.singletonList(nr); requests = Collections.singletonList(nr);
} }
return new NetworkRequestInfo( return new NetworkRequestInfo(
requests, nr, msgr, binder, callbackFlags, callingAttributionTag); asUid, requests, nr, msgr, binder, callbackFlags, callingAttributionTag);
} }
private void enforceNetworkRequestPermissions(NetworkCapabilities networkCapabilities, private void enforceNetworkRequestPermissions(NetworkCapabilities networkCapabilities,
@@ -5836,8 +5860,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE,
nextNetworkRequestId(), NetworkRequest.Type.REQUEST); nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
NetworkRequestInfo nri = NetworkRequestInfo nri = new NetworkRequestInfo(callingUid, networkRequest, operation,
new NetworkRequestInfo(networkRequest, operation, callingAttributionTag); callingAttributionTag);
if (DBG) log("pendingRequest for " + nri); if (DBG) log("pendingRequest for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT, mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT,
nri)); nri));
@@ -5904,7 +5928,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(),
NetworkRequest.Type.LISTEN); NetworkRequest.Type.LISTEN);
NetworkRequestInfo nri = NetworkRequestInfo nri =
new NetworkRequestInfo(networkRequest, messenger, binder, callbackFlags, new NetworkRequestInfo(callingUid, networkRequest, messenger, binder, callbackFlags,
callingAttributionTag); callingAttributionTag);
if (VDBG) log("listenForNetwork for " + nri); if (VDBG) log("listenForNetwork for " + nri);
@@ -5929,8 +5953,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(),
NetworkRequest.Type.LISTEN); NetworkRequest.Type.LISTEN);
NetworkRequestInfo nri = NetworkRequestInfo nri = new NetworkRequestInfo(callingUid, networkRequest, operation,
new NetworkRequestInfo(networkRequest, operation, callingAttributionTag); callingAttributionTag);
if (VDBG) log("pendingListenForNetwork for " + nri); if (VDBG) log("pendingListenForNetwork for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri));
@@ -6080,33 +6104,37 @@ public class ConnectivityService extends IConnectivityManager.Stub
/** /**
* Get a copy of the network requests of the default request that is currently tracking the * Get a copy of the network requests of the default request that is currently tracking the
* given uid. * given uid.
* @param asUid the uid on behalf of which to file the request. Different from requestorUid
* when a privileged caller is tracking the default network for another uid.
* @param requestorUid the uid to check the default for. * @param requestorUid the uid to check the default for.
* @param requestorPackageName the requestor's package name. * @param requestorPackageName the requestor's package name.
* @return a copy of the default's NetworkRequest that is tracking the given uid. * @return a copy of the default's NetworkRequest that is tracking the given uid.
*/ */
@NonNull @NonNull
private List<NetworkRequest> copyDefaultNetworkRequestsForUid( private List<NetworkRequest> copyDefaultNetworkRequestsForUid(
@NonNull final int requestorUid, @NonNull final String requestorPackageName) { final int asUid, final int requestorUid, @NonNull final String requestorPackageName) {
return copyNetworkRequestsForUid( return copyNetworkRequestsForUid(
getDefaultRequestTrackingUid(requestorUid).mRequests, getDefaultRequestTrackingUid(asUid).mRequests,
requestorUid, requestorPackageName); asUid, requestorUid, requestorPackageName);
} }
/** /**
* Copy the given nri's NetworkRequest collection. * Copy the given nri's NetworkRequest collection.
* @param requestsToCopy the NetworkRequest collection to be copied. * @param requestsToCopy the NetworkRequest collection to be copied.
* @param asUid the uid on behalf of which to file the request. Different from requestorUid
* when a privileged caller is tracking the default network for another uid.
* @param requestorUid the uid to set on the copied collection. * @param requestorUid the uid to set on the copied collection.
* @param requestorPackageName the package name to set on the copied collection. * @param requestorPackageName the package name to set on the copied collection.
* @return the copied NetworkRequest collection. * @return the copied NetworkRequest collection.
*/ */
@NonNull @NonNull
private List<NetworkRequest> copyNetworkRequestsForUid( private List<NetworkRequest> copyNetworkRequestsForUid(
@NonNull final List<NetworkRequest> requestsToCopy, @NonNull final int requestorUid, @NonNull final List<NetworkRequest> requestsToCopy, final int asUid,
@NonNull final String requestorPackageName) { final int requestorUid, @NonNull final String requestorPackageName) {
final List<NetworkRequest> requests = new ArrayList<>(); final List<NetworkRequest> requests = new ArrayList<>();
for (final NetworkRequest nr : requestsToCopy) { for (final NetworkRequest nr : requestsToCopy) {
requests.add(new NetworkRequest(copyDefaultNetworkCapabilitiesForUid( requests.add(new NetworkRequest(copyDefaultNetworkCapabilitiesForUid(
nr.networkCapabilities, requestorUid, requestorPackageName), nr.networkCapabilities, asUid, requestorUid, requestorPackageName),
nr.legacyType, nextNetworkRequestId(), nr.type)); nr.legacyType, nextNetworkRequestId(), nr.type));
} }
return requests; return requests;
@@ -6114,17 +6142,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
@NonNull @NonNull
private NetworkCapabilities copyDefaultNetworkCapabilitiesForUid( private NetworkCapabilities copyDefaultNetworkCapabilitiesForUid(
@NonNull final NetworkCapabilities netCapToCopy, @NonNull final int requestorUid, @NonNull final NetworkCapabilities netCapToCopy, final int asUid,
@NonNull final String requestorPackageName) { final int requestorUid, @NonNull final String requestorPackageName) {
// These capabilities are for a TRACK_DEFAULT callback, so: // These capabilities are for a TRACK_DEFAULT callback, so:
// 1. Remove NET_CAPABILITY_VPN, because it's (currently!) the only difference between // 1. Remove NET_CAPABILITY_VPN, because it's (currently!) the only difference between
// mDefaultRequest and a per-UID default request. // mDefaultRequest and a per-UID default request.
// TODO: stop depending on the fact that these two unrelated things happen to be the same // TODO: stop depending on the fact that these two unrelated things happen to be the same
// 2. Always set the UIDs to mAsUid. restrictRequestUidsForCallerAndSetRequestorInfo will // 2. Always set the UIDs to asUid. restrictRequestUidsForCallerAndSetRequestorInfo will
// not do this in the case of a privileged application. // not do this in the case of a privileged application.
final NetworkCapabilities netCap = new NetworkCapabilities(netCapToCopy); final NetworkCapabilities netCap = new NetworkCapabilities(netCapToCopy);
netCap.removeCapability(NET_CAPABILITY_NOT_VPN); netCap.removeCapability(NET_CAPABILITY_NOT_VPN);
netCap.setSingleUid(requestorUid); netCap.setSingleUid(asUid);
restrictRequestUidsForCallerAndSetRequestorInfo( restrictRequestUidsForCallerAndSetRequestorInfo(
netCap, requestorUid, requestorPackageName); netCap, requestorUid, requestorPackageName);
return netCap; return netCap;
@@ -8025,9 +8053,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
final boolean metered = nai.networkCapabilities.isMetered(); final boolean metered = nai.networkCapabilities.isMetered();
boolean blocked; boolean blocked;
blocked = isUidBlockedByVpn(nri.mUid, mVpnBlockedUidRanges); blocked = isUidBlockedByVpn(nri.mAsUid, mVpnBlockedUidRanges);
blocked |= NetworkPolicyManager.isUidBlocked( blocked |= NetworkPolicyManager.isUidBlocked(
mUidBlockedReasons.get(nri.mUid, BLOCKED_REASON_NONE), metered); mUidBlockedReasons.get(nri.mAsUid, BLOCKED_REASON_NONE), metered);
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE, blocked ? 1 : 0); callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE, blocked ? 1 : 0);
} }
@@ -8055,12 +8083,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequestInfo nri = mNetworkRequests.get(nr); NetworkRequestInfo nri = mNetworkRequests.get(nr);
final boolean oldBlocked, newBlocked, oldVpnBlocked, newVpnBlocked; final boolean oldBlocked, newBlocked, oldVpnBlocked, newVpnBlocked;
oldVpnBlocked = isUidBlockedByVpn(nri.mUid, oldBlockedUidRanges); oldVpnBlocked = isUidBlockedByVpn(nri.mAsUid, oldBlockedUidRanges);
newVpnBlocked = (oldBlockedUidRanges != newBlockedUidRanges) newVpnBlocked = (oldBlockedUidRanges != newBlockedUidRanges)
? isUidBlockedByVpn(nri.mUid, newBlockedUidRanges) ? isUidBlockedByVpn(nri.mAsUid, newBlockedUidRanges)
: oldVpnBlocked; : oldVpnBlocked;
final int blockedReasons = mUidBlockedReasons.get(nri.mUid, BLOCKED_REASON_NONE); final int blockedReasons = mUidBlockedReasons.get(nri.mAsUid, BLOCKED_REASON_NONE);
oldBlocked = oldVpnBlocked || NetworkPolicyManager.isUidBlocked( oldBlocked = oldVpnBlocked || NetworkPolicyManager.isUidBlocked(
blockedReasons, oldMetered); blockedReasons, oldMetered);
newBlocked = newVpnBlocked || NetworkPolicyManager.isUidBlocked( newBlocked = newVpnBlocked || NetworkPolicyManager.isUidBlocked(
@@ -8095,7 +8123,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
for (int i = 0; i < nai.numNetworkRequests(); i++) { for (int i = 0; i < nai.numNetworkRequests(); i++) {
NetworkRequest nr = nai.requestAt(i); NetworkRequest nr = nai.requestAt(i);
NetworkRequestInfo nri = mNetworkRequests.get(nr); NetworkRequestInfo nri = mNetworkRequests.get(nr);
if (nri != null && nri.mUid == uid) { if (nri != null && nri.mAsUid == uid) {
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED, arg); callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED, arg);
} }
} }
@@ -8860,7 +8888,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// nri is not bound to the death of callback. Instead, callback.bindToDeath() is set in // nri is not bound to the death of callback. Instead, callback.bindToDeath() is set in
// handleRegisterConnectivityDiagnosticsCallback(). nri will be cleaned up as part of the // handleRegisterConnectivityDiagnosticsCallback(). nri will be cleaned up as part of the
// callback's binder death. // callback's binder death.
final NetworkRequestInfo nri = new NetworkRequestInfo(requestWithId); final NetworkRequestInfo nri = new NetworkRequestInfo(callingUid, requestWithId);
final ConnectivityDiagnosticsCallbackInfo cbInfo = final ConnectivityDiagnosticsCallbackInfo cbInfo =
new ConnectivityDiagnosticsCallbackInfo(callback, nri, callingPackageName); new ConnectivityDiagnosticsCallbackInfo(callback, nri, callingPackageName);
@@ -9344,7 +9372,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities)); nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities));
nrs.add(createDefaultRequest()); nrs.add(createDefaultRequest());
setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids())); setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids()));
final NetworkRequestInfo nri = new NetworkRequestInfo(nrs); final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs);
result.add(nri); result.add(nri);
} }
return result; return result;
@@ -9515,7 +9543,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
// Include this nri if it will be tracked by the new per-app default requests. // Include this nri if it will be tracked by the new per-app default requests.
final boolean isNriGoingToBeTracked = final boolean isNriGoingToBeTracked =
getDefaultRequestTrackingUid(nri.mUid) != mDefaultRequest; getDefaultRequestTrackingUid(nri.mAsUid) != mDefaultRequest;
if (isNriGoingToBeTracked) { if (isNriGoingToBeTracked) {
defaultCallbackRequests.add(nri); defaultCallbackRequests.add(nri);
} }
@@ -9537,7 +9565,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final ArraySet<NetworkRequestInfo> callbackRequestsToRegister = new ArraySet<>(); final ArraySet<NetworkRequestInfo> callbackRequestsToRegister = new ArraySet<>();
for (final NetworkRequestInfo callbackRequest : perAppCallbackRequestsForUpdate) { for (final NetworkRequestInfo callbackRequest : perAppCallbackRequestsForUpdate) {
final NetworkRequestInfo trackingNri = final NetworkRequestInfo trackingNri =
getDefaultRequestTrackingUid(callbackRequest.mUid); getDefaultRequestTrackingUid(callbackRequest.mAsUid);
// If this nri is not being tracked, the change it back to an untracked nri. // If this nri is not being tracked, the change it back to an untracked nri.
if (trackingNri == mDefaultRequest) { if (trackingNri == mDefaultRequest) {
@@ -9547,12 +9575,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
continue; continue;
} }
final String requestorPackageName = final NetworkRequest request = callbackRequest.mRequests.get(0);
callbackRequest.mRequests.get(0).getRequestorPackageName();
callbackRequestsToRegister.add(new NetworkRequestInfo( callbackRequestsToRegister.add(new NetworkRequestInfo(
callbackRequest, callbackRequest,
copyNetworkRequestsForUid( copyNetworkRequestsForUid(
trackingNri.mRequests, callbackRequest.mUid, requestorPackageName))); trackingNri.mRequests, callbackRequest.mAsUid,
callbackRequest.mUid, request.getRequestorPackageName())));
} }
return callbackRequestsToRegister; return callbackRequestsToRegister;
} }
@@ -9656,7 +9684,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
ranges.add(new UidRange(uid, uid)); ranges.add(new UidRange(uid, uid));
} }
setNetworkRequestUids(requests, ranges); setNetworkRequestUids(requests, ranges);
return new NetworkRequestInfo(requests); return new NetworkRequestInfo(Process.myUid(), requests);
} }
private NetworkRequest createUnmeteredNetworkRequest() { private NetworkRequest createUnmeteredNetworkRequest() {

View File

@@ -64,6 +64,7 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.Process;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4;
@@ -219,8 +220,8 @@ public class ConnectivityManagerTest {
ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class);
// register callback // register callback
when(mService.requestNetwork(any(), anyInt(), captor.capture(), anyInt(), any(), anyInt(), when(mService.requestNetwork(anyInt(), any(), anyInt(), captor.capture(), anyInt(), any(),
anyInt(), any(), nullable(String.class))).thenReturn(request); anyInt(), anyInt(), any(), nullable(String.class))).thenReturn(request);
manager.requestNetwork(request, callback, handler); manager.requestNetwork(request, callback, handler);
// callback triggers // callback triggers
@@ -247,8 +248,8 @@ public class ConnectivityManagerTest {
ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class);
// register callback // register callback
when(mService.requestNetwork(any(), anyInt(), captor.capture(), anyInt(), any(), anyInt(), when(mService.requestNetwork(anyInt(), any(), anyInt(), captor.capture(), anyInt(), any(),
anyInt(), any(), nullable(String.class))).thenReturn(req1); anyInt(), anyInt(), any(), nullable(String.class))).thenReturn(req1);
manager.requestNetwork(req1, callback, handler); manager.requestNetwork(req1, callback, handler);
// callback triggers // callback triggers
@@ -265,8 +266,8 @@ public class ConnectivityManagerTest {
verify(callback, timeout(100).times(0)).onLosing(any(), anyInt()); verify(callback, timeout(100).times(0)).onLosing(any(), anyInt());
// callback can be registered again // callback can be registered again
when(mService.requestNetwork(any(), anyInt(), captor.capture(), anyInt(), any(), anyInt(), when(mService.requestNetwork(anyInt(), any(), anyInt(), captor.capture(), anyInt(), any(),
anyInt(), any(), nullable(String.class))).thenReturn(req2); anyInt(), anyInt(), any(), nullable(String.class))).thenReturn(req2);
manager.requestNetwork(req2, callback, handler); manager.requestNetwork(req2, callback, handler);
// callback triggers // callback triggers
@@ -289,8 +290,8 @@ public class ConnectivityManagerTest {
info.targetSdkVersion = VERSION_CODES.N_MR1 + 1; info.targetSdkVersion = VERSION_CODES.N_MR1 + 1;
when(mCtx.getApplicationInfo()).thenReturn(info); when(mCtx.getApplicationInfo()).thenReturn(info);
when(mService.requestNetwork(any(), anyInt(), any(), anyInt(), any(), anyInt(), anyInt(), when(mService.requestNetwork(anyInt(), any(), anyInt(), any(), anyInt(), any(), anyInt(),
any(), nullable(String.class))).thenReturn(request); anyInt(), any(), nullable(String.class))).thenReturn(request);
Handler handler = new Handler(Looper.getMainLooper()); Handler handler = new Handler(Looper.getMainLooper());
manager.requestNetwork(request, callback, handler); manager.requestNetwork(request, callback, handler);
@@ -357,34 +358,40 @@ public class ConnectivityManagerTest {
final NetworkCallback callback = new ConnectivityManager.NetworkCallback(); final NetworkCallback callback = new ConnectivityManager.NetworkCallback();
manager.requestNetwork(request, callback); manager.requestNetwork(request, callback);
verify(mService).requestNetwork(eq(request.networkCapabilities), verify(mService).requestNetwork(eq(Process.INVALID_UID), eq(request.networkCapabilities),
eq(REQUEST.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(REQUEST.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
eq(testPkgName), eq(testAttributionTag)); eq(testPkgName), eq(testAttributionTag));
reset(mService); reset(mService);
// Verify that register network callback does not calls requestNetwork at all. // Verify that register network callback does not calls requestNetwork at all.
manager.registerNetworkCallback(request, callback); manager.registerNetworkCallback(request, callback);
verify(mService, never()).requestNetwork(any(), anyInt(), any(), anyInt(), any(), anyInt(), verify(mService, never()).requestNetwork(anyInt(), any(), anyInt(), any(), anyInt(), any(),
anyInt(), any(), any()); anyInt(), anyInt(), any(), any());
verify(mService).listenForNetwork(eq(request.networkCapabilities), any(), any(), anyInt(), verify(mService).listenForNetwork(eq(request.networkCapabilities), any(), any(), anyInt(),
eq(testPkgName), eq(testAttributionTag)); eq(testPkgName), eq(testAttributionTag));
reset(mService); reset(mService);
Handler handler = new Handler(ConnectivityThread.getInstanceLooper());
manager.registerDefaultNetworkCallback(callback); manager.registerDefaultNetworkCallback(callback);
verify(mService).requestNetwork(eq(null), verify(mService).requestNetwork(eq(Process.INVALID_UID), eq(null),
eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
eq(testPkgName), eq(testAttributionTag)); eq(testPkgName), eq(testAttributionTag));
reset(mService); reset(mService);
Handler handler = new Handler(ConnectivityThread.getInstanceLooper()); manager.registerDefaultNetworkCallbackAsUid(42, callback, handler);
verify(mService).requestNetwork(eq(42), eq(null),
eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
eq(testPkgName), eq(testAttributionTag));
manager.requestBackgroundNetwork(request, handler, callback); manager.requestBackgroundNetwork(request, handler, callback);
verify(mService).requestNetwork(eq(request.networkCapabilities), verify(mService).requestNetwork(eq(Process.INVALID_UID), eq(request.networkCapabilities),
eq(BACKGROUND_REQUEST.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(BACKGROUND_REQUEST.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
eq(testPkgName), eq(testAttributionTag)); eq(testPkgName), eq(testAttributionTag));
reset(mService); reset(mService);
manager.registerSystemDefaultNetworkCallback(callback, handler); manager.registerSystemDefaultNetworkCallback(callback, handler);
verify(mService).requestNetwork(eq(null), verify(mService).requestNetwork(eq(Process.INVALID_UID), eq(null),
eq(TRACK_SYSTEM_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(TRACK_SYSTEM_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
eq(testPkgName), eq(testAttributionTag)); eq(testPkgName), eq(testAttributionTag));
reset(mService); reset(mService);

View File

@@ -1451,6 +1451,23 @@ public class ConnectivityServiceTest {
}); });
} }
private interface ExceptionalRunnable {
void run() throws Exception;
}
private void withPermission(String permission, ExceptionalRunnable r) throws Exception {
if (mServiceContext.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED) {
r.run();
return;
}
try {
mServiceContext.setPermission(permission, PERMISSION_GRANTED);
r.run();
} finally {
mServiceContext.setPermission(permission, PERMISSION_DENIED);
}
}
private static final int PRIMARY_USER = 0; private static final int PRIMARY_USER = 0;
private static final UidRange PRIMARY_UIDRANGE = private static final UidRange PRIMARY_UIDRANGE =
UidRange.createForUser(UserHandle.of(PRIMARY_USER)); UidRange.createForUser(UserHandle.of(PRIMARY_USER));
@@ -3813,8 +3830,9 @@ public class ConnectivityServiceTest {
NetworkCapabilities networkCapabilities = new NetworkCapabilities(); NetworkCapabilities networkCapabilities = new NetworkCapabilities();
networkCapabilities.addTransportType(TRANSPORT_WIFI) networkCapabilities.addTransportType(TRANSPORT_WIFI)
.setNetworkSpecifier(new MatchAllNetworkSpecifier()); .setNetworkSpecifier(new MatchAllNetworkSpecifier());
mService.requestNetwork(networkCapabilities, NetworkRequest.Type.REQUEST.ordinal(), mService.requestNetwork(Process.INVALID_UID, networkCapabilities,
null, 0, null, ConnectivityManager.TYPE_WIFI, NetworkCallback.FLAG_NONE, NetworkRequest.Type.REQUEST.ordinal(), null, 0, null,
ConnectivityManager.TYPE_WIFI, NetworkCallback.FLAG_NONE,
mContext.getPackageName(), getAttributionTag()); mContext.getPackageName(), getAttributionTag());
}); });
@@ -4043,7 +4061,7 @@ public class ConnectivityServiceTest {
} }
@Test @Test
public void testRegisterSystemDefaultCallbackRequiresNetworkSettings() throws Exception { public void testRegisterPrivilegedDefaultCallbacksRequireNetworkSettings() throws Exception {
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellNetworkAgent.connect(false /* validated */); mCellNetworkAgent.connect(false /* validated */);
@@ -4052,12 +4070,19 @@ public class ConnectivityServiceTest {
assertThrows(SecurityException.class, assertThrows(SecurityException.class,
() -> mCm.registerSystemDefaultNetworkCallback(callback, handler)); () -> mCm.registerSystemDefaultNetworkCallback(callback, handler));
callback.assertNoCallback(); callback.assertNoCallback();
assertThrows(SecurityException.class,
() -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler));
callback.assertNoCallback();
mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
PERMISSION_GRANTED); PERMISSION_GRANTED);
mCm.registerSystemDefaultNetworkCallback(callback, handler); mCm.registerSystemDefaultNetworkCallback(callback, handler);
callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
mCm.unregisterNetworkCallback(callback); mCm.unregisterNetworkCallback(callback);
mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler);
callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
mCm.unregisterNetworkCallback(callback);
} }
private void setCaptivePortalMode(int mode) { private void setCaptivePortalMode(int mode) {
@@ -7490,6 +7515,10 @@ public class ConnectivityServiceTest {
final TestNetworkCallback vpnUidDefaultCallback = new TestNetworkCallback(); final TestNetworkCallback vpnUidDefaultCallback = new TestNetworkCallback();
registerDefaultNetworkCallbackAsUid(vpnUidDefaultCallback, VPN_UID); registerDefaultNetworkCallbackAsUid(vpnUidDefaultCallback, VPN_UID);
final TestNetworkCallback vpnDefaultCallbackAsUid = new TestNetworkCallback();
mCm.registerDefaultNetworkCallbackAsUid(VPN_UID, vpnDefaultCallbackAsUid,
new Handler(ConnectivityThread.getInstanceLooper()));
final int uid = Process.myUid(); final int uid = Process.myUid();
final int userId = UserHandle.getUserId(uid); final int userId = UserHandle.getUserId(uid);
final ArrayList<String> allowList = new ArrayList<>(); final ArrayList<String> allowList = new ArrayList<>();
@@ -7509,6 +7538,7 @@ public class ConnectivityServiceTest {
defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
vpnUidCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); vpnUidCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
vpnUidDefaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); vpnUidDefaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
vpnDefaultCallbackAsUid.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertNull(mCm.getActiveNetwork()); assertNull(mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
@@ -7522,6 +7552,7 @@ public class ConnectivityServiceTest {
defaultCallback.expectBlockedStatusCallback(false, mWiFiNetworkAgent); defaultCallback.expectBlockedStatusCallback(false, mWiFiNetworkAgent);
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
expectNetworkRejectNonSecureVpn(inOrder, false, firstHalf, secondHalf); expectNetworkRejectNonSecureVpn(inOrder, false, firstHalf, secondHalf);
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
@@ -7537,6 +7568,7 @@ public class ConnectivityServiceTest {
defaultCallback.assertNoCallback(); defaultCallback.assertNoCallback();
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
// The following requires that the UID of this test package is greater than VPN_UID. This // The following requires that the UID of this test package is greater than VPN_UID. This
// is always true in practice because a plain AOSP build with no apps installed has almost // is always true in practice because a plain AOSP build with no apps installed has almost
@@ -7558,6 +7590,7 @@ public class ConnectivityServiceTest {
defaultCallback.assertNoCallback(); defaultCallback.assertNoCallback();
vpnUidCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); vpnUidCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
@@ -7579,6 +7612,7 @@ public class ConnectivityServiceTest {
assertBlockedCallbackInAnyOrder(callback, true, mWiFiNetworkAgent, mCellNetworkAgent); assertBlockedCallbackInAnyOrder(callback, true, mWiFiNetworkAgent, mCellNetworkAgent);
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertNull(mCm.getActiveNetwork()); assertNull(mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
@@ -7591,6 +7625,7 @@ public class ConnectivityServiceTest {
assertBlockedCallbackInAnyOrder(callback, false, mWiFiNetworkAgent, mCellNetworkAgent); assertBlockedCallbackInAnyOrder(callback, false, mWiFiNetworkAgent, mCellNetworkAgent);
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
@@ -7606,6 +7641,7 @@ public class ConnectivityServiceTest {
defaultCallback.assertNoCallback(); defaultCallback.assertNoCallback();
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
@@ -7618,6 +7654,7 @@ public class ConnectivityServiceTest {
defaultCallback.assertNoCallback(); defaultCallback.assertNoCallback();
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
@@ -7631,6 +7668,7 @@ public class ConnectivityServiceTest {
assertBlockedCallbackInAnyOrder(callback, true, mWiFiNetworkAgent, mCellNetworkAgent); assertBlockedCallbackInAnyOrder(callback, true, mWiFiNetworkAgent, mCellNetworkAgent);
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertNull(mCm.getActiveNetwork()); assertNull(mCm.getActiveNetwork());
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
@@ -7642,6 +7680,7 @@ public class ConnectivityServiceTest {
defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn); defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn);
vpnUidCallback.assertNoCallback(); // vpnUidCallback has NOT_VPN capability. vpnUidCallback.assertNoCallback(); // vpnUidCallback has NOT_VPN capability.
vpnUidDefaultCallback.assertNoCallback(); // VPN does not apply to VPN_UID vpnUidDefaultCallback.assertNoCallback(); // VPN does not apply to VPN_UID
vpnDefaultCallbackAsUid.assertNoCallback();
assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork());
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID)); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
@@ -7654,12 +7693,14 @@ public class ConnectivityServiceTest {
defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
vpnUidCallback.assertNoCallback(); vpnUidCallback.assertNoCallback();
vpnUidDefaultCallback.assertNoCallback(); vpnUidDefaultCallback.assertNoCallback();
vpnDefaultCallbackAsUid.assertNoCallback();
assertNull(mCm.getActiveNetwork()); assertNull(mCm.getActiveNetwork());
mCm.unregisterNetworkCallback(callback); mCm.unregisterNetworkCallback(callback);
mCm.unregisterNetworkCallback(defaultCallback); mCm.unregisterNetworkCallback(defaultCallback);
mCm.unregisterNetworkCallback(vpnUidCallback); mCm.unregisterNetworkCallback(vpnUidCallback);
mCm.unregisterNetworkCallback(vpnUidDefaultCallback); mCm.unregisterNetworkCallback(vpnUidDefaultCallback);
mCm.unregisterNetworkCallback(vpnDefaultCallbackAsUid);
} }
private void setupLegacyLockdownVpn() { private void setupLegacyLockdownVpn() {
@@ -9805,8 +9846,8 @@ public class ConnectivityServiceTest {
for (int reqTypeInt : invalidReqTypeInts) { for (int reqTypeInt : invalidReqTypeInts) {
assertThrows("Expect throws for invalid request type " + reqTypeInt, assertThrows("Expect throws for invalid request type " + reqTypeInt,
IllegalArgumentException.class, IllegalArgumentException.class,
() -> mService.requestNetwork(nc, reqTypeInt, null, 0, null, () -> mService.requestNetwork(Process.INVALID_UID, nc, reqTypeInt, null, 0,
ConnectivityManager.TYPE_NONE, NetworkCallback.FLAG_NONE, null, ConnectivityManager.TYPE_NONE, NetworkCallback.FLAG_NONE,
mContext.getPackageName(), getAttributionTag()) mContext.getPackageName(), getAttributionTag())
); );
} }
@@ -10377,6 +10418,7 @@ public class ConnectivityServiceTest {
mCm.registerDefaultNetworkCallback(mDefaultNetworkCallback); mCm.registerDefaultNetworkCallback(mDefaultNetworkCallback);
registerDefaultNetworkCallbackAsUid(mProfileDefaultNetworkCallback, registerDefaultNetworkCallbackAsUid(mProfileDefaultNetworkCallback,
TEST_WORK_PROFILE_APP_UID); TEST_WORK_PROFILE_APP_UID);
// TODO: test using ConnectivityManager#registerDefaultNetworkCallbackAsUid as well.
mServiceContext.setPermission( mServiceContext.setPermission(
Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED); Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED);
} }
@@ -10396,7 +10438,7 @@ public class ConnectivityServiceTest {
private void setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest( private void setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(
@OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup) @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup)
throws Exception { throws Exception {
final int testPackageNameUid = 123; final int testPackageNameUid = TEST_PACKAGE_UID;
final String testPackageName = "per.app.defaults.package"; final String testPackageName = "per.app.defaults.package";
setupMultipleDefaultNetworksForOemNetworkPreferenceTest( setupMultipleDefaultNetworksForOemNetworkPreferenceTest(
networkPrefToSetup, testPackageNameUid, testPackageName); networkPrefToSetup, testPackageNameUid, testPackageName);
@@ -10532,6 +10574,11 @@ public class ConnectivityServiceTest {
mCm.registerDefaultNetworkCallback(defaultNetworkCallback); mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
defaultNetworkCallback.assertNoCallback(); defaultNetworkCallback.assertNoCallback();
final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
new Handler(ConnectivityThread.getInstanceLooper())));
// Setup the test process to use networkPref for their default network. // Setup the test process to use networkPref for their default network.
setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref);
@@ -10542,19 +10589,22 @@ public class ConnectivityServiceTest {
null, null,
mEthernetNetworkAgent.getNetwork()); mEthernetNetworkAgent.getNetwork());
// At this point with a restricted network used, the available callback should trigger // At this point with a restricted network used, the available callback should trigger.
defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent); defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
mEthernetNetworkAgent.getNetwork()); mEthernetNetworkAgent.getNetwork());
otherUidDefaultCallback.assertNoCallback();
// Now bring down the default network which should trigger a LOST callback. // Now bring down the default network which should trigger a LOST callback.
setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);
// At this point, with no network is available, the lost callback should trigger // At this point, with no network is available, the lost callback should trigger
defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent); defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent);
otherUidDefaultCallback.assertNoCallback();
// Confirm we can unregister without issues. // Confirm we can unregister without issues.
mCm.unregisterNetworkCallback(defaultNetworkCallback); mCm.unregisterNetworkCallback(defaultNetworkCallback);
mCm.unregisterNetworkCallback(otherUidDefaultCallback);
} }
@Test @Test
@@ -10572,6 +10622,11 @@ public class ConnectivityServiceTest {
mCm.registerDefaultNetworkCallback(defaultNetworkCallback); mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
defaultNetworkCallback.assertNoCallback(); defaultNetworkCallback.assertNoCallback();
final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
new Handler(ConnectivityThread.getInstanceLooper())));
// Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
// The active nai for the default is null at this point as this is a restricted network. // The active nai for the default is null at this point as this is a restricted network.
setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true);
@@ -10583,15 +10638,19 @@ public class ConnectivityServiceTest {
defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent); defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
mEthernetNetworkAgent.getNetwork()); mEthernetNetworkAgent.getNetwork());
otherUidDefaultCallback.assertNoCallback();
// Now bring down the default network which should trigger a LOST callback. // Now bring down the default network which should trigger a LOST callback.
setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);
otherUidDefaultCallback.assertNoCallback();
// At this point, with no network is available, the lost callback should trigger // At this point, with no network is available, the lost callback should trigger
defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent); defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent);
otherUidDefaultCallback.assertNoCallback();
// Confirm we can unregister without issues. // Confirm we can unregister without issues.
mCm.unregisterNetworkCallback(defaultNetworkCallback); mCm.unregisterNetworkCallback(defaultNetworkCallback);
mCm.unregisterNetworkCallback(otherUidDefaultCallback);
} }
@Test @Test
@@ -10605,6 +10664,11 @@ public class ConnectivityServiceTest {
mCm.registerDefaultNetworkCallback(defaultNetworkCallback); mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
defaultNetworkCallback.assertNoCallback(); defaultNetworkCallback.assertNoCallback();
final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
new Handler(ConnectivityThread.getInstanceLooper())));
// Setup a process different than the test process to use the default network. This means // Setup a process different than the test process to use the default network. This means
// that the defaultNetworkCallback won't be tracked by the per-app policy. // that the defaultNetworkCallback won't be tracked by the per-app policy.
setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(networkPref); setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(networkPref);
@@ -10620,6 +10684,9 @@ public class ConnectivityServiceTest {
defaultNetworkCallback.assertNoCallback(); defaultNetworkCallback.assertNoCallback();
assertDefaultNetworkCapabilities(userId /* no networks */); assertDefaultNetworkCapabilities(userId /* no networks */);
// The other UID does have access, and gets a callback.
otherUidDefaultCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
// Bring up unrestricted cellular. This should now satisfy the default network. // Bring up unrestricted cellular. This should now satisfy the default network.
setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true);
verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
@@ -10627,25 +10694,31 @@ public class ConnectivityServiceTest {
mEthernetNetworkAgent.getNetwork()); mEthernetNetworkAgent.getNetwork());
// At this point with an unrestricted network used, the available callback should trigger // At this point with an unrestricted network used, the available callback should trigger
// The other UID is unaffected and remains on the paid network.
defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
mCellNetworkAgent.getNetwork()); mCellNetworkAgent.getNetwork());
assertDefaultNetworkCapabilities(userId, mCellNetworkAgent); assertDefaultNetworkCapabilities(userId, mCellNetworkAgent);
otherUidDefaultCallback.assertNoCallback();
// Now bring down the per-app network. // Now bring down the per-app network.
setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);
// Since the callback didn't use the per-app network, no callback should fire. // Since the callback didn't use the per-app network, only the other UID gets a callback.
// Because the preference specifies no fallback, it does not switch to cellular.
defaultNetworkCallback.assertNoCallback(); defaultNetworkCallback.assertNoCallback();
otherUidDefaultCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent);
// Now bring down the default network. // Now bring down the default network.
setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false);
// As this callback was tracking the default, this should now trigger. // As this callback was tracking the default, this should now trigger.
defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
otherUidDefaultCallback.assertNoCallback();
// Confirm we can unregister without issues. // Confirm we can unregister without issues.
mCm.unregisterNetworkCallback(defaultNetworkCallback); mCm.unregisterNetworkCallback(defaultNetworkCallback);
mCm.unregisterNetworkCallback(otherUidDefaultCallback);
} }
/** /**