summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLes Lee <lesl@google.com>2020-03-26 00:23:14 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-03-26 00:23:14 +0000
commit776f77aa028f52fc08c51da38b502014938850ce (patch)
tree4a0356866c366dd0c074b041b45f9c3fa7d5e620
parent8a4c5e709e27c306e2d8562bdb5eca40ac003cbc (diff)
parenta9d77c4c1ff8f730d0d188934721b061feb310aa (diff)
Merge "wifi: Support setBssid in tethered mode hotspot" into rvc-dev
-rw-r--r--service/java/com/android/server/wifi/WifiApConfigStore.java16
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java11
-rw-r--r--service/java/com/android/server/wifi/util/ApConfigUtil.java4
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java48
4 files changed, 51 insertions, 28 deletions
diff --git a/service/java/com/android/server/wifi/WifiApConfigStore.java b/service/java/com/android/server/wifi/WifiApConfigStore.java
index 0e9d92b2d..972cd52da 100644
--- a/service/java/com/android/server/wifi/WifiApConfigStore.java
+++ b/service/java/com/android/server/wifi/WifiApConfigStore.java
@@ -197,12 +197,6 @@ public class WifiApConfigStore {
private SoftApConfiguration sanitizePersistentApConfig(SoftApConfiguration config) {
SoftApConfiguration.Builder convertedConfigBuilder = null;
- // Persistent config may not set BSSID.
- if (config.getBssid() != null) {
- convertedConfigBuilder = new SoftApConfiguration.Builder(config);
- convertedConfigBuilder.setBssid(null);
- }
-
// some countries are unable to support 5GHz only operation, always allow for 2GHz when
// config doesn't force channel
if (config.getChannel() == 0 && (config.getBand() & SoftApConfiguration.BAND_2GHZ) == 0) {
@@ -360,16 +354,24 @@ public class WifiApConfigStore {
* requires a password, was one provided?).
*
* @param apConfig {@link SoftApConfiguration} to use for softap mode
+ * @param isPrivileged indicate the caller can pass some fields check or not
* @return boolean true if the provided config meets the minimum set of details, false
* otherwise.
*/
- static boolean validateApWifiConfiguration(@NonNull SoftApConfiguration apConfig) {
+ static boolean validateApWifiConfiguration(@NonNull SoftApConfiguration apConfig,
+ boolean isPrivileged) {
// first check the SSID
if (!validateApConfigSsid(apConfig.getSsid())) {
// failed SSID verificiation checks
return false;
}
+ // BSSID can be set if caller own permission:android.Manifest.permission.NETWORK_SETTINGS.
+ if (apConfig.getBssid() != null && !isPrivileged) {
+ Log.e(TAG, "Config BSSID needs NETWORK_SETTINGS permission");
+ return false;
+ }
+
String preSharedKey = apConfig.getPassphrase();
boolean hasPreSharedKey = !TextUtils.isEmpty(preSharedKey);
int authType;
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index c6ce36c43..2e9372874 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -953,14 +953,16 @@ public class WifiServiceImpl extends BaseWifiService {
* proper permissions beyond the NetworkStack permission.
*/
private boolean startSoftApInternal(SoftApModeConfiguration apConfig) {
+ int uid = Binder.getCallingUid();
+ boolean privileged = isSettingsOrSuw(Binder.getCallingPid(), uid);
mLog.trace("startSoftApInternal uid=% mode=%")
- .c(Binder.getCallingUid()).c(apConfig.getTargetMode()).flush();
+ .c(uid).c(apConfig.getTargetMode()).flush();
// null wifiConfig is a meaningful input for CMD_SET_AP; it means to use the persistent
// AP config.
SoftApConfiguration softApConfig = apConfig.getSoftApConfiguration();
if (softApConfig != null
- && (!WifiApConfigStore.validateApWifiConfiguration(softApConfig)
+ && (!WifiApConfigStore.validateApWifiConfiguration(softApConfig, privileged)
|| !validateSoftApBand(softApConfig.getBand()))) {
Log.e(TAG, "Invalid SoftApConfiguration");
return false;
@@ -1876,7 +1878,7 @@ public class WifiServiceImpl extends BaseWifiService {
SoftApConfiguration softApConfig = ApConfigUtil.fromWifiConfiguration(wifiConfig);
if (softApConfig == null) return false;
if (WifiApConfigStore.validateApWifiConfiguration(
- softApConfig)) {
+ softApConfig, false)) {
mWifiThreadRunner.post(() -> mWifiApConfigStore.setApConfiguration(softApConfig));
return true;
} else {
@@ -1896,9 +1898,10 @@ public class WifiServiceImpl extends BaseWifiService {
@NonNull SoftApConfiguration softApConfig, @NonNull String packageName) {
enforceNetworkSettingsPermission();
int uid = Binder.getCallingUid();
+ boolean privileged = mWifiPermissionsUtil.checkNetworkSettingsPermission(uid);
mLog.info("setSoftApConfiguration uid=%").c(uid).flush();
if (softApConfig == null) return false;
- if (WifiApConfigStore.validateApWifiConfiguration(softApConfig)) {
+ if (WifiApConfigStore.validateApWifiConfiguration(softApConfig, privileged)) {
mActiveModeWarden.updateSoftApConfiguration(softApConfig);
mWifiThreadRunner.post(() -> mWifiApConfigStore.setApConfiguration(softApConfig));
return true;
diff --git a/service/java/com/android/server/wifi/util/ApConfigUtil.java b/service/java/com/android/server/wifi/util/ApConfigUtil.java
index d385e3edc..cc286fad7 100644
--- a/service/java/com/android/server/wifi/util/ApConfigUtil.java
+++ b/service/java/com/android/server/wifi/util/ApConfigUtil.java
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
-import android.net.MacAddress;
import android.net.wifi.SoftApCapability;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.SoftApConfiguration.BandType;
@@ -423,9 +422,6 @@ public class ApConfigUtil {
SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
try {
configBuilder.setSsid(wifiConfig.SSID);
- if (wifiConfig.BSSID != null) {
- configBuilder.setBssid(MacAddress.fromString(wifiConfig.BSSID));
- }
if (wifiConfig.getAuthType() == WifiConfiguration.KeyMgmt.WPA2_PSK) {
configBuilder.setPassphrase(wifiConfig.preSharedKey,
SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
index 0996ce43c..3abdb067a 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiApConfigStoreTest.java
@@ -436,7 +436,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
public void getDefaultApConfigurationIsValid() throws Exception {
WifiApConfigStore store = createWifiApConfigStore();
SoftApConfiguration config = store.getApConfiguration();
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(config));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(config, true));
}
/**
@@ -451,7 +451,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
SoftApConfiguration.BAND_2GHZ);
// verify that the config passes the validateApWifiConfiguration check
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(config));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(config, true));
}
/**
@@ -465,7 +465,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
SoftApConfiguration.BAND_5GHZ);
// verify that the config passes the validateApWifiConfiguration check
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(config));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(config, true));
}
@Test
@@ -550,30 +550,30 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
public void testSsidVerificationInValidateApWifiConfigurationCheck() {
Builder configBuilder = new SoftApConfiguration.Builder();
configBuilder.setSsid(null);
- assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// check a string if it's larger than 32 bytes with UTF-8 encode
// Case 1 : one byte per character (use english words and Arabic numerals)
configBuilder.setSsid(generateRandomString(WifiApConfigStore.SSID_MAX_LEN + 1));
- assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// Case 2 : two bytes per character
configBuilder.setSsid(TEST_STRING_UTF8_WITH_34_BYTES);
- assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// Case 3 : three bytes per character
configBuilder.setSsid(TEST_STRING_UTF8_WITH_33_BYTES);
- assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertFalse(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// now check a valid SSID within 32 bytes
// Case 1 : one byte per character with random length
int validLength = WifiApConfigStore.SSID_MAX_LEN - WifiApConfigStore.SSID_MIN_LEN;
configBuilder.setSsid(generateRandomString(
mRandom.nextInt(validLength) + WifiApConfigStore.SSID_MIN_LEN));
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// Case 2 : two bytes per character
configBuilder.setSsid(TEST_STRING_UTF8_WITH_32_BYTES);
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
// Case 3 : three bytes per character
configBuilder.setSsid(TEST_STRING_UTF8_WITH_30_BYTES);
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
}
/**
@@ -588,7 +588,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
assertTrue(WifiApConfigStore.validateApWifiConfiguration(
new SoftApConfiguration.Builder()
.setSsid(TEST_DEFAULT_HOTSPOT_SSID)
- .build()));
+ .build(), true));
}
/**
@@ -609,7 +609,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
configBuilder.setPassphrase(
generateRandomString(mRandom.nextInt(maxLen - minLen) + minLen),
SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build()));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(configBuilder.build(), true));
}
/**
@@ -635,7 +635,7 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
SoftApConfiguration.BAND_5GHZ, true);
// verify that the config passes the validateApWifiConfiguration check
- assertTrue(WifiApConfigStore.validateApWifiConfiguration(config));
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(config, true));
}
@@ -655,4 +655,26 @@ public class WifiApConfigStoreTest extends WifiBaseTest {
assertFalse(resetedConfig.isClientControlByUserEnabled());
verify(mWifiMetrics).noteSoftApConfigReset(sae_config, resetedConfig);
}
+
+ /**
+ * Verify Bssid field deny to set if caller without setting permission.
+ */
+ @Test
+ public void testBssidDenyIfCallerWithoutPrivileged() throws Exception {
+ WifiApConfigStore store = createWifiApConfigStore();
+ SoftApConfiguration config = new SoftApConfiguration.Builder(store.getApConfiguration())
+ .setBssid(MacAddress.fromString("aa:bb:cc:dd:ee:ff")).build();
+ assertFalse(WifiApConfigStore.validateApWifiConfiguration(config, false));
+ }
+
+ /**
+ * Verify Bssid field only allow to set if caller own setting permission.
+ */
+ @Test
+ public void testBssidAllowIfCallerOwnPrivileged() throws Exception {
+ WifiApConfigStore store = createWifiApConfigStore();
+ SoftApConfiguration config = new SoftApConfiguration.Builder(store.getApConfiguration())
+ .setBssid(MacAddress.fromString("aa:bb:cc:dd:ee:ff")).build();
+ assertTrue(WifiApConfigStore.validateApWifiConfiguration(config, true));
+ }
}