Cache and restore the value of
WifiEnterpriseConfig.mUserApproveNoCaCert when merging
external WifiConfigs with internal ones.
Field should only be set to true through:
1. Updates to the internal config in WifiConfigManager
2. Loading the config from the XML store
Bug: 299967938
Test: atest WifiConfigManagerTest
Test: Connect to WPA-Enterprise. Update the config
and resave. Check that the connection proceeds
as expected, and verify from the logs that the
new code was executed.
Change-Id: I03b709afb4e7e14388cadf8658651cb418edbe56
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index c2c4800..3f711c0 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -1199,10 +1199,14 @@
}
internalConfig.allowAutojoin = externalConfig.allowAutojoin;
- // Copy over the |WifiEnterpriseConfig| parameters if set.
+ // Copy over the |WifiEnterpriseConfig| parameters if set. For fields which should
+ // only be set by the framework, cache the internal config's value and restore.
if (externalConfig.enterpriseConfig != null) {
+ boolean userApproveNoCaCertInternal =
+ internalConfig.enterpriseConfig.isUserApproveNoCaCert();
internalConfig.enterpriseConfig.copyFromExternal(
externalConfig.enterpriseConfig, PASSWORD_MASK);
+ internalConfig.enterpriseConfig.setUserApproveNoCaCert(userApproveNoCaCertInternal);
}
// Copy over any metered information.
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index 74e4d5e..4770950 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -1924,6 +1924,35 @@
}
/**
+ * Verify that the protected WifiEnterpriseConfig fields are set correctly.
+ */
+ @Test
+ public void testWifiEnterpriseConfigProtectedFields() {
+ // Add an external config. Expect the internal config to have the default values.
+ WifiConfiguration externalConfig = WifiConfigurationTestUtil.createEapNetwork();
+ externalConfig.enterpriseConfig.setUserApproveNoCaCert(true);
+ NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(externalConfig);
+ WifiConfiguration internalConfig = mWifiConfigManager.getConfiguredNetwork(
+ result.getNetworkId());
+ assertFalse(internalConfig.enterpriseConfig.isUserApproveNoCaCert());
+
+ // Update using an external config. Expect internal config to retain the default values.
+ result = verifyUpdateNetworkToWifiConfigManager(externalConfig);
+ internalConfig = mWifiConfigManager.getConfiguredNetwork(
+ result.getNetworkId());
+ assertFalse(internalConfig.enterpriseConfig.isUserApproveNoCaCert());
+
+ // If the internal config's values are updated by the framework, merging
+ // with an external config should not overwrite the internal values.
+ mWifiConfigManager.setUserApproveNoCaCert(externalConfig.networkId, true);
+ externalConfig.enterpriseConfig.setUserApproveNoCaCert(false);
+ result = verifyUpdateNetworkToWifiConfigManager(externalConfig);
+ internalConfig = mWifiConfigManager.getConfiguredNetwork(
+ result.getNetworkId());
+ assertTrue(internalConfig.enterpriseConfig.isUserApproveNoCaCert());
+ }
+
+ /**
* Verifies the modification of a single network using
* {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} by passing in nulls
* in all the publicly exposed fields.
@@ -7270,6 +7299,27 @@
}
/**
+ * Verify that the protected WifiEnterpriseConfig fields are loaded correctly
+ * from the XML store.
+ */
+ @Test
+ public void testLoadEnterpriseConfigProtectedFields() throws Exception {
+ WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork();
+ config.enterpriseConfig.setUserApproveNoCaCert(true);
+ List<WifiConfiguration> storedConfigs = Arrays.asList(config);
+
+ // Setup xml storage
+ setupStoreDataForRead(storedConfigs, Arrays.asList());
+ assertTrue(mWifiConfigManager.loadFromStore());
+ verify(mWifiConfigStore).read();
+
+ List<WifiConfiguration> retrievedNetworks =
+ mWifiConfigManager.getConfiguredNetworksWithPasswords();
+ assertEquals(1, retrievedNetworks.size());
+ assertTrue(retrievedNetworks.get(0).enterpriseConfig.isUserApproveNoCaCert());
+ }
+
+ /**
* Verify that updating an existing config to a incompatible type works well.
*/
@Test