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