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