• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params)
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