• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 "usb_manager_addon.h"
16 
17 #include "edm_log.h"
18 #include "usb_manager_proxy.h"
19 
20 #include "napi_edm_adapter.h"
21 
22 using namespace OHOS::EDM;
23 
Init(napi_env env,napi_value exports)24 napi_value UsbManagerAddon::Init(napi_env env, napi_value exports)
25 {
26     napi_value policyValue = nullptr;
27     NAPI_CALL(env, napi_create_object(env, &policyValue));
28     CreateUsbPolicyEnum(env, policyValue);
29 
30     napi_value descriptorValue = nullptr;
31     NAPI_CALL(env, napi_create_object(env, &descriptorValue));
32     CreateDescriptorEnum(env, descriptorValue);
33 
34     napi_property_descriptor property[] = {
35         DECLARE_NAPI_PROPERTY("UsbPolicy", policyValue),
36         DECLARE_NAPI_PROPERTY("Descriptor", descriptorValue),
37         DECLARE_NAPI_FUNCTION("setUsbPolicy", SetUsbPolicy),
38         DECLARE_NAPI_FUNCTION("disableUsb", DisableUsb),
39         DECLARE_NAPI_FUNCTION("isUsbDisabled", IsUsbDisabled),
40         DECLARE_NAPI_FUNCTION("addAllowedUsbDevices", AddAllowedUsbDevices),
41         DECLARE_NAPI_FUNCTION("removeAllowedUsbDevices", RemoveAllowedUsbDevices),
42         DECLARE_NAPI_FUNCTION("getAllowedUsbDevices", GetAllowedUsbDevices),
43         DECLARE_NAPI_FUNCTION("setUsbStorageDeviceAccessPolicy", SetUsbStorageDeviceAccessPolicy),
44         DECLARE_NAPI_FUNCTION("getUsbStorageDeviceAccessPolicy", GetUsbStorageDeviceAccessPolicy),
45         DECLARE_NAPI_FUNCTION("addDisallowedUsbDevices", AddDisallowedUsbDevices),
46         DECLARE_NAPI_FUNCTION("removeDisallowedUsbDevices", RemoveDisallowedUsbDevices),
47         DECLARE_NAPI_FUNCTION("getDisallowedUsbDevices", GetDisallowedUsbDevices),
48     };
49     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
50     return exports;
51 }
52 
CreateUsbPolicyEnum(napi_env env,napi_value value)53 void UsbManagerAddon::CreateUsbPolicyEnum(napi_env env, napi_value value)
54 {
55     napi_value readWrite;
56     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_READ_WRITE, &readWrite));
57     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "READ_WRITE", readWrite));
58 
59     napi_value readOnly;
60     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_READ_ONLY, &readOnly));
61     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "READ_ONLY", readOnly));
62 
63     napi_value disabled;
64     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_DISABLED, &disabled));
65     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DISABLED", disabled));
66 }
67 
CreateDescriptorEnum(napi_env env,napi_value value)68 void UsbManagerAddon::CreateDescriptorEnum(napi_env env, napi_value value)
69 {
70     napi_value interfaceDescriptor;
71     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::USB_INTERFACE_DESCRIPTOR, &interfaceDescriptor));
72     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTERFACE", interfaceDescriptor));
73 
74     napi_value deviceDescriptor;
75     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::USB_DEVICE_DESCRIPTOR, &deviceDescriptor));
76     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DEVICE", deviceDescriptor));
77 }
78 
SetUsbPolicy(napi_env env,napi_callback_info info)79 napi_value UsbManagerAddon::SetUsbPolicy(napi_env env, napi_callback_info info)
80 {
81     auto convertpolicy2Data = [](napi_env env, napi_value argv, MessageParcel &data,
82         const AddonMethodSign &methodSign) -> bool {
83         bool usbPolicy = MatchValueType(env, argv, napi_number);
84         if (!usbPolicy) {
85             EDMLOGE("type usbPolicy error");
86             return false;
87         }
88         int32_t policy = EdmConstants::STORAGE_USB_POLICY_DISABLED;
89         if (!ParseInt(env, policy, argv)) {
90             EDMLOGE("policy param error");
91             return false;
92         }
93         const int32_t readOnly = 1;
94         const int32_t readWrite = 0;
95         switch (policy) {
96             case EdmConstants::STORAGE_USB_POLICY_READ_WRITE:
97                 data.WriteInt32(readWrite);
98                 break;
99             case EdmConstants::STORAGE_USB_POLICY_READ_ONLY:
100                 data.WriteInt32(readOnly);
101                 break;
102             default:
103                 return false;
104         }
105         return true;
106     };
107     AddonMethodSign addonMethodSign;
108     addonMethodSign.name = "setUsbPolicy";
109     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
110     addonMethodSign.argsConvert = {nullptr, convertpolicy2Data};
111     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
112     return AddonMethodAdapter(env, info, addonMethodSign, NativeSetUsbPolicy, NativeVoidCallbackComplete);
113 }
114 
NativeSetUsbPolicy(napi_env env,void * data)115 void UsbManagerAddon::NativeSetUsbPolicy(napi_env env, void *data)
116 {
117     EDMLOGI("NAPI_NativeSetUsbPolicy called");
118     if (data == nullptr) {
119         EDMLOGE("data is nullptr");
120         return;
121     }
122     AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
123     asyncCallbackInfo->ret =
124                 UsbManagerProxy::GetUsbManagerProxy()->SetUsbReadOnly(asyncCallbackInfo->data);
125 }
126 
DisableUsb(napi_env env,napi_callback_info info)127 napi_value UsbManagerAddon::DisableUsb(napi_env env, napi_callback_info info)
128 {
129     AddonMethodSign addonMethodSign;
130     addonMethodSign.name = "disableUsb";
131     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::BOOLEAN};
132     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
133     addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
134     AdapterAddonData adapterAddonData{};
135     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
136     if (result == nullptr) {
137         return nullptr;
138     }
139 
140     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
141     if (usbManagerProxy == nullptr) {
142         EDMLOGE("can not get usbManagerProxy");
143         return nullptr;
144     }
145     int32_t ret = usbManagerProxy->DisableUsb(adapterAddonData.data);
146     if (FAILED(ret)) {
147         napi_throw(env, CreateError(env, ret));
148     }
149     return nullptr;
150 }
151 
IsUsbDisabled(napi_env env,napi_callback_info info)152 napi_value UsbManagerAddon::IsUsbDisabled(napi_env env, napi_callback_info info)
153 {
154     AddonMethodSign addonMethodSign;
155     addonMethodSign.name = "isUsbDisabled";
156     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT_NULL};
157     addonMethodSign.methodAttribute = MethodAttribute::GET;
158     addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
159     AdapterAddonData adapterAddonData{};
160     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
161     if (result == nullptr) {
162         return nullptr;
163     }
164     bool isDisabled = false;
165     int32_t ret = ERR_OK;
166     ret = UsbManagerProxy::GetUsbManagerProxy()->IsUsbDisabled(adapterAddonData.data, isDisabled);
167     EDMLOGI("UsbManagerAddon::IsUsbDisabled return: %{public}d", isDisabled);
168     if (FAILED(ret)) {
169         napi_throw(env, CreateError(env, ret));
170         return nullptr;
171     }
172     result = nullptr;
173     NAPI_CALL(env, napi_get_boolean(env, isDisabled, &result));
174     return result;
175 }
176 
AddAllowedUsbDevices(napi_env env,napi_callback_info info)177 napi_value UsbManagerAddon::AddAllowedUsbDevices(napi_env env, napi_callback_info info)
178 {
179     EDMLOGI("UsbManagerAddon::AddAllowedUsbDevices called");
180     return AddOrRemoveAllowedUsbDevices(env, info, true);
181 }
182 
RemoveAllowedUsbDevices(napi_env env,napi_callback_info info)183 napi_value UsbManagerAddon::RemoveAllowedUsbDevices(napi_env env, napi_callback_info info)
184 {
185     EDMLOGI("UsbManagerAddon::RemoveAllowedUsbDevices called");
186     return AddOrRemoveAllowedUsbDevices(env, info, false);
187 }
188 
AddOrRemoveAllowedUsbDevices(napi_env env,napi_callback_info info,bool isAdd)189 napi_value UsbManagerAddon::AddOrRemoveAllowedUsbDevices(napi_env env, napi_callback_info info, bool isAdd)
190 {
191     auto convertUsbDeviceIds2Data = [](napi_env env, napi_value argv, MessageParcel &data,
192         const AddonMethodSign &methodSign) {
193             std::vector<UsbDeviceId> usbDeviceIds;
194             if (!ParseUsbDevicesArray(env, usbDeviceIds, argv)) {
195                 EDMLOGE("parameter type parse error");
196                 return false;
197             }
198             data.WriteUint32(usbDeviceIds.size());
199             for (const auto &usbDeviceId : usbDeviceIds) {
200                 if (!usbDeviceId.Marshalling(data)) {
201                     EDMLOGE("UsbManagerProxy AddAllowedUsbDevices: write parcel failed!");
202                     return false;
203                 }
204             }
205             return true;
206     };
207     AddonMethodSign addonMethodSign;
208     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
209     addonMethodSign.argsConvert = {nullptr, convertUsbDeviceIds2Data};
210     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
211     addonMethodSign.name = (isAdd ? "addAllowedUsbDevices" : "removeAllowedUsbDevices");
212     AdapterAddonData adapterAddonData{};
213     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
214     if (result == nullptr) {
215         return nullptr;
216     }
217     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
218     if (usbManagerProxy == nullptr) {
219         EDMLOGE("can not get usbManagerProxy");
220         return nullptr;
221     }
222     int32_t ret = ERR_OK;
223     if (isAdd) {
224         ret = usbManagerProxy->AddAllowedUsbDevices(adapterAddonData.data);
225     } else {
226         ret = usbManagerProxy->RemoveAllowedUsbDevices(adapterAddonData.data);
227     }
228     if (FAILED(ret)) {
229         napi_throw(env, CreateError(env, ret));
230     }
231     return nullptr;
232 }
233 
ParseUsbDevicesArray(napi_env env,std::vector<UsbDeviceId> & usbDeviceIds,napi_value object)234 bool UsbManagerAddon::ParseUsbDevicesArray(napi_env env, std::vector<UsbDeviceId> &usbDeviceIds, napi_value object)
235 {
236     bool isArray = false;
237     napi_is_array(env, object, &isArray);
238     if (!isArray) {
239         return false;
240     }
241     uint32_t arrayLength = 0;
242     napi_get_array_length(env, object, &arrayLength);
243     for (uint32_t i = 0; i < arrayLength; i++) {
244         napi_value value = nullptr;
245         napi_get_element(env, object, i, &value);
246         napi_valuetype valueType = napi_undefined;
247         napi_typeof(env, value, &valueType);
248         if (valueType != napi_object) {
249             usbDeviceIds.clear();
250             return false;
251         }
252         UsbDeviceId usbDeviceId;
253         if (!GetUsbDeviceIdFromNAPI(env, value, usbDeviceId)) {
254             usbDeviceIds.clear();
255             return false;
256         }
257         usbDeviceIds.push_back(usbDeviceId);
258     }
259     return true;
260 }
261 
GetUsbDeviceIdFromNAPI(napi_env env,napi_value value,UsbDeviceId & usbDeviceId)262 bool UsbManagerAddon::GetUsbDeviceIdFromNAPI(napi_env env, napi_value value, UsbDeviceId &usbDeviceId)
263 {
264     int32_t vendorId = 0;
265     if (!JsObjectToInt(env, value, "vendorId", true, vendorId)) {
266         EDMLOGE("Add/RemoveAllowedUsbDevices vendorId parse error!");
267         return false;
268     }
269     int32_t productId = 0;
270     if (!JsObjectToInt(env, value, "productId", true, productId)) {
271         EDMLOGE("Add/RemoveAllowedUsbDevices productId parse error!");
272         return false;
273     }
274     usbDeviceId.SetVendorId(vendorId);
275     usbDeviceId.SetProductId(productId);
276     EDMLOGD("GetUsbDeviceIdFromNAPI vendorId: %{public}d, productId: %{public}d", vendorId, productId);
277     return true;
278 }
279 
GetAllowedUsbDevices(napi_env env,napi_callback_info info)280 napi_value UsbManagerAddon::GetAllowedUsbDevices(napi_env env, napi_callback_info info)
281 {
282     AddonMethodSign addonMethodSign;
283     addonMethodSign.name = "getAllowedUsbDevices";
284     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
285     addonMethodSign.methodAttribute = MethodAttribute::GET;
286     AdapterAddonData adapterAddonData{};
287     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
288     if (result == nullptr) {
289         return nullptr;
290     }
291 
292     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
293     if (usbManagerProxy == nullptr) {
294         EDMLOGE("can not get usbManagerProxy");
295         return nullptr;
296     }
297     std::vector<UsbDeviceId> usbDeviceIds;
298     int32_t ret = usbManagerProxy->GetAllowedUsbDevices(adapterAddonData.data, usbDeviceIds);
299     EDMLOGI("UsbManagerAddon::GetAllowedUsbDevices usbDeviceIds return size: %{public}zu", usbDeviceIds.size());
300     if (FAILED(ret)) {
301         napi_throw(env, CreateError(env, ret));
302         return nullptr;
303     }
304     napi_value jsList = nullptr;
305     NAPI_CALL(env, napi_create_array_with_length(env, usbDeviceIds.size(), &jsList));
306     for (size_t i = 0; i < usbDeviceIds.size(); i++) {
307         napi_value item = UsbDeviceIdToJsObj(env, usbDeviceIds[i]);
308         NAPI_CALL(env, napi_set_element(env, jsList, i, item));
309     }
310     return jsList;
311 }
312 
UsbDeviceIdToJsObj(napi_env env,const UsbDeviceId & usbDeviceId)313 napi_value UsbManagerAddon::UsbDeviceIdToJsObj(napi_env env, const UsbDeviceId &usbDeviceId)
314 {
315     napi_value value = nullptr;
316     NAPI_CALL(env, napi_create_object(env, &value));
317 
318     napi_value vendorId = nullptr;
319     NAPI_CALL(env, napi_create_int32(env, usbDeviceId.GetVendorId(), &vendorId));
320     NAPI_CALL(env, napi_set_named_property(env, value, "vendorId", vendorId));
321 
322     napi_value productId = nullptr;
323     NAPI_CALL(env, napi_create_int32(env, usbDeviceId.GetProductId(), &productId));
324     NAPI_CALL(env, napi_set_named_property(env, value, "productId", productId));
325 
326     return value;
327 }
328 
SetUsbStorageDeviceAccessPolicy(napi_env env,napi_callback_info info)329 napi_value UsbManagerAddon::SetUsbStorageDeviceAccessPolicy(napi_env env, napi_callback_info info)
330 {
331     AddonMethodSign addonMethodSign;
332     addonMethodSign.name = "setUsbStorageDeviceAccessPolicy";
333     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::INT32};
334     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
335     AdapterAddonData adapterAddonData{};
336     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
337     if (result == nullptr) {
338         return nullptr;
339     }
340 
341     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
342     if (usbManagerProxy == nullptr) {
343         EDMLOGE("can not get usbManagerProxy");
344         return nullptr;
345     }
346     int32_t ret = usbManagerProxy->SetUsbStorageDeviceAccessPolicy(adapterAddonData.data);
347     if (FAILED(ret)) {
348         napi_throw(env, CreateError(env, ret));
349     }
350     return nullptr;
351 }
352 
GetUsbStorageDeviceAccessPolicy(napi_env env,napi_callback_info info)353 napi_value UsbManagerAddon::GetUsbStorageDeviceAccessPolicy(napi_env env, napi_callback_info info)
354 {
355     AddonMethodSign addonMethodSign;
356     addonMethodSign.name = "getUsbStorageDeviceAccessPolicy";
357     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
358     addonMethodSign.methodAttribute = MethodAttribute::GET;
359     AdapterAddonData adapterAddonData{};
360     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
361     if (result == nullptr) {
362         return nullptr;
363     }
364 
365     int32_t usbPolicy = EdmConstants::STORAGE_USB_POLICY_READ_WRITE;
366     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
367     if (usbManagerProxy == nullptr) {
368         EDMLOGE("can not get usbManagerProxy");
369         return nullptr;
370     }
371     int32_t ret = usbManagerProxy->GetUsbStorageDeviceAccessPolicy(adapterAddonData.data, usbPolicy);
372     EDMLOGI("UsbManagerAddon::GetUsbStorageDeviceAccessPolicy return: %{public}d", usbPolicy);
373     if (FAILED(ret)) {
374         napi_throw(env, CreateError(env, ret));
375         return nullptr;
376     }
377     result = nullptr;
378     NAPI_CALL(env, napi_create_int32(env, usbPolicy, &result));
379     return result;
380 }
381 
AddDisallowedUsbDevices(napi_env env,napi_callback_info info)382 napi_value UsbManagerAddon::AddDisallowedUsbDevices(napi_env env, napi_callback_info info)
383 {
384     EDMLOGI("UsbManagerAddon::AddDisallowedUsbDevices called");
385     return AddOrRemoveDisallowedUsbDevices(env, info, true);
386 }
387 
RemoveDisallowedUsbDevices(napi_env env,napi_callback_info info)388 napi_value UsbManagerAddon::RemoveDisallowedUsbDevices(napi_env env, napi_callback_info info)
389 {
390     EDMLOGI("UsbManagerAddon::RemoveDisallowedUsbDevices called");
391     return AddOrRemoveDisallowedUsbDevices(env, info, false);
392 }
393 
AddOrRemoveDisallowedUsbDevices(napi_env env,napi_callback_info info,bool isAdd)394 napi_value UsbManagerAddon::AddOrRemoveDisallowedUsbDevices(napi_env env, napi_callback_info info, bool isAdd)
395 {
396     auto convertUsbDeviceType2Data = [](napi_env env, napi_value argv, MessageParcel &data,
397         const AddonMethodSign &methodSign) {
398             std::vector<USB::UsbDeviceType> usbDeviceTypes;
399             if (!ParseUsbDeviceTypesArray(env, usbDeviceTypes, argv)) {
400                 EDMLOGE("parameter type parse error");
401                 return false;
402             }
403             auto size = usbDeviceTypes.size();
404             if (size > EdmConstants::DISALLOWED_USB_DEVICES_TYPES_MAX_SIZE) {
405                 EDMLOGE("UsbManagerProxy:AddOrRemoveDisallowedUsbDevices size=[%{public}zu] is too large", size);
406                 return false;
407             }
408             data.WriteUint32(size);
409             for (const auto &usbDeviceType : usbDeviceTypes) {
410                 if (!usbDeviceType.Marshalling(data)) {
411                     EDMLOGE("UsbManagerProxy AddOrRemoveDisallowedUsbDevices: write parcel failed!");
412                     return false;
413                 }
414             }
415             return true;
416     };
417     AddonMethodSign addonMethodSign;
418     addonMethodSign.name = (isAdd ? "addDisallowedUsbDevices" : "removeDisallowedUsbDevices");
419     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
420     addonMethodSign.argsConvert = {nullptr, convertUsbDeviceType2Data};
421     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
422     AdapterAddonData adapterAddonData{};
423     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
424     if (result == nullptr) {
425         return nullptr;
426     }
427 
428     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
429     if (usbManagerProxy == nullptr) {
430         EDMLOGE("can not get usbManagerProxy");
431         return nullptr;
432     }
433     int32_t ret = usbManagerProxy->AddOrRemoveDisallowedUsbDevices(adapterAddonData.data, isAdd);
434     if (FAILED(ret)) {
435         napi_throw(env, CreateError(env, ret));
436     }
437     return nullptr;
438 }
439 
GetDisallowedUsbDevices(napi_env env,napi_callback_info info)440 napi_value UsbManagerAddon::GetDisallowedUsbDevices(napi_env env, napi_callback_info info)
441 {
442     EDMLOGI("UsbManagerAddon::GetDisallowedUsbDevices called");
443     AddonMethodSign addonMethodSign;
444     addonMethodSign.name = "getDisallowedUsbDevices";
445     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
446     addonMethodSign.methodAttribute = MethodAttribute::GET;
447     AdapterAddonData adapterAddonData{};
448     napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
449     if (result == nullptr) {
450         return nullptr;
451     }
452 
453     auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
454     if (usbManagerProxy == nullptr) {
455         EDMLOGE("can not get usbManagerProxy");
456         return nullptr;
457     }
458     std::vector<USB::UsbDeviceType> usbDeviceTypes;
459     int32_t ret = usbManagerProxy->GetDisallowedUsbDevices(adapterAddonData.data, usbDeviceTypes);
460     EDMLOGI("UsbManagerAddon::GetDisallowedUsbDevices usbDeviceTypes return size: %{public}zu", usbDeviceTypes.size());
461     if (FAILED(ret)) {
462         napi_throw(env, CreateError(env, ret));
463         return nullptr;
464     }
465     napi_value jsList = nullptr;
466     NAPI_CALL(env, napi_create_array_with_length(env, usbDeviceTypes.size(), &jsList));
467     for (size_t i = 0; i < usbDeviceTypes.size(); i++) {
468         napi_value item = UsbDeviceTypeToJsObj(env, usbDeviceTypes[i]);
469         NAPI_CALL(env, napi_set_element(env, jsList, i, item));
470     }
471     return jsList;
472 }
473 
474 #ifdef USB_EDM_ENABLE
ParseUsbDeviceTypesArray(napi_env env,std::vector<USB::UsbDeviceType> & usbDeviceTypes,napi_value object)475 bool UsbManagerAddon::ParseUsbDeviceTypesArray(napi_env env, std::vector<USB::UsbDeviceType> &usbDeviceTypes,
476     napi_value object)
477 {
478     bool isArray = false;
479     napi_is_array(env, object, &isArray);
480     if (!isArray) {
481         return false;
482     }
483     uint32_t arrayLength = 0;
484     napi_get_array_length(env, object, &arrayLength);
485     if (arrayLength > EdmConstants::DISALLOWED_USB_DEVICES_TYPES_MAX_SIZE) {
486         EDMLOGE("ParseUsbDeviceTypesArray: arrayLength=[%{public}u] is too large", arrayLength);
487         return false;
488     }
489     for (uint32_t i = 0; i < arrayLength; i++) {
490         napi_value value = nullptr;
491         napi_get_element(env, object, i, &value);
492         napi_valuetype valueType = napi_undefined;
493         napi_typeof(env, value, &valueType);
494         if (valueType != napi_object) {
495             usbDeviceTypes.clear();
496             return false;
497         }
498         USB::UsbDeviceType usbDeviceType;
499         if (!GetUsbDeviceTypeFromNAPI(env, value, usbDeviceType)) {
500             usbDeviceTypes.clear();
501             return false;
502         }
503         usbDeviceTypes.push_back(usbDeviceType);
504     }
505     return true;
506 }
507 
GetUsbDeviceTypeFromNAPI(napi_env env,napi_value value,USB::UsbDeviceType & usbDeviceType)508 bool UsbManagerAddon::GetUsbDeviceTypeFromNAPI(napi_env env, napi_value value, USB::UsbDeviceType &usbDeviceType)
509 {
510     int32_t baseClass = 0;
511     if (!JsObjectToInt(env, value, "baseClass", true, baseClass)) {
512         EDMLOGE("GetUsbDeviceTypeFromNAPI baseClass parse error!");
513         return false;
514     }
515     int32_t subClass = 0;
516     if (!JsObjectToInt(env, value, "subClass", true, subClass)) {
517         EDMLOGE("GetUsbDeviceTypeFromNAPI subClass parse error!");
518         return false;
519     }
520     int32_t protocol = 0;
521     if (!JsObjectToInt(env, value, "protocol", true, protocol)) {
522         EDMLOGE("GetUsbDeviceTypeFromNAPI protocol parse error!");
523         return false;
524     }
525     int32_t descriptor = -1;
526     if (!JsObjectToInt(env, value, "descriptor", true, descriptor)) {
527         EDMLOGE("GetUsbDeviceTypeFromNAPI descriptor parse error!");
528         return false;
529     }
530     if (!std::any_of(std::begin(DESCRIPTOR), std::end(DESCRIPTOR), [&](int item) { return item == descriptor; })) {
531         EDMLOGE("GetUsbDeviceTypeFromNAPI descriptor value error!");
532         return false;
533     }
534     usbDeviceType.baseClass = baseClass;
535     usbDeviceType.subClass = subClass;
536     usbDeviceType.protocol = protocol;
537     usbDeviceType.isDeviceType = descriptor;
538     EDMLOGD("GetUsbDeviceTypeFromNAPI baseClass: %{public}d, subClass: %{public}d, protocol: %{public}d, "
539         "isDeviceType: %{public}d", baseClass, subClass, protocol, descriptor);
540     return true;
541 }
542 
UsbDeviceTypeToJsObj(napi_env env,const USB::UsbDeviceType & usbDeviceType)543 napi_value UsbManagerAddon::UsbDeviceTypeToJsObj(napi_env env, const USB::UsbDeviceType &usbDeviceType)
544 {
545     napi_value value = nullptr;
546     NAPI_CALL(env, napi_create_object(env, &value));
547 
548     napi_value baseClass = nullptr;
549     NAPI_CALL(env, napi_create_int32(env, usbDeviceType.baseClass, &baseClass));
550     NAPI_CALL(env, napi_set_named_property(env, value, "baseClass", baseClass));
551 
552     napi_value subClass = nullptr;
553     NAPI_CALL(env, napi_create_int32(env, usbDeviceType.subClass, &subClass));
554     NAPI_CALL(env, napi_set_named_property(env, value, "subClass", subClass));
555 
556     napi_value protocol = nullptr;
557     NAPI_CALL(env, napi_create_int32(env, usbDeviceType.protocol, &protocol));
558     NAPI_CALL(env, napi_set_named_property(env, value, "protocol", protocol));
559 
560     napi_value descriptor = nullptr;
561     NAPI_CALL(env, napi_create_int32(env, usbDeviceType.isDeviceType, &descriptor));
562     NAPI_CALL(env, napi_set_named_property(env, value, "descriptor", descriptor));
563     return value;
564 }
565 #endif
566 
567 static napi_module g_usbManagerModule = {
568     .nm_version = 1,
569     .nm_flags = 0,
570     .nm_filename = nullptr,
571     .nm_register_func = UsbManagerAddon::Init,
572     .nm_modname = "enterprise.usbManager",
573     .nm_priv = ((void *)0),
574     .reserved = {0},
575 };
576 
UsbManagerRegister()577 extern "C" __attribute__((constructor)) void UsbManagerRegister()
578 {
579     napi_module_register(&g_usbManagerModule);
580 }