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 "telephony_call_policy_plugin.h"
17
18 #include <unordered_set>
19 #include <algorithm>
20 #include "edm_constants.h"
21 #include "edm_ipc_interface_code.h"
22 #include "telephony_call_policy_serializer.h"
23 #include "iplugin_manager.h"
24 #include "parameters.h"
25 #include "policy_flag.h"
26 #include "func_code_utils.h"
27 #include "call_manager_client.h"
28 #include "system_ability_definition.h"
29
30 namespace OHOS {
31 namespace EDM {
32 const bool REGISTER_RESULT = IPluginManager::GetInstance()->AddPlugin(std::make_shared<TelephonyCallPolicyPlugin>());
33 const std::string PARAM_DISALLOWED_TELEPHONY_CALL = "persist.edm.telephony_call_disable";
34
TelephonyCallPolicyPlugin()35 TelephonyCallPolicyPlugin::TelephonyCallPolicyPlugin()
36 {
37 policyCode_ = EdmInterfaceCode::TELEPHONY_CALL_POLICY;
38 policyName_ = PolicyName::POLICY_TELEPHONY_CALL_POLICY;
39 permissionConfig_.typePermissions.emplace(IPlugin::PermissionType::SUPER_DEVICE_ADMIN,
40 EdmPermission::PERMISSION_ENTERPRISE_MANAGE_TELEPHONY);
41 permissionConfig_.apiType = IPlugin::ApiType::PUBLIC;
42 needSave_ = true;
43 }
44
OnHandlePolicy(std::uint32_t funcCode,MessageParcel & data,MessageParcel & reply,HandlePolicyData & policyData,int32_t userId)45 ErrCode TelephonyCallPolicyPlugin::OnHandlePolicy(std::uint32_t funcCode, MessageParcel &data, MessageParcel &reply,
46 HandlePolicyData &policyData, int32_t userId)
47 {
48 EDMLOGI("TelephonyCallPolicyPlugin OnHandlePolicy.");
49 if (system::GetBoolParameter(PARAM_DISALLOWED_TELEPHONY_CALL, false)) {
50 EDMLOGE("TelephonyCallPolicyPlugin::OnHandlePolicy failed, because telephony call disallow");
51 return EdmReturnErrCode::ENTERPRISE_POLICES_DENIED;
52 }
53 uint32_t typeCode = FUNC_TO_OPERATE(funcCode);
54 FuncOperateType type = FuncCodeUtils::ConvertOperateType(typeCode);
55 const std::string callType = data.ReadString();
56 const int32_t flag = data.ReadInt32();
57 std::vector<std::string> addList;
58 data.ReadStringVector(&addList);
59 auto serializer = TelephonyCallPolicySerializer::GetInstance();
60 std::map<std::string, TelephonyCallPolicyType> policies;
61 std::map<std::string, TelephonyCallPolicyType> mergePolicies;
62 if (!serializer->Deserialize(policyData.policyData, policies) ||
63 !serializer->Deserialize(policyData.mergePolicyData, mergePolicies)) {
64 EDMLOGE("OnHandlePolicy Deserialize current policy and merge policy failed.");
65 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
66 }
67 ErrCode ret = ERR_OK;
68 if (type == FuncOperateType::SET) {
69 ret = AddCurrentAndMergePolicy(policies, mergePolicies, callType, flag, addList);
70 } else if (type == FuncOperateType::REMOVE) {
71 ret = RemoveCurrentAndMergePolicy(policies, mergePolicies, callType, flag, addList);
72 } else {
73 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
74 }
75 if (ret != ERR_OK) {
76 return ret;
77 }
78 std::string afterHandle;
79 std::string afterMerge;
80 if (!serializer->Serialize(policies, afterHandle) || !serializer->Serialize(mergePolicies, afterMerge)) {
81 EDMLOGE("TelephonyCallPolicyPlugin::OnHandlePolicy Serialize current policy and merge policy failed.");
82 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
83 }
84 policyData.isChanged = true;
85 policyData.policyData = afterHandle;
86 policyData.mergePolicyData = afterMerge;
87 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->Init(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
88 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->SetCallPolicyInfo(
89 mergePolicies[EdmConstants::CallPolicy::OUTGOING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
90 mergePolicies[EdmConstants::CallPolicy::OUTGOING].numberList,
91 mergePolicies[EdmConstants::CallPolicy::INCOMING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
92 mergePolicies[EdmConstants::CallPolicy::INCOMING].numberList);
93 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->UnInit();
94
95 return ERR_OK;
96 }
97
MergeAndRemoveDuplicates(const std::vector<std::string> & v1,const std::vector<std::string> & v2)98 std::vector<std::string> TelephonyCallPolicyPlugin::MergeAndRemoveDuplicates(const std::vector<std::string> &v1,
99 const std::vector<std::string> &v2)
100 {
101 std::unordered_set<std::string> uset;
102 uset.insert(v1.begin(), v1.end());
103 uset.insert(v2.begin(), v2.end());
104 std::vector<std::string> result(uset.begin(), uset.end());
105 return result;
106 }
107
IsTrustBlockConflict(const std::string & policyTye,const int32_t flag,std::map<std::string,TelephonyCallPolicyType> & mergePolicies)108 bool TelephonyCallPolicyPlugin::IsTrustBlockConflict(const std::string &policyTye, const int32_t flag,
109 std::map<std::string, TelephonyCallPolicyType> &mergePolicies)
110 {
111 auto iter = mergePolicies.find(policyTye);
112 if (iter != mergePolicies.end()) {
113 std::vector<std::string> numberList = mergePolicies[policyTye].numberList;
114 int32_t policyFlag = mergePolicies[policyTye].policyFlag;
115 if (flag != policyFlag && numberList.size() > 0) {
116 EDMLOGE("TelephonyCallPolicyPlugin::AddCurrentAndMergePolicy current policy is "
117 "%{public}d, set value is %{public}d", policyFlag, flag);
118 return true;
119 }
120 }
121
122 return false;
123 }
124
CheckIsLimit(const std::string & policyTye,const int32_t flag,const std::vector<std::string> & addList,std::map<std::string,TelephonyCallPolicyType> & mergePolicies)125 bool TelephonyCallPolicyPlugin::CheckIsLimit(const std::string &policyTye, const int32_t flag,
126 const std::vector<std::string> &addList, std::map<std::string, TelephonyCallPolicyType> &mergePolicies)
127 {
128 std::vector<std::string> numberList = mergePolicies[policyTye].numberList;
129 std::vector<std::string> allList = MergeAndRemoveDuplicates(numberList, addList);
130 return allList.size() > EdmConstants::CallPolicy::NUMBER_LIST_MAX_SIZE;
131 }
132
AddCurrentAndMergePolicy(std::map<std::string,TelephonyCallPolicyType> & policies,std::map<std::string,TelephonyCallPolicyType> & mergePolicies,const std::string & policyTye,const int32_t flag,const std::vector<std::string> & addList)133 ErrCode TelephonyCallPolicyPlugin::AddCurrentAndMergePolicy(
134 std::map<std::string, TelephonyCallPolicyType> &policies,
135 std::map<std::string, TelephonyCallPolicyType> &mergePolicies, const std::string &policyTye,
136 const int32_t flag, const std::vector<std::string> &addList)
137 {
138 EDMLOGI("TelephonyCallPolicyPlugin AddCurrentAndMergePolicy.");
139 auto policyManager = IPolicyManager::GetInstance();
140 std::string allPolicy;
141 std::map<std::string, TelephonyCallPolicyType> allpolicies;
142 policyManager->GetPolicy("", PolicyName::POLICY_TELEPHONY_CALL_POLICY, allPolicy);
143 auto serializer = TelephonyCallPolicySerializer::GetInstance();
144 if (!serializer->Deserialize(allPolicy, allpolicies)) {
145 EDMLOGE("OnHandlePolicy Deserialize current policy and merge policy failed.");
146 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
147 }
148 // 黑/白名单 互斥
149 if (IsTrustBlockConflict(policyTye, flag, allpolicies)) {
150 return EdmReturnErrCode::CONFIGURATION_CONFLICT_FAILED;
151 }
152 // 上限 1000
153 if (CheckIsLimit(policyTye, flag, addList, allpolicies)) {
154 return EdmReturnErrCode::PARAMETER_VERIFICATION_FAILED;
155 }
156
157 std::vector<std::string> &numberList = policies[policyTye].numberList;
158 // 合并去重
159 policies[policyTye].numberList = MergeAndRemoveDuplicates(numberList, addList);
160 policies[policyTye].policyFlag = flag;
161
162 for (auto policy : policies) {
163 if (mergePolicies.find(policy.first) == mergePolicies.end()) {
164 mergePolicies[policy.first] = policy.second;
165 continue;
166 }
167 mergePolicies[policy.first].numberList = MergeAndRemoveDuplicates(mergePolicies[policy.first].numberList,
168 policy.second.numberList);
169 mergePolicies[policy.first].policyFlag = policy.second.policyFlag;
170 }
171 return ERR_OK;
172 }
173
RemoveCurrentAndMergePolicy(std::map<std::string,TelephonyCallPolicyType> & policies,std::map<std::string,TelephonyCallPolicyType> & mergePolicies,const std::string & policyTye,const int32_t flag,const std::vector<std::string> & addList)174 ErrCode TelephonyCallPolicyPlugin::RemoveCurrentAndMergePolicy(
175 std::map<std::string, TelephonyCallPolicyType> &policies,
176 std::map<std::string, TelephonyCallPolicyType> &mergePolicies, const std::string &policyTye,
177 const int32_t flag, const std::vector<std::string> &addList)
178 {
179 auto iter = policies.find(policyTye);
180 if (iter == policies.end() || policies[policyTye].policyFlag != flag) {
181 return EdmReturnErrCode::PARAMETER_VERIFICATION_FAILED;
182 }
183
184 std::vector<std::string> numberList = policies[policyTye].numberList;
185 for (auto it = addList.begin(); it != addList.end(); ++it) {
186 numberList.erase(std::remove(numberList.begin(), numberList.end(), *it), numberList.end());
187 }
188 policies[policyTye].numberList = numberList;
189
190 for (auto policy : policies) {
191 if (mergePolicies.find(policy.first) == mergePolicies.end()) {
192 mergePolicies[policy.first] = policy.second;
193 continue;
194 }
195 mergePolicies[policy.first].numberList = MergeAndRemoveDuplicates(mergePolicies[policy.first].numberList,
196 policy.second.numberList);
197 mergePolicies[policy.first].policyFlag = policy.second.policyFlag;
198 }
199 return ERR_OK;
200 }
201
GetOthersMergePolicyData(const std::string & adminName,int32_t userId,std::string & othersMergePolicyData)202 ErrCode TelephonyCallPolicyPlugin::GetOthersMergePolicyData(const std::string &adminName, int32_t userId,
203 std::string &othersMergePolicyData)
204 {
205 AdminValueItemsMap adminValues;
206 IPolicyManager::GetInstance()->GetAdminByPolicyName(GetPolicyName(), adminValues);
207 EDMLOGD("IPluginTemplate::GetOthersMergePolicyData %{public}s value size %{public}d.", GetPolicyName().c_str(),
208 (uint32_t)adminValues.size());
209 if (adminValues.empty()) {
210 return ERR_OK;
211 }
212 auto entry = adminValues.find(adminName);
213 if (entry != adminValues.end()) {
214 adminValues.erase(entry);
215 }
216 if (adminValues.empty()) {
217 return ERR_OK;
218 }
219 std::map<std::string, TelephonyCallPolicyType> mergeData;
220 auto serializer = TelephonyCallPolicySerializer::GetInstance();
221 for (const auto &item : adminValues) {
222 std::map<std::string, TelephonyCallPolicyType> dataItem;
223 if (item.second.empty()) {
224 continue;
225 }
226 if (!serializer->Deserialize(item.second, dataItem)) {
227 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
228 }
229 for (auto item : dataItem) {
230 if (mergeData.find(item.first) == mergeData.end()) {
231 mergeData[item.first] = item.second;
232 continue;
233 }
234 mergeData[item.first].numberList = MergeAndRemoveDuplicates(mergeData[item.first].numberList,
235 item.second.numberList);
236 mergeData[item.first].policyFlag = item.second.policyFlag;
237 }
238 }
239
240 if (!serializer->Serialize(mergeData, othersMergePolicyData)) {
241 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
242 }
243 return ERR_OK;
244 }
245
OnAdminRemove(const std::string & adminName,const std::string & policyData,const std::string & mergeData,int32_t userId)246 ErrCode TelephonyCallPolicyPlugin::OnAdminRemove(const std::string &adminName,
247 const std::string &policyData, const std::string &mergeData, int32_t userId)
248 {
249 auto serializer = TelephonyCallPolicySerializer::GetInstance();
250 std::map<std::string, TelephonyCallPolicyType> mergePolicies;
251 if (!serializer->Deserialize(mergeData, mergePolicies)) {
252 EDMLOGE("OnHandlePolicy Deserialize current policy and merge policy failed.");
253 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
254 }
255 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->Init(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
256 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->SetCallPolicyInfo(
257 mergePolicies[EdmConstants::CallPolicy::OUTGOING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
258 mergePolicies[EdmConstants::CallPolicy::OUTGOING].numberList,
259 mergePolicies[EdmConstants::CallPolicy::INCOMING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
260 mergePolicies[EdmConstants::CallPolicy::INCOMING].numberList);
261 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->UnInit();
262 return ERR_OK;
263 }
264
OnOtherServiceStart(int32_t systemAbilityId)265 void TelephonyCallPolicyPlugin::OnOtherServiceStart(int32_t systemAbilityId)
266 {
267 EDMLOGI("TelephonyCallPolicyPlugin::OnOtherServiceStart systemAbilityId:%{public}d", systemAbilityId);
268 std::string policyData;
269 IPolicyManager::GetInstance()->GetPolicy("", PolicyName::POLICY_TELEPHONY_CALL_POLICY,
270 policyData, EdmConstants::DEFAULT_USER_ID);
271 auto serializer_ = TelephonyCallPolicySerializer::GetInstance();
272 std::map<std::string, TelephonyCallPolicyType> policies;
273 if (!serializer_->Deserialize(policyData, policies)) {
274 EDMLOGE("TelephonyCallPolicyPlugin::OnOtherServiceStart Deserialize failed");
275 return;
276 }
277 if (policies.size() > 0) {
278 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->Init(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
279 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->SetCallPolicyInfo(
280 policies[EdmConstants::CallPolicy::OUTGOING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
281 policies[EdmConstants::CallPolicy::OUTGOING].numberList,
282 policies[EdmConstants::CallPolicy::INCOMING].policyFlag == static_cast<int32_t>(PolicyFlag::TRUST_LIST),
283 policies[EdmConstants::CallPolicy::INCOMING].numberList);
284 DelayedSingleton<Telephony::CallManagerClient>::GetInstance()->UnInit();
285 }
286 }
287 } // namespace EDM
288 } // namespace OHOS
289