1 /*
2 * Copyright (c) 2022 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 "getohosaccountinfo_fuzzer.h"
17
18 #include "account_proxy.h"
19 #include "account_info.h"
20 #include "account_log_wrapper.h"
21 #include "distributed_account_subscribe_callback.h"
22 #include "fuzz_data.h"
23 #include "ohos_account_kits.h"
24 #include <cstdint>
25 #include <string>
26 #include <vector>
27
28 using namespace std;
29 using namespace OHOS::AccountSA;
30
31 class MockDistributedAccountSubscribeCallback final : public DistributedAccountSubscribeCallback {
32 public:
MockDistributedAccountSubscribeCallback()33 explicit MockDistributedAccountSubscribeCallback()
34 {}
35
OnAccountsChanged(const DistributedAccountEventData & eventData)36 void OnAccountsChanged(const DistributedAccountEventData &eventData)
37 {}
38 };
39 namespace OHOS {
40 namespace {
41 static constexpr uint32_t OHOS_ACCOUNT_STATE_NUM = 5;
42 }
GetOhosAccountInfoFuzzTest(const uint8_t * data,size_t size)43 bool GetOhosAccountInfoFuzzTest(const uint8_t* data, size_t size)
44 {
45 int32_t result;
46 OhosAccountInfo testOhosAccountInfo;
47 result = OhosAccountKits::GetInstance().GetOhosAccountInfo(testOhosAccountInfo);
48 return result == ERR_OK;
49 }
50
GetOhosAccountInfoByUserIdFuzzTest(const uint8_t * data,size_t size)51 bool GetOhosAccountInfoByUserIdFuzzTest(const uint8_t* data, size_t size)
52 {
53 if ((data == nullptr) || (size == 0)) {
54 return false;
55 }
56 int32_t result;
57 OhosAccountInfo testOhosAccountInfo;
58 FuzzData fuzzData(data, size);
59 int32_t userId = fuzzData.GetData<int32_t>();
60 result = OhosAccountKits::GetInstance().GetOhosAccountInfoByUserId(userId, testOhosAccountInfo);
61 return result == ERR_OK;
62 }
63
SubscribeDistributedAccountEventFuzzTest(const uint8_t * data,size_t size)64 bool SubscribeDistributedAccountEventFuzzTest(const uint8_t* data, size_t size)
65 {
66 if ((data == nullptr) || (size == 0)) {
67 return false;
68 }
69 int32_t result;
70 FuzzData fuzzData(data, size);
71 auto loginSubscribeCallback = std::make_shared<MockDistributedAccountSubscribeCallback>();
72 DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type = static_cast<DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE>(
73 fuzzData.GetData<int32_t>() % 4);
74 result = OhosAccountKits::GetInstance().SubscribeDistributedAccountEvent(type, loginSubscribeCallback);
75 return result == ERR_OK;
76 }
77
UnsubscribeDistributedAccountEventFuzzTest(const uint8_t * data,size_t size)78 bool UnsubscribeDistributedAccountEventFuzzTest(const uint8_t* data, size_t size)
79 {
80 if ((data == nullptr) || (size == 0)) {
81 return false;
82 }
83 int32_t result;
84 FuzzData fuzzData(data, size);
85 auto loginSubscribeCallback = std::make_shared<MockDistributedAccountSubscribeCallback>();
86 DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type = static_cast<DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE>(
87 fuzzData.GetData<int32_t>() % 4);
88 result = OhosAccountKits::GetInstance().UnsubscribeDistributedAccountEvent(type, loginSubscribeCallback);
89 return result == ERR_OK;
90 }
91
SetOhosAccountInfoByUserIdFuzzTest(const uint8_t * data,size_t size)92 bool SetOhosAccountInfoByUserIdFuzzTest(const uint8_t* data, size_t size)
93 {
94 if ((data == nullptr) || (size == 0)) {
95 return false;
96 }
97 std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
98 FuzzData fuzzData(data, size);
99 int32_t userId = fuzzData.GetData<int32_t>();
100 OhosAccountInfo testOhosAccountInfo(
101 fuzzData.GenerateRandomString(),
102 fuzzData.GenerateRandomString(),
103 fuzzData.GetData<int32_t>() % OHOS_ACCOUNT_STATE_NUM - 1
104 );
105 std::string testEventStr(fuzzData.GenerateRandomString());
106 int32_t result = accountProxy->SetOhosAccountInfoByUserId(userId, testOhosAccountInfo, testEventStr);
107 return result == ERR_OK;
108 }
109
GetOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t * data,size_t size)110 bool GetOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t* data, size_t size)
111 {
112 if ((data == nullptr) || (size == 0)) {
113 return false;
114 }
115 std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
116 OhosAccountInfo testOhosAccountInfo;
117 int32_t result = accountProxy->QueryOhosAccountInfo(testOhosAccountInfo);
118 result = accountProxy->GetOhosAccountInfo(testOhosAccountInfo);
119 FuzzData fuzzData(data, size);
120 int32_t userId = fuzzData.GetData<int32_t>();
121 result = accountProxy->GetOhosAccountInfoByUserId(userId, testOhosAccountInfo);
122 return result == ERR_OK;
123 }
124
QueryOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t * data,size_t size)125 bool QueryOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t* data, size_t size)
126 {
127 if ((data == nullptr) || (size == 0)) {
128 return false;
129 }
130 std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
131 OhosAccountInfo testOhosAccountInfo;
132 FuzzData fuzzData(data, size);
133 int32_t userId = fuzzData.GetData<int32_t>();
134 int32_t accountId = 0;
135 int32_t result = accountProxy->QueryDeviceAccountId(accountId);
136 result = accountProxy->QueryOhosAccountInfoByUserId(userId, testOhosAccountInfo);
137 return result == ERR_OK;
138 }
139 }
140
141 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)142 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
143 {
144 /* Run your code on data */
145 OHOS::GetOhosAccountInfoFuzzTest(data, size);
146 OHOS::GetOhosAccountInfoByUserIdFuzzTest(data, size);
147 OHOS::SubscribeDistributedAccountEventFuzzTest(data, size);
148 OHOS::UnsubscribeDistributedAccountEventFuzzTest(data, size);
149 OHOS::SetOhosAccountInfoByUserIdFuzzTest(data, size);
150 OHOS::GetOhosAccountInfoByUserIdProxyFuzzTest(data, size);
151 OHOS::QueryOhosAccountInfoByUserIdProxyFuzzTest(data, size);
152 return 0;
153 }
154
155