1 /*
2 * Copyright (C) 2025-2025 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 "antifraud_service.h"
17
18 #include <string>
19 #include "antifraud_adapter.h"
20 #include "anonymize_adapter.h"
21 #include "antifraud_cloud_service.h"
22 #include "anti_fraud_service_client.h"
23 #include "common_type.h"
24 #include "telephony_log_wrapper.h"
25 #include "iservice_registry.h"
26
27 namespace OHOS {
28 namespace Telephony {
AntiFraudService()29 AntiFraudService::AntiFraudService()
30 {}
31
~AntiFraudService()32 AntiFraudService::~AntiFraudService()
33 {}
34
SetCallStatusManager(std::shared_ptr<CallStatusManager> callStatusManager)35 void AntiFraudService::SetCallStatusManager(std::shared_ptr<CallStatusManager> callStatusManager)
36 {
37 callStatusManagerPtr_ = callStatusManager;
38 }
39
CreateDataShareHelper(int32_t systemAbilityId,const char * uri)40 std::shared_ptr<DataShare::DataShareHelper> AntiFraudService::CreateDataShareHelper(
41 int32_t systemAbilityId, const char *uri)
42 {
43 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
44 if (saManager == nullptr) {
45 TELEPHONY_LOGE("CellularDataRdbHelper GetSystemAbilityManager failed.");
46 return nullptr;
47 }
48 sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(systemAbilityId);
49 if (remoteObj == nullptr) {
50 TELEPHONY_LOGE("CellularDataRdbHelper GetSystemAbility Service Failed.");
51 return nullptr;
52 }
53 return DataShare::DataShareHelper::Creator(remoteObj, uri);
54 }
55
IsSwitchOn(const std::string switchName)56 bool AntiFraudService::IsSwitchOn(const std::string switchName)
57 {
58 auto settingHelper = CreateDataShareHelper(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID,
59 USER_SETTINGSDATA_URI.c_str());
60 if (settingHelper == nullptr) {
61 TELEPHONY_LOGE("settingHelper is null");
62 return false;
63 }
64
65 DataShare::DataSharePredicates predicates;
66 std::vector<std::string> columns;
67 std::string keyword = "KEYWORD";
68 predicates.EqualTo(keyword, switchName);
69 Uri userStttingsDataUri(USER_SETTINGSDATA_URI);
70 auto result = settingHelper->Query(userStttingsDataUri, predicates, columns);
71 if (result == nullptr) {
72 TELEPHONY_LOGE("setting DB: query error");
73 settingHelper->Release();
74 return false;
75 }
76
77 result->GoToFirstRow();
78 int32_t columnIndex;
79 std::string resultValue;
80 std::string valueStr = "VALUE";
81 result->GetColumnIndex(valueStr, columnIndex);
82 result->GetString(columnIndex, resultValue);
83 result->Close();
84 settingHelper->Release();
85 if (resultValue.empty()) {
86 TELEPHONY_LOGE("resultValue is empty");
87 return false;
88 }
89
90 TELEPHONY_LOGI("Query end resultValue is %{public}s", resultValue.c_str());
91 int32_t value = atoi(resultValue.c_str());
92 if (value == 1) {
93 return true;
94 } else {
95 return false;
96 }
97 }
98
IsAntiFraudSwitchOn()99 bool AntiFraudService::IsAntiFraudSwitchOn()
100 {
101 return IsSwitchOn(ANTIFRAUD_SWITCH);
102 }
103
IsUserImprovementPlanSwitchOn()104 bool AntiFraudService::IsUserImprovementPlanSwitchOn()
105 {
106 return IsSwitchOn(USER_IMPROPLAN_SWITCH);
107 }
108
InitParams()109 void AntiFraudService::InitParams()
110 {
111 fraudDetectErr_ = 0;
112 isResultFraud_ = false;
113 fraudDetectVersion_ = 0;
114 fraudDetectType_ = 0;
115 fraudDetectText_ = "";
116 fraudDetectProb_ = 0.0;
117 antiFraudState_ = static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_DEFAULT);
118 }
119
GetStoppedSlotId()120 int32_t AntiFraudService::GetStoppedSlotId()
121 {
122 std::lock_guard<ffrt::mutex> lock(mutex_);
123 return stoppedSlotId_;
124 }
125
GetStoppedIndex()126 int32_t AntiFraudService::GetStoppedIndex()
127 {
128 std::lock_guard<ffrt::mutex> lock(mutex_);
129 return stoppedIndex_;
130 }
131
SetStoppedSlotId(int32_t slotId)132 void AntiFraudService::SetStoppedSlotId(int32_t slotId)
133 {
134 std::lock_guard<ffrt::mutex> lock(mutex_);
135 stoppedSlotId_ = slotId;
136 }
137
SetStoppedIndex(int32_t index)138 void AntiFraudService::SetStoppedIndex(int32_t index)
139 {
140 std::lock_guard<ffrt::mutex> lock(mutex_);
141 stoppedIndex_ = index;
142 }
143
RecordDetectResult(const OHOS::AntiFraudService::AntiFraudResult & antiFraudResult,std::string resultPhoneNum,int32_t resultSlotId,int32_t resultIndex)144 void AntiFraudService::RecordDetectResult(const OHOS::AntiFraudService::AntiFraudResult &antiFraudResult,
145 std::string resultPhoneNum, int32_t resultSlotId, int32_t resultIndex)
146 {
147 if (GetStoppedSlotId() == resultSlotId && GetStoppedIndex() == resultIndex) {
148 TELEPHONY_LOGI("detect stopped, no need to record result");
149 SetStoppedSlotId(-1);
150 SetStoppedIndex(-1);
151 return;
152 }
153 fraudDetectErr_ = antiFraudResult.errCode;
154 isResultFraud_ = antiFraudResult.result;
155 fraudDetectVersion_ = antiFraudResult.modelVersion;
156 fraudDetectType_ = antiFraudResult.fraudType;
157 fraudDetectText_ = antiFraudResult.text;
158 fraudDetectProb_ = antiFraudResult.pvalue;
159
160 if (isResultFraud_) {
161 TELEPHONY_LOGI("AntiFraud detect finish, is fraud call");
162 antiFraudState_ = static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_RISK);
163 } else {
164 TELEPHONY_LOGI("AntiFraud detect finish, is not fraud call");
165 antiFraudState_ = static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_FINISHED);
166 }
167 if (callStatusManagerPtr_ != nullptr) {
168 callStatusManagerPtr_->TriggerAntiFraud(antiFraudState_);
169 }
170
171 if (isResultFraud_ && IsUserImprovementPlanSwitchOn()) {
172 TELEPHONY_LOGI("text reported to the cloud after anonymize");
173 int ret = AnonymizeText();
174 if (ret != 0) {
175 TELEPHONY_LOGE("Anonymize text fail");
176 return;
177 }
178 OHOS::AntiFraudService::AntiFraudResult fraudResult = antiFraudResult;
179 fraudResult.text = fraudDetectText_;
180 std::make_shared<AntiFraudCloudService>(resultPhoneNum)->UploadPostRequest(fraudResult);
181 }
182 }
183
CheckAntiFraudService(const std::string & phoneNum,int32_t slotId,int32_t index)184 int32_t AntiFraudService::CheckAntiFraudService(const std::string &phoneNum, int32_t slotId, int32_t index)
185 {
186 auto antiFraudAdapter = DelayedSingleton<AntiFraudAdapter>::GetInstance();
187 int32_t antiFraudErrCode = antiFraudAdapter->CheckAntiFraud(phoneNum);
188 if (antiFraudErrCode != 0) {
189 TELEPHONY_LOGE("Check AntiFraud, no need to detect, ErrCode:%{public}d", antiFraudErrCode);
190 return antiFraudErrCode;
191 }
192 return 0;
193 }
194
StartAntiFraudService(const std::string & phoneNum,int32_t slotId,int32_t index)195 int32_t AntiFraudService::StartAntiFraudService(const std::string &phoneNum, int32_t slotId, int32_t index)
196 {
197 int32_t antiFraudErrCode = CheckAntiFraudService(phoneNum, slotId, index);
198 if (antiFraudErrCode != 0) {
199 return antiFraudErrCode;
200 }
201 std::lock_guard<ffrt::mutex> lock(mutex_);
202 if (callStatusManagerPtr_ != nullptr) {
203 if (callStatusManagerPtr_->GetAntiFraudSlotId() != slotId ||
204 callStatusManagerPtr_->GetAntiFraudIndex() != index) {
205 TELEPHONY_LOGI("call ending, no need to detect");
206 return -1;
207 }
208 }
209 auto antiFraudAdapter = DelayedSingleton<AntiFraudAdapter>::GetInstance();
210 auto listener = std::make_shared<AntiFraudDetectResListenerImpl>(phoneNum, slotId, index);
211 antiFraudErrCode = antiFraudAdapter->DetectAntiFraud(listener);
212 if (antiFraudErrCode != 0) {
213 TELEPHONY_LOGE("Detect AntiFraud failed, ErrCode=%{public}d", antiFraudErrCode);
214 return antiFraudErrCode;
215 }
216 TELEPHONY_LOGI("AntiFraud begin detect, slotId=%{public}d, index=%{public}d", slotId, index);
217 antiFraudState_ = static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_STARTED);
218 if (callStatusManagerPtr_ != nullptr) {
219 callStatusManagerPtr_->TriggerAntiFraud(antiFraudState_);
220 }
221 InitParams();
222 return 0;
223 }
224
StopAntiFraudService(int32_t slotId,int32_t index)225 int32_t AntiFraudService::StopAntiFraudService(int32_t slotId, int32_t index)
226 {
227 {
228 std::lock_guard<ffrt::mutex> lock(mutex_);
229 auto antiFraudAdapter = DelayedSingleton<AntiFraudAdapter>::GetInstance();
230 int32_t antiFraudErrCode = antiFraudAdapter->StopAntiFraud();
231 if (antiFraudErrCode != 0) {
232 TELEPHONY_LOGE("Stop AntiFraud failed, ErrCode=%{public}d", antiFraudErrCode);
233 return antiFraudErrCode;
234 }
235 TELEPHONY_LOGI("AntiFraud stop detect, slotId=%{public}d, index=%{public}d", slotId, index);
236 }
237 SetStoppedSlotId(slotId);
238 SetStoppedIndex(index);
239 return 0;
240 }
241
HandleAntiFraudDetectRes(const OHOS::AntiFraudService::AntiFraudResult & antiFraudResult)242 void AntiFraudService::AntiFraudDetectResListenerImpl::HandleAntiFraudDetectRes(
243 const OHOS::AntiFraudService::AntiFraudResult &antiFraudResult)
244 {
245 std::string resultPhoneNum = phoneNum_;
246 int32_t resultSlotId = slotId_;
247 int32_t resultIndex = index_;
248 TELEPHONY_LOGI("HandleAntiFraudDetectRes, result=%{public}d, slotId=%{public}d, index=%{public}d",
249 antiFraudResult.result, slotId_, index_);
250 DelayedSingleton<AntiFraudService>::GetInstance()->
251 RecordDetectResult(antiFraudResult, resultPhoneNum, resultSlotId, resultIndex);
252 }
253
AddRuleToConfig(const std::string rulesName,void * config)254 void AntiFraudService::AddRuleToConfig(const std::string rulesName, void *config)
255 {
256 DIA_String key;
257 std::string skey = "SELECT_RULE";
258 key.data = skey.data();
259 key.dataLength = SELECT_RULE_LENGTH;
260 DIA_Rule rule;
261 std::string rName = rulesName;
262 rule.ruleName = rName.data();
263 if ((rName == "CHINA_RESIDENT_PASSPORT") || (rName == "PERMIT_HM_TO_LAND") ||
264 (rName == "PERMIT_TW_TO_LAND") || (rName == "POLICE_OFFICER_CARD")) {
265 rule.isOpenKeywords = true;
266 }
267 auto anonymizeAdapter = DelayedSingleton<AnonymizeAdapter>::GetInstance();
268 int ret = anonymizeAdapter->SetRule(config, &key, &rule);
269 if (ret != 0) {
270 TELEPHONY_LOGE("AddRuleToConfig fail, rulename=%{public}s", rulesName.c_str());
271 }
272 }
273
AnonymizeText()274 int AntiFraudService::AnonymizeText()
275 {
276 void *config = nullptr;
277 auto anonymizeAdapter = DelayedSingleton<AnonymizeAdapter>::GetInstance();
278 int ret = anonymizeAdapter->InitConfig(&config);
279 if (ret != 0) {
280 TELEPHONY_LOGE("InitConfig fail");
281 return ret;
282 }
283 AddRuleToConfig("PRC", config);
284 AddRuleToConfig("CHINA_RESIDENT_PASSPORT", config);
285 AddRuleToConfig("MILITARY_IDENTITY_CARD_NUMBER", config);
286 AddRuleToConfig("BANK_CARD_NUMBER", config);
287 AddRuleToConfig("PERMIT_LAND_TO_HM", config);
288 AddRuleToConfig("PERMIT_LAND_TO_TW", config);
289 AddRuleToConfig("PERMIT_HM_TO_LAND", config);
290 AddRuleToConfig("PERMIT_TW_TO_LAND", config);
291 AddRuleToConfig("BIRTH_CERTIFICATE", config);
292 AddRuleToConfig("SEAFARER_PASSPORT", config);
293 AddRuleToConfig("POLICE_OFFICER_CARD", config);
294
295 void *assistant = nullptr;
296 ret = anonymizeAdapter->CreateAnonymize(config, &assistant);
297 if (ret != 0) {
298 TELEPHONY_LOGE("CreateAnonymize fail");
299 return ret;
300 }
301
302 DIA_String input;
303 std::string fraudDetectText = fraudDetectText_;
304 input.data = fraudDetectText.data();
305 input.dataLength = strlen(input.data);
306 DIA_String *output = nullptr;
307 ret = anonymizeAdapter->IdentifyAnonymize(assistant, &input, &output);
308 if (ret != 0) {
309 TELEPHONY_LOGE("IdentifyAnonymize fail");
310 return ret;
311 } else {
312 fraudDetectText_ = (std::string)output->data;
313 }
314 anonymizeAdapter->ReleaseConfig(&config);
315 anonymizeAdapter->ReleaseAnonymize(&assistant);
316 anonymizeAdapter->ReleaseOutputData(&output);
317 return 0;
318 }
319 }
320 }