diff options
| author | Lorenzo Colitti <lorenzo@google.com> | 2015-04-22 10:44:49 +0900 | 
|---|---|---|
| committer | Lorenzo Colitti <lorenzo@google.com> | 2015-04-22 12:01:35 +0900 | 
| commit | fa57c489f621cd10add639cf7df59f630a7f41a4 (patch) | |
| tree | 484087f6d93ba69be703eaa7a69699553e7f8c5c | |
| parent | 8b625dbe7fa13e3fd15f57f015ab7afe229ce3cf (diff) | |
| download | frameworks_base-fa57c489f621cd10add639cf7df59f630a7f41a4.zip frameworks_base-fa57c489f621cd10add639cf7df59f630a7f41a4.tar.gz frameworks_base-fa57c489f621cd10add639cf7df59f630a7f41a4.tar.bz2 | |
Allow apps with ACCESS_WIFI_STATE to listen for wifi networks
The compatibility measure introduced in bug 20081183 for apps
that connect to a Wi-Fi network without Internet access and then
expect to be able to use that network requires that such apps
register a NetworkCallback so that their WifiManager can pin them
to whatever wifi Network connects.
Currently, registering the callback requires ACCESS_NETWORK_STATE
and the app may not have that permission. Allow registering wifi
(only) callbacks if the app has ACCESS_WIFI_STATE.
If the app does not have ACCESS_WIFI_STATE (unlikely, since
CHANGE_WIFI_STATE is not very useful without ACCESS_WIFI_STATE),
then don't enable the compatibility measure.
Bug: 20081183
Bug: 20423580
Change-Id: Iad328d30c2d170dead883868fece3d922da68f6f
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 26 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/WifiManager.java | 12 | 
2 files changed, 35 insertions, 3 deletions
| diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 9ec1c6a..7d8e9de 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3518,10 +3518,34 @@ public class ConnectivityService extends IConnectivityManager.Stub                  getCallingUid(), 0, operation));      } +    // In order to implement the compatibility measure for pre-M apps that call +    // WifiManager.enableNetwork(..., true) without also binding to that network explicitly, +    // WifiManager registers a network listen for the purpose of calling setProcessDefaultNetwork. +    // This ensures it has permission to do so. +    private boolean hasWifiNetworkListenPermission(NetworkCapabilities nc) { +        if (nc == null) { +            return false; +        } +        int[] transportTypes = nc.getTransportTypes(); +        if (transportTypes.length != 1 || transportTypes[0] != NetworkCapabilities.TRANSPORT_WIFI) { +            return false; +        } +        try { +            mContext.enforceCallingOrSelfPermission( +                    android.Manifest.permission.ACCESS_WIFI_STATE, +                    "ConnectivityService"); +        } catch (SecurityException e) { +            return false; +        } +        return true; +    } +      @Override      public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,              Messenger messenger, IBinder binder) { -        enforceAccessPermission(); +        if (!hasWifiNetworkListenPermission(networkCapabilities)) { +            enforceAccessPermission(); +        }          NetworkRequest networkRequest = new NetworkRequest(new NetworkCapabilities(                  networkCapabilities), TYPE_NONE, nextNetworkRequestId()); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 0f7dd61..3205351 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -2063,7 +2063,11 @@ public class WifiManager {                          .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)                          .build();                  mNetworkCallback = new PinningNetworkCallback(); -                sCM.registerNetworkCallback(request, mNetworkCallback); +                try { +                    sCM.registerNetworkCallback(request, mNetworkCallback); +                } catch (SecurityException e) { +                    Log.d(TAG, "Failed to register network callback", e); +                }              }          }      } @@ -2072,7 +2076,11 @@ public class WifiManager {          initConnectivityManager();          synchronized (sCM) {              if (mNetworkCallback != null) { -                sCM.unregisterNetworkCallback(mNetworkCallback); +                try { +                    sCM.unregisterNetworkCallback(mNetworkCallback); +                } catch (SecurityException e) { +                    Log.d(TAG, "Failed to unregister network callback", e); +                }                  mNetworkCallback = null;              }          } | 
