• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 
16 #include "usb_service.h"
17 
18 #include <cstdio>
19 #include <iostream>
20 #include <ipc_skeleton.h>
21 #include <sstream>
22 #include <string>
23 #include <filesystem>
24 #include <unistd.h>
25 #include <unordered_map>
26 #include "parameters.h"
27 #include "bundle_mgr_interface.h"
28 #include "bundle_mgr_proxy.h"
29 #include "common_timer_errors.h"
30 #include "file_ex.h"
31 #include "if_system_ability_manager.h"
32 #include "iproxy_broker.h"
33 #include "iservice_registry.h"
34 #include "iusb_srv.h"
35 #include "securec.h"
36 #include "system_ability_definition.h"
37 #include "usb_common.h"
38 #include "usb_descriptor_parser.h"
39 #include "usb_errors.h"
40 #include "usb_napi_errors.h"
41 #include "usb_port_manager.h"
42 #include "usb_right_manager.h"
43 #include "usb_right_db_helper.h"
44 #include "usb_report_sys_event.h"
45 #include "usb_settings_datashare.h"
46 #include "tokenid_kit.h"
47 #include "accesstoken_kit.h"
48 #include "mem_mgr_proxy.h"
49 #include "mem_mgr_client.h"
50 #include "uri.h"
51 #include "usb_function_switch_window.h"
52 #include "usbd_transfer_callback_impl.h"
53 #include "hitrace_meter.h"
54 #include "hisysevent.h"
55 
56 using OHOS::sptr;
57 using OHOS::HiviewDFX::HiSysEvent;
58 using namespace OHOS::HDI::Usb::V1_2;
59 using namespace OHOS::Security::AccessToken;
60 namespace OHOS {
61 namespace USB {
62 namespace {
63 constexpr int32_t COMMEVENT_REGISTER_RETRY_TIMES = 10;
64 constexpr int32_t COMMEVENT_REGISTER_WAIT_DELAY_US = 20000;
65 constexpr int32_t SERVICE_STARTUP_MAX_TIME = 30;
66 constexpr uint32_t UNLOAD_SA_TIMER_INTERVAL = 30 * 1000;
67 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
68 constexpr int32_t USB_RIGHT_USERID_INVALID = -1;
69 constexpr const char *USB_DEFAULT_TOKEN = "UsbServiceTokenId";
70 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
71 constexpr int32_t API_VERSION_ID_18 = 18;
72 static const std::filesystem::path TTYUSB_PATH = "/sys/bus/usb-serial/devices";
73 constexpr const pid_t ROOT_UID = 0;
74 constexpr const pid_t EDM_UID = 3057;
75 } // namespace
76 auto g_serviceInstance = DelayedSpSingleton<UsbService>::GetInstance();
77 const bool G_REGISTER_RESULT =
78     SystemAbility::MakeAndRegisterAbility(DelayedSpSingleton<UsbService>::GetInstance().GetRefPtr());
79 
UsbService()80 UsbService::UsbService() : SystemAbility(USB_SYSTEM_ABILITY_ID, true)
81 {
82     usbRightManager_ = std::make_shared<UsbRightManager>();
83 #ifdef USB_MANAGER_PASS_THROUGH
84 
85 #ifdef USB_MANAGER_FEATURE_HOST
86     usbHostManager_ = std::make_shared<UsbHostManager>(nullptr);
87 #endif // USB_MANAGER_FEATURE_HOST
88 #ifdef USB_MANAGER_FEATURE_PORT
89     usbPortManager_ = std::make_shared<UsbPortManager>();
90 #endif // USB_MANAGER_FEATURE_PORT
91 #ifdef USB_MANAGER_FEATURE_DEVICE
92     usbDeviceManager_ = std::make_shared<UsbDeviceManager>();
93     usbAccessoryManager_ = std::make_shared<UsbAccessoryManager>();
94 #endif // USB_MANAGER_FEATURE_DEVICE
95 
96 #else
97     if (usbd_ == nullptr) {
98         usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
99         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d usbd_ == nullptr: %{public}d",
100             __func__, __LINE__, usbd_ == nullptr);
101     } else {
102         USB_HILOGW(MODULE_USB_SERVICE, "%{public}s:usbd_ != nullptr", __func__);
103     }
104 #endif // USB_MANAGER_PASS_THROUGH
105 }
106 
~UsbService()107 UsbService::~UsbService() {}
108 
109 // LCOV_EXCL_START
110 #ifndef USB_MANAGER_PASS_THROUGH
SetUsbd(const sptr<OHOS::HDI::Usb::V1_2::IUsbInterface> & usbd)111 int32_t UsbService::SetUsbd(const sptr<OHOS::HDI::Usb::V1_2::IUsbInterface> &usbd)
112 {
113     if (usbd == nullptr) {
114         USB_HILOGE(MODULE_USB_SERVICE, "UsbService usbd is nullptr");
115         return UEC_SERVICE_INVALID_VALUE;
116     }
117     if (usbd_ == nullptr) {
118         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:usbd_ = usbd", __func__);
119         usbd_ = usbd;
120     } else {
121         USB_HILOGW(MODULE_USB_SERVICE, "%{public}s:usbd_ != nullptr", __func__);
122     }
123 #ifdef USB_MANAGER_FEATURE_PORT
124     if (usbPortManager_ == nullptr) {
125         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
126         return UEC_SERVICE_INVALID_VALUE;
127     }
128     usbPortManager_->SetUsbd(usbd);
129 #endif // USB_MANAGER_FEATURE_PORT
130 #ifdef USB_MANAGER_FEATURE_DEVICE
131     if (usbDeviceManager_ == nullptr) {
132         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
133         return UEC_SERVICE_INVALID_VALUE;
134     }
135     usbDeviceManager_->SetUsbd(usbd);
136 
137     if (usbAccessoryManager_ == nullptr) {
138         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbAccessoryManager_");
139         return UEC_SERVICE_INVALID_VALUE;
140     }
141     usbAccessoryManager_->SetUsbd(usbd);
142 #endif // USB_MANAGER_FEATURE_DEVICE
143     return UEC_OK;
144 }
145 #endif // USB_MANAGER_PASS_THROUGH
146 // LCOV_EXCL_STOP
147 
148 #ifdef USB_MANAGER_PASS_THROUGH
149 // LCOV_EXCL_START
SystemAbilityStatusChangeListener(sptr<UsbManagerSubscriber> usbManagerSubscriber)150 UsbService::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(
151     sptr<UsbManagerSubscriber> usbManagerSubscriber)
152     : usbManagerSubscriber_(usbManagerSubscriber)
153 {
154 }
155 // LCOV_EXCL_STOP
156 
157 // LCOV_EXCL_START
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)158 void UsbService::SystemAbilityStatusChangeListener::OnAddSystemAbility(
159     int32_t systemAbilityId, const std::string &deviceId)
160 {
161     USB_HILOGI(MODULE_USB_SERVICE, "OnAddSystemAbility ID = %{public}d", systemAbilityId);
162 }
163 // LCOV_EXCL_STOP
164 
165 // LCOV_EXCL_START
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)166 void UsbService::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
167     int32_t systemAbilityId, const std::string &deviceId)
168 {
169     USB_HILOGI(MODULE_USB_SERVICE, "OnRemoveSystemAbility ID = %{public}d", systemAbilityId);
170     if (systemAbilityId == USB_SYSTEM_ABILITY_ID) {
171 #ifdef USB_MANAGER_FEATURE_HOST
172         sptr<OHOS::HDI::Usb::V2_0::IUsbHostInterface> usbHostInterface_ =
173             OHOS::HDI::Usb::V2_0::IUsbHostInterface::Get("usb_host_interface_service", true);
174         if (usbHostInterface_ != nullptr) {
175             usbHostInterface_->UnbindUsbdHostSubscriber(usbManagerSubscriber_);
176         }
177 #endif // USB_MANAGER_FEATURE_HOST
178 #ifdef USB_MANAGER_FEATURE_DEVICE
179         sptr<OHOS::HDI::Usb::V2_0::IUsbDeviceInterface> usbDeviceInterface_ =
180             OHOS::HDI::Usb::V2_0::IUsbDeviceInterface::Get();
181         if (usbDeviceInterface_ != nullptr) {
182             usbDeviceInterface_->UnbindUsbdDeviceSubscriber(usbManagerSubscriber_);
183         }
184 #endif // USB_MANAGER_FEATURE_DEVICE
185 #ifdef USB_MANAGER_FEATURE_PORT
186         sptr<OHOS::HDI::Usb::V2_0::IUsbPortInterface> usbPortInterface_ =
187             OHOS::HDI::Usb::V2_0::IUsbPortInterface::Get();
188         if (usbPortInterface_ != nullptr) {
189             usbPortInterface_->UnbindUsbdPortSubscriber(usbManagerSubscriber_);
190         }
191 #endif // USB_MANAGER_FEATURE_PORT
192     }
193 }
194 // LCOV_EXCL_STOP
195 #else
196 // LCOV_EXCL_START
SystemAbilityStatusChangeListener(sptr<UsbServiceSubscriber> usbdSubscriber)197 UsbService::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(
198     sptr<UsbServiceSubscriber> usbdSubscriber)
199     : usbdSubscriber_(usbdSubscriber)
200 {
201 }
202 // LCOV_EXCL_STOP
203 
204 // LCOV_EXCL_START
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)205 void UsbService::SystemAbilityStatusChangeListener::OnAddSystemAbility(
206     int32_t systemAbilityId, const std::string &deviceId)
207 {
208     USB_HILOGI(MODULE_USB_SERVICE, "OnAddSystemAbility ID = %{public}d", systemAbilityId);
209 }
210 // LCOV_EXCL_STOP
211 
212 // LCOV_EXCL_START
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)213 void UsbService::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
214     int32_t systemAbilityId, const std::string &deviceId)
215 {
216     USB_HILOGI(MODULE_USB_SERVICE, "OnRemoveSystemAbility ID = %{public}d", systemAbilityId);
217     if (systemAbilityId == USB_SYSTEM_ABILITY_ID) {
218         sptr<OHOS::HDI::Usb::V1_2::IUsbInterface> usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
219         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d usbd_ == nullptr: %{public}d",
220             __func__, __LINE__, usbd_ == nullptr);
221         if (usbd_ != nullptr) {
222             usbd_->UnbindUsbdSubscriber(usbdSubscriber_);
223         }
224     }
225 }
226 // LCOV_EXCL_STOP
227 #endif // USB_MANAGER_PASS_THROUGH
228 
229 // LCOV_EXCL_START
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)230 void UsbService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
231 {
232     USB_HILOGI(MODULE_USB_SERVICE, "OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
233     if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
234         Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 1, USB_SYSTEM_ABILITY_ID);
235         Memory::MemMgrClient::GetInstance().SetCritical(getpid(), true, USB_SYSTEM_ABILITY_ID);
236     }
237 }
238 // LCOV_EXCL_STOP
239 
240 // LCOV_EXCL_START
WaitUsbdService()241 void UsbService::WaitUsbdService()
242 {
243     // wait for the usbd service to start and bind usb service and usbd service
244     int32_t retryTimes = 0;
245     while (retryTimes < SERVICE_STARTUP_MAX_TIME) {
246         if (InitUsbd()) {
247             break;
248         }
249         sleep(1);
250         retryTimes++;
251 
252         if (retryTimes == SERVICE_STARTUP_MAX_TIME) {
253             USB_HILOGE(MODULE_USB_SERVICE, "OnStart call initUsbd failed");
254             return;
255         }
256     }
257 }
258 // LCOV_EXCL_STOP
259 
260 // LCOV_EXCL_START
OnStart()261 void UsbService::OnStart()
262 {
263     USB_HILOGI(MODULE_USB_SERVICE, "usb_service OnStart enter");
264     if (ready_) {
265         USB_HILOGE(MODULE_USB_SERVICE, "OnStart is ready, nothing to do");
266         return;
267     }
268 
269     if (!(Init())) {
270         USB_HILOGE(MODULE_USB_SERVICE, "OnStart call init fail");
271         return;
272     }
273 
274     WaitUsbdService();
275 
276 #ifdef USB_MANAGER_FEATURE_PORT
277     if (usbPortManager_ == nullptr) {
278         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
279         return;
280     }
281     usbPortManager_->Init();
282 #endif // USB_MANAGER_FEATURE_PORT
283 #ifdef USB_MANAGER_FEATURE_DEVICE
284     if (usbDeviceManager_ == nullptr) {
285         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
286         return;
287     }
288     (void)usbDeviceManager_->Init();
289     if (!InitSettingsDataHdcStatus()) {
290         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::OnStart update HDC_STATUS failed!");
291     }
292 #endif // USB_MANAGER_FEATURE_DEVICE
293     (void)InitUsbRight();
294     ready_ = true;
295     auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
296 #ifdef USB_MANAGER_PASS_THROUGH
297     sptr<ISystemAbilityStatusChange> status =
298         new (std::nothrow) SystemAbilityStatusChangeListener(usbManagerSubscriber_);
299 #else
300     sptr<ISystemAbilityStatusChange> status = new (std::nothrow) SystemAbilityStatusChangeListener(usbdSubscriber_);
301 #endif // USB_MANAGER_PASS_THROUGH
302     if (samgrProxy == nullptr || status == nullptr) {
303         USB_HILOGE(MODULE_USB_SERVICE, "samgrProxy or SystemAbilityStatusChangeListener is nullptr");
304         return;
305     }
306     int32_t ret = samgrProxy->SubscribeSystemAbility(USB_SYSTEM_ABILITY_ID, status);
307     if (ret != UEC_OK) {
308         USB_HILOGE(MODULE_USB_SERVICE, "SubscribeSystemAbility failed. ret = %{public}d", ret);
309         return;
310     }
311     AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
312     USB_HILOGE(MODULE_USB_SERVICE, "OnStart and add system ability success");
313 }
314 // LCOV_EXCL_STOP
315 
316 // LCOV_EXCL_START
Init()317 bool UsbService::Init()
318 {
319     USB_HILOGI(MODULE_USB_SERVICE, "usb_service Init enter");
320     if (!Publish(g_serviceInstance)) {
321         USB_HILOGE(MODULE_USB_SERVICE, "OnStart register to system ability manager failed.");
322         return false;
323     }
324 
325     while (commEventRetryTimes_ <= COMMEVENT_REGISTER_RETRY_TIMES) {
326         if (!IsCommonEventServiceAbilityExist()) {
327             ++commEventRetryTimes_;
328             usleep(COMMEVENT_REGISTER_WAIT_DELAY_US);
329         } else {
330             commEventRetryTimes_ = 0;
331             break;
332         }
333     }
334     USB_HILOGI(MODULE_USB_SERVICE, "Init success");
335     return true;
336 }
337 // LCOV_EXCL_STOP
338 
339 // LCOV_EXCL_START
340 #ifdef USB_MANAGER_PASS_THROUGH
InitUsbd()341 bool UsbService::InitUsbd()
342 {
343 #ifdef USB_MANAGER_FEATURE_DEVICE
344     if (usbAccessoryManager_ == nullptr || !usbAccessoryManager_->InitUsbAccessoryInterface()) {
345         USB_HILOGE(MODULE_USB_SERVICE, "usbAccessoryManager_ is nullptr or InitUsbAccessoryInterface failed");
346         return false;
347     }
348     if (usbDeviceManager_ == nullptr || !usbDeviceManager_->InitUsbDeviceInterface()) {
349         USB_HILOGE(MODULE_USB_SERVICE, "usbDeviceManager_ is nullptr or InitUsbDeviceInterface failed");
350         return false;
351     }
352 #endif // USB_MANAGER_FEATURE_DEVICE
353 #ifdef USB_MANAGER_FEATURE_PORT
354     if (usbPortManager_ == nullptr || !usbPortManager_->InitUsbPortInterface()) {
355         USB_HILOGE(MODULE_USB_SERVICE, "usbPortManager_ is nullptr or InitUsbPortInterface failed");
356         return false;
357     }
358 #endif // USB_MANAGER_FEATURE_PORT
359 #ifdef USB_MANAGER_FEATURE_HOST
360     if (usbHostManager_ == nullptr || !usbHostManager_->InitUsbHostInterface()) {
361         USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr or InitUsbHostInterface failed");
362         return false;
363     }
364 #endif // USB_MANAGER_FEATURE_HOST
365     return true;
366 }
367 #else
InitUsbd()368 bool UsbService::InitUsbd()
369 {
370     if (usbd_ == nullptr) {
371         usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
372         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d usbd_ == nullptr: %{public}d",
373             __func__, __LINE__, usbd_ == nullptr);
374     } else {
375         USB_HILOGW(MODULE_USB_SERVICE, "%{public}s:usbd_ != nullptr", __func__);
376     }
377     if (usbd_ == nullptr) {
378         USB_HILOGE(MODULE_USB_SERVICE, " get usbd_ is nullptr");
379         return false;
380     }
381     usbdSubscriber_ = new (std::nothrow) UsbServiceSubscriber();
382     if (usbdSubscriber_ == nullptr) {
383         USB_HILOGE(MODULE_USB_SERVICE, "Init failed");
384         return false;
385     }
386     recipient_ = new UsbdDeathRecipient();
387     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<HDI::Usb::V1_0::IUsbInterface>(usbd_);
388     if (!remote->AddDeathRecipient(recipient_)) {
389         USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
390         return false;
391     }
392 
393 #ifdef USB_MANAGER_FEATURE_HOST
394     usbHostManager_ = std::make_shared<UsbHostManager>(nullptr);
395 #endif // USB_MANAGER_FEATURE_HOST
396 #ifdef USB_MANAGER_FEATURE_PORT
397     usbPortManager_ = std::make_shared<UsbPortManager>();
398 #endif // USB_MANAGER_FEATURE_PORT
399 #ifdef USB_MANAGER_FEATURE_DEVICE
400     usbDeviceManager_ = std::make_shared<UsbDeviceManager>();
401     usbAccessoryManager_ = std::make_shared<UsbAccessoryManager>();
402 #endif // USB_MANAGER_FEATURE_DEVICE
403     ErrCode ret = usbd_->BindUsbdSubscriber(usbdSubscriber_);
404     USB_HILOGI(MODULE_USB_SERVICE, "entry InitUsbd ret: %{public}d", ret);
405     return ret == UEC_OK;
406 }
407 #endif // USB_MANAGER_PASS_THROUGH
408 // LCOV_EXCL_STOP
409 
410 // LCOV_EXCL_START
OnStop()411 void UsbService::OnStop()
412 {
413     USB_HILOGI(MODULE_USB_SERVICE, "entry stop service %{public}d", ready_);
414     if (!ready_) {
415         return;
416     }
417     ready_ = false;
418 #ifdef USB_MANAGER_PASS_THROUGH
419 #ifdef USB_MANAGER_FEATURE_HOST
420     if (usbHostManager_ == nullptr) {
421         return;
422     }
423     usbHostManager_->Stop();
424 #endif // USB_MANAGER_FEATURE_HOST
425 #ifdef USB_MANAGER_FEATURE_DEVICE
426     if (usbDeviceManager_ == nullptr) {
427         return;
428     }
429     usbDeviceManager_->Stop();
430 #endif // USB_MANAGER_FEATURE_DEVICE
431 #ifdef USB_MANAGER_FEATURE_PORT
432     if (usbPortManager_ == nullptr) {
433         return;
434     }
435     usbPortManager_->Stop();
436 #endif // USB_MANAGER_FEATURE_PORT
437 #else
438     if (usbd_ == nullptr) {
439         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbd_ is nullptr");
440         return;
441     }
442     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<HDI::Usb::V1_0::IUsbInterface>(usbd_);
443     remote->RemoveDeathRecipient(recipient_);
444     recipient_.clear();
445     usbd_->UnbindUsbdSubscriber(usbdSubscriber_);
446     Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 0, USB_SYSTEM_ABILITY_ID);
447 #endif // USB_MANAGER_PASS_THROUGH
448 }
449 // LCOV_EXCL_STOP
450 
451 // LCOV_EXCL_START
IsCommonEventServiceAbilityExist()452 bool UsbService::IsCommonEventServiceAbilityExist()
453 {
454     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
455     if (sm == nullptr) {
456         USB_HILOGE(MODULE_USB_SERVICE,
457             "IsCommonEventServiceAbilityExist Get ISystemAbilityManager "
458             "failed, no SystemAbilityManager");
459         return false;
460     }
461     sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ID);
462     if (!remote) {
463         USB_HILOGE(MODULE_USB_SERVICE, "No CesServiceAbility");
464         return false;
465     }
466     return true;
467 }
468 // LCOV_EXCL_STOP
469 
470 #ifdef USB_MANAGER_FEATURE_HOST
OpenDevice(uint8_t busNum,uint8_t devAddr)471 int32_t UsbService::OpenDevice(uint8_t busNum, uint8_t devAddr)
472 {
473     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
474         ReportUsbOperationFaultSysEvent("OpenDevice", UEC_SERVICE_PERMISSION_DENIED, "CheckDevicePermission failed");
475         return UEC_SERVICE_PERMISSION_DENIED;
476     }
477 
478     // LCOV_EXCL_START
479     if (usbHostManager_ == nullptr) {
480         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
481         return UEC_SERVICE_INVALID_VALUE;
482     }
483     int32_t ret = usbHostManager_->OpenDevice(busNum, devAddr);
484     if (ret != UEC_OK) {
485         USB_HILOGE(MODULE_USB_SERVICE, "OpenDevice failed ret:%{public}d", ret);
486     }
487 
488     return ret;
489     // LCOV_EXCL_STOP
490 }
491 
Close(uint8_t busNum,uint8_t devAddr)492 int32_t UsbService::Close(uint8_t busNum, uint8_t devAddr)
493 {
494     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
495         return UEC_SERVICE_PERMISSION_DENIED;
496     }
497 
498     // LCOV_EXCL_START
499     if (usbHostManager_ == nullptr) {
500         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
501         return UEC_SERVICE_INVALID_VALUE;
502     }
503     return usbHostManager_->Close(busNum, devAddr);
504     // LCOV_EXCL_STOP
505 }
506 
507 // LCOV_EXCL_START
ResetDevice(uint8_t busNum,uint8_t devAddr)508 int32_t UsbService::ResetDevice(uint8_t busNum, uint8_t devAddr)
509 {
510     std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
511     {
512         std::lock_guard<std::mutex> guard(mutex_);
513         if (deviceVidPidMap_.find(name) == deviceVidPidMap_.end()) {
514             USB_HILOGE(MODULE_USB_SERVICE, "Device not found: %{public}s", name.c_str());
515             return UEC_INTERFACE_NAME_NOT_FOUND;
516         }
517     }
518     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
519         ReportUsbOperationFaultSysEvent("ResetDevice", UEC_SERVICE_PERMISSION_DENIED, "CheckDevicePermission failed");
520         return UEC_SERVICE_PERMISSION_DENIED;
521     }
522 
523     if (usbHostManager_ == nullptr) {
524         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
525         return UEC_SERVICE_INVALID_VALUE;
526     }
527     int32_t ret = usbHostManager_->ResetDevice(busNum, devAddr);
528     if (ret != UEC_OK) {
529         USB_HILOGE(MODULE_USB_SERVICE, "ResetDevice failed ret:%{public}d", ret);
530     }
531 
532     return ret;
533 }
534 // LCOV_EXCL_STOP
535 
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface,uint8_t force)536 int32_t UsbService::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface, uint8_t force)
537 {
538     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
539         return UEC_SERVICE_PERMISSION_DENIED;
540     }
541 
542     // LCOV_EXCL_START
543     if (usbHostManager_ == nullptr) {
544         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
545         return UEC_SERVICE_INVALID_VALUE;
546     }
547     int32_t ret = usbHostManager_->ClaimInterface(busNum, devAddr, interface, force);
548     if (ret != UEC_OK) {
549         USB_HILOGE(MODULE_USB_SERVICE, "claim interface false.");
550     }
551     return ret;
552     // LCOV_EXCL_STOP
553 }
554 
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)555 int32_t UsbService::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
556 {
557     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
558         return UEC_SERVICE_PERMISSION_DENIED;
559     }
560 
561     // LCOV_EXCL_START
562     if (usbHostManager_ == nullptr) {
563         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
564         return UEC_SERVICE_INVALID_VALUE;
565     }
566     return usbHostManager_->SetInterface(busNum, devAddr, interfaceid, altIndex);
567     // LCOV_EXCL_STOP
568 }
569 
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)570 int32_t UsbService::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
571 {
572     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
573         return UEC_SERVICE_PERMISSION_DENIED;
574     }
575 
576     // LCOV_EXCL_START
577     if (usbHostManager_ == nullptr) {
578         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
579         return UEC_SERVICE_INVALID_VALUE;
580     }
581     int32_t ret = usbHostManager_->ReleaseInterface(busNum, devAddr, interface);
582     if (ret == HDF_DEV_ERR_OP) {
583         USB_HILOGE(MODULE_USB_SERVICE, "ReleaseInterface failed.");
584         return UEC_INTERFACE_INVALID_OPERATION;
585     }
586     return ret;
587     // LCOV_EXCL_STOP
588 }
589 
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)590 int32_t UsbService::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
591 {
592     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
593         return UEC_SERVICE_PERMISSION_DENIED;
594     }
595 
596     // LCOV_EXCL_START
597     if (usbHostManager_ == nullptr) {
598         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
599         return UEC_SERVICE_INVALID_VALUE;
600     }
601     return usbHostManager_->SetActiveConfig(busNum, devAddr, configIndex);
602     // LCOV_EXCL_STOP
603 }
604 
ManageGlobalInterface(bool disable)605 int32_t UsbService::ManageGlobalInterface(bool disable)
606 {
607     if (!IsCallerValid()) {
608         USB_HILOGE(MODULE_USB_SERVICE, "not root or edm process.");
609         return UEC_SERVICE_INVALID_OPERATION;
610     }
611     if (PreCallFunction() != UEC_OK) {
612         USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
613         return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
614     }
615     return usbHostManager_->ManageGlobalInterface(disable);
616 }
617 
ManageDevice(int32_t vendorId,int32_t productId,bool disable)618 int32_t UsbService::ManageDevice(int32_t vendorId, int32_t productId, bool disable)
619 {
620     if (!IsCallerValid()) {
621         USB_HILOGE(MODULE_USB_SERVICE, "not root or edm process.");
622         return UEC_SERVICE_INVALID_OPERATION;
623     }
624     if (PreCallFunction() != UEC_OK) {
625         USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
626         return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
627     }
628     return usbHostManager_->ManageDevice(vendorId, productId, disable);
629 }
630 
ManageInterfaceType(const std::vector<UsbDeviceTypeInfo> & devTypeInfo,bool disable)631 int32_t UsbService::ManageInterfaceType(const std::vector<UsbDeviceTypeInfo> &devTypeInfo, bool disable)
632 {
633     if (!IsCallerValid()) {
634         USB_HILOGE(MODULE_USB_SERVICE, "not root or edm process.");
635         return UEC_SERVICE_INVALID_OPERATION;
636     }
637     if (PreCallFunction() != UEC_OK) {
638         USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
639         return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
640     }
641     std::vector<UsbDeviceType> disableType;
642     UsbDeviceTypeChange(disableType, devTypeInfo);
643     return usbHostManager_->ManageInterfaceType(disableType, disable);
644 }
645 
646 // LCOV_EXCL_START
UsbAttachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interface)647 int32_t UsbService::UsbAttachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interface)
648 {
649     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
650         return UEC_SERVICE_PERMISSION_DENIED;
651     }
652 
653     if (usbHostManager_ == nullptr) {
654         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
655         return UEC_SERVICE_INVALID_VALUE;
656     }
657 
658     int32_t ret = usbHostManager_->UsbAttachKernelDriver(busNum, devAddr, interface);
659     if (ret != UEC_OK) {
660         USB_HILOGE(MODULE_USB_SERVICE, "UsbAttachKernelDriver ManageInterface false.");
661     }
662     return ret;
663 }
664 // LCOV_EXCL_STOP
665 
666 // LCOV_EXCL_START
UsbDetachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interface)667 int32_t UsbService::UsbDetachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interface)
668 {
669     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
670         return UEC_SERVICE_PERMISSION_DENIED;
671     }
672 
673     if (usbHostManager_ == nullptr) {
674         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
675         return UEC_SERVICE_INVALID_VALUE;
676     }
677 
678     int32_t ret = usbHostManager_->UsbDetachKernelDriver(busNum, devAddr, interface);
679     if (ret != UEC_OK) {
680         USB_HILOGE(MODULE_USB_SERVICE, "UsbDetachKernelDriver ManageInterface false.");
681     }
682     return ret;
683 }
684 // LCOV_EXCL_STOP
685 
686 // LCOV_EXCL_START
ClearHalt(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)687 int32_t UsbService::ClearHalt(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
688 {
689     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
690         return UEC_SERVICE_PERMISSION_DENIED;
691     }
692 
693     if (usbHostManager_ == nullptr) {
694         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
695         return UEC_SERVICE_INVALID_VALUE;
696     }
697     int32_t ret = usbHostManager_->ClearHalt(busNum, devAddr, interfaceId, endpointId);
698     if (ret != UEC_OK) {
699         USB_HILOGE(MODULE_USB_SERVICE, "ClearHalt error ret:%{public}d", ret);
700     }
701     return ret;
702 }
703 // LCOV_EXCL_STOP
704 
705 // LCOV_EXCL_START
AddDevice(uint8_t busNum,uint8_t devAddr)706 bool UsbService::AddDevice(uint8_t busNum, uint8_t devAddr)
707 {
708     if (usbHostManager_ == nullptr) {
709         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
710         return false;
711     }
712     UsbDevice *devInfo = new (std::nothrow) UsbDevice();
713     if (devInfo == nullptr) {
714         USB_HILOGE(MODULE_USB_SERVICE, "new failed");
715         return false;
716     }
717 
718     int32_t ret = GetDeviceInfo(busNum, devAddr, *devInfo);
719     USB_HILOGI(MODULE_USB_SERVICE, "GetDeviceInfo ret=%{public}d", ret);
720     if (ret != UEC_OK) {
721         delete devInfo;
722         return false;
723     }
724 
725     std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
726     std::string uniqueName = std::to_string(devInfo->GetVendorId()) + "-" + std::to_string(devInfo->GetProductId()) +
727         "-" + devInfo->GetmSerial();
728     USB_HILOGI(MODULE_USB_SERVICE, "map+: %{public}s", name.c_str());
729     {
730         std::lock_guard<std::mutex> guard(mutex_);
731         deviceVidPidMap_.insert(std::pair<std::string, std::string>(name, uniqueName));
732     }
733 
734     usbHostManager_->AddDevice(devInfo);
735     usbHostManager_->ExecuteStrategy(devInfo);
736     return true;
737 }
738 // LCOV_EXCL_STOP
739 
740 // LCOV_EXCL_START
DelDevice(uint8_t busNum,uint8_t devAddr)741 bool UsbService::DelDevice(uint8_t busNum, uint8_t devAddr)
742 {
743     USB_HILOGI(MODULE_USBD, "entry");
744     int32_t ret = Close(busNum, devAddr);
745     if (ret != UEC_OK) {
746         USB_HILOGE(MODULE_USBD, "Close device failed width ret = %{public}d", ret);
747     }
748 
749     if (usbHostManager_ == nullptr || usbRightManager_ == nullptr) {
750         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_ or usbRightManager_");
751         return false;
752     }
753 
754     std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
755     if (!usbRightManager_->RemoveDeviceAllRight(GetDeviceVidPidSerialNumber(name))) {
756         USB_HILOGW(MODULE_USB_SERVICE, "remove right failed: %{public}s", name.c_str());
757     }
758 
759     {
760         std::lock_guard<std::mutex> guard(mutex_);
761         for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
762             if (it->first == name) {
763                 deviceVidPidMap_.erase(it);
764                 break;
765             }
766         }
767     }
768 
769     return usbHostManager_->DelDevice(busNum, devAddr);
770 }
771 // LCOV_EXCL_STOP
772 
GetDevices(std::vector<UsbDevice> & deviceList)773 int32_t UsbService::GetDevices(std::vector<UsbDevice> &deviceList)
774 {
775     if (usbHostManager_ == nullptr) {
776         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
777         return UEC_SERVICE_INVALID_VALUE;
778     }
779     return usbHostManager_->GetDevices(deviceList);
780 }
781 
782 // LCOV_EXCL_START
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)783 int32_t UsbService::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
784 {
785     if (usbHostManager_ == nullptr) {
786         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
787         return UEC_SERVICE_INVALID_VALUE;
788     }
789     return usbHostManager_->GetDeviceInfo(busNum, devAddr, dev);
790 }
791 // LCOV_EXCL_STOP
792 
793 // LCOV_EXCL_START
GetDeviceInfoDescriptor(const UsbDev & uDev,std::vector<uint8_t> & descriptor,UsbDevice & dev)794 int32_t UsbService::GetDeviceInfoDescriptor(const UsbDev &uDev, std::vector<uint8_t> &descriptor, UsbDevice &dev)
795 {
796     if (usbHostManager_ == nullptr) {
797         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
798         return UEC_SERVICE_INVALID_VALUE;
799     }
800     return usbHostManager_->GetDeviceInfoDescriptor(uDev, descriptor, dev);
801 }
802 // LCOV_EXCL_STOP
803 
804 // LCOV_EXCL_START
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & descriptor)805 int32_t UsbService::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &descriptor)
806 {
807     if (usbHostManager_ == nullptr) {
808         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
809         return UEC_SERVICE_INVALID_VALUE;
810     }
811     return usbHostManager_->GetConfigDescriptor(dev, descriptor);
812 }
813 // LCOV_EXCL_STOP
814 
815 // LCOV_EXCL_START
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)816 int32_t UsbService::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
817 {
818     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
819         return UEC_SERVICE_PERMISSION_DENIED;
820     }
821     if (usbHostManager_ == nullptr) {
822         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
823         return UEC_SERVICE_INVALID_VALUE;
824     }
825     return usbHostManager_->GetActiveConfig(busNum, devAddr, configIndex);
826 }
827 // LCOV_EXCL_STOP
828 
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)829 int32_t UsbService::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
830 {
831     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
832         ReportUsbOperationFaultSysEvent("GetRawDescriptor", UEC_SERVICE_PERMISSION_DENIED,
833             "CheckDevicePermission failed");
834         return UEC_SERVICE_PERMISSION_DENIED;
835     }
836 
837     // LCOV_EXCL_START
838     if (usbHostManager_ == nullptr) {
839         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
840         return UEC_SERVICE_INVALID_VALUE;
841     }
842     int32_t ret = usbHostManager_->GetRawDescriptor(busNum, devAddr, bufferData);
843     if (ret != UEC_OK) {
844         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
845     }
846     return ret;
847     // LCOV_EXCL_STOP
848 }
849 
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)850 int32_t UsbService::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
851 {
852     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
853         return UEC_SERVICE_PERMISSION_DENIED;
854     }
855 
856     // LCOV_EXCL_START
857     if (usbHostManager_ == nullptr) {
858         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
859         return UEC_SERVICE_INVALID_VALUE;
860     }
861     int32_t ret = usbHostManager_->GetFileDescriptor(busNum, devAddr, fd);
862     if (ret != UEC_OK) {
863         USB_HILOGE(MODULE_USB_SERVICE, "get fd error ret:%{public}d", ret);
864     }
865     return ret;
866     // LCOV_EXCL_STOP
867 }
868 
869 // LCOV_EXCL_START
GetDeviceSpeed(uint8_t busNum,uint8_t devAddr,uint8_t & speed)870 int32_t UsbService::GetDeviceSpeed(uint8_t busNum, uint8_t devAddr, uint8_t &speed)
871 {
872     if (PreCallFunction() != UEC_OK) {
873         USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
874         return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
875     }
876 
877     int32_t ret = usbHostManager_->GetDeviceSpeed(busNum, devAddr, speed);
878     if (ret != UEC_OK) {
879         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
880     }
881     USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceSpeedImpl:%{public}u", speed);
882     return ret;
883 }
884 // LCOV_EXCL_STOP
885 
886 // LCOV_EXCL_START
GetInterfaceActiveStatus(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,bool & unactivated)887 int32_t UsbService::GetInterfaceActiveStatus(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, bool &unactivated)
888 {
889     if (PreCallFunction() != UEC_OK) {
890         USB_HILOGE(MODULE_USB_SERVICE, "PreCallFunction failed");
891         return UEC_SERVICE_PRE_MANAGE_INTERFACE_FAILED;
892     }
893 
894     int32_t ret = usbHostManager_->GetInterfaceActiveStatus(busNum, devAddr, interfaceid, unactivated);
895     if (ret != UEC_OK) {
896         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
897     }
898     return ret;
899 }
900 // LCOV_EXCL_STOP
901 
902 // LCOV_EXCL_START
GetDeviceProductName(const std::string & deviceName,std::string & productName)903 bool UsbService::GetDeviceProductName(const std::string &deviceName, std::string &productName)
904 {
905     if (usbHostManager_ == nullptr) {
906         USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr");
907         return false;
908     }
909     return usbHostManager_->GetProductName(deviceName, productName);
910 }
911 // LCOV_EXCL_STOP
912 
913 // LCOV_EXCL_START
BulkTransferRead(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,UsbBulkTransData & bufferData,int32_t timeOut)914 int32_t UsbService::BulkTransferRead(
915     uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep, UsbBulkTransData &bufferData, int32_t timeOut)
916 {
917     if (usbHostManager_ == nullptr) {
918         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
919         return UEC_SERVICE_INVALID_VALUE;
920     }
921 
922     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
923     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
924     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
925         MAP_STR_DEVICE devices;
926         usbHostManager_->GetDevices(devices);
927         UsbReportSysEvent::ReportTransferFaultSysEvent("BulkRead", devInfo, pipe,
928             UEC_SERVICE_PERMISSION_DENIED, "checkDevicePermissionFail", devices);
929         return UEC_SERVICE_PERMISSION_DENIED;
930     }
931     int32_t ret = usbHostManager_->BulkTransferRead(devInfo, pipe, bufferData.data_, timeOut);
932     if (ret != UEC_OK) {
933         MAP_STR_DEVICE devices;
934         usbHostManager_->GetDevices(devices);
935         UsbReportSysEvent::CheckAttributeReportTransferFaultSysEvent("BulkRead", devInfo, pipe, ep,
936             ret, "BulkTransferReadFail", devices);
937         USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferRead error ret:%{public}d", ret);
938     }
939     return ret;
940 }
941 // LCOV_EXCL_STOP
942 
943 // LCOV_EXCL_START
BulkTransferReadwithLength(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,int32_t length,UsbBulkTransData & bufferData,int32_t timeOut)944 int32_t UsbService::BulkTransferReadwithLength(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep,
945     int32_t length, UsbBulkTransData &bufferData, int32_t timeOut)
946 {
947     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
948         return UEC_SERVICE_PERMISSION_DENIED;
949     }
950     if (usbHostManager_ == nullptr) {
951         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
952         return UEC_SERVICE_INVALID_VALUE;
953     }
954     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
955     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
956     int32_t ret = usbHostManager_->BulkTransferReadwithLength(devInfo, pipe, length, bufferData.data_, timeOut);
957     if (ret != UEC_OK) {
958         USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferRead error ret:%{public}d", ret);
959     }
960     return ret;
961 }
962 // LCOV_EXCL_STOP
963 
BulkTransferWrite(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,const UsbBulkTransData & bufferData,int32_t timeOut)964 int32_t UsbService::BulkTransferWrite(
965     uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep, const UsbBulkTransData &bufferData, int32_t timeOut)
966 {
967     if (usbHostManager_ == nullptr) {
968         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
969         return UEC_SERVICE_INVALID_VALUE;
970     }
971 
972     HDI::Usb::V1_0::UsbDev dev = {busNum, devAddr};
973     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
974     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
975         MAP_STR_DEVICE devices;
976         usbHostManager_->GetDevices(devices);
977         UsbReportSysEvent::ReportTransferFaultSysEvent("BulkWrite", dev, pipe,
978             UEC_SERVICE_PERMISSION_DENIED, "checkDevicePermissionFail", devices);
979         return UEC_SERVICE_PERMISSION_DENIED;
980     }
981     int32_t ret = usbHostManager_->BulkTransferWrite(dev, pipe, bufferData.data_, timeOut);
982     if (ret != UEC_OK) {
983         MAP_STR_DEVICE devices;
984         usbHostManager_->GetDevices(devices);
985         UsbReportSysEvent::CheckAttributeReportTransferFaultSysEvent("BulkWrite", dev, pipe, ep,
986             UEC_SERVICE_PERMISSION_DENIED, "BulkTransferWriteFail", devices);
987         USB_HILOGE(MODULE_USB_SERVICE, "BulkTransferWrite error ret:%{public}d", ret);
988     }
989     return ret;
990 }
991 
ControlTransfer(uint8_t busNum,uint8_t devAddr,const UsbCtlSetUp & ctrlParams,std::vector<uint8_t> & bufferData)992 int32_t UsbService::ControlTransfer(uint8_t busNum, uint8_t devAddr,
993     const UsbCtlSetUp& ctrlParams, std::vector<uint8_t> &bufferData)
994 {
995     if (usbHostManager_ == nullptr) {
996         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
997         return UEC_SERVICE_INVALID_VALUE;
998     }
999 
1000     HDI::Usb::V1_0::UsbDev dev = {busNum, devAddr};
1001     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1002         MAP_STR_DEVICE devices;
1003         usbHostManager_->GetDevices(devices);
1004         UsbReportSysEvent::ReportTransferFaultSysEvent("ControlTransfer", dev, {0, 0},
1005             UEC_SERVICE_INVALID_VALUE, "checkDevicePermissionFail", devices);
1006         return UEC_SERVICE_PERMISSION_DENIED;
1007     }
1008     HDI::Usb::V1_0::UsbCtrlTransfer ctrl;
1009     UsbCtrlTransferChange(ctrl, ctrlParams);
1010     return usbHostManager_->ControlTransfer(dev, ctrl, bufferData);
1011 }
1012 
1013 // LCOV_EXCL_START
UsbCtrlTransferChange(HDI::Usb::V1_0::UsbCtrlTransfer & param,const UsbCtlSetUp & ctlSetup)1014 void UsbService::UsbCtrlTransferChange(HDI::Usb::V1_0::UsbCtrlTransfer &param, const UsbCtlSetUp &ctlSetup)
1015 {
1016     param.requestType = ctlSetup.reqType;
1017     param.requestCmd = ctlSetup.reqCmd ;
1018     param.value = ctlSetup.value;
1019     param.index = ctlSetup.index;
1020     param.timeout = ctlSetup.length;
1021     return;
1022 }
1023 // LCOV_EXCL_STOP
1024 
1025 // LCOV_EXCL_START
UsbCtrlTransferChange(HDI::Usb::V1_2::UsbCtrlTransferParams & param,const UsbCtlSetUp & ctlSetup)1026 void UsbService::UsbCtrlTransferChange(HDI::Usb::V1_2::UsbCtrlTransferParams &param, const UsbCtlSetUp &ctlSetup)
1027 {
1028     param.requestType = ctlSetup.reqType;
1029     param.requestCmd = ctlSetup.reqCmd ;
1030     param.value = ctlSetup.value;
1031     param.index = ctlSetup.index;
1032     param.length = ctlSetup.length;
1033     param.timeout = ctlSetup.length;
1034     return;
1035 }
1036 // LCOV_EXCL_STOP
1037 
1038 // LCOV_EXCL_START
UsbControlTransfer(uint8_t busNum,uint8_t devAddr,const UsbCtlSetUp & ctrlParams,std::vector<uint8_t> & bufferData)1039 int32_t UsbService::UsbControlTransfer(
1040     uint8_t busNum, uint8_t devAddr, const UsbCtlSetUp& ctrlParams, std::vector<uint8_t> &bufferData)
1041 {
1042     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1043         return UEC_SERVICE_PERMISSION_DENIED;
1044     }
1045 
1046     if (usbHostManager_ == nullptr) {
1047         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1048         return UEC_SERVICE_INVALID_VALUE;
1049     }
1050     HDI::Usb::V1_0::UsbDev dev = {busNum, devAddr};
1051     HDI::Usb::V1_2::UsbCtrlTransferParams ctlSetUp;
1052     UsbCtrlTransferChange(ctlSetUp, ctrlParams);
1053     return usbHostManager_->UsbControlTransfer(dev, ctlSetUp, bufferData);
1054 }
1055 // LCOV_EXCL_STOP
1056 
RequestQueue(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)1057 int32_t UsbService::RequestQueue(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep,
1058     const std::vector<uint8_t> &clientData, const std::vector<uint8_t> &bufferData)
1059 {
1060     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1061         return UEC_SERVICE_PERMISSION_DENIED;
1062     }
1063 
1064     // LCOV_EXCL_START
1065     if (usbHostManager_ == nullptr) {
1066         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1067         return UEC_SERVICE_INVALID_VALUE;
1068     }
1069     HDI::Usb::V1_0::UsbDev dev = {busNum, devAddr};
1070     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1071     int32_t ret = usbHostManager_->RequestQueue(dev, pipe, clientData, bufferData);
1072     if (ret != UEC_OK) {
1073         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1074     }
1075     return ret;
1076     // LCOV_EXCL_STOP
1077 }
1078 
1079 // LCOV_EXCL_START
RequestWait(uint8_t busNum,uint8_t devAddr,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)1080 int32_t UsbService::RequestWait(uint8_t busNum, uint8_t devAddr, int32_t timeOut,
1081     std::vector<uint8_t> &clientData, std::vector<uint8_t> &bufferData)
1082 {
1083     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1084         return UEC_SERVICE_PERMISSION_DENIED;
1085     }
1086 
1087     if (usbHostManager_ == nullptr) {
1088         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1089         return UEC_SERVICE_INVALID_VALUE;
1090     }
1091     HDI::Usb::V1_0::UsbDev dev = {busNum, devAddr};
1092     int32_t ret = usbHostManager_->RequestWait(dev, timeOut, clientData, bufferData);
1093     if (ret != UEC_OK) {
1094         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1095     }
1096     return ret;
1097 }
1098 // LCOV_EXCL_STOP
1099 
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)1100 int32_t UsbService::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
1101 {
1102     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1103         return UEC_SERVICE_PERMISSION_DENIED;
1104     }
1105 
1106     // LCOV_EXCL_START
1107     if (usbHostManager_ == nullptr) {
1108         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1109         return UEC_SERVICE_INVALID_VALUE;
1110     }
1111     return usbHostManager_->RequestCancel(busNum, devAddr, interfaceId, endpointId);
1112     // LCOV_EXCL_STOP
1113 }
1114 
1115 // LCOV_EXCL_START
RegBulkCallback(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,const sptr<IRemoteObject> & cb)1116 int32_t UsbService::RegBulkCallback(uint8_t busNum, uint8_t devAddr,
1117     const USBEndpoint &ep, const sptr<IRemoteObject> &cb)
1118 {
1119     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1120         return UEC_SERVICE_PERMISSION_DENIED;
1121     }
1122 
1123     if (usbHostManager_ == nullptr) {
1124         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1125         return UEC_SERVICE_INVALID_VALUE;
1126     }
1127     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1128     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1129     int32_t ret = usbHostManager_->RegBulkCallback(devInfo, pipe, cb);
1130     if (ret != UEC_OK) {
1131         USB_HILOGE(MODULE_USB_SERVICE, "RegBulkCallback error ret:%{public}d", ret);
1132     }
1133     return ret;
1134 }
1135 // LCOV_EXCL_STOP
1136 
1137 // LCOV_EXCL_START
UsbCancelTransfer(uint8_t busNum,uint8_t devAddr,int32_t endpoint)1138 int32_t UsbService::UsbCancelTransfer(uint8_t busNum, uint8_t devAddr, int32_t endpoint)
1139 {
1140     USB_HILOGI(MODULE_USBD, "UsbService UsbCancelTransfer enter");
1141     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1142         return UEC_SERVICE_PERMISSION_DENIED;
1143     }
1144     if (usbHostManager_ == nullptr) {
1145         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1146         return UEC_SERVICE_INVALID_VALUE;
1147     }
1148     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1149     int32_t ret = usbHostManager_->UsbCancelTransfer(devInfo, endpoint);
1150     if (ret != UEC_OK) {
1151         USB_HILOGE(MODULE_USB_SERVICE, "UsbCancelTransfer error ret:%{public}d", ret);
1152     }
1153     return ret;
1154 }
1155 // LCOV_EXCL_STOP
1156 
1157 // LCOV_EXCL_START
UsbTransInfoChange(HDI::Usb::V1_2::USBTransferInfo & info,const UsbTransInfo & param)1158 void UsbService::UsbTransInfoChange(HDI::Usb::V1_2::USBTransferInfo &info, const UsbTransInfo &param)
1159 {
1160     info.endpoint = param.endpoint;
1161     info.flags = param.flags;
1162     info.type = param.type;
1163     info.timeOut = param.timeOut;
1164     info.length = param.length;
1165     info.userData = param.userData;
1166     info.numIsoPackets = param.numIsoPackets;
1167     return;
1168 }
1169 // LCOV_EXCL_STOP
1170 
1171 // LCOV_EXCL_START
UsbSubmitTransfer(uint8_t busNum,uint8_t devAddr,const UsbTransInfo & param,const sptr<IRemoteObject> & cb,int32_t fd,int32_t memSize)1172 int32_t UsbService::UsbSubmitTransfer(uint8_t busNum, uint8_t devAddr, const UsbTransInfo &param,
1173     const sptr<IRemoteObject> &cb, int32_t fd, int32_t memSize)
1174 {
1175     USB_HILOGI(MODULE_USBD, "UsbService UsbSubmitTransfer enter");
1176     if (cb == nullptr) {
1177         USB_HILOGE(MODULE_USB_SERVICE, "UsbService UsbSubmitTransfer cb is nullptr");
1178         return UEC_SERVICE_INVALID_VALUE;
1179     }
1180     HDI::Usb::V1_2::USBTransferInfo info;
1181     UsbTransInfoChange(info, param);
1182     sptr<Ashmem> ashmem = new Ashmem(fd, memSize);
1183     if (ashmem == nullptr) {
1184         USB_HILOGE(MODULE_USB_SERVICE, "UsbService UsbSubmitTransfer error ashmem");
1185         return UEC_SERVICE_INVALID_VALUE;
1186     }
1187     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1188         return UEC_SERVICE_PERMISSION_DENIED;
1189     }
1190     if (usbHostManager_ == nullptr) {
1191         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1192         return UEC_SERVICE_INVALID_VALUE;
1193     }
1194     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1195     int32_t ret = usbHostManager_->UsbSubmitTransfer(devInfo, info, cb, ashmem);
1196     return ret;
1197 }
1198 // LCOV_EXCL_STOP
1199 
UnRegBulkCallback(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep)1200 int32_t UsbService::UnRegBulkCallback(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep)
1201 {
1202     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1203         return UEC_SERVICE_PERMISSION_DENIED;
1204     }
1205 
1206     // LCOV_EXCL_START
1207     if (usbHostManager_ == nullptr) {
1208         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1209         return UEC_SERVICE_INVALID_VALUE;
1210     }
1211     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1212     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1213     int32_t ret = usbHostManager_->UnRegBulkCallback(devInfo, pipe);
1214     if (ret != UEC_OK) {
1215         USB_HILOGE(MODULE_USB_SERVICE, "UnRegBulkCallback error ret:%{public}d", ret);
1216     }
1217     return ret;
1218     // LCOV_EXCL_STOP
1219 }
1220 
BulkRead(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,int32_t fd,int32_t memSize)1221 int32_t UsbService::BulkRead(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep, int32_t fd, int32_t memSize)
1222 {
1223     if (usbHostManager_ == nullptr) {
1224         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1225         return UEC_SERVICE_INVALID_VALUE;
1226     }
1227 
1228     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1229     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1230     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1231         MAP_STR_DEVICE devices;
1232         usbHostManager_->GetDevices(devices);
1233         UsbReportSysEvent::ReportTransferFaultSysEvent("BulkRead", devInfo, pipe,
1234             UEC_SERVICE_PERMISSION_DENIED, "checkDevicePermissionFail", devices);
1235         return UEC_SERVICE_PERMISSION_DENIED;
1236     }
1237     sptr<Ashmem> ashmem = new Ashmem(fd, memSize);
1238     int32_t ret = usbHostManager_->BulkRead(devInfo, pipe, ashmem);
1239     if (ret != UEC_OK) {
1240         MAP_STR_DEVICE devices;
1241         usbHostManager_->GetDevices(devices);
1242         UsbReportSysEvent::CheckAttributeReportTransferFaultSysEvent("BulkRead", devInfo, pipe, ep,
1243             ret, "BulkReadFail", devices);
1244         USB_HILOGE(MODULE_USB_SERVICE, "BulkRead error ret:%{public}d", ret);
1245     }
1246     return ret;
1247 }
1248 
BulkWrite(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep,int32_t fd,int32_t memSize)1249 int32_t UsbService::BulkWrite(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep, int32_t fd, int32_t memSize)
1250 {
1251     if (usbHostManager_ == nullptr) {
1252         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1253         return UEC_SERVICE_INVALID_VALUE;
1254     }
1255 
1256     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1257     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1258     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1259         MAP_STR_DEVICE devices;
1260         usbHostManager_->GetDevices(devices);
1261         UsbReportSysEvent::ReportTransferFaultSysEvent("BulkWrite", devInfo, pipe,
1262             UEC_SERVICE_PERMISSION_DENIED, "checkDevicePermissionFail", devices);
1263         return UEC_SERVICE_PERMISSION_DENIED;
1264     }
1265     sptr<Ashmem> ashmem = new Ashmem(fd, memSize);
1266     int32_t ret = usbHostManager_->BulkWrite(devInfo, pipe, ashmem);
1267     if (ret != UEC_OK) {
1268         MAP_STR_DEVICE devices;
1269         usbHostManager_->GetDevices(devices);
1270         UsbReportSysEvent::CheckAttributeReportTransferFaultSysEvent("BulkWrite", devInfo, pipe, ep,
1271             ret, "BulkWriteFail", devices);
1272         USB_HILOGE(MODULE_USB_SERVICE, "BulkWrite error ret:%{public}d", ret);
1273     }
1274     return ret;
1275 }
1276 
BulkCancel(uint8_t busNum,uint8_t devAddr,const USBEndpoint & ep)1277 int32_t UsbService::BulkCancel(uint8_t busNum, uint8_t devAddr, const USBEndpoint &ep)
1278 {
1279     if (!UsbService::CheckDevicePermission(busNum, devAddr)) {
1280         return UEC_SERVICE_PERMISSION_DENIED;
1281     }
1282 
1283     // LCOV_EXCL_START
1284     if (usbHostManager_ == nullptr) {
1285         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbHostManager_ is nullptr");
1286         return UEC_SERVICE_INVALID_VALUE;
1287     }
1288     HDI::Usb::V1_0::UsbDev devInfo = {busNum, devAddr};
1289     UsbPipe pipe = {ep.GetInterfaceId(), ep.GetAddress()};
1290     int32_t ret = usbHostManager_->BulkCancel(devInfo, pipe);
1291     if (ret != UEC_OK) {
1292         USB_HILOGE(MODULE_USB_SERVICE, "BulkCancel error ret:%{public}d", ret);
1293     }
1294     return ret;
1295     // LCOV_EXCL_STOP
1296 }
1297 
CheckDevicePermission(uint8_t busNum,uint8_t devAddr)1298 bool UsbService::CheckDevicePermission(uint8_t busNum, uint8_t devAddr)
1299 {
1300     std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
1301     if (!UsbService::HasRight(name)) {
1302         USB_HILOGE(MODULE_USB_SERVICE, "No permission");
1303         return false;
1304     }
1305     return true;
1306 }
1307 
1308 // LCOV_EXCL_START
HasRight(const std::string & deviceName,bool & hasRight)1309 int32_t UsbService::HasRight(const std::string &deviceName, bool &hasRight)
1310 {
1311     hasRight = this->HasRight(deviceName);
1312     return UEC_OK;
1313 }
1314 // LCOV_EXCL_STOP
1315 
HasRight(const std::string & deviceName)1316 bool UsbService::HasRight(const std::string &deviceName)
1317 {
1318     USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager HasRight");
1319     if (usbRightManager_ == nullptr) {
1320         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1321         return false;
1322     }
1323 
1324     std::string deviceVidPidSerialNum = "";
1325     if (GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum) != UEC_OK) {
1326         USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1327         return false;
1328     }
1329 
1330     // LCOV_EXCL_START
1331     if (usbRightManager_->IsSystemAppOrSa()) {
1332         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
1333         return true;
1334     }
1335 
1336     std::string bundleName;
1337     std::string tokenId;
1338     int32_t userId = USB_RIGHT_USERID_INVALID;
1339     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1340         USB_HILOGE(MODULE_USB_SERVICE, "HasRight GetCallingInfo false");
1341         return false;
1342     }
1343 
1344     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s", bundleName.c_str(), deviceName.c_str());
1345     if (usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
1346         return true;
1347     }
1348 
1349     return usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId);
1350     // LCOV_EXCL_STOP
1351 }
1352 
1353 // LCOV_EXCL_START
RequestRight(const std::string & deviceName)1354 int32_t UsbService::RequestRight(const std::string &deviceName)
1355 {
1356     USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager RequestRight");
1357     if (usbRightManager_ == nullptr) {
1358         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1359         return UEC_SERVICE_INNER_ERR;
1360     }
1361     std::string deviceVidPidSerialNum = "";
1362     int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1363     if (ret != UEC_OK) {
1364         USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1365         return ret;
1366     }
1367     if (usbRightManager_->IsSystemAppOrSa()) {
1368         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
1369         return UEC_OK;
1370     }
1371     std::string bundleName;
1372     std::string tokenId;
1373     int32_t userId = USB_RIGHT_USERID_INVALID;
1374     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1375         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1376         return false;
1377     }
1378 
1379     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s", bundleName.c_str(), deviceName.c_str());
1380     return usbRightManager_->RequestRight(deviceName, deviceVidPidSerialNum, bundleName, tokenId, userId);
1381 }
1382 // LCOV_EXCL_STOP
1383 
RemoveRight(const std::string & deviceName)1384 int32_t UsbService::RemoveRight(const std::string &deviceName)
1385 {
1386     if (usbRightManager_ == nullptr) {
1387         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1388         return UEC_SERVICE_INVALID_VALUE;
1389     }
1390     std::string deviceVidPidSerialNum = "";
1391     int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1392     if (ret != UEC_OK) {
1393         USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1394         return ret;
1395     }
1396     if (usbRightManager_->IsSystemAppOrSa()) {
1397         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
1398         return UEC_OK;
1399     }
1400     // LCOV_EXCL_START
1401     std::string bundleName;
1402     std::string tokenId;
1403     int32_t userId = USB_RIGHT_USERID_INVALID;
1404     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1405         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1406         return false;
1407     }
1408 
1409     if (usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
1410         USB_HILOGI(MODULE_USB_SERVICE, "RemoveDeviceRight done");
1411         return UEC_OK;
1412     }
1413 
1414     if (!usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId)) {
1415         USB_HILOGE(MODULE_USB_SERVICE, "RemoveDeviceRight failed");
1416         return UEC_SERVICE_INNER_ERR;
1417     }
1418     USB_HILOGI(MODULE_USB_SERVICE, "RemoveRight done");
1419     return UEC_OK;
1420     // LCOV_EXCL_STOP
1421 }
1422 
AddRight(const std::string & bundleName,const std::string & deviceName)1423 int32_t UsbService::AddRight(const std::string &bundleName, const std::string &deviceName)
1424 {
1425     if (usbRightManager_ == nullptr) {
1426         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1427         return UEC_SERVICE_INVALID_VALUE;
1428     }
1429     std::string deviceVidPidSerialNum = "";
1430     int32_t ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1431     if (ret != UEC_OK) {
1432         USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1433         return ret;
1434     }
1435     // LCOV_EXCL_START
1436     ret = CheckSysApiPermission();
1437     if (ret != UEC_OK) {
1438         return ret;
1439     }
1440     std::string tokenId;
1441     int32_t userId = USB_RIGHT_USERID_INVALID;
1442     if (!GetBundleInfo(tokenId, userId)) {
1443         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1444         return false;
1445     }
1446     USB_HILOGI(MODULE_USB_SERVICE, "AddRight bundleName = %{public}s, deviceName = %{public}s", bundleName.c_str(),
1447         deviceName.c_str());
1448     if (!usbRightManager_->AddDeviceRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
1449         USB_HILOGE(MODULE_USB_SERVICE, "AddDeviceRight failed");
1450         return UEC_SERVICE_INNER_ERR;
1451     }
1452     USB_HILOGI(MODULE_USB_SERVICE, "AddRight done");
1453     return UEC_OK;
1454     // LCOV_EXCL_STOP
1455 }
1456 
1457 // LCOV_EXCL_START
AddAccessRight(const std::string & tokenId,const std::string & deviceName)1458 int32_t UsbService::AddAccessRight(const std::string &tokenId, const std::string &deviceName)
1459 {
1460     if (usbRightManager_ == nullptr) {
1461         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1462         return UEC_SERVICE_INVALID_VALUE;
1463     }
1464     int32_t ret = CheckSysApiPermission();
1465     if (ret != UEC_OK) {
1466         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1467         return ret;
1468     }
1469     std::string deviceVidPidSerialNum = "";
1470     ret = GetDeviceVidPidSerialNumber(deviceName, deviceVidPidSerialNum);
1471     if (ret != UEC_OK) {
1472         USB_HILOGE(MODULE_USB_SERVICE, "can not find deviceName.");
1473         return ret;
1474     }
1475     USB_HILOGI(MODULE_USB_SERVICE, "AddRight deviceName = %{public}s", deviceName.c_str());
1476     if (!usbRightManager_->AddDeviceRight(deviceVidPidSerialNum, tokenId)) {
1477         USB_HILOGE(MODULE_USB_SERVICE, "AddDeviceRight failed");
1478         return UEC_SERVICE_INNER_ERR;
1479     }
1480     USB_HILOGI(MODULE_USB_SERVICE, "AddRight done");
1481     return UEC_OK;
1482 }
1483 // LCOV_EXCL_STOP
1484 
1485 // LCOV_EXCL_START
GetBundleInfo(std::string & tokenId,int32_t & userId)1486 bool UsbService::GetBundleInfo(std::string &tokenId, int32_t &userId)
1487 {
1488     OHOS::Security::AccessToken::AccessTokenID token = IPCSkeleton::GetCallingTokenID();
1489     OHOS::Security::AccessToken::HapTokenInfo hapTokenInfoRes;
1490     int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenInfo(token, hapTokenInfoRes);
1491     if (ret != ERR_OK) {
1492         USB_HILOGE(MODULE_USB_SERVICE, "failed, ret: %{public}d", ret);
1493         return false;
1494     }
1495     tokenId = USB_DEFAULT_TOKEN;
1496     userId = hapTokenInfoRes.userID;
1497     return true;
1498 }
1499 // LCOV_EXCL_STOP
1500 
1501 // LCOV_EXCL_START
UsbDeviceTypeChange(std::vector<UsbDeviceType> & disableType,const std::vector<UsbDeviceTypeInfo> & deviceTypes)1502 void UsbService::UsbDeviceTypeChange(std::vector<UsbDeviceType> &disableType,
1503     const std::vector<UsbDeviceTypeInfo> &deviceTypes)
1504 {
1505     for (size_t i = 0; i < deviceTypes.size(); i++) {
1506         UsbDeviceType info;
1507         info.baseClass = deviceTypes[i].baseClass;
1508         info.subClass = deviceTypes[i].subClass;
1509         info.protocol = deviceTypes[i].protocol;
1510         info.isDeviceType = deviceTypes[i].isDeviceType;
1511         disableType.push_back(info);
1512     }
1513     return;
1514 }
1515 // LCOV_EXCL_STOP
1516 
1517 // LCOV_EXCL_START
GetDeviceVidPidSerialNumber(const std::string & deviceName)1518 std::string UsbService::GetDeviceVidPidSerialNumber(const std::string &deviceName)
1519 {
1520     std::string strDesc = "test";
1521     std::lock_guard<std::mutex> guard(mutex_);
1522     for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
1523         USB_HILOGI(MODULE_USB_SERVICE, " it->first = %{public}s", it->first.c_str());
1524         if (it->first == deviceName) {
1525             strDesc = it->second;
1526             break;
1527         }
1528     }
1529     return strDesc;
1530 }
1531 // LCOV_EXCL_STOP
1532 
GetDeviceVidPidSerialNumber(const std::string & deviceName,std::string & strDesc)1533 int32_t UsbService::GetDeviceVidPidSerialNumber(const std::string &deviceName, std::string& strDesc)
1534 {
1535     int32_t isMatched = UEC_INTERFACE_INVALID_VALUE;
1536     std::lock_guard<std::mutex> guard(mutex_);
1537     for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
1538         USB_HILOGI(MODULE_USB_SERVICE, " it->first = %{public}s", it->first.c_str());
1539         if (it->first == deviceName) {
1540             strDesc = it->second;
1541             isMatched = UEC_OK;
1542             break;
1543         }
1544     }
1545     return isMatched;
1546 }
1547 
1548 // LCOV_EXCL_START
PreCallFunction()1549 int32_t UsbService::PreCallFunction()
1550 {
1551 #ifdef USB_MANAGER_PASS_THROUGH
1552     sptr<HDI::Usb::V2_0::IUsbHostInterface> usbHostInterface_ =
1553         HDI::Usb::V2_0::IUsbHostInterface::Get("usb_host_interface_service", true);
1554     if (usbHostInterface_ == nullptr) {
1555         USB_HILOGE(MODULE_USB_SERVICE, "usbHostInterface_ is nullptr");
1556         return UEC_SERVICE_INVALID_VALUE;
1557     }
1558 #else
1559     if (usbd_ == nullptr) {
1560         usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
1561         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d usbd_ == nullptr: %{public}d",
1562             __func__, __LINE__, usbd_ == nullptr);
1563     } else {
1564         USB_HILOGW(MODULE_USB_SERVICE, "%{public}s:usbd_ != nullptr", __func__);
1565     }
1566     if (usbd_ == nullptr) {
1567         USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1568         return UEC_SERVICE_INVALID_VALUE;
1569     }
1570 #endif // USB_MANAGER_PASS_THROUGH
1571     if (usbRightManager_ == nullptr) {
1572         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1573         return UEC_SERVICE_INVALID_VALUE;
1574     }
1575     int32_t ret = CheckSysApiPermission();
1576     if (ret != UEC_OK) {
1577         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1578         return ret;
1579     }
1580     if (usbHostManager_ == nullptr) {
1581         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_");
1582         return UEC_SERVICE_INVALID_VALUE;
1583     }
1584 
1585     return UEC_OK;
1586 }
1587 // LCOV_EXCL_STOP
1588 #endif // USB_MANAGER_FEATURE_HOST
1589 
1590 #ifdef USB_MANAGER_FEATURE_DEVICE
GetCurrentFunctions(int32_t & functions)1591 int32_t UsbService::GetCurrentFunctions(int32_t &functions)
1592 {
1593     if (usbRightManager_ == nullptr) {
1594         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1595         return UEC_SERVICE_INVALID_VALUE;
1596     }
1597     int32_t ret = CheckSysApiPermission();
1598     if (ret != UEC_OK) {
1599         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1600         ReportUsbOperationFaultSysEvent("FUNCTION_CHANGED", ret, "CheckSysApiPermission failed");
1601         return ret;
1602     }
1603     // LCOV_EXCL_START
1604     if (usbDeviceManager_ == nullptr) {
1605         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbDeviceManager_ is nullptr");
1606         return UEC_SERVICE_INVALID_VALUE;
1607     }
1608     return usbDeviceManager_->GetCurrentFunctions(functions);
1609     // LCOV_EXCL_STOP
1610 }
1611 
SetCurrentFunctions(int32_t functions)1612 int32_t UsbService::SetCurrentFunctions(int32_t functions)
1613 {
1614     USB_HILOGI(MODULE_USB_SERVICE, "func = %{public}d", functions);
1615     if (usbRightManager_ == nullptr) {
1616         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1617         return UEC_SERVICE_INVALID_VALUE;
1618     }
1619     int32_t ret = CheckSysApiPermission();
1620     if (ret != UEC_OK) {
1621         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1622         ReportUsbOperationFaultSysEvent("FUNCTION_CHANGED", ret, "CheckSysApiPermission failed");
1623         return ret;
1624     }
1625     ret = usbRightManager_->HasSetFuncRight(functions);
1626     if (ret != 0) {
1627         USB_HILOGE(MODULE_USB_SERVICE, "HasSetFuncRight fail");
1628         ReportUsbOperationFaultSysEvent("FUNCTION_CHANGED", ret, "HasSetFuncRight fail");
1629         return ret;
1630     }
1631     if (usbDeviceManager_ == nullptr) {
1632         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbDeviceManager_ is nullptr");
1633         return UEC_SERVICE_INVALID_VALUE;
1634     }
1635     if (!SetSettingsDataHdcStatus(functions)) {
1636         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SetHdcStatus failed, function is: %{public}d", __func__, functions);
1637     }
1638     return usbDeviceManager_->SetCurrentFunctions(functions);
1639 }
1640 
UsbFunctionsFromString(const std::string & funcs,int32_t & funcResult)1641 int32_t UsbService::UsbFunctionsFromString(const std::string &funcs, int32_t &funcResult)
1642 {
1643     if (usbRightManager_ == nullptr) {
1644         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1645         funcResult = UEC_SERVICE_INVALID_VALUE;
1646         return UEC_OK;
1647     }
1648     int32_t ret = CheckSysApiPermission();
1649     if (ret != UEC_OK) {
1650         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1651         funcResult = ret;
1652         return UEC_OK;
1653     }
1654     USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsFromString");
1655     funcResult = static_cast<int32_t>(UsbDeviceManager::ConvertFromString(funcs));
1656     return UEC_OK;
1657 }
1658 
UsbFunctionsToString(int32_t funcs,std::string & funcResult)1659 int32_t UsbService::UsbFunctionsToString(int32_t funcs, std::string& funcResult)
1660 {
1661     if (usbRightManager_ == nullptr) {
1662         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
1663         funcResult = "";
1664         return UEC_OK;
1665     }
1666     if (!usbRightManager_->IsSystemAppOrSa()) {
1667         funcResult = PERMISSION_DENIED_SYSAPI;
1668         return UEC_OK;
1669     }
1670     if (!usbRightManager_->VerifyPermission()) {
1671         int32_t apiVersion = GetHapApiVersion();
1672         if (apiVersion < API_VERSION_ID_18) {
1673             funcResult = PERMISSION_DENIED_SYSAPI;
1674             return UEC_OK;
1675         }
1676         funcResult = SYS_APP_PERMISSION_DENIED_SYSAPI;
1677         return UEC_OK;
1678     }
1679 
1680     USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsToString");
1681     funcResult = UsbDeviceManager::ConvertToString(funcs);
1682     return UEC_OK;
1683 }
1684 
1685 // LCOV_EXCL_START
UpdateDeviceState(int32_t status)1686 void UsbService::UpdateDeviceState(int32_t status)
1687 {
1688     if (usbDeviceManager_ == nullptr) {
1689         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
1690         return;
1691     }
1692 
1693     usbDeviceManager_->HandleEvent(status);
1694 
1695     if (usbAccessoryManager_ == nullptr) {
1696         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbAccessoryManager_");
1697         return;
1698     }
1699     usbAccessoryManager_->HandleEvent(status);
1700 }
1701 // LCOV_EXCL_STOP
1702 
1703 // LCOV_EXCL_START
UserChangeProcess()1704 int32_t UsbService::UserChangeProcess()
1705 {
1706     if (usbDeviceManager_ == nullptr) {
1707         USB_HILOGE(MODULE_USB_SERVICE, "usbDeviceManager_ is nullptr");
1708         return UEC_SERVICE_INVALID_VALUE;
1709     }
1710 #ifdef USB_MANAGER_FEATURE_PORT
1711     if (usbPortManager_ == nullptr) {
1712         USB_HILOGE(MODULE_USB_SERVICE, "usbPortManager_ is nullptr");
1713         return UEC_SERVICE_INVALID_VALUE;
1714     }
1715     bool res = usbPortManager_->IsReverseCharge();
1716     usbDeviceManager_->SetChargeFlag(res);
1717 #endif // USB_MANAGER_FEATURE_PORT
1718     return usbDeviceManager_->UserChangeProcess();
1719 }
1720 // LCOV_EXCL_STOP
1721 
1722 // LCOV_EXCL_START
GetAccessoryList(std::vector<USBAccessory> & accessList)1723 int32_t UsbService::GetAccessoryList(std::vector<USBAccessory> &accessList)
1724 {
1725     if (usbAccessoryManager_ == nullptr) {
1726         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbAccessoryManager_");
1727         return UEC_SERVICE_INVALID_VALUE;
1728     }
1729     std::string bundleName;
1730     std::string tokenId;
1731     int32_t userId = USB_RIGHT_USERID_INVALID;
1732     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1733         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1734         ReportUsbOperationFaultSysEvent("GetAccessoryList ", UEC_SERVICE_INNER_ERR, "GetCallingInfo false");
1735         return UEC_SERVICE_INNER_ERR;
1736     }
1737 
1738     usbAccessoryManager_->GetAccessoryList(bundleName, accessList);
1739     USB_HILOGD(MODULE_USB_SERVICE, "get accessory list size %{public}zu", accessList.size());
1740     return UEC_OK;
1741 }
1742 // LCOV_EXCL_STOP
1743 
1744 // LCOV_EXCL_START
OpenAccessory(const USBAccessory & access,int32_t & fd)1745 int32_t UsbService::OpenAccessory(const USBAccessory &access, int32_t &fd)
1746 {
1747     if (usbAccessoryManager_ == nullptr) {
1748         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbAccessoryManager_");
1749         return UEC_SERVICE_INVALID_VALUE;
1750     }
1751     std::string bundleName;
1752     std::string tokenId;
1753     int32_t userId = USB_RIGHT_USERID_INVALID;
1754     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1755         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1756         ReportUsbOperationFaultSysEvent("OpenAccessory", UEC_SERVICE_GET_TOKEN_INFO_FAILED, "GetCallingInfo false");
1757         return UEC_SERVICE_GET_TOKEN_INFO_FAILED;
1758     }
1759 
1760     std::string serialNum = "";
1761     int32_t ret = usbAccessoryManager_->GetAccessorySerialNumber(access, bundleName, serialNum);
1762     if (ret != UEC_OK) {
1763         USB_HILOGE(MODULE_USB_SERVICE, "can not find accessory.");
1764         ReportUsbOperationFaultSysEvent("OpenAccessory", ret, "can not find accessory");
1765         return ret;
1766     }
1767 
1768     bool result = false;
1769     ret = UsbService::HasAccessoryRight(access, result);
1770     if (ret != UEC_OK || !result) {
1771         USB_HILOGE(MODULE_USB_SERVICE, "No permission");
1772         ReportUsbOperationFaultSysEvent("OpenAccessory", UEC_SERVICE_PERMISSION_DENIED, "No permission");
1773         return UEC_SERVICE_PERMISSION_DENIED;
1774     }
1775 
1776     ret = usbAccessoryManager_->OpenAccessory(fd);
1777     if (ret != UEC_OK) {
1778         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1779     }
1780     return ret;
1781 }
1782 // LCOV_EXCL_STOP
1783 
1784 // LCOV_EXCL_START
CloseAccessory(int32_t fd)1785 int32_t UsbService::CloseAccessory(int32_t fd)
1786 {
1787     if (usbAccessoryManager_ == nullptr) {
1788         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbAccessoryManager_");
1789         return UEC_SERVICE_INVALID_VALUE;
1790     }
1791     int32_t ret = usbAccessoryManager_->CloseAccessory(fd);
1792     if (ret != UEC_OK) {
1793         USB_HILOGE(MODULE_USB_SERVICE, "error ret:%{public}d", ret);
1794     }
1795     return ret;
1796 }
1797 // LCOV_EXCL_STOP
1798 
1799 // LCOV_EXCL_START
AddAccessoryRight(const uint32_t tokenId,const USBAccessory & access)1800 int32_t UsbService::AddAccessoryRight(const uint32_t tokenId, const USBAccessory &access)
1801 {
1802     if (usbRightManager_ == nullptr || usbAccessoryManager_ == nullptr) {
1803         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_ or usbAccessoryManager_");
1804         return UEC_SERVICE_INVALID_VALUE;
1805     }
1806     int32_t ret = CheckSysApiPermission();
1807     if (ret != UEC_OK) {
1808         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
1809         return ret;
1810     }
1811 
1812     HapTokenInfo hapTokenInfoRes;
1813     ret = AccessTokenKit::GetHapTokenInfo((AccessTokenID) tokenId, hapTokenInfoRes);
1814     if (ret != UEC_OK) {
1815         USB_HILOGE(MODULE_USB_SERVICE, "GetHapTokenInfo failed:ret:%{public}d", ret);
1816         return UEC_SERVICE_GET_TOKEN_INFO_FAILED;
1817     }
1818 
1819     std::string serialNum = "";
1820     ret = usbAccessoryManager_->GetAccessorySerialNumber(access, hapTokenInfoRes.bundleName, serialNum);
1821     if (ret != UEC_OK) {
1822         USB_HILOGE(MODULE_USB_SERVICE, "can not find accessory.");
1823         return ret;
1824     }
1825 
1826     USB_HILOGI(MODULE_USB_SERVICE, "Add accessory Right, deviceName = %{public}s", serialNum.c_str());
1827     if (!usbRightManager_->AddDeviceRight(serialNum, std::to_string(tokenId))) {
1828         USB_HILOGE(MODULE_USB_SERVICE, "AddDeviceRight failed");
1829         return UEC_SERVICE_DATABASE_OPERATION_FAILED;
1830     }
1831     USB_HILOGI(MODULE_USB_SERVICE, "AddAccessoryRight done");
1832     return UEC_OK;
1833 }
1834 // LCOV_EXCL_STOP
1835 
1836 // LCOV_EXCL_START
HasAccessoryRight(const USBAccessory & access,bool & result)1837 int32_t UsbService::HasAccessoryRight(const USBAccessory &access, bool &result)
1838 {
1839     USB_HILOGI(MODULE_USB_SERVICE, "calling HasAccessoryRight");
1840     if (usbRightManager_ == nullptr || usbAccessoryManager_ == nullptr) {
1841         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_ or usbAccessoryManager_");
1842         return UEC_SERVICE_INVALID_VALUE;
1843     }
1844 
1845     std::string bundleName;
1846     std::string tokenId;
1847     int32_t userId = USB_RIGHT_USERID_INVALID;
1848     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1849         USB_HILOGE(MODULE_USB_SERVICE, "HasRight GetCallingInfo false");
1850         return UEC_SERVICE_GET_TOKEN_INFO_FAILED;
1851     }
1852 
1853     std::string serialNum = "";
1854     int32_t ret = usbAccessoryManager_->GetAccessorySerialNumber(access, bundleName, serialNum);
1855     if (ret != UEC_OK) {
1856         USB_HILOGE(MODULE_USB_SERVICE, "can not find accessory.");
1857         return ret;
1858     }
1859 
1860     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, serialNum=%{public}s", bundleName.c_str(), serialNum.c_str());
1861     result = usbRightManager_->HasRight(serialNum, bundleName, tokenId, userId);
1862 
1863     return UEC_OK;
1864 }
1865 // LCOV_EXCL_STOP
1866 
1867 // LCOV_EXCL_START
RequestAccessoryRight(const USBAccessory & access,bool & result)1868 int32_t UsbService::RequestAccessoryRight(const USBAccessory &access, bool &result)
1869 {
1870     USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager RequestAccessoryRight");
1871     if (usbRightManager_ == nullptr || usbAccessoryManager_ == nullptr) {
1872         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_ or usbAccessoryManager_");
1873         return UEC_SERVICE_INVALID_VALUE;
1874     }
1875 
1876     std::string bundleName;
1877     std::string tokenId;
1878     int32_t userId = USB_RIGHT_USERID_INVALID;
1879     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1880         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1881         return UEC_SERVICE_GET_TOKEN_INFO_FAILED;
1882     }
1883 
1884     std::string serialNum = "";
1885     int32_t ret = usbAccessoryManager_->GetAccessorySerialNumber(access, bundleName, serialNum);
1886     if (ret != UEC_OK) {
1887         USB_HILOGE(MODULE_USB_SERVICE, "can not find accessory.");
1888         return ret;
1889     }
1890 
1891     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s", bundleName.c_str(), serialNum.c_str());
1892     return usbRightManager_->RequestRight(access, serialNum, bundleName, tokenId, userId, result);
1893 }
1894 // LCOV_EXCL_STOP
1895 
1896 // LCOV_EXCL_START
CancelAccessoryRight(const USBAccessory & access)1897 int32_t UsbService::CancelAccessoryRight(const USBAccessory &access)
1898 {
1899     USB_HILOGI(MODULE_USB_SERVICE, "calling CancelAccessoryRight");
1900     if (usbRightManager_ == nullptr || usbAccessoryManager_ == nullptr) {
1901         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_ or usbAccessoryManager_");
1902         return UEC_SERVICE_INVALID_VALUE;
1903     }
1904 
1905     std::string bundleName;
1906     std::string tokenId;
1907     int32_t userId = USB_RIGHT_USERID_INVALID;
1908     if (!GetCallingInfo(bundleName, tokenId, userId)) {
1909         USB_HILOGE(MODULE_USB_SERVICE, "GetCallingInfo false");
1910         return UEC_SERVICE_GET_TOKEN_INFO_FAILED;
1911     }
1912 
1913     std::string serialNum = "";
1914     int32_t ret = usbAccessoryManager_->GetAccessorySerialNumber(access, bundleName, serialNum);
1915     if (ret != UEC_OK) {
1916         USB_HILOGE(MODULE_USB_SERVICE, "can not find accessory.");
1917         return ret;
1918     }
1919 
1920     if (usbRightManager_->CancelDeviceRight(serialNum, bundleName, tokenId, userId) != UEC_OK) {
1921         USB_HILOGI(MODULE_USB_SERVICE, "CancelAccessoryRight failed");
1922         return UEC_SERVICE_DATABASE_OPERATION_FAILED;
1923     }
1924 
1925     USB_HILOGI(MODULE_USB_SERVICE, "CancelAccessoryRight done");
1926     return UEC_OK;
1927 }
1928 // LCOV_EXCL_STOP
1929 
1930 // LCOV_EXCL_START
InitSettingsDataHdcStatus()1931 bool UsbService::InitSettingsDataHdcStatus()
1932 {
1933     auto datashareHelper = std::make_shared<UsbSettingDataShare>();
1934     if (datashareHelper->CreateDataShareHelper(USB_SYSTEM_ABILITY_ID) == nullptr) {
1935         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: datashare is not ready", __func__);
1936         return false;
1937     }
1938     if (usbRightManager_ == nullptr) {
1939         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: invalid usbRightManager_", __func__);
1940         return false;
1941     }
1942     if (usbDeviceManager_ == nullptr) {
1943         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: UsbService::usbDeviceManager_ is nullptr", __func__);
1944         return false;
1945     }
1946 
1947     int32_t func = 0;
1948     if (usbDeviceManager_->GetCurrentFunctions(func) != UEC_OK) {
1949         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: function is get failed!", __func__);
1950     } else if (!SetSettingsDataHdcStatus(func)) {
1951         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HDC_STATUS is set failed, func is: %{public}d", __func__, func);
1952     }
1953     return true;
1954 }
1955 // LCOV_EXCL_STOP
1956 
1957 // LCOV_EXCL_START
SetSettingsDataHdcStatus(int32_t func)1958 bool UsbService::SetSettingsDataHdcStatus(int32_t func)
1959 {
1960     uint32_t func_uint = static_cast<uint32_t>(func);
1961     auto datashareHelper = std::make_shared<UsbSettingDataShare>();
1962     std::string hdcStatus {"false"};
1963     OHOS::Uri uri(
1964         "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=HDC_STATUS");
1965     if (func_uint & USB_FUNCTION_HDC) {
1966         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: func is = %{public}d (USB_FUNCTION_HDC)", __func__, func_uint);
1967         if (datashareHelper->Query(uri, "HDC_STATUS", hdcStatus) && hdcStatus == "true") {
1968             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HDC_STATUS is already true!", __func__);
1969             return true;
1970         }
1971         hdcStatus = "true";
1972         if (!datashareHelper->Update(uri, "HDC_STATUS", hdcStatus)) {
1973             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HDC_STATUS is update failed!", __func__);
1974             return false;
1975         }
1976         return true;
1977     } else {
1978         USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: func is = %{public}d", __func__, func_uint);
1979         if (datashareHelper->Query(uri, "HDC_STATUS", hdcStatus) && hdcStatus == "false") {
1980             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HDC_STATUS is already false!", __func__);
1981             return false;
1982         }
1983         hdcStatus = "false";
1984         if (!datashareHelper->Update(uri, "HDC_STATUS", hdcStatus)) {
1985             USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HDC_STATUS is update failed!", __func__);
1986             return false;
1987         }
1988         return true;
1989     }
1990 }
1991 // LCOV_EXCL_STOP
1992 #endif // USB_MANAGER_FEATURE_DEVICE
1993 
1994 #ifdef USB_MANAGER_FEATURE_PORT
GetPorts(std::vector<UsbPort> & ports)1995 int32_t UsbService::GetPorts(std::vector<UsbPort> &ports)
1996 {
1997     USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getPorts");
1998     if (usbRightManager_ == nullptr) {
1999         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
2000         return UEC_SERVICE_INVALID_VALUE;
2001     }
2002     int32_t ret = CheckSysApiPermission();
2003     if (ret != UEC_OK) {
2004         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
2005         ReportUsbOperationFaultSysEvent("GetPorts", ret, "CheckSysApiPermission failed");
2006         return ret;
2007     }
2008     if (usbPortManager_ == nullptr) {
2009         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
2010         return UEC_SERVICE_INVALID_VALUE;
2011     }
2012     return usbPortManager_->GetPorts(ports);
2013 }
2014 
2015 // LCOV_EXCL_START
GetSupportedModes(int32_t portId,int32_t & supportedModes)2016 int32_t UsbService::GetSupportedModes(int32_t portId, int32_t &supportedModes)
2017 {
2018     USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getSupportedModes");
2019     if (usbRightManager_ == nullptr) {
2020         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
2021         return UEC_SERVICE_INVALID_VALUE;
2022     }
2023     int32_t ret = CheckSysApiPermission();
2024     if (ret != UEC_OK) {
2025         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
2026         return ret;
2027     }
2028     if (usbPortManager_ == nullptr) {
2029         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
2030         return UEC_SERVICE_INVALID_VALUE;
2031     }
2032     return usbPortManager_->GetSupportedModes(portId, supportedModes);
2033 }
2034 // LCOV_EXCL_STOP
2035 
SetPortRole(int32_t portId,int32_t powerRole,int32_t dataRole)2036 int32_t UsbService::SetPortRole(int32_t portId, int32_t powerRole, int32_t dataRole)
2037 {
2038     USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager SetPortRole");
2039     if (usbRightManager_ == nullptr) {
2040         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
2041         return UEC_SERVICE_INVALID_VALUE;
2042     }
2043     int32_t ret = CheckSysApiPermission();
2044     if (ret != UEC_OK) {
2045         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: CheckSysApiPermission failed ret = %{public}d", __func__, ret);
2046         ReportUsbOperationFaultSysEvent("SetPortRole", ret, "CheckSysApiPermission failed");
2047         return ret;
2048     }
2049     if (usbPortManager_ == nullptr) {
2050         USB_HILOGE(MODULE_USB_SERVICE, "UsbService::usbPortManager_ is nullptr");
2051         return UEC_SERVICE_INVALID_VALUE;
2052     }
2053     ret = usbPortManager_->SetPortRole(portId, powerRole, dataRole);
2054     if (ret == HDF_ERR_NOT_SUPPORT) {
2055         USB_HILOGE(MODULE_USB_SERVICE, "SetPortRole not support");
2056         return UEC_SERVICE_NOT_SUPPORT_SWITCH_PORT;
2057     }
2058     return ret;
2059 }
2060 
2061 // LCOV_EXCL_START
UpdateUsbPort(int32_t portId,int32_t powerRole,int32_t dataRole,int32_t mode)2062 void UsbService::UpdateUsbPort(int32_t portId, int32_t powerRole, int32_t dataRole, int32_t mode)
2063 {
2064     if (usbPortManager_ == nullptr) {
2065         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
2066         return;
2067     }
2068 
2069     usbPortManager_->UpdatePort(portId, powerRole, dataRole, mode);
2070 }
2071 
UpdateUsbPort(int32_t portId,int32_t powerRole,int32_t dataRole,int32_t mode,int32_t supportedModes)2072 void UsbService::UpdateUsbPort(int32_t portId, int32_t powerRole,
2073     int32_t dataRole, int32_t mode, int32_t supportedModes)
2074 {
2075     if (usbPortManager_ == nullptr) {
2076         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbPortManager_");
2077         return;
2078     }
2079 
2080     usbPortManager_->UpdatePort(portId, powerRole, dataRole, mode, supportedModes);
2081 }
2082 // LCOV_EXCL_STOP
2083 #endif // USB_MANAGER_FEATURE_PORT
2084 
2085 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
2086 // LCOV_EXCL_START
GetCallingInfo(std::string & bundleName,std::string & tokenId,int32_t & userId)2087 bool UsbService::GetCallingInfo(std::string &bundleName, std::string &tokenId, int32_t &userId)
2088 {
2089     OHOS::Security::AccessToken::AccessTokenID token = IPCSkeleton::GetCallingTokenID();
2090     OHOS::Security::AccessToken::HapTokenInfo hapTokenInfoRes;
2091     int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenInfo(token, hapTokenInfoRes);
2092     if (ret != ERR_OK) {
2093         USB_HILOGE(MODULE_USB_SERVICE, "failed, ret: %{public}d, app: %{public}s",
2094             ret, bundleName.c_str());
2095         return false;
2096     }
2097     bundleName = hapTokenInfoRes.bundleName;
2098     tokenId = std::to_string((uint32_t)token);
2099     userId = hapTokenInfoRes.userID;
2100     USB_HILOGD(MODULE_USB_SERVICE, "ret: %{public}d, app: %{public}s", ret, bundleName.c_str());
2101     return true;
2102 }
2103 // LCOV_EXCL_STOP
2104 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
2105 
CheckSysApiPermission()2106 int32_t UsbService::CheckSysApiPermission()
2107 {
2108     if (!usbRightManager_->IsSystemAppOrSa()) {
2109         return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
2110     }
2111 
2112     // LCOV_EXCL_START
2113     if (!usbRightManager_->VerifyPermission()) {
2114         int32_t apiVersion = GetHapApiVersion();
2115         if (apiVersion < API_VERSION_ID_18) {
2116             return UEC_SERVICE_PERMISSION_DENIED_SYSAPI;
2117         }
2118         return UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED;
2119     }
2120 
2121     return UEC_OK;
2122     // LCOV_EXCL_STOP
2123 }
2124 
2125 // LCOV_EXCL_START
GetHapApiVersion()2126 int32_t UsbService::GetHapApiVersion()
2127 {
2128     OHOS::Security::AccessToken::AccessTokenID token = IPCSkeleton::GetCallingTokenID();
2129     OHOS::Security::AccessToken::HapTokenInfo hapTokenInfoRes;
2130     int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenInfo(token, hapTokenInfoRes);
2131     if (ret != ERR_OK) {
2132         USB_HILOGE(MODULE_USB_SERVICE, "GetHapTokenInfo failed, ret: %{public}d", ret);
2133         return API_VERSION_ID_18;
2134     }
2135     int32_t hapApiVersion = hapTokenInfoRes.apiVersion;
2136     USB_HILOGD(MODULE_USB_SERVICE, "API check hapApiVersion = %{public}d", hapApiVersion);
2137 
2138     return hapApiVersion;
2139 }
2140 // LCOV_EXCL_STOP
2141 
2142 // LCOV_EXCL_START
InitUsbRight()2143 int32_t UsbService::InitUsbRight()
2144 {
2145     if (usbRightManager_ == nullptr) {
2146         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbRightManager_");
2147         return UEC_SERVICE_INVALID_VALUE;
2148     }
2149     int32_t ret = usbRightManager_->Init();
2150     if (ret != UEC_OK) {
2151         USB_HILOGE(MODULE_USBD, "Init usb right manager failed: %{public}d", ret);
2152         return ret;
2153     }
2154     std::vector<std::string> devices;
2155     std::lock_guard<std::mutex> guard(mutex_);
2156     for (auto it = deviceVidPidMap_.begin(); it != deviceVidPidMap_.end(); ++it) {
2157         devices.push_back(it->second);
2158     }
2159     USB_HILOGI(MODULE_USBD, "clean: %{public}zu/%{public}zu", devices.size(), deviceVidPidMap_.size());
2160     ret = usbRightManager_->CleanUpRightExpired(devices);
2161     if (ret != USB_RIGHT_OK) {
2162         USB_HILOGE(MODULE_USBD, "clean expired usb right failed: %{public}d", ret);
2163     }
2164     return ret;
2165 }
2166 // LCOV_EXCL_STOP
2167 
2168 // LCOV_EXCL_START
GetBundleName(std::string & bundleName)2169 bool UsbService::GetBundleName(std::string &bundleName)
2170 {
2171 #ifdef USB_RIGHT_TEST
2172     bundleName = "com.usb.right";
2173     return true;
2174 #endif // USB_RIGHT_TEST
2175     pid_t uid = GetCallingUid();
2176     sptr<ISystemAbilityManager> systemAbilityManager =
2177         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2178     if (systemAbilityManager == nullptr) {
2179         return false;
2180     }
2181     sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
2182     if (remoteObject == nullptr) {
2183         return false;
2184     }
2185 
2186     sptr<AppExecFwk::IBundleMgr> bundleMgr(new AppExecFwk::BundleMgrProxy(remoteObject));
2187     if (bundleMgr == nullptr) {
2188         return false;
2189     }
2190 
2191     ErrCode ret = bundleMgr->GetNameForUid(uid, bundleName);
2192     if (ret != ERR_OK) {
2193         USB_HILOGE(MODULE_USB_SERVICE, "failed to obtain bundleName");
2194         return false;
2195     }
2196     return true;
2197 }
2198 // LCOV_EXCL_STOP
2199 
2200 // LCOV_EXCL_START
DoDump(int fd,const std::vector<std::string> & argList)2201 bool UsbService::DoDump(int fd, const std::vector<std::string> &argList)
2202 {
2203 #ifdef USB_MANAGER_FEATURE_HOST
2204     if (usbHostManager_ == nullptr) {
2205         USB_HILOGE(MODULE_USB_SERVICE, "usbHostManager_ is nullptr");
2206         return false;
2207     }
2208     if (argList[0] == USB_HOST) {
2209         usbHostManager_->Dump(fd, argList[1]);
2210     }
2211 #endif // USB_MANAGER_FEATURE_HOST
2212 #ifdef USB_MANAGER_FEATURE_DEVICE
2213     if (usbDeviceManager_ == nullptr) {
2214         USB_HILOGE(MODULE_USB_SERVICE, "usbDeviceManager_ is nullptr");
2215         return false;
2216     }
2217     if (argList[0] == USB_DEVICE) {
2218         usbDeviceManager_->Dump(fd, argList);
2219     }
2220 #endif // USB_MANAGER_FEATURE_DEVICE
2221 #ifdef USB_MANAGER_FEATURE_PORT
2222     if (usbPortManager_ == nullptr) {
2223         USB_HILOGE(MODULE_USB_SERVICE, "usbPortManager_ is nullptr");
2224         return false;
2225     }
2226     if (argList[0] == USB_PORT) {
2227         usbPortManager_->Dump(fd, argList);
2228     }
2229 #endif // USB_MANAGER_FEATURE_PORT
2230     return true;
2231 }
2232 // LCOV_EXCL_STOP
2233 
2234 // LCOV_EXCL_START
Dump(int fd,const std::vector<std::u16string> & args)2235 int UsbService::Dump(int fd, const std::vector<std::u16string> &args)
2236 {
2237     if (fd < 0) {
2238         USB_HILOGE(MODULE_USB_SERVICE, "fd is invalid fd:%{public}d", fd);
2239         return UEC_SERVICE_INVALID_VALUE;
2240     }
2241 
2242     std::vector<std::string> argList;
2243     std::transform(args.begin(), args.end(), std::back_inserter(argList), [](const std::u16string &arg) {
2244         return Str16ToStr8(arg);
2245     });
2246 
2247     if (usbSerialManager_ == nullptr) {
2248         USB_HILOGI(MODULE_USB_SERVICE, "usbSerialManager_ is nullptr");
2249         usbSerialManager_ = std::make_shared<SERIAL::SerialManager>();
2250         if (usbSerialManager_ == nullptr) {
2251             USB_HILOGE(MODULE_USB_SERVICE, "usbSerialManager_ is still nullptr");
2252             return UEC_SERVICE_INVALID_VALUE;
2253         }
2254     }
2255     if (argList.empty()) {
2256         USB_HILOGE(MODULE_USB_SERVICE, "argList is empty");
2257         DumpHelp(fd);
2258         usbSerialManager_->ListGetDumpHelp(fd);
2259         return UEC_SERVICE_INVALID_VALUE;
2260     }
2261     if (!DoDump(fd, argList)) {
2262         return UEC_SERVICE_INVALID_VALUE;
2263     }
2264     if (argList[0] == USB_HELP) {
2265         DumpHelp(fd);
2266         usbSerialManager_->ListGetDumpHelp(fd);
2267     } else if (argList[0] == USB_LIST) {
2268         usbSerialManager_->SerialPortListDump(fd, argList);
2269     } else if (argList[0] == USB_GETT) {
2270         usbSerialManager_->SerialGetAttributeDump(fd, argList);
2271     } else {
2272         dprintf(fd, "Usb Dump service:invalid parameter.\n");
2273         DumpHelp(fd);
2274         usbSerialManager_->ListGetDumpHelp(fd);
2275     }
2276     return UEC_OK;
2277 }
2278 // LCOV_EXCL_STOP
2279 
2280 // LCOV_EXCL_START
DumpHelp(int32_t fd)2281 void UsbService::DumpHelp(int32_t fd)
2282 {
2283     dprintf(fd, "Refer to the following usage:\n");
2284     dprintf(fd, "-h: dump help\n");
2285     dprintf(fd, "============= dump the all device ==============\n");
2286     dprintf(fd, "usb_host -a: dump the all device list info\n");
2287     dprintf(fd, "------------------------------------------------\n");
2288 #ifdef USB_MANAGER_FEATURE_DEVICE
2289     if (usbDeviceManager_ == nullptr) {
2290         USB_HILOGE(MODULE_USB_SERVICE, "usbDeviceManager_ is nullptr");
2291         return;
2292     }
2293     usbDeviceManager_->GetDumpHelp(fd);
2294 #endif // USB_MANAGER_FEATURE_DEVICE
2295 #ifdef USB_MANAGER_FEATURE_PORT
2296     if (usbPortManager_ == nullptr) {
2297         USB_HILOGE(MODULE_USB_SERVICE, "usbPortManager_ is nullptr");
2298         return;
2299     }
2300     usbPortManager_->GetDumpHelp(fd);
2301 #endif // USB_MANAGER_FEATURE_PORT
2302 }
2303 // LCOV_EXCL_STOP
2304 
2305 // LCOV_EXCL_START
IsNotNeedUnload()2306 bool UsbService::IsNotNeedUnload()
2307 {
2308     bool hasActiveDevices = false;
2309     bool isGadgetConnected = false;
2310 #ifdef USB_MANAGER_FEATURE_HOST
2311     std::map<std::string, UsbDevice *> devices;
2312     usbHostManager_->GetDevices(devices);
2313     hasActiveDevices = !devices.empty();
2314 #endif // USB_MANAGER_FEATURE_HOST
2315 #ifdef USB_MANAGER_FEATURE_DEVICE
2316     isGadgetConnected = usbDeviceManager_->IsGadgetConnected();
2317 #endif // USB_MANAGER_FEATURE_DEVICE
2318     return hasActiveDevices || isGadgetConnected;
2319 }
2320 // LCOV_EXCL_STOP
2321 
2322 // LCOV_EXCL_START
UnLoadSelf(UnLoadSaType type)2323 void UsbService::UnLoadSelf(UnLoadSaType type)
2324 {
2325     if (OHOS::system::GetBoolParameter("const.security.developermode.state", true)) {
2326         USB_HILOGI(MODULE_USB_SERVICE, "no need to unload in dev mode");
2327         return;
2328     }
2329 
2330     auto task = []() {
2331         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2332         if (samgrProxy == nullptr) {
2333             USB_HILOGE(MODULE_USB_SERVICE, "get samgr failed");
2334             return;
2335         }
2336 
2337         auto ret = samgrProxy->UnloadSystemAbility(USB_SYSTEM_ABILITY_ID);
2338         if (ret != UEC_OK) {
2339             USB_HILOGE(MODULE_USB_SERVICE, "unload failed");
2340         }
2341     };
2342     if (type == UNLOAD_SA_IMMEDIATELY) {
2343         task();
2344         return;
2345     }
2346 #ifdef USB_MANAGER_FEATURE_HOST
2347     if (usbHostManager_ == nullptr) {
2348         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbHostManager_");
2349         return;
2350     }
2351 #endif // USB_MANAGER_FEATURE_HOST
2352 #ifdef USB_MANAGER_FEATURE_DEVICE
2353     if (usbDeviceManager_ == nullptr) {
2354         USB_HILOGE(MODULE_USB_SERVICE, "invalid usbDeviceManager_");
2355         return;
2356     }
2357 #endif // USB_MANAGER_FEATURE_DEVICE
2358     unloadSelfTimer_.Unregister(unloadSelfTimerId_);
2359     unloadSelfTimer_.Shutdown();
2360 
2361     if (IsNotNeedUnload()) {  // delay unload conditions
2362         USB_HILOGW(MODULE_USB_SERVICE, "not need unload");
2363         Memory::MemMgrClient::GetInstance().SetCritical(getpid(), true, USB_SYSTEM_ABILITY_ID);
2364         return;
2365     } else {
2366         Memory::MemMgrClient::GetInstance().SetCritical(getpid(), false, USB_SYSTEM_ABILITY_ID);
2367     }
2368 
2369     if (auto ret = unloadSelfTimer_.Setup(); ret != Utils::TIMER_ERR_OK) {
2370         USB_HILOGE(MODULE_USB_SERVICE, "set up timer failed %{public}u", ret);
2371         return;
2372     }
2373     unloadSelfTimerId_ = unloadSelfTimer_.Register(task, UNLOAD_SA_TIMER_INTERVAL, true);
2374 }
2375 // LCOV_EXCL_STOP
2376 
2377 // LCOV_EXCL_START
OnRemoteDied(const wptr<IRemoteObject> & object)2378 void UsbService::UsbdDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
2379 {
2380     auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2381     if (samgrProxy == nullptr) {
2382         USB_HILOGE(MODULE_USB_SERVICE, "get samgr failed");
2383         return;
2384     }
2385 
2386     auto ret = samgrProxy->UnloadSystemAbility(USB_SYSTEM_ABILITY_ID);
2387     if (ret != UEC_OK) {
2388         USB_HILOGE(MODULE_USB_SERVICE, "unload failed");
2389     }
2390 }
2391 // LCOV_EXCL_STOP
2392 
2393 // LCOV_EXCL_START
OnRemoteDied(const wptr<IRemoteObject> & object)2394 void UsbService::SerialDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
2395 {
2396     USB_HILOGI(MODULE_USBD, "UsbService SerialDeathRecipient enter");
2397     service_->FreeTokenId(this->portId_, this->tokenId_);
2398     service_->CancelSerialRight(this->portId_);
2399 }
2400 // LCOV_EXCL_STOP
2401 
2402 // LCOV_EXCL_START
FreeTokenId(int32_t portId,uint32_t tokenId)2403 void UsbService::FreeTokenId(int32_t portId, uint32_t tokenId)
2404 {
2405     usbSerialManager_->FreeTokenId(portId, tokenId);
2406 }
2407 // LCOV_EXCL_STOP
2408 
2409 // LCOV_EXCL_START
GetGlobalInstance()2410 sptr<UsbService> UsbService::GetGlobalInstance()
2411 {
2412     return g_serviceInstance;
2413 }
2414 // LCOV_EXCL_STOP
2415 
CheckForTtyUSB()2416 bool CheckForTtyUSB()
2417 {
2418     USB_HILOGI(MODULE_USB_SERVICE, "CheckForTtyUSB");
2419     for (const auto& entry : std::filesystem::directory_iterator(TTYUSB_PATH)) {
2420         if (entry.is_directory()) {
2421             return true;
2422         }
2423     }
2424     USB_HILOGI(MODULE_USB_SERVICE, "can't find ttyUSB");
2425     return false;
2426 }
2427 
2428 // LCOV_EXCL_START
DeviceEvent(const HDI::Usb::V1_0::USBDeviceInfo & info)2429 int32_t UsbService::DeviceEvent(const HDI::Usb::V1_0::USBDeviceInfo &info)
2430 {
2431     int32_t status = info.status;
2432 #ifdef USB_MANAGER_FEATURE_DEVICE
2433     if (status == ACT_UPDEVICE || status == ACT_DOWNDEVICE ||
2434         status == ACT_ACCESSORYUP || status == ACT_ACCESSORYDOWN || status == ACT_ACCESSORYSEND) {
2435         USB_HILOGI(MODULE_USB_SERVICE, "device: usb");
2436         g_serviceInstance->UpdateDeviceState(status);
2437         g_serviceInstance->UnLoadSelf(UsbService::UnLoadSaType::UNLOAD_SA_DELAY);
2438         return UEC_OK;
2439     }
2440 #endif // USB_MANAGER_FEATURE_DEVICE
2441 #ifdef USB_MANAGER_FEATURE_HOST
2442     int32_t busNum = info.busNum;
2443     int32_t devAddr = info.devNum;
2444     if (status == ACT_DEVUP) {
2445         USB_HILOGI(MODULE_USB_SERVICE, "host: usb attached");
2446         g_serviceInstance->AddDevice(busNum, devAddr);
2447     } else {
2448         USB_HILOGI(MODULE_USB_SERVICE, "host: usb detached");
2449         g_serviceInstance->DelDevice(busNum, devAddr);
2450     }
2451     g_serviceInstance->UnLoadSelf(UsbService::UnLoadSaType::UNLOAD_SA_DELAY);
2452 #endif // USB_MANAGER_FEATURE_HOST
2453     if (status == ACT_DEVUP) {
2454         if (usbSerialManager_ == nullptr && CheckForTtyUSB()) {
2455             USB_HILOGI(MODULE_USB_SERVICE, "try to start serial");
2456             usbSerialManager_ = std::make_shared<SERIAL::SerialManager>();
2457         }
2458     }
2459     return UEC_OK;
2460 }
2461 // LCOV_EXCL_STOP
2462 
IsCallerValid()2463 bool UsbService::IsCallerValid()
2464 {
2465     OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
2466     auto callerTokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenType(callerToken);
2467     if (callerTokenType == OHOS::Security::AccessToken::TypeATokenTypeEnum::TOKEN_NATIVE) {
2468         pid_t callerUid = IPCSkeleton::GetCallingUid();
2469         return callerUid == ROOT_UID || callerUid == EDM_UID;
2470     }
2471     return false;
2472 }
2473 
2474 // LCOV_EXCL_START
InitSerial()2475 bool UsbService::InitSerial()
2476 {
2477     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2478     if (seriald_ == nullptr) {
2479         seriald_ = OHOS::HDI::Usb::Serial::V1_0::ISerialInterface::Get("serial_interface_service", true);
2480         if (seriald_ == nullptr) {
2481             USB_HILOGE(MODULE_USB_SERVICE, "UsbService::InitSerial seriald_ is null");
2482             return false;
2483         }
2484     }
2485 
2486     return true;
2487 }
2488 // LCOV_EXCL_STOP
2489 
2490 // LCOV_EXCL_START
ValidateUsbSerialManagerAndPort(int32_t portId)2491 int32_t UsbService::ValidateUsbSerialManagerAndPort(int32_t portId)
2492 {
2493     if (usbSerialManager_ == nullptr) {
2494         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbSerialManager_ is nullptr", __func__);
2495         return UEC_SERVICE_INVALID_VALUE;
2496     }
2497 
2498     if (!usbSerialManager_->IsPortIdExist(portId)) {
2499         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: %{public}d port not exist", __func__, portId);
2500         return UEC_SERIAL_PORT_NOT_EXIST;
2501     }
2502 
2503     return UEC_OK;
2504 }
2505 // LCOV_EXCL_STOP
2506 
2507 // LCOV_EXCL_START
SerialOpen(int32_t portId,const sptr<IRemoteObject> & serialRemote)2508 int32_t UsbService::SerialOpen(int32_t portId, const sptr<IRemoteObject> &serialRemote)
2509 {
2510     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2511     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2512     if (ret != UEC_OK) {
2513         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2514         ReportUsbSerialOperationFaultSysEvent(portId, "SerialOpen", ret, "ValidateUsbSerialManagerAndPort failed");
2515         return ret;
2516     }
2517 
2518     bool hasRight = false;
2519     HasSerialRight(portId, hasRight);
2520     if (!hasRight) {
2521         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: There are no permissions", __func__);
2522         ReportUsbSerialOperationFaultSysEvent(portId, "SerialOpen", UEC_SERVICE_PERMISSION_DENIED,
2523             "There are no permissions");
2524         return UEC_SERVICE_PERMISSION_DENIED;
2525     }
2526 
2527     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
2528     sptr<UsbService::SerialDeathRecipient> serialRecipient_ = new SerialDeathRecipient(this, portId, tokenId);
2529     if (serialRecipient_ == nullptr) {
2530         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: serialRecipient_ is nullptr", __func__);
2531         ReportUsbSerialOperationFaultSysEvent(portId, "SerialOpen", UEC_SERVICE_INVALID_VALUE,
2532             "serialRecipient_ is nullptr");
2533         return UEC_SERVICE_INVALID_VALUE;
2534     }
2535 
2536     if (!serialRemote->AddDeathRecipient(serialRecipient_)) {
2537         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialOpen add DeathRecipient failed", __func__);
2538         ReportUsbSerialOperationFaultSysEvent(portId, "SerialOpen", UEC_SERVICE_INVALID_VALUE,
2539             "SerialOpen add DeathRecipient failed");
2540         return UEC_SERVICE_INVALID_VALUE;
2541     }
2542 
2543     ret = usbSerialManager_->SerialOpen(portId);
2544     if (ret != UEC_OK) {
2545         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialOpen failed", __func__);
2546         ReportUsbSerialOperationFaultSysEvent(portId, "SerialOpen", ret, "SerialOpen failed");
2547         return ret;
2548     }
2549 
2550     ReportUsbSerialOperationSysEvent(portId, "SerialOpen");
2551     return UEC_OK;
2552 }
2553 // LCOV_EXCL_STOP
2554 
2555 // LCOV_EXCL_START
SerialClose(int32_t portId)2556 int32_t UsbService::SerialClose(int32_t portId)
2557 {
2558     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2559     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2560     if (ret != UEC_OK) {
2561         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2562         ReportUsbSerialOperationFaultSysEvent(portId, "SerialClose", ret, "ValidateUsbSerialManagerAndPort failed");
2563         return ret;
2564     }
2565 
2566     ReportUsbSerialOperationSysEvent(portId, "SerialClose");
2567     ret = usbSerialManager_->SerialClose(portId);
2568     if (ret != UEC_OK) {
2569         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialClose failed", __func__);
2570         ReportUsbSerialOperationFaultSysEvent(portId, "SerialClose", ret, "SerialClose failed");
2571     }
2572     return ret;
2573 }
2574 // LCOV_EXCL_STOP
2575 
2576 // LCOV_EXCL_START
SerialRead(int32_t portId,std::vector<uint8_t> & data,uint32_t size,uint32_t & actualSize,uint32_t timeout)2577 int32_t UsbService::SerialRead(int32_t portId, std::vector<uint8_t>& data, uint32_t size,
2578     uint32_t &actualSize, uint32_t timeout)
2579 {
2580     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2581     HITRACE_METER_NAME(HITRACE_TAG_USB, "SerialRead");
2582     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2583     if (ret != UEC_OK) {
2584         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2585         ReportUsbSerialOperationFaultSysEvent(portId, "SerialRead", ret, "ValidateUsbSerialManagerAndPort failed");
2586         return ret;
2587     }
2588 
2589     ret = usbSerialManager_->SerialRead(portId, data, size, actualSize, timeout);
2590     if (ret != UEC_OK) {
2591         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialRead failed", __func__);
2592         ReportUsbSerialOperationFaultSysEvent(portId, "SerialRead", ret, "SerialRead failed");
2593     }
2594     return ret;
2595 }
2596 // LCOV_EXCL_STOP
2597 
2598 // LCOV_EXCL_START
SerialWrite(int32_t portId,const std::vector<uint8_t> & data,uint32_t size,uint32_t & actualSize,uint32_t timeout)2599 int32_t UsbService::SerialWrite(int32_t portId, const std::vector<uint8_t>& data, uint32_t size,
2600     uint32_t &actualSize, uint32_t timeout)
2601 {
2602     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2603     HITRACE_METER_NAME(HITRACE_TAG_USB, "SerialWrite");
2604     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2605     if (ret != UEC_OK) {
2606         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2607         ReportUsbSerialOperationFaultSysEvent(portId, "SerialWrite", ret, "ValidateUsbSerialManagerAndPort failed");
2608         return ret;
2609     }
2610 
2611     ret = usbSerialManager_->SerialWrite(portId, data, size, actualSize, timeout);
2612     if (ret != UEC_OK) {
2613         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialWrite failed", __func__);
2614         ReportUsbSerialOperationFaultSysEvent(portId, "SerialWrite", ret, "SerialWrite failed");
2615     }
2616     return ret;
2617 }
2618 // LCOV_EXCL_STOP
2619 
2620 // LCOV_EXCL_START
SerialAttributeChange(const UsbSerialAttr & serialAttr,OHOS::HDI::Usb::Serial::V1_0::SerialAttribute & attribute)2621 void UsbService::SerialAttributeChange(const UsbSerialAttr &serialAttr,
2622     OHOS::HDI::Usb::Serial::V1_0::SerialAttribute& attribute)
2623 {
2624     attribute.baudrate = serialAttr.baudRate_;
2625     attribute.stopBits = serialAttr.stopBits_;
2626     attribute.parity = serialAttr.parity_;
2627     attribute.dataBits = serialAttr.dataBits_;
2628     return;
2629 }
2630 // LCOV_EXCL_STOP
2631 
2632 // LCOV_EXCL_START
SerialAttributeChange(UsbSerialAttr & serialAttr,OHOS::HDI::Usb::Serial::V1_0::SerialAttribute & attribute)2633 void UsbService::SerialAttributeChange(UsbSerialAttr &serialAttr,
2634     OHOS::HDI::Usb::Serial::V1_0::SerialAttribute& attribute)
2635 {
2636     serialAttr.baudRate_ = attribute.baudrate;
2637     serialAttr.stopBits_ = attribute.stopBits;
2638     serialAttr.parity_ = attribute.parity;
2639     serialAttr.dataBits_ = attribute.dataBits;
2640     return;
2641 }
2642 // LCOV_EXCL_STOP
2643 
2644 // LCOV_EXCL_START
SerialGetAttribute(int32_t portId,UsbSerialAttr & attributeInfo)2645 int32_t UsbService::SerialGetAttribute(int32_t portId, UsbSerialAttr& attributeInfo)
2646 {
2647     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2648     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2649     if (ret != UEC_OK) {
2650         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2651         ReportUsbSerialOperationFaultSysEvent(portId, "SerialGetAttribute", ret,
2652             "ValidateUsbSerialManagerAndPort failed");
2653         return ret;
2654     }
2655     OHOS::HDI::Usb::Serial::V1_0::SerialAttribute serialAttr;
2656     ret = usbSerialManager_->SerialGetAttribute(portId, serialAttr);
2657     if (ret != UEC_OK) {
2658         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialGetAttribute failed", __func__);
2659         ReportUsbSerialOperationFaultSysEvent(portId, "SerialGetAttribute", ret, "SerialGetAttribute failed");
2660     }
2661     SerialAttributeChange(attributeInfo, serialAttr);
2662     return ret;
2663 }
2664 // LCOV_EXCL_STOP
2665 
2666 // LCOV_EXCL_START
SerialSetAttribute(int32_t portId,const UsbSerialAttr & attributeInfo)2667 int32_t UsbService::SerialSetAttribute(int32_t portId,
2668     const UsbSerialAttr& attributeInfo)
2669 {
2670     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2671     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2672     if (ret != UEC_OK) {
2673         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2674         ReportUsbSerialOperationFaultSysEvent(portId, "SerialSetAttribute", ret,
2675             "ValidateUsbSerialManagerAndPort failed");
2676         return ret;
2677     }
2678     OHOS::HDI::Usb::Serial::V1_0::SerialAttribute serialAttr;
2679     SerialAttributeChange(attributeInfo, serialAttr);
2680     ret = usbSerialManager_->SerialSetAttribute(portId, serialAttr);
2681     if (ret != UEC_OK) {
2682         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialSetAttribute failed", __func__);
2683         ReportUsbSerialOperationFaultSysEvent(portId, "SerialSetAttribute", ret, "SerialSetAttribute failed");
2684         return ret;
2685     }
2686 
2687     ReportUsbSerialOperationSysEvent(portId, "SerialSetAttribute");
2688     return UEC_OK;
2689 }
2690 // LCOV_EXCL_STOP
2691 
2692 // LCOV_EXCL_START
SerialPortChange(std::vector<UsbSerialPort> & serialInfoList,std::vector<OHOS::HDI::Usb::Serial::V1_0::SerialPort> & serialPortList)2693 void UsbService::SerialPortChange(std::vector<UsbSerialPort> &serialInfoList,
2694     std::vector<OHOS::HDI::Usb::Serial::V1_0::SerialPort>& serialPortList)
2695 {
2696     for (size_t i = 0; i < serialPortList.size(); i++) {
2697         UsbSerialPort info;
2698         info.portId_ = serialPortList[i].portId;
2699         info.busNum_ = serialPortList[i].deviceInfo.busNum;
2700         info.devAddr_ = serialPortList[i].deviceInfo.devAddr;
2701         info.vid_ = serialPortList[i].deviceInfo.vid;
2702         info.pid_ = serialPortList[i].deviceInfo.pid;
2703         info.serialNum_ = serialPortList[i].deviceInfo.serialNum;
2704         serialInfoList.push_back(info);
2705     }
2706     return;
2707 }
2708 // LCOV_EXCL_STOP
2709 
2710 // LCOV_EXCL_START
SerialGetPortList(std::vector<UsbSerialPort> & serialInfoList)2711 int32_t UsbService::SerialGetPortList(std::vector<UsbSerialPort>& serialInfoList)
2712 {
2713     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2714     if (usbSerialManager_ == nullptr) {
2715         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbSerialManager_ is nullptr", __func__);
2716         if (CheckForTtyUSB()) {
2717             USB_HILOGI(MODULE_USB_SERVICE, "try to start serial");
2718             usbSerialManager_ = std::make_shared<SERIAL::SerialManager>();
2719         } else {
2720             return UEC_OK;
2721         }
2722     }
2723     std::vector<OHOS::HDI::Usb::Serial::V1_0::SerialPort> serialPortList;
2724     int32_t ret = usbSerialManager_->SerialGetPortList(serialPortList);
2725     if (ret != UEC_OK) {
2726         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialGetPortList failed", __func__);
2727         return ret;
2728     }
2729     SerialPortChange(serialInfoList, serialPortList);
2730     UpdateDeviceVidPidMap(serialPortList);
2731     return ret;
2732 }
2733 // LCOV_EXCL_STOP
2734 
2735 // LCOV_EXCL_START
CheckDbAbility(int32_t portId)2736 int32_t UsbService::CheckDbAbility(int32_t portId)
2737 {
2738     std::shared_ptr<UsbRightDbHelper> helper = OHOS::USB::UsbRightDbHelper::GetInstance();
2739     if (helper == nullptr) {
2740         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: get dbHelper failed", __func__);
2741         ReportUsbSerialOperationFaultSysEvent(portId, "RequestSerialRight", UEC_SERIAL_DATEBASE_ERROR,
2742             "get dbHelper failed");
2743         return UEC_SERIAL_DATEBASE_ERROR;
2744     } else {
2745         return UEC_OK;
2746     }
2747 }
2748 // LCOV_EXCL_STOP
2749 
2750 // LCOV_EXCL_START
RequestSerialRight(int32_t portId,bool & hasRight)2751 int32_t UsbService::RequestSerialRight(int32_t portId, bool &hasRight)
2752 {
2753     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2754     hasRight = false;
2755     if (usbRightManager_ == nullptr) {
2756         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbRightManager_ is nullptr", __func__);
2757         ReportUsbSerialOperationFaultSysEvent(portId, "RequestSerialRight", UEC_SERVICE_INVALID_VALUE,
2758             "usbRightManager_ is nullptr");
2759         return UEC_SERVICE_INVALID_VALUE;
2760     }
2761     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2762     if (ret != UEC_OK) {
2763         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2764         ReportUsbSerialOperationFaultSysEvent(portId, "RequestSerialRight", ret, "invalid portId");
2765         return ret;
2766     }
2767     if ((ret = CheckDbAbility(portId)) != UEC_OK) {
2768         return ret;
2769     }
2770 
2771     std::string deviceName;
2772     std::string deviceVidPidSerialNum;
2773 
2774     ret = GetDeviceVidPidSerialNumber(portId, deviceName, deviceVidPidSerialNum);
2775     if (ret != UEC_OK) {
2776         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: can not find deviceName.", __func__);
2777         ReportUsbSerialOperationFaultSysEvent(portId, "RequestSerialRight", ret, "can not find deviceName.");
2778         return ret;
2779     }
2780 
2781     if (usbRightManager_->IsSystemAppOrSa()) {
2782         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
2783         hasRight = true;
2784         return UEC_OK;
2785     }
2786 
2787 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
2788     std::string bundleName;
2789     std::string tokenId;
2790     int32_t userId = USB_RIGHT_USERID_INVALID;
2791     if (!GetCallingInfo(bundleName, tokenId, userId)) {
2792         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: GetCallingInfo false", __func__);
2793         ReportUsbSerialOperationFaultSysEvent(portId, "RequestSerialRight", UEC_SERVICE_INVALID_VALUE,
2794             "GetCallingInfo false");
2795         return UEC_SERVICE_INVALID_VALUE;
2796     }
2797 
2798     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s, tokenId=%{public}s",
2799         bundleName.c_str(), deviceName.c_str(), tokenId.c_str());
2800 
2801     SerialDeviceIdentity serialDeviceIdentity = { deviceName, deviceVidPidSerialNum };
2802     if (usbRightManager_->RequestRight(portId, serialDeviceIdentity, bundleName, tokenId, userId) != UEC_OK) {
2803         USB_HILOGW(MODULE_USB_SERVICE, "%{public}s:user don't agree", __func__);
2804         return UEC_OK;
2805     }
2806 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
2807 
2808     hasRight = true;
2809     return UEC_OK;
2810 }
2811 // LCOV_EXCL_STOP
2812 
2813 // LCOV_EXCL_START
CancelSerialRight(int32_t portId)2814 int32_t UsbService::CancelSerialRight(int32_t portId)
2815 {
2816     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2817     if (usbRightManager_ == nullptr) {
2818         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbRightManager_ is nullptr", __func__);
2819         ReportUsbSerialOperationFaultSysEvent(portId, "CancelSerialRight", UEC_SERVICE_INVALID_VALUE,
2820             "usbRightManager_ is nullptr");
2821         return UEC_SERVICE_INVALID_VALUE;
2822     }
2823 
2824     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2825     if (ret != UEC_OK) {
2826         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2827         ReportUsbSerialOperationFaultSysEvent(portId, "CancelSerialRight", ret, "validate portId");
2828         return ret;
2829     }
2830     if ((ret = CheckDbAbility(portId)) != UEC_OK) {
2831         return ret;
2832     }
2833 
2834     std::string deviceName;
2835     std::string deviceVidPidSerialNum;
2836 
2837     ret = GetDeviceVidPidSerialNumber(portId, deviceName, deviceVidPidSerialNum);
2838     if (ret != UEC_OK) {
2839         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: can not find deviceName.", __func__);
2840         ReportUsbSerialOperationFaultSysEvent(portId, "CancelSerialRight", ret, "can not find deviceName.");
2841         return ret;
2842     }
2843 
2844     if (usbRightManager_->IsSystemAppOrSa()) {
2845         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s", deviceName.c_str());
2846         return UEC_OK;
2847     }
2848 
2849 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
2850     std::string bundleName;
2851     std::string tokenId;
2852     int32_t userId = USB_RIGHT_USERID_INVALID;
2853     if (!GetCallingInfo(bundleName, tokenId, userId)) {
2854         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: GetCallingInfo false", __func__);
2855         ReportUsbSerialOperationFaultSysEvent(portId, "CancelSerialRight", UEC_SERVICE_INVALID_VALUE,
2856             "GetCallingInfo false");
2857         return UEC_SERVICE_INVALID_VALUE;
2858     }
2859 
2860     if (!usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, tokenId, userId) &&
2861         !usbRightManager_->RemoveDeviceRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId)) {
2862         USB_HILOGE(MODULE_USB_SERVICE, "RemoveDeviceRight failed");
2863         ReportUsbSerialOperationFaultSysEvent(portId, "CancelSerialRight", UEC_SERVICE_PERMISSION_DENIED,
2864             "RemoveDeviceRight failed");
2865         return UEC_SERVICE_PERMISSION_DENIED;
2866     }
2867 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
2868 
2869     usbSerialManager_->SerialClose(portId);
2870     return UEC_OK;
2871 }
2872 // LCOV_EXCL_STOP
2873 
2874 // LCOV_EXCL_START
HasSerialRight(int32_t portId,bool & hasRight)2875 int32_t UsbService::HasSerialRight(int32_t portId, bool &hasRight)
2876 {
2877     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2878     hasRight = false;
2879     if (usbRightManager_ == nullptr) {
2880         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbRightManager_ is nullptr", __func__);
2881         return UEC_SERVICE_INVALID_VALUE;
2882     }
2883     int32_t ret = ValidateUsbSerialManagerAndPort(portId);
2884     if (ret != UEC_OK) {
2885         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2886         return ret;
2887     }
2888     if ((ret = CheckDbAbility(portId)) != UEC_OK) {
2889         return ret;
2890     }
2891 
2892     std::string deviceName;
2893     std::string deviceVidPidSerialNum;
2894 
2895     ret = GetDeviceVidPidSerialNumber(portId, deviceName, deviceVidPidSerialNum);
2896     if (ret != UEC_OK) {
2897         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: can not find deviceName.", __func__);
2898         return ret;
2899     }
2900 
2901     if (usbRightManager_->IsSystemAppOrSa()) {
2902         USB_HILOGW(MODULE_USB_SERVICE, "system app, bypass: dev=%{public}s ", deviceName.c_str());
2903         hasRight = true;
2904         return UEC_OK;
2905     }
2906 
2907 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
2908     std::string bundleName;
2909     std::string tokenId;
2910     int32_t userId = USB_RIGHT_USERID_INVALID;
2911     if (!GetCallingInfo(bundleName, tokenId, userId)) {
2912         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: HasRight GetCallingInfo false", __func__);
2913         return UEC_SERVICE_INVALID_VALUE;
2914     }
2915 
2916     USB_HILOGI(MODULE_USB_SERVICE, "bundle=%{public}s, device=%{public}s",
2917         bundleName.c_str(), deviceName.c_str());
2918     if (usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, tokenId, userId)) {
2919         hasRight = true;
2920         return UEC_OK;
2921     } else if (usbRightManager_->HasRight(deviceVidPidSerialNum, bundleName, USB_DEFAULT_TOKEN, userId)) {
2922         hasRight = true;
2923         return UEC_OK;
2924     }
2925 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
2926 
2927     return UEC_OK;
2928 }
2929 // LCOV_EXCL_STOP
2930 
2931 // LCOV_EXCL_START
AddSerialRight(uint32_t tokenId,int32_t portId)2932 int32_t UsbService::AddSerialRight(uint32_t tokenId, int32_t portId)
2933 {
2934     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2935     if (usbRightManager_ == nullptr) {
2936         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: usbRightManager_ is nullptr", __func__);
2937         ReportUsbSerialOperationFaultSysEvent(portId, "AddSerialRight", UEC_SERVICE_INVALID_VALUE,
2938             "usbRightManager_ is nullptr");
2939         return UEC_SERVICE_INVALID_VALUE;
2940     }
2941 
2942     int32_t ret = CheckSysApiPermission();
2943     if (ret != UEC_OK) {
2944         USB_HILOGE(MODULE_USB_SERVICE,
2945             "%{public}s: SerialCheckSysApiPermission failed ret = %{public}d", __func__, ret);
2946         ReportUsbSerialOperationFaultSysEvent(portId, "AddSerialRight", ret, "SerialCheckSysApiPermission failed");
2947         return ret;
2948     }
2949     if ((ret = CheckDbAbility(portId)) != UEC_OK) {
2950         return ret;
2951     }
2952     std::string deviceName;
2953     std::string deviceVidPidSerialNum;
2954     ret = ValidateUsbSerialManagerAndPort(portId);
2955     if (ret != UEC_OK) {
2956         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: ValidateUsbSerialManagerAndPort failed", __func__);
2957         ReportUsbSerialOperationFaultSysEvent(portId, "AddSerialRight", ret, "ValidateUsbSerialManagerAndPort failed");
2958         return ret;
2959     }
2960     ret = GetDeviceVidPidSerialNumber(portId, deviceName, deviceVidPidSerialNum);
2961     if (ret != UEC_OK) {
2962         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: can not find deviceName.", __func__);
2963         ReportUsbSerialOperationFaultSysEvent(portId, "AddSerialRight", ret, "can not find deviceName.");
2964         return ret;
2965     }
2966 
2967     if (!usbRightManager_->AddDeviceRight(deviceVidPidSerialNum, std::to_string(tokenId).c_str())) {
2968         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: AddDeviceRight failed", __func__);
2969         ReportUsbSerialOperationFaultSysEvent(portId, "AddSerialRight", UEC_SERIAL_DATEBASE_ERROR,
2970             "AddDeviceRight failed");
2971         return UEC_SERIAL_DATEBASE_ERROR;
2972     }
2973 
2974     USB_HILOGI(MODULE_USB_SERVICE, "AddRight done");
2975     return UEC_OK;
2976 }
2977 // LCOV_EXCL_STOP
2978 
2979 // LCOV_EXCL_START
GetDeviceVidPidSerialNumber(int32_t portId,std::string & deviceName,std::string & strDesc)2980 int32_t UsbService::GetDeviceVidPidSerialNumber(int32_t portId, std::string& deviceName, std::string& strDesc)
2981 {
2982     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
2983     int32_t isMatched = UEC_INTERFACE_INVALID_VALUE;
2984     std::lock_guard<std::mutex> guard(serialPidVidMapMutex_);
2985     for (auto it = serialVidPidMap_.begin(); it != serialVidPidMap_.end(); ++it) {
2986         USB_HILOGI(MODULE_USB_SERVICE, " it->first = %{public}d", it->first);
2987         if (it->first == portId) {
2988             deviceName = it->second.first;
2989             strDesc = it->second.second;
2990             isMatched = UEC_OK;
2991             break;
2992         }
2993     }
2994     return isMatched;
2995 }
2996 // LCOV_EXCL_STOP
2997 
2998 // LCOV_EXCL_START
UpdateDeviceVidPidMap(std::vector<OHOS::HDI::Usb::Serial::V1_0::SerialPort> & serialPortList)2999 void UsbService::UpdateDeviceVidPidMap(std::vector<OHOS::HDI::Usb::Serial::V1_0::SerialPort>& serialPortList)
3000 {
3001     USB_HILOGI(MODULE_USB_SERVICE, "%{public}s: Start", __func__);
3002     std::lock_guard<std::mutex> guard(serialPidVidMapMutex_);
3003     serialVidPidMap_.clear();
3004     for (auto &ele: serialPortList) {
3005         std::string busNum = std::to_string(ele.deviceInfo.busNum);
3006         std::string devAddr = std::to_string(ele.deviceInfo.devAddr);
3007         std::string vid = std::to_string(ele.deviceInfo.vid);
3008         std::string pid = std::to_string(ele.deviceInfo.pid);
3009         std::string deviceName = busNum + "-" + devAddr;
3010         std::string deviceVidPidSerialNum = vid + "-" + pid + "-" + ele.deviceInfo.serialNum;
3011         serialVidPidMap_.insert({ele.portId, {deviceName, deviceVidPidSerialNum}});
3012     }
3013     USB_HILOGI(MODULE_USB_SERVICE, "deviceVidPidMap size=%{public}zu", serialVidPidMap_.size());
3014 }
3015 // LCOV_EXCL_STOP
3016 
3017 // LCOV_EXCL_START
ReportUsbSerialOperationSysEvent(int32_t portId,const std::string & operationType)3018 void UsbService::ReportUsbSerialOperationSysEvent(int32_t portId, const std::string &operationType)
3019 {
3020     USB_HILOGI(MODULE_USB_SERVICE, "the behavior of the usb serial");
3021     OHOS::HDI::Usb::Serial::V1_0::SerialPort serialPort;
3022     if (!usbSerialManager_->GetSerialPort(portId, serialPort)) {
3023         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: GetSerialPort failed", __func__);
3024         return;
3025     }
3026 
3027     OHOS::HDI::Usb::Serial::V1_0::SerialAttribute attribute;
3028     if (usbSerialManager_->SerialGetAttribute(portId, attribute) != UEC_OK) {
3029         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: SerialGetAttribute failed", __func__);
3030         return;
3031     }
3032 
3033 #if defined(USB_MANAGER_FEATURE_HOST) || defined(USB_MANAGER_FEATURE_DEVICE)
3034     std::string bundleName;
3035     std::string tokenId;
3036     int32_t userId = USB_RIGHT_USERID_INVALID;
3037     if (!GetCallingInfo(bundleName, tokenId, userId)) {
3038         USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: GetCallingInfo failed", __func__);
3039         return;
3040     }
3041 
3042     HiSysEventWrite(HiSysEvent::Domain::USB, "SERIAL_OPERATION",
3043         HiSysEvent::EventType::BEHAVIOR, "OPERATION_TYPE_NAME", operationType,
3044         "CLIENT_NAME", bundleName,
3045         "PORT_VID", serialPort.deviceInfo.vid,
3046         "PORT_PID", serialPort.deviceInfo.pid,
3047         "PORT_ID", serialPort.deviceInfo.serialNum,
3048         "ATTRIBUTE_BAUD_RATE", attribute.baudrate,
3049         "ATTRIBUTE_STOP_BIT", attribute.stopBits,
3050         "ATTRIBUTE_PARITY_CHECK", attribute.parity,
3051         "ATTRIBUTE_DATA_BIT", attribute.dataBits);
3052 #endif // USB_MANAGER_FEATURE_HOST || USB_MANAGER_FEATURE_DEVICE
3053 }
3054 // LCOV_EXCL_STOP
3055 
3056 // LCOV_EXCL_START
ReportUsbOperationFaultSysEvent(const std::string & operationType,int32_t failReason,const std::string & failDescription)3057 void UsbService::ReportUsbOperationFaultSysEvent(const std::string &operationType, int32_t failReason,
3058     const std::string &failDescription)
3059 {
3060     USB_HILOGI(MODULE_USB_SERVICE, "report operation fault");
3061     HiSysEventWrite(HiSysEvent::Domain::USB, "OPERATION_FAULT",
3062         HiSysEvent::EventType::FAULT, "OPERATION_TYPE_NAME", operationType,
3063         "FAIL_REASON", failReason,
3064         "FAIL_DESCRIPTION", failDescription);
3065 }
3066 // LCOV_EXCL_STOP
3067 
3068 // LCOV_EXCL_START
ReportUsbSerialOperationFaultSysEvent(int32_t portId,const std::string & operationType,int32_t failReason,const std::string & failDescription)3069 void UsbService::ReportUsbSerialOperationFaultSysEvent(int32_t portId, const std::string &operationType,
3070     int32_t failReason, const std::string &failDescription)
3071 {
3072     USB_HILOGI(MODULE_USB_SERVICE, "serial port operation fault");
3073     HiSysEventWrite(HiSysEvent::Domain::USB, "OPERATION_FAULT",
3074         HiSysEvent::EventType::FAULT, "OPERATION_TYPE_NAME", operationType,
3075         "FAIL_REASON", failReason,
3076         "FAIL_DESCRIPTION", failDescription);
3077 }
3078 // LCOV_EXCL_STOP
3079 } // namespace USB
3080 } // namespace OHOS
3081