• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &currentData,
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> &currentData,
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 }