Clear UIDs when sharing NetworkCapabilties for ConnectivityDiagnostics.

ConnectivityDiagnostics shares NetworkCapabilities in
ConnectivityReports and DataStallReports. These NetworkCapabilities need
to have their UIDs scrubbed before they are shared with callbacks.

Bug: 148942124
Test: atest FrameworksNetTests
Change-Id: I5bde5a8116f7e36b8f4de49adf4cab8ec45a5aa4
This commit is contained in:
Cody Kesting
2020-02-11 10:03:26 -08:00
parent c3f8d41d4d
commit 7febafb11c
2 changed files with 29 additions and 7 deletions

View File

@@ -7832,12 +7832,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleNetworkTestedWithExtras( private void handleNetworkTestedWithExtras(
@NonNull ConnectivityReportEvent reportEvent, @NonNull PersistableBundle extras) { @NonNull ConnectivityReportEvent reportEvent, @NonNull PersistableBundle extras) {
final NetworkAgentInfo nai = reportEvent.mNai; final NetworkAgentInfo nai = reportEvent.mNai;
final NetworkCapabilities networkCapabilities =
new NetworkCapabilities(nai.networkCapabilities);
clearNetworkCapabilitiesUids(networkCapabilities);
final ConnectivityReport report = final ConnectivityReport report =
new ConnectivityReport( new ConnectivityReport(
reportEvent.mNai.network, reportEvent.mNai.network,
reportEvent.mTimestampMillis, reportEvent.mTimestampMillis,
nai.linkProperties, nai.linkProperties,
nai.networkCapabilities, networkCapabilities,
extras); extras);
final List<IConnectivityDiagnosticsCallback> results = final List<IConnectivityDiagnosticsCallback> results =
getMatchingPermissionedCallbacks(nai); getMatchingPermissionedCallbacks(nai);
@@ -7853,13 +7856,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleDataStallSuspected( private void handleDataStallSuspected(
@NonNull NetworkAgentInfo nai, long timestampMillis, int detectionMethod, @NonNull NetworkAgentInfo nai, long timestampMillis, int detectionMethod,
@NonNull PersistableBundle extras) { @NonNull PersistableBundle extras) {
final NetworkCapabilities networkCapabilities =
new NetworkCapabilities(nai.networkCapabilities);
clearNetworkCapabilitiesUids(networkCapabilities);
final DataStallReport report = final DataStallReport report =
new DataStallReport( new DataStallReport(
nai.network, nai.network,
timestampMillis, timestampMillis,
detectionMethod, detectionMethod,
nai.linkProperties, nai.linkProperties,
nai.networkCapabilities, networkCapabilities,
extras); extras);
final List<IConnectivityDiagnosticsCallback> results = final List<IConnectivityDiagnosticsCallback> results =
getMatchingPermissionedCallbacks(nai); getMatchingPermissionedCallbacks(nai);
@@ -7885,6 +7891,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private void clearNetworkCapabilitiesUids(@NonNull NetworkCapabilities nc) {
nc.setUids(null);
nc.setAdministratorUids(Collections.EMPTY_LIST);
nc.setOwnerUid(Process.INVALID_UID);
}
private List<IConnectivityDiagnosticsCallback> getMatchingPermissionedCallbacks( private List<IConnectivityDiagnosticsCallback> getMatchingPermissionedCallbacks(
@NonNull NetworkAgentInfo nai) { @NonNull NetworkAgentInfo nai) {
final List<IConnectivityDiagnosticsCallback> results = new ArrayList<>(); final List<IConnectivityDiagnosticsCallback> results = new ArrayList<>();

View File

@@ -23,8 +23,6 @@ import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport;
import static android.net.ConnectivityDiagnosticsManager.DataStallReport;
import static android.net.ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN; import static android.net.ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_SUPL; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_SUPL;
@@ -100,6 +98,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.ArgumentMatchers.startsWith;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
@@ -6840,8 +6839,13 @@ public class ConnectivityServiceTest {
HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS); HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS);
// Verify onConnectivityReport fired // Verify onConnectivityReport fired
verify(mConnectivityDiagnosticsCallback) verify(mConnectivityDiagnosticsCallback).onConnectivityReport(
.onConnectivityReport(any(ConnectivityReport.class)); argThat(report -> {
final NetworkCapabilities nc = report.getNetworkCapabilities();
return nc.getUids() == null
&& nc.getAdministratorUids().isEmpty()
&& nc.getOwnerUid() == Process.INVALID_UID;
}));
} }
@Test @Test
@@ -6856,7 +6860,13 @@ public class ConnectivityServiceTest {
HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS); HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS);
// Verify onDataStallSuspected fired // Verify onDataStallSuspected fired
verify(mConnectivityDiagnosticsCallback).onDataStallSuspected(any(DataStallReport.class)); verify(mConnectivityDiagnosticsCallback).onDataStallSuspected(
argThat(report -> {
final NetworkCapabilities nc = report.getNetworkCapabilities();
return nc.getUids() == null
&& nc.getAdministratorUids().isEmpty()
&& nc.getOwnerUid() == Process.INVALID_UID;
}));
} }
@Test @Test