• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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