diff --git a/api/system-current.txt b/api/system-current.txt index b28e7afddbe31..14ee69218e7d9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7586,6 +7586,7 @@ package android.net.wifi { method @Deprecated @NonNull public android.net.IpConfiguration getIpConfiguration(); method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus getNetworkSelectionStatus(); method @Deprecated @NonNull public String getPrintableSsid(); + method @Deprecated @NonNull public String getProfileKey(); method @Deprecated public int getRecentFailureReason(); method @Deprecated public boolean hasNoInternetAccess(); method @Deprecated public boolean isEphemeral(); diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt index edbd46300191e..5eef6f80ac161 100644 --- a/wifi/api/system-current.txt +++ b/wifi/api/system-current.txt @@ -321,6 +321,7 @@ package android.net.wifi { method @Deprecated @NonNull public android.net.IpConfiguration getIpConfiguration(); method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus getNetworkSelectionStatus(); method @Deprecated @NonNull public String getPrintableSsid(); + method @Deprecated @NonNull public String getProfileKey(); method @Deprecated public int getRecentFailureReason(); method @Deprecated public boolean hasNoInternetAccess(); method @Deprecated public boolean isEphemeral(); diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 1e2e1228df51f..f34890e5b0f98 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -3216,4 +3216,56 @@ public class WifiConfiguration implements Parcelable { || allowedKeyManagement.get(KeyMgmt.WAPI_PSK); } + /** + * Get a unique key which represent this Wi-Fi configuration profile. If two profiles are for + * the same Wi-Fi network, but from different providers (apps, carriers, or data subscriptions), + * they would have different keys. + * @return a unique key which represent this profile. + * @hide + */ + @SystemApi + @NonNull public String getProfileKey() { + if (mPasspointUniqueId != null) { + return mPasspointUniqueId; + } + + String key = SSID + getDefaultSecurityType(); + if (!shared) { + key += "-" + UserHandle.getUserHandleForUid(creatorUid).getIdentifier(); + } + if (fromWifiNetworkSuggestion) { + key += "_" + creatorName + "-" + carrierId + "-" + subscriptionId; + } + + return key; + } + + private String getDefaultSecurityType() { + String key; + if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { + key = KeyMgmt.strings[KeyMgmt.WPA_PSK]; + } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) + || allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { + key = KeyMgmt.strings[KeyMgmt.WPA_EAP]; + } else if (wepTxKeyIndex >= 0 && wepTxKeyIndex < wepKeys.length + && wepKeys[wepTxKeyIndex] != null) { + key = "WEP"; + } else if (allowedKeyManagement.get(KeyMgmt.OWE)) { + key = KeyMgmt.strings[KeyMgmt.OWE]; + } else if (allowedKeyManagement.get(KeyMgmt.SAE)) { + key = KeyMgmt.strings[KeyMgmt.SAE]; + } else if (allowedKeyManagement.get(KeyMgmt.SUITE_B_192)) { + key = KeyMgmt.strings[KeyMgmt.SUITE_B_192]; + } else if (allowedKeyManagement.get(KeyMgmt.WAPI_PSK)) { + key = KeyMgmt.strings[KeyMgmt.WAPI_PSK]; + } else if (allowedKeyManagement.get(KeyMgmt.WAPI_CERT)) { + key = KeyMgmt.strings[KeyMgmt.WAPI_CERT]; + } else if (allowedKeyManagement.get(KeyMgmt.OSEN)) { + key = KeyMgmt.strings[KeyMgmt.OSEN]; + } else { + key = KeyMgmt.strings[KeyMgmt.NONE]; + } + return key; + } + } diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java index 756c735b20f24..337ad927588e6 100644 --- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java @@ -51,6 +51,9 @@ import org.junit.Test; @SmallTest public class WifiConfigurationTest { private static final String TEST_PASSPOINT_UNIQUE_ID = "uniqueId"; + private static final int TEST_CARRIER_ID = 1234; + private static final int TEST_SUB_ID = 3; + private static final String TEST_PACKAGE_NAME = "google.com"; @Before public void setUp() { @@ -720,4 +723,142 @@ public class WifiConfigurationTest { configuration.allowedKeyManagement.set(KeyMgmt.SAE); configuration.getAuthType(); } + + /** + * Verifies that getProfileKey returns the correct String for networks of + * various different security types, the result should be stable. + */ + @Test + public void testGetProfileKeyString() { + WifiConfiguration config = new WifiConfiguration(); + final String mSsid = "TestAP"; + config.SSID = mSsid; + config.carrierId = TEST_CARRIER_ID; + config.subscriptionId = TEST_SUB_ID; + config.creatorName = TEST_PACKAGE_NAME; + + + // Test various combinations + config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WPA_PSK], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WPA_PSK], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WPA_EAP], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WPA_EAP], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.wepKeys[0] = "TestWep"; + config.allowedKeyManagement.clear(); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, "WEP", TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, "WEP", TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + // set WEP key and give a valid index. + config.wepKeys[0] = null; + config.wepKeys[2] = "TestWep"; + config.wepTxKeyIndex = 2; + config.allowedKeyManagement.clear(); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, "WEP", TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, "WEP", TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + // set WEP key but does not give a valid index. + config.wepKeys[0] = null; + config.wepKeys[2] = "TestWep"; + config.wepTxKeyIndex = 0; + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.OWE); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.OWE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.OWE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.wepKeys[0] = null; + config.wepTxKeyIndex = 0; + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.OWE); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.OWE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.OWE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.SAE); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.SAE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.SAE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.SUITE_B_192], + TEST_PACKAGE_NAME, TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.SUITE_B_192], + TEST_PACKAGE_NAME, TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.NONE); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.NONE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.NONE], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.WAPI_PSK); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WAPI_PSK], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WAPI_PSK], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.allowedKeyManagement.set(KeyMgmt.WAPI_CERT); + config.fromWifiNetworkSuggestion = false; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WAPI_CERT], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, false), config.getProfileKey()); + config.fromWifiNetworkSuggestion = true; + assertEquals(createProfileKey(mSsid, KeyMgmt.strings[KeyMgmt.WAPI_CERT], TEST_PACKAGE_NAME, + TEST_CARRIER_ID, TEST_SUB_ID, true), config.getProfileKey()); + + config.allowedKeyManagement.clear(); + config.setPasspointUniqueId(TEST_PASSPOINT_UNIQUE_ID); + assertEquals(TEST_PASSPOINT_UNIQUE_ID, config.getProfileKey()); + } + + private String createProfileKey(String ssid, String keyMgmt, String providerName, + int carrierId, int subId, boolean isFromSuggestion) { + StringBuilder sb = new StringBuilder(); + sb.append(ssid).append(keyMgmt); + if (isFromSuggestion) { + sb.append("_").append(providerName).append('-') + .append(carrierId).append('-').append(subId); + } + return sb.toString(); + } }