1 /*
2 * Copyright (c) 2024 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 "reminder_data_manager.h"
17 #include "reminder_request_timer.h"
18 #include "reminderdatamanager_fuzzer.h"
19
20 namespace OHOS {
DoSomethingInterestingWithManager(const char * data,size_t size)21 bool DoSomethingInterestingWithManager(const char* data, size_t size)
22 {
23 std::string bundleName(data);
24 int32_t userId = static_cast<int32_t>(GetU32Data(data));
25 int32_t uid = static_cast<int32_t>(GetU32Data(data));
26 int32_t reminderId = static_cast<int32_t>(GetU32Data(data));
27 uint64_t date = static_cast<uint64_t>(GetU32Data(data));
28 bool value = static_cast<bool>(GetU32Data(data));
29 uint8_t type = static_cast<uint8_t>(GetU32Data(data));
30 EventFwk::Want want;
31 constexpr uint64_t seconds = 1200;
32 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
33
34 Notification::ReminderDataManager::InitInstance(nullptr);
35 auto manager = Notification::ReminderDataManager::GetInstance();
36 manager->Init(false);
37 manager->Dump();
38 manager->CancelAllReminders(bundleName, userId, uid);
39 sptr<Notification::NotificationBundleOption> option = new Notification::NotificationBundleOption(
40 bundleName, uid);
41 manager->CancelReminder(reminderId, option);
42 manager->CheckExcludeDateParam(reminderId, option);
43 manager->AddExcludeDate(reminderId, date, option);
44 manager->DelExcludeDates(reminderId, option);
45
46 std::vector<uint64_t> dates;
47 manager->GetExcludeDates(reminderId, option, dates);
48 manager->CloseReminder(want, value);
49 std::vector<sptr<Notification::ReminderRequest>> reminders;
50 manager->GetValidReminders(option, reminders);
51 manager->Init(value);
52 manager->InitUserId();
53 std::vector<sptr<Notification::ReminderRequest>> immediatelyReminders;
54 std::vector<sptr<Notification::ReminderRequest>> extensionReminders;
55 manager->CheckReminderTime(immediatelyReminders, extensionReminders);
56
57 manager->RegisterConfigurationObserver();
58 manager->OnUserRemove(userId);
59 manager->OnBundleMgrServiceStart();
60 manager->OnAbilityMgrServiceStart();
61 manager->OnUserSwitch(userId);
62 manager->OnProcessDiedLocked(option);
63 manager->RefreshRemindersDueToSysTimeChange(type);
64 manager->ShouldAlert(reminder);
65 manager->ShowActiveReminder(want);
66 manager->SnoozeReminder(want);
67
68 manager->HandleCustomButtonClick(want);
69 manager->ClickReminder(want);
70 manager->TerminateAlerting(want);
71 return true;
72 }
73
DoSomethingInterestingWithReminder(const char * data,size_t size)74 bool DoSomethingInterestingWithReminder(const char* data, size_t size)
75 {
76 std::string bundleName(data);
77 int32_t userId = static_cast<int32_t>(GetU32Data(data));
78 int32_t uid = static_cast<int32_t>(GetU32Data(data));
79 int32_t reminderId = static_cast<int32_t>(GetU32Data(data));
80 bool value = static_cast<bool>(GetU32Data(data));
81 constexpr uint64_t seconds = 1200;
82 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
83 auto manager = Notification::ReminderDataManager::GetInstance();
84
85 sptr<Notification::NotificationBundleOption> option = new Notification::NotificationBundleOption(
86 bundleName, uid);
87 manager->OnLanguageChanged();
88 manager->OnRemoveAppMgr();
89 manager->CancelAllReminders(userId);
90 manager->CheckUpdateConditions(reminder, Notification::ReminderRequest::ActionButtonType::INVALID,
91 reminder->GetActionButtons());
92 manager->GetCustomRingUri(reminder);
93 manager->CancelRemindersImplLocked(bundleName, userId, uid);
94 manager->CloseRemindersByGroupId(reminderId, bundleName, bundleName);
95 manager->CancelNotification(reminder);
96 manager->CheckReminderLimitExceededLocked(option, reminder);
97 std::vector<sptr<Notification::ReminderRequest>> reminders;
98 manager->GetImmediatelyShowRemindersLocked(reminders);
99 manager->GetSoundUri(reminder);
100 manager->AddToShowedReminders(reminder);
101
102 manager->IsAllowedNotify(reminder);
103 manager->PlaySoundAndVibrationLocked(reminder);
104 manager->PlaySoundAndVibration(reminder);
105 manager->StopSoundAndVibrationLocked(reminder);
106 manager->StopSoundAndVibration(reminder);
107 manager->RemoveFromShowedReminders(reminder);
108 manager->RemoveReminderLocked(reminderId);
109 manager->SetActiveReminder(reminder);
110 manager->SetAlertingReminder(reminder);
111 manager->ShowActiveReminderExtendLocked(reminder, reminders);
112
113 std::vector<sptr<Notification::ReminderRequest>> extensionReminders;
114 std::vector<sptr<Notification::ReminderRequest>> immediatelyReminders;
115 manager->PublishReminder(reminder, option);
116 manager->FindReminderRequestLocked(reminderId);
117 manager->FindReminderRequestLocked(reminderId, bundleName);
118 manager->GetRecentReminderLocked();
119 manager->HandleImmediatelyShow(immediatelyReminders, value);
120 manager->HandleExtensionReminder(extensionReminders, 0);
121 manager->HandleSameNotificationIdShowing(reminder);
122 manager->IsBelongToSameApp(option, option);
123 manager->CheckIsSameApp(reminder, option);
124 manager->ShowReminder(reminder, value, value, value, value);
125 return true;
126 }
127
Clear()128 bool Clear()
129 {
130 auto manager = Notification::ReminderDataManager::GetInstance();
131 if (manager->queue_ != nullptr) {
132 auto handler = manager->queue_->submit_h(std::bind([]() {}));
133 manager->queue_->wait(handler);
134 }
135 return true;
136 }
137 }
138
139 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)140 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
141 {
142 /* Run your code on data */
143 char *ch = ParseData(data, size);
144 if (ch != nullptr && size >= GetU32Size()) {
145 OHOS::DoSomethingInterestingWithManager(ch, size);
146 OHOS::DoSomethingInterestingWithReminder(ch, size);
147 OHOS::Clear();
148 free(ch);
149 ch = nullptr;
150 }
151 return 0;
152 }
153