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 "net_manager_constants.h"
17 #include "netmanager_base_common_utils.h"
18 #include "netfirewall_policy_manager.h"
19
20 namespace OHOS {
21 namespace NetManagerStandard {
GetInstance()22 NetFirewallPolicyManager &NetFirewallPolicyManager::GetInstance()
23 {
24 static NetFirewallPolicyManager instance;
25 return instance;
26 }
27
NetFirewallPolicyManager()28 NetFirewallPolicyManager::NetFirewallPolicyManager()
29 {
30 preferencesHelper_ = NetFirewallPreferenceHelper::GetInstance();
31 NETMGR_EXT_LOG_I("NetFirewallPolicyManager()");
32 }
33
~NetFirewallPolicyManager()34 NetFirewallPolicyManager::~NetFirewallPolicyManager()
35 {
36 NETMGR_EXT_LOG_I("~NetFirewallPolicyManager()");
37 }
38
SetCurrentUserId(int32_t userId)39 void NetFirewallPolicyManager::SetCurrentUserId(int32_t userId)
40 {
41 std::lock_guard<std::shared_mutex> locker(setPolicyMutex_);
42 currentFirewallPolicy_ = nullptr;
43 currentUserId_ = userId;
44 RebuildFirewallPolicyCache(userId);
45 }
46
SetNetFirewallPolicy(const int32_t userId,const sptr<NetFirewallPolicy> & policy)47 int32_t NetFirewallPolicyManager::SetNetFirewallPolicy(const int32_t userId, const sptr<NetFirewallPolicy> &policy)
48 {
49 if (policy == nullptr) {
50 NETMGR_EXT_LOG_E("SetNetFirewallPolicy failed, policy is nullptr.");
51 return FIREWALL_ERR_PARAMETER_ERROR;
52 }
53 std::lock_guard<std::shared_mutex> locker(setPolicyMutex_);
54 if (preferencesHelper_ == nullptr) {
55 NETMGR_EXT_LOG_E("SetNetFirewallPolicy failed, reference is nullptr.");
56 return FIREWALL_ERR_INTERNAL;
57 }
58
59 preferencesHelper_->GetPreference(FIREWALL_PREFERENCE_PATH + std::to_string(userId) + ".xml");
60 preferencesHelper_->SaveBool(NET_FIREWALL_IS_OPEN, policy->isOpen);
61 preferencesHelper_->SaveInt(NET_FIREWALL_IN_ACTION, static_cast<int>(policy->inAction));
62 preferencesHelper_->SaveInt(NET_FIREWALL_OUT_ACTION, static_cast<int>(policy->outAction));
63
64 return FIREWALL_SUCCESS;
65 }
66
GetNetFirewallPolicy(const int32_t userId,sptr<NetFirewallPolicy> & policy)67 int32_t NetFirewallPolicyManager::GetNetFirewallPolicy(const int32_t userId, sptr<NetFirewallPolicy> &policy)
68 {
69 if (policy == nullptr) {
70 NETMGR_EXT_LOG_E("GetNetFirewallPolicy failed, policy is nullptr.");
71 return FIREWALL_ERR_INTERNAL;
72 }
73 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
74 if (currentUserId_ == userId) {
75 EnsureCurrentFirewallPolicyCached();
76 policy->isOpen = currentFirewallPolicy_->isOpen;
77 policy->inAction = currentFirewallPolicy_->inAction;
78 policy->outAction = currentFirewallPolicy_->outAction;
79 } else {
80 LoadPolicyFormPreference(userId, policy);
81 }
82
83 return FIREWALL_SUCCESS;
84 }
85
IsFirewallStatusChange(const sptr<NetFirewallPolicy> & policy)86 bool NetFirewallPolicyManager::IsFirewallStatusChange(const sptr<NetFirewallPolicy> &policy)
87 {
88 NETMGR_EXT_LOG_D("IsFirewallStatusChange");
89 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
90 EnsureCurrentFirewallPolicyCached();
91 return (policy->isOpen != currentFirewallPolicy_->isOpen);
92 }
93
IsFirewallActionChange(const sptr<NetFirewallPolicy> & policy)94 bool NetFirewallPolicyManager::IsFirewallActionChange(const sptr<NetFirewallPolicy> &policy)
95 {
96 NETMGR_EXT_LOG_D("IsFirewallActionChange");
97 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
98 EnsureCurrentFirewallPolicyCached();
99 return policy->isOpen && (policy->inAction != currentFirewallPolicy_->inAction ||
100 policy->outAction != currentFirewallPolicy_->outAction);
101 }
102
SetCurrentUserFirewallPolicy(const sptr<NetFirewallPolicy> & policy)103 void NetFirewallPolicyManager::SetCurrentUserFirewallPolicy(const sptr<NetFirewallPolicy> &policy)
104 {
105 std::lock_guard<std::shared_mutex> locker(setPolicyMutex_);
106 if (currentFirewallPolicy_ == nullptr) {
107 currentFirewallPolicy_ = new (std::nothrow) NetFirewallPolicy();
108 }
109
110 currentFirewallPolicy_->isOpen = policy->isOpen;
111 currentFirewallPolicy_->inAction = policy->inAction;
112 currentFirewallPolicy_->outAction = policy->outAction;
113 }
114
GetCurrentNetFirewallPolicy(sptr<NetFirewallPolicy> & policy)115 int32_t NetFirewallPolicyManager::GetCurrentNetFirewallPolicy(sptr<NetFirewallPolicy> &policy)
116 {
117 return GetNetFirewallPolicy(currentUserId_, policy);
118 }
119
IsNetFirewallOpen(const int32_t userId)120 bool NetFirewallPolicyManager::IsNetFirewallOpen(const int32_t userId)
121 {
122 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
123 NETMGR_EXT_LOG_D("IsNetFirewallOpen");
124 // Current user fetching cache
125 if (userId == currentUserId_) {
126 EnsureCurrentFirewallPolicyCached();
127 return currentFirewallPolicy_->isOpen;
128 }
129 preferencesHelper_->GetPreference(FIREWALL_PREFERENCE_PATH + std::to_string(userId) + ".xml");
130 return preferencesHelper_->ObtainBool("isOpen", true);
131 }
132
IsCurrentFirewallOpen()133 bool NetFirewallPolicyManager::IsCurrentFirewallOpen()
134 {
135 return IsNetFirewallOpen(currentUserId_);
136 }
137
ClearFirewallPolicy(const int32_t userId)138 int32_t NetFirewallPolicyManager::ClearFirewallPolicy(const int32_t userId)
139 {
140 std::lock_guard<std::shared_mutex> locker(setPolicyMutex_);
141 if (preferencesHelper_ == nullptr) {
142 NETMGR_EXT_LOG_E("ClearFirewallPolicy failed");
143 return FIREWALL_ERR_INTERNAL;
144 }
145 preferencesHelper_->Clear(FIREWALL_PREFERENCE_PATH + std::to_string(userId) + ".xml");
146 currentFirewallPolicy_ = nullptr;
147 return FIREWALL_SUCCESS;
148 }
149
ClearCurrentFirewallPolicy()150 int32_t NetFirewallPolicyManager::ClearCurrentFirewallPolicy()
151 {
152 return ClearFirewallPolicy(currentUserId_);
153 }
154
GetFirewallPolicyInAction()155 FirewallRuleAction NetFirewallPolicyManager::GetFirewallPolicyInAction()
156 {
157 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
158 NETMGR_EXT_LOG_D("GetCurrentNetFirewallPolicyInAction");
159 EnsureCurrentFirewallPolicyCached();
160 return currentFirewallPolicy_->inAction;
161 }
162
GetFirewallPolicyOutAction()163 FirewallRuleAction NetFirewallPolicyManager::GetFirewallPolicyOutAction()
164 {
165 std::shared_lock<std::shared_mutex> locker(setPolicyMutex_);
166 NETMGR_EXT_LOG_D("GetCurrentFirewallOutAction");
167 EnsureCurrentFirewallPolicyCached();
168 return currentFirewallPolicy_->outAction;
169 }
170
EnsureCurrentFirewallPolicyCached()171 void NetFirewallPolicyManager::EnsureCurrentFirewallPolicyCached()
172 {
173 if (currentFirewallPolicy_ == nullptr) {
174 RebuildFirewallPolicyCache(currentUserId_);
175 }
176 }
177
RebuildFirewallPolicyCache(const int32_t userId)178 void NetFirewallPolicyManager::RebuildFirewallPolicyCache(const int32_t userId)
179 {
180 // If the userId is not valid, return directly
181 if (userId == 0) {
182 return;
183 }
184 currentFirewallPolicy_ = nullptr;
185 currentFirewallPolicy_ = new (std::nothrow) NetFirewallPolicy();
186 LoadPolicyFormPreference(userId, currentFirewallPolicy_);
187 }
188
LoadPolicyFormPreference(const int32_t userId,sptr<NetFirewallPolicy> & policy)189 void NetFirewallPolicyManager::LoadPolicyFormPreference(const int32_t userId, sptr<NetFirewallPolicy> &policy)
190 {
191 preferencesHelper_->GetPreference(FIREWALL_PREFERENCE_PATH + std::to_string(userId) + ".xml");
192 policy->isOpen = preferencesHelper_->ObtainBool(NET_FIREWALL_IS_OPEN, false);
193 policy->inAction = static_cast<FirewallRuleAction>(
194 preferencesHelper_->ObtainInt(NET_FIREWALL_IN_ACTION, static_cast<int>(FirewallRuleAction::RULE_ALLOW)));
195 policy->outAction = static_cast<FirewallRuleAction>(
196 preferencesHelper_->ObtainInt(NET_FIREWALL_OUT_ACTION, static_cast<int>(FirewallRuleAction::RULE_ALLOW)));
197 }
198 } // namespace NetManagerStandard
199 } // namespace OHOS
200