1 /*
2  * Copyright (c) 2021-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 "net_policy_callback.h"
17 
18 #include "net_mgr_log_wrapper.h"
19 #include "net_policy_constants.h"
20 #include "net_policy_inner_define.h"
21 
22 namespace OHOS {
23 namespace NetManagerStandard {
24 
NetPolicyCallback()25 NetPolicyCallback::NetPolicyCallback()
26 {
27     netPolicyCallbackFfrtQueue_ = std::make_shared<ffrt::queue>("NetPolicyCallback");
28 }
29 
~NetPolicyCallback()30 NetPolicyCallback::~NetPolicyCallback() {}
31 
RegisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> & callback)32 int32_t NetPolicyCallback::RegisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> &callback)
33 {
34     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
35         NETMGR_LOG_E("The parameter callback is null");
36         return NETMANAGER_ERR_PARAMETER_ERROR;
37     }
38     if (!netPolicyCallbackFfrtQueue_) {
39         NETMGR_LOG_E("FFRT Init Fail");
40         return NETMANAGER_ERR_PARAMETER_ERROR;
41     }
42     int32_t ret = NETMANAGER_SUCCESS;
43     ffrt::task_handle RegisterNetPolicyCallbackAsyncTask =
44         netPolicyCallbackFfrtQueue_->submit_h([this, callback, &ret]() {
45             ret = this->RegisterNetPolicyCallback(callback);
46         }, ffrt::task_attr().name("FfrtRegisterNetPolicyCallbackAsync"));
47     netPolicyCallbackFfrtQueue_->wait(RegisterNetPolicyCallbackAsyncTask);
48 
49     return ret;
50 }
51 
RegisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)52 int32_t NetPolicyCallback::RegisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
53 {
54     uint32_t callbackCounts = callbacks_.size();
55     NETMGR_LOG_I("callback counts [%{public}u]", callbackCounts);
56     if (callbackCounts >= LIMIT_CALLBACK_NUM) {
57         NETMGR_LOG_E("callback counts cannot more than [%{public}u]", LIMIT_CALLBACK_NUM);
58         return NETMANAGER_ERR_PARAMETER_ERROR;
59     }
60 
61     for (uint32_t i = 0; i < callbackCounts; i++) {
62         if (callback->AsObject().GetRefPtr() == callbacks_[i]->AsObject().GetRefPtr()) {
63             NETMGR_LOG_W("netPolicyCallback_ had this callback");
64             return NETMANAGER_ERR_PARAMETER_ERROR;
65         }
66     }
67 
68     callbacks_.emplace_back(callback);
69     NETMGR_LOG_I("End RegisterNetPolicyCallback");
70     return NETMANAGER_SUCCESS;
71 }
72 
UnregisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> & callback)73 int32_t NetPolicyCallback::UnregisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> &callback)
74 {
75     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
76         NETMGR_LOG_E("The parameter of callback is null");
77         return NETMANAGER_ERR_PARAMETER_ERROR;
78     }
79     if (!netPolicyCallbackFfrtQueue_) {
80         NETMGR_LOG_E("FFRT Init Fail");
81         return NETMANAGER_ERR_PARAMETER_ERROR;
82     }
83     int32_t ret = NETMANAGER_SUCCESS;
84     ffrt::task_handle UnregisterNetPolicyCallbackAsyncTask =
85         netPolicyCallbackFfrtQueue_->submit_h([this, callback, &ret]() {
86             ret = this->UnregisterNetPolicyCallback(callback);
87         }, ffrt::task_attr().name("FfrtUnregisterNetPolicyCallbackAsync"));
88     netPolicyCallbackFfrtQueue_->wait(UnregisterNetPolicyCallbackAsyncTask);
89 
90     return ret;
91 }
92 
UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)93 int32_t NetPolicyCallback::UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
94 {
95     NETMGR_LOG_I("Enter UnregisterNetPolicyCallback");
96     auto it = std::remove_if(
97         callbacks_.begin(), callbacks_.end(), [callback](const sptr<INetPolicyCallback> &tempCallback) -> bool {
98             if (tempCallback == nullptr || tempCallback->AsObject() == nullptr ||
99                 tempCallback->AsObject().GetRefPtr() == nullptr) {
100                 return true;
101             }
102             return callback->AsObject().GetRefPtr() == tempCallback->AsObject().GetRefPtr();
103         });
104     callbacks_.erase(it, callbacks_.end());
105     NETMGR_LOG_I("End UnregisterNetPolicyCallback");
106     return NETMANAGER_SUCCESS;
107 }
108 
NotifyNetUidPolicyChangeAsync(uint32_t uid,uint32_t policy)109 int32_t NetPolicyCallback::NotifyNetUidPolicyChangeAsync(uint32_t uid, uint32_t policy)
110 {
111     NETMGR_LOG_D("NotifyNetUidPolicyChange uid[%{public}u] policy[%{public}u]", uid, policy);
112     if (!netPolicyCallbackFfrtQueue_) {
113         NETMGR_LOG_E("FFRT Init Fail");
114         return NETMANAGER_ERR_PARAMETER_ERROR;
115     }
116     int32_t ret = NETMANAGER_SUCCESS;
117     ffrt::task_handle NotifyNetUidPolicyChangeAsyncTask =
118         netPolicyCallbackFfrtQueue_->submit_h([this, uid, policy, &ret]() {
119             ret = this->NotifyNetUidPolicyChange(uid, policy);
120         }, ffrt::task_attr().name("FfrtNotifyNetUidPolicyChangeAsync"));
121     netPolicyCallbackFfrtQueue_->wait(NotifyNetUidPolicyChangeAsyncTask);
122 
123     return ret;
124 }
125 
NotifyNetUidPolicyChange(uint32_t uid,uint32_t policy)126 int32_t NetPolicyCallback::NotifyNetUidPolicyChange(uint32_t uid, uint32_t policy)
127 {
128     NETMGR_LOG_I("NotifyNetUidPolicyChange uid= %{public}d policy= %{public}d", uid, policy);
129     for (const auto &callback : callbacks_) {
130         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
131             callback->NetUidPolicyChange(uid, policy);
132         }
133     }
134 
135     return NETMANAGER_SUCCESS;
136 }
137 
NotifyNetUidRuleChangeAsync(uint32_t uid,uint32_t rule)138 int32_t NetPolicyCallback::NotifyNetUidRuleChangeAsync(uint32_t uid, uint32_t rule)
139 {
140     NETMGR_LOG_D("NotifyNetUidRuleChange uid[%{public}u] rule[%{public}u]", uid, rule);
141     if (!netPolicyCallbackFfrtQueue_) {
142         NETMGR_LOG_E("FFRT Init Fail");
143         return NETMANAGER_ERR_PARAMETER_ERROR;
144     }
145     int32_t ret = NETMANAGER_SUCCESS;
146     ffrt::task_handle NotifyNetUidRuleChangeAsyncTask =
147         netPolicyCallbackFfrtQueue_->submit_h([this, uid, rule, &ret]() {
148             ret = this->NotifyNetUidRuleChange(uid, rule);
149         }, ffrt::task_attr().name("FfrtNotifyNetUidRuleChangeAsync"));
150     netPolicyCallbackFfrtQueue_->wait(NotifyNetUidRuleChangeAsyncTask);
151     return ret;
152 }
153 
NotifyNetUidRuleChange(uint32_t uid,uint32_t rule)154 int32_t NetPolicyCallback::NotifyNetUidRuleChange(uint32_t uid, uint32_t rule)
155 {
156     NETMGR_LOG_I("NetUidRuleChange uid=%{public}d policy=%{public}d", uid, rule);
157     for (const auto &callback : callbacks_) {
158         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
159             callback->NetUidRuleChange(uid, rule);
160         }
161     }
162 
163     return NETMANAGER_SUCCESS;
164 }
165 
NotifyNetBackgroundPolicyChangeAsync(bool isAllowed)166 int32_t NetPolicyCallback::NotifyNetBackgroundPolicyChangeAsync(bool isAllowed)
167 {
168     NETMGR_LOG_D("NotifyNetBackgroundPolicyChange isAllowed[%{public}d]", isAllowed);
169     if (!netPolicyCallbackFfrtQueue_) {
170         NETMGR_LOG_E("FFRT Init Fail");
171         return NETMANAGER_ERR_PARAMETER_ERROR;
172     }
173     int32_t ret = NETMANAGER_SUCCESS;
174     ffrt::task_handle NotifyNetBackgroundPolicyChangeAsyncTask =
175         netPolicyCallbackFfrtQueue_->submit_h([this, isAllowed, &ret]() {
176             ret = this->NotifyNetBackgroundPolicyChange(isAllowed);
177         }, ffrt::task_attr().name("FfrtNotifyNetBackgroundPolicyChangeAsync"));
178     netPolicyCallbackFfrtQueue_->wait(NotifyNetBackgroundPolicyChangeAsyncTask);
179     return ret;
180 }
181 
NotifyNetBackgroundPolicyChange(bool isAllowed)182 int32_t NetPolicyCallback::NotifyNetBackgroundPolicyChange(bool isAllowed)
183 {
184     for (const auto &callback : callbacks_) {
185         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
186             callback->NetBackgroundPolicyChange(isAllowed);
187         }
188     }
189 
190     return NETMANAGER_SUCCESS;
191 }
192 
NotifyNetQuotaPolicyChangeAsync(const std::vector<NetQuotaPolicy> & quotaPolicies)193 int32_t NetPolicyCallback::NotifyNetQuotaPolicyChangeAsync(const std::vector<NetQuotaPolicy> &quotaPolicies)
194 {
195     if (quotaPolicies.empty()) {
196         NETMGR_LOG_E("NotifyNetQuotaPolicyChange quotaPolicies empty");
197         return POLICY_ERR_QUOTA_POLICY_NOT_EXIST;
198     }
199     NETMGR_LOG_D("NotifyNetQuotaPolicyChange quotaPolicies.size[%{public}zu]", quotaPolicies.size());
200     if (!netPolicyCallbackFfrtQueue_) {
201         NETMGR_LOG_E("FFRT Init Fail");
202         return NETMANAGER_ERR_PARAMETER_ERROR;
203     }
204     int32_t ret = NETMANAGER_SUCCESS;
205     ffrt::task_handle NotifyNetQuotaPolicyChangeTask =
206         netPolicyCallbackFfrtQueue_->submit_h([this, &quotaPolicies, &ret]() {
207             ret = this->NotifyNetQuotaPolicyChange(quotaPolicies);
208         }, ffrt::task_attr().name("FfrtNotifyNetQuotaPolicyChangeAsync"));
209     netPolicyCallbackFfrtQueue_->wait(NotifyNetQuotaPolicyChangeTask);
210     return ret;
211 }
212 
NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> & quotaPolicies)213 int32_t NetPolicyCallback::NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> &quotaPolicies)
214 {
215     for (const auto &callback : callbacks_) {
216         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
217             callback->NetQuotaPolicyChange(quotaPolicies);
218         }
219     }
220 
221     return NETMANAGER_SUCCESS;
222 }
223 
NotifyNetMeteredIfacesChangeAsync(std::vector<std::string> & ifaces)224 int32_t NetPolicyCallback::NotifyNetMeteredIfacesChangeAsync(std::vector<std::string> &ifaces)
225 {
226     NETMGR_LOG_D("NotifyNetMeteredIfacesChange iface size[%{public}zu]", ifaces.size());
227     if (!netPolicyCallbackFfrtQueue_) {
228         NETMGR_LOG_E("FFRT Init Fail");
229         return NETMANAGER_ERR_PARAMETER_ERROR;
230     }
231     int32_t ret = NETMANAGER_SUCCESS;
232     ffrt::task_handle NotifyNetMeteredIfacesChangeTask =
233         netPolicyCallbackFfrtQueue_->submit_h([this, &ifaces, &ret]() {
234             ret = this->NotifyNetMeteredIfacesChange(ifaces);
235         }, ffrt::task_attr().name("FfrtNotifyNetMeteredIfacesChangeAsync"));
236     netPolicyCallbackFfrtQueue_->wait(NotifyNetMeteredIfacesChangeTask);
237     return ret;
238 }
239 
NotifyNetMeteredIfacesChange(std::vector<std::string> & ifaces)240 int32_t NetPolicyCallback::NotifyNetMeteredIfacesChange(std::vector<std::string> &ifaces)
241 {
242     NETMGR_LOG_D("NotifyNetMeteredIfacesChange iface size[%{public}zu]", ifaces.size());
243     for (const auto &callback : callbacks_) {
244         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
245             callback->NetMeteredIfacesChange(ifaces);
246         }
247     }
248 
249     return NETMANAGER_SUCCESS;
250 }
251 } // namespace NetManagerStandard
252 } // namespace OHOS
253