• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }