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 #include "cloudsyncmanager_fuzzer.h"
16 
17 #include <cstddef>
18 #include <cstdint>
19 #include <memory>
20 
21 #include "cloud_fuzzer_helper.h"
22 #include "cloud_sync_manager.h"
23 #include "cloud_sync_manager_impl.h"
24 #include "cloud_sync_service_proxy.h"
25 #include "i_cloud_download_callback.h"
26 #include "i_cloud_sync_callback.h"
27 
28 namespace OHOS {
29 constexpr size_t U32_AT_SIZE = 4;
30 constexpr size_t BOOL_AT_SIZE = 1;
31 
32 using namespace OHOS::FileManagement::CloudSync;
33 using namespace std;
34 class ICloudSyncCallbackTest : public IRemoteStub<ICloudSyncCallback> {
35 public:
OnSyncStateChanged(SyncType type,SyncPromptState state)36     void OnSyncStateChanged(SyncType type, SyncPromptState state) override {}
OnSyncStateChanged(CloudSyncState state,ErrorType error)37     void OnSyncStateChanged(CloudSyncState state, ErrorType error) override {}
38 };
39 
40 class ICloudDownloadCallbackTest : public IRemoteStub<ICloudDownloadCallback> {
41 public:
OnDownloadProcess(const DownloadProgressObj & progress)42     void OnDownloadProcess(const DownloadProgressObj &progress) override {}
43 };
44 
RegisterCallbackFuzzTest(FuzzData & fuzzData,size_t size)45 void RegisterCallbackFuzzTest(FuzzData &fuzzData, size_t size)
46 {
47     fuzzData.ResetData(size);
48     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
49     auto cloudSyncCallback = make_shared<ICloudSyncCallbackTest>();
50     CloudSyncManager::GetInstance().RegisterCallback(cloudSyncCallback, bundleName);
51 }
52 
UnRegisterCallbackFuzzTest(FuzzData & fuzzData,size_t size)53 void UnRegisterCallbackFuzzTest(FuzzData &fuzzData, size_t size)
54 {
55     fuzzData.ResetData(size);
56     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
57     CloudSyncManager::GetInstance().UnRegisterCallback(bundleName);
58 }
59 
StartSyncFuzzTest(FuzzData & fuzzData,size_t size)60 void StartSyncFuzzTest(FuzzData &fuzzData, size_t size)
61 {
62     fuzzData.ResetData(size);
63     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
64     CloudSyncManager::GetInstance().StartSync(bundleName);
65 }
66 
GetSyncTimeFuzzTest(FuzzData & fuzzData,size_t size)67 void GetSyncTimeFuzzTest(FuzzData &fuzzData, size_t size)
68 {
69     fuzzData.ResetData(size);
70     int64_t syncTime{0};
71     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
72     CloudSyncManager::GetInstance().GetSyncTime(syncTime, bundleName);
73 }
74 
StartSyncCallbackFuzzTest(FuzzData & fuzzData,size_t size)75 void StartSyncCallbackFuzzTest(FuzzData &fuzzData, size_t size)
76 {
77     fuzzData.ResetData(size);
78     bool forceFlag = fuzzData.GetData<bool>();
79     auto cloudSyncCallback = make_shared<ICloudSyncCallbackTest>();
80     CloudSyncManager::GetInstance().StartSync(forceFlag, cloudSyncCallback);
81 }
82 
TriggerSyncFuzzTest(FuzzData & fuzzData,size_t size)83 void TriggerSyncFuzzTest(FuzzData &fuzzData, size_t size)
84 {
85     fuzzData.ResetData(size);
86     int32_t userId = 100;
87     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
88     CloudSyncManager::GetInstance().TriggerSync(bundleName, userId);
89 
90     fuzzData.ResetData(size);
91     userId = fuzzData.GetData<int32_t>();
92     bundleName = fuzzData.GetStringFromData(static_cast<int>(size - U32_AT_SIZE));
93     CloudSyncManager::GetInstance().TriggerSync(bundleName, userId);
94 }
95 
StopSyncFuzzTest(FuzzData & fuzzData,size_t size)96 void StopSyncFuzzTest(FuzzData &fuzzData, size_t size)
97 {
98     fuzzData.ResetData(size);
99     std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
100     CloudSyncManager::GetInstance().StopSync(bundleName);
101 }
102 
ChangeAppSwitchFuzzTest(FuzzData & fuzzData,size_t size)103 void ChangeAppSwitchFuzzTest(FuzzData &fuzzData, size_t size)
104 {
105     fuzzData.ResetData(size);
106     bool status = fuzzData.GetData<bool>();
107     int len = static_cast<int>((size - BOOL_AT_SIZE) >> 1);
108     std::string accoutId = fuzzData.GetStringFromData(len);
109     string bundleName = fuzzData.GetStringFromData(static_cast<int>(len));
110     CloudSyncManager::GetInstance().ChangeAppSwitch(accoutId, bundleName, status);
111 }
112 
NotifyDataChangeFuzzTest(FuzzData & fuzzData,size_t size)113 void NotifyDataChangeFuzzTest(FuzzData &fuzzData, size_t size)
114 {
115     fuzzData.ResetData(size);
116     int len = static_cast<int>(size >> 1);
117     std::string accoutId = fuzzData.GetStringFromData(len);
118     std::string bundleName = fuzzData.GetStringFromData(len);
119     CloudSyncManager::GetInstance().NotifyDataChange(accoutId, bundleName);
120 }
121 
StartDownloadFileFuzzTest(FuzzData & fuzzData,size_t size)122 void StartDownloadFileFuzzTest(FuzzData &fuzzData, size_t size)
123 {
124     fuzzData.ResetData(size);
125     string uri = fuzzData.GetStringFromData(static_cast<int>(size));
126     CloudSyncManager::GetInstance().StartDownloadFile(uri);
127 }
128 
StartFileCacheFuzzTest(FuzzData & fuzzData,size_t size)129 void StartFileCacheFuzzTest(FuzzData &fuzzData, size_t size)
130 {
131     fuzzData.ResetData(size);
132     string uri = fuzzData.GetStringFromData(static_cast<int>(size));
133     CloudSyncManager::GetInstance().StartFileCache(uri);
134 }
135 
StopDownloadFileFuzzTest(FuzzData & fuzzData,size_t size)136 void StopDownloadFileFuzzTest(FuzzData &fuzzData, size_t size)
137 {
138     fuzzData.ResetData(size);
139     bool needClean = fuzzData.GetData<bool>();
140     string uri = fuzzData.GetStringFromData(static_cast<int>(size - BOOL_AT_SIZE));
141     CloudSyncManager::GetInstance().StopDownloadFile(uri, needClean);
142 }
143 
RegisterDownloadFileCallbackFuzzTest(FuzzData & fuzzData,size_t size)144 void RegisterDownloadFileCallbackFuzzTest(FuzzData &fuzzData, size_t size)
145 {
146     auto downloadCallback = make_shared<ICloudDownloadCallbackTest>();
147     CloudSyncManager::GetInstance().RegisterDownloadFileCallback(downloadCallback);
148     CloudSyncManager::GetInstance().UnregisterDownloadFileCallback();
149 }
150 
EnableCloudFuzzTest(FuzzData & fuzzData,size_t size)151 void EnableCloudFuzzTest(FuzzData &fuzzData, size_t size)
152 {
153     fuzzData.ResetData(size);
154     int len = static_cast<int>(size >> 1);
155     std::string accoutId = fuzzData.GetStringFromData(len);
156     string itemStr = fuzzData.GetStringFromData(len - static_cast<int>(BOOL_AT_SIZE));
157     bool itemBool = fuzzData.GetData<bool>();
158     SwitchDataObj switchDataObj;
159     switchDataObj.switchData.insert({itemStr, itemBool});
160     CloudSyncManager::GetInstance().EnableCloud(accoutId, switchDataObj);
161     auto proxy = CloudSyncServiceProxy::GetInstance();
162     CloudSyncManagerImpl::GetInstance().SetDeathRecipient(proxy->AsObject());
163 }
164 
DisableCloudFuzzTest(FuzzData & fuzzData,size_t size)165 void DisableCloudFuzzTest(FuzzData &fuzzData, size_t size)
166 {
167     fuzzData.ResetData(size);
168     std::string accoutId = fuzzData.GetStringFromData(static_cast<int>(size));
169     CloudSyncManager::GetInstance().DisableCloud(accoutId);
170 }
171 
CleanFuzzTest(FuzzData & fuzzData,size_t size)172 void CleanFuzzTest(FuzzData &fuzzData, size_t size)
173 {
174     fuzzData.ResetData(size);
175     int len = static_cast<int>(size >> 1);
176     std::string accoutId = fuzzData.GetStringFromData(len);
177     int32_t itemInt = fuzzData.GetData<int32_t>();
178     auto remainSize = fuzzData.GetRemainSize();
179     string itemStr = fuzzData.GetStringFromData(static_cast<int>(remainSize));
180     CleanOptions cleanOptions;
181     cleanOptions.appActionsData.insert({itemStr, itemInt});
182     CloudSyncManager::GetInstance().Clean(accoutId, cleanOptions);
183 }
184 
CleanCacheFuzzTest(FuzzData & fuzzData,size_t size)185 void CleanCacheFuzzTest(FuzzData &fuzzData, size_t size)
186 {
187     fuzzData.ResetData(size);
188     string uri = fuzzData.GetStringFromData(static_cast<int>(size));
189     CloudSyncManager::GetInstance().CleanCache(uri);
190 }
191 } // namespace OHOS
192 
193 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)194 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
195 {
196     /* Run your code on data */
197     if (data == nullptr || size <= (OHOS::U32_AT_SIZE << 1)) {
198         return 0;
199     }
200 
201     OHOS::FuzzData fuzzData(data, size);
202     OHOS::RegisterCallbackFuzzTest(fuzzData, size);
203     OHOS::UnRegisterCallbackFuzzTest(fuzzData, size);
204     OHOS::StartSyncFuzzTest(fuzzData, size);
205     OHOS::GetSyncTimeFuzzTest(fuzzData, size);
206     OHOS::StartSyncCallbackFuzzTest(fuzzData, size);
207     OHOS::TriggerSyncFuzzTest(fuzzData, size);
208     OHOS::StopSyncFuzzTest(fuzzData, size);
209     OHOS::ChangeAppSwitchFuzzTest(fuzzData, size);
210     OHOS::NotifyDataChangeFuzzTest(fuzzData, size);
211     OHOS::StartDownloadFileFuzzTest(fuzzData, size);
212     OHOS::StartFileCacheFuzzTest(fuzzData, size);
213     OHOS::StopDownloadFileFuzzTest(fuzzData, size);
214     OHOS::RegisterDownloadFileCallbackFuzzTest(fuzzData, size);
215     OHOS::EnableCloudFuzzTest(fuzzData, size);
216     OHOS::DisableCloudFuzzTest(fuzzData, size);
217     OHOS::CleanFuzzTest(fuzzData, size);
218     OHOS::CleanCacheFuzzTest(fuzzData, size);
219     return 0;
220 }
221