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