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, &times);
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