1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "device_manager_service.h"
17
18 #include <dlfcn.h>
19 #include <functional>
20
21 #include "app_manager.h"
22 #include "dm_anonymous.h"
23 #include "dm_constants.h"
24 #include "dm_hidumper.h"
25 #include "dm_log.h"
26 #include "dm_softbus_adapter_crypto.h"
27 #include "parameter.h"
28 #include "permission_manager.h"
29
30 constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.z.so";
31
32 namespace OHOS {
33 namespace DistributedHardware {
34 IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService);
35
~DeviceManagerService()36 DeviceManagerService::~DeviceManagerService()
37 {
38 LOGI("DeviceManagerService destructor");
39 if (dmServiceImpl_ != nullptr) {
40 dmServiceImpl_->Release();
41 }
42 char path[PATH_MAX + 1] = {0x00};
43 std::string soPathName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
44 if ((soPathName.length() == 0) || (soPathName.length() > PATH_MAX) ||
45 (realpath(soPathName.c_str(), path) == nullptr)) {
46 LOGE("File %s canonicalization failed.", soPathName.c_str());
47 return;
48 }
49 void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
50 if (so_handle != nullptr) {
51 dlclose(so_handle);
52 }
53 }
54
Init()55 int32_t DeviceManagerService::Init()
56 {
57 InitSoftbusListener();
58 InitDMServiceListener();
59
60 LOGI("Init success, dm service single instance initialized.");
61 return DM_OK;
62 }
63
InitSoftbusListener()64 int32_t DeviceManagerService::InitSoftbusListener()
65 {
66 if (softbusListener_ == nullptr) {
67 softbusListener_ = std::make_shared<SoftbusListener>();
68 }
69 LOGI("SoftbusListener init success.");
70
71 return DM_OK;
72 }
73
UninitSoftbusListener()74 void DeviceManagerService::UninitSoftbusListener()
75 {
76 softbusListener_ = nullptr;
77 LOGI("SoftbusListener uninit.");
78 }
79
InitDMServiceListener()80 int32_t DeviceManagerService::InitDMServiceListener()
81 {
82 if (listener_ == nullptr) {
83 listener_ = std::make_shared<DeviceManagerServiceListener>();
84 }
85
86 LOGI("DeviceManagerServiceListener init success.");
87 return DM_OK;
88 }
89
UninitDMServiceListener()90 void DeviceManagerService::UninitDMServiceListener()
91 {
92 listener_ = nullptr;
93 LOGI("DeviceManagerServiceListener uninit.");
94 }
95
RegisterDeviceManagerListener(const std::string & pkgName)96 void DeviceManagerService::RegisterDeviceManagerListener(const std::string &pkgName)
97 {
98 listener_->RegisterDmListener(pkgName, AppManager::GetInstance().GetAppId());
99 }
100
UnRegisterDeviceManagerListener(const std::string & pkgName)101 void DeviceManagerService::UnRegisterDeviceManagerListener(const std::string &pkgName)
102 {
103 listener_->UnRegisterDmListener(pkgName);
104 }
105
GetTrustedDeviceList(const std::string & pkgName,const std::string & extra,std::vector<DmDeviceInfo> & deviceList)106 int32_t DeviceManagerService::GetTrustedDeviceList(const std::string &pkgName, const std::string &extra,
107 std::vector<DmDeviceInfo> &deviceList)
108 {
109 LOGI("DeviceManagerService::GetTrustedDeviceList begin for pkgName = %s, extra = %s", pkgName.c_str(),
110 extra.c_str());
111 if (pkgName.empty()) {
112 LOGE("Invalid parameter, pkgName is empty.");
113 return ERR_DM_INPUT_PARA_INVALID;
114 }
115 int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
116 if (ret != DM_OK) {
117 LOGE("GetTrustedDeviceList failed");
118 return ret;
119 }
120 if (deviceList.size() > 0 && IsDMServiceImplReady()) {
121 return dmServiceImpl_->GetGroupType(deviceList);
122 }
123 return DM_OK;
124 }
125
GetAvailableDeviceList(const std::string & pkgName,std::vector<DmDeviceBasicInfo> & deviceBasicInfoList)126 int32_t DeviceManagerService::GetAvailableDeviceList(const std::string &pkgName,
127 std::vector<DmDeviceBasicInfo> &deviceBasicInfoList)
128 {
129 LOGI("DeviceManagerService::GetAvailableDeviceList begin for pkgName = %s", pkgName.c_str());
130 if (pkgName.empty()) {
131 LOGE("Invalid parameter, pkgName is empty.");
132 return ERR_DM_INPUT_PARA_INVALID;
133 }
134 int32_t ret = softbusListener_->GetAvailableDeviceList(deviceBasicInfoList);
135 if (ret != DM_OK) {
136 LOGE("GetAvailableDeviceList failed");
137 return ret;
138 }
139
140 if (deviceBasicInfoList.size() > 0 && IsDMServiceImplReady()) {
141 for (auto it = deviceBasicInfoList.begin(); it != deviceBasicInfoList.end(); ++it) {
142 std::string udidHash = "";
143 ret = dmServiceImpl_->GetUdidHashByNetWorkId(it->networkId, udidHash);
144 if (ret != DM_OK) {
145 LOGE("DeviceManagerService::GetAvailableDeviceList get UdidHash by network failed.");
146 return ret;
147 }
148 std::string deviceId = listener_->CalcDeviceId(pkgName, udidHash);
149 if (memcpy_s(it->deviceId, DM_MAX_DEVICE_ID_LEN, deviceId.c_str(),
150 deviceId.length()) != 0) {
151 LOGE("get deviceId: %s failed", GetAnonyString(deviceId).c_str());
152 }
153 }
154 }
155 return DM_OK;
156 }
157
ShiftLNNGear(const std::string & pkgName,const std::string & callerId,bool isRefresh)158 int32_t DeviceManagerService::ShiftLNNGear(const std::string &pkgName, const std::string &callerId, bool isRefresh)
159 {
160 LOGI("DeviceManagerService::ShiftLNNGear begin for pkgName = %s, callerId = %s, isRefresh = %d", pkgName.c_str(),
161 callerId.c_str(), isRefresh);
162 if (pkgName.empty() || callerId.empty()) {
163 LOGE("Invalid parameter, parameter is empty.");
164 return ERR_DM_INPUT_PARA_INVALID;
165 }
166 if (isRefresh) {
167 int32_t ret = softbusListener_->ShiftLNNGear();
168 if (ret != DM_OK) {
169 LOGE("ShiftLNNGear error, failed ret: %d", ret);
170 return ret;
171 }
172 }
173 return DM_OK;
174 }
175
GetDeviceInfo(const std::string & networkId,DmDeviceInfo & info)176 int32_t DeviceManagerService::GetDeviceInfo(const std::string &networkId, DmDeviceInfo &info)
177 {
178 if (!PermissionManager::GetInstance().CheckPermission() &&
179 !PermissionManager::GetInstance().CheckNewPermission()) {
180 LOGE("The caller does not have permission to call GetDeviceInfo.");
181 return ERR_DM_NO_PERMISSION;
182 }
183 if (networkId.empty()) {
184 LOGE("Invalid parameter, networkId is empty.");
185 return ERR_DM_INPUT_PARA_INVALID;
186 }
187 LOGI("DeviceManagerService::GetDeviceInfo begin by networkId : %s.", GetAnonyString(networkId).c_str());
188 int32_t ret = softbusListener_->GetDeviceInfo(networkId, info);
189 if (ret != DM_OK) {
190 LOGE("Get DeviceInfo By NetworkId failed, ret : %d", ret);
191 }
192 return ret;
193 }
194
GetLocalDeviceInfo(DmDeviceInfo & info)195 int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info)
196 {
197 LOGI("DeviceManagerService::GetLocalDeviceInfo begin.");
198 int32_t ret = softbusListener_->GetLocalDeviceInfo(info);
199 if (ret != DM_OK) {
200 LOGE("GetLocalDeviceInfo failed");
201 return ret;
202 }
203 if (localDeviceId_.empty()) {
204 char localDeviceId[DEVICE_UUID_LENGTH] = {0};
205 char udidHash[DEVICE_UUID_LENGTH] = {0};
206 GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
207 if (DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId,
208 (uint8_t *)udidHash) == DM_OK) {
209 localDeviceId_ = udidHash;
210 }
211 }
212
213 if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, localDeviceId_.c_str(), localDeviceId_.length()) != 0) {
214 LOGE("get deviceId: %s failed", GetAnonyString(localDeviceId_).c_str());
215 }
216 return DM_OK;
217 }
218
GetLocalDeviceNetworkId(std::string & networkId)219 int32_t DeviceManagerService::GetLocalDeviceNetworkId(std::string &networkId)
220 {
221 LOGI("DeviceManagerService::GetLocalDeviceNetworkId begin.");
222 int32_t ret = softbusListener_->GetLocalDeviceNetworkId(networkId);
223 if (ret != DM_OK) {
224 LOGE("GetLocalDeviceNetworkId failed");
225 return ret;
226 }
227 return DM_OK;
228 }
229
GetLocalDeviceId(const std::string & pkgName,std::string & deviceId)230 int32_t DeviceManagerService::GetLocalDeviceId(const std::string &pkgName, std::string &deviceId)
231 {
232 LOGI("DeviceManagerService::GetLocalDeviceId begin.");
233 char localDeviceId[DEVICE_UUID_LENGTH] = {0};
234 char udidHash[DEVICE_UUID_LENGTH] = {0};
235 GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
236 int32_t ret = DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId, (uint8_t *)udidHash);
237 if (ret != DM_OK) {
238 LOGE("get udidhash by udid: %s failed.", GetAnonyString(localDeviceId).c_str());
239 deviceId = "";
240 return ret;
241 }
242 deviceId = listener_->CalcDeviceId(pkgName, static_cast<std::string>(udidHash));
243 return DM_OK;
244 }
245
GetLocalDeviceName(std::string & deviceName)246 int32_t DeviceManagerService::GetLocalDeviceName(std::string &deviceName)
247 {
248 LOGI("DeviceManagerService::GetLocalDeviceName begin.");
249 int32_t ret = softbusListener_->GetLocalDeviceName(deviceName);
250 if (ret != DM_OK) {
251 LOGE("GetLocalDeviceName failed");
252 return ret;
253 }
254 return DM_OK;
255 }
256
GetLocalDeviceType(int32_t & deviceType)257 int32_t DeviceManagerService::GetLocalDeviceType(int32_t &deviceType)
258 {
259 LOGI("DeviceManagerService::GetLocalDeviceType begin.");
260 int32_t ret = softbusListener_->GetLocalDeviceType(deviceType);
261 if (ret != DM_OK) {
262 LOGE("GetLocalDeviceType failed");
263 return ret;
264 }
265 return DM_OK;
266 }
267
GetUdidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & udid)268 int32_t DeviceManagerService::GetUdidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
269 std::string &udid)
270 {
271 if (!PermissionManager::GetInstance().CheckPermission() &&
272 !PermissionManager::GetInstance().CheckNewPermission()) {
273 LOGE("The caller: %s does not have permission to call GetUdidByNetworkId.",
274 pkgName.c_str());
275 return ERR_DM_NO_PERMISSION;
276 }
277 LOGI("DeviceManagerService::GetUdidByNetworkId begin for pkgName = %s", pkgName.c_str());
278 if (pkgName.empty() || netWorkId.empty()) {
279 LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
280 return ERR_DM_INPUT_PARA_INVALID;
281 }
282 SoftbusListener::GetUdidByNetworkId(netWorkId.c_str(), udid);
283 return DM_OK;
284 }
285
GetUuidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & uuid)286 int32_t DeviceManagerService::GetUuidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
287 std::string &uuid)
288 {
289 if (!PermissionManager::GetInstance().CheckPermission() &&
290 !PermissionManager::GetInstance().CheckNewPermission()) {
291 LOGE("The caller: %s does not have permission to call GetUuidByNetworkId.",
292 pkgName.c_str());
293 return ERR_DM_NO_PERMISSION;
294 }
295 LOGI("DeviceManagerService::GetUuidByNetworkId begin for pkgName = %s", pkgName.c_str());
296 if (pkgName.empty() || netWorkId.empty()) {
297 LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
298 return ERR_DM_INPUT_PARA_INVALID;
299 }
300 SoftbusListener::GetUuidByNetworkId(netWorkId.c_str(), uuid);
301 return DM_OK;
302 }
303
StartDeviceDiscovery(const std::string & pkgName,const DmSubscribeInfo & subscribeInfo,const std::string & extra)304 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const DmSubscribeInfo &subscribeInfo,
305 const std::string &extra)
306 {
307 if (!PermissionManager::GetInstance().CheckPermission()) {
308 LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.",
309 pkgName.c_str());
310 return ERR_DM_NO_PERMISSION;
311 }
312 LOGI("DeviceManagerService::StartDeviceDiscovery begin for pkgName = %s, extra = %s", pkgName.c_str(),
313 extra.c_str());
314 if (pkgName.empty()) {
315 LOGE("Invalid parameter, pkgName is empty.");
316 return ERR_DM_INPUT_PARA_INVALID;
317 }
318 if (!IsDMServiceImplReady()) {
319 LOGE("StartDeviceDiscovery failed, instance not init or init failed.");
320 return ERR_DM_NOT_INIT;
321 }
322 return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeInfo, extra);
323 }
324
StartDeviceDiscovery(const std::string & pkgName,const uint16_t subscribeId,const std::string & filterOptions)325 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const uint16_t subscribeId,
326 const std::string &filterOptions)
327 {
328 if (!PermissionManager::GetInstance().CheckNewPermission()) {
329 LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.",
330 pkgName.c_str());
331 return ERR_DM_NO_PERMISSION;
332 }
333 LOGI("StartDeviceDiscovery begin for pkgName = %s, filterOptions = %s, subscribeId = %d",
334 pkgName.c_str(), filterOptions.c_str(), subscribeId);
335 if (pkgName.empty()) {
336 LOGE("Invalid parameter, pkgName is empty.");
337 return ERR_DM_INPUT_PARA_INVALID;
338 }
339 if (!IsDMServiceImplReady()) {
340 LOGE("StartDeviceDiscovery failed, instance not init or init failed.");
341 return ERR_DM_NOT_INIT;
342 }
343 return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeId, filterOptions);
344 }
345
StopDeviceDiscovery(const std::string & pkgName,uint16_t subscribeId)346 int32_t DeviceManagerService::StopDeviceDiscovery(const std::string &pkgName, uint16_t subscribeId)
347 {
348 if (!PermissionManager::GetInstance().CheckPermission() &&
349 !PermissionManager::GetInstance().CheckNewPermission()) {
350 LOGE("The caller: %s does not have permission to call StopDeviceDiscovery.", pkgName.c_str());
351 return ERR_DM_NO_PERMISSION;
352 }
353 LOGI("DeviceManagerService::StopDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
354 if (pkgName.empty()) {
355 LOGE("Invalid parameter, pkgName is empty.");
356 return ERR_DM_INPUT_PARA_INVALID;
357 }
358 if (!IsDMServiceImplReady()) {
359 LOGE("StopDeviceDiscovery failed, instance not init or init failed.");
360 return ERR_DM_NOT_INIT;
361 }
362 return dmServiceImpl_->StopDeviceDiscovery(pkgName, subscribeId);
363 }
364
PublishDeviceDiscovery(const std::string & pkgName,const DmPublishInfo & publishInfo)365 int32_t DeviceManagerService::PublishDeviceDiscovery(const std::string &pkgName, const DmPublishInfo &publishInfo)
366 {
367 if (!PermissionManager::GetInstance().CheckPermission() &&
368 !PermissionManager::GetInstance().CheckNewPermission()) {
369 LOGE("The caller: %s does not have permission to call PublishDeviceDiscovery.", pkgName.c_str());
370 return ERR_DM_NO_PERMISSION;
371 }
372 LOGI("DeviceManagerService::PublishDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
373 if (pkgName.empty()) {
374 LOGE("Invalid parameter, pkgName is empty.");
375 return ERR_DM_INPUT_PARA_INVALID;
376 }
377 if (!IsDMServiceImplReady()) {
378 LOGE("PublishDeviceDiscovery failed, instance not init or init failed.");
379 return ERR_DM_NOT_INIT;
380 }
381 return dmServiceImpl_->PublishDeviceDiscovery(pkgName, publishInfo);
382 }
383
UnPublishDeviceDiscovery(const std::string & pkgName,int32_t publishId)384 int32_t DeviceManagerService::UnPublishDeviceDiscovery(const std::string &pkgName, int32_t publishId)
385 {
386 if (!PermissionManager::GetInstance().CheckPermission() &&
387 !PermissionManager::GetInstance().CheckNewPermission()) {
388 LOGE("The caller: %s does not have permission to call UnPublishDeviceDiscovery.", pkgName.c_str());
389 return ERR_DM_NO_PERMISSION;
390 }
391 if (pkgName.empty()) {
392 LOGE("Invalid parameter, pkgName is empty.");
393 return ERR_DM_INPUT_PARA_INVALID;
394 }
395 if (!IsDMServiceImplReady()) {
396 LOGE("UnPublishDeviceDiscovery failed, instance not init or init failed.");
397 return ERR_DM_NOT_INIT;
398 }
399 return dmServiceImpl_->UnPublishDeviceDiscovery(pkgName, publishId);
400 }
401
AuthenticateDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & extra)402 int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,
403 const std::string &deviceId, const std::string &extra)
404 {
405 if (!PermissionManager::GetInstance().CheckPermission()) {
406 LOGE("The caller: %s does not have permission to call AuthenticateDevice.",
407 pkgName.c_str());
408 return ERR_DM_NO_PERMISSION;
409 }
410 if (pkgName.empty() || deviceId.empty()) {
411 LOGE("DeviceManagerService::AuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
412 return ERR_DM_INPUT_PARA_INVALID;
413 }
414 if (!IsDMServiceImplReady()) {
415 LOGE("AuthenticateDevice failed, instance not init or init failed.");
416 return ERR_DM_NOT_INIT;
417 }
418 return dmServiceImpl_->AuthenticateDevice(pkgName, authType, deviceId, extra);
419 }
420
UnAuthenticateDevice(const std::string & pkgName,const std::string & networkId)421 int32_t DeviceManagerService::UnAuthenticateDevice(const std::string &pkgName, const std::string &networkId)
422 {
423 if (!PermissionManager::GetInstance().CheckPermission()) {
424 LOGE("The caller: %s does not have permission to call UnAuthenticateDevice.",
425 pkgName.c_str());
426 return ERR_DM_NO_PERMISSION;
427 }
428 LOGI("DeviceManagerService::UnAuthenticateDevice begin for pkgName = %s, networkId = %s",
429 pkgName.c_str(), GetAnonyString(networkId).c_str());
430 if (pkgName.empty() || networkId.empty()) {
431 LOGE("DeviceManagerService::UnAuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
432 return ERR_DM_INPUT_PARA_INVALID;
433 }
434 if (!IsDMServiceImplReady()) {
435 LOGE("UnAuthenticateDevice failed, instance not init or init failed.");
436 return ERR_DM_NOT_INIT;
437 }
438 return dmServiceImpl_->UnAuthenticateDevice(pkgName, networkId);
439 }
440
BindDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & bindParam)441 int32_t DeviceManagerService::BindDevice(const std::string &pkgName, int32_t authType, const std::string &deviceId,
442 const std::string &bindParam)
443 {
444 if (!PermissionManager::GetInstance().CheckNewPermission()) {
445 LOGI("The caller does not have permission to call BindDevice.");
446 return ERR_DM_NO_PERMISSION;
447 }
448 if (pkgName.empty() || deviceId.empty()) {
449 LOGE("DeviceManagerService::BindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
450 return ERR_DM_INPUT_PARA_INVALID;
451 }
452 if (!IsDMServiceImplReady()) {
453 LOGE("BindDevice failed, instance not init or init failed.");
454 return ERR_DM_NOT_INIT;
455 }
456 std::string udidHash = listener_->GetUdidHash(deviceId);
457 return dmServiceImpl_->BindDevice(pkgName, authType, udidHash, bindParam);
458 }
459
UnBindDevice(const std::string & pkgName,const std::string & deviceId)460 int32_t DeviceManagerService::UnBindDevice(const std::string &pkgName, const std::string &deviceId)
461 {
462 if (!PermissionManager::GetInstance().CheckNewPermission()) {
463 LOGI("The caller does not have permission to call UnBindDevice.");
464 return ERR_DM_NO_PERMISSION;
465 }
466 LOGI("DeviceManagerService::UnBindDevice begin for pkgName = %s, deviceId = %s",
467 pkgName.c_str(), GetAnonyString(deviceId).c_str());
468 if (pkgName.empty() || deviceId.empty()) {
469 LOGE("DeviceManagerService::UnBindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
470 return ERR_DM_INPUT_PARA_INVALID;
471 }
472 if (!IsDMServiceImplReady()) {
473 LOGE("UnBindDevice failed, instance not init or init failed.");
474 return ERR_DM_NOT_INIT;
475 }
476 std::string udidHash = listener_->GetUdidHash(deviceId);
477 listener_->DeleteDeviceIdFromMap(deviceId);
478 return dmServiceImpl_->UnBindDevice(pkgName, udidHash);
479 }
480
VerifyAuthentication(const std::string & authParam)481 int32_t DeviceManagerService::VerifyAuthentication(const std::string &authParam)
482 {
483 if (!PermissionManager::GetInstance().CheckPermission() &&
484 !PermissionManager::GetInstance().CheckNewPermission()) {
485 LOGE("The caller: %s does not have permission to call VerifyAuthentication.");
486 return ERR_DM_NO_PERMISSION;
487 }
488 if (authParam.empty()) {
489 LOGE("DeviceManagerService::VerifyAuthentication error: Invalid parameter, authParam: %s", authParam.c_str());
490 return ERR_DM_INPUT_PARA_INVALID;
491 }
492 if (!IsDMServiceImplReady()) {
493 LOGE("DeviceManagerService::VerifyAuthentication failed, instance not init or init failed.");
494 return ERR_DM_NOT_INIT;
495 }
496 return dmServiceImpl_->VerifyAuthentication(authParam);
497 }
498
GetFaParam(std::string & pkgName,DmAuthParam & authParam)499 int32_t DeviceManagerService::GetFaParam(std::string &pkgName, DmAuthParam &authParam)
500 {
501 if (!PermissionManager::GetInstance().CheckPermission() &&
502 !PermissionManager::GetInstance().CheckNewPermission()) {
503 LOGE("The caller: %s does not have permission to call GetFaParam.",
504 pkgName.c_str());
505 return ERR_DM_NO_PERMISSION;
506 }
507 if (pkgName.empty()) {
508 LOGE("Invalid parameter, pkgName is empty.");
509 return ERR_DM_INPUT_PARA_INVALID;
510 }
511 if (!IsDMServiceImplReady()) {
512 LOGE("GetFaParam failed, instance not init or init failed.");
513 return ERR_DM_NOT_INIT;
514 }
515 return dmServiceImpl_->GetFaParam(pkgName, authParam);
516 }
517
SetUserOperation(std::string & pkgName,int32_t action,const std::string & params)518 int32_t DeviceManagerService::SetUserOperation(std::string &pkgName, int32_t action, const std::string ¶ms)
519 {
520 if (!PermissionManager::GetInstance().CheckPermission() &&
521 !PermissionManager::GetInstance().CheckNewPermission()) {
522 LOGE("The caller: %s does not have permission to call SetUserOperation.",
523 pkgName.c_str());
524 return ERR_DM_NO_PERMISSION;
525 }
526 if (pkgName.empty() || params.empty()) {
527 LOGE("DeviceManagerService::SetUserOperation error: Invalid parameter, pkgName: %s", pkgName.c_str(),
528 params.c_str());
529 return ERR_DM_INPUT_PARA_INVALID;
530 }
531 if (!IsDMServiceImplReady()) {
532 LOGE("SetUserOperation failed, instance not init or init failed.");
533 return ERR_DM_NOT_INIT;
534 }
535 return dmServiceImpl_->SetUserOperation(pkgName, action, params);
536 }
537
RegisterDevStateCallback(const std::string & pkgName,const std::string & extra)538 int32_t DeviceManagerService::RegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
539 {
540 if (pkgName.empty()) {
541 LOGE("DeviceManagerService::RegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
542 return ERR_DM_INPUT_PARA_INVALID;
543 }
544 {
545 std::lock_guard<std::mutex> lock(registerDevStateLock_);
546 if (registerDevStateMap_.count(pkgName) == 0) {
547 registerDevStateMap_.insert(std::map<std::string, std::string>::value_type (pkgName, extra));
548 }
549 }
550 return DM_OK;
551 }
552
UnRegisterDevStateCallback(const std::string & pkgName,const std::string & extra)553 int32_t DeviceManagerService::UnRegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
554 {
555 if (pkgName.empty()) {
556 LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
557 return ERR_DM_INPUT_PARA_INVALID;
558 }
559 {
560 std::lock_guard<std::mutex> lock(registerDevStateLock_);
561 if (registerDevStateMap_.count(pkgName) > 0) {
562 registerDevStateMap_.erase(pkgName);
563 }
564 }
565 if (IsDMServiceImplSoLoaded()) {
566 return dmServiceImpl_->UnRegisterDevStateCallback(pkgName, extra);
567 }
568 return DM_OK;
569 }
570
HandleDeviceOnline(DmDeviceInfo & info)571 void DeviceManagerService::HandleDeviceOnline(DmDeviceInfo &info)
572 {
573 if (!IsDMServiceImplReady()) {
574 LOGE("HandleDeviceOnline failed, instance not init or init failed.");
575 return;
576 }
577 {
578 std::lock_guard<std::mutex> lock(registerDevStateLock_);
579 for (auto iter : registerDevStateMap_) {
580 dmServiceImpl_->RegisterDevStateCallback(iter.first, iter.second);
581 }
582 }
583 dmServiceImpl_->HandleDeviceOnline(info);
584 }
585
HandleDeviceOffline(DmDeviceInfo & info)586 void DeviceManagerService::HandleDeviceOffline(DmDeviceInfo &info)
587 {
588 if (!IsDMServiceImplReady()) {
589 LOGE("HandleDeviceOffline failed, instance not init or init failed.");
590 return;
591 }
592 dmServiceImpl_->HandleDeviceOffline(info);
593 }
594
HandleDeviceNameChange(DmDeviceInfo & info)595 void DeviceManagerService::HandleDeviceNameChange(DmDeviceInfo &info)
596 {
597 if (!IsDMServiceImplReady()) {
598 LOGE("HandleDeviceNameChange failed, instance not init or init failed.");
599 return;
600 }
601 dmServiceImpl_->HandleDeviceNameChange(info);
602 }
603
OnSessionOpened(int sessionId,int result)604 int DeviceManagerService::OnSessionOpened(int sessionId, int result)
605 {
606 if (!IsDMServiceImplReady()) {
607 LOGE("OnSessionOpened failed, instance not init or init failed.");
608 return ERR_DM_NOT_INIT;
609 }
610 return dmServiceImpl_->OnSessionOpened(sessionId, result);
611 }
612
OnSessionClosed(int sessionId)613 void DeviceManagerService::OnSessionClosed(int sessionId)
614 {
615 if (!IsDMServiceImplReady()) {
616 LOGE("OnSessionClosed failed, instance not init or init failed.");
617 return;
618 }
619 dmServiceImpl_->OnSessionClosed(sessionId);
620 }
621
OnBytesReceived(int sessionId,const void * data,unsigned int dataLen)622 void DeviceManagerService::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen)
623 {
624 if (!IsDMServiceImplReady()) {
625 LOGE("OnBytesReceived failed, instance not init or init failed.");
626 return;
627 }
628 dmServiceImpl_->OnBytesReceived(sessionId, data, dataLen);
629 }
630
RequestCredential(const std::string & reqJsonStr,std::string & returnJsonStr)631 int32_t DeviceManagerService::RequestCredential(const std::string &reqJsonStr, std::string &returnJsonStr)
632 {
633 if (!PermissionManager::GetInstance().CheckPermission() &&
634 !PermissionManager::GetInstance().CheckNewPermission()) {
635 LOGE("The caller does not have permission to call RequestCredential.");
636 return ERR_DM_NO_PERMISSION;
637 }
638 if (!IsDMServiceImplReady()) {
639 LOGE("RequestCredential failed, instance not init or init failed.");
640 return ERR_DM_NOT_INIT;
641 }
642 return dmServiceImpl_->RequestCredential(reqJsonStr, returnJsonStr);
643 }
644
ImportCredential(const std::string & pkgName,const std::string & credentialInfo)645 int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &credentialInfo)
646 {
647 if (!PermissionManager::GetInstance().CheckPermission() &&
648 !PermissionManager::GetInstance().CheckNewPermission()) {
649 LOGE("The caller: %s does not have permission to call ImportCredential.",
650 pkgName.c_str());
651 return ERR_DM_NO_PERMISSION;
652 }
653 if (!IsDMServiceImplReady()) {
654 LOGE("ImportCredential failed, instance not init or init failed.");
655 return ERR_DM_NOT_INIT;
656 }
657 return dmServiceImpl_->ImportCredential(pkgName, credentialInfo);
658 }
659
DeleteCredential(const std::string & pkgName,const std::string & deleteInfo)660 int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &deleteInfo)
661 {
662 if (!PermissionManager::GetInstance().CheckPermission() &&
663 !PermissionManager::GetInstance().CheckNewPermission()) {
664 LOGE("The caller: %s does not have permission to call DeleteCredential.",
665 pkgName.c_str());
666 return ERR_DM_NO_PERMISSION;
667 }
668 if (!IsDMServiceImplReady()) {
669 LOGE("DeleteCredential failed, instance not init or init failed.");
670 return ERR_DM_NOT_INIT;
671 }
672 return dmServiceImpl_->DeleteCredential(pkgName, deleteInfo);
673 }
674
RegisterCredentialCallback(const std::string & pkgName)675 int32_t DeviceManagerService::RegisterCredentialCallback(const std::string &pkgName)
676 {
677 if (!PermissionManager::GetInstance().CheckPermission() &&
678 !PermissionManager::GetInstance().CheckNewPermission()) {
679 LOGE("The caller: %s does not have permission to call RegisterCredentialCallback.",
680 pkgName.c_str());
681 return ERR_DM_NO_PERMISSION;
682 }
683 if (!IsDMServiceImplReady()) {
684 LOGE("RegisterCredentialCallback failed, instance not init or init failed.");
685 return ERR_DM_NOT_INIT;
686 }
687 return dmServiceImpl_->RegisterCredentialCallback(pkgName);
688 }
689
UnRegisterCredentialCallback(const std::string & pkgName)690 int32_t DeviceManagerService::UnRegisterCredentialCallback(const std::string &pkgName)
691 {
692 if (!PermissionManager::GetInstance().CheckPermission() &&
693 !PermissionManager::GetInstance().CheckNewPermission()) {
694 LOGE("The caller: %s does not have permission to call UnRegisterCredentialCallback.",
695 pkgName.c_str());
696 return ERR_DM_NO_PERMISSION;
697 }
698 if (!IsDMServiceImplReady()) {
699 LOGE("UnRegisterCredentialCallback failed, instance not init or init failed.");
700 return ERR_DM_NOT_INIT;
701 }
702 return dmServiceImpl_->UnRegisterCredentialCallback(pkgName);
703 }
704
RegisterUiStateCallback(const std::string & pkgName)705 int32_t DeviceManagerService::RegisterUiStateCallback(const std::string &pkgName)
706 {
707 if (pkgName.empty()) {
708 LOGE("DeviceManagerService::RegisterUiStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
709 return ERR_DM_INPUT_PARA_INVALID;
710 }
711 if (!IsDMServiceImplReady()) {
712 LOGE("RegisterUiStateCallback failed, instance not init or init failed.");
713 return ERR_DM_NOT_INIT;
714 }
715 return dmServiceImpl_->RegisterUiStateCallback(pkgName);
716 }
717
UnRegisterUiStateCallback(const std::string & pkgName)718 int32_t DeviceManagerService::UnRegisterUiStateCallback(const std::string &pkgName)
719 {
720 if (pkgName.empty()) {
721 LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
722 return ERR_DM_INPUT_PARA_INVALID;
723 }
724 if (!IsDMServiceImplReady()) {
725 LOGE("UnRegisterUiStateCallback failed, instance not init or init failed.");
726 return ERR_DM_NOT_INIT;
727 }
728 return dmServiceImpl_->UnRegisterUiStateCallback(pkgName);
729 }
730
IsDMServiceImplReady()731 bool DeviceManagerService::IsDMServiceImplReady()
732 {
733 std::lock_guard<std::mutex> lock(isImplLoadLock_);
734 if (isImplsoLoaded_ && (dmServiceImpl_ != nullptr)) {
735 return true;
736 }
737 char path[PATH_MAX + 1] = {0x00};
738 std::string soName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
739 if ((soName.length() == 0) || (soName.length() > PATH_MAX) || (realpath(soName.c_str(), path) == nullptr)) {
740 LOGE("File %s canonicalization failed.", soName.c_str());
741 return false;
742 }
743 void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
744 if (so_handle == nullptr) {
745 so_handle = dlopen(path, RTLD_NOW);
746 if (so_handle == nullptr) {
747 LOGE("load libdevicemanagerserviceimpl so %s failed.", soName.c_str());
748 return false;
749 }
750 }
751 dlerror();
752 auto func = (CreateDMServiceFuncPtr)dlsym(so_handle, "CreateDMServiceObject");
753 if (dlerror() != nullptr || func == nullptr) {
754 dlclose(so_handle);
755 LOGE("Create object function is not exist.");
756 return false;
757 }
758
759 dmServiceImpl_ = std::shared_ptr<IDeviceManagerServiceImpl>(func());
760 if (dmServiceImpl_->Initialize(listener_) != DM_OK) {
761 dlclose(so_handle);
762 dmServiceImpl_ = nullptr;
763 isImplsoLoaded_ = false;
764 return false;
765 }
766 isImplsoLoaded_ = true;
767 return true;
768 }
769
IsDMServiceImplSoLoaded()770 bool DeviceManagerService::IsDMServiceImplSoLoaded()
771 {
772 std::lock_guard<std::mutex> lock(isImplLoadLock_);
773 return isImplsoLoaded_;
774 }
775
DmHiDumper(const std::vector<std::string> & args,std::string & result)776 int32_t DeviceManagerService::DmHiDumper(const std::vector<std::string>& args, std::string &result)
777 {
778 LOGI("HiDump GetTrustedDeviceList");
779 std::vector<HidumperFlag> dumpflag;
780 HiDumpHelper::GetInstance().GetArgsType(args, dumpflag);
781
782 for (unsigned int i = 0; i < dumpflag.size(); i++) {
783 if (dumpflag[i] == HidumperFlag::HIDUMPER_GET_TRUSTED_LIST) {
784 std::vector<DmDeviceInfo> deviceList;
785
786 int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
787 if (ret != DM_OK) {
788 result.append("HiDumpHelper GetTrustedDeviceList failed");
789 LOGE("HiDumpHelper GetTrustedDeviceList failed");
790 return ERR_DM_FAILED;
791 }
792
793 for (unsigned int j = 0; j < deviceList.size(); j++) {
794 HiDumpHelper::GetInstance().SetNodeInfo(deviceList[j]);
795 LOGI("DeviceManagerService::DmHiDumper SetNodeInfo.");
796 }
797 }
798 }
799 HiDumpHelper::GetInstance().HiDump(args, result);
800 return DM_OK;
801 }
802
NotifyEvent(const std::string & pkgName,const int32_t eventId,const std::string & event)803 int32_t DeviceManagerService::NotifyEvent(const std::string &pkgName, const int32_t eventId, const std::string &event)
804 {
805 if (!PermissionManager::GetInstance().CheckPermission() &&
806 !PermissionManager::GetInstance().CheckNewPermission()) {
807 LOGE("The caller: %s does not have permission to call NotifyEvent.",
808 pkgName.c_str());
809 return ERR_DM_NO_PERMISSION;
810 }
811 if (!IsDMServiceImplReady()) {
812 LOGE("NotifyEvent failed, instance not init or init failed.");
813 return ERR_DM_NOT_INIT;
814 }
815 return dmServiceImpl_->NotifyEvent(pkgName, eventId, event);
816 }
817
LoadHardwareFwkService()818 void DeviceManagerService::LoadHardwareFwkService()
819 {
820 std::string extra;
821 std::vector<DmDeviceInfo> deviceList;
822 int32_t ret = GetTrustedDeviceList(DM_PKG_NAME, extra, deviceList);
823 if (ret != DM_OK) {
824 LOGE("LoadHardwareFwkService failed, get trusted devicelist failed.");
825 return;
826 }
827 if (deviceList.size() > 0) {
828 dmServiceImpl_->LoadHardwareFwkService();
829 }
830 }
831
GetEncryptedUuidByNetworkId(const std::string & pkgName,const std::string & networkId,std::string & uuid)832 int32_t DeviceManagerService::GetEncryptedUuidByNetworkId(const std::string &pkgName, const std::string &networkId,
833 std::string &uuid)
834 {
835 if (!IsDMServiceImplReady()) {
836 LOGE("GetEncryptedUuidByNetworkId failed, instance not init or init failed.");
837 return ERR_DM_NOT_INIT;
838 }
839 return dmServiceImpl_->GetEncryptedUuidByNetworkId(pkgName, networkId, uuid);
840 }
841
GenerateEncryptedUuid(const std::string & pkgName,const std::string & uuid,const std::string & appId,std::string & encryptedUuid)842 int32_t DeviceManagerService::GenerateEncryptedUuid(const std::string &pkgName, const std::string &uuid,
843 const std::string &appId, std::string &encryptedUuid)
844 {
845 if (!IsDMServiceImplReady()) {
846 LOGE("GenerateEncryptedUuid failed, instance not init or init failed.");
847 return ERR_DM_NOT_INIT;
848 }
849 return dmServiceImpl_->GenerateEncryptedUuid(pkgName, uuid, appId, encryptedUuid);
850 }
851
CheckApiPermission()852 int32_t DeviceManagerService::CheckApiPermission()
853 {
854 if (!PermissionManager::GetInstance().CheckPermission() &&
855 !PermissionManager::GetInstance().CheckNewPermission()) {
856 LOGE("The caller does not have permission to call");
857 return ERR_DM_NO_PERMISSION;
858 }
859 return DM_OK;
860 }
861
CheckNewApiPermission()862 int32_t DeviceManagerService::CheckNewApiPermission()
863 {
864 if (!PermissionManager::GetInstance().CheckNewPermission()) {
865 LOGE("The caller does not have permission to call");
866 return ERR_DM_NO_PERMISSION;
867 }
868 return DM_OK;
869 }
870
GetNetworkTypeByNetworkId(const std::string & pkgName,const std::string & netWorkId,int32_t & networkType)871 int32_t DeviceManagerService::GetNetworkTypeByNetworkId(const std::string &pkgName, const std::string &netWorkId,
872 int32_t &networkType)
873 {
874 if (!PermissionManager::GetInstance().CheckPermission() &&
875 !PermissionManager::GetInstance().CheckNewPermission()) {
876 LOGE("The caller: %s does not have permission to call GetNetworkTypeByNetworkId.",
877 pkgName.c_str());
878 return ERR_DM_NO_PERMISSION;
879 }
880 LOGI("DeviceManagerService::GetNetworkTypeByNetworkId begin for pkgName = %s", pkgName.c_str());
881 if (pkgName.empty() || netWorkId.empty()) {
882 LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
883 return ERR_DM_INPUT_PARA_INVALID;
884 }
885 SoftbusListener::GetNetworkTypeByNetworkId(netWorkId.c_str(), networkType);
886 return DM_OK;
887 }
888 } // namespace DistributedHardware
889 } // namespace OHOS
890