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 "sms_dump_helper.h"
24 #include "sms_hisysevent.h"
25 #include "string_utils.h"
26 #include "telephony_common_utils.h"
27 #include "telephony_ext_wrapper.h"
28 #include "telephony_log_wrapper.h"
29 #include "telephony_permission.h"
30 #include "text_coder.h"
31 
32 namespace OHOS {
33 namespace Telephony {
34 using namespace std;
35 using namespace AppExecFwk;
36 using namespace HiviewDFX;
37 constexpr static uint32_t CONNECT_SERVICE_WAIT_TIME = 2000;
38 constexpr static size_t MIN_LEN = 1;
39 bool g_registerResult = SystemAbility::MakeAndRegisterAbility(DelayedSingleton<SmsService>::GetInstance().get());
40 
SmsService()41 SmsService::SmsService() : SystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID, true) {}
42 
~SmsService()43 SmsService::~SmsService() {}
44 
OnStart()45 void SmsService::OnStart()
46 {
47     TELEPHONY_LOGI("SmsService::OnStart start service Enter.");
48     bindTime_ =
49         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
50             .count();
51     if (state_ == ServiceRunningState::STATE_RUNNING) {
52         TELEPHONY_LOGE("msService has already started.");
53         return;
54     }
55     if (!Init()) {
56         TELEPHONY_LOGE("failed to init SmsService");
57         return;
58     }
59     state_ = ServiceRunningState::STATE_RUNNING;
60     endTime_ =
61         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
62             .count();
63     TELEPHONY_LOGI("SmsService::OnStart start service Exit.");
64 }
65 
Init()66 bool SmsService::Init()
67 {
68 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
69     TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
70 #endif
71     DelayedSingleton<ImsSmsClient>::GetInstance()->Init();
72     if (!registerToService_) {
73         bool ret = Publish(DelayedSingleton<SmsService>::GetInstance().get());
74         if (!ret) {
75             TELEPHONY_LOGE("SmsService::Init Publish failed!");
76             return false;
77         }
78         registerToService_ = true;
79         WaitCoreServiceToInit();
80     }
81     DelayedSingleton<SmsStateHandler>::GetInstance()->Init();
82     return true;
83 }
84 
OnStop()85 void SmsService::OnStop()
86 {
87     state_ = ServiceRunningState::STATE_NOT_START;
88     registerToService_ = false;
89     DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
90     DelayedSingleton<SmsStateHandler>::GetInstance()->UnInit();
91     TELEPHONY_LOGI("SmsService::OnStop stop service.");
92 }
93 
Dump(std::int32_t fd,const std::vector<std::u16string> & args)94 int32_t SmsService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
95 {
96     if (fd < 0) {
97         TELEPHONY_LOGE("dump fd invalid");
98         return TELEPHONY_ERR_FAIL;
99     }
100     std::vector<std::string> argsInStr;
101     for (const auto &arg : args) {
102         TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
103         argsInStr.emplace_back(Str16ToStr8(arg));
104     }
105     std::string result;
106     SmsDumpHelper dumpHelper;
107     if (dumpHelper.Dump(argsInStr, result)) {
108         TELEPHONY_LOGI("%{public}s", result.c_str());
109         std::int32_t ret = dprintf(fd, "%s", result.c_str());
110         if (ret < 0) {
111             TELEPHONY_LOGE("dprintf to dump fd failed");
112             return TELEPHONY_ERR_FAIL;
113         }
114         return TELEPHONY_SUCCESS;
115     }
116     TELEPHONY_LOGW("dumpHelper failed");
117     return TELEPHONY_ERR_FAIL;
118 }
119 
WaitCoreServiceToInit()120 void SmsService::WaitCoreServiceToInit()
121 {
122     TelFFRTUtils::Submit([&]() {
123         while (true) {
124             if (CoreManagerInner::GetInstance().IsInitFinished()) {
125                 InitModule();
126                 TELEPHONY_LOGI("SmsService Connection successful");
127                 break;
128             }
129             TelFFRTUtils::SleepFor(CONNECT_SERVICE_WAIT_TIME);
130         }
131     });
132 }
133 
GetBindTime()134 std::string SmsService::GetBindTime()
135 {
136     return std::to_string(bindTime_);
137 }
138 
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)139 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, const u16string text,
140     const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
141 {
142     if (!CheckSmsPermission(sendCallback)) {
143         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
144             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
145         return TELEPHONY_ERR_PERMISSION_ERR;
146     }
147     if (desAddr.empty()) {
148         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
149         TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
150         return TELEPHONY_ERR_ARGUMENT_INVALID;
151     }
152     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
153     if (interfaceManager == nullptr) {
154         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
155         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
156             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms interfaceManager is nullptr");
157         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
158         return TELEPHONY_ERR_LOCAL_PTR_NULL;
159     }
160     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
161         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
162         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
163         return TELEPHONY_ERR_ARGUMENT_INVALID;
164     }
165     bool ret = interfaceManager->TextBasedSmsDelivery(StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr),
166         StringUtils::ToUtf8(text), sendCallback, deliveryCallback);
167     DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
168     return ret;
169 }
170 
InsertSessionAndDetail(int32_t slotId,const std::string & telephone,const std::string & text)171 void SmsService::InsertSessionAndDetail(int32_t slotId, const std::string &telephone, const std::string &text)
172 {
173     uint16_t sessionId = 0;
174     uint16_t messageCount = 0;
175     bool ret = QuerySessionByTelephone(telephone, sessionId, messageCount);
176     if (ret) {
177         InsertSmsMmsInfo(slotId, sessionId, telephone, text);
178         messageCount++;
179         InsertSession(false, messageCount, telephone, text);
180     } else {
181         ret = InsertSession(true, 0, telephone, text);
182         if (ret) {
183             QuerySessionByTelephone(telephone, sessionId, messageCount);
184             InsertSmsMmsInfo(slotId, sessionId, telephone, text);
185         }
186     }
187 }
188 
QuerySessionByTelephone(const std::string & telephone,uint16_t & sessionId,uint16_t & messageCount)189 bool SmsService::QuerySessionByTelephone(const std::string &telephone, uint16_t &sessionId, uint16_t &messageCount)
190 {
191     DataShare::DataSharePredicates predicates;
192     predicates.EqualTo(Session::TELEPHONE, telephone);
193     return DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySession(predicates, sessionId, messageCount);
194 }
195 
InsertSmsMmsInfo(int32_t slotId,uint16_t sessionId,const std::string & number,const std::string & text)196 void SmsService::InsertSmsMmsInfo(
197     int32_t slotId, uint16_t sessionId, const std::string &number, const std::string &text)
198 {
199     DataShare::DataSharePredicates predicates;
200     uint16_t maxGroupId = 0;
201     DelayedSingleton<SmsPersistHelper>::GetInstance()->QueryMaxGroupId(predicates, maxGroupId);
202     auto now = std::chrono::system_clock::now();
203     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
204     DataShare::DataShareValuesBucket smsMmsInfoBucket;
205     smsMmsInfoBucket.Put(SmsMmsInfo::SLOT_ID, std::to_string(slotId));
206     smsMmsInfoBucket.Put(SmsMmsInfo::RECEIVER_NUMBER, number);
207     smsMmsInfoBucket.Put(SmsMmsInfo::SENDER_NUMBER, "");
208     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SENDER, "0");
209     smsMmsInfoBucket.Put(SmsMmsInfo::START_TIME, std::to_string(duration.count()));
210     smsMmsInfoBucket.Put(SmsMmsInfo::END_TIME, std::to_string(duration.count()));
211     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TYPE, "0");
212     smsMmsInfoBucket.Put(SmsMmsInfo::SMS_TYPE, "0");
213     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TITLE, text);
214     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CONTENT, text);
215     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_STATE, "0");
216     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CODE, "");
217     smsMmsInfoBucket.Put(SmsMmsInfo::IS_LOCK, "0");
218     smsMmsInfoBucket.Put(SmsMmsInfo::IS_READ, "1");
219     smsMmsInfoBucket.Put(SmsMmsInfo::IS_COLLECT, "0");
220     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_TYPE, "0");
221     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_ID, std::to_string(sessionId));
222     smsMmsInfoBucket.Put(SmsMmsInfo::GROUP_ID, std::to_string(maxGroupId + 1));
223     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SUBSECTION, "0");
224     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SEND_REPORT, "0");
225     DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_MMS_INFO, smsMmsInfoBucket);
226 }
227 
InsertSession(bool isNewSession,uint16_t messageCount,const std::string & number,const std::string & text)228 bool SmsService::InsertSession(
229     bool isNewSession, uint16_t messageCount, const std::string &number, const std::string &text)
230 {
231     auto now = std::chrono::system_clock::now();
232     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
233     DataShare::DataShareValuesBucket sessionBucket;
234     sessionBucket.Put(Session::TIME, std::to_string(duration.count()));
235     sessionBucket.Put(Session::TELEPHONE, number);
236     sessionBucket.Put(Session::CONTENT, text);
237     sessionBucket.Put(Session::CONTACTS_NUM, "1");
238     sessionBucket.Put(Session::SMS_TYPE, "0");
239     sessionBucket.Put(Session::UNREAD_COUNT, "0");
240     sessionBucket.Put(Session::SENDING_STATUS, "0");
241     sessionBucket.Put(Session::HAS_DRAFT, "0");
242     sessionBucket.Put(Session::HAS_LOCK, "0");
243     sessionBucket.Put(Session::HAS_MMS, "0");
244     sessionBucket.Put(Session::HAS_ATTACHMENT, "0");
245     if (!isNewSession) {
246         sessionBucket.Put(Session::MESSAGE_COUNT, std::to_string(messageCount));
247         DataShare::DataSharePredicates predicates;
248         predicates.EqualTo(Session::TELEPHONE, number);
249         return DelayedSingleton<SmsPersistHelper>::GetInstance()->Update(predicates, sessionBucket);
250     }
251     sessionBucket.Put(Session::MESSAGE_COUNT, "1");
252     return DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_SESSION, sessionBucket);
253 }
254 
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)255 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, uint16_t port,
256     const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
257     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
258 {
259     if (!CheckSmsPermission(sendCallback)) {
260         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
261             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
262         return TELEPHONY_ERR_PERMISSION_ERR;
263     }
264     if (desAddr.empty()) {
265         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
266         TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
267         return TELEPHONY_ERR_ARGUMENT_INVALID;
268     }
269     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
270     if (interfaceManager == nullptr) {
271         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
272         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
273         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
274             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "data sms interfaceManager is nullptr");
275         return TELEPHONY_ERR_LOCAL_PTR_NULL;
276     }
277     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
278         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
279         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
280         return TELEPHONY_ERR_ARGUMENT_INVALID;
281     }
282     bool ret = interfaceManager->DataBasedSmsDelivery(
283         StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr), port, data, dataLen, sendCallback, deliveryCallback);
284     DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
285     return ret;
286 }
287 
CheckSmsPermission(const sptr<ISendShortMessageCallback> & sendCallback)288 bool SmsService::CheckSmsPermission(const sptr<ISendShortMessageCallback> &sendCallback)
289 {
290     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
291         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
292         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
293         return false;
294     }
295     return true;
296 }
297 
IsImsSmsSupported(int32_t slotId,bool & isSupported)298 int32_t SmsService::IsImsSmsSupported(int32_t slotId, bool &isSupported)
299 {
300     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
301         TELEPHONY_LOGE("Non-system applications use system APIs!");
302         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
303     }
304     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
305     if (interfaceManager == nullptr) {
306         TELEPHONY_LOGE("interfaceManager is nullptr.");
307         return TELEPHONY_ERR_SLOTID_INVALID;
308     }
309     return interfaceManager->IsImsSmsSupported(slotId, isSupported);
310 }
311 
GetImsShortMessageFormat(std::u16string & format)312 int32_t SmsService::GetImsShortMessageFormat(std::u16string &format)
313 {
314     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
315         TELEPHONY_LOGE("Non-system applications use system APIs!");
316         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
317     }
318     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
319         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
320         return TELEPHONY_ERR_PERMISSION_ERR;
321     }
322     int32_t slotId = GetDefaultSmsSlotId();
323     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
324     if (interfaceManager == nullptr) {
325         TELEPHONY_LOGE("interfaceManager is nullptr error.");
326         return TELEPHONY_ERR_SLOTID_INVALID;
327     }
328     return interfaceManager->GetImsShortMessageFormat(format);
329 }
330 
HasSmsCapability()331 bool SmsService::HasSmsCapability()
332 {
333     int32_t slotId = GetDefaultSmsSlotId();
334     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
335     if (interfaceManager == nullptr) {
336         TELEPHONY_LOGE("Get SmsInterfaceManager is nullptr error.");
337         return true;
338     }
339     return interfaceManager->HasSmsCapability();
340 }
341 
SetSmscAddr(int32_t slotId,const std::u16string & scAddr)342 int32_t SmsService::SetSmscAddr(int32_t slotId, const std::u16string &scAddr)
343 {
344     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
345         TELEPHONY_LOGE("Non-system applications use system APIs!");
346         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
347     }
348     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
349         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
350         return TELEPHONY_ERR_PERMISSION_ERR;
351     }
352 
353     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
354     if (interfaceManager == nullptr) {
355         TELEPHONY_LOGE("interfaceManager is nullptr error.");
356         return TELEPHONY_ERR_SLOTID_INVALID;
357     }
358     string sca = StringUtils::ToUtf8(scAddr);
359     TrimSmscAddr(sca);
360     if (sca.empty() || sca.length() == 0) {
361         TELEPHONY_LOGE("sca is empty");
362         return TELEPHONY_ERR_ARGUMENT_NULL;
363     }
364     return interfaceManager->SetSmscAddr(sca);
365 }
366 
TrimSmscAddr(std::string & sca)367 void SmsService::TrimSmscAddr(std::string &sca)
368 {
369     if (sca.length() < MIN_LEN) {
370         return;
371     }
372     while (sca.length() >= MIN_LEN && sca[0] == ' ') {
373         sca.erase(0, 1);
374     }
375     while (sca.length() > MIN_LEN && sca[sca.length() - 1] == ' ') {
376         sca.erase(sca.length() - 1, 1);
377     }
378 }
379 
GetSmscAddr(int32_t slotId,std::u16string & smscAddress)380 int32_t SmsService::GetSmscAddr(int32_t slotId, std::u16string &smscAddress)
381 {
382     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
383         TELEPHONY_LOGE("Non-system applications use system APIs!");
384         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
385     }
386     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
387         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
388         return TELEPHONY_ERR_PERMISSION_ERR;
389     }
390 
391     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
392     if (interfaceManager == nullptr) {
393         TELEPHONY_LOGE("SmsService::GetSmscAddr interfaceManager nullptr error");
394         return TELEPHONY_ERR_SLOTID_INVALID;
395     }
396     return interfaceManager->GetSmscAddr(smscAddress);
397 }
398 
AddSimMessage(int32_t slotId,const std::u16string & smsc,const std::u16string & pdu,SimMessageStatus status)399 int32_t SmsService::AddSimMessage(
400     int32_t slotId, const std::u16string &smsc, const std::u16string &pdu, SimMessageStatus status)
401 {
402     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
403         TELEPHONY_LOGE("Non-system applications use system APIs!");
404         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
405     }
406     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
407         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
408         return TELEPHONY_ERR_PERMISSION_ERR;
409     }
410     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
411         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
412         return TELEPHONY_ERR_PERMISSION_ERR;
413     }
414 
415     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
416     if (interfaceManager == nullptr) {
417         TELEPHONY_LOGE("SmsService::AddSimMessage interfaceManager nullptr error");
418         return TELEPHONY_ERR_SLOTID_INVALID;
419     }
420     std::string smscData = StringUtils::ToUtf8(smsc);
421     std::string pduData = StringUtils::ToUtf8(pdu);
422     if (pdu.empty() || pduData.empty()) {
423         TELEPHONY_LOGE("SmsService::AddSimMessage pdu empty error");
424         return TELEPHONY_ERR_ARGUMENT_INVALID;
425     }
426     return interfaceManager->AddSimMessage(smscData, pduData, status);
427 }
428 
DelSimMessage(int32_t slotId,uint32_t msgIndex)429 int32_t SmsService::DelSimMessage(int32_t slotId, uint32_t msgIndex)
430 {
431     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
432         TELEPHONY_LOGE("Non-system applications use system APIs!");
433         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
434     }
435     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
436         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
437         return TELEPHONY_ERR_PERMISSION_ERR;
438     }
439     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
440         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
441         return TELEPHONY_ERR_PERMISSION_ERR;
442     }
443 
444     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
445     if (interfaceManager == nullptr) {
446         TELEPHONY_LOGE("SmsService::DelSimMessage interfaceManager nullptr error.");
447         return TELEPHONY_ERR_SLOTID_INVALID;
448     }
449     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
450         TELEPHONY_LOGE("SmsService::DelSimMessage msgIndex inValid");
451         return TELEPHONY_ERR_ARGUMENT_INVALID;
452     }
453 
454     return interfaceManager->DelSimMessage(msgIndex);
455 }
456 
UpdateSimMessage(int32_t slotId,uint32_t msgIndex,SimMessageStatus newStatus,const std::u16string & pdu,const std::u16string & smsc)457 int32_t SmsService::UpdateSimMessage(int32_t slotId, uint32_t msgIndex, SimMessageStatus newStatus,
458     const std::u16string &pdu, const std::u16string &smsc)
459 {
460     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
461         TELEPHONY_LOGE("Non-system applications use system APIs!");
462         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
463     }
464     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
465         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
466         return TELEPHONY_ERR_PERMISSION_ERR;
467     }
468     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
469         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
470         return TELEPHONY_ERR_PERMISSION_ERR;
471     }
472 
473     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
474     if (interfaceManager == nullptr) {
475         TELEPHONY_LOGE("SmsService::UpdateSimMessage interfaceManager nullptr error.");
476         return TELEPHONY_ERR_SLOTID_INVALID;
477     }
478     std::string pduData = StringUtils::ToUtf8(pdu);
479     std::string smscData = StringUtils::ToUtf8(smsc);
480     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
481         TELEPHONY_LOGE("SmsService::UpdateSimMessage msgIndex inValid");
482         return TELEPHONY_ERR_ARGUMENT_INVALID;
483     }
484     if (pdu.empty() || pduData.empty()) {
485         TELEPHONY_LOGE("SmsService::UpdateSimMessage pdu empty error");
486         return TELEPHONY_ERR_ARGUMENT_INVALID;
487     }
488     return interfaceManager->UpdateSimMessage(msgIndex, newStatus, pduData, smscData);
489 }
490 
GetAllSimMessages(int32_t slotId,std::vector<ShortMessage> & message)491 int32_t SmsService::GetAllSimMessages(int32_t slotId, std::vector<ShortMessage> &message)
492 {
493     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
494         TELEPHONY_LOGE("Non-system applications use system APIs!");
495         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
496     }
497     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
498         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
499         return TELEPHONY_ERR_PERMISSION_ERR;
500     }
501 
502     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
503     if (interfaceManager == nullptr) {
504         TELEPHONY_LOGE("SmsService::GetAllSimMessages interfaceManager nullptr error.");
505         return TELEPHONY_ERR_SLOTID_INVALID;
506     }
507     return interfaceManager->GetAllSimMessages(message);
508 }
509 
CheckSimMessageIndexValid(int32_t slotId,uint32_t msgIndex)510 bool SmsService::CheckSimMessageIndexValid(int32_t slotId, uint32_t msgIndex)
511 {
512     std::vector<ShortMessage> totalMessages;
513     int32_t result = GetAllSimMessages(slotId, totalMessages);
514     if (result != TELEPHONY_ERR_SUCCESS) {
515         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid get result fail");
516         return false;
517     }
518 
519     if (msgIndex < 0 || totalMessages.size() == 0) {
520         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid msgIndex error");
521         return false;
522     }
523     for (auto message : totalMessages) {
524         if (message.GetIndexOnSim() == static_cast<int32_t>(msgIndex)) {
525             return true;
526         }
527     }
528     TELEPHONY_LOGI("SmsService::CheckSimMessageIndexValid msgIndex not founded");
529     return false;
530 }
531 
SetCBConfig(int32_t slotId,bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)532 int32_t SmsService::SetCBConfig(int32_t slotId, bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
533 {
534     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
535         TELEPHONY_LOGE("Non-system applications use system APIs!");
536         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
537     }
538     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
539         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
540         return TELEPHONY_ERR_PERMISSION_ERR;
541     }
542 
543     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
544     if (interfaceManager == nullptr) {
545         TELEPHONY_LOGE("SmsService::SetCBConfig interfaceManager nullptr error.");
546         return TELEPHONY_ERR_SLOTID_INVALID;
547     }
548     return interfaceManager->SetCBConfig(enable, fromMsgId, toMsgId, netType);
549 }
550 
SetImsSmsConfig(int32_t slotId,int32_t enable)551 bool SmsService::SetImsSmsConfig(int32_t slotId, int32_t enable)
552 {
553     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
554         TELEPHONY_LOGE("Check permission failed.");
555         return false;
556     }
557     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
558     if (interfaceManager == nullptr) {
559         TELEPHONY_LOGE("SmsService::SetImsSmsConfig interfaceManager nullptr error.");
560         return false;
561     }
562     return interfaceManager->SetImsSmsConfig(slotId, enable);
563 }
564 
SetDefaultSmsSlotId(int32_t slotId)565 int32_t SmsService::SetDefaultSmsSlotId(int32_t slotId)
566 {
567     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
568         TELEPHONY_LOGE("Non-system applications use system APIs!");
569         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
570     }
571     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
572         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
573         return TELEPHONY_ERR_PERMISSION_ERR;
574     }
575 
576     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
577     if (interfaceManager == nullptr) {
578         TELEPHONY_LOGE("SmsService::SetDefaultSmsSlotId interfaceManager nullptr error.");
579         return TELEPHONY_ERR_LOCAL_PTR_NULL;
580     }
581     return interfaceManager->SetDefaultSmsSlotId(slotId);
582 }
583 
GetDefaultSmsSlotId()584 int32_t SmsService::GetDefaultSmsSlotId()
585 {
586     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
587     if (interfaceManager == nullptr) {
588         TELEPHONY_LOGE("SmsService::GetDefaultSmsSlotId interfaceManager nullptr error.");
589         return TELEPHONY_ERROR;
590     }
591     return interfaceManager->GetDefaultSmsSlotId();
592 }
593 
GetDefaultSmsSimId(int32_t & simId)594 int32_t SmsService::GetDefaultSmsSimId(int32_t &simId)
595 {
596     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
597     if (interfaceManager == nullptr) {
598         TELEPHONY_LOGE("interfaceManager nullptr error.");
599         return TELEPHONY_ERROR;
600     }
601     return interfaceManager->GetDefaultSmsSimId(simId);
602 }
603 
SplitMessage(const std::u16string & message,std::vector<std::u16string> & splitMessage)604 int32_t SmsService::SplitMessage(const std::u16string &message, std::vector<std::u16string> &splitMessage)
605 {
606     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
607         TELEPHONY_LOGE("Non-system applications use system APIs!");
608         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
609     }
610     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
611         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
612         return TELEPHONY_ERR_PERMISSION_ERR;
613     }
614 
615     if (message.empty()) {
616         return TELEPHONY_ERR_ARGUMENT_INVALID;
617     }
618     int32_t slotId = GetDefaultSmsSlotId();
619     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
620     if (interfaceManager == nullptr) {
621         TELEPHONY_LOGE("SmsService::SplitMessage interfaceManager nullptr error.");
622         return TELEPHONY_ERR_SLOTID_INVALID;
623     }
624     std::string messageData = StringUtils::ToUtf8(message);
625     return interfaceManager->SplitMessage(messageData, splitMessage);
626 }
627 
GetSmsSegmentsInfo(int32_t slotId,const std::u16string & message,bool force7BitCode,ISmsServiceInterface::SmsSegmentsInfo & info)628 int32_t SmsService::GetSmsSegmentsInfo(
629     int32_t slotId, const std::u16string &message, bool force7BitCode, ISmsServiceInterface::SmsSegmentsInfo &info)
630 {
631     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
632         TELEPHONY_LOGE("Non-system applications use system APIs!");
633         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
634     }
635     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
636         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
637         return TELEPHONY_ERR_PERMISSION_ERR;
638     }
639     if (message.empty()) {
640         return TELEPHONY_ERR_ARGUMENT_NULL;
641     }
642     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
643     if (interfaceManager == nullptr) {
644         TELEPHONY_LOGE("GetSmsSegmentsInfo interfaceManager is nullptr error.");
645         return TELEPHONY_ERR_SLOTID_INVALID;
646     }
647     std::string messageData = StringUtils::ToUtf8(message);
648     LengthInfo result;
649     int32_t ret = interfaceManager->GetSmsSegmentsInfo(messageData, force7BitCode, result);
650     if (ret != TELEPHONY_ERR_SUCCESS) {
651         return ret;
652     }
653     info.msgSegCount = static_cast<int32_t>(result.msgSegCount);
654     info.msgEncodingCount = static_cast<int32_t>(result.msgEncodeCount);
655     info.msgRemainCount = static_cast<int32_t>(result.msgRemainCount);
656     SmsSegmentsInfo::SmsSegmentCodeScheme dcs = static_cast<SmsSegmentsInfo::SmsSegmentCodeScheme>(result.dcs);
657     switch (dcs) {
658         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_7BIT:
659         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_8BIT:
660         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_16BIT:
661             info.msgCodeScheme = dcs;
662             break;
663         default:
664             info.msgCodeScheme = SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_UNKNOWN;
665             break;
666     }
667     return TELEPHONY_ERR_SUCCESS;
668 }
669 
GetServiceRunningState()670 int32_t SmsService::GetServiceRunningState()
671 {
672     return static_cast<int32_t>(state_);
673 }
674 
GetEndTime()675 int64_t SmsService::GetEndTime()
676 {
677     return endTime_;
678 }
679 
ValidDestinationAddress(std::string desAddr)680 bool SmsService::ValidDestinationAddress(std::string desAddr)
681 {
682     // Allow address start with '+' and number, Address length range 3 to 20
683     std::regex regexMode("^([0-9_+]{1})([0-9]{2,19})$");
684     return std::regex_match(desAddr, regexMode);
685 }
686 
GetSpendTime()687 int64_t SmsService::GetSpendTime()
688 {
689     spendTime_ = endTime_ - bindTime_;
690     return spendTime_;
691 }
692 
CreateMessage(std::string pdu,std::string specification,ShortMessage & message)693 int32_t SmsService::CreateMessage(std::string pdu, std::string specification, ShortMessage &message)
694 {
695     std::shared_ptr<SmsBaseMessage> baseMessage;
696     if (specification == "3gpp") {
697         baseMessage = GsmSmsMessage::CreateMessage(pdu);
698     } else if (specification == "3gpp2") {
699         baseMessage = CdmaSmsMessage::CreateMessage(pdu);
700     }
701 
702     if (baseMessage == nullptr) {
703         return TELEPHONY_ERR_LOCAL_PTR_NULL;
704     }
705     message.visibleMessageBody_ = StringUtils::ToUtf16(baseMessage->GetVisibleMessageBody());
706     message.visibleRawAddress_ = StringUtils::ToUtf16(baseMessage->GetVisibleOriginatingAddress());
707     message.messageClass_ = static_cast<ShortMessage::SmsMessageClass>(baseMessage->GetMessageClass());
708     message.scAddress_ = StringUtils::ToUtf16(baseMessage->GetSmscAddr());
709     message.scTimestamp_ = baseMessage->GetScTimestamp();
710     message.isReplaceMessage_ = baseMessage->IsReplaceMessage();
711     message.status_ = baseMessage->GetStatus();
712     message.isSmsStatusReportMessage_ = baseMessage->IsSmsStatusReportMessage();
713     message.hasReplyPath_ = baseMessage->HasReplyPath();
714     message.protocolId_ = baseMessage->GetProtocolId();
715     message.pdu_ = baseMessage->GetRawPdu();
716     message.rawUserData_ = baseMessage->GetRawUserData();
717     return TELEPHONY_ERR_SUCCESS;
718 }
719 
GetBase64Encode(std::string src,std::string & dest)720 bool SmsService::GetBase64Encode(std::string src, std::string &dest)
721 {
722     TextCoder::Instance().Base64Encode(src, dest);
723     return true;
724 }
725 
GetBase64Decode(std::string src,std::string & dest)726 bool SmsService::GetBase64Decode(std::string src, std::string &dest)
727 {
728     TextCoder::Instance().Base64Decode(src, dest);
729     return true;
730 }
731 
GetEncodeStringFunc(std::string & encodeString,uint32_t charset,uint32_t valLength,std::string strEncodeString)732 bool SmsService::GetEncodeStringFunc(
733     std::string &encodeString, uint32_t charset, uint32_t valLength, std::string strEncodeString)
734 {
735     TextCoder::Instance().GetEncodeString(encodeString, charset, valLength, strEncodeString);
736     return true;
737 }
738 
SendMms(int32_t slotId,const std::u16string & mmsc,const std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)739 int32_t SmsService::SendMms(int32_t slotId, const std::u16string &mmsc, const std::u16string &data,
740     const std::u16string &ua, const std::u16string &uaprof)
741 {
742     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
743         TELEPHONY_LOGE("Non-system applications use system APIs!");
744         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
745     }
746     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
747         TELEPHONY_LOGE("check permission failed");
748         return TELEPHONY_ERR_PERMISSION_ERR;
749     }
750     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
751     if (interfaceManager == nullptr) {
752         TELEPHONY_LOGE("interfaceManager nullptr");
753         return TELEPHONY_ERR_SLOTID_INVALID;
754     }
755     if (mmsc.empty()) {
756         TELEPHONY_LOGE("mmsc URL is empty");
757         return TELEPHONY_ERR_ARGUMENT_INVALID;
758     }
759     if (data.empty()) {
760         TELEPHONY_LOGE("mms pdu file is empty");
761         return TELEPHONY_ERR_ARGUMENT_INVALID;
762     }
763     TELEPHONY_LOGI("send mms slotId:%{public}d", slotId);
764     int32_t ret = interfaceManager->SendMms(mmsc, data, ua, uaprof);
765     if (ret == TELEPHONY_ERR_SUCCESS) {
766         TELEPHONY_LOGI("send mms successed");
767         return TELEPHONY_ERR_SUCCESS;
768     } else {
769         TELEPHONY_LOGI("send mms failed");
770         return ret;
771     }
772 }
773 
DownloadMms(int32_t slotId,const std::u16string & mmsc,std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)774 int32_t SmsService::DownloadMms(int32_t slotId, const std::u16string &mmsc, std::u16string &data,
775     const std::u16string &ua, const std::u16string &uaprof)
776 {
777     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
778         TELEPHONY_LOGE("Non-system applications use system APIs!");
779         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
780     }
781     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MMS)) {
782         TELEPHONY_LOGE("check permission failed");
783         return TELEPHONY_ERR_PERMISSION_ERR;
784     }
785     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
786     if (interfaceManager == nullptr) {
787         TELEPHONY_LOGE("interfaceManager nullptr error");
788         return TELEPHONY_ERR_SLOTID_INVALID;
789     }
790     if (mmsc.empty()) {
791         TELEPHONY_LOGE("mmsc URL is empty");
792         return TELEPHONY_ERR_ARGUMENT_INVALID;
793     }
794     TELEPHONY_LOGI("download mms slotId:%{public}d", slotId);
795     int32_t ret = interfaceManager->DownloadMms(mmsc, data, ua, uaprof);
796     if (ret == TELEPHONY_ERR_SUCCESS) {
797         TELEPHONY_LOGI("down mms successed");
798         return TELEPHONY_ERR_SUCCESS;
799     } else {
800         TELEPHONY_LOGI("down mms failed");
801         return ret;
802     }
803 }
804 
OnRilAdapterHostDied(int32_t slotId)805 int32_t SmsService::OnRilAdapterHostDied(int32_t slotId)
806 {
807     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
808     if (interfaceManager == nullptr) {
809         TELEPHONY_LOGE("interfaceManager is nullptr error.");
810         return TELEPHONY_ERR_LOCAL_PTR_NULL;
811     }
812     interfaceManager->OnRilAdapterHostDied();
813     return TELEPHONY_ERR_SUCCESS;
814 }
815 } // namespace Telephony
816 } // namespace OHOS
817