• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "network_manager_proxy.h"
17 
18 #include "edm_ipc_interface_code.h"
19 #include "edm_log.h"
20 #include "func_code.h"
21 
22 namespace OHOS {
23 namespace EDM {
24 std::shared_ptr<NetworkManagerProxy> NetworkManagerProxy::instance_ = nullptr;
25 std::mutex NetworkManagerProxy::mutexLock_;
26 const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
27 constexpr int32_t MAX_SIZE = 16;
28 
NetworkManagerProxy()29 NetworkManagerProxy::NetworkManagerProxy() {}
30 
~NetworkManagerProxy()31 NetworkManagerProxy::~NetworkManagerProxy() {}
32 
GetNetworkManagerProxy()33 std::shared_ptr<NetworkManagerProxy> NetworkManagerProxy::GetNetworkManagerProxy()
34 {
35     if (instance_ == nullptr) {
36         std::lock_guard<std::mutex> lock(mutexLock_);
37         if (instance_ == nullptr) {
38             std::shared_ptr<NetworkManagerProxy> temp = std::make_shared<NetworkManagerProxy>();
39             instance_ = temp;
40         }
41     }
42     return instance_;
43 }
44 
GetAllNetworkInterfaces(const AppExecFwk::ElementName & admin,std::vector<std::string> & networkInterface)45 int32_t NetworkManagerProxy::GetAllNetworkInterfaces(const AppExecFwk::ElementName &admin,
46     std::vector<std::string> &networkInterface)
47 {
48     EDMLOGD("NetworkManagerProxy::GetAllNetworkInterfaces");
49     auto proxy = EnterpriseDeviceMgrProxy::GetInstance();
50     if (proxy == nullptr) {
51         EDMLOGE("can not get EnterpriseDeviceMgrProxy");
52         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
53     }
54     MessageParcel data;
55     MessageParcel reply;
56     data.WriteInterfaceToken(DESCRIPTOR);
57     data.WriteInt32(WITHOUT_USERID);
58     data.WriteInt32(HAS_ADMIN);
59     data.WriteParcelable(&admin);
60     proxy->GetPolicy(EdmInterfaceCode::GET_NETWORK_INTERFACES, data, reply);
61     int32_t ret = ERR_INVALID_VALUE;
62     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
63     if (!blRes) {
64         EDMLOGW("EnterpriseDeviceMgrProxy:GetPolicy fail. %{public}d", ret);
65         return ret;
66     }
67     int32_t size = reply.ReadInt32();
68     if (size > MAX_SIZE) {
69         EDMLOGE("networkInterface size=[%{public}d] is too large", size);
70         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
71     }
72     reply.ReadStringVector(&networkInterface);
73     return ERR_OK;
74 }
75 
GetIpOrMacAddress(const AppExecFwk::ElementName & admin,const std::string & networkInterface,int policyCode,std::string & info)76 int32_t NetworkManagerProxy::GetIpOrMacAddress(const AppExecFwk::ElementName &admin,
77     const std::string &networkInterface, int policyCode, std::string &info)
78 {
79     EDMLOGD("NetworkManagerProxy::GetIpOrMacAddress");
80     auto proxy = EnterpriseDeviceMgrProxy::GetInstance();
81     if (proxy == nullptr) {
82         EDMLOGE("can not get EnterpriseDeviceMgrProxy");
83         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
84     }
85     MessageParcel data;
86     MessageParcel reply;
87     data.WriteInterfaceToken(DESCRIPTOR);
88     data.WriteInt32(WITHOUT_USERID);
89     data.WriteInt32(HAS_ADMIN);
90     data.WriteParcelable(&admin);
91     data.WriteString(networkInterface);
92     proxy->GetPolicy(policyCode, data, reply);
93     int32_t ret = ERR_INVALID_VALUE;
94     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
95     if (!blRes) {
96         EDMLOGW("EnterpriseDeviceMgrProxy:GetPolicy fail. %{public}d", ret);
97         return ret;
98     }
99     reply.ReadString(info);
100     return ERR_OK;
101 }
102 
SetNetworkInterfaceDisabled(const AppExecFwk::ElementName & admin,const std::string & networkInterface,bool isDisabled)103 int32_t NetworkManagerProxy::SetNetworkInterfaceDisabled(const AppExecFwk::ElementName &admin,
104     const std::string &networkInterface, bool isDisabled)
105 {
106     EDMLOGD("NetworkManagerProxy::SetNetworkInterfaceDisabled");
107     auto proxy = EnterpriseDeviceMgrProxy::GetInstance();
108     if (proxy == nullptr) {
109         EDMLOGE("can not get EnterpriseDeviceMgrProxy");
110         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
111     }
112     MessageParcel data;
113     std::uint32_t funcCode =
114         POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::DISABLED_NETWORK_INTERFACE);
115     data.WriteInterfaceToken(DESCRIPTOR);
116     data.WriteInt32(WITHOUT_USERID);
117     data.WriteParcelable(&admin);
118     std::vector<std::string> key{networkInterface};
119     std::vector<std::string> value{isDisabled ? "true" : "false"};
120     data.WriteStringVector(key);
121     data.WriteStringVector(value);
122     return proxy->HandleDevicePolicy(funcCode, data);
123 }
124 
IsNetworkInterfaceDisabled(const AppExecFwk::ElementName & admin,const std::string & networkInterface,bool & status)125 int32_t NetworkManagerProxy::IsNetworkInterfaceDisabled(const AppExecFwk::ElementName &admin,
126     const std::string &networkInterface, bool &status)
127 {
128     EDMLOGD("NetworkManagerProxy::IsNetworkInterfaceDisabled");
129     auto proxy = EnterpriseDeviceMgrProxy::GetInstance();
130     if (proxy == nullptr) {
131         EDMLOGE("can not get EnterpriseDeviceMgrProxy");
132         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
133     }
134     MessageParcel data;
135     MessageParcel reply;
136     data.WriteInterfaceToken(DESCRIPTOR);
137     data.WriteInt32(WITHOUT_USERID);
138     data.WriteInt32(HAS_ADMIN);
139     data.WriteParcelable(&admin);
140     data.WriteString(networkInterface);
141     proxy->GetPolicy(EdmInterfaceCode::DISABLED_NETWORK_INTERFACE, data, reply);
142     int32_t ret = ERR_INVALID_VALUE;
143     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
144     if (!blRes) {
145         EDMLOGW("EnterpriseDeviceMgrProxy:GetPolicy fail. %{public}d", ret);
146         return ret;
147     }
148     reply.ReadBool(status);
149     return ERR_OK;
150 }
151 
AddIptablesFilterRule(const AppExecFwk::ElementName & admin,const IPTABLES::AddFilter & filter)152 int32_t NetworkManagerProxy::AddIptablesFilterRule(const AppExecFwk::ElementName &admin,
153     const IPTABLES::AddFilter &filter)
154 {
155     EDMLOGD("NetworkManagerProxy::AddIptablesFilterRule");
156     MessageParcel data;
157     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::IPTABLES_RULE);
158     data.WriteInterfaceToken(DESCRIPTOR);
159     data.WriteInt32(WITHOUT_USERID);
160     data.WriteParcelable(&admin);
161     IPTABLES::IptablesUtils::WriteAddFilterConfig(filter, data);
162     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
163 }
164 
RemoveIptablesFilterRule(const AppExecFwk::ElementName & admin,const IPTABLES::RemoveFilter & filter)165 int32_t NetworkManagerProxy::RemoveIptablesFilterRule(const AppExecFwk::ElementName &admin,
166     const IPTABLES::RemoveFilter &filter)
167 {
168     EDMLOGD("NetworkManagerProxy::RemoveIptablesFilterRule");
169     MessageParcel data;
170     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::REMOVE, EdmInterfaceCode::IPTABLES_RULE);
171     data.WriteInterfaceToken(DESCRIPTOR);
172     data.WriteInt32(WITHOUT_USERID);
173     data.WriteParcelable(&admin);
174     IPTABLES::IptablesUtils::WriteRemoveFilterConfig(filter, data);
175     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
176 }
177 
ListIptablesFilterRules(const AppExecFwk::ElementName & admin,std::string & result)178 int32_t NetworkManagerProxy::ListIptablesFilterRules(const AppExecFwk::ElementName &admin, std::string &result)
179 {
180     EDMLOGD("NetworkManagerProxy::ListIptablesFilterRules");
181     MessageParcel data;
182     MessageParcel reply;
183     data.WriteInterfaceToken(DESCRIPTOR);
184     data.WriteInt32(WITHOUT_USERID);
185     data.WriteInt32(HAS_ADMIN);
186     data.WriteParcelable(&admin);
187     EnterpriseDeviceMgrProxy::GetInstance()->GetPolicy(EdmInterfaceCode::IPTABLES_RULE, data, reply);
188     int32_t ret = ERR_INVALID_VALUE;
189     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
190     if (!blRes) {
191         EDMLOGE("EnterpriseDeviceMgrProxy:GetPolicy fail. %{public}d", ret);
192         return ret;
193     }
194     reply.ReadString(result);
195     return ERR_OK;
196 }
197 
AddFirewallRule(const AppExecFwk::ElementName & admin,const IPTABLES::FirewallRule & rule)198 int32_t NetworkManagerProxy::AddFirewallRule(const AppExecFwk::ElementName &admin,
199     const IPTABLES::FirewallRule &rule)
200 {
201     MessageParcel data;
202     data.WriteInterfaceToken(DESCRIPTOR);
203     data.WriteInt32(WITHOUT_USERID);
204     data.WriteParcelable(&admin);
205     IPTABLES::FirewallRuleParcel firewallRuleParcel{rule};
206     if (!firewallRuleParcel.Marshalling(data)) {
207         EDMLOGE("NetworkManagerProxy::AddFirewallRule Marshalling rule fail.");
208         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
209     }
210     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::FIREWALL_RULE);
211     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
212 }
213 
RemoveFirewallRule(const AppExecFwk::ElementName & admin,const IPTABLES::FirewallRule & rule)214 int32_t NetworkManagerProxy::RemoveFirewallRule(const AppExecFwk::ElementName &admin,
215     const IPTABLES::FirewallRule &rule)
216 {
217     MessageParcel data;
218     data.WriteInterfaceToken(DESCRIPTOR);
219     data.WriteInt32(WITHOUT_USERID);
220     data.WriteParcelable(&admin);
221     IPTABLES::FirewallRuleParcel firewallRuleParcel{rule};
222     if (!firewallRuleParcel.Marshalling(data)) {
223         EDMLOGE("NetworkManagerProxy::RemoveFirewallRule Marshalling rule fail.");
224         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
225     }
226     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::REMOVE, EdmInterfaceCode::FIREWALL_RULE);
227     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
228 }
229 
GetFirewallRules(const AppExecFwk::ElementName & admin,std::vector<IPTABLES::FirewallRule> & result)230 int32_t NetworkManagerProxy::GetFirewallRules(const AppExecFwk::ElementName &admin,
231     std::vector<IPTABLES::FirewallRule> &result)
232 {
233     MessageParcel data;
234     MessageParcel reply;
235     data.WriteInterfaceToken(DESCRIPTOR);
236     data.WriteInt32(WITHOUT_USERID);
237     data.WriteInt32(HAS_ADMIN);
238     data.WriteParcelable(&admin);
239     EnterpriseDeviceMgrProxy::GetInstance()->GetPolicy(EdmInterfaceCode::FIREWALL_RULE, data, reply);
240     int32_t ret = ERR_INVALID_VALUE;
241     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
242     if (!blRes) {
243         EDMLOGE("EnterpriseDeviceMgrProxy:GetFirewallRules fail. %{public}d", ret);
244         return ret;
245     }
246     int32_t size = reply.ReadInt32();
247     for (int32_t i = 0; i < size; i++) {
248         IPTABLES::FirewallRuleParcel firewallRuleParcel;
249         if (!IPTABLES::FirewallRuleParcel::Unmarshalling(reply, firewallRuleParcel)) {
250             EDMLOGE("NetworkManagerProxy::GetFirewallRules Unmarshalling rule fail.");
251             return EdmReturnErrCode::SYSTEM_ABNORMALLY;
252         }
253         result.push_back(firewallRuleParcel.GetRule());
254     }
255     EDMLOGD("EnterpriseDeviceMgrProxy:GetFirewallRules success. %{public}d", size);
256     return ERR_OK;
257 }
258 
AddDomainFilterRule(const AppExecFwk::ElementName & admin,const IPTABLES::DomainFilterRule & rule)259 int32_t NetworkManagerProxy::AddDomainFilterRule(const AppExecFwk::ElementName &admin,
260     const IPTABLES::DomainFilterRule &rule)
261 {
262     MessageParcel data;
263     data.WriteInterfaceToken(DESCRIPTOR);
264     data.WriteInt32(WITHOUT_USERID);
265     data.WriteParcelable(&admin);
266     IPTABLES::DomainFilterRuleParcel domainFilterRuleParcel{rule};
267     if (!domainFilterRuleParcel.Marshalling(data)) {
268         EDMLOGE("NetworkManagerProxy::AddDomainFilterRule Marshalling rule fail.");
269         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
270     }
271     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET,
272         EdmInterfaceCode::DOMAIN_FILTER_RULE);
273     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
274 }
275 
RemoveDomainFilterRule(const AppExecFwk::ElementName & admin,const IPTABLES::DomainFilterRule & rule)276 int32_t NetworkManagerProxy::RemoveDomainFilterRule(const AppExecFwk::ElementName &admin,
277     const IPTABLES::DomainFilterRule &rule)
278 {
279     MessageParcel data;
280     data.WriteInterfaceToken(DESCRIPTOR);
281     data.WriteInt32(WITHOUT_USERID);
282     data.WriteParcelable(&admin);
283     IPTABLES::DomainFilterRuleParcel domainFilterRuleParcel{rule};
284     if (!domainFilterRuleParcel.Marshalling(data)) {
285         EDMLOGE("NetworkManagerProxy::RemoveDomainFilterRule Marshalling rule fail.");
286         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
287     }
288     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::REMOVE,
289         EdmInterfaceCode::DOMAIN_FILTER_RULE);
290     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
291 }
292 
GetDomainFilterRules(const AppExecFwk::ElementName & admin,std::vector<IPTABLES::DomainFilterRule> & result)293 int32_t NetworkManagerProxy::GetDomainFilterRules(const AppExecFwk::ElementName &admin,
294     std::vector<IPTABLES::DomainFilterRule> &result)
295 {
296     MessageParcel data;
297     MessageParcel reply;
298     data.WriteInterfaceToken(DESCRIPTOR);
299     data.WriteInt32(WITHOUT_USERID);
300     data.WriteInt32(HAS_ADMIN);
301     data.WriteParcelable(&admin);
302     EnterpriseDeviceMgrProxy::GetInstance()->GetPolicy(EdmInterfaceCode::DOMAIN_FILTER_RULE, data, reply);
303     int32_t ret = ERR_INVALID_VALUE;
304     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
305     if (!blRes) {
306         EDMLOGE("EnterpriseDeviceMgrProxy:GetFirewallRules fail. %{public}d", ret);
307         return ret;
308     }
309     int32_t size = reply.ReadInt32();
310     for (int32_t i = 0; i < size; i++) {
311         IPTABLES::DomainFilterRuleParcel domainFilterRuleParcel;
312         if (!IPTABLES::DomainFilterRuleParcel::Unmarshalling(reply, domainFilterRuleParcel)) {
313             EDMLOGE("NetworkManagerProxy::GetDomainFilterRules Unmarshalling rule fail.");
314             return EdmReturnErrCode::SYSTEM_ABNORMALLY;
315         }
316         result.push_back(domainFilterRuleParcel.GetRule());
317     }
318     EDMLOGD("EnterpriseDeviceMgrProxy:GetDomainFilterRules success. %{public}d", size);
319     return ERR_OK;
320 }
321 
SetGlobalHttpProxy(const AppExecFwk::ElementName & admin,const NetManagerStandard::HttpProxy & httpProxy)322 int32_t NetworkManagerProxy::SetGlobalHttpProxy(const AppExecFwk::ElementName &admin,
323     const NetManagerStandard::HttpProxy &httpProxy)
324 {
325     EDMLOGD("NetworkManagerProxy::SetGlobalHttpProxy");
326     MessageParcel data;
327     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::GLOBAL_PROXY);
328     data.WriteInterfaceToken(DESCRIPTOR);
329     data.WriteInt32(WITHOUT_USERID);
330     data.WriteParcelable(&admin);
331     if (!httpProxy.Marshalling(data)) {
332         EDMLOGE("NetworkManagerProxy::SetGlobalHttpProxy Marshalling proxy fail.");
333         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
334     }
335     int32_t ret = EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
336     EDMLOGI("NetworkManagerProxy::SetGlobalHttpProxy ret = %{public}d", ret);
337     return ret;
338 }
339 
GetGlobalHttpProxy(const AppExecFwk::ElementName * admin,NetManagerStandard::HttpProxy & httpProxy)340 int32_t NetworkManagerProxy::GetGlobalHttpProxy(const AppExecFwk::ElementName *admin,
341     NetManagerStandard::HttpProxy &httpProxy)
342 {
343     EDMLOGD("NetworkManagerProxy::GetGlobalHttpProxy");
344     MessageParcel data;
345     MessageParcel reply;
346     data.WriteInterfaceToken(DESCRIPTOR);
347     data.WriteInt32(WITHOUT_USERID);
348     if (admin != nullptr) {
349         data.WriteInt32(HAS_ADMIN);
350         data.WriteParcelable(admin);
351     } else {
352         if (!EnterpriseDeviceMgrProxy::GetInstance()->IsEdmEnabled()) {
353             return ERR_OK;
354         }
355         data.WriteInt32(WITHOUT_ADMIN);
356     }
357     EnterpriseDeviceMgrProxy::GetInstance()->GetPolicy(EdmInterfaceCode::GLOBAL_PROXY, data, reply);
358     int32_t ret = ERR_INVALID_VALUE;
359     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
360     if (!blRes) {
361         EDMLOGE("GetGlobalHttpProxy:GetPolicy fail. %{public}d", ret);
362         return ret;
363     }
364     if (!NetManagerStandard::HttpProxy::Unmarshalling(reply, httpProxy)) {
365         EDMLOGE("NetworkManagerProxy::GetGlobalHttpProxy Unmarshalling proxy fail.");
366         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
367     }
368     return ERR_OK;
369 }
370 } // namespace EDM
371 } // namespace OHOS
372