Implement WifiNetworkSpecifier#redact.
This is needed so that if an app files a NetworkRequest or
NetworkCallback with a WifiNetworkSpecifier and null UIDs,
sensitive information is redacted. Otherwise, the request could
match WifiNetworkAgentSpecifier of a connected wifi network, and
thus learn if a network is available that matches the specifier
it constructed.
Bug: 187921303
Test: atest WifiNetworkSpecifierTest#testRedact
Change-Id: Ie0f1b6168854b93a456f33913f34a07ef601140b
diff --git a/framework/java/android/net/wifi/WifiNetworkSpecifier.java b/framework/java/android/net/wifi/WifiNetworkSpecifier.java
index 0b0eaff..17934e0 100644
--- a/framework/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/framework/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.MacAddress;
@@ -33,6 +34,8 @@
import android.text.TextUtils;
import android.util.Pair;
+import com.android.modules.utils.build.SdkLevel;
+
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
@@ -768,4 +771,14 @@
// not make much sense!
return equals(other);
}
+
+ /** @hide */
+ @Override
+ @SystemApi
+ @Nullable
+ public NetworkSpecifier redact() {
+ if (!SdkLevel.isAtLeastS()) return this;
+
+ return new Builder().setBand(mBand).build();
+ }
}
diff --git a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
index 87dd8c2..0a24523 100644
--- a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
+++ b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
@@ -860,4 +860,30 @@
assertFalse(specifier2.canBeSatisfiedBy(specifier1));
assertFalse(specifier1.canBeSatisfiedBy(specifier2));
}
+
+ /**
+ * Test WifiNetworkSpecifier redaction.
+ */
+ @Test
+ public void testRedact() {
+ WifiConfiguration wifiConfiguration = new WifiConfiguration();
+ wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+ wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
+
+ WifiNetworkSpecifier specifier =
+ new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
+ Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
+ MacAddress.fromString(TEST_BSSID_OUI_MASK)),
+ ScanResult.WIFI_BAND_5_GHZ,
+ wifiConfiguration);
+
+ final NetworkSpecifier redacted = specifier.redact();
+ if (SdkLevel.isAtLeastS()) {
+ assertEquals(
+ new WifiNetworkSpecifier.Builder().setBand(ScanResult.WIFI_BAND_5_GHZ).build(),
+ redacted);
+ } else {
+ assertTrue(redacted == specifier);
+ }
+ }
}