diff --git a/services/ans/BUILD.gn b/services/ans/BUILD.gn index 49a5d0da6a3677df363d595f87e90e4c9936cb3d..42dee72c2602a807eded0aac273d93f4c7824653 100644 --- a/services/ans/BUILD.gn +++ b/services/ans/BUILD.gn @@ -126,6 +126,7 @@ ohos_shared_library("libans") { "common_event_service:cesfwk_innerkits", "data_share:datashare_common", "data_share:datashare_consumer", + "data_share:datashare_permission", "device_manager:devicemanagersdk", "ffrt:libffrt", "i18n:intl_util", diff --git a/services/ans/include/reminder_data_manager.h b/services/ans/include/reminder_data_manager.h index 25ebcd8e80e30bf743165ed9c0755a4bae35f387..9d8118abcb57c344a43baa77b67f651ef9b9fc00 100644 --- a/services/ans/include/reminder_data_manager.h +++ b/services/ans/include/reminder_data_manager.h @@ -578,6 +578,9 @@ private: void CheckNeedNotifyStatus(const sptr &reminder, const ReminderRequest::ActionButtonType buttonType); + bool IsActionButtonDataShareValid(const sptr& reminder, + const uint32_t callerTokenId); + /** * Single instance. */ diff --git a/services/ans/src/reminder_data_manager.cpp b/services/ans/src/reminder_data_manager.cpp index 8c1561f07903a82dc87724be25e1bf4bf8b44a9d..6153bbda94c50fe2b455a4a8d8f25f41dd8e6f86 100644 --- a/services/ans/src/reminder_data_manager.cpp +++ b/services/ans/src/reminder_data_manager.cpp @@ -37,6 +37,8 @@ #include "bundle_manager_helper.h" #include "datashare_predicates_object.h" #include "datashare_value_object.h" +#include "data_share_permission.h" +#include "datashare_errno.h" #include "datashare_helper.h" #include "datashare_template.h" #include "system_ability_definition.h" @@ -79,6 +81,16 @@ ReminderDataManager::~ReminderDataManager() = default; ErrCode ReminderDataManager::PublishReminder(const sptr &reminder, const sptr &bundleOption) { + uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID(); + if (callerTokenId == 0) { + ANSR_LOGE("pushlish failed, callerTokenId is 0"); + return ERR_REMINDER_INVALID_PARAM; + } + + if (!IsActionButtonDataShareValid(reminder, callerTokenId)) { + return ERR_REMINDER_INVALID_PARAM; + } + if (CheckReminderLimitExceededLocked(bundleOption, reminder)) { return ERR_REMINDER_NUMBER_OVERLOAD; } @@ -1968,5 +1980,25 @@ void ReminderDataManager::CheckNeedNotifyStatus(const sptr &rem break; } } + +bool ReminderDataManager::IsActionButtonDataShareValid(const sptr& reminder, + const uint32_t callerTokenId) +{ + auto actionButtonMap = reminder->GetActionButtons(); + for (auto it = actionButtonMap.begin(); it != actionButtonMap.end(); ++it) { + ReminderRequest::ActionButtonInfo buttonInfo = it->second; + if (buttonInfo.dataShareUpdate->uri.empty()) { + continue; + } + Uri uri(buttonInfo.dataShareUpdate->uri); + if (DataShare::DataSharePermission::VerifyPermission(callerTokenId, uri, false) != DataShare::E_OK) { + ANSR_LOGE("publish failed, DataSharePermission::VerifyPermission return error," + " callerTokenId is %{public}d, uri is %{public}s", + callerTokenId, buttonInfo.dataShareUpdate->uri.c_str()); + return false; + } + } + return true; +} } } diff --git a/services/ans/test/unittest/reminder_data_manager_test.cpp b/services/ans/test/unittest/reminder_data_manager_test.cpp index 564a7722ffa1e78772013d6891721e18dce67720..c0244c8e88b14db3b8029174bd647ef3a30bcc42 100644 --- a/services/ans/test/unittest/reminder_data_manager_test.cpp +++ b/services/ans/test/unittest/reminder_data_manager_test.cpp @@ -30,6 +30,7 @@ #include "reminder_request.h" #include "reminder_request_calendar.h" #include "ability_manager_client.h" +#include "mock_ipc_skeleton.h" #undef private #undef protected @@ -679,5 +680,24 @@ HWTEST_F(ReminderDataManagerTest, OnLanguageChanged_0001, Level1) manager->OnLanguageChanged(); EXPECT_TRUE(reminder->actionButtonMap_[type].title == "this is title"); } + +/** + * @tc.name: CheckPulishReminder + * @tc.desc: Reminder data manager test + * @tc.type: FUNC + * @tc.require: issue#I97Q9Q + */ +HWTEST_F(ReminderDataManagerTest, CheckPulishReminder_0001, Level1) +{ + sptr reminder = new ReminderRequestTimer(10); + sptr option = new NotificationBundleOption(); + IPCSkeleton::SetCallingTokenID(0); + ErrCode ret = manager->PublishReminder(reminder, option); + EXPECT_EQ(ret, ERR_REMINDER_INVALID_PARAM); + + IPCSkeleton::SetCallingTokenID(1); + ret = manager->PublishReminder(reminder, option); + EXPECT_NE(ret, ERR_REMINDER_INVALID_PARAM); +} } // namespace Notification } // namespace OHOS