diff options
author | Etan Cohen <etancohen@google.com> | 2019-01-19 17:39:42 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-19 17:39:42 +0000 |
commit | cc7a0e4d7a2427db4a8bd9473ba361748547b0d1 (patch) | |
tree | dd5845191754d10e308a549020eb845306267a82 /service | |
parent | 9d8a06dc30b31caffc9c957fc07265fec69aa95c (diff) | |
parent | aeaf59e186fedc91679aeb2d22fd5dc9e35636f2 (diff) | |
download | android_frameworks_opt_net_wifi-cc7a0e4d7a2427db4a8bd9473ba361748547b0d1.tar.gz android_frameworks_opt_net_wifi-cc7a0e4d7a2427db4a8bd9473ba361748547b0d1.tar.bz2 android_frameworks_opt_net_wifi-cc7a0e4d7a2427db4a8bd9473ba361748547b0d1.zip |
Merge "[WIFI] Add exemptions to allow DO/PO/Carrier apps to obtain randomized MAC address"
Diffstat (limited to 'service')
6 files changed, 46 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index f9590147c..daab813af 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -1593,8 +1593,10 @@ public class ClientModeImpl extends StateMachine { * @param channel * @return */ - public List<WifiConfiguration> syncGetConfiguredNetworks(int uuid, AsyncChannel channel) { - Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS, uuid); + public List<WifiConfiguration> syncGetConfiguredNetworks(int uuid, AsyncChannel channel, + int targetUid) { + Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS, uuid, + targetUid); if (resultMsg == null) { // an error has occurred return null; } else { @@ -3469,7 +3471,8 @@ public class ClientModeImpl extends StateMachine { deleteNetworkConfigAndSendReply(message, false); break; case CMD_GET_CONFIGURED_NETWORKS: - replyToMessage(message, message.what, mWifiConfigManager.getSavedNetworks()); + replyToMessage(message, message.what, + mWifiConfigManager.getSavedNetworks(message.arg2)); break; case CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS: replyToMessage(message, message.what, @@ -5840,7 +5843,7 @@ public class ClientModeImpl extends StateMachine { * Update WifiMetrics before dumping */ public void updateWifiMetrics() { - mWifiMetrics.updateSavedNetworks(mWifiConfigManager.getSavedNetworks()); + mWifiMetrics.updateSavedNetworks(mWifiConfigManager.getSavedNetworks(Process.WIFI_UID)); mPasspointManager.updateMetrics(); } diff --git a/service/java/com/android/server/wifi/SavedNetworkEvaluator.java b/service/java/com/android/server/wifi/SavedNetworkEvaluator.java index a6699d264..cacc48365 100644 --- a/service/java/com/android/server/wifi/SavedNetworkEvaluator.java +++ b/service/java/com/android/server/wifi/SavedNetworkEvaluator.java @@ -20,11 +20,11 @@ import android.annotation.NonNull; import android.content.Context; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; +import android.os.Process; import android.util.LocalLog; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.wifi.WifiNetworkSelector.NetworkEvaluator.OnConnectableListener; import com.android.server.wifi.util.TelephonyUtil; import java.util.List; @@ -95,7 +95,8 @@ public class SavedNetworkEvaluator implements WifiNetworkSelector.NetworkEvaluat * Update all the saved networks' selection status */ private void updateSavedNetworkSelectionStatus() { - List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks(); + List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks( + Process.WIFI_UID); if (savedNetworks.size() == 0) { localLog("No saved networks."); return; diff --git a/service/java/com/android/server/wifi/WakeupController.java b/service/java/com/android/server/wifi/WakeupController.java index 75c7e53f0..ce3c3af20 100644 --- a/service/java/com/android/server/wifi/WakeupController.java +++ b/service/java/com/android/server/wifi/WakeupController.java @@ -25,6 +25,7 @@ import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiScanner; import android.os.Handler; import android.os.Looper; +import android.os.Process; import android.provider.Settings; import android.util.Log; @@ -310,7 +311,8 @@ public class WakeupController { /** Returns a filtered set of saved networks from WifiConfigManager. */ private Set<ScanResultMatchInfo> getGoodSavedNetworks() { - List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks(); + List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks( + Process.WIFI_UID); Set<ScanResultMatchInfo> goodSavedNetworks = new HashSet<>(savedNetworks.size()); for (WifiConfiguration config : savedNetworks) { diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java index 1f613556f..a17c8c908 100644 --- a/service/java/com/android/server/wifi/WifiConfigManager.java +++ b/service/java/com/android/server/wifi/WifiConfigManager.java @@ -506,15 +506,20 @@ public class WifiConfigManager { * * @param configuration provided WifiConfiguration object. * @param maskPasswords Mask passwords or not. + * @param targetUid Target UID for MAC address reading: -1 = mask all, 0 = mask none, >0 = + * mask all but the targetUid (carrier app). * @return Copy of the WifiConfiguration object. */ private WifiConfiguration createExternalWifiConfiguration( - WifiConfiguration configuration, boolean maskPasswords) { + WifiConfiguration configuration, boolean maskPasswords, int targetUid) { WifiConfiguration network = new WifiConfiguration(configuration); if (maskPasswords) { maskPasswordsInWifiConfiguration(network); } - maskRandomizedMacAddressInWifiConfiguration(network); + if (targetUid != Process.WIFI_UID && targetUid != Process.SYSTEM_UID + && targetUid != configuration.creatorUid) { + maskRandomizedMacAddressInWifiConfiguration(network); + } return network; } @@ -526,16 +531,19 @@ public class WifiConfigManager { * * @param savedOnly Retrieve only saved networks. * @param maskPasswords Mask passwords or not. + * @param targetUid Target UID for MAC address reading: -1 (Invalid UID) = mask all, + * WIFI||SYSTEM = mask none, <other> = mask all but the targetUid (carrier + * app). * @return List of WifiConfiguration objects representing the networks. */ private List<WifiConfiguration> getConfiguredNetworks( - boolean savedOnly, boolean maskPasswords) { + boolean savedOnly, boolean maskPasswords, int targetUid) { List<WifiConfiguration> networks = new ArrayList<>(); for (WifiConfiguration config : getInternalConfiguredNetworks()) { if (savedOnly && config.ephemeral) { continue; } - networks.add(createExternalWifiConfiguration(config, maskPasswords)); + networks.add(createExternalWifiConfiguration(config, maskPasswords, targetUid)); } return networks; } @@ -546,7 +554,7 @@ public class WifiConfigManager { * @return List of WifiConfiguration objects representing the networks. */ public List<WifiConfiguration> getConfiguredNetworks() { - return getConfiguredNetworks(false, true); + return getConfiguredNetworks(false, true, Process.WIFI_UID); } /** @@ -559,7 +567,7 @@ public class WifiConfigManager { * @return List of WifiConfiguration objects representing the networks. */ public List<WifiConfiguration> getConfiguredNetworksWithPasswords() { - return getConfiguredNetworks(false, false); + return getConfiguredNetworks(false, false, Process.WIFI_UID); } /** @@ -567,8 +575,8 @@ public class WifiConfigManager { * * @return List of WifiConfiguration objects representing the networks. */ - public List<WifiConfiguration> getSavedNetworks() { - return getConfiguredNetworks(true, true); + public List<WifiConfiguration> getSavedNetworks(int targetUid) { + return getConfiguredNetworks(true, true, targetUid); } /** @@ -585,7 +593,7 @@ public class WifiConfigManager { } // Create a new configuration object with the passwords masked to send out to the external // world. - return createExternalWifiConfiguration(config, true); + return createExternalWifiConfiguration(config, true, Process.WIFI_UID); } /** @@ -602,7 +610,7 @@ public class WifiConfigManager { } // Create a new configuration object with the passwords masked to send out to the external // world. - return createExternalWifiConfiguration(config, true); + return createExternalWifiConfiguration(config, true, Process.WIFI_UID); } /** @@ -622,7 +630,7 @@ public class WifiConfigManager { } // Create a new configuration object without the passwords masked to send out to the // external world. - return createExternalWifiConfiguration(config, false); + return createExternalWifiConfiguration(config, false, Process.WIFI_UID); } /** @@ -2146,7 +2154,7 @@ public class WifiConfigManager { && scanDetail.getNetworkDetail().getDtimInterval() > 0) { network.dtimInterval = scanDetail.getNetworkDetail().getDtimInterval(); } - return createExternalWifiConfiguration(network, true); + return createExternalWifiConfiguration(network, true, Process.WIFI_UID); } /** diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java index 16d10d348..cf1874776 100644 --- a/service/java/com/android/server/wifi/WifiNetworkSelector.java +++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java @@ -24,6 +24,7 @@ import android.net.wifi.ScanResult; import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; +import android.os.Process; import android.text.TextUtils; import android.util.LocalLog; import android.util.Pair; @@ -460,7 +461,8 @@ public class WifiNetworkSelector { String key = selected.configKey(); // This is only used for setting the connect choice timestamp for debugging purposes. long currentTime = mClock.getWallClockMillis(); - List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks(); + List<WifiConfiguration> savedNetworks = mWifiConfigManager.getSavedNetworks( + Process.WIFI_UID); for (WifiConfiguration network : savedNetworks) { WifiConfiguration.NetworkSelectionStatus status = network.getNetworkSelectionStatus(); diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 85e109d9d..b3d6e9db9 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -1813,9 +1813,17 @@ public class WifiServiceImpl extends BaseWifiService { if (mVerboseLoggingEnabled) { mLog.info("getConfiguredNetworks uid=%").c(callingUid).flush(); } + + int targetConfigUid = Process.INVALID_UID; // don't expose any MAC addresses + if (isPrivileged(getCallingPid(), callingUid) || isDeviceOrProfileOwner(callingUid)) { + targetConfigUid = Process.WIFI_UID; // expose all MAC addresses + } else if (isCarrierApp) { + targetConfigUid = callingUid; // expose only those configs created by the Carrier App + } + if (mClientModeImplChannel != null) { List<WifiConfiguration> configs = mClientModeImpl.syncGetConfiguredNetworks( - callingUid, mClientModeImplChannel); + callingUid, mClientModeImplChannel, targetConfigUid); if (configs != null) { if (isTargetSdkLessThanQOrPrivileged) { return new ParceledListSlice<WifiConfiguration>(configs); @@ -2858,7 +2866,7 @@ public class WifiServiceImpl extends BaseWifiService { if (mClientModeImplChannel != null) { // Delete all Wifi SSIDs List<WifiConfiguration> networks = mClientModeImpl.syncGetConfiguredNetworks( - Binder.getCallingUid(), mClientModeImplChannel); + Binder.getCallingUid(), mClientModeImplChannel, Process.WIFI_UID); if (networks != null) { for (WifiConfiguration config : networks) { removeNetwork(config.networkId, packageName); |