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