diff options
author | Roshan Pius <rpius@google.com> | 2019-03-29 14:29:36 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2019-04-02 07:11:03 -0700 |
commit | c2f909d87ad83b654dba9c1b381ec6d9c5a05366 (patch) | |
tree | e413346ce9da6a442f1f2fa08601f1547e50fbd1 /service | |
parent | b67ef4023640cc81603bc750c8a448723b1cd0cc (diff) |
WifiService: setWifiEnabled bypass for older apps
For apps targeting older SDK (<Q), preserve the old behavior for
setWifiEnabled.
Bug: 129549163
Test: atest com.android.server.wifi.WifiServiceImplTest
Change-Id: I2ebfcc10ff7ba61b759307085a6e91d87eafaa48
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiServiceImpl.java | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index a7d6f4b85..815581828 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -866,16 +866,31 @@ public class WifiServiceImpl extends BaseWifiService { */ @Override public synchronized boolean setWifiEnabled(String packageName, boolean enable) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_WIFI_STATE, - "WifiService"); - // only privileged apps like settings, setup wizard, etc can toggle wifi. - if (!isPrivileged(Binder.getCallingPid(), Binder.getCallingUid()) + if (enforceChangePermission(packageName) != MODE_ALLOWED) { + return false; + } + boolean isPrivileged = isPrivileged(Binder.getCallingPid(), Binder.getCallingUid()); + if (!isPrivileged + && !mWifiPermissionsUtil.isTargetSdkLessThan(packageName, Build.VERSION_CODES.Q) // Default car dock app is allowed to turn on wifi (but, cannot turn off) && !(isDefaultCarDock(packageName) && enable)) { mLog.info("setWifiEnabled not allowed for uid=%") .c(Binder.getCallingUid()).flush(); return false; } + // If Airplane mode is enabled, only privileged apps are allowed to toggle Wifi + if (mSettingsStore.isAirplaneModeOn() && !isPrivileged) { + mLog.err("setWifiEnabled in Airplane mode: only Settings can toggle wifi").flush(); + return false; + } + + // If SoftAp is enabled, only privileged apps are allowed to toggle wifi + boolean apEnabled = mWifiApState == WifiManager.WIFI_AP_STATE_ENABLED; + if (apEnabled && !isPrivileged) { + mLog.err("setWifiEnabled SoftAp enabled: only Settings can toggle wifi").flush(); + return false; + } + mLog.info("setWifiEnabled package=% uid=% enable=%").c(packageName) .c(Binder.getCallingUid()).c(enable).flush(); long ident = Binder.clearCallingIdentity(); |