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 ¶m, 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 ¶m, 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 ¶m)
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 ¶m,
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