diff options
author | David Su <dysu@google.com> | 2020-06-23 03:37:16 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-06-23 03:37:16 +0000 |
commit | 2cbe8f56adc375f18e23041bba5f22b08e95bc7b (patch) | |
tree | ae6ba24ab1d8237bff2c465625e84091854de462 | |
parent | 6ba7ed67a6058f3ce4d9f1a93f33c1ed4d5cba7c (diff) | |
parent | f4553f267886d724fdd93168fd3363d30a876a83 (diff) |
CONFIGURED_NETWORKS_CHANGED_ACTION: stop sending WifiConfiguration and require ACCESS_WIFI_STATE permission am: db04b29f0f am: f4553f2678
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/net/wifi/+/11893019
Change-Id: Iaf376afe6b23a9dd619c25ecdf58d649a4a3ae99
-rw-r--r-- | service/java/com/android/server/wifi/WifiConfigManager.java | 42 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java | 67 |
2 files changed, 46 insertions, 63 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java index 6b88f7165..99de9277e 100644 --- a/service/java/com/android/server/wifi/WifiConfigManager.java +++ b/service/java/com/android/server/wifi/WifiConfigManager.java @@ -18,6 +18,7 @@ package com.android.server.wifi; import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLE_REASON_INFOS; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -834,35 +835,23 @@ public class WifiConfigManager { } /** - * Method to send out the configured networks change broadcast when a single network - * configuration is changed. + * Method to send out the configured networks change broadcast when network configurations + * changed. + * + * In Android R we stopped sending out WifiConfiguration due to user privacy concerns. + * Thus, no matter how many networks changed, + * {@link WifiManager#EXTRA_MULTIPLE_NETWORKS_CHANGED} is always set to true, and + * {@link WifiManager#EXTRA_WIFI_CONFIGURATION} is always null. * - * @param network WifiConfiguration corresponding to the network that was changed. * @param reason The reason for the change, should be one of WifiManager.CHANGE_REASON_ADDED, * WifiManager.CHANGE_REASON_REMOVED, or WifiManager.CHANGE_REASON_CHANGE. */ - private void sendConfiguredNetworkChangedBroadcast( - WifiConfiguration network, int reason) { - Intent intent = new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - intent.putExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED, false); - // Create a new WifiConfiguration with passwords masked before we send it out. - WifiConfiguration broadcastNetwork = new WifiConfiguration(network); - maskPasswordsInWifiConfiguration(broadcastNetwork); - intent.putExtra(WifiManager.EXTRA_WIFI_CONFIGURATION, broadcastNetwork); - intent.putExtra(WifiManager.EXTRA_CHANGE_REASON, reason); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); - } - - /** - * Method to send out the configured networks change broadcast when multiple network - * configurations are changed. - */ - private void sendConfiguredNetworksChangedBroadcast() { + private void sendConfiguredNetworkChangedBroadcast(int reason) { Intent intent = new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED, true); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + intent.putExtra(WifiManager.EXTRA_CHANGE_REASON, reason); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.ACCESS_WIFI_STATE); } /** @@ -1376,7 +1365,6 @@ public class WifiConfigManager { } WifiConfiguration newConfig = getInternalConfiguredNetwork(result.getNetworkId()); sendConfiguredNetworkChangedBroadcast( - newConfig, result.isNewNetwork() ? WifiManager.CHANGE_REASON_ADDED : WifiManager.CHANGE_REASON_CONFIG_CHANGE); @@ -1475,7 +1463,7 @@ public class WifiConfigManager { if (!config.ephemeral && !config.isPasspoint()) { mLruConnectionTracker.removeNetwork(config); } - sendConfiguredNetworkChangedBroadcast(config, WifiManager.CHANGE_REASON_REMOVED); + sendConfiguredNetworkChangedBroadcast(WifiManager.CHANGE_REASON_REMOVED); // Unless the removed network is ephemeral or Passpoint, persist the network removal. if (!config.ephemeral && !config.isPasspoint()) { saveToStore(true); @@ -1688,7 +1676,7 @@ public class WifiConfigManager { */ private void setNetworkStatus(WifiConfiguration config, int status) { config.status = status; - sendConfiguredNetworkChangedBroadcast(config, WifiManager.CHANGE_REASON_CONFIG_CHANGE); + sendConfiguredNetworkChangedBroadcast(WifiManager.CHANGE_REASON_CONFIG_CHANGE); } /** @@ -1949,7 +1937,7 @@ public class WifiConfigManager { removeConnectChoiceFromAllNetworks(config.getKey()); clearNetworkConnectChoice(config.networkId); } - sendConfiguredNetworkChangedBroadcast(config, WifiManager.CHANGE_REASON_CONFIG_CHANGE); + sendConfiguredNetworkChangedBroadcast(WifiManager.CHANGE_REASON_CONFIG_CHANGE); if (!config.ephemeral) { saveToStore(true); } @@ -3056,7 +3044,7 @@ public class WifiConfigManager { // on load (i.e. boot) so that if the user changed SIMs while the device was powered off, // we do not reuse stale credentials that would lead to authentication failure. resetSimNetworks(); - sendConfiguredNetworksChangedBroadcast(); + sendConfiguredNetworkChangedBroadcast(WifiManager.CHANGE_REASON_ADDED); mPendingStoreRead = false; } diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java index dcd0fa8c5..815b3ad0b 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java @@ -204,9 +204,6 @@ public class WifiConfigManagerTest extends WifiBaseTest { when(mContext.getSystemService(ActivityManager.class)) .thenReturn(mock(ActivityManager.class)); - Context mockContext = mock(Context.class); - PackageManager mockPackageManager = mock(PackageManager.class); - when(mockContext.getPackageManager()).thenReturn(mockPackageManager); when(mWifiKeyStore .updateNetworkKeys(any(WifiConfiguration.class), any())) @@ -418,8 +415,8 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID); assertTrue(result.isNewNetwork()); - verifyNetworkRemoveBroadcast(ephemeralNetwork); - verifyNetworkAddBroadcast(openNetwork); + verifyNetworkRemoveBroadcast(); + verifyNetworkAddBroadcast(); // Verify that the config store write was triggered with this new configuration. verifyNetworkInConfigStoreData(openNetwork); @@ -449,7 +446,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { NetworkUpdateResult result = addNetworkToWifiConfigManager(ephemeralNetwork2); assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID); - verifyNetworkUpdateBroadcast(ephemeralNetwork); + verifyNetworkUpdateBroadcast(); // Ensure that the write was not invoked for ephemeral network addition. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); @@ -1161,7 +1158,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { // Verify keys are not being removed. verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class)); - verifyNetworkRemoveBroadcast(passpointNetwork); + verifyNetworkRemoveBroadcast(); // Ensure that the write was not invoked for Passpoint network remove. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); @@ -1723,7 +1720,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertFalse(result.isNewNetwork()); // Verify no changes to the original network configuration. - verifyNetworkUpdateBroadcast(originalNetwork); + verifyNetworkUpdateBroadcast(); verifyNetworkInConfigStoreData(originalNetwork); assertFalse(result.hasIpChanged()); assertFalse(result.hasProxyChanged()); @@ -4911,57 +4908,55 @@ public class WifiConfigManagerTest extends WifiBaseTest { * Verifies that the network was present in the network change broadcast and returns the * change reason. */ - private int verifyNetworkInBroadcastAndReturnReason(WifiConfiguration configuration) { + private int verifyNetworkInBroadcastAndReturnReason() { ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); - ArgumentCaptor<UserHandle> userHandleCaptor = ArgumentCaptor.forClass(UserHandle.class); - mContextConfigStoreMockOrder.verify(mContext) - .sendBroadcastAsUser(intentCaptor.capture(), userHandleCaptor.capture()); + mContextConfigStoreMockOrder.verify(mContext).sendBroadcastAsUser( + intentCaptor.capture(), + eq(UserHandle.ALL), + eq(android.Manifest.permission.ACCESS_WIFI_STATE)); - assertEquals(userHandleCaptor.getValue(), UserHandle.ALL); Intent intent = intentCaptor.getValue(); - int changeReason = intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON, -1); WifiConfiguration retrievedConfig = (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION); - assertEquals(retrievedConfig.getKey(), configuration.getKey()); + assertNull(retrievedConfig); - // Verify that all the passwords are masked in the broadcast configuration. - assertPasswordsMaskedInWifiConfiguration(retrievedConfig); - - return changeReason; + return intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON, -1); } /** * Verifies that we sent out an add broadcast with the provided network. */ - private void verifyNetworkAddBroadcast(WifiConfiguration configuration) { + private void verifyNetworkAddBroadcast() { assertEquals( - verifyNetworkInBroadcastAndReturnReason(configuration), + verifyNetworkInBroadcastAndReturnReason(), WifiManager.CHANGE_REASON_ADDED); } /** * Verifies that we sent out an update broadcast with the provided network. */ - private void verifyNetworkUpdateBroadcast(WifiConfiguration configuration) { + private void verifyNetworkUpdateBroadcast() { assertEquals( - verifyNetworkInBroadcastAndReturnReason(configuration), + verifyNetworkInBroadcastAndReturnReason(), WifiManager.CHANGE_REASON_CONFIG_CHANGE); } /** * Verifies that we sent out a remove broadcast with the provided network. */ - private void verifyNetworkRemoveBroadcast(WifiConfiguration configuration) { + private void verifyNetworkRemoveBroadcast() { assertEquals( - verifyNetworkInBroadcastAndReturnReason(configuration), + verifyNetworkInBroadcastAndReturnReason(), WifiManager.CHANGE_REASON_REMOVED); } private void verifyWifiConfigStoreRead() { assertTrue(mWifiConfigManager.loadFromStore()); - mContextConfigStoreMockOrder.verify(mContext) - .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class)); + mContextConfigStoreMockOrder.verify(mContext).sendBroadcastAsUser( + any(Intent.class), + any(UserHandle.class), + eq(android.Manifest.permission.ACCESS_WIFI_STATE)); } private void triggerStoreReadIfNeeded() { @@ -5022,7 +5017,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(result.hasIpChanged()); assertTrue(result.hasProxyChanged()); - verifyNetworkAddBroadcast(configuration); + verifyNetworkAddBroadcast(); // Verify that the config store write was triggered with this new configuration. verifyNetworkInConfigStoreData(configuration); return result; @@ -5039,7 +5034,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(result.hasIpChanged()); assertTrue(result.hasProxyChanged()); - verifyNetworkAddBroadcast(configuration); + verifyNetworkAddBroadcast(); // Ensure that the write was not invoked for ephemeral network addition. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); return result; @@ -5057,7 +5052,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(result.hasIpChanged()); assertTrue(result.hasProxyChanged()); - verifyNetworkAddBroadcast(configuration); + verifyNetworkAddBroadcast(); // Ensure that the write was not invoked for ephemeral network addition. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); return result; @@ -5077,7 +5072,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { // Verify keys are not being installed. verify(mWifiKeyStore, never()).updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)); - verifyNetworkAddBroadcast(configuration); + verifyNetworkAddBroadcast(); // Ensure that the write was not invoked for Passpoint network addition. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); return result; @@ -5108,7 +5103,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID); assertFalse(result.isNewNetwork()); - verifyNetworkUpdateBroadcast(configuration); + verifyNetworkUpdateBroadcast(); // Verify that the config store write was triggered with this new configuration. verifyNetworkInConfigStoreData(configuration); return result; @@ -5146,7 +5141,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(mWifiConfigManager.removeNetwork( configuration.networkId, TEST_CREATOR_UID, TEST_CREATOR_NAME)); - verifyNetworkRemoveBroadcast(configuration); + verifyNetworkRemoveBroadcast(); // Verify if the config store write was triggered without this new configuration. verifyNetworkNotInConfigStoreData(configuration); verify(mBssidBlocklistMonitor, atLeastOnce()).handleNetworkRemoved(configuration.SSID); @@ -5160,7 +5155,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { assertTrue(mWifiConfigManager.removeNetwork( configuration.networkId, TEST_CREATOR_UID, TEST_CREATOR_NAME)); - verifyNetworkRemoveBroadcast(configuration); + verifyNetworkRemoveBroadcast(); // Ensure that the write was not invoked for ephemeral network remove. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); } @@ -5175,7 +5170,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { // Verify keys are not being removed. verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class)); - verifyNetworkRemoveBroadcast(configuration); + verifyNetworkRemoveBroadcast(); // Ensure that the write was not invoked for Passpoint network remove. mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); } @@ -5186,7 +5181,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { */ private void verifyUpdateNetworkStatus(WifiConfiguration configuration, int status) { assertEquals(status, configuration.status); - verifyNetworkUpdateBroadcast(configuration); + verifyNetworkUpdateBroadcast(); } /** |