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 #include <fuzzer/FuzzedDataProvider.h>
20
21 namespace OHOS {
DoSomethingInterestingWithManager(FuzzedDataProvider * fdp)22 bool DoSomethingInterestingWithManager(FuzzedDataProvider* fdp)
23 {
24 std::string bundleName = fdp->ConsumeRandomLengthString();
25 int32_t userId = fdp->ConsumeIntegral<int32_t>();
26 int32_t uid = fdp->ConsumeIntegral<int32_t>();
27 int32_t reminderId = fdp->ConsumeIntegral<int32_t>();
28 uint64_t date = fdp->ConsumeIntegral<uint64_t>();
29 bool value = fdp->ConsumeBool();
30 uint8_t type = fdp->ConsumeIntegral<uint8_t>();
31 int32_t callingUid = fdp->ConsumeIntegral<int32_t>();
32 EventFwk::Want want;
33 constexpr uint64_t seconds = 1200;
34 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
35
36 Notification::ReminderDataManager::InitInstance();
37 auto manager = Notification::ReminderDataManager::GetInstance();
38 manager->RegisterConfigurationObserver();
39 manager->Init();
40 manager->Dump();
41 manager->CancelAllReminders(bundleName, userId, uid);
42 manager->CancelReminder(reminderId, callingUid);
43 manager->CheckExcludeDateParam(reminderId, callingUid);
44 manager->AddExcludeDate(reminderId, date, callingUid);
45 manager->DelExcludeDates(reminderId, callingUid);
46
47 std::vector<int64_t> dates;
48 manager->GetExcludeDates(reminderId, callingUid, dates);
49 manager->CloseReminder(want, value);
50 std::vector<Notification::ReminderRequestAdaptation> reminders;
51 manager->GetValidReminders(callingUid, reminders);
52 manager->Init();
53 manager->InitUserId();
54 std::vector<sptr<Notification::ReminderRequest>> immediatelyReminders;
55 std::vector<sptr<Notification::ReminderRequest>> extensionReminders;
56 manager->CheckReminderTime(immediatelyReminders, extensionReminders);
57
58 manager->RegisterConfigurationObserver();
59 manager->OnUserRemove(userId);
60 manager->OnBundleMgrServiceStart();
61 manager->OnAbilityMgrServiceStart();
62 manager->OnUserSwitch(userId);
63 manager->OnProcessDiedLocked(callingUid);
64 manager->RefreshRemindersDueToSysTimeChange(type);
65 manager->ShouldAlert(reminder);
66 manager->ShowActiveReminder(want);
67 manager->SnoozeReminder(want);
68
69 manager->HandleCustomButtonClick(want);
70 manager->ClickReminder(want);
71 manager->TerminateAlerting(want);
72 return true;
73 }
74
DoSomethingInterestingWithReminder(FuzzedDataProvider * fdp)75 bool DoSomethingInterestingWithReminder(FuzzedDataProvider* fdp)
76 {
77 std::string bundleName = fdp->ConsumeRandomLengthString();
78 int32_t userId = fdp->ConsumeIntegral<int32_t>();
79 int32_t uid = fdp->ConsumeIntegral<int32_t>();
80 int32_t reminderId = fdp->ConsumeIntegral<int32_t>();
81 bool value = fdp->ConsumeBool();
82 int32_t callingUid = fdp->ConsumeIntegral<int32_t>();
83 constexpr uint64_t seconds = 1200;
84 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
85 auto manager = Notification::ReminderDataManager::GetInstance();
86
87 manager->OnLanguageChanged();
88 manager->OnRemoveAppMgr();
89 manager->CancelAllReminders(userId);
90 manager->CheckUpdateConditions(reminder, Notification::ReminderRequest::ActionButtonType::INVALID,
91 reminder->GetActionButtons());
92 manager->CancelRemindersImplLocked(bundleName, userId, uid, value);
93 manager->CloseRemindersByGroupId(reminderId, bundleName, bundleName);
94 manager->CancelNotification(reminder);
95 manager->CheckReminderLimitExceededLocked(callingUid, reminder);
96 std::vector<sptr<Notification::ReminderRequest>> reminders;
97 manager->AddToShowedReminders(reminder);
98
99 manager->IsAllowedNotify(reminder);
100 manager->PlaySoundAndVibrationLocked(reminder);
101 manager->PlaySoundAndVibration(reminder);
102 manager->StopSoundAndVibrationLocked(reminder);
103 manager->StopSoundAndVibration(reminder);
104 manager->RemoveFromShowedReminders(reminder);
105 manager->RemoveReminderLocked(reminderId, false);
106 manager->SetActiveReminder(reminder);
107 manager->SetAlertingReminder(reminder);
108 manager->ShowActiveReminderExtendLocked(reminder, reminders);
109
110 std::vector<sptr<Notification::ReminderRequest>> extensionReminders;
111 std::vector<sptr<Notification::ReminderRequest>> immediatelyReminders;
112 manager->PublishReminder(reminder, callingUid);
113 manager->FindReminderRequestLocked(reminderId, false);
114 manager->StartRecentReminder();
115 manager->HandleImmediatelyShow(immediatelyReminders, value);
116 int8_t type = fdp->ConsumeIntegral<int8_t>();
117 manager->HandleExtensionReminder(extensionReminders, type);
118 manager->HandleSameNotificationIdShowing(reminder);
119 manager->IsBelongToSameApp(uid, uid);
120 manager->CheckIsSameApp(reminder, uid);
121 manager->ShowReminder(reminder, value, value, value, value, value);
122 return true;
123 }
124
DoSomethingInteresting1(FuzzedDataProvider * fdp)125 bool DoSomethingInteresting1(FuzzedDataProvider* fdp)
126 {
127 std::string bundleName = fdp->ConsumeRandomLengthString();
128 int32_t id = fdp->ConsumeIntegral<int32_t>();
129 int64_t ts = fdp->ConsumeIntegral<int64_t>();
130 int32_t reminderId = fdp->ConsumeIntegral<int32_t>();
131 bool value = fdp->ConsumeBool();
132 int32_t callingUid = fdp->ConsumeIntegral<int32_t>();
133 constexpr uint64_t seconds = 1200;
134 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
135 auto manager = Notification::ReminderDataManager::GetInstance();
136 manager->OnUnlockScreen();
137 manager->OnLoadReminderEvent();
138 manager->OnLoadReminderInFfrt();
139 manager->OnDataShareInsertOrDelete();
140 std::map<std::string, sptr<ReminderRequest>> remindersMap;
141 manager->OnDataShareUpdate(remindersMap);
142 manager->HandleAutoDeleteReminder(id, id, ts);
143
144 std::vector<sptr<ReminderRequest>> reminders;
145 manager->UpdateReminderLanguageLocked(id, reminders);
146 manager->IsSystemReady();
147 manager->QueryActiveReminderCount();
148 manager->StartLoadTimer();
149 manager->InitShareReminders(value);
150 manager->UpdateAppDatabase(reminder, Notification::ReminderRequest::ActionButtonType::CLOSE);
151 DataShare::DataSharePredicates predicates;
152 std::vector<std::string> equalToVector;
153 manager->GenPredicates(predicates, equalToVector);
154 DataShare::DataShareValuesBucket valuesBucket;
155 manager->GenValuesBucket(valuesBucket, equalToVector);
156 manager->CloseReminder(reminder, value);
157 Notification::ReminderDataManager::TimerType t = Notification::ReminderDataManager::TimerType::ALERTING_TIMER;
158 manager->CreateTimerInfo(t, reminder);
159 auto sharedTimerInfo = std::make_shared<Notification::ReminderTimerInfo>();
160 manager->InitTimerInfo(sharedTimerInfo, reminder, t);
161 manager->GetRecentReminder();
162 manager->HandleSysTimeChange(reminder);
163 manager->IsMatched(reminder, id, id, value);
164 manager->ResetStates(t);
165 return true;
166 }
167
DoSomethingInteresting2(FuzzedDataProvider * fdp)168 bool DoSomethingInteresting2(FuzzedDataProvider* fdp)
169 {
170 constexpr uint16_t MAX_SECOND = 5;
171 std::string bundleName = fdp->ConsumeRandomLengthString();
172 std::string uri = fdp->ConsumeRandomLengthString();
173 int32_t id = fdp->ConsumeIntegral<int32_t>();
174 int8_t val = fdp->ConsumeIntegral<int8_t>();
175 uint16_t second = fdp->ConsumeIntegral<uint16_t>() % MAX_SECOND + 1;
176 int64_t ts = fdp->ConsumeIntegral<int64_t>();
177 int32_t reminderId = fdp->ConsumeIntegral<int32_t>();
178 bool value = fdp->ConsumeBool();
179 int32_t callingUid = fdp->ConsumeIntegral<int32_t>();
180 constexpr uint64_t seconds = 1200;
181 sptr<Notification::ReminderRequest> reminder = new Notification::ReminderRequestTimer(seconds);
182 auto manager = Notification::ReminderDataManager::GetInstance();
183 manager->IsMatchedForGroupIdAndPkgName(reminder, bundleName, uri);
184 manager->IsReminderAgentReady();
185 manager->StartExtensionAbility(reminder, 0);
186 int32_t count = 0;
187 manager->AsyncStartExtensionAbility(reminder, id, val, count);
188 manager->InitServiceHandler();
189 manager->SnoozeReminderImpl(reminder);
190 Notification::ReminderDataManager::TimerType t = Notification::ReminderDataManager::TimerType::ALERTING_TIMER;
191 manager->StartTimerLocked(reminder, t);
192 manager->StartTimer(reminder, t);
193 manager->StopAlertingReminder(reminder);
194 manager->StopTimer(t);
195 manager->StopTimerLocked(t);
196 manager->TerminateAlerting(reminder, uri);
197 manager->TerminateAlerting(second, reminder);
198 manager->UpdateAndSaveReminderLocked(reminder);
199 Notification::ReminderDataManager::cmp(reminder, reminder);
200 manager->ConnectAppMgr();
201 manager->CheckNeedNotifyStatus(reminder, Notification::ReminderRequest::ActionButtonType::INVALID);
202 manager->GetFullPath(uri);
203 manager->IsActionButtonDataShareValid(reminder, static_cast<uint32_t>(id));
204 manager->GetResourceMgr(bundleName, id);
205 Global::Resource::ResourceManager::RawFileDescriptor desc;
206 manager->GetCustomRingFileDesc(reminder, desc);
207 manager->CloseCustomRingFileDesc(id, uri);
208 manager->ReportSysEvent(reminder);
209 std::map<std::string, sptr<ReminderRequest>> reminders;
210 manager->UpdateShareReminders(reminders);
211 std::unordered_map<std::string, int32_t> limits;
212 int32_t totalCount = 0;
213 manager->CheckShowLimit(limits, totalCount, reminder);
214 manager->LoadShareReminders();
215 manager->LoadReminderFromDb();
216 return true;
217 }
218
Clear()219 bool Clear()
220 {
221 auto manager = Notification::ReminderDataManager::GetInstance();
222 if (manager->queue_ != nullptr) {
223 auto handler = manager->queue_->submit_h(std::bind([]() {}));
224 manager->queue_->wait(handler);
225 }
226 return true;
227 }
228 }
229
230 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)231 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
232 {
233 /* Run your code on data */
234 FuzzedDataProvider fdp(data, size);
235 OHOS::DoSomethingInterestingWithManager(&fdp);
236 OHOS::DoSomethingInterestingWithReminder(&fdp);
237 OHOS::DoSomethingInteresting1(&fdp);
238 OHOS::DoSomethingInteresting2(&fdp);
239 return 0;
240 }
241