1 /*
2 * Copyright (c) 2025 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_policy_utils.h"
17
18 #include "array_wifi_id_serializer.h"
19 #include "edm_constants.h"
20 #include "edm_log.h"
21 #include "ipolicy_manager.h"
22 #include "wifi_device.h"
23
24 namespace OHOS {
25 namespace EDM {
SetWifiAccessList(std::vector<WifiId> data,bool isAllowed)26 ErrCode WifiPolicyUtils::SetWifiAccessList(std::vector<WifiId> data, bool isAllowed)
27 {
28 EDMLOGI("WifiPolicyUtils SetWifiAccessList....data size = %{public}zu", data.size());
29 auto wifiDevice = Wifi::WifiDevice::GetInstance(WIFI_DEVICE_ABILITY_ID);
30 if (wifiDevice == nullptr) {
31 EDMLOGE("wifiDevice GetInstance null");
32 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
33 }
34 std::vector<Wifi::WifiRestrictedInfo> wifiRestrictedList;
35 for (const auto& item : data) {
36 Wifi::WifiRestrictedInfo wifiRestrictedInfo;
37 wifiRestrictedInfo.ssid = item.GetSsid();
38 wifiRestrictedInfo.bssid = item.GetBssid();
39 if (isAllowed) {
40 wifiRestrictedInfo.wifiRestrictedType = Wifi::WifiRestrictedType::MDM_WHITELIST;
41 } else {
42 wifiRestrictedInfo.wifiRestrictedType = Wifi::WifiRestrictedType::MDM_BLOCKLIST;
43 }
44 wifiRestrictedList.push_back(wifiRestrictedInfo);
45 }
46 ErrCode ret = wifiDevice->SetWifiRestrictedList(wifiRestrictedList);
47 if (ret != ERR_OK) {
48 EDMLOGE("WifiPolicyUtils SetWifiAccessList ret %{public}d", ret);
49 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
50 }
51 return ERR_OK;
52 }
53
AddWifiListPolicy(std::vector<WifiId> & data,std::vector<WifiId> & currentData,std::vector<WifiId> & mergeData,int32_t userId,bool isAllowed)54 ErrCode WifiPolicyUtils::AddWifiListPolicy(std::vector<WifiId> &data, std::vector<WifiId> ¤tData,
55 std::vector<WifiId> &mergeData, int32_t userId, bool isAllowed)
56 {
57 if (data.empty()) {
58 EDMLOGW("AddWifiListPolicy data is empty");
59 return ERR_OK;
60 }
61 if (data.size() > EdmConstants::WIFI_LIST_MAX_SIZE) {
62 EDMLOGE("AddWifiListPolicy data size=[%{public}zu] is too large", data.size());
63 return EdmReturnErrCode::PARAM_ERROR;
64 }
65 if (!CheckWifiId(data, isAllowed)) {
66 return EdmReturnErrCode::PARAM_ERROR;
67 }
68 if (HasConflictPolicy(isAllowed)) {
69 return EdmReturnErrCode::CONFIGURATION_CONFLICT_FAILED;
70 }
71 std::vector<WifiId> needAddData =
72 ArrayWifiIdSerializer::GetInstance()->SetDifferencePolicyData(currentData, data);
73 std::vector<WifiId> needAddMergeData =
74 ArrayWifiIdSerializer::GetInstance()->SetDifferencePolicyData(mergeData, needAddData);
75 std::vector<WifiId> afterHandle =
76 ArrayWifiIdSerializer::GetInstance()->SetUnionPolicyData(currentData, needAddData);
77 std::vector<WifiId> afterMerge =
78 ArrayWifiIdSerializer::GetInstance()->SetUnionPolicyData(mergeData, afterHandle);
79 if (afterMerge.size() > EdmConstants::WIFI_LIST_MAX_SIZE) {
80 EDMLOGE("AddWifiListPolicy union data size=[%{public}zu] is too large", mergeData.size());
81 return EdmReturnErrCode::PARAM_ERROR;
82 }
83 ErrCode errCode = SetWifiAccessList(afterMerge, isAllowed);
84 if (errCode != ERR_OK) {
85 return errCode;
86 }
87 currentData = afterHandle;
88 mergeData = afterMerge;
89 return ERR_OK;
90 }
91
RemoveWifiListPolicy(std::vector<WifiId> & data,std::vector<WifiId> & currentData,std::vector<WifiId> & mergeData,int32_t userId,bool isAllowed)92 ErrCode WifiPolicyUtils::RemoveWifiListPolicy(std::vector<WifiId> &data, std::vector<WifiId> ¤tData,
93 std::vector<WifiId> &mergeData, int32_t userId, bool isAllowed)
94 {
95 if (data.empty()) {
96 EDMLOGW("RemoveWifiListPolicy data is empty:");
97 return ERR_OK;
98 }
99 if (data.size() > EdmConstants::WIFI_LIST_MAX_SIZE) {
100 EDMLOGE("RemoveWifiListPolicy data size=[%{public}zu] is too large", data.size());
101 return EdmReturnErrCode::PARAM_ERROR;
102 }
103 if (!CheckWifiId(data, isAllowed)) {
104 return EdmReturnErrCode::PARAM_ERROR;
105 }
106 std::vector<WifiId> afterHandle =
107 ArrayWifiIdSerializer::GetInstance()->SetDifferencePolicyData(data, currentData);
108 std::vector<WifiId> afterMerge =
109 ArrayWifiIdSerializer::GetInstance()->SetUnionPolicyData(mergeData, afterHandle);
110 ErrCode errCode = SetWifiAccessList(afterMerge, isAllowed);
111 if (errCode != ERR_OK) {
112 return errCode;
113 }
114 currentData = afterHandle;
115 mergeData = afterMerge;
116 return ERR_OK;
117 }
118
CheckWifiId(std::vector<WifiId> & data,bool isAllowed)119 bool WifiPolicyUtils::CheckWifiId(std::vector<WifiId> &data, bool isAllowed)
120 {
121 for (const auto& wifiId : data) {
122 std::string ssid = wifiId.GetSsid();
123 if (ssid.size() > EdmConstants::WIFI_SSID_MAX_LENGTH || ssid.empty()) {
124 EDMLOGE("CheckWifiList ssid is empty or too large!");
125 return false;
126 }
127 std::string bssid = wifiId.GetBssid();
128 if (isAllowed && bssid.empty()) {
129 EDMLOGE("CheckWifiList bssid parse error!");
130 return false;
131 }
132 if (!bssid.empty() && bssid.size() != EdmConstants::WIFI_BSSID_LENGTH) {
133 EDMLOGE("CheckWifiList bssid parse error!");
134 return false;
135 }
136 }
137 return true;
138 }
139
HasConflictPolicy(bool isAllowed)140 bool WifiPolicyUtils::HasConflictPolicy(bool isAllowed)
141 {
142 auto policyManager = IPolicyManager::GetInstance();
143 std::string disableWifiPolicy;
144 policyManager->GetPolicy("", PolicyName::POLICY_DISABLE_WIFI, disableWifiPolicy);
145 if (disableWifiPolicy == "true") {
146 EDMLOGE("WifiList policy conflict! Wifi is disabled.");
147 return true;
148 }
149 std::string policyName = PolicyName::POLICY_ALLOWED_WIFI_LIST;
150 if (isAllowed) {
151 policyName = PolicyName::POLICY_DISALLOWED_WIFI_LIST;
152 }
153 std::string wifiListPolicy;
154 policyManager->GetPolicy("", policyName, wifiListPolicy);
155 if (!wifiListPolicy.empty()) {
156 EDMLOGE("WifiList policy conflict! Has another wifiListPolicy");
157 return true;
158 }
159 return false;
160 }
161 }
162 }