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