• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "sms_service.h"
17 
18 #include <regex>
19 
20 #include "cdma_sms_message.h"
21 #include "core_manager_inner.h"
22 #include "ims_sms_client.h"
23 #include "phonenumbers/phonenumber.pb.h"
24 #include "sms_dump_helper.h"
25 #include "sms_mms_common.h"
26 #include "sms_hisysevent.h"
27 #include "sms_policy_utils.h"
28 #include "string_utils.h"
29 #include "telephony_common_utils.h"
30 #include "telephony_ext_wrapper.h"
31 #include "telephony_log_wrapper.h"
32 #include "telephony_permission.h"
33 #include "text_coder.h"
34 #include "base64.h"
35 
36 namespace OHOS {
37 namespace Telephony {
38 using namespace std;
39 using namespace AppExecFwk;
40 using namespace HiviewDFX;
41 constexpr static uint32_t CONNECT_SERVICE_WAIT_TIME = 2000;
42 constexpr static int32_t CB_RANGE_PAIR_SIZE = 2;
43 constexpr static size_t MIN_LEN = 1;
44 bool g_registerResult = SystemAbility::MakeAndRegisterAbility(DelayedSingleton<SmsService>::GetInstance().get());
45 const std::string INFO_MSG_TELEPHONE_REG = "^(0086|\\+?86|\\+)?(9|95|100|101|106|108|111|116|118|123|125|400|800|1212|"
46     "000000|\\d{2,4}12123$|\\d{2,4}12329$|^02[0-9]|010|^05[34]|^07[56])";
47 const std::string ISO_COUNTRY_CODE = "CN";
SmsService()48 SmsService::SmsService() : SystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID, true) {}
49 
~SmsService()50 SmsService::~SmsService() {}
51 
OnStart()52 void SmsService::OnStart()
53 {
54     TELEPHONY_LOGI("SmsService::OnStart start service Enter.");
55     bindTime_ =
56         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
57             .count();
58     if (state_ == ServiceRunningState::STATE_RUNNING) {
59         TELEPHONY_LOGE("msService has already started.");
60         return;
61     }
62     if (!Init()) {
63         TELEPHONY_LOGE("failed to init SmsService");
64         return;
65     }
66     state_ = ServiceRunningState::STATE_RUNNING;
67     endTime_ =
68         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
69             .count();
70     TELEPHONY_LOGI("SmsService::OnStart start service Exit.");
71 }
72 
Init()73 bool SmsService::Init()
74 {
75 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
76     TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
77 #endif
78     DelayedSingleton<ImsSmsClient>::GetInstance()->Init();
79     if (!registerToService_) {
80         bool ret = Publish(DelayedSingleton<SmsService>::GetInstance().get());
81         if (!ret) {
82             TELEPHONY_LOGE("SmsService::Init Publish failed!");
83             return false;
84         }
85         registerToService_ = true;
86         WaitCoreServiceToInit();
87     }
88     DelayedSingleton<SmsStateHandler>::GetInstance()->Init();
89     return true;
90 }
91 
OnStop()92 void SmsService::OnStop()
93 {
94     state_ = ServiceRunningState::STATE_NOT_START;
95     registerToService_ = false;
96     DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
97     DelayedSingleton<SmsStateHandler>::GetInstance()->UnInit();
98     TELEPHONY_LOGI("SmsService::OnStop stop service.");
99 }
100 
Dump(std::int32_t fd,const std::vector<std::u16string> & args)101 int32_t SmsService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
102 {
103     if (fd < 0) {
104         TELEPHONY_LOGE("dump fd invalid");
105         return TELEPHONY_ERR_FAIL;
106     }
107     std::vector<std::string> argsInStr;
108     for (const auto &arg : args) {
109         TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
110         argsInStr.emplace_back(Str16ToStr8(arg));
111     }
112     std::string result;
113     SmsDumpHelper dumpHelper;
114     if (dumpHelper.Dump(argsInStr, result)) {
115         TELEPHONY_LOGI("%{public}s", result.c_str());
116         std::int32_t ret = dprintf(fd, "%s", result.c_str());
117         if (ret < 0) {
118             TELEPHONY_LOGE("dprintf to dump fd failed");
119             return TELEPHONY_ERR_FAIL;
120         }
121         return TELEPHONY_SUCCESS;
122     }
123     TELEPHONY_LOGW("dumpHelper failed");
124     return TELEPHONY_ERR_FAIL;
125 }
126 
WaitCoreServiceToInit()127 void SmsService::WaitCoreServiceToInit()
128 {
129     TelFFRTUtils::Submit([&]() {
130         while (true) {
131             if (CoreManagerInner::GetInstance().IsInitFinished()) {
132                 InitModule();
133                 TELEPHONY_LOGI("SmsService Connection successful");
134                 break;
135             }
136             TelFFRTUtils::SleepFor(CONNECT_SERVICE_WAIT_TIME);
137         }
138     });
139 }
140 
GetBindTime()141 std::string SmsService::GetBindTime()
142 {
143     return std::to_string(bindTime_);
144 }
145 
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,bool isMmsApp)146 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, const u16string text,
147     const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback,
148     bool isMmsApp)
149 {
150     if (SmsPolicyUtils::IsSmsPolicyDisable()) {
151         TELEPHONY_LOGE("SmsService::SendMessage sms policy is disabled");
152         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
153         return TELEPHONY_ERR_POLICY_DISABLED;
154     }
155     if (!CheckSmsPermission(sendCallback)) {
156         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
157             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
158         return TELEPHONY_ERR_PERMISSION_ERR;
159     }
160     if (desAddr.empty()) {
161         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
162         TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
163         return TELEPHONY_ERR_ARGUMENT_INVALID;
164     }
165     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
166     if (interfaceManager == nullptr) {
167         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
168         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
169             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms interfaceManager is nullptr");
170         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
171         return TELEPHONY_ERR_LOCAL_PTR_NULL;
172     }
173     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
174         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
175         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
176         return TELEPHONY_ERR_ARGUMENT_INVALID;
177     }
178 
179     uint16_t dataId = 0;
180     if (!isMmsApp) {
181         InsertSessionAndDetail(slotId, StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(text), dataId);
182         TELEPHONY_LOGI("InsertSessionAndDetail write data to db. the id:%{public}d", dataId);
183     } else {
184         DataShare::DataSharePredicates predicates;
185         predicates.EqualTo(SmsMmsInfo::MSG_TYPE, SmsMmsCommonData::SMS_MSM_TYPE_SMS);
186         predicates.EqualTo(SmsMmsInfo::RECEIVER_NUMBER, StringUtils::ToUtf8(desAddr));
187         predicates.EqualTo(SmsMmsInfo::SLOT_ID, slotId);
188         predicates.EqualTo(SmsMmsInfo::MSG_CONTENT, StringUtils::ToUtf8(text));
189         predicates.EqualTo(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SENDING);
190         predicates.OrderByDesc(SmsMmsInfo::START_TIME);
191         DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySmsMmsForId(predicates, dataId);
192     }
193     bool ret = interfaceManager->TextBasedSmsDelivery(StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr),
194         StringUtils::ToUtf8(text), sendCallback, deliveryCallback, dataId, isMmsApp);
195     DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
196     return ret;
197 }
198 
SendMessageWithoutSave(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)199 int32_t SmsService::SendMessageWithoutSave(int32_t slotId, const u16string desAddr, const u16string scAddr,
200     const u16string text, const sptr<ISendShortMessageCallback> &sendCallback,
201     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
202 {
203     return SendMessage(slotId, desAddr, scAddr, text, sendCallback, deliveryCallback);
204 }
205 
InsertSessionAndDetail(int32_t slotId,const std::string & telephone,const std::string & text,uint16_t & dataBaseId)206 void SmsService::InsertSessionAndDetail(int32_t slotId, const std::string &telephone, const std::string &text,
207     uint16_t &dataBaseId)
208 {
209     uint16_t sessionId = 0;
210     uint16_t messageCount = 0;
211     bool ret = QuerySessionByTelephone(telephone, sessionId, messageCount);
212     if (ret) {
213         InsertSmsMmsInfo(slotId, sessionId, telephone, text, dataBaseId);
214         messageCount++;
215         InsertSession(false, messageCount, telephone, text);
216     } else {
217         ret = InsertSession(true, 0, telephone, text);
218         if (ret) {
219             QuerySessionByTelephone(telephone, sessionId, messageCount);
220             InsertSmsMmsInfo(slotId, sessionId, telephone, text, dataBaseId);
221         }
222     }
223 }
224 
QuerySessionByTelephone(const std::string & telephone,uint16_t & sessionId,uint16_t & messageCount)225 bool SmsService::QuerySessionByTelephone(const std::string &telephone, uint16_t &sessionId, uint16_t &messageCount)
226 {
227     DataShare::DataSharePredicates predicates;
228     auto persistHelper = DelayedSingleton<SmsPersistHelper>::GetInstance();
229     UpdatePredicatesByPhoneNum(predicates, telephone);
230     return persistHelper->QuerySession(predicates, sessionId, messageCount);
231 }
232 
InsertSmsMmsInfo(int32_t slotId,uint16_t sessionId,const std::string & number,const std::string & text,uint16_t & dataBaseId)233 void SmsService::InsertSmsMmsInfo(
234     int32_t slotId, uint16_t sessionId, const std::string &number, const std::string &text, uint16_t &dataBaseId)
235 {
236     DataShare::DataSharePredicates predicates;
237     uint16_t maxGroupId = 0;
238     DelayedSingleton<SmsPersistHelper>::GetInstance()->QueryMaxGroupId(predicates, maxGroupId);
239     auto now = std::chrono::system_clock::now();
240     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
241     DataShare::DataShareValuesBucket smsMmsInfoBucket;
242     smsMmsInfoBucket.Put(SmsMmsInfo::SLOT_ID, std::to_string(slotId));
243     smsMmsInfoBucket.Put(SmsMmsInfo::RECEIVER_NUMBER, number);
244     smsMmsInfoBucket.Put(SmsMmsInfo::SENDER_NUMBER, "");
245     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SENDER, "0");
246     smsMmsInfoBucket.Put(SmsMmsInfo::START_TIME, std::to_string(duration.count()));
247     smsMmsInfoBucket.Put(SmsMmsInfo::END_TIME, std::to_string(duration.count()));
248     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TYPE, "0");
249     smsMmsInfoBucket.Put(SmsMmsInfo::SMS_TYPE, "0");
250     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TITLE, text);
251     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CONTENT, text);
252     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_STATE, SMS_MMS_INFO_MSG_STATE_SENDING);
253     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CODE, "");
254     smsMmsInfoBucket.Put(SmsMmsInfo::IS_LOCK, "0");
255     smsMmsInfoBucket.Put(SmsMmsInfo::IS_READ, "1");
256     smsMmsInfoBucket.Put(SmsMmsInfo::IS_COLLECT, "0");
257     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_TYPE, "0");
258     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_ID, std::to_string(sessionId));
259     smsMmsInfoBucket.Put(SmsMmsInfo::GROUP_ID, std::to_string(maxGroupId + 1));
260     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SUBSECTION, "0");
261     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SEND_REPORT, "0");
262     DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_MMS_INFO, smsMmsInfoBucket, dataBaseId);
263 }
264 
265 
InsertSession(bool isNewSession,uint16_t messageCount,const std::string & number,const std::string & text)266 bool SmsService::InsertSession(
267     bool isNewSession, uint16_t messageCount, const std::string &number, const std::string &text)
268 {
269     auto now = std::chrono::system_clock::now();
270     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
271     DataShare::DataShareValuesBucket sessionBucket;
272     sessionBucket.Put(Session::TIME, std::to_string(duration.count()));
273     sessionBucket.Put(Session::TELEPHONE, number);
274     sessionBucket.Put(Session::CONTENT, text);
275     sessionBucket.Put(Session::CONTACTS_NUM, "1");
276     sessionBucket.Put(Session::SMS_TYPE, "0");
277     sessionBucket.Put(Session::UNREAD_COUNT, "0");
278     sessionBucket.Put(Session::SENDING_STATUS, "0");
279     sessionBucket.Put(Session::HAS_DRAFT, "0");
280     sessionBucket.Put(Session::HAS_LOCK, "0");
281     sessionBucket.Put(Session::HAS_MMS, "0");
282     sessionBucket.Put(Session::HAS_ATTACHMENT, "0");
283     if (!isNewSession) {
284         sessionBucket.Put(Session::MESSAGE_COUNT, std::to_string(messageCount));
285         DataShare::DataSharePredicates predicates;
286         UpdatePredicatesByPhoneNum(predicates, number);
287         return DelayedSingleton<SmsPersistHelper>::GetInstance()->Update(predicates, sessionBucket);
288     }
289     sessionBucket.Put(Session::MESSAGE_COUNT, "1");
290     return DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_SESSION, sessionBucket);
291 }
292 
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,uint16_t port,const uint8_t * data,uint16_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)293 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, uint16_t port,
294     const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
295     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
296 {
297     if (SmsPolicyUtils::IsSmsPolicyDisable()) {
298         TELEPHONY_LOGE("SmsService::SendMessage sms policy is disabled");
299         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
300         return TELEPHONY_ERR_POLICY_DISABLED;
301     }
302     if (!CheckSmsPermission(sendCallback)) {
303         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
304             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
305         return TELEPHONY_ERR_PERMISSION_ERR;
306     }
307     if (desAddr.empty()) {
308         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
309         TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
310         return TELEPHONY_ERR_ARGUMENT_INVALID;
311     }
312     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
313     if (interfaceManager == nullptr) {
314         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
315         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
316         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
317             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "data sms interfaceManager is nullptr");
318         return TELEPHONY_ERR_LOCAL_PTR_NULL;
319     }
320     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
321         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
322         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
323         return TELEPHONY_ERR_ARGUMENT_INVALID;
324     }
325     bool ret = interfaceManager->DataBasedSmsDelivery(
326         StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr), port, data, dataLen, sendCallback, deliveryCallback);
327     DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
328     return ret;
329 }
330 
CheckSmsPermission(const sptr<ISendShortMessageCallback> & sendCallback)331 bool SmsService::CheckSmsPermission(const sptr<ISendShortMessageCallback> &sendCallback)
332 {
333     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
334         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
335         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
336         return false;
337     }
338     return true;
339 }
340 
IsImsSmsSupported(int32_t slotId,bool & isSupported)341 int32_t SmsService::IsImsSmsSupported(int32_t slotId, bool &isSupported)
342 {
343     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
344         TELEPHONY_LOGE("Non-system applications use system APIs!");
345         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
346     }
347     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
348     if (interfaceManager == nullptr) {
349         TELEPHONY_LOGE("interfaceManager is nullptr.");
350         return TELEPHONY_ERR_SLOTID_INVALID;
351     }
352     return interfaceManager->IsImsSmsSupported(slotId, isSupported);
353 }
354 
GetImsShortMessageFormat(std::u16string & format)355 int32_t SmsService::GetImsShortMessageFormat(std::u16string &format)
356 {
357     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
358         TELEPHONY_LOGE("Non-system applications use system APIs!");
359         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
360     }
361     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
362         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
363         return TELEPHONY_ERR_PERMISSION_ERR;
364     }
365     int32_t slotId = GetDefaultSmsSlotId();
366     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
367     if (interfaceManager == nullptr) {
368         TELEPHONY_LOGE("interfaceManager is nullptr error.");
369         return TELEPHONY_ERR_SLOTID_INVALID;
370     }
371     return interfaceManager->GetImsShortMessageFormat(format);
372 }
373 
HasSmsCapability()374 bool SmsService::HasSmsCapability()
375 {
376     int32_t slotId = GetDefaultSmsSlotId();
377     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
378     if (interfaceManager == nullptr) {
379         TELEPHONY_LOGE("Get SmsInterfaceManager is nullptr error.");
380         return true;
381     }
382     return interfaceManager->HasSmsCapability();
383 }
384 
SetSmscAddr(int32_t slotId,const std::u16string & scAddr)385 int32_t SmsService::SetSmscAddr(int32_t slotId, const std::u16string &scAddr)
386 {
387     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
388         TELEPHONY_LOGE("Non-system applications use system APIs!");
389         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
390     }
391     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
392         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
393         return TELEPHONY_ERR_PERMISSION_ERR;
394     }
395 
396     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
397     if (interfaceManager == nullptr) {
398         TELEPHONY_LOGE("interfaceManager is nullptr error.");
399         return TELEPHONY_ERR_SLOTID_INVALID;
400     }
401     string sca = StringUtils::ToUtf8(scAddr);
402     TrimSmscAddr(sca);
403     if (sca.empty() || sca.length() == 0) {
404         TELEPHONY_LOGE("sca is empty");
405         return TELEPHONY_ERR_ARGUMENT_NULL;
406     }
407     return interfaceManager->SetSmscAddr(sca);
408 }
409 
TrimSmscAddr(std::string & sca)410 void SmsService::TrimSmscAddr(std::string &sca)
411 {
412     if (sca.length() < MIN_LEN) {
413         return;
414     }
415     while (sca.length() >= MIN_LEN && sca[0] == ' ') {
416         sca.erase(0, 1);
417     }
418     while (sca.length() > MIN_LEN && sca[sca.length() - 1] == ' ') {
419         sca.erase(sca.length() - 1, 1);
420     }
421 }
422 
GetSmscAddr(int32_t slotId,std::u16string & smscAddress)423 int32_t SmsService::GetSmscAddr(int32_t slotId, std::u16string &smscAddress)
424 {
425     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
426         TELEPHONY_LOGE("Non-system applications use system APIs!");
427         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
428     }
429     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
430         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
431         return TELEPHONY_ERR_PERMISSION_ERR;
432     }
433 
434     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
435     if (interfaceManager == nullptr) {
436         TELEPHONY_LOGE("SmsService::GetSmscAddr interfaceManager nullptr error");
437         return TELEPHONY_ERR_SLOTID_INVALID;
438     }
439     return interfaceManager->GetSmscAddr(smscAddress);
440 }
441 
AddSimMessage(int32_t slotId,const std::u16string & smsc,const std::u16string & pdu,SimMessageStatus status)442 int32_t SmsService::AddSimMessage(
443     int32_t slotId, const std::u16string &smsc, const std::u16string &pdu, SimMessageStatus status)
444 {
445     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
446         TELEPHONY_LOGE("Non-system applications use system APIs!");
447         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
448     }
449     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
450         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
451         return TELEPHONY_ERR_PERMISSION_ERR;
452     }
453     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
454         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
455         return TELEPHONY_ERR_PERMISSION_ERR;
456     }
457 
458     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
459     if (interfaceManager == nullptr) {
460         TELEPHONY_LOGE("SmsService::AddSimMessage interfaceManager nullptr error");
461         return TELEPHONY_ERR_SLOTID_INVALID;
462     }
463     std::string smscData = StringUtils::ToUtf8(smsc);
464     std::string pduData = StringUtils::ToUtf8(pdu);
465     if (pdu.empty() || pduData.empty()) {
466         TELEPHONY_LOGE("SmsService::AddSimMessage pdu empty error");
467         return TELEPHONY_ERR_ARGUMENT_INVALID;
468     }
469     return interfaceManager->AddSimMessage(smscData, pduData, status);
470 }
471 
DelSimMessage(int32_t slotId,uint32_t msgIndex)472 int32_t SmsService::DelSimMessage(int32_t slotId, uint32_t msgIndex)
473 {
474     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
475         TELEPHONY_LOGE("Non-system applications use system APIs!");
476         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
477     }
478     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
479         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
480         return TELEPHONY_ERR_PERMISSION_ERR;
481     }
482     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
483         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
484         return TELEPHONY_ERR_PERMISSION_ERR;
485     }
486 
487     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
488     if (interfaceManager == nullptr) {
489         TELEPHONY_LOGE("SmsService::DelSimMessage interfaceManager nullptr error.");
490         return TELEPHONY_ERR_SLOTID_INVALID;
491     }
492     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
493         TELEPHONY_LOGE("SmsService::DelSimMessage msgIndex inValid");
494         return TELEPHONY_ERR_ARGUMENT_INVALID;
495     }
496 
497     return interfaceManager->DelSimMessage(msgIndex);
498 }
499 
UpdateSimMessage(int32_t slotId,uint32_t msgIndex,SimMessageStatus newStatus,const std::u16string & pdu,const std::u16string & smsc)500 int32_t SmsService::UpdateSimMessage(int32_t slotId, uint32_t msgIndex, SimMessageStatus newStatus,
501     const std::u16string &pdu, const std::u16string &smsc)
502 {
503     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
504         TELEPHONY_LOGE("Non-system applications use system APIs!");
505         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
506     }
507     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
508         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
509         return TELEPHONY_ERR_PERMISSION_ERR;
510     }
511     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
512         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
513         return TELEPHONY_ERR_PERMISSION_ERR;
514     }
515 
516     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
517     if (interfaceManager == nullptr) {
518         TELEPHONY_LOGE("SmsService::UpdateSimMessage interfaceManager nullptr error.");
519         return TELEPHONY_ERR_SLOTID_INVALID;
520     }
521     std::string pduData = StringUtils::ToUtf8(pdu);
522     std::string smscData = StringUtils::ToUtf8(smsc);
523     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
524         TELEPHONY_LOGE("SmsService::UpdateSimMessage msgIndex inValid");
525         return TELEPHONY_ERR_ARGUMENT_INVALID;
526     }
527     if (pdu.empty() || pduData.empty()) {
528         TELEPHONY_LOGE("SmsService::UpdateSimMessage pdu empty error");
529         return TELEPHONY_ERR_ARGUMENT_INVALID;
530     }
531     return interfaceManager->UpdateSimMessage(msgIndex, newStatus, pduData, smscData);
532 }
533 
GetAllSimMessages(int32_t slotId,std::vector<ShortMessage> & message)534 int32_t SmsService::GetAllSimMessages(int32_t slotId, std::vector<ShortMessage> &message)
535 {
536     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
537         TELEPHONY_LOGE("Non-system applications use system APIs!");
538         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
539     }
540     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
541         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
542         return TELEPHONY_ERR_PERMISSION_ERR;
543     }
544 
545     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
546     if (interfaceManager == nullptr) {
547         TELEPHONY_LOGE("SmsService::GetAllSimMessages interfaceManager nullptr error.");
548         return TELEPHONY_ERR_SLOTID_INVALID;
549     }
550     return interfaceManager->GetAllSimMessages(message);
551 }
552 
CheckSimMessageIndexValid(int32_t slotId,uint32_t msgIndex)553 bool SmsService::CheckSimMessageIndexValid(int32_t slotId, uint32_t msgIndex)
554 {
555     std::vector<ShortMessage> totalMessages;
556     int32_t result = GetAllSimMessages(slotId, totalMessages);
557     if (result != TELEPHONY_ERR_SUCCESS) {
558         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid get result fail");
559         return false;
560     }
561 
562     if (msgIndex < 0 || totalMessages.size() == 0) {
563         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid msgIndex error");
564         return false;
565     }
566     for (auto message : totalMessages) {
567         if (message.GetIndexOnSim() == static_cast<int32_t>(msgIndex)) {
568             return true;
569         }
570     }
571     TELEPHONY_LOGI("SmsService::CheckSimMessageIndexValid msgIndex not founded");
572     return false;
573 }
574 
SetCBConfig(int32_t slotId,bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)575 int32_t SmsService::SetCBConfig(int32_t slotId, bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
576 {
577     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
578         TELEPHONY_LOGE("Non-system applications use system APIs!");
579         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
580     }
581     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
582         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
583         return TELEPHONY_ERR_PERMISSION_ERR;
584     }
585 
586     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
587     if (interfaceManager == nullptr) {
588         TELEPHONY_LOGE("SmsService::SetCBConfig interfaceManager nullptr error.");
589         return TELEPHONY_ERR_SLOTID_INVALID;
590     }
591     return interfaceManager->SetCBConfig(enable, fromMsgId, toMsgId, netType);
592 }
593 
SetCBConfigList(int32_t slotId,const std::vector<int32_t> & messageIds,int32_t ranType)594 int32_t SmsService::SetCBConfigList(int32_t slotId, const std::vector<int32_t>& messageIds, int32_t ranType)
595 {
596     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
597         TELEPHONY_LOGE("Non-system applications use system APIs!");
598         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
599     }
600     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
601         TELEPHONY_LOGE("Check Permission Failed.");
602         return TELEPHONY_ERR_PERMISSION_ERR;
603     }
604     if (!IsValidCBRangeList(messageIds)) {
605         TELEPHONY_LOGE("CB parameter is invalid.");
606         return TELEPHONY_ERR_ARGUMENT_INVALID;
607     }
608     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
609     if (interfaceManager == nullptr) {
610         TELEPHONY_LOGE("InterfaceManager nullptr error.");
611         return TELEPHONY_ERR_SLOTID_INVALID;
612     }
613     return interfaceManager->SetCBConfigList(messageIds, ranType);
614 }
615 
IsValidCBRangeList(const std::vector<int32_t> & messageIds)616 bool SmsService::IsValidCBRangeList(const std::vector<int32_t>& messageIds)
617 {
618     if (messageIds.empty() || messageIds.size() % CB_RANGE_PAIR_SIZE != 0) {
619         return false;
620     }
621     for (size_t i = 0; i < messageIds.size(); i += CB_RANGE_PAIR_SIZE) {
622         if (i + 1 < messageIds.size() && messageIds[i + 1] < messageIds[i]) {
623             return false;
624         }
625     }
626     return true;
627 }
628 
SetImsSmsConfig(int32_t slotId,int32_t enable)629 bool SmsService::SetImsSmsConfig(int32_t slotId, int32_t enable)
630 {
631     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
632         TELEPHONY_LOGE("Check permission failed.");
633         return false;
634     }
635     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
636     if (interfaceManager == nullptr) {
637         TELEPHONY_LOGE("SmsService::SetImsSmsConfig interfaceManager nullptr error.");
638         return false;
639     }
640     return interfaceManager->SetImsSmsConfig(slotId, enable);
641 }
642 
SetDefaultSmsSlotId(int32_t slotId)643 int32_t SmsService::SetDefaultSmsSlotId(int32_t slotId)
644 {
645     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
646         TELEPHONY_LOGE("Non-system applications use system APIs!");
647         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
648     }
649     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
650         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
651         return TELEPHONY_ERR_PERMISSION_ERR;
652     }
653 
654     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
655     if (interfaceManager == nullptr) {
656         TELEPHONY_LOGE("SmsService::SetDefaultSmsSlotId interfaceManager nullptr error.");
657         return TELEPHONY_ERR_LOCAL_PTR_NULL;
658     }
659     return interfaceManager->SetDefaultSmsSlotId(slotId);
660 }
661 
GetDefaultSmsSlotId()662 int32_t SmsService::GetDefaultSmsSlotId()
663 {
664     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
665     if (interfaceManager == nullptr) {
666         TELEPHONY_LOGE("SmsService::GetDefaultSmsSlotId interfaceManager nullptr error.");
667         return TELEPHONY_ERROR;
668     }
669     return interfaceManager->GetDefaultSmsSlotId();
670 }
671 
GetDefaultSmsSimId(int32_t & simId)672 int32_t SmsService::GetDefaultSmsSimId(int32_t &simId)
673 {
674     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
675     if (interfaceManager == nullptr) {
676         TELEPHONY_LOGE("interfaceManager nullptr error.");
677         return TELEPHONY_ERROR;
678     }
679     return interfaceManager->GetDefaultSmsSimId(simId);
680 }
681 
SplitMessage(const std::u16string & message,std::vector<std::u16string> & splitMessage)682 int32_t SmsService::SplitMessage(const std::u16string &message, std::vector<std::u16string> &splitMessage)
683 {
684     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
685         TELEPHONY_LOGE("Non-system applications use system APIs!");
686         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
687     }
688     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
689         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
690         return TELEPHONY_ERR_PERMISSION_ERR;
691     }
692 
693     if (message.empty()) {
694         return TELEPHONY_ERR_ARGUMENT_INVALID;
695     }
696     int32_t slotId = GetDefaultSmsSlotId();
697     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
698     if (interfaceManager == nullptr) {
699         TELEPHONY_LOGE("SmsService::SplitMessage interfaceManager nullptr error.");
700         return TELEPHONY_ERR_SLOTID_INVALID;
701     }
702     std::string messageData = StringUtils::ToUtf8(message);
703     return interfaceManager->SplitMessage(messageData, splitMessage);
704 }
705 
GetSmsSegmentsInfo(int32_t slotId,const std::u16string & message,bool force7BitCode,ISmsServiceInterface::SmsSegmentsInfo & info)706 int32_t SmsService::GetSmsSegmentsInfo(
707     int32_t slotId, const std::u16string &message, bool force7BitCode, ISmsServiceInterface::SmsSegmentsInfo &info)
708 {
709     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
710         TELEPHONY_LOGE("Non-system applications use system APIs!");
711         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
712     }
713     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
714         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
715         return TELEPHONY_ERR_PERMISSION_ERR;
716     }
717     if (message.empty()) {
718         return TELEPHONY_ERR_ARGUMENT_NULL;
719     }
720     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
721     if (interfaceManager == nullptr) {
722         TELEPHONY_LOGE("GetSmsSegmentsInfo interfaceManager is nullptr error.");
723         return TELEPHONY_ERR_SLOTID_INVALID;
724     }
725     std::string messageData = StringUtils::ToUtf8(message);
726     LengthInfo result;
727     int32_t ret = interfaceManager->GetSmsSegmentsInfo(messageData, force7BitCode, result);
728     if (ret != TELEPHONY_ERR_SUCCESS) {
729         return ret;
730     }
731     info.msgSegCount = static_cast<int32_t>(result.msgSegCount);
732     info.msgEncodingCount = static_cast<int32_t>(result.msgEncodeCount);
733     info.msgRemainCount = static_cast<int32_t>(result.msgRemainCount);
734     SmsSegmentsInfo::SmsSegmentCodeScheme dcs = static_cast<SmsSegmentsInfo::SmsSegmentCodeScheme>(result.dcs);
735     switch (dcs) {
736         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_7BIT:
737         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_8BIT:
738         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_16BIT:
739             info.msgCodeScheme = dcs;
740             break;
741         default:
742             info.msgCodeScheme = SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_UNKNOWN;
743             break;
744     }
745     return TELEPHONY_ERR_SUCCESS;
746 }
747 
GetServiceRunningState()748 int32_t SmsService::GetServiceRunningState()
749 {
750     return static_cast<int32_t>(state_);
751 }
752 
GetEndTime()753 int64_t SmsService::GetEndTime()
754 {
755     return endTime_;
756 }
757 
ValidDestinationAddress(std::string desAddr)758 bool SmsService::ValidDestinationAddress(std::string desAddr)
759 {
760     // Allow address start with '+' and number, Address length range 3 to 20
761     std::regex regexMode("^([0-9_+]{1})([0-9]{2,19})$");
762     return std::regex_match(desAddr, regexMode);
763 }
764 
GetSpendTime()765 int64_t SmsService::GetSpendTime()
766 {
767     spendTime_ = endTime_ - bindTime_;
768     return spendTime_;
769 }
770 
CreateMessage(std::string pdu,std::string specification,ShortMessage & message)771 int32_t SmsService::CreateMessage(std::string pdu, std::string specification, ShortMessage &message)
772 {
773     std::shared_ptr<SmsBaseMessage> baseMessage;
774     if (specification == "3gpp") {
775         baseMessage = GsmSmsMessage::CreateMessage(pdu);
776     } else if (specification == "3gpp2") {
777         baseMessage = CdmaSmsMessage::CreateMessage(pdu);
778     }
779 
780     if (baseMessage == nullptr) {
781         return TELEPHONY_ERR_LOCAL_PTR_NULL;
782     }
783     message.visibleMessageBody_ = StringUtils::ToUtf16(baseMessage->GetVisibleMessageBody());
784     message.visibleRawAddress_ = StringUtils::ToUtf16(baseMessage->GetVisibleOriginatingAddress());
785     message.messageClass_ = static_cast<ShortMessage::SmsMessageClass>(baseMessage->GetMessageClass());
786     message.scAddress_ = StringUtils::ToUtf16(baseMessage->GetSmscAddr());
787     message.scTimestamp_ = baseMessage->GetScTimestamp();
788     message.isReplaceMessage_ = baseMessage->IsReplaceMessage();
789     message.status_ = baseMessage->GetStatus();
790     message.isSmsStatusReportMessage_ = baseMessage->IsSmsStatusReportMessage();
791     message.hasReplyPath_ = baseMessage->HasReplyPath();
792     message.protocolId_ = baseMessage->GetProtocolId();
793     message.pdu_ = baseMessage->GetRawPdu();
794     message.rawUserData_ = baseMessage->GetRawUserData();
795     return TELEPHONY_ERR_SUCCESS;
796 }
797 
GetBase64Encode(std::string src,std::string & dest)798 bool SmsService::GetBase64Encode(std::string src, std::string &dest)
799 {
800     auto results = Base64::Encode(std::vector<unsigned char>(src.begin(), src.end()));
801     if (results == nullptr) {
802         TELEPHONY_LOGE("Base64 encoding failed: nullptr returned");
803         return false;
804     }
805     dest = *results;
806     return true;
807 }
808 
GetBase64Decode(std::string src,std::string & dest)809 bool SmsService::GetBase64Decode(std::string src, std::string &dest)
810 {
811     auto results = Base64::Decode(src);
812     if (results == nullptr) {
813         TELEPHONY_LOGE("Base64 decoding failed: empty vector returned");
814         return false;
815     }
816     dest = std::string(results->begin(), results->end());
817     return true;
818 }
819 
GetEncodeStringFunc(std::string & encodeString,uint32_t charset,uint32_t valLength,std::string strEncodeString)820 bool SmsService::GetEncodeStringFunc(
821     std::string &encodeString, uint32_t charset, uint32_t valLength, std::string strEncodeString)
822 {
823     TextCoder::Instance().GetEncodeString(encodeString, charset, valLength, strEncodeString);
824     return true;
825 }
826 
SendMms(int32_t slotId,const std::u16string & mmsc,const std::u16string & data,const std::u16string & ua,const std::u16string & uaprof,int64_t & time,bool isMmsApp)827 int32_t SmsService::SendMms(int32_t slotId, const std::u16string &mmsc, const std::u16string &data,
828     const std::u16string &ua, const std::u16string &uaprof, int64_t &time, bool isMmsApp)
829 {
830     const int32_t permissionCheck = CheckMmsPermissions();
831     if (permissionCheck != TELEPHONY_ERR_SUCCESS) {
832         return permissionCheck;
833     }
834     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
835     if (interfaceManager == nullptr) {
836         TELEPHONY_LOGE("interfaceManager nullptr");
837         return TELEPHONY_ERR_SLOTID_INVALID;
838     }
839     if (mmsc.empty()) {
840         TELEPHONY_LOGE("mmsc URL is empty");
841         return TELEPHONY_ERR_ARGUMENT_INVALID;
842     }
843     if (data.empty()) {
844         TELEPHONY_LOGE("mms pdu file is empty");
845         return TELEPHONY_ERR_ARGUMENT_INVALID;
846     }
847     uint16_t dataBaseId = 0;
848     if (isMmsApp) {
849         dataBaseId = QueryMmsDatabaseId(slotId, time);
850     }
851     DataShare::DataShareValuesBucket sessionBucket;
852     int32_t ret = interfaceManager->SendMms(mmsc, data, ua, uaprof);
853     std::string  sendStatus = SmsMmsCommonData::SMS_MMS_INFO_MSG_STATE_FAILED;
854     if (ret == TELEPHONY_ERR_SUCCESS) {
855         sessionBucket.Put(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SUCCEED);
856         sendStatus = SmsMmsCommonData::SMS_MMS_INFO_MSG_STATE_SUCCEED;
857     } else {
858         sessionBucket.Put(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_FAILED);
859     }
860     if (isMmsApp) {
861         ServiceAfterSendMmsComplete(slotId, time, dataBaseId, sessionBucket, sendStatus);
862     }
863     return ret;
864 }
865 
CheckMmsPermissions()866 int32_t SmsService::CheckMmsPermissions()
867 {
868     if (SmsPolicyUtils::IsMmsPolicyDisable()) {
869         TELEPHONY_LOGE("mms policy is disabled");
870         return TELEPHONY_ERR_POLICY_DISABLED;
871     }
872     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
873         TELEPHONY_LOGE("Non-system applications use system APIs!");
874         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
875     }
876     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
877         TELEPHONY_LOGE("check permission failed");
878         return TELEPHONY_ERR_PERMISSION_ERR;
879     }
880     return TELEPHONY_ERR_SUCCESS;
881 }
882 
QueryMmsDatabaseId(int32_t slotId,int64_t time)883 uint16_t SmsService::QueryMmsDatabaseId(int32_t slotId, int64_t time)
884 {
885     DataShare::DataSharePredicates predicates;
886     predicates.EqualTo(SmsMmsInfo::MSG_TYPE, SmsMmsCommonData::SMS_MSM_TYPE_MMS);
887     predicates.EqualTo(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SENDING);
888     predicates.EqualTo(SmsMmsInfo::SLOT_ID, slotId);
889     predicates.LessThanOrEqualTo(SmsMmsInfo::START_TIME, time);
890     predicates.OrderByDesc(SmsMmsInfo::START_TIME);
891     uint16_t dataBaseId = 0;
892     DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySmsMmsForId(predicates, dataBaseId);
893     TELEPHONY_LOGI("slot:%{public}d;;time:%{public}s;id:%{public}d",
894         slotId, std::to_string(time).c_str(), dataBaseId);
895     return dataBaseId;
896 }
897 
ServiceAfterSendMmsComplete(int32_t slotId,int64_t & time,uint16_t & dataBaseId,DataShare::DataShareValuesBucket & sessionBucket,std::string & sendStatus)898 void SmsService::ServiceAfterSendMmsComplete(int32_t slotId, int64_t &time, uint16_t &dataBaseId,
899     DataShare::DataShareValuesBucket &sessionBucket, std::string  &sendStatus)
900 {
901     if (0 >= dataBaseId) {
902         TELEPHONY_LOGE("SmsService::SendMms. slot:%{public}d;time:%{public}s",
903             slotId, std::to_string(time).c_str());
904     } else {
905         DataShare::DataSharePredicates predicates;
906         predicates.EqualTo(SmsMmsInfo::MSG_ID, dataBaseId);
907         if (!DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateSms(predicates, sessionBucket)) {
908             TELEPHONY_LOGE("SmsService::SendMms. Failed UpdateSms;dataBaseId:%{public}d;",  dataBaseId);
909         }
910         TELEPHONY_LOGI("before send boradcast. SmsService::SendMms %{public}d", dataBaseId);
911         DelayedSingleton<SmsMmsCommon>::GetInstance()->SendBroadcast(dataBaseId,
912             SmsMmsCommonData::SMS_MMS_SENT_RESULT_NOTIFY, sendStatus,
913             SmsMmsCommonData::SMS_MMS_INFO_MMS_TYPE);
914     }
915     return;
916 }
917 
DownloadMms(int32_t slotId,const std::u16string & mmsc,std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)918 int32_t SmsService::DownloadMms(int32_t slotId, const std::u16string &mmsc, std::u16string &data,
919     const std::u16string &ua, const std::u16string &uaprof)
920 {
921     if (SmsPolicyUtils::IsMmsPolicyDisable()) {
922         TELEPHONY_LOGE("SmsService::DownloadMms mms policy is disable");
923         return TELEPHONY_ERR_POLICY_DISABLED;
924     }
925     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
926         TELEPHONY_LOGE("Non-system applications use system APIs!");
927         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
928     }
929     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MMS)) {
930         TELEPHONY_LOGE("check permission failed");
931         return TELEPHONY_ERR_PERMISSION_ERR;
932     }
933     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
934     if (interfaceManager == nullptr) {
935         TELEPHONY_LOGE("interfaceManager nullptr error");
936         return TELEPHONY_ERR_SLOTID_INVALID;
937     }
938     if (mmsc.empty()) {
939         TELEPHONY_LOGE("mmsc URL is empty");
940         return TELEPHONY_ERR_ARGUMENT_INVALID;
941     }
942     TELEPHONY_LOGI("download mms slotId:%{public}d", slotId);
943     int32_t ret = interfaceManager->DownloadMms(mmsc, data, ua, uaprof);
944     if (ret == TELEPHONY_ERR_SUCCESS) {
945         TELEPHONY_LOGI("down mms successed");
946         return TELEPHONY_ERR_SUCCESS;
947     } else {
948         TELEPHONY_LOGI("down mms failed");
949         return ret;
950     }
951 }
952 
OnRilAdapterHostDied(int32_t slotId)953 int32_t SmsService::OnRilAdapterHostDied(int32_t slotId)
954 {
955     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
956     if (interfaceManager == nullptr) {
957         TELEPHONY_LOGE("interfaceManager is nullptr error.");
958         return TELEPHONY_ERR_LOCAL_PTR_NULL;
959     }
960     interfaceManager->OnRilAdapterHostDied();
961     return TELEPHONY_ERR_SUCCESS;
962 }
963 
IsInfoMsg(const std::string & telephone)964 bool SmsService::IsInfoMsg(const std::string &telephone)
965 {
966     std::regex regex(INFO_MSG_TELEPHONE_REG);
967     return std::regex_match(telephone, regex);
968 }
969 
UpdatePredicatesByPhoneNum(DataShare::DataSharePredicates & predicates,const std::string & phoneNum)970 void SmsService::UpdatePredicatesByPhoneNum(DataShare::DataSharePredicates &predicates, const std::string &phoneNum)
971 {
972     // 如果尾数小于等于7位,直接全等对比;群聊也直接全等对比;通知消息也做全等对比
973     if (phoneNum.size() <= 7 || phoneNum.find(',') != std::string::npos || IsInfoMsg(phoneNum)) {
974         predicates.EqualTo(Session::TELEPHONE, phoneNum);
975     } else {
976         std::string formatNum;
977         auto persistHelper = DelayedSingleton<SmsPersistHelper>::GetInstance();
978         int32_t ret = persistHelper->FormatSmsNumber(
979             phoneNum, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::NATIONAL, formatNum);
980         if (ret != TELEPHONY_SUCCESS) {
981             ret = persistHelper->FormatSmsNumber(
982                 phoneNum, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::E164, formatNum);
983         }
984         if (ret != TELEPHONY_SUCCESS) {
985             formatNum = phoneNum;
986         }
987         // 增加contactsNum字段的判断,防止单聊通过endsWith匹配到群聊。
988         predicates.In(Session::CONTACTS_NUM, std::vector<string>({ "0", "1" }));
989         predicates.And();
990         predicates.EndsWith(Session::TELEPHONE, phoneNum);
991     }
992 }
993 } // namespace Telephony
994 } // namespace OHOS
995