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