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