1 /*
2  * Copyright (c) 2022-2023 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 #define private public
16 #define protected public
17 #include "input_method_controller.h"
18 #include "input_method_system_ability_proxy.h"
19 #undef private
20 
21 #include "inputmethodcontroller_fuzzer.h"
22 
23 #include <cstddef>
24 #include <cstdint>
25 
26 #include "global.h"
27 #include "input_attribute.h"
28 #include "key_event.h"
29 #include "message_parcel.h"
30 #include "text_listener.h"
31 
32 using namespace OHOS::MiscServices;
33 namespace OHOS {
TestListInputMethod(sptr<InputMethodController> imc)34 void TestListInputMethod(sptr<InputMethodController> imc)
35 {
36     std::vector<Property> properties = {};
37     imc->ListInputMethod(properties);
38     imc->ListInputMethod(false, properties);
39     imc->ListInputMethod(true, properties);
40     imc->DisplayOptionalInputMethod();
41 }
42 
TestListInputMethodSubtype(sptr<InputMethodController> imc,const std::string & fuzzedString,uint32_t fuzzedUint32)43 void TestListInputMethodSubtype(sptr<InputMethodController> imc, const std::string &fuzzedString, uint32_t fuzzedUint32)
44 {
45     std::vector<SubProperty> subProperties = {};
46     Property property;
47     property.name = fuzzedString;
48     property.id = fuzzedString;
49     property.label = fuzzedString;
50     property.icon = fuzzedString;
51     property.iconId = fuzzedUint32;
52     imc->ListInputMethodSubtype(property, subProperties);
53 }
54 
TestDispatchKeyEvent(sptr<InputMethodController> imc,int32_t fuzzedInt32)55 void TestDispatchKeyEvent(sptr<InputMethodController> imc, int32_t fuzzedInt32)
56 {
57     sptr<OnTextChangedListener> textListener = new TextListener();
58     imc->Attach(textListener);
59 
60     std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
61     keyEvent->SetKeyAction(fuzzedInt32);
62     keyEvent->SetKeyCode(fuzzedInt32);
63     imc->DispatchKeyEvent(keyEvent, [](std::shared_ptr<MMI::KeyEvent> &keyEvent, bool isConsumed) {});
64 }
65 
TestOnSelectionChange(sptr<InputMethodController> imc,std::u16string fuzzedU16String,int fuzzedInt,double fuzzedDouble)66 void TestOnSelectionChange(
67     sptr<InputMethodController> imc, std::u16string fuzzedU16String, int fuzzedInt, double fuzzedDouble)
68 {
69     sptr<OnTextChangedListener> textListener = new TextListener();
70     imc->Attach(textListener);
71 
72     CursorInfo cursorInfo;
73     cursorInfo.height = fuzzedDouble;
74     cursorInfo.left = fuzzedDouble;
75     cursorInfo.top = fuzzedDouble;
76     cursorInfo.width = fuzzedDouble;
77     imc->OnCursorUpdate(cursorInfo);
78 
79     imc->OnSelectionChange(fuzzedU16String, fuzzedInt, fuzzedInt);
80 }
81 
TestOnConfigurationChange(sptr<InputMethodController> imc)82 void TestOnConfigurationChange(sptr<InputMethodController> imc)
83 {
84     sptr<OnTextChangedListener> textListener = new TextListener();
85     imc->Attach(textListener);
86 
87     Configuration info;
88     EnterKeyType keyType = EnterKeyType::DONE;
89     info.SetEnterKeyType(keyType);
90     TextInputType textInputType = TextInputType::DATETIME;
91     info.SetTextInputType(textInputType);
92     imc->OnConfigurationChange(info);
93     int32_t enterKeyType;
94     int32_t inputPattern;
95     imc->GetEnterKeyType(enterKeyType);
96     imc->GetInputPattern(inputPattern);
97 }
98 
TestSwitchInputMethod(SwitchTrigger fuzzedTrigger,sptr<InputMethodController> imc,const std::string & fuzzedString)99 void TestSwitchInputMethod(
100     SwitchTrigger fuzzedTrigger, sptr<InputMethodController> imc, const std::string &fuzzedString)
101 {
102     imc->SwitchInputMethod(fuzzedTrigger, fuzzedString, fuzzedString);
103     imc->ShowOptionalInputMethod();
104 }
105 
TestSetCallingWindow(sptr<InputMethodController> imc,uint32_t fuzzedUInt32)106 void TestSetCallingWindow(sptr<InputMethodController> imc, uint32_t fuzzedUInt32)
107 {
108     sptr<OnTextChangedListener> textListener = new TextListener();
109     imc->Attach(textListener);
110 
111     imc->SetCallingWindow(fuzzedUInt32);
112     imc->ShowSoftKeyboard();
113     imc->HideSoftKeyboard();
114 }
115 
TestShowSomething(sptr<InputMethodController> imc)116 void TestShowSomething(sptr<InputMethodController> imc)
117 {
118     sptr<OnTextChangedListener> textListener = new TextListener();
119     imc->Attach(textListener);
120     imc->ShowCurrentInput();
121     imc->HideCurrentInput();
122 
123     imc->ShowTextInput();
124     imc->HideTextInput();
125 
126     imc->GetCurrentInputMethod();
127     imc->GetCurrentInputMethodSubtype();
128 
129     imc->StopInputSession();
130     imc->Close();
131 }
132 
TestUpdateListenEventFlag(sptr<InputMethodController> imc,uint32_t fuzzedUint32)133 void TestUpdateListenEventFlag(sptr<InputMethodController> imc, uint32_t fuzzedUint32)
134 {
135     imc->UpdateListenEventFlag(static_cast<uint32_t>(fuzzedUint32), static_cast<uint32_t>(fuzzedUint32), true);
136     imc->UpdateListenEventFlag(static_cast<uint32_t>(fuzzedUint32), static_cast<uint32_t>(fuzzedUint32), false);
137 }
138 
TestAttach(sptr<InputMethodController> imc,int32_t fuzzedInt32)139 void TestAttach(sptr<InputMethodController> imc, int32_t fuzzedInt32)
140 {
141     sptr<OnTextChangedListener> textListener = new TextListener();
142     InputAttribute inputAttribute;
143     inputAttribute.inputPattern = fuzzedInt32;
144     inputAttribute.enterKeyType = fuzzedInt32;
145     inputAttribute.inputOption = fuzzedInt32;
146     imc->Attach(textListener, true, inputAttribute);
147     imc->Attach(textListener, false, inputAttribute);
148 }
149 
FUZZHideInput(sptr<InputMethodController> imc)150 void FUZZHideInput(sptr<InputMethodController> imc)
151 {
152     sptr<IInputClient> client = new (std::nothrow) InputClientStub();
153     imc->HideInput(client);
154     imc->RequestHideInput();
155 }
156 
FUZZShowInput(sptr<InputMethodController> imc)157 void FUZZShowInput(sptr<InputMethodController> imc)
158 {
159     sptr<IInputClient> client = new (std::nothrow) InputClientStub();
160     imc->ShowInput(client);
161     imc->RequestShowInput();
162 }
163 
FUZZRestore(sptr<InputMethodController> imc)164 void FUZZRestore(sptr<InputMethodController> imc)
165 {
166     imc->RestoreListenEventFlag();
167     imc->RestoreListenInfoInSaDied();
168     imc->RestoreAttachInfoInSaDied();
169 }
170 
InputType(sptr<InputMethodController> imc)171 void InputType(sptr<InputMethodController> imc)
172 {
173     imc->IsInputTypeSupported(InputType::CAMERA_INPUT);
174     imc->IsInputTypeSupported(InputType::SECURITY_INPUT);
175     imc->StartInputType(InputType::CAMERA_INPUT);
176     imc->StartInputType(InputType::SECURITY_INPUT);
177 }
178 
FUZZIsPanelShown(sptr<InputMethodController> imc,const uint8_t * data)179 void FUZZIsPanelShown(sptr<InputMethodController> imc, const uint8_t *data)
180 {
181     PanelInfo panelInfo = { .panelType = SOFT_KEYBOARD, .panelFlag = FLG_FIXED };
182     bool flag = static_cast<bool>(data[0] % 2);
183     imc->IsPanelShown(panelInfo, flag);
184 }
185 
FUZZPrintLogIfAceTimeout(sptr<InputMethodController> imc,int64_t start)186 void FUZZPrintLogIfAceTimeout(sptr<InputMethodController> imc, int64_t start)
187 {
188     imc->PrintLogIfAceTimeout(start);
189 }
190 } // namespace OHOS
191 
192 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)193 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
194 {
195     /* Run your code on data */
196     std::string fuzzedString(data, data + size);
197     std::u16string fuzzedU16String = u"insert text";
198 
199     auto fuzzedInt = static_cast<int>(size);
200     auto fuzzedInt32 = static_cast<int32_t>(size);
201     auto fuzzedUint32 = static_cast<uint32_t>(size);
202     auto fuzzedint64 = static_cast<int64_t>(size);
203     auto fuzzedDouble = static_cast<double>(size);
204     auto fuzzedTrigger = static_cast<SwitchTrigger>(size);
205 
206     OHOS::sptr<InputMethodController> imc = InputMethodController::GetInstance();
207 
208     OHOS::TestListInputMethod(imc);
209     OHOS::TestListInputMethodSubtype(imc, fuzzedString, fuzzedUint32);
210     OHOS::TestOnSelectionChange(imc, fuzzedU16String, fuzzedInt, fuzzedDouble);
211     OHOS::TestOnConfigurationChange(imc);
212     OHOS::TestSwitchInputMethod(fuzzedTrigger, imc, fuzzedString);
213     OHOS::TestSetCallingWindow(imc, fuzzedUint32);
214     OHOS::TestDispatchKeyEvent(imc, fuzzedInt32);
215     OHOS::TestShowSomething(imc);
216     OHOS::FUZZHideInput(imc);
217     OHOS::FUZZShowInput(imc);
218     OHOS::FUZZRestore(imc);
219     OHOS::InputType(imc);
220     OHOS::FUZZIsPanelShown(imc, data);
221     OHOS::FUZZPrintLogIfAceTimeout(imc, fuzzedint64);
222     OHOS::TestUpdateListenEventFlag(imc, fuzzedUint32);
223     return 0;
224 }
225