1 /* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "wifi_settings.h" 17 #include "define.h" 18 #include "wifi_cert_utils.h" 19 #include "wifi_global_func.h" 20 #include "wifi_log.h" 21 #include "wifi_config_country_freqs.h" 22 #include "mac_address.h" 23 #ifndef OHOS_ARCH_LITE 24 #include <sys/sendfile.h> 25 #include "wifi_country_code_define.h" 26 #include "network_parser.h" 27 #include "softap_parser.h" 28 #include "wifi_backup_config.h" 29 #include "json/json.h" 30 #endif 31 #ifdef SUPPORT_ClOUD_WIFI_ASSET 32 #include "wifi_asset_manager.h" 33 #endif 34 #ifdef INIT_LIB_ENABLE 35 #include "parameter.h" 36 #endif 37 #if defined(FEATURE_ENCRYPTION_SUPPORT) || defined(SUPPORT_LOCAL_RANDOM_MAC) 38 #include "wifi_encryption_util.h" 39 #endif 40 41 namespace OHOS { 42 namespace Wifi { 43 #ifdef DTFUZZ_TEST 44 static WifiSettings* gWifiSettings = nullptr; 45 #endif 46 GetInstance()47 WifiSettings &WifiSettings::GetInstance() 48 { 49 #ifndef DTFUZZ_TEST 50 static WifiSettings gWifiSettings; 51 return gWifiSettings; 52 #else 53 if (gWifiSettings == nullptr) { 54 gWifiSettings = new (std::nothrow) WifiSettings(); 55 } 56 return *gWifiSettings; 57 #endif 58 } 59 WifiSettings()60 WifiSettings::WifiSettings() 61 : mNetworkId(0), 62 mApMaxConnNum(MAX_AP_CONN), 63 mMaxNumConfigs(MAX_CONFIGS_NUM) 64 { 65 } 66 ~WifiSettings()67 WifiSettings::~WifiSettings() 68 { 69 SyncDeviceConfig(); 70 SyncHotspotConfig(); 71 { 72 std::unique_lock<std::mutex> lock(mApMutex); 73 SyncBlockList(); 74 } 75 SyncWifiP2pGroupInfoConfig(); 76 SyncP2pVendorConfig(); 77 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 78 SyncWifiConfig(); 79 } 80 Init()81 int WifiSettings::Init() 82 { 83 /* read ini config */ 84 mSavedDeviceConfig.SetConfigFilePath(DEVICE_CONFIG_FILE_PATH); 85 mSavedHotspotConfig.SetConfigFilePath(HOTSPOT_CONFIG_FILE_PATH); 86 mSavedBlockInfo.SetConfigFilePath(BLOCK_LIST_FILE_PATH); 87 mSavedWifiConfig.SetConfigFilePath(WIFI_CONFIG_FILE_PATH); 88 mSavedWifiP2pGroupInfo.SetConfigFilePath(WIFI_P2P_GROUP_INFO_FILE_PATH); 89 mSavedWifiP2pVendorConfig.SetConfigFilePath(WIFI_P2P_VENDOR_CONFIG_FILE_PATH); 90 mTrustListPolicies.SetConfigFilePath(WIFI_TRUST_LIST_POLICY_FILE_PATH); 91 mMovingFreezePolicy.SetConfigFilePath(WIFI_MOVING_FREEZE_POLICY_FILE_PATH); 92 mSavedWifiStoreRandomMac.SetConfigFilePath(WIFI_STA_RANDOM_MAC_FILE_PATH); 93 mPackageFilterConfig.SetConfigFilePath(PACKAGE_FILTER_CONFIG_FILE_PATH); 94 mVariableConf.SetConfigFilePath(WIFI_VARIABLE_PATH); 95 #ifndef OHOS_ARCH_LITE 96 MergeWifiConfig(); 97 MergeSoftapConfig(); 98 #endif 99 #if defined(FEATURE_ENCRYPTION_SUPPORT) || defined(SUPPORT_LOCAL_RANDOM_MAC) 100 SetUpHks(); 101 #endif 102 InitWifiConfig(); 103 ReloadDeviceConfig(); 104 InitHotspotConfig(); 105 InitP2pVendorConfig(); 106 ReloadWifiP2pGroupInfoConfig(); 107 ReloadTrustListPolicies(); 108 ReloadMovingFreezePolicy(); 109 ReloadStaRandomMac(); 110 InitPackageFilterConfig(); 111 IncreaseNumRebootsSinceLastUse(); 112 InitVariableConfig(); 113 return 0; 114 } 115 AddDeviceConfig(const WifiDeviceConfig & config)116 int WifiSettings::AddDeviceConfig(const WifiDeviceConfig &config) 117 { 118 if (config.ssid.empty()) { 119 LOGE("AddDeviceConfig ssid is empty"); 120 return -1; 121 } 122 std::unique_lock<std::mutex> lock(mStaMutex); 123 auto iter = mWifiDeviceConfig.find(config.networkId); 124 if (iter != mWifiDeviceConfig.end()) { 125 #ifdef SUPPORT_ClOUD_WIFI_ASSET 126 if (WifiAssetManager::GetInstance().IsWifiConfigChanged(config, iter->second)) { 127 WifiAssetManager::GetInstance().WifiAssetUpdate(config); 128 } 129 #endif 130 iter->second = config; 131 } else { 132 if (mWifiDeviceConfig.size() > WIFI_DEVICE_CONFIG_MAX_MUN) { 133 LOGE("AddDeviceConfig Exceeding the maximum value!"); 134 return -1; 135 } 136 mWifiDeviceConfig.emplace(std::make_pair(config.networkId, config)); 137 #ifdef SUPPORT_ClOUD_WIFI_ASSET 138 WifiAssetManager::GetInstance().WifiAssetAdd(config); 139 #endif 140 } 141 return config.networkId; 142 } 143 SyncAfterDecryped(WifiDeviceConfig & config)144 void WifiSettings::SyncAfterDecryped(WifiDeviceConfig &config) 145 { 146 #ifdef FEATURE_ENCRYPTION_SUPPORT 147 if (IsWifiDeviceConfigDeciphered(config)) { 148 return; 149 } 150 DecryptionDeviceConfig(config); 151 #ifdef SUPPORT_ClOUD_WIFI_ASSET 152 WifiAssetManager::GetInstance().WifiAssetAdd(config); 153 #endif 154 #endif 155 } 156 RemoveDevice(int networkId)157 int WifiSettings::RemoveDevice(int networkId) 158 { 159 std::unique_lock<std::mutex> lock(mStaMutex); 160 auto iter = mWifiDeviceConfig.find(networkId); 161 if (iter != mWifiDeviceConfig.end()) { 162 if (!iter->second.wifiEapConfig.clientCert.empty()) { 163 if (WifiCertUtils::UninstallCert(iter->second.wifiEapConfig.clientCert) != 0) { 164 LOGE("uninstall cert %{public}s fail", iter->second.wifiEapConfig.clientCert.c_str()); 165 } else { 166 LOGD("uninstall cert %{public}s success", iter->second.wifiEapConfig.clientCert.c_str()); 167 } 168 } 169 #ifdef SUPPORT_ClOUD_WIFI_ASSET 170 WifiAssetManager::GetInstance().WifiAssetRemove(iter->second); 171 #endif 172 mWifiDeviceConfig.erase(iter); 173 } 174 return 0; 175 } 176 ClearDeviceConfig(void)177 void WifiSettings::ClearDeviceConfig(void) 178 { 179 std::unique_lock<std::mutex> lock(mStaMutex); 180 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 181 if (iter->second.wifiEapConfig.clientCert.empty()) { 182 continue; 183 } 184 if (WifiCertUtils::UninstallCert(iter->second.wifiEapConfig.clientCert) != 0) { 185 LOGE("uninstall cert %{public}s fail", iter->second.wifiEapConfig.clientCert.c_str()); 186 } else { 187 LOGD("uninstall cert %{public}s success", iter->second.wifiEapConfig.clientCert.c_str()); 188 } 189 } 190 mWifiDeviceConfig.clear(); 191 return; 192 } 193 GetDeviceConfig(std::vector<WifiDeviceConfig> & results,int instId)194 int WifiSettings::GetDeviceConfig(std::vector<WifiDeviceConfig> &results, int instId) 195 { 196 if (!deviceConfigLoadFlag.test_and_set()) { 197 LOGD("Reload wifi config"); 198 ReloadDeviceConfig(); 199 } 200 std::unique_lock<std::mutex> lock(mStaMutex); 201 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 202 // -1: Connect by system, use default uid. 203 if ((iter->second.uid == -1 || iter->second.isShared) && iter->second.instanceId == instId) { 204 results.push_back(iter->second); 205 } 206 } 207 return 0; 208 } 209 GetDeviceConfig(const int & networkId,WifiDeviceConfig & config,int instId)210 int WifiSettings::GetDeviceConfig(const int &networkId, WifiDeviceConfig &config, int instId) 211 { 212 if (!deviceConfigLoadFlag.test_and_set()) { 213 LOGD("Reload wifi config"); 214 ReloadDeviceConfig(); 215 } 216 std::unique_lock<std::mutex> lock(mStaMutex); 217 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 218 if (iter->second.networkId == networkId && iter->second.instanceId == instId) { 219 SyncAfterDecryped(iter->second); 220 config = iter->second; 221 return 0; 222 } 223 } 224 return -1; 225 } 226 GetDeviceConfig(const std::string & index,const int & indexType,WifiDeviceConfig & config,int instId)227 int WifiSettings::GetDeviceConfig(const std::string &index, const int &indexType, 228 WifiDeviceConfig &config, int instId) 229 { 230 if (!deviceConfigLoadFlag.test_and_set()) { 231 LOGD("Reload wifi config"); 232 ReloadDeviceConfig(); 233 } 234 std::unique_lock<std::mutex> lock(mStaMutex); 235 if (indexType == DEVICE_CONFIG_INDEX_SSID) { 236 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 237 if (iter->second.ssid == index && iter->second.instanceId == instId) { 238 SyncAfterDecryped(iter->second); 239 config = iter->second; 240 return 0; 241 } 242 } 243 } else { 244 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 245 if (iter->second.bssid == index && iter->second.instanceId == instId) { 246 SyncAfterDecryped(iter->second); 247 config = iter->second; 248 return 0; 249 } 250 } 251 } 252 return -1; 253 } 254 GetDeviceConfig(const std::string & ssid,const std::string & keymgmt,WifiDeviceConfig & config,int instId)255 int WifiSettings::GetDeviceConfig(const std::string &ssid, const std::string &keymgmt, 256 WifiDeviceConfig &config, int instId) 257 { 258 if (!deviceConfigLoadFlag.test_and_set()) { 259 LOGD("Reload wifi config"); 260 ReloadDeviceConfig(); 261 } 262 263 std::unique_lock<std::mutex> lock(mStaMutex); 264 if (keymgmt.compare("WPA-PSK+SAE") == 0) { 265 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 266 if ((iter->second.ssid == ssid) && (keymgmt.find(iter->second.keyMgmt) != std::string::npos) 267 && (iter->second.uid == -1 || iter->second.isShared) && iter->second.instanceId == instId) { 268 SyncAfterDecryped(iter->second); 269 config = iter->second; 270 return 0; 271 } 272 } 273 } else { 274 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 275 if ((iter->second.ssid == ssid) && (iter->second.keyMgmt == keymgmt) 276 && (iter->second.uid == -1 || iter->second.isShared) && iter->second.instanceId == instId) { 277 SyncAfterDecryped(iter->second); 278 config = iter->second; 279 return 0; 280 } 281 } 282 } 283 284 return -1; 285 } 286 SetDeviceState(int networkId,int state,bool bSetOther)287 int WifiSettings::SetDeviceState(int networkId, int state, bool bSetOther) 288 { 289 if (state < 0 || state >= (int)WifiDeviceConfigStatus::UNKNOWN) { 290 return -1; 291 } 292 std::unique_lock<std::mutex> lock(mStaMutex); 293 auto iter = mWifiDeviceConfig.find(networkId); 294 if (iter == mWifiDeviceConfig.end()) { 295 return -1; 296 } 297 iter->second.status = state; 298 if (bSetOther && state == (int)WifiDeviceConfigStatus::ENABLED) { 299 for (iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); ++iter) { 300 if (iter->first != networkId && iter->second.status == state) { 301 iter->second.status = 1; 302 } 303 } 304 } 305 return 0; 306 } 307 SetDeviceEphemeral(int networkId,bool isEphemeral)308 int WifiSettings::SetDeviceEphemeral(int networkId, bool isEphemeral) 309 { 310 std::unique_lock<std::mutex> lock(mStaMutex); 311 auto iter = mWifiDeviceConfig.find(networkId); 312 if (iter == mWifiDeviceConfig.end()) { 313 return -1; 314 } 315 iter->second.isEphemeral = isEphemeral; 316 return 0; 317 } 318 SetDeviceAfterConnect(int networkId)319 int WifiSettings::SetDeviceAfterConnect(int networkId) 320 { 321 std::unique_lock<std::mutex> lock(mStaMutex); 322 auto iter = mWifiDeviceConfig.find(networkId); 323 if (iter == mWifiDeviceConfig.end()) { 324 return -1; 325 } 326 LOGD("Set Device After Connect"); 327 iter->second.lastConnectTime = time(0); 328 iter->second.numRebootsSinceLastUse = 0; 329 iter->second.numAssociation++; 330 iter->second.networkSelectionStatus.networkDisableCount = 0; 331 return 0; 332 } 333 SetDeviceRandomizedMacSuccessEver(int networkId)334 int WifiSettings::SetDeviceRandomizedMacSuccessEver(int networkId) 335 { 336 std::unique_lock<std::mutex> lock(mStaMutex); 337 auto iter = mWifiDeviceConfig.find(networkId); 338 if (iter == mWifiDeviceConfig.end()) { 339 return -1; 340 } 341 iter->second.randomizedMacSuccessEver = true; 342 return 0; 343 } 344 SetDeviceEverConnected(int networkId)345 int WifiSettings::SetDeviceEverConnected(int networkId) 346 { 347 std::unique_lock<std::mutex> lock(mStaMutex); 348 auto iter = mWifiDeviceConfig.find(networkId); 349 if (iter == mWifiDeviceConfig.end()) { 350 return -1; 351 } 352 iter->second.everConnected = true; 353 return 0; 354 } 355 SetAcceptUnvalidated(int networkId,bool state)356 int WifiSettings::SetAcceptUnvalidated(int networkId, bool state) 357 { 358 std::unique_lock<std::mutex> lock(mStaMutex); 359 auto iter = mWifiDeviceConfig.find(networkId); 360 if (iter == mWifiDeviceConfig.end()) { 361 return -1; 362 } 363 iter->second.acceptUnvalidated = state; 364 return 0; 365 } 366 GetDeviceEverConnected(int networkId)367 bool WifiSettings::GetDeviceEverConnected(int networkId) 368 { 369 std::unique_lock<std::mutex> lock(mStaMutex); 370 auto iter = mWifiDeviceConfig.find(networkId); 371 if (iter == mWifiDeviceConfig.end()) { 372 return false; 373 } 374 return iter->second.everConnected; 375 } 376 GetAcceptUnvalidated(int networkId)377 bool WifiSettings::GetAcceptUnvalidated(int networkId) 378 { 379 std::unique_lock<std::mutex> lock(mStaMutex); 380 auto iter = mWifiDeviceConfig.find(networkId); 381 if (iter == mWifiDeviceConfig.end()) { 382 return false; 383 } 384 return iter->second.acceptUnvalidated; 385 } 386 GetCandidateConfig(const int uid,const std::string & ssid,const std::string & keymgmt,WifiDeviceConfig & config)387 int WifiSettings::GetCandidateConfig(const int uid, const std::string &ssid, const std::string &keymgmt, 388 WifiDeviceConfig &config) 389 { 390 std::vector<WifiDeviceConfig> configs; 391 if (GetAllCandidateConfig(uid, configs) != 0) { 392 return -1; 393 } 394 395 for (const auto &it : configs) { 396 if (it.ssid == ssid && it.keyMgmt == keymgmt) { 397 config = it; 398 return it.networkId; 399 } 400 } 401 return -1; 402 } 403 GetCandidateConfig(const int uid,const int & networkId,WifiDeviceConfig & config)404 int WifiSettings::GetCandidateConfig(const int uid, const int &networkId, WifiDeviceConfig &config) 405 { 406 std::vector<WifiDeviceConfig> configs; 407 if (GetAllCandidateConfig(uid, configs) != 0) { 408 return -1; 409 } 410 411 for (const auto &it : configs) { 412 if (it.networkId == networkId) { 413 config = it; 414 return it.networkId; 415 } 416 } 417 return -1; 418 } 419 GetAllCandidateConfig(const int uid,std::vector<WifiDeviceConfig> & configs)420 int WifiSettings::GetAllCandidateConfig(const int uid, std::vector<WifiDeviceConfig> &configs) 421 { 422 if (!deviceConfigLoadFlag.test_and_set()) { 423 LOGD("Reload wifi config"); 424 ReloadDeviceConfig(); 425 } 426 427 std::unique_lock<std::mutex> lock(mStaMutex); 428 bool found = false; 429 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 430 if (iter->second.uid == uid) { 431 configs.push_back(iter->second); 432 found = true; 433 } 434 } 435 return found ? 0 : -1; 436 } 437 IncreaseDeviceConnFailedCount(const std::string & index,const int & indexType,int count)438 int WifiSettings::IncreaseDeviceConnFailedCount(const std::string &index, const int &indexType, int count) 439 { 440 std::unique_lock<std::mutex> lock(mStaMutex); 441 if (indexType == DEVICE_CONFIG_INDEX_SSID) { 442 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 443 if (iter->second.ssid == index) { 444 iter->second.connFailedCount += count; 445 return 0; 446 } 447 } 448 } else { 449 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 450 if (iter->second.bssid == index) { 451 iter->second.connFailedCount += count; 452 return 0; 453 } 454 } 455 } 456 return -1; 457 } 458 SetDeviceConnFailedCount(const std::string & index,const int & indexType,int count)459 int WifiSettings::SetDeviceConnFailedCount(const std::string &index, const int &indexType, int count) 460 { 461 std::unique_lock<std::mutex> lock(mStaMutex); 462 if (indexType == DEVICE_CONFIG_INDEX_SSID) { 463 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 464 if (iter->second.ssid == index) { 465 iter->second.connFailedCount = count; 466 return 0; 467 } 468 } 469 } else { 470 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 471 if (iter->second.bssid == index) { 472 iter->second.connFailedCount = count; 473 return 0; 474 } 475 } 476 } 477 return -1; 478 } 479 SyncDeviceConfig()480 int WifiSettings::SyncDeviceConfig() 481 { 482 #ifndef CONFIG_NO_CONFIG_WRITE 483 std::unique_lock<std::mutex> lock(mStaMutex); 484 std::vector<WifiDeviceConfig> tmp; 485 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); ++iter) { 486 if (!iter->second.isEphemeral && iter->second.instanceId == 0) { 487 tmp.push_back(iter->second); 488 } 489 } 490 RemoveExcessDeviceConfigs(tmp); 491 mSavedDeviceConfig.SetValue(tmp); 492 return mSavedDeviceConfig.SaveConfig(); 493 #else 494 return 0; 495 #endif 496 } 497 ReloadDeviceConfig()498 int WifiSettings::ReloadDeviceConfig() 499 { 500 #ifndef CONFIG_NO_CONFIG_WRITE 501 std::unique_lock<std::mutex> lock(mStaMutex); 502 int ret = mSavedDeviceConfig.LoadConfig(); 503 if (ret < 0) { 504 deviceConfigLoadFlag.clear(); 505 LOGD("Loading device config failed: %{public}d", ret); 506 return -1; 507 } 508 deviceConfigLoadFlag.test_and_set(); 509 std::vector<WifiDeviceConfig> tmp; 510 mSavedDeviceConfig.GetValue(tmp); 511 mNetworkId = 0; 512 mWifiDeviceConfig.clear(); 513 for (std::size_t i = 0; i < tmp.size(); ++i) { 514 WifiDeviceConfig &item = tmp[i]; 515 item.networkId = mNetworkId++; 516 mWifiDeviceConfig.emplace(item.networkId, item); 517 } 518 if (!mEncryptionOnBootFalg.test_and_set()) { 519 mWifiEncryptionThread = std::make_unique<WifiEventHandler>("WifiEncryptionThread"); 520 mWifiEncryptionThread->PostAsyncTask([this]() { 521 LOGI("ReloadDeviceConfig EncryptionWifiDeviceConfigOnBoot start."); 522 EncryptionWifiDeviceConfigOnBoot(); 523 }); 524 } 525 return 0; 526 #else 527 std::unique_lock<std::mutex> lock(mStaMutex); 528 mWifiDeviceConfig.clear(); 529 return 0; 530 #endif 531 } 532 GetNextNetworkId()533 int WifiSettings::GetNextNetworkId() 534 { 535 std::unique_lock<std::mutex> lock(mStaMutex); 536 return mNetworkId++; 537 } 538 AddWpsDeviceConfig(const WifiDeviceConfig & config)539 int WifiSettings::AddWpsDeviceConfig(const WifiDeviceConfig &config) 540 { 541 int ret = mSavedDeviceConfig.LoadConfig(); 542 if (ret < 0) { 543 LOGE("Add Wps config loading config failed: %{public}d", ret); 544 return -1; 545 } 546 std::vector<WifiDeviceConfig> tmp; 547 mSavedDeviceConfig.GetValue(tmp); 548 std::unique_lock<std::mutex> lock(mStaMutex); 549 mWifiDeviceConfig.clear(); 550 mNetworkId = 0; 551 mWifiDeviceConfig.emplace(mNetworkId++, config); 552 for (std::size_t i = 0; i < tmp.size(); ++i) { 553 WifiDeviceConfig &item = tmp[i]; 554 item.networkId = mNetworkId++; 555 mWifiDeviceConfig.emplace(item.networkId, item); 556 } 557 return 0; 558 } 559 560 #ifndef OHOS_ARCH_LITE OnRestore(UniqueFd & fd,const std::string & restoreInfo)561 int WifiSettings::OnRestore(UniqueFd &fd, const std::string &restoreInfo) 562 { 563 LOGI("OnRestore enter."); 564 const std::string versionForXml = "9"; 565 std::string key; 566 std::string iv; 567 std::string version; 568 ParseBackupJson(restoreInfo, key, iv, version); 569 570 std::vector<WifiDeviceConfig> deviceConfigs; 571 int ret = 0; 572 if (version == versionForXml) { 573 ret = GetConfigbyBackupXml(deviceConfigs, fd); 574 } else { 575 ret = GetConfigbyBackupFile(deviceConfigs, fd, key, iv); 576 } 577 std::fill(key.begin(), key.end(), 0); 578 if (ret < 0) { 579 LOGE("OnRestore fail to get config from backup."); 580 return ret; 581 } 582 583 LOGI("OnRestore end. Restore count: %{public}d", static_cast<int>(deviceConfigs.size())); 584 ConfigsDeduplicateAndSave(deviceConfigs); 585 return 0; 586 } 587 OnBackup(UniqueFd & fd,const std::string & backupInfo)588 int WifiSettings::OnBackup(UniqueFd &fd, const std::string &backupInfo) 589 { 590 LOGI("OnBackup enter."); 591 std::string key; 592 std::string iv; 593 std::string version; 594 ParseBackupJson(backupInfo, key, iv, version); 595 if (key.size() == 0 || iv.size() == 0) { 596 LOGE("OnBackup key or iv is empty."); 597 return -1; 598 } 599 mSavedDeviceConfig.LoadConfig(); 600 std::vector<WifiDeviceConfig> localConfigs; 601 mSavedDeviceConfig.GetValue(localConfigs); 602 603 std::vector<WifiBackupConfig> backupConfigs; 604 for (auto &config : localConfigs) { 605 if (config.wifiEapConfig.eap.length() != 0 || config.isPasspoint == true) { 606 continue; 607 } 608 #ifdef FEATURE_ENCRYPTION_SUPPORT 609 DecryptionDeviceConfig(config); 610 #endif 611 WifiBackupConfig backupConfig; 612 ConvertDeviceCfgToBackupCfg(config, backupConfig); 613 backupConfigs.push_back(backupConfig); 614 } 615 std::vector<WifiDeviceConfig>().swap(localConfigs); 616 617 WifiConfigFileImpl<WifiBackupConfig> wifiBackupConfig; 618 wifiBackupConfig.SetConfigFilePath(BACKUP_CONFIG_FILE_PATH); 619 wifiBackupConfig.SetEncryptionInfo(key, iv); 620 wifiBackupConfig.SetValue(backupConfigs); 621 wifiBackupConfig.SaveConfig(); 622 wifiBackupConfig.UnsetEncryptionInfo(); 623 std::fill(key.begin(), key.end(), 0); 624 625 fd = UniqueFd(open(BACKUP_CONFIG_FILE_PATH, O_RDONLY)); 626 if (fd.Get() < 0) { 627 LOGE("OnBackup open fail."); 628 return -1; 629 } 630 LOGI("OnBackup end. Backup count: %{public}d, fd: %{public}d.", static_cast<int>(backupConfigs.size()), fd.Get()); 631 return 0; 632 } 633 SetBackupReplyCode(int replyCode)634 std::string WifiSettings::SetBackupReplyCode(int replyCode) 635 { 636 Json::Value root; 637 Json::Value resultInfo; 638 Json::Value errorInfo; 639 640 errorInfo["type"] = "ErrorInfo"; 641 errorInfo["errorCode"] = std::to_string(replyCode); 642 errorInfo["errorInfo"] = ""; 643 644 resultInfo.append(errorInfo); 645 root["resultInfo"] = resultInfo; 646 647 Json::FastWriter writer; 648 return writer.write(root); 649 } 650 RemoveBackupFile()651 void WifiSettings::RemoveBackupFile() 652 { 653 remove(BACKUP_CONFIG_FILE_PATH); 654 } 655 #endif 656 AddRandomMac(WifiStoreRandomMac & randomMacInfo)657 bool WifiSettings::AddRandomMac(WifiStoreRandomMac &randomMacInfo) 658 { 659 std::unique_lock<std::mutex> lock(mStaMutex); 660 if (!MacAddress::IsValidMac(randomMacInfo.randomMac)) { 661 LOGE("%{public}s failed randomMac is inValid.", __func__); 662 return false; 663 } 664 bool isAdded = false; 665 std::string fuzzyBssid = ""; 666 if (IsPskEncryption(randomMacInfo.keyMgmt)) { 667 fuzzyBssid = FuzzyBssid(randomMacInfo.peerBssid); 668 } 669 670 for (auto &ele : mWifiStoreRandomMac) { 671 if (IsPskEncryption(ele.keyMgmt)) { 672 if (ele.randomMac != randomMacInfo.randomMac) { 673 continue; 674 } 675 if (ele.fuzzyBssids.find(fuzzyBssid) != ele.fuzzyBssids.end()) { 676 LOGI("AddRandomMac is contains fuzzyBssid:%{public}s", MacAnonymize(fuzzyBssid).c_str()); 677 return true; 678 } 679 if (ele.fuzzyBssids.size() <= FUZZY_BSSID_MAX_MATCH_CNT) { 680 ele.fuzzyBssids.insert(fuzzyBssid); 681 LOGI("AddRandomMac insert fuzzyBssid:%{public}s", MacAnonymize(fuzzyBssid).c_str()); 682 isAdded = true; 683 break; 684 } else { 685 LOGI("AddRandomMac ele.fuzzyBssids.size is max count"); 686 return false; 687 } 688 } 689 if (ele.ssid == randomMacInfo.ssid && ele.keyMgmt == randomMacInfo.keyMgmt) { 690 return true; 691 } 692 } 693 694 LOGI("AddRandomMac isAdded:%{public}d", isAdded); 695 if (!isAdded) { 696 if (IsPskEncryption(randomMacInfo.keyMgmt)) { 697 randomMacInfo.fuzzyBssids.insert(fuzzyBssid); 698 } 699 mWifiStoreRandomMac.push_back(randomMacInfo); 700 } 701 702 mSavedWifiStoreRandomMac.SetValue(mWifiStoreRandomMac); 703 mSavedWifiStoreRandomMac.SaveConfig(); 704 return isAdded; 705 } 706 GetRandomMac(WifiStoreRandomMac & randomMacInfo)707 bool WifiSettings::GetRandomMac(WifiStoreRandomMac &randomMacInfo) 708 { 709 std::unique_lock<std::mutex> lock(mStaMutex); 710 std::string fuzzyBssid = ""; 711 if (IsPskEncryption(randomMacInfo.keyMgmt)) { 712 fuzzyBssid = FuzzyBssid(randomMacInfo.peerBssid); 713 } 714 715 for (auto &item : mWifiStoreRandomMac) { 716 if (!MacAddress::IsValidMac(item.randomMac)) { 717 continue; 718 } 719 if (IsPskEncryption(item.keyMgmt)) { 720 if (item.fuzzyBssids.find(fuzzyBssid) != item.fuzzyBssids.end()) { 721 LOGI("GetStaRandomMac fuzzyBssids contains fuzzyBssid:%{public}s", 722 MacAnonymize(fuzzyBssid).c_str()); 723 randomMacInfo.randomMac = item.randomMac; 724 break; 725 } 726 } else { 727 if (item.ssid == randomMacInfo.ssid && item.keyMgmt == randomMacInfo.keyMgmt) { 728 randomMacInfo.randomMac = item.randomMac; 729 break; 730 } 731 } 732 } 733 return randomMacInfo.randomMac.empty(); 734 } 735 ReloadTrustListPolicies()736 const std::vector<TrustListPolicy> WifiSettings::ReloadTrustListPolicies() 737 { 738 std::unique_lock<std::mutex> lock(mScanMutex); 739 mTrustListPolicies.LoadConfig(); 740 if (mTrustListPolicies.GetValue().size() <= 0) { 741 std::vector<TrustListPolicy> policies; 742 TrustListPolicy policy; 743 policies.push_back(policy); 744 mTrustListPolicies.SetValue(policies); 745 mTrustListPolicies.SaveConfig(); 746 mTrustListPolicies.LoadConfig(); 747 } 748 749 return mTrustListPolicies.GetValue(); 750 } 751 ReloadMovingFreezePolicy()752 const MovingFreezePolicy WifiSettings::ReloadMovingFreezePolicy() 753 { 754 std::unique_lock<std::mutex> lock(mScanMutex); 755 mMovingFreezePolicy.LoadConfig(); 756 757 if (mMovingFreezePolicy.GetValue().size() <= 0) { 758 std::vector<MovingFreezePolicy> policies; 759 MovingFreezePolicy policy; 760 policies.push_back(policy); 761 mMovingFreezePolicy.SetValue(policies); 762 mMovingFreezePolicy.SaveConfig(); 763 mMovingFreezePolicy.LoadConfig(); 764 } 765 766 if (mMovingFreezePolicy.GetValue().size() <= 0) { 767 return MovingFreezePolicy(); 768 } 769 return mMovingFreezePolicy.GetValue()[0]; 770 } 771 GetPackageFilterMap(std::map<std::string,std::vector<std::string>> & filterMap)772 int WifiSettings::GetPackageFilterMap(std::map<std::string, std::vector<std::string>> &filterMap) 773 { 774 std::unique_lock<std::mutex> lock(mScanMutex); 775 filterMap = mFilterMap; 776 return 0; 777 } 778 SyncHotspotConfig()779 int WifiSettings::SyncHotspotConfig() 780 { 781 std::unique_lock<std::mutex> lock(mApMutex); 782 std::vector<HotspotConfig> tmp; 783 784 for (int i = 0; i < AP_INSTANCE_MAX_NUM; i++) { 785 auto iter = mHotspotConfig.find(i); 786 if (iter != mHotspotConfig.end()) { 787 tmp.push_back(iter->second); 788 } 789 } 790 mSavedHotspotConfig.SetValue(tmp); 791 mSavedHotspotConfig.SaveConfig(); 792 793 return 0; 794 } 795 SetHotspotConfig(const HotspotConfig & config,int id)796 int WifiSettings::SetHotspotConfig(const HotspotConfig &config, int id) 797 { 798 std::unique_lock<std::mutex> lock(mApMutex); 799 if (config.GetPreSharedKey() != mHotspotConfig[id].GetPreSharedKey()) { 800 LOGI("Hotspot preSharedKey changed to %{public}s", PassWordAnonymize(config.GetPreSharedKey()).c_str()); 801 } 802 if (config.GetSsid() != mHotspotConfig[id].GetSsid()) { 803 LOGI("Hotspot ssid changed to %{public}s", SsidAnonymize(config.GetSsid()).c_str()); 804 } 805 mHotspotConfig[id] = config; 806 return 0; 807 } 808 GetHotspotConfig(HotspotConfig & config,int id)809 int WifiSettings::GetHotspotConfig(HotspotConfig &config, int id) 810 { 811 std::unique_lock<std::mutex> lock(mApMutex); 812 auto iter = mHotspotConfig.find(id); 813 if (iter != mHotspotConfig.end()) { 814 config = iter->second; 815 } 816 return 0; 817 } 818 819 ClearHotspotConfig()820 void WifiSettings::ClearHotspotConfig() 821 { 822 std::unique_lock<std::mutex> lock(mApMutex); 823 mHotspotConfig.clear(); 824 HotspotConfig config; 825 #ifdef INIT_LIB_ENABLE 826 std::string ssid = GetMarketName(); 827 #endif 828 config.SetSecurityType(KeyMgmt::WPA2_PSK); 829 config.SetBand(BandType::BAND_2GHZ); 830 config.SetChannel(AP_CHANNEL_DEFAULT); 831 config.SetMaxConn(GetApMaxConnNum()); 832 config.SetBandWidth(AP_BANDWIDTH_DEFAULT); 833 #ifdef INIT_LIB_ENABLE 834 config.SetSsid(ssid); 835 #else 836 config.SetSsid("OHOS_" + GetRandomStr(RANDOM_STR_LEN)); 837 #endif 838 config.SetPreSharedKey(GetRandomStr(RANDOM_PASSWD_LEN)); 839 auto ret = mHotspotConfig.emplace(0, config); 840 if (!ret.second) { 841 mHotspotConfig[0] = config; 842 } 843 } 844 GetBlockList(std::vector<StationInfo> & results,int id)845 int WifiSettings::GetBlockList(std::vector<StationInfo> &results, int id) 846 { 847 std::unique_lock<std::mutex> lock(mApMutex); 848 for (auto iter = mBlockListInfo.begin(); iter != mBlockListInfo.end(); iter++) { 849 results.push_back(iter->second); 850 } 851 return 0; 852 } 853 ManageBlockList(const StationInfo & info,int mode,int id)854 int WifiSettings::ManageBlockList(const StationInfo &info, int mode, int id) 855 { 856 std::unique_lock<std::mutex> lock(mApMutex); 857 auto iter = mBlockListInfo.find(info.bssid); 858 if (MODE_ADD == mode || MODE_UPDATE == mode) { 859 if (mBlockListInfo.end() != iter) { 860 iter->second = info; 861 } else { 862 mBlockListInfo.emplace(std::make_pair(info.bssid, info)); 863 } 864 } else if (MODE_DEL == mode) { 865 if (mBlockListInfo.end() != iter) { 866 mBlockListInfo.erase(iter); 867 } 868 } else { 869 return -1; 870 } 871 SyncBlockList(); 872 return 0; 873 } 874 SyncWifiP2pGroupInfoConfig()875 int WifiSettings::SyncWifiP2pGroupInfoConfig() 876 { 877 std::unique_lock<std::mutex> lock(mP2pMutex); 878 mSavedWifiP2pGroupInfo.SetValue(mGroupInfoList); 879 return mSavedWifiP2pGroupInfo.SaveConfig(); 880 } 881 SetWifiP2pGroupInfo(const std::vector<WifiP2pGroupInfo> & groups)882 int WifiSettings::SetWifiP2pGroupInfo(const std::vector<WifiP2pGroupInfo> &groups) 883 { 884 std::unique_lock<std::mutex> lock(mP2pMutex); 885 mGroupInfoList = groups; 886 return 0; 887 } 888 RemoveWifiP2pGroupInfo()889 int WifiSettings::RemoveWifiP2pGroupInfo() 890 { 891 std::unique_lock<std::mutex> lock(mP2pMutex); 892 mGroupInfoList.clear(); 893 return 0; 894 } 895 RemoveWifiP2pSupplicantGroupInfo()896 int WifiSettings::RemoveWifiP2pSupplicantGroupInfo() 897 { 898 std::filesystem::path pathName = P2P_SUPPLICANT_CONFIG_FILE; 899 std::error_code code; 900 if (!std::filesystem::exists(pathName, code)) { 901 LOGE("p2p_supplicant file do not exists!, file:%{public}s", P2P_SUPPLICANT_CONFIG_FILE); 902 return -1; 903 } 904 std::error_code ec; 905 int retval = std::filesystem::remove(P2P_SUPPLICANT_CONFIG_FILE, ec); 906 if (!ec) { // successful 907 LOGI("p2p_supplicant file removed successful, retval:%{public}d value:%{public}d message:%{public}s", 908 retval, ec.value(), ec.message().c_str()); 909 return 0; 910 } // unsuccessful 911 LOGE("p2p_supplicant file removed unsuccessful, value:%{public}d value:%{public}d message:%{public}s", 912 retval, ec.value(), ec.message().c_str()); 913 return -1; 914 } 915 GetWifiP2pGroupInfo(std::vector<WifiP2pGroupInfo> & groups)916 int WifiSettings::GetWifiP2pGroupInfo(std::vector<WifiP2pGroupInfo> &groups) 917 { 918 std::unique_lock<std::mutex> lock(mP2pMutex); 919 groups = mGroupInfoList; 920 return 0; 921 } 922 SyncP2pVendorConfig()923 int WifiSettings::SyncP2pVendorConfig() 924 { 925 std::unique_lock<std::mutex> lock(mP2pMutex); 926 std::vector<P2pVendorConfig> tmp; 927 tmp.push_back(mP2pVendorConfig); 928 mSavedWifiP2pVendorConfig.SetValue(tmp); 929 return mSavedWifiP2pVendorConfig.SaveConfig(); 930 } 931 SetP2pDeviceName(const std::string & deviceName)932 int WifiSettings::SetP2pDeviceName(const std::string &deviceName) 933 { 934 std::unique_lock<std::mutex> lock(mP2pMutex); 935 mP2pVendorConfig.SetDeviceName(deviceName); 936 std::vector<P2pVendorConfig> tmp; 937 tmp.push_back(mP2pVendorConfig); 938 mSavedWifiP2pVendorConfig.SetValue(tmp); 939 return mSavedWifiP2pVendorConfig.SaveConfig(); 940 } 941 SetP2pVendorConfig(const P2pVendorConfig & config)942 int WifiSettings::SetP2pVendorConfig(const P2pVendorConfig &config) 943 { 944 std::unique_lock<std::mutex> lock(mP2pMutex); 945 mP2pVendorConfig = config; 946 return 0; 947 } 948 GetP2pVendorConfig(P2pVendorConfig & config)949 int WifiSettings::GetP2pVendorConfig(P2pVendorConfig &config) 950 { 951 std::unique_lock<std::mutex> lock(mP2pMutex); 952 config = mP2pVendorConfig; 953 return 0; 954 } 955 GetScanAlwaysState(int instId)956 bool WifiSettings::GetScanAlwaysState(int instId) 957 { 958 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 959 auto iter = mWifiConfig.find(instId); 960 if (iter != mWifiConfig.end()) { 961 return iter->second.scanAlwaysSwitch; 962 } 963 return mWifiConfig[0].scanAlwaysSwitch; 964 } 965 GetSignalLevel(const int & rssi,const int & band,int instId)966 int WifiSettings::GetSignalLevel(const int &rssi, const int &band, int instId) 967 { 968 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 969 int level = 0; 970 auto iter = mWifiConfig.find(instId); 971 if (iter != mWifiConfig.end()) { 972 do { 973 if (band == static_cast<int>(BandType::BAND_5GHZ)) { 974 if (rssi < iter->second.firstRssiLevel5G) { 975 break; 976 } 977 ++level; 978 if (rssi < iter->second.secondRssiLevel5G) { 979 break; 980 } 981 ++level; 982 if (rssi < iter->second.thirdRssiLevel5G) { 983 break; 984 } 985 ++level; 986 if (rssi < iter->second.fourthRssiLevel5G) { 987 break; 988 } 989 ++level; 990 } else { 991 if (rssi < iter->second.firstRssiLevel2G) { 992 break; 993 } 994 ++level; 995 if (rssi < iter->second.secondRssiLevel2G) { 996 break; 997 } 998 ++level; 999 if (rssi < iter->second.thirdRssiLevel2G) { 1000 break; 1001 } 1002 ++level; 1003 if (rssi < iter->second.fourthRssiLevel2G) { 1004 break; 1005 } 1006 ++level; 1007 } 1008 } while (0); 1009 } 1010 return level; 1011 } 1012 GetOperatorWifiType(int instId)1013 int WifiSettings::GetOperatorWifiType(int instId) 1014 { 1015 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1016 auto iter = mWifiConfig.find(instId); 1017 if (iter != mWifiConfig.end()) { 1018 return iter->second.staAirplaneMode; 1019 } 1020 return mWifiConfig[0].staAirplaneMode; 1021 } 1022 SetOperatorWifiType(int type,int instId)1023 int WifiSettings::SetOperatorWifiType(int type, int instId) 1024 { 1025 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1026 mWifiConfig[instId].staAirplaneMode = type; 1027 struct timespec times = {0, 0}; 1028 clock_gettime(CLOCK_REALTIME, ×); 1029 int64_t curTimeMs = static_cast<int64_t>(times.tv_sec) * MSEC + times.tv_nsec / (MSEC * MSEC); 1030 LOGI("set persist wifi state, current time is:%{public}" PRId64, curTimeMs); 1031 mWifiConfig[instId].persistWifiTime = curTimeMs; 1032 SyncWifiConfig(); 1033 return 0; 1034 } 1035 GetLastAirplaneMode(int instId)1036 int WifiSettings::GetLastAirplaneMode(int instId) 1037 { 1038 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1039 auto iter = mWifiConfig.find(instId); 1040 if (iter != mWifiConfig.end()) { 1041 return iter->second.lastAirplaneMode; 1042 } 1043 return mWifiConfig[0].lastAirplaneMode; 1044 } 1045 SetLastAirplaneMode(int mode,int instId)1046 int WifiSettings::SetLastAirplaneMode(int mode, int instId) 1047 { 1048 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1049 mWifiConfig[instId].lastAirplaneMode = mode; 1050 SyncWifiConfig(); 1051 return 0; 1052 } 1053 1054 #ifndef OHOS_ARCH_LITE SetWifiToggleCaller(int callerPid,int instId)1055 int WifiSettings::SetWifiToggleCaller(int callerPid, int instId) 1056 { 1057 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1058 mWifiConfig[instId].toggleWifiCaller = callerPid; 1059 SyncWifiConfig(); 1060 return 0; 1061 } 1062 #endif 1063 GetCanOpenStaWhenAirplaneMode(int instId)1064 bool WifiSettings::GetCanOpenStaWhenAirplaneMode(int instId) 1065 { 1066 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1067 auto iter = mWifiConfig.find(instId); 1068 if (iter != mWifiConfig.end()) { 1069 return iter->second.canOpenStaWhenAirplane; 1070 } 1071 return mWifiConfig[0].canOpenStaWhenAirplane; 1072 } 1073 SetWifiFlagOnAirplaneMode(bool ifOpen,int instId)1074 int WifiSettings::SetWifiFlagOnAirplaneMode(bool ifOpen, int instId) 1075 { 1076 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1077 mWifiConfig[instId].openWifiWhenAirplane = ifOpen; 1078 SyncWifiConfig(); 1079 return 0; 1080 } 1081 GetWifiFlagOnAirplaneMode(int instId)1082 bool WifiSettings::GetWifiFlagOnAirplaneMode(int instId) 1083 { 1084 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1085 auto iter = mWifiConfig.find(instId); 1086 if (iter != mWifiConfig.end()) { 1087 return iter->second.openWifiWhenAirplane; 1088 } 1089 return mWifiConfig[0].openWifiWhenAirplane; 1090 } 1091 SetWifiDisabledByAirplane(bool disabledByAirplane,int instId)1092 int WifiSettings::SetWifiDisabledByAirplane(bool disabledByAirplane, int instId) 1093 { 1094 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1095 mWifiConfig[instId].wifiDisabledByAirplane = disabledByAirplane; 1096 SyncWifiConfig(); 1097 return 0; 1098 } 1099 GetWifiDisabledByAirplane(int instId)1100 bool WifiSettings::GetWifiDisabledByAirplane(int instId) 1101 { 1102 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1103 auto iter = mWifiConfig.find(instId); 1104 if (iter != mWifiConfig.end()) { 1105 return iter->second.wifiDisabledByAirplane; 1106 } 1107 return mWifiConfig[0].wifiDisabledByAirplane; 1108 } 1109 GetStaLastRunState(int instId)1110 int WifiSettings::GetStaLastRunState(int instId) 1111 { 1112 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1113 auto iter = mWifiConfig.find(instId); 1114 if (iter != mWifiConfig.end()) { 1115 return iter->second.staLastState; 1116 } 1117 return mWifiConfig[0].staLastState; 1118 } 1119 SetStaLastRunState(int bRun,int instId)1120 int WifiSettings::SetStaLastRunState(int bRun, int instId) 1121 { 1122 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1123 mWifiConfig[instId].staLastState = bRun; 1124 SyncWifiConfig(); 1125 return 0; 1126 } 1127 GetDhcpIpType(int instId)1128 int WifiSettings::GetDhcpIpType(int instId) 1129 { 1130 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1131 auto iter = mWifiConfig.find(instId); 1132 if (iter != mWifiConfig.end()) { 1133 return iter->second.dhcpIpType; 1134 } 1135 return mWifiConfig[0].dhcpIpType; 1136 } 1137 GetWhetherToAllowNetworkSwitchover(int instId)1138 bool WifiSettings::GetWhetherToAllowNetworkSwitchover(int instId) 1139 { 1140 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1141 auto iter = mWifiConfig.find(instId); 1142 if (iter != mWifiConfig.end()) { 1143 return iter->second.whetherToAllowNetworkSwitchover; 1144 } 1145 return mWifiConfig[0].whetherToAllowNetworkSwitchover; 1146 } 1147 GetScoretacticsScoreSlope(int instId)1148 int WifiSettings::GetScoretacticsScoreSlope(int instId) 1149 { 1150 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1151 auto iter = mWifiConfig.find(instId); 1152 if (iter != mWifiConfig.end()) { 1153 return iter->second.scoretacticsScoreSlope; 1154 } 1155 return mWifiConfig[0].scoretacticsScoreSlope; 1156 } 1157 GetScoretacticsInitScore(int instId)1158 int WifiSettings::GetScoretacticsInitScore(int instId) 1159 { 1160 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1161 auto iter = mWifiConfig.find(instId); 1162 if (iter != mWifiConfig.end()) { 1163 return iter->second.scoretacticsInitScore; 1164 } 1165 return mWifiConfig[0].scoretacticsInitScore; 1166 } 1167 GetScoretacticsSameBssidScore(int instId)1168 int WifiSettings::GetScoretacticsSameBssidScore(int instId) 1169 { 1170 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1171 auto iter = mWifiConfig.find(instId); 1172 if (iter != mWifiConfig.end()) { 1173 return iter->second.scoretacticsSameBssidScore; 1174 } 1175 return mWifiConfig[0].scoretacticsSameBssidScore; 1176 } 1177 GetScoretacticsSameNetworkScore(int instId)1178 int WifiSettings::GetScoretacticsSameNetworkScore(int instId) 1179 { 1180 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1181 auto iter = mWifiConfig.find(instId); 1182 if (iter != mWifiConfig.end()) { 1183 return iter->second.scoretacticsSameNetworkScore; 1184 } 1185 return mWifiConfig[0].scoretacticsSameNetworkScore; 1186 } 1187 GetScoretacticsFrequency5GHzScore(int instId)1188 int WifiSettings::GetScoretacticsFrequency5GHzScore(int instId) 1189 { 1190 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1191 auto iter = mWifiConfig.find(instId); 1192 if (iter != mWifiConfig.end()) { 1193 return iter->second.scoretacticsFrequency5GHzScore; 1194 } 1195 return mWifiConfig[0].scoretacticsFrequency5GHzScore; 1196 } 1197 GetScoretacticsLastSelectionScore(int instId)1198 int WifiSettings::GetScoretacticsLastSelectionScore(int instId) 1199 { 1200 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1201 auto iter = mWifiConfig.find(instId); 1202 if (iter != mWifiConfig.end()) { 1203 return iter->second.scoretacticsLastSelectionScore; 1204 } 1205 return mWifiConfig[0].scoretacticsLastSelectionScore; 1206 } 1207 GetScoretacticsSecurityScore(int instId)1208 int WifiSettings::GetScoretacticsSecurityScore(int instId) 1209 { 1210 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1211 auto iter = mWifiConfig.find(instId); 1212 if (iter != mWifiConfig.end()) { 1213 return iter->second.scoretacticsSecurityScore; 1214 } 1215 return mWifiConfig[0].scoretacticsSecurityScore; 1216 } 1217 GetScoretacticsNormalScore(int instId)1218 int WifiSettings::GetScoretacticsNormalScore(int instId) 1219 { 1220 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1221 auto iter = mWifiConfig.find(instId); 1222 if (iter != mWifiConfig.end()) { 1223 return iter->second.scoretacticsNormalScore; 1224 } 1225 return mWifiConfig[0].scoretacticsNormalScore; 1226 } 1227 GetSavedDeviceAppraisalPriority(int instId)1228 int WifiSettings::GetSavedDeviceAppraisalPriority(int instId) 1229 { 1230 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1231 auto iter = mWifiConfig.find(instId); 1232 if (iter != mWifiConfig.end()) { 1233 return iter->second.savedDeviceAppraisalPriority; 1234 } 1235 return mWifiConfig[0].savedDeviceAppraisalPriority; 1236 } 1237 IsModulePreLoad(const std::string & name)1238 bool WifiSettings::IsModulePreLoad(const std::string &name) 1239 { 1240 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1241 if (name == WIFI_SERVICE_STA) { 1242 return true; 1243 } else if (name == WIFI_SERVICE_SCAN) { 1244 return true; 1245 } else if (name == WIFI_SERVICE_AP) { 1246 return mWifiConfig[0].preLoadAp; 1247 } else if (name == WIFI_SERVICE_P2P) { 1248 return true; 1249 } else if (name == WIFI_SERVICE_AWARE) { 1250 return mWifiConfig[0].preLoadAware; 1251 } else if (name == WIFI_SERVICE_ENHANCE) { 1252 return mWifiConfig[0].preLoadEnhance; 1253 } else { 1254 return false; 1255 } 1256 } 1257 GetSupportHwPnoFlag(int instId)1258 bool WifiSettings::GetSupportHwPnoFlag(int instId) 1259 { 1260 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1261 auto iter = mWifiConfig.find(instId); 1262 if (iter != mWifiConfig.end()) { 1263 return iter->second.supportHwPnoFlag; 1264 } 1265 return mWifiConfig[0].supportHwPnoFlag; 1266 } 1267 GetMinRssi2Dot4Ghz(int instId)1268 int WifiSettings::GetMinRssi2Dot4Ghz(int instId) 1269 { 1270 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1271 auto iter = mWifiConfig.find(instId); 1272 if (iter != mWifiConfig.end()) { 1273 return iter->second.minRssi2Dot4Ghz; 1274 } 1275 return mWifiConfig[0].minRssi2Dot4Ghz; 1276 } 1277 GetMinRssi5Ghz(int instId)1278 int WifiSettings::GetMinRssi5Ghz(int instId) 1279 { 1280 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1281 auto iter = mWifiConfig.find(instId); 1282 if (iter != mWifiConfig.end()) { 1283 return iter->second.minRssi5Ghz; 1284 } 1285 return mWifiConfig[0].minRssi5Ghz; 1286 } 1287 SetRealMacAddress(const std::string & macAddress,int instId)1288 int WifiSettings::SetRealMacAddress(const std::string &macAddress, int instId) 1289 { 1290 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1291 mWifiConfig[instId].realMacAddress = macAddress; 1292 SyncWifiConfig(); 1293 return 0; 1294 } 1295 GetRealMacAddress(std::string & macAddress,int instId)1296 int WifiSettings::GetRealMacAddress(std::string &macAddress, int instId) 1297 { 1298 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1299 auto iter = mWifiConfig.find(instId); 1300 if (iter != mWifiConfig.end()) { 1301 macAddress = iter->second.realMacAddress; 1302 return 0; 1303 } 1304 macAddress = mWifiConfig[0].realMacAddress; 1305 return 0; 1306 } 1307 SetDefaultFrequenciesByCountryBand(const BandType band,std::vector<int> & frequencies,int instId)1308 void WifiSettings::SetDefaultFrequenciesByCountryBand(const BandType band, std::vector<int> &frequencies, int instId) 1309 { 1310 for (auto& item : g_countryDefaultFreqs) { 1311 if (item.band == band) { 1312 frequencies = item.freqs; 1313 } 1314 } 1315 } 1316 SetScanOnlySwitchState(const int & state,int instId)1317 void WifiSettings::SetScanOnlySwitchState(const int &state, int instId) 1318 { 1319 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1320 mWifiConfig[instId].scanOnlySwitch = state; 1321 SyncWifiConfig(); 1322 } 1323 GetScanOnlySwitchState(int instId)1324 int WifiSettings::GetScanOnlySwitchState(int instId) 1325 { 1326 std::unique_lock<std::mutex> lock(mWifiConfigMutex); 1327 if (IsFactoryMode()) { 1328 LOGI("factory mode, not allow scan only."); 1329 return 0; 1330 } 1331 auto iter = mWifiConfig.find(instId); 1332 if (iter != mWifiConfig.end()) { 1333 return iter->second.scanOnlySwitch; 1334 } 1335 return mWifiConfig[0].scanOnlySwitch; 1336 } 1337 EncryptionDeviceConfig(WifiDeviceConfig & config) const1338 bool WifiSettings::EncryptionDeviceConfig(WifiDeviceConfig &config) const 1339 { 1340 #ifdef FEATURE_ENCRYPTION_SUPPORT 1341 if (config.version == 1) { 1342 return true; 1343 } 1344 WifiEncryptionInfo mWifiEncryptionInfo; 1345 mWifiEncryptionInfo.SetFile(GetTClassName<WifiDeviceConfig>()); 1346 1347 config.encryptedData = ""; 1348 config.IV = ""; 1349 if (!config.preSharedKey.empty()) { 1350 EncryptedData encry; 1351 if (WifiEncryption(mWifiEncryptionInfo, config.preSharedKey, encry) == HKS_SUCCESS) { 1352 config.encryptedData = encry.encryptedPassword; 1353 config.IV = encry.IV; 1354 } else { 1355 LOGE("EncryptionDeviceConfig WifiEncryption preSharedKey failed"); 1356 WriteWifiEncryptionFailHiSysEvent(ENCRYPTION_EVENT, 1357 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1358 return false; 1359 } 1360 } 1361 1362 if (config.wepTxKeyIndex < 0 || config.wepTxKeyIndex >= WEPKEYS_SIZE) { 1363 config.wepTxKeyIndex = 0; 1364 } 1365 config.encryWepKeys[config.wepTxKeyIndex] = ""; 1366 config.IVWep = ""; 1367 if (!config.wepKeys[config.wepTxKeyIndex].empty()) { 1368 EncryptedData encryWep; 1369 if (WifiEncryption(mWifiEncryptionInfo, config.wepKeys[config.wepTxKeyIndex], encryWep) == HKS_SUCCESS) { 1370 config.encryWepKeys[config.wepTxKeyIndex] = encryWep.encryptedPassword; 1371 config.IVWep = encryWep.IV; 1372 } else { 1373 LOGE("EncryptionDeviceConfig WifiEncryption wepKeys failed"); 1374 WriteWifiEncryptionFailHiSysEvent(ENCRYPTION_EVENT, 1375 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1376 return false; 1377 } 1378 } 1379 1380 config.wifiEapConfig.encryptedData = ""; 1381 config.wifiEapConfig.IV = ""; 1382 if (!config.wifiEapConfig.eap.empty()) { 1383 EncryptedData encryEap; 1384 if (WifiEncryption(mWifiEncryptionInfo, config.wifiEapConfig.password, encryEap) == HKS_SUCCESS) { 1385 config.wifiEapConfig.encryptedData = encryEap.encryptedPassword; 1386 config.wifiEapConfig.IV = encryEap.IV; 1387 } else { 1388 LOGE("EncryptionDeviceConfig WifiEncryption eap failed"); 1389 WriteWifiEncryptionFailHiSysEvent(ENCRYPTION_EVENT, 1390 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1391 return false; 1392 } 1393 } 1394 if (!EncryptionWapiConfig(mWifiEncryptionInfo, config)) { 1395 return false; 1396 } 1397 config.version = 1; 1398 #endif 1399 return true; 1400 } 1401 IncreaseNumRebootsSinceLastUse()1402 int WifiSettings::IncreaseNumRebootsSinceLastUse() 1403 { 1404 std::unique_lock<std::mutex> lock(mStaMutex); 1405 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 1406 iter->second.numRebootsSinceLastUse++; 1407 } 1408 return 0; 1409 } 1410 EncryptionWifiDeviceConfigOnBoot()1411 void WifiSettings::EncryptionWifiDeviceConfigOnBoot() 1412 { 1413 #ifdef FEATURE_ENCRYPTION_SUPPORT 1414 std::unique_lock<std::mutex> lock(mConfigOnBootMutex); 1415 if (mSavedDeviceConfig.LoadConfig() < 0) { 1416 return; 1417 } 1418 std::vector<WifiDeviceConfig> tmp; 1419 mSavedDeviceConfig.GetValue(tmp); 1420 int count = 0; 1421 1422 for (std::size_t i = 0; i < tmp.size(); ++i) { 1423 WifiDeviceConfig &item = tmp[i]; 1424 if (item.version == -1 && EncryptionDeviceConfig(item)) { 1425 count ++; 1426 } 1427 } 1428 if (count > 0) { 1429 mSavedDeviceConfig.SetValue(tmp); 1430 mSavedDeviceConfig.SaveConfig(); 1431 ReloadDeviceConfig(); 1432 } 1433 LOGI("EncryptionWifiDeviceConfigOnBoot end count:%{public}d", count); 1434 #endif 1435 } 1436 ReloadStaRandomMac()1437 int WifiSettings::ReloadStaRandomMac() 1438 { 1439 std::unique_lock<std::mutex> lock(mStaMutex); 1440 if (mSavedWifiStoreRandomMac.LoadConfig()) { 1441 return -1; 1442 } 1443 mWifiStoreRandomMac.clear(); 1444 mSavedWifiStoreRandomMac.GetValue(mWifiStoreRandomMac); 1445 bool shouldReset = false; 1446 for (const auto &item: mWifiStoreRandomMac) { 1447 if (item.version == -1) { 1448 shouldReset = true; 1449 break; 1450 } 1451 } 1452 LOGI("%{public}s shouldReset:%{public}s", __func__, shouldReset ? "true" : "false"); 1453 if (shouldReset) { 1454 for (auto &item: mWifiStoreRandomMac) { 1455 item.version = 0; 1456 } 1457 mSavedWifiStoreRandomMac.SetValue(mWifiStoreRandomMac); 1458 mSavedWifiStoreRandomMac.SaveConfig(); 1459 } 1460 return 0; 1461 } 1462 InitPackageFilterConfig()1463 void WifiSettings::InitPackageFilterConfig() 1464 { 1465 if (mPackageFilterConfig.LoadConfig() >= 0) { 1466 std::vector<PackageFilterConf> tmp; 1467 mPackageFilterConfig.GetValue(tmp); 1468 std::unique_lock<std::mutex> lock(mScanMutex); 1469 for (unsigned int i = 0; i < tmp.size(); i++) { 1470 mFilterMap.insert(std::make_pair(tmp[i].filterName, tmp[i].packageList)); 1471 } 1472 } 1473 return; 1474 } 1475 GetVariableMap(std::map<std::string,std::string> & variableMap)1476 int WifiSettings::GetVariableMap(std::map<std::string, std::string> &variableMap) 1477 { 1478 std::unique_lock<std::mutex> lock(mVariableConfMutex); 1479 variableMap = mVariableMap; 1480 return 0; 1481 } 1482 GetVariablePackageName(std::string tag)1483 std::string WifiSettings::GetVariablePackageName(std::string tag) 1484 { 1485 std::unique_lock<std::mutex> lock(mVariableConfMutex); 1486 if (mVariableMap.find(tag) != mVariableMap.end()) { 1487 return mVariableMap[tag]; 1488 } 1489 return ""; 1490 } 1491 InitVariableConfig()1492 void WifiSettings::InitVariableConfig() 1493 { 1494 if (mVariableConf.LoadConfig() >= 0) { 1495 std::vector<VariableConf> tmp; 1496 mVariableConf.GetValue(tmp); 1497 std::unique_lock<std::mutex> lock(mVariableConfMutex); 1498 for (unsigned int i = 0; i < tmp.size(); i++) { 1499 mVariableMap.insert(std::make_pair(tmp[i].variableName, tmp[i].variableValue)); 1500 } 1501 } 1502 return; 1503 } 1504 InitDefaultHotspotConfig()1505 void WifiSettings::InitDefaultHotspotConfig() 1506 { 1507 HotspotConfig cfg; 1508 #ifdef INIT_LIB_ENABLE 1509 std::string ssid = GetMarketName(); 1510 #endif 1511 cfg.SetSecurityType(KeyMgmt::WPA2_PSK); 1512 cfg.SetBand(BandType::BAND_2GHZ); 1513 cfg.SetChannel(AP_CHANNEL_DEFAULT); 1514 cfg.SetMaxConn(GetApMaxConnNum()); 1515 cfg.SetBandWidth(AP_BANDWIDTH_DEFAULT); 1516 #ifdef INIT_LIB_ENABLE 1517 cfg.SetSsid(ssid); 1518 #else 1519 cfg.SetSsid("OHOS_" + GetRandomStr(RANDOM_STR_LEN)); 1520 #endif 1521 cfg.SetPreSharedKey(GetRandomStr(RANDOM_PASSWD_LEN)); 1522 auto ret = mHotspotConfig.emplace(0, cfg); 1523 if (!ret.second) { 1524 mHotspotConfig[0] = cfg; 1525 } 1526 } 1527 InitHotspotConfig()1528 void WifiSettings::InitHotspotConfig() 1529 { 1530 /* init hotspot config */ 1531 if (mSavedHotspotConfig.LoadConfig() >= 0) { 1532 std::vector<HotspotConfig> tmp; 1533 mSavedHotspotConfig.GetValue(tmp); 1534 if (tmp.size() > 0) { 1535 for (size_t i = 0; i < tmp.size(); i++) { 1536 mHotspotConfig[i] = tmp[i]; 1537 } 1538 } else { 1539 LOGI("load hotspot config success, but tmp.size() = 0, use default config"); 1540 InitDefaultHotspotConfig(); 1541 } 1542 } else { 1543 LOGI("load hotspot config fail, use default config"); 1544 InitDefaultHotspotConfig(); 1545 } 1546 /* init block list info */ 1547 if (mSavedBlockInfo.LoadConfig() >= 0) { 1548 std::vector<StationInfo> tmp; 1549 mSavedBlockInfo.GetValue(tmp); 1550 for (std::size_t i = 0; i < tmp.size(); ++i) { 1551 StationInfo &item = tmp[i]; 1552 mBlockListInfo.emplace(item.bssid, item); 1553 } 1554 } 1555 return; 1556 } 1557 SyncBlockList()1558 int WifiSettings::SyncBlockList() 1559 { 1560 std::vector<StationInfo> tmp; 1561 for (auto iter = mBlockListInfo.begin(); iter != mBlockListInfo.end(); ++iter) { 1562 tmp.push_back(iter->second); 1563 } 1564 mSavedBlockInfo.SetValue(tmp); 1565 return mSavedBlockInfo.SaveConfig(); 1566 } 1567 ReloadWifiP2pGroupInfoConfig()1568 int WifiSettings::ReloadWifiP2pGroupInfoConfig() 1569 { 1570 std::unique_lock<std::mutex> lock(mP2pMutex); 1571 bool invalidGroupExist = false; 1572 if (mSavedWifiP2pGroupInfo.LoadConfig()) { 1573 return -1; 1574 } 1575 mSavedWifiP2pGroupInfo.GetValue(mGroupInfoList); 1576 for (auto iter = mGroupInfoList.begin(); iter != mGroupInfoList.end();) { 1577 int networkId = iter->GetNetworkId(); 1578 std::string passPhrase = iter->GetPassphrase(); 1579 if (passPhrase.empty()) { 1580 LOGI("ReloadWifiP2pGroupInfoConfig erase invalid networkId:%{public}d", networkId); 1581 iter = mGroupInfoList.erase(iter); 1582 invalidGroupExist = true; 1583 } else { 1584 ++iter; 1585 } 1586 } 1587 if (invalidGroupExist) { 1588 mSavedWifiP2pGroupInfo.SetValue(mGroupInfoList); 1589 mSavedWifiP2pGroupInfo.SaveConfig(); 1590 } 1591 return 0; 1592 } 1593 InitDefaultP2pVendorConfig()1594 void WifiSettings::InitDefaultP2pVendorConfig() 1595 { 1596 mP2pVendorConfig.SetRandomMacSupport(false); 1597 mP2pVendorConfig.SetIsAutoListen(false); 1598 mP2pVendorConfig.SetDeviceName(""); 1599 mP2pVendorConfig.SetPrimaryDeviceType(""); 1600 mP2pVendorConfig.SetSecondaryDeviceType(""); 1601 } 1602 InitP2pVendorConfig()1603 void WifiSettings::InitP2pVendorConfig() 1604 { 1605 if (mSavedWifiP2pVendorConfig.LoadConfig() >= 0) { 1606 std::vector<P2pVendorConfig> tmp; 1607 mSavedWifiP2pVendorConfig.GetValue(tmp); 1608 if (tmp.size() > 0) { 1609 mP2pVendorConfig = tmp[0]; 1610 } else { 1611 InitDefaultP2pVendorConfig(); 1612 } 1613 } else { 1614 InitDefaultP2pVendorConfig(); 1615 } 1616 return; 1617 } 1618 GetApMaxConnNum()1619 int WifiSettings::GetApMaxConnNum() 1620 { 1621 return mApMaxConnNum; 1622 } 1623 InitDefaultWifiConfig()1624 void WifiSettings::InitDefaultWifiConfig() 1625 { 1626 WifiConfig wifiConfig; 1627 mWifiConfig[0] = wifiConfig; 1628 } 1629 InitWifiConfig()1630 void WifiSettings::InitWifiConfig() 1631 { 1632 if (mSavedWifiConfig.LoadConfig() < 0) { 1633 return; 1634 } 1635 std::vector<WifiConfig> tmp; 1636 mSavedWifiConfig.GetValue(tmp); 1637 if (tmp.size() > 0) { 1638 for (size_t i = 0; i < tmp.size(); ++i) { 1639 mWifiConfig[i] = tmp[i]; 1640 } 1641 } else { 1642 InitDefaultWifiConfig(); 1643 } 1644 return; 1645 } 1646 SyncWifiConfig()1647 int WifiSettings::SyncWifiConfig() 1648 { 1649 std::vector<WifiConfig> tmp; 1650 for (auto &item : mWifiConfig) { 1651 tmp.push_back(item.second); 1652 } 1653 mSavedWifiConfig.SetValue(tmp); 1654 return mSavedWifiConfig.SaveConfig(); 1655 } 1656 RemoveExcessDeviceConfigs(std::vector<WifiDeviceConfig> & configs) const1657 int WifiSettings::RemoveExcessDeviceConfigs(std::vector<WifiDeviceConfig> &configs) const 1658 { 1659 int maxNumConfigs = mMaxNumConfigs; 1660 if (maxNumConfigs < 0) { 1661 return 1; 1662 } 1663 int numExcessNetworks = static_cast<int>(configs.size()) - maxNumConfigs; 1664 if (numExcessNetworks <= 0) { 1665 return 1; 1666 } 1667 sort(configs.begin(), configs.end(), [](WifiDeviceConfig a, WifiDeviceConfig b) { 1668 if (a.status != b.status) { 1669 return (a.status == 0) < (b.status == 0); 1670 } else if (a.lastConnectTime != b.lastConnectTime) { 1671 return a.lastConnectTime < b.lastConnectTime; 1672 } else if (a.numRebootsSinceLastUse != b.numRebootsSinceLastUse) { 1673 return a.numRebootsSinceLastUse > b.numRebootsSinceLastUse; 1674 } else if (a.numAssociation != b.numAssociation) { 1675 return a.numAssociation < b.numAssociation; 1676 } else { 1677 return a.networkId < b.networkId; 1678 } 1679 }); 1680 std::stringstream removeConfig; 1681 int maxIndex = numExcessNetworks > MAX_CONFIGS_NUM ? MAX_CONFIGS_NUM : numExcessNetworks; 1682 for (int i = 0; i < maxIndex; i++) { 1683 removeConfig << SsidAnonymize(configs[i].ssid) << ","; 1684 } 1685 LOGI("saved config size greater than %{public}d, remove ssid(print up to 1000)=%{public}s", 1686 maxNumConfigs, removeConfig.str().c_str()); 1687 std::vector<WifiDeviceConfig> newVec(configs.begin(), configs.begin() + numExcessNetworks); 1688 #ifdef SUPPORT_ClOUD_WIFI_ASSET 1689 WifiAssetManager::GetInstance().WifiAssetRemovePack(newVec); 1690 #endif 1691 configs.erase(configs.begin(), configs.begin() + numExcessNetworks); 1692 return 0; 1693 } 1694 FuzzyBssid(const std::string bssid)1695 std::string WifiSettings::FuzzyBssid(const std::string bssid) 1696 { 1697 if (bssid.empty() || bssid.length() != MAC_STRING_SIZE) { 1698 return ""; 1699 } 1700 return "xx" + bssid.substr(COMPARE_MAC_OFFSET, COMPARE_MAC_LENGTH) + "xx"; 1701 } 1702 1703 #ifndef OHOS_ARCH_LITE MergeWifiConfig()1704 void WifiSettings::MergeWifiConfig() 1705 { 1706 std::filesystem::path wifiPathNmae = WIFI_CONFIG_FILE_PATH; 1707 std::filesystem::path devicePathName = DEVICE_CONFIG_FILE_PATH; 1708 std::filesystem::path randomMacPathName = WIFI_STA_RANDOM_MAC_FILE_PATH; 1709 std::filesystem::path dualWifiPathName = DUAL_WIFI_CONFIG_FILE_PATH; 1710 std::error_code wifiConfigCode; 1711 std::error_code deviceConfigCode; 1712 std::error_code randomMacCode; 1713 std::error_code dualWifiCode; 1714 if (std::filesystem::exists(wifiPathNmae, wifiConfigCode) 1715 || std::filesystem::exists(devicePathName, deviceConfigCode) 1716 || std::filesystem::exists(randomMacPathName, randomMacCode)) { 1717 LOGI("file exists don't need to merge"); 1718 return; 1719 } 1720 if (!std::filesystem::exists(dualWifiPathName, dualWifiCode)) { 1721 LOGI("dual frame file do not exists, don't need to merge"); 1722 return; 1723 } 1724 std::unique_ptr<NetworkXmlParser> xmlParser = std::make_unique<NetworkXmlParser>(); 1725 bool ret = xmlParser->LoadConfiguration(DUAL_WIFI_CONFIG_FILE_PATH); 1726 if (!ret) { 1727 LOGE("MergeWifiConfig load fail"); 1728 return; 1729 } 1730 ret = xmlParser->Parse(); 1731 if (!ret) { 1732 LOGE("MergeWifiConfig Parse fail"); 1733 return; 1734 } 1735 std::vector<WifiDeviceConfig> wifideviceConfig = xmlParser->GetNetworks(); 1736 if (wifideviceConfig.size() == 0) { 1737 LOGE("MergeWifiConfig wifideviceConfig empty"); 1738 return; 1739 } 1740 mSavedDeviceConfig.SetValue(wifideviceConfig); 1741 mSavedDeviceConfig.SaveConfig(); 1742 std::unique_lock<std::mutex> lock(mStaMutex); 1743 std::vector<WifiStoreRandomMac> wifiStoreRandomMac = xmlParser->GetRandomMacmap(); 1744 mSavedWifiStoreRandomMac.SetValue(wifiStoreRandomMac); 1745 mSavedWifiStoreRandomMac.SaveConfig(); 1746 } 1747 MergeSoftapConfig()1748 void WifiSettings::MergeSoftapConfig() 1749 { 1750 LOGI("Enter mergeSoftapConfig"); 1751 std::filesystem::path wifiPathNmae = WIFI_CONFIG_FILE_PATH; 1752 std::filesystem::path hostapdPathName = HOTSPOT_CONFIG_FILE_PATH; 1753 std::filesystem::path dualApPathName = DUAL_SOFTAP_CONFIG_FILE_PATH; 1754 std::error_code wifiConfigCode; 1755 std::error_code hotspotConfigCode; 1756 std::error_code dualApCode; 1757 if (std::filesystem::exists(wifiPathNmae, wifiConfigCode) 1758 || std::filesystem::exists(hostapdPathName, hotspotConfigCode)) { 1759 LOGI("MergeSoftapConfig file exists don't need to merge"); 1760 return; 1761 } 1762 if (!std::filesystem::exists(dualApPathName, dualApCode)) { 1763 LOGI("MergeSoftapConfig dual frame file do not exists, don't need to merge"); 1764 return; 1765 } 1766 std::unique_ptr<SoftapXmlParser> xmlParser = std::make_unique<SoftapXmlParser>(); 1767 bool ret = xmlParser->LoadConfiguration(DUAL_SOFTAP_CONFIG_FILE_PATH); 1768 if (!ret) { 1769 LOGE("MergeSoftapConfig fail"); 1770 return; 1771 } 1772 ret = xmlParser->Parse(); 1773 if (!ret) { 1774 LOGE("MergeSoftapConfig Parse fail"); 1775 return; 1776 } 1777 std::vector<HotspotConfig> hotspotConfig = xmlParser->GetSoftapConfigs(); 1778 if (hotspotConfig.size() == 0) { 1779 LOGE("MergeSoftapConfig hotspotConfig empty"); 1780 return; 1781 } 1782 mSavedHotspotConfig.SetValue(hotspotConfig); 1783 mSavedHotspotConfig.SaveConfig(); 1784 } 1785 ConfigsDeduplicateAndSave(std::vector<WifiDeviceConfig> & newConfigs)1786 void WifiSettings::ConfigsDeduplicateAndSave(std::vector<WifiDeviceConfig> &newConfigs) 1787 { 1788 if (newConfigs.size() == 0) { 1789 LOGE("NewConfigs is empty!"); 1790 return; 1791 } 1792 mSavedDeviceConfig.LoadConfig(); 1793 std::vector<WifiDeviceConfig> localConfigs; 1794 mSavedDeviceConfig.GetValue(localConfigs); 1795 1796 std::set<std::string> tmp; 1797 for (const auto &localConfig : localConfigs) { 1798 std::string configKey = localConfig.ssid + localConfig.keyMgmt; 1799 tmp.insert(configKey); 1800 } 1801 std::vector<WifiDeviceConfig> addConfigs; 1802 for (auto &config : newConfigs) { 1803 std::string configKey = config.ssid + config.keyMgmt; 1804 auto iter = tmp.find(configKey); 1805 if (iter == tmp.end()) { 1806 tmp.insert(configKey); 1807 #ifdef FEATURE_ENCRYPTION_SUPPORT 1808 EncryptionDeviceConfig(config); 1809 #endif 1810 localConfigs.push_back(config); 1811 addConfigs.push_back(config); 1812 } 1813 } 1814 #ifdef SUPPORT_ClOUD_WIFI_ASSET 1815 LOGD("WifiAsset ConfigsDeduplicateAndSave"); 1816 WifiAssetManager::GetInstance().WifiAssetAddPack(addConfigs); 1817 #endif 1818 std::vector<WifiDeviceConfig>().swap(newConfigs); 1819 mSavedDeviceConfig.SetValue(localConfigs); 1820 mSavedDeviceConfig.SaveConfig(); 1821 ReloadDeviceConfig(); 1822 } 1823 ParseBackupJson(const std::string & backupInfo,std::string & key,std::string & iv,std::string & version)1824 void WifiSettings::ParseBackupJson(const std::string &backupInfo, std::string &key, std::string &iv, 1825 std::string &version) 1826 { 1827 const std::string type = "detail"; 1828 const std::string encryptionSymkey = "encryption_symkey"; 1829 const std::string gcmParamsIv = "gcmParams_iv"; 1830 const std::string apiVersion = "api_version"; 1831 std::string keyStr; 1832 std::string ivStr; 1833 1834 ParseJson(backupInfo, type, encryptionSymkey, keyStr); 1835 ParseJson(backupInfo, type, gcmParamsIv, ivStr); 1836 ParseJson(backupInfo, type, apiVersion, version); 1837 LOGI("ParseBackupJson version: %{public}s.", version.c_str()); 1838 ConvertDecStrToHexStr(keyStr, key); 1839 std::fill(keyStr.begin(), keyStr.end(), 0); 1840 LOGI("ParseBackupJson key.size: %{public}d.", static_cast<int>(key.size())); 1841 ConvertDecStrToHexStr(ivStr, iv); 1842 LOGI("ParseBackupJson iv.size: %{public}d.", static_cast<int>(iv.size())); 1843 } 1844 GetConfigbyBackupXml(std::vector<WifiDeviceConfig> & deviceConfigs,UniqueFd & fd)1845 int WifiSettings::GetConfigbyBackupXml(std::vector<WifiDeviceConfig> &deviceConfigs, UniqueFd &fd) 1846 { 1847 const std::string wifiBackupXmlBegin = "<WifiBackupData>"; 1848 const std::string wifiBackupXmlEnd = "</WifiBackupData>"; 1849 struct stat statBuf; 1850 if (fd.Get() < 0 || fstat(fd.Get(), &statBuf) < 0) { 1851 LOGE("GetConfigbyBackupXml fstat fd fail."); 1852 return -1; 1853 } 1854 char *buffer = (char *)malloc(statBuf.st_size); 1855 if (buffer == nullptr) { 1856 LOGE("GetConfigbyBackupXml malloc fail."); 1857 return -1; 1858 } 1859 ssize_t bufferLen = read(fd.Get(), buffer, statBuf.st_size); 1860 if (bufferLen < 0) { 1861 LOGE("GetConfigbyBackupXml read fail."); 1862 free(buffer); 1863 buffer = nullptr; 1864 return -1; 1865 } 1866 std::string backupData = std::string(buffer, buffer + bufferLen); 1867 if (memset_s(buffer, statBuf.st_size, 0, statBuf.st_size) != EOK) { 1868 LOGE("GetConfigbyBackupXml memset_s fail."); 1869 free(buffer); 1870 buffer = nullptr; 1871 return -1; 1872 } 1873 free(buffer); 1874 buffer = nullptr; 1875 1876 std::string wifiBackupXml; 1877 SplitStringBySubstring(backupData, wifiBackupXml, wifiBackupXmlBegin, wifiBackupXmlEnd); 1878 std::fill(backupData.begin(), backupData.end(), 0); 1879 std::unique_ptr<NetworkXmlParser> xmlParser = std::make_unique<NetworkXmlParser>(); 1880 bool ret = xmlParser->LoadConfigurationMemory(wifiBackupXml.c_str()); 1881 if (!ret) { 1882 LOGE("GetConfigbyBackupXml load fail"); 1883 return -1; 1884 } 1885 ret = xmlParser->Parse(); 1886 if (!ret) { 1887 LOGE("GetConfigbyBackupXml Parse fail"); 1888 return -1; 1889 } 1890 deviceConfigs = xmlParser->GetNetworks(); 1891 std::fill(wifiBackupXml.begin(), wifiBackupXml.end(), 0); 1892 return 0; 1893 } 1894 GetConfigbyBackupFile(std::vector<WifiDeviceConfig> & deviceConfigs,UniqueFd & fd,const std::string & key,const std::string & iv)1895 int WifiSettings::GetConfigbyBackupFile(std::vector<WifiDeviceConfig> &deviceConfigs, UniqueFd &fd, 1896 const std::string &key, const std::string &iv) 1897 { 1898 if (key.size() == 0 || iv.size() == 0) { 1899 LOGE("GetConfigbyBackupFile key or iv is empty."); 1900 return -1; 1901 } 1902 struct stat statBuf; 1903 if (fd.Get() < 0 || fstat(fd.Get(), &statBuf) < 0) { 1904 LOGE("GetConfigbyBackupFile fstat fd fail."); 1905 return -1; 1906 } 1907 int destFd = open(BACKUP_CONFIG_FILE_PATH, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 1908 if (destFd < 0) { 1909 LOGE("GetConfigbyBackupFile open file fail."); 1910 return -1; 1911 } 1912 if (sendfile(destFd, fd.Get(), nullptr, statBuf.st_size) < 0) { 1913 LOGE("GetConfigbyBackupFile fd sendfile(size: %{public}d) to destFd fail.", static_cast<int>(statBuf.st_size)); 1914 close(destFd); 1915 return -1; 1916 } 1917 close(destFd); 1918 1919 WifiConfigFileImpl<WifiBackupConfig> wifiBackupConfig; 1920 wifiBackupConfig.SetConfigFilePath(BACKUP_CONFIG_FILE_PATH); 1921 wifiBackupConfig.SetEncryptionInfo(key, iv); 1922 wifiBackupConfig.LoadConfig(); 1923 std::vector<WifiBackupConfig> backupConfigs; 1924 wifiBackupConfig.GetValue(backupConfigs); 1925 wifiBackupConfig.UnsetEncryptionInfo(); 1926 1927 for (const auto &backupCfg : backupConfigs) { 1928 WifiDeviceConfig config; 1929 ConvertBackupCfgToDeviceCfg(backupCfg, config); 1930 deviceConfigs.push_back(config); 1931 } 1932 return 0; 1933 } 1934 #endif 1935 1936 #ifdef FEATURE_ENCRYPTION_SUPPORT IsWifiDeviceConfigDeciphered(const WifiDeviceConfig & config) const1937 bool WifiSettings::IsWifiDeviceConfigDeciphered(const WifiDeviceConfig &config) const 1938 { 1939 int keyIndex = (config.wepTxKeyIndex < 0 || config.wepTxKeyIndex >= WEPKEYS_SIZE) ? 0 : config.wepTxKeyIndex; 1940 if (!config.preSharedKey.empty() || !config.wepKeys[keyIndex].empty() || !config.wifiEapConfig.password.empty()) { 1941 return true; 1942 } 1943 if (config.keyMgmt == KEY_MGMT_NONE) { 1944 return true; 1945 } 1946 return false; 1947 } 1948 DecryptionWapiConfig(const WifiEncryptionInfo & wifiEncryptionInfo,WifiDeviceConfig & config) const1949 void WifiSettings::DecryptionWapiConfig(const WifiEncryptionInfo &wifiEncryptionInfo, WifiDeviceConfig &config) const 1950 { 1951 if (config.keyMgmt != KEY_MGMT_WAPI_CERT) { 1952 return; 1953 } 1954 1955 EncryptedData *encryWapiAs = new EncryptedData(config.wifiWapiConfig.encryptedAsCertData, 1956 config.wifiWapiConfig.asCertDataIV); 1957 std::string decryWapiAs = ""; 1958 if (WifiDecryption(wifiEncryptionInfo, *encryWapiAs, decryWapiAs) == HKS_SUCCESS) { 1959 config.wifiWapiConfig.wapiAsCertData = decryWapiAs; 1960 } else { 1961 WriteWifiEncryptionFailHiSysEvent(DECRYPTION_EVENT, 1962 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1963 config.wifiWapiConfig.wapiAsCertData = ""; 1964 } 1965 delete encryWapiAs; 1966 encryWapiAs = nullptr; 1967 1968 EncryptedData *encryWapiUser = new EncryptedData(config.wifiWapiConfig.encryptedUserCertData, 1969 config.wifiWapiConfig.userCertDataIV); 1970 std::string decryWapiUser = ""; 1971 if (WifiDecryption(wifiEncryptionInfo, *encryWapiUser, decryWapiUser) == HKS_SUCCESS) { 1972 config.wifiWapiConfig.wapiUserCertData = decryWapiUser; 1973 } else { 1974 WriteWifiEncryptionFailHiSysEvent(DECRYPTION_EVENT, 1975 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1976 config.wifiWapiConfig.wapiUserCertData = ""; 1977 } 1978 delete encryWapiUser; 1979 encryWapiUser = nullptr; 1980 } 1981 DecryptionDeviceConfig(WifiDeviceConfig & config)1982 int WifiSettings::DecryptionDeviceConfig(WifiDeviceConfig &config) 1983 { 1984 if (IsWifiDeviceConfigDeciphered(config)) { 1985 LOGD("DecryptionDeviceConfig IsWifiDeviceConfigDeciphered true"); 1986 return 0; 1987 } 1988 WifiEncryptionInfo mWifiEncryptionInfo; 1989 mWifiEncryptionInfo.SetFile(GetTClassName<WifiDeviceConfig>()); 1990 EncryptedData *encry = new EncryptedData(config.encryptedData, config.IV); 1991 std::string decry = ""; 1992 if (WifiDecryption(mWifiEncryptionInfo, *encry, decry) == HKS_SUCCESS) { 1993 config.preSharedKey = decry; 1994 } else { 1995 WriteWifiEncryptionFailHiSysEvent(DECRYPTION_EVENT, 1996 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 1997 config.preSharedKey = ""; 1998 std::string().swap(config.preSharedKey); 1999 } 2000 delete encry; 2001 2002 if (config.wepTxKeyIndex < 0 || config.wepTxKeyIndex >= WEPKEYS_SIZE) { 2003 config.wepTxKeyIndex = 0; 2004 } 2005 EncryptedData *encryWep = new EncryptedData(config.encryWepKeys[config.wepTxKeyIndex], config.IVWep); 2006 std::string decryWep = ""; 2007 if (WifiDecryption(mWifiEncryptionInfo, *encryWep, decryWep) == HKS_SUCCESS) { 2008 config.wepKeys[config.wepTxKeyIndex] = decryWep; 2009 } else { 2010 WriteWifiEncryptionFailHiSysEvent(DECRYPTION_EVENT, 2011 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 2012 config.wepKeys[config.wepTxKeyIndex] = ""; 2013 } 2014 delete encryWep; 2015 encryWep = nullptr; 2016 2017 EncryptedData *encryEap = new EncryptedData(config.wifiEapConfig.encryptedData, config.wifiEapConfig.IV); 2018 std::string decryEap = ""; 2019 if (WifiDecryption(mWifiEncryptionInfo, *encryEap, decryEap) == HKS_SUCCESS) { 2020 config.wifiEapConfig.password = decryEap; 2021 } else { 2022 WriteWifiEncryptionFailHiSysEvent(DECRYPTION_EVENT, 2023 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 2024 config.wifiEapConfig.password = ""; 2025 } 2026 delete encryEap; 2027 encryEap = nullptr; 2028 DecryptionWapiConfig(mWifiEncryptionInfo, config); 2029 LOGD("DecryptionDeviceConfig end"); 2030 return 0; 2031 } 2032 EncryptionWapiConfig(const WifiEncryptionInfo & wifiEncryptionInfo,WifiDeviceConfig & config) const2033 bool WifiSettings::EncryptionWapiConfig(const WifiEncryptionInfo &wifiEncryptionInfo, WifiDeviceConfig &config) const 2034 { 2035 if (config.keyMgmt != KEY_MGMT_WAPI_CERT) { 2036 return true; 2037 } 2038 2039 if (config.wifiWapiConfig.wapiAsCertData.empty() || config.wifiWapiConfig.wapiUserCertData.empty()) { 2040 LOGE("EncryptionDeviceConfig wapiCertData empty"); 2041 return false; 2042 } 2043 2044 config.wifiWapiConfig.encryptedAsCertData = ""; 2045 config.wifiWapiConfig.asCertDataIV = ""; 2046 2047 EncryptedData encryWapiAs; 2048 if (WifiEncryption(wifiEncryptionInfo, config.wifiWapiConfig.wapiAsCertData, encryWapiAs) == HKS_SUCCESS) { 2049 config.wifiWapiConfig.encryptedAsCertData = encryWapiAs.encryptedPassword; 2050 config.wifiWapiConfig.asCertDataIV = encryWapiAs.IV; 2051 } else { 2052 LOGE("EncryptionDeviceConfig WifiEncryption wapiAsCertData failed"); 2053 WriteWifiEncryptionFailHiSysEvent(ENCRYPTION_EVENT, 2054 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 2055 return false; 2056 } 2057 2058 config.wifiWapiConfig.encryptedUserCertData = ""; 2059 config.wifiWapiConfig.userCertDataIV = ""; 2060 2061 EncryptedData encryWapiUser; 2062 if (WifiEncryption(wifiEncryptionInfo, config.wifiWapiConfig.wapiUserCertData, encryWapiUser) == HKS_SUCCESS) { 2063 config.wifiWapiConfig.encryptedUserCertData = encryWapiUser.encryptedPassword; 2064 config.wifiWapiConfig.userCertDataIV = encryWapiUser.IV; 2065 } else { 2066 LOGE("EncryptionDeviceConfig WifiEncryption wapiUserCertData failed"); 2067 WriteWifiEncryptionFailHiSysEvent(ENCRYPTION_EVENT, 2068 SsidAnonymize(config.ssid), config.keyMgmt, STA_MOUDLE_EVENT); 2069 return false; 2070 } 2071 return true; 2072 } 2073 GetConfigValueByName(const std::string & name,std::string & value)2074 bool WifiSettings::GetConfigValueByName(const std::string &name, std::string &value) 2075 { 2076 if (name.empty()) { 2077 LOGE("name empty"); 2078 return false; 2079 } 2080 std::unique_lock<std::mutex> lock(mScanMutex); 2081 std::vector<std::string> values = mFilterMap[name]; 2082 if (values.empty()) { 2083 LOGE("GetConfigValueByName values is empty"); 2084 return false; 2085 } 2086 value = values.front(); 2087 if (value.empty()) { 2088 LOGE("GetConfigValueByName value is empty"); 2089 return false; 2090 } 2091 return true; 2092 } 2093 #endif 2094 #ifdef SUPPORT_ClOUD_WIFI_ASSET UpdateWifiConfigFromCloud(const std::vector<WifiDeviceConfig> & newWifiDeviceConfigs,const std::set<int> & wifiLinkedNetworkIds)2095 void WifiSettings::UpdateWifiConfigFromCloud(const std::vector<WifiDeviceConfig> &newWifiDeviceConfigs, 2096 const std::set<int> &wifiLinkedNetworkIds) 2097 { 2098 std::unique_lock<std::mutex> lock(mStaMutex); 2099 std::map<int, WifiDeviceConfig> tempConfigs; 2100 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 2101 if (wifiLinkedNetworkIds.count(iter->second.networkId) != 0) { 2102 tempConfigs.emplace(std::make_pair(iter->second.networkId, iter->second)); 2103 LOGI("UpdateWifiConfigFromCloud, connected network %{public}s", SsidAnonymize(iter->second.ssid).c_str()); 2104 continue; 2105 } 2106 if (WifiAssetManager::GetInstance().IsWifiConfigUpdated(newWifiDeviceConfigs, iter->second)) { 2107 #ifdef FEATURE_ENCRYPTION_SUPPORT 2108 EncryptionDeviceConfig(iter->second); 2109 #endif 2110 LOGI("UpdateWifiConfigFromCloud, modify network %{public}s", SsidAnonymize(iter->second.ssid).c_str()); 2111 tempConfigs.emplace(std::make_pair(iter->second.networkId, iter->second)); 2112 continue; 2113 } 2114 #ifdef FEATURE_ENCRYPTION_SUPPORT 2115 if (!IsWifiDeviceConfigDeciphered(iter->second)) { 2116 LOGI("UpdateWifiConfigFromCloud, encrypted network %{public}s", SsidAnonymize(iter->second.ssid).c_str()); 2117 tempConfigs.emplace(std::make_pair(iter->second.networkId, iter->second)); 2118 continue; 2119 } 2120 #endif 2121 LOGI("UpdateWifiConfigFromCloud remove from cloud %{public}s", SsidAnonymize(iter->second.ssid).c_str()); 2122 } 2123 for (auto iter : newWifiDeviceConfigs) { 2124 bool find = false; 2125 for (auto oriIter = mWifiDeviceConfig.begin(); oriIter != mWifiDeviceConfig.end(); oriIter++) { 2126 if (oriIter->second.ssid == iter.ssid && oriIter->second.keyMgmt == iter.keyMgmt) { 2127 find = true; 2128 break; 2129 } 2130 } 2131 if (find) { 2132 continue; 2133 } 2134 LOGI("UpdateWifiConfigFromCloud new %{public}s , psksize : %{public}d", SsidAnonymize(iter.ssid).c_str(), 2135 static_cast<int>((iter.preSharedKey).length())); 2136 iter.networkId = mNetworkId; 2137 iter.version = 0; 2138 #ifdef FEATURE_ENCRYPTION_SUPPORT 2139 EncryptionDeviceConfig(iter); 2140 #endif 2141 tempConfigs.emplace(std::make_pair(iter.networkId, iter)); 2142 mNetworkId++; 2143 } 2144 mWifiDeviceConfig.swap(tempConfigs); 2145 } UpLoadLocalDeviceConfigToCloud()2146 void WifiSettings::UpLoadLocalDeviceConfigToCloud() 2147 { 2148 std::unique_lock<std::mutex> lock(mStaMutex); 2149 LOGI("UpLoadLocalDeviceConfigToCloud enter"); 2150 std::vector<WifiDeviceConfig> tmp; 2151 for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) { 2152 #ifdef FEATURE_ENCRYPTION_SUPPORT 2153 if (IsWifiDeviceConfigDeciphered(iter->second)) { 2154 tmp.push_back(iter->second); 2155 } 2156 #else 2157 tmp.push_back(iter->second); 2158 #endif 2159 } 2160 WifiAssetManager::GetInstance().WifiAssetAddPack(tmp, USER_ID_DEFAULT, true, true); 2161 } 2162 #endif 2163 } // namespace Wifi 2164 } // namespace OHOS