• 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_crypto.h"
25 #include "dm_hidumper.h"
26 #include "dm_log.h"
27 #include "dm_softbus_adapter_crypto.h"
28 #include "parameter.h"
29 #include "permission_manager.h"
30 
31 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
32 constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.z.so";
33 #else
34 constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.so";
35 #endif
36 constexpr const char* LIB_DM_ADAPTER_NAME = "libdevicemanageradapter.z.so";
37 
38 namespace OHOS {
39 namespace DistributedHardware {
40 IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService);
41 
~DeviceManagerService()42 DeviceManagerService::~DeviceManagerService()
43 {
44     LOGI("DeviceManagerService destructor");
45     UnloadDMServiceImplSo();
46     UnloadDMServiceAdapter();
47 }
48 
Init()49 int32_t DeviceManagerService::Init()
50 {
51     InitSoftbusListener();
52     InitDMServiceListener();
53     LOGI("Init success, dm service single instance initialized.");
54     return DM_OK;
55 }
56 
InitSoftbusListener()57 int32_t DeviceManagerService::InitSoftbusListener()
58 {
59     if (softbusListener_ == nullptr) {
60         softbusListener_ = std::make_shared<SoftbusListener>();
61     }
62     LOGI("SoftbusListener init success.");
63     return DM_OK;
64 }
65 
UninitSoftbusListener()66 void DeviceManagerService::UninitSoftbusListener()
67 {
68     softbusListener_ = nullptr;
69     LOGI("SoftbusListener uninit.");
70 }
71 
InitDMServiceListener()72 int32_t DeviceManagerService::InitDMServiceListener()
73 {
74     if (listener_ == nullptr) {
75         listener_ = std::make_shared<DeviceManagerServiceListener>();
76     }
77     if (advertiseMgr_ == nullptr) {
78         advertiseMgr_ = std::make_shared<AdvertiseManager>(softbusListener_);
79     }
80     if (discoveryMgr_ == nullptr) {
81         discoveryMgr_ = std::make_shared<DiscoveryManager>(softbusListener_, listener_);
82     }
83     if (pinHolder_ == nullptr) {
84         pinHolder_ = std::make_shared<PinHolder>(listener_);
85     }
86 
87     LOGI("DeviceManagerServiceListener init success.");
88     return DM_OK;
89 }
90 
UninitDMServiceListener()91 void DeviceManagerService::UninitDMServiceListener()
92 {
93     listener_ = nullptr;
94     advertiseMgr_ = nullptr;
95     discoveryMgr_ = nullptr;
96     LOGI("DeviceManagerServiceListener uninit.");
97 }
98 
RegisterDeviceManagerListener(const std::string & pkgName)99 void DeviceManagerService::RegisterDeviceManagerListener(const std::string &pkgName)
100 {
101     if (listener_ == nullptr) {
102         listener_ = std::make_shared<DeviceManagerServiceListener>();
103     }
104     listener_->RegisterDmListener(pkgName, AppManager::GetInstance().GetAppId());
105 }
106 
UnRegisterDeviceManagerListener(const std::string & pkgName)107 void DeviceManagerService::UnRegisterDeviceManagerListener(const std::string &pkgName)
108 {
109     if (listener_ == nullptr) {
110         listener_ = std::make_shared<DeviceManagerServiceListener>();
111     }
112     listener_->UnRegisterDmListener(pkgName);
113 }
114 
GetTrustedDeviceList(const std::string & pkgName,const std::string & extra,std::vector<DmDeviceInfo> & deviceList)115 int32_t DeviceManagerService::GetTrustedDeviceList(const std::string &pkgName, const std::string &extra,
116                                                    std::vector<DmDeviceInfo> &deviceList)
117 {
118     LOGI("DeviceManagerService::GetTrustedDeviceList begin for pkgName = %s, extra = %s", pkgName.c_str(),
119         extra.c_str());
120     if (pkgName.empty()) {
121         LOGE("Invalid parameter, pkgName is empty.");
122         return ERR_DM_INPUT_PARA_INVALID;
123     }
124     std::vector<DmDeviceInfo> onlineDeviceList;
125     int32_t ret = softbusListener_->GetTrustedDeviceList(onlineDeviceList);
126     if (ret != DM_OK) {
127         LOGE("GetTrustedDeviceList failed");
128         return ret;
129     }
130 
131     if (onlineDeviceList.size() > 0 && IsDMServiceImplReady()) {
132         std::map<std::string, DmAuthForm> udidMap = dmServiceImpl_->GetAppTrustDeviceIdList(pkgName);
133         for (auto item : onlineDeviceList) {
134             std::string udid = "";
135             SoftbusListener::GetUdidByNetworkId(item.networkId, udid);
136             if (udidMap.find(udid) != udidMap.end()) {
137                 std::string deviceIdHash = "";
138                 dmServiceImpl_->GetUdidHashByNetWorkId(item.networkId, deviceIdHash);
139                 if (memcpy_s(item.deviceId, DM_MAX_DEVICE_ID_LEN, deviceIdHash.c_str(), deviceIdHash.length()) != 0) {
140                     LOGE("get deviceId: %s failed", GetAnonyString(deviceIdHash).c_str());
141                 }
142                 item.authForm = udidMap[udid];
143                 deviceList.push_back(item);
144             }
145         }
146         LOGI("Current app available device size: %d.", deviceList.size());
147     }
148     return DM_OK;
149 }
150 
GetAvailableDeviceList(const std::string & pkgName,std::vector<DmDeviceBasicInfo> & deviceBasicInfoList)151 int32_t DeviceManagerService::GetAvailableDeviceList(const std::string &pkgName,
152     std::vector<DmDeviceBasicInfo> &deviceBasicInfoList)
153 {
154     LOGI("DeviceManagerService::GetAvailableDeviceList begin for pkgName = %s", pkgName.c_str());
155     if (pkgName.empty()) {
156         LOGE("Invalid parameter, pkgName is empty.");
157         return ERR_DM_INPUT_PARA_INVALID;
158     }
159     std::vector<DmDeviceBasicInfo> onlineDeviceList;
160     int32_t ret = softbusListener_->GetAvailableDeviceList(onlineDeviceList);
161     if (ret != DM_OK) {
162         LOGE("GetAvailableDeviceList failed");
163         return ret;
164     }
165 
166     if (onlineDeviceList.size() > 0 && IsDMServiceImplReady()) {
167         std::map<std::string, DmAuthForm> udidMap = dmServiceImpl_->GetAppTrustDeviceIdList(pkgName);
168         for (auto item : onlineDeviceList) {
169             std::string udid = "";
170             SoftbusListener::GetUdidByNetworkId(item.networkId, udid);
171             if (udidMap.find(udid) != udidMap.end()) {
172                 std::string deviceIdHash = "";
173                 dmServiceImpl_->GetUdidHashByNetWorkId(item.networkId, deviceIdHash);
174                 if (memcpy_s(item.deviceId, DM_MAX_DEVICE_ID_LEN, deviceIdHash.c_str(),
175                     deviceIdHash.length()) != 0) {
176                     LOGE("get deviceId: %s failed", GetAnonyString(deviceIdHash).c_str());
177                 }
178                 deviceBasicInfoList.push_back(item);
179             }
180         }
181         LOGI("Current app available device size: %d.", deviceBasicInfoList.size());
182     }
183     return DM_OK;
184 }
185 
ShiftLNNGear(const std::string & pkgName,const std::string & callerId,bool isRefresh)186 int32_t DeviceManagerService::ShiftLNNGear(const std::string &pkgName, const std::string &callerId, bool isRefresh)
187 {
188     LOGI("DeviceManagerService::ShiftLNNGear begin for pkgName = %s, callerId = %s, isRefresh = %d", pkgName.c_str(),
189         callerId.c_str(), isRefresh);
190     if (pkgName.empty() || callerId.empty()) {
191         LOGE("Invalid parameter, parameter is empty.");
192         return ERR_DM_INPUT_PARA_INVALID;
193     }
194     if (isRefresh) {
195         int32_t ret = softbusListener_->ShiftLNNGear();
196         if (ret != DM_OK) {
197             LOGE("ShiftLNNGear error, failed ret: %d", ret);
198             return ret;
199         }
200     }
201     return DM_OK;
202 }
203 
GetDeviceInfo(const std::string & networkId,DmDeviceInfo & info)204 int32_t DeviceManagerService::GetDeviceInfo(const std::string &networkId, DmDeviceInfo &info)
205 {
206     if (!PermissionManager::GetInstance().CheckPermission() &&
207         !PermissionManager::GetInstance().CheckNewPermission()) {
208         LOGE("The caller does not have permission to call GetDeviceInfo.");
209         return ERR_DM_NO_PERMISSION;
210     }
211     if (networkId.empty()) {
212         LOGE("Invalid parameter, networkId is empty.");
213         return ERR_DM_INPUT_PARA_INVALID;
214     }
215     LOGI("DeviceManagerService::GetDeviceInfo begin by networkId : %s.", GetAnonyString(networkId).c_str());
216     int32_t ret = softbusListener_->GetDeviceInfo(networkId, info);
217     if (ret != DM_OK) {
218         LOGE("Get DeviceInfo By NetworkId failed, ret : %d", ret);
219     }
220     return ret;
221 }
222 
GetLocalDeviceInfo(DmDeviceInfo & info)223 int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info)
224 {
225     LOGI("DeviceManagerService::GetLocalDeviceInfo begin.");
226     int32_t ret = softbusListener_->GetLocalDeviceInfo(info);
227     if (ret != DM_OK) {
228         LOGE("GetLocalDeviceInfo failed");
229         return ret;
230     }
231     if (localDeviceId_.empty()) {
232         char localDeviceId[DEVICE_UUID_LENGTH] = {0};
233         char udidHash[DEVICE_UUID_LENGTH] = {0};
234         GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
235         if (DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId,
236             (uint8_t *)udidHash) == DM_OK) {
237             localDeviceId_ = udidHash;
238         }
239     }
240 
241     if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, localDeviceId_.c_str(), localDeviceId_.length()) != 0) {
242         LOGE("get deviceId: %s failed", GetAnonyString(localDeviceId_).c_str());
243     }
244     return DM_OK;
245 }
246 
GetLocalDeviceNetworkId(std::string & networkId)247 int32_t DeviceManagerService::GetLocalDeviceNetworkId(std::string &networkId)
248 {
249     LOGI("DeviceManagerService::GetLocalDeviceNetworkId begin.");
250     int32_t ret = softbusListener_->GetLocalDeviceNetworkId(networkId);
251     if (ret != DM_OK) {
252         LOGE("GetLocalDeviceNetworkId failed");
253         return ret;
254     }
255     return DM_OK;
256 }
257 
GetLocalDeviceId(const std::string & pkgName,std::string & deviceId)258 int32_t DeviceManagerService::GetLocalDeviceId(const std::string &pkgName, std::string &deviceId)
259 {
260     LOGI("DeviceManagerService::GetLocalDeviceId begin.");
261     char localDeviceId[DEVICE_UUID_LENGTH] = {0};
262     char udidHash[DEVICE_UUID_LENGTH] = {0};
263     GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
264     int32_t ret = DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId, (uint8_t *)udidHash);
265     if (ret != DM_OK) {
266         LOGE("get udidhash by udid: %s failed.", GetAnonyString(localDeviceId).c_str());
267         deviceId = "";
268         return ret;
269     }
270     deviceId = udidHash;
271     return DM_OK;
272 }
273 
GetLocalDeviceName(std::string & deviceName)274 int32_t DeviceManagerService::GetLocalDeviceName(std::string &deviceName)
275 {
276     LOGI("DeviceManagerService::GetLocalDeviceName begin.");
277     int32_t ret = softbusListener_->GetLocalDeviceName(deviceName);
278     if (ret != DM_OK) {
279         LOGE("GetLocalDeviceName failed");
280         return ret;
281     }
282     return DM_OK;
283 }
284 
GetLocalDeviceType(int32_t & deviceType)285 int32_t DeviceManagerService::GetLocalDeviceType(int32_t &deviceType)
286 {
287     LOGI("DeviceManagerService::GetLocalDeviceType begin.");
288     int32_t ret = softbusListener_->GetLocalDeviceType(deviceType);
289     if (ret != DM_OK) {
290         LOGE("GetLocalDeviceType failed");
291         return ret;
292     }
293     return DM_OK;
294 }
295 
GetUdidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & udid)296 int32_t DeviceManagerService::GetUdidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
297                                                  std::string &udid)
298 {
299     if (!PermissionManager::GetInstance().CheckPermission()) {
300         LOGE("The caller: %s does not have permission to call GetUdidByNetworkId.", pkgName.c_str());
301         return ERR_DM_NO_PERMISSION;
302     }
303     LOGI("DeviceManagerService::GetUdidByNetworkId begin for pkgName = %s", pkgName.c_str());
304     if (pkgName.empty() || netWorkId.empty()) {
305         LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
306         return ERR_DM_INPUT_PARA_INVALID;
307     }
308     SoftbusListener::GetUdidByNetworkId(netWorkId.c_str(), udid);
309     return DM_OK;
310 }
311 
GetUuidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & uuid)312 int32_t DeviceManagerService::GetUuidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
313                                                  std::string &uuid)
314 {
315     if (!PermissionManager::GetInstance().CheckPermission()) {
316         LOGE("The caller: %s does not have permission to call GetUuidByNetworkId.", pkgName.c_str());
317         return ERR_DM_NO_PERMISSION;
318     }
319     LOGI("DeviceManagerService::GetUuidByNetworkId begin for pkgName = %s", pkgName.c_str());
320     if (pkgName.empty() || netWorkId.empty()) {
321         LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
322         return ERR_DM_INPUT_PARA_INVALID;
323     }
324     softbusListener_->GetUuidByNetworkId(netWorkId.c_str(), uuid);
325     return DM_OK;
326 }
327 
StartDeviceDiscovery(const std::string & pkgName,const DmSubscribeInfo & subscribeInfo,const std::string & extra)328 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const DmSubscribeInfo &subscribeInfo,
329     const std::string &extra)
330 {
331     if (!PermissionManager::GetInstance().CheckPermission()) {
332         LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.", pkgName.c_str());
333         return ERR_DM_NO_PERMISSION;
334     }
335     LOGI("DeviceManagerService::StartDeviceDiscovery begin for pkgName = %s, extra = %s", pkgName.c_str(),
336         extra.c_str());
337     if (pkgName.empty()) {
338         LOGE("Invalid parameter, pkgName is empty.");
339         return ERR_DM_INPUT_PARA_INVALID;
340     }
341 
342     std::map<std::string, std::string> discParam;
343     discParam.insert(std::pair<std::string, std::string>(PARAM_KEY_SUBSCRIBE_ID,
344         std::to_string(subscribeInfo.subscribeId)));
345     discParam.insert(std::pair<std::string, std::string>(PARAM_KEY_DISC_MEDIUM, std::to_string(subscribeInfo.medium)));
346 
347     std::map<std::string, std::string> filterOps;
348     filterOps.insert(std::pair<std::string, std::string>(PARAM_KEY_FILTER_OPTIONS, extra));
349 
350     return discoveryMgr_->StartDiscovering(pkgName, discParam, filterOps);
351 }
352 
StartDeviceDiscovery(const std::string & pkgName,const uint16_t subscribeId,const std::string & filterOptions)353 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const uint16_t subscribeId,
354                                                    const std::string &filterOptions)
355 {
356     if (!PermissionManager::GetInstance().CheckNewPermission()) {
357         LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.", pkgName.c_str());
358         return ERR_DM_NO_PERMISSION;
359     }
360     LOGI("StartDeviceDiscovery begin for pkgName = %s, filterOptions = %s, subscribeId = %d",
361         pkgName.c_str(), filterOptions.c_str(), subscribeId);
362     if (pkgName.empty()) {
363         LOGE("Invalid parameter, pkgName is empty.");
364         return ERR_DM_INPUT_PARA_INVALID;
365     }
366 
367     std::map<std::string, std::string> discParam;
368     discParam.insert(std::pair<std::string, std::string>(PARAM_KEY_SUBSCRIBE_ID, std::to_string(subscribeId)));
369 
370     std::map<std::string, std::string> filterOps;
371     filterOps.insert(std::pair<std::string, std::string>(PARAM_KEY_FILTER_OPTIONS, filterOptions));
372 
373     return discoveryMgr_->StartDiscovering(pkgName, discParam, filterOps);
374 }
375 
StopDeviceDiscovery(const std::string & pkgName,uint16_t subscribeId)376 int32_t DeviceManagerService::StopDeviceDiscovery(const std::string &pkgName, uint16_t subscribeId)
377 {
378     if (!PermissionManager::GetInstance().CheckPermission() &&
379         !PermissionManager::GetInstance().CheckNewPermission()) {
380         LOGE("The caller: %s does not have permission to call StopDeviceDiscovery.", pkgName.c_str());
381         return ERR_DM_NO_PERMISSION;
382     }
383     LOGI("DeviceManagerService::StopDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
384     if (pkgName.empty()) {
385         LOGE("Invalid parameter, pkgName is empty.");
386         return ERR_DM_INPUT_PARA_INVALID;
387     }
388     return discoveryMgr_->StopDiscovering(pkgName, subscribeId);
389 }
390 
PublishDeviceDiscovery(const std::string & pkgName,const DmPublishInfo & publishInfo)391 int32_t DeviceManagerService::PublishDeviceDiscovery(const std::string &pkgName, const DmPublishInfo &publishInfo)
392 {
393     if (!PermissionManager::GetInstance().CheckPermission()) {
394         LOGE("The caller: %s does not have permission to call PublishDeviceDiscovery.", pkgName.c_str());
395         return ERR_DM_NO_PERMISSION;
396     }
397     LOGI("DeviceManagerService::PublishDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
398     if (pkgName.empty()) {
399         LOGE("Invalid parameter, pkgName is empty.");
400         return ERR_DM_INPUT_PARA_INVALID;
401     }
402 
403     std::map<std::string, std::string> advertiseParam;
404     advertiseParam.insert(std::pair<std::string, std::string>(PARAM_KEY_PUBLISH_ID,
405         std::to_string(publishInfo.publishId)));
406 
407     return advertiseMgr_->StartAdvertising(pkgName, advertiseParam);
408 }
409 
UnPublishDeviceDiscovery(const std::string & pkgName,int32_t publishId)410 int32_t DeviceManagerService::UnPublishDeviceDiscovery(const std::string &pkgName, int32_t publishId)
411 {
412     if (!PermissionManager::GetInstance().CheckPermission()) {
413         LOGE("The caller: %s does not have permission to call UnPublishDeviceDiscovery.", pkgName.c_str());
414         return ERR_DM_NO_PERMISSION;
415     }
416     if (pkgName.empty()) {
417         LOGE("Invalid parameter, pkgName is empty.");
418         return ERR_DM_INPUT_PARA_INVALID;
419     }
420     return advertiseMgr_->StopAdvertising(pkgName, publishId);
421 }
422 
AuthenticateDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & extra)423 int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,
424                                                  const std::string &deviceId, const std::string &extra)
425 {
426     if (!PermissionManager::GetInstance().CheckPermission()) {
427         LOGE("The caller: %s does not have permission to call AuthenticateDevice.", pkgName.c_str());
428         return ERR_DM_NO_PERMISSION;
429     }
430     if (pkgName.empty() || deviceId.empty()) {
431         LOGE("DeviceManagerService::AuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
432         return ERR_DM_INPUT_PARA_INVALID;
433     }
434     if (!IsDMServiceImplReady()) {
435         LOGE("AuthenticateDevice failed, instance not init or init failed.");
436         return ERR_DM_NOT_INIT;
437     }
438 
439     PeerTargetId targetId;
440     ConnectionAddrType addrType;
441     int32_t ret = SoftbusListener::GetTargetInfoFromCache(deviceId, targetId, addrType);
442     if (ret != DM_OK) {
443         LOGE("AuthenticateDevice failed, cannot get target info from cached discovered device map.");
444         return ERR_DM_BIND_INPUT_PARA_INVALID;
445     }
446     std::map<std::string, std::string> bindParam;
447     bindParam.insert(std::pair<std::string, std::string>(PARAM_KEY_AUTH_TYPE, std::to_string(authType)));
448     bindParam.insert(std::pair<std::string, std::string>(PARAM_KEY_BIND_EXTRA_DATA, extra));
449     bindParam.insert(std::pair<std::string, std::string>(PARAM_KEY_CONN_ADDR_TYPE, std::to_string(addrType)));
450     return dmServiceImpl_->BindTarget(pkgName, targetId, bindParam);
451 }
452 
UnAuthenticateDevice(const std::string & pkgName,const std::string & networkId)453 int32_t DeviceManagerService::UnAuthenticateDevice(const std::string &pkgName, const std::string &networkId)
454 {
455     if (!PermissionManager::GetInstance().CheckPermission()) {
456         LOGE("The caller: %s does not have permission to call UnAuthenticateDevice.", pkgName.c_str());
457         return ERR_DM_NO_PERMISSION;
458     }
459     LOGI("DeviceManagerService::UnAuthenticateDevice begin for pkgName = %s, networkId = %s",
460         pkgName.c_str(), GetAnonyString(networkId).c_str());
461     if (pkgName.empty() || networkId.empty()) {
462         LOGE("DeviceManagerService::UnAuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
463         return ERR_DM_INPUT_PARA_INVALID;
464     }
465     if (!IsDMServiceImplReady()) {
466         LOGE("UnAuthenticateDevice failed, instance not init or init failed.");
467         return ERR_DM_NOT_INIT;
468     }
469     return dmServiceImpl_->UnAuthenticateDevice(pkgName, networkId);
470 }
471 
BindDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & bindParam)472 int32_t DeviceManagerService::BindDevice(const std::string &pkgName, int32_t authType, const std::string &deviceId,
473     const std::string &bindParam)
474 {
475     if (!PermissionManager::GetInstance().CheckNewPermission()) {
476         LOGE("The caller does not have permission to call BindDevice.");
477         return ERR_DM_NO_PERMISSION;
478     }
479     if (pkgName.empty() || deviceId.empty()) {
480         LOGE("DeviceManagerService::BindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
481         return ERR_DM_INPUT_PARA_INVALID;
482     }
483     if (!IsDMServiceImplReady()) {
484         LOGE("BindDevice failed, instance not init or init failed.");
485         return ERR_DM_NOT_INIT;
486     }
487 
488     PeerTargetId targetId;
489     ConnectionAddrType addrType;
490     int32_t ret = SoftbusListener::GetTargetInfoFromCache(deviceId, targetId, addrType);
491     if (ret != DM_OK) {
492         LOGE("BindDevice failed, cannot get target info from cached discovered device map.");
493         return ERR_DM_BIND_INPUT_PARA_INVALID;
494     }
495     std::map<std::string, std::string> bindParamMap;
496     bindParamMap.insert(std::pair<std::string, std::string>(PARAM_KEY_AUTH_TYPE, std::to_string(authType)));
497     bindParamMap.insert(std::pair<std::string, std::string>(PARAM_KEY_BIND_EXTRA_DATA, bindParam));
498     bindParamMap.insert(std::pair<std::string, std::string>(PARAM_KEY_CONN_ADDR_TYPE, std::to_string(addrType)));
499     return dmServiceImpl_->BindTarget(pkgName, targetId, bindParamMap);
500 }
501 
UnBindDevice(const std::string & pkgName,const std::string & deviceId)502 int32_t DeviceManagerService::UnBindDevice(const std::string &pkgName, const std::string &deviceId)
503 {
504     if (!PermissionManager::GetInstance().CheckNewPermission()) {
505         LOGE("The caller does not have permission to call UnBindDevice.");
506         return ERR_DM_NO_PERMISSION;
507     }
508     LOGI("DeviceManagerService::UnBindDevice begin for pkgName = %s, deviceId = %s",
509         pkgName.c_str(), GetAnonyString(deviceId).c_str());
510     if (pkgName.empty() || deviceId.empty()) {
511         LOGE("DeviceManagerService::UnBindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
512         return ERR_DM_INPUT_PARA_INVALID;
513     }
514     if (!IsDMServiceImplReady()) {
515         LOGE("UnBindDevice failed, instance not init or init failed.");
516         return ERR_DM_NOT_INIT;
517     }
518     return dmServiceImpl_->UnBindDevice(pkgName, deviceId);
519 }
520 
SetUserOperation(std::string & pkgName,int32_t action,const std::string & params)521 int32_t DeviceManagerService::SetUserOperation(std::string &pkgName, int32_t action, const std::string &params)
522 {
523     if (!PermissionManager::GetInstance().CheckPermission()) {
524         LOGE("The caller: %s does not have permission to call SetUserOperation.", pkgName.c_str());
525         return ERR_DM_NO_PERMISSION;
526     }
527     if (pkgName.empty() || params.empty()) {
528         LOGE("DeviceManagerService::SetUserOperation error: Invalid parameter, pkgName: %s", pkgName.c_str());
529         return ERR_DM_INPUT_PARA_INVALID;
530     }
531     if (IsDMServiceAdapterLoad()) {
532         dmServiceImplExt_->ReplyUiAction(pkgName, action, params);
533     }
534     if (!IsDMServiceImplReady()) {
535         LOGE("SetUserOperation failed, instance not init or init failed.");
536         return ERR_DM_NOT_INIT;
537     }
538     return dmServiceImpl_->SetUserOperation(pkgName, action, params);
539 }
540 
HandleDeviceStatusChange(DmDeviceState devState,DmDeviceInfo & devInfo)541 void DeviceManagerService::HandleDeviceStatusChange(DmDeviceState devState, DmDeviceInfo &devInfo)
542 {
543     if (IsDMServiceImplReady()) {
544         dmServiceImpl_->HandleDeviceStatusChange(devState, devInfo);
545     }
546     if (IsDMServiceAdapterLoad()) {
547         dmServiceImplExt_->HandleDeviceStatusChange(devState, devInfo);
548     }
549 }
550 
OnSessionOpened(int sessionId,int result)551 int DeviceManagerService::OnSessionOpened(int sessionId, int result)
552 {
553     if (!IsDMServiceImplReady()) {
554         LOGE("OnSessionOpened failed, instance not init or init failed.");
555         return ERR_DM_NOT_INIT;
556     }
557     return dmServiceImpl_->OnSessionOpened(sessionId, result);
558 }
559 
OnSessionClosed(int sessionId)560 void DeviceManagerService::OnSessionClosed(int sessionId)
561 {
562     if (!IsDMServiceImplReady()) {
563         LOGE("OnSessionClosed failed, instance not init or init failed.");
564         return;
565     }
566     dmServiceImpl_->OnSessionClosed(sessionId);
567 }
568 
OnBytesReceived(int sessionId,const void * data,unsigned int dataLen)569 void DeviceManagerService::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen)
570 {
571     if (!IsDMServiceImplReady()) {
572         LOGE("OnBytesReceived failed, instance not init or init failed.");
573         return;
574     }
575     dmServiceImpl_->OnBytesReceived(sessionId, data, dataLen);
576 }
577 
OnPinHolderSessionOpened(int sessionId,int result)578 int DeviceManagerService::OnPinHolderSessionOpened(int sessionId, int result)
579 {
580     LOGI("DeviceManagerService::OnPinHolderSessionOpened");
581     return PinHolderSession::OnSessionOpened(sessionId, result);
582 }
583 
OnPinHolderSessionClosed(int sessionId)584 void DeviceManagerService::OnPinHolderSessionClosed(int sessionId)
585 {
586     LOGI("DeviceManagerService::OnPinHolderSessionClosed");
587     PinHolderSession::OnSessionClosed(sessionId);
588 }
589 
OnPinHolderBytesReceived(int sessionId,const void * data,unsigned int dataLen)590 void DeviceManagerService::OnPinHolderBytesReceived(int sessionId, const void *data, unsigned int dataLen)
591 {
592     LOGI("DeviceManagerService::OnPinHolderBytesReceived");
593     PinHolderSession::OnBytesReceived(sessionId, data, dataLen);
594 }
595 
RequestCredential(const std::string & reqJsonStr,std::string & returnJsonStr)596 int32_t DeviceManagerService::RequestCredential(const std::string &reqJsonStr, std::string &returnJsonStr)
597 {
598     if (!PermissionManager::GetInstance().CheckPermission()) {
599         LOGE("The caller does not have permission to call RequestCredential.");
600         return ERR_DM_NO_PERMISSION;
601     }
602     if (!IsDMServiceImplReady()) {
603         LOGE("RequestCredential failed, instance not init or init failed.");
604         return ERR_DM_NOT_INIT;
605     }
606     return dmServiceImpl_->RequestCredential(reqJsonStr, returnJsonStr);
607 }
608 
ImportCredential(const std::string & pkgName,const std::string & credentialInfo)609 int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &credentialInfo)
610 {
611     if (!PermissionManager::GetInstance().CheckPermission()) {
612         LOGE("The caller: %s does not have permission to call ImportCredential.",
613             pkgName.c_str());
614         return ERR_DM_NO_PERMISSION;
615     }
616     if (!IsDMServiceImplReady()) {
617         LOGE("ImportCredential failed, instance not init or init failed.");
618         return ERR_DM_NOT_INIT;
619     }
620     return dmServiceImpl_->ImportCredential(pkgName, credentialInfo);
621 }
622 
DeleteCredential(const std::string & pkgName,const std::string & deleteInfo)623 int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &deleteInfo)
624 {
625     if (!PermissionManager::GetInstance().CheckPermission()) {
626         LOGE("The caller: %s does not have permission to call DeleteCredential.",
627             pkgName.c_str());
628         return ERR_DM_NO_PERMISSION;
629     }
630     if (!IsDMServiceImplReady()) {
631         LOGE("DeleteCredential failed, instance not init or init failed.");
632         return ERR_DM_NOT_INIT;
633     }
634     return dmServiceImpl_->DeleteCredential(pkgName, deleteInfo);
635 }
636 
MineRequestCredential(const std::string & pkgName,std::string & returnJsonStr)637 int32_t DeviceManagerService::MineRequestCredential(const std::string &pkgName, std::string &returnJsonStr)
638 {
639     if (!PermissionManager::GetInstance().CheckPermission()) {
640         LOGE("The caller does not have permission to call RequestCredential.");
641         return ERR_DM_NO_PERMISSION;
642     }
643     if (!IsDMServiceImplReady()) {
644         LOGE("RequestCredential failed, instance not init or init failed.");
645         return ERR_DM_NOT_INIT;
646     }
647     return dmServiceImpl_->MineRequestCredential(pkgName, returnJsonStr);
648 }
649 
CheckCredential(const std::string & pkgName,const std::string & reqJsonStr,std::string & returnJsonStr)650 int32_t DeviceManagerService::CheckCredential(const std::string &pkgName, const std::string &reqJsonStr,
651     std::string &returnJsonStr)
652 {
653     if (!PermissionManager::GetInstance().CheckPermission()) {
654         LOGE("The caller: %s does not have permission to call ImportCredential.",
655             pkgName.c_str());
656         return ERR_DM_NO_PERMISSION;
657     }
658     if (!IsDMServiceImplReady()) {
659         LOGE("ImportCredential failed, instance not init or init failed.");
660         return ERR_DM_NOT_INIT;
661     }
662     return dmServiceImpl_->CheckCredential(pkgName, reqJsonStr, returnJsonStr);
663 }
664 
ImportCredential(const std::string & pkgName,const std::string & reqJsonStr,std::string & returnJsonStr)665 int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &reqJsonStr,
666     std::string &returnJsonStr)
667 {
668     if (!PermissionManager::GetInstance().CheckPermission()) {
669         LOGE("The caller: %s does not have permission to call ImportCredential.",
670             pkgName.c_str());
671         return ERR_DM_NO_PERMISSION;
672     }
673     if (!IsDMServiceImplReady()) {
674         LOGE("ImportCredential failed, instance not init or init failed.");
675         return ERR_DM_NOT_INIT;
676     }
677     return dmServiceImpl_->ImportCredential(pkgName, reqJsonStr, returnJsonStr);
678 }
679 
DeleteCredential(const std::string & pkgName,const std::string & reqJsonStr,std::string & returnJsonStr)680 int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &reqJsonStr,
681     std::string &returnJsonStr)
682 {
683     if (!PermissionManager::GetInstance().CheckPermission()) {
684         LOGE("The caller: %s does not have permission to call DeleteCredential.",
685             pkgName.c_str());
686         return ERR_DM_NO_PERMISSION;
687     }
688     if (!IsDMServiceImplReady()) {
689         LOGE("DeleteCredential failed, instance not init or init failed.");
690         return ERR_DM_NOT_INIT;
691     }
692     return dmServiceImpl_->DeleteCredential(pkgName, reqJsonStr, returnJsonStr);
693 }
694 
RegisterCredentialCallback(const std::string & pkgName)695 int32_t DeviceManagerService::RegisterCredentialCallback(const std::string &pkgName)
696 {
697     if (!PermissionManager::GetInstance().CheckPermission()) {
698         LOGE("The caller: %s does not have permission to call RegisterCredentialCallback.", pkgName.c_str());
699         return ERR_DM_NO_PERMISSION;
700     }
701     if (!IsDMServiceImplReady()) {
702         LOGE("RegisterCredentialCallback failed, instance not init or init failed.");
703         return ERR_DM_NOT_INIT;
704     }
705     return dmServiceImpl_->RegisterCredentialCallback(pkgName);
706 }
707 
UnRegisterCredentialCallback(const std::string & pkgName)708 int32_t DeviceManagerService::UnRegisterCredentialCallback(const std::string &pkgName)
709 {
710     if (!PermissionManager::GetInstance().CheckPermission()) {
711         LOGE("The caller: %s does not have permission to call UnRegisterCredentialCallback.",
712             pkgName.c_str());
713         return ERR_DM_NO_PERMISSION;
714     }
715     if (!IsDMServiceImplReady()) {
716         LOGE("UnRegisterCredentialCallback failed, instance not init or init failed.");
717         return ERR_DM_NOT_INIT;
718     }
719     return dmServiceImpl_->UnRegisterCredentialCallback(pkgName);
720 }
721 
RegisterUiStateCallback(const std::string & pkgName)722 int32_t DeviceManagerService::RegisterUiStateCallback(const std::string &pkgName)
723 {
724     if (pkgName.empty()) {
725         LOGE("DeviceManagerService::RegisterUiStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
726         return ERR_DM_INPUT_PARA_INVALID;
727     }
728     if (!IsDMServiceImplReady()) {
729         LOGE("RegisterUiStateCallback failed, instance not init or init failed.");
730         return ERR_DM_NOT_INIT;
731     }
732     return dmServiceImpl_->RegisterUiStateCallback(pkgName);
733 }
734 
UnRegisterUiStateCallback(const std::string & pkgName)735 int32_t DeviceManagerService::UnRegisterUiStateCallback(const std::string &pkgName)
736 {
737     if (pkgName.empty()) {
738         LOGE("DeviceManagerService::UnRegisterUiStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
739         return ERR_DM_INPUT_PARA_INVALID;
740     }
741     if (!IsDMServiceImplReady()) {
742         LOGE("UnRegisterUiStateCallback failed, instance not init or init failed.");
743         return ERR_DM_NOT_INIT;
744     }
745     return dmServiceImpl_->UnRegisterUiStateCallback(pkgName);
746 }
747 
IsDMServiceImplReady()748 bool DeviceManagerService::IsDMServiceImplReady()
749 {
750     LOGI("DeviceManagerService::IsDMServiceImplReady");
751     std::lock_guard<std::mutex> lock(isImplLoadLock_);
752     if (isImplsoLoaded_ && (dmServiceImpl_ != nullptr)) {
753         return true;
754     }
755     char path[PATH_MAX + 1] = {0x00};
756     std::string soName = std::string(DM_LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
757     if ((soName.length() == 0) || (soName.length() > PATH_MAX) || (realpath(soName.c_str(), path) == nullptr)) {
758         LOGE("File %s canonicalization failed.", soName.c_str());
759         return false;
760     }
761     void *so_handle = dlopen(path, RTLD_NOW | RTLD_NODELETE);
762     if (so_handle == nullptr) {
763         LOGE("load libdevicemanagerserviceimpl so %s failed, errMsg: %s.", soName.c_str(), dlerror());
764         return false;
765     }
766     dlerror();
767     auto func = (CreateDMServiceFuncPtr)dlsym(so_handle, "CreateDMServiceObject");
768     if (dlerror() != nullptr || func == nullptr) {
769         dlclose(so_handle);
770         LOGE("Create object function is not exist.");
771         return false;
772     }
773 
774     dmServiceImpl_ = std::shared_ptr<IDeviceManagerServiceImpl>(func());
775     if (dmServiceImpl_->Initialize(listener_) != DM_OK) {
776         dlclose(so_handle);
777         dmServiceImpl_ = nullptr;
778         isImplsoLoaded_ = false;
779         return false;
780     }
781     isImplsoLoaded_ = true;
782     return true;
783 }
784 
DmHiDumper(const std::vector<std::string> & args,std::string & result)785 int32_t DeviceManagerService::DmHiDumper(const std::vector<std::string>& args, std::string &result)
786 {
787     LOGI("HiDump GetTrustedDeviceList");
788     std::vector<HidumperFlag> dumpflag;
789     HiDumpHelper::GetInstance().GetArgsType(args, dumpflag);
790 
791     for (unsigned int i = 0; i < dumpflag.size(); i++) {
792         if (dumpflag[i] == HidumperFlag::HIDUMPER_GET_TRUSTED_LIST) {
793             std::vector<DmDeviceInfo> deviceList;
794 
795             int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
796             if (ret != DM_OK) {
797                 result.append("HiDumpHelper GetTrustedDeviceList failed");
798                 LOGE("HiDumpHelper GetTrustedDeviceList failed");
799                 return ERR_DM_FAILED;
800             }
801 
802             for (unsigned int j = 0; j < deviceList.size(); j++) {
803                 HiDumpHelper::GetInstance().SetNodeInfo(deviceList[j]);
804                 LOGI("DeviceManagerService::DmHiDumper SetNodeInfo.");
805             }
806         }
807     }
808     HiDumpHelper::GetInstance().HiDump(args, result);
809     return DM_OK;
810 }
811 
NotifyEvent(const std::string & pkgName,const int32_t eventId,const std::string & event)812 int32_t DeviceManagerService::NotifyEvent(const std::string &pkgName, const int32_t eventId, const std::string &event)
813 {
814     if (!PermissionManager::GetInstance().CheckPermission()) {
815         LOGE("The caller: %s does not have permission to call NotifyEvent.", pkgName.c_str());
816         return ERR_DM_NO_PERMISSION;
817     }
818     if (!IsDMServiceImplReady()) {
819         LOGE("NotifyEvent failed, instance not init or init failed.");
820         return ERR_DM_NOT_INIT;
821     }
822     return dmServiceImpl_->NotifyEvent(pkgName, eventId, event);
823 }
824 
LoadHardwareFwkService()825 void DeviceManagerService::LoadHardwareFwkService()
826 {
827     std::string extra;
828     std::vector<DmDeviceInfo> deviceList;
829     int32_t ret = GetTrustedDeviceList(DM_PKG_NAME, extra, deviceList);
830     if (ret != DM_OK) {
831         LOGE("LoadHardwareFwkService failed, get trusted devicelist failed.");
832         return;
833     }
834     if (deviceList.size() > 0) {
835         dmServiceImpl_->LoadHardwareFwkService();
836     }
837 }
838 
GetEncryptedUuidByNetworkId(const std::string & pkgName,const std::string & networkId,std::string & uuid)839 int32_t DeviceManagerService::GetEncryptedUuidByNetworkId(const std::string &pkgName, const std::string &networkId,
840     std::string &uuid)
841 {
842     if (pkgName.empty()) {
843         LOGE("Invalid parameter, pkgName is empty.");
844         return ERR_DM_INPUT_PARA_INVALID;
845     }
846     LOGI("DeviceManagerService::GetEncryptedUuidByNetworkId for pkgName = %s", pkgName.c_str());
847     int32_t ret = softbusListener_->GetUuidByNetworkId(networkId.c_str(), uuid);
848     if (ret != DM_OK) {
849         LOGE("GetUuidByNetworkId failed, ret : %d", ret);
850         return ret;
851     }
852 
853     std::string appId = Crypto::Sha256(AppManager::GetInstance().GetAppId());
854     LOGI("appId = %s, uuid = %s.", GetAnonyString(appId).c_str(), GetAnonyString(uuid).c_str());
855     uuid = Crypto::Sha256(appId + "_" + uuid);
856     LOGI("encryptedUuid = %s.", GetAnonyString(uuid).c_str());
857     return DM_OK;
858 }
859 
GenerateEncryptedUuid(const std::string & pkgName,const std::string & uuid,const std::string & appId,std::string & encryptedUuid)860 int32_t DeviceManagerService::GenerateEncryptedUuid(const std::string &pkgName, const std::string &uuid,
861     const std::string &appId, std::string &encryptedUuid)
862 {
863     if (pkgName.empty()) {
864         LOGE("Invalid parameter, pkgName is empty.");
865         return ERR_DM_INPUT_PARA_INVALID;
866     }
867     encryptedUuid = Crypto::Sha256(appId + "_" + uuid);
868     LOGI("encryptedUuid = %s.", GetAnonyString(encryptedUuid).c_str());
869     return DM_OK;
870 }
871 
CheckApiPermission()872 int32_t DeviceManagerService::CheckApiPermission()
873 {
874     if (!PermissionManager::GetInstance().CheckPermission()) {
875         LOGE("The caller does not have permission to call");
876         return ERR_DM_NO_PERMISSION;
877     }
878     return DM_OK;
879 }
880 
CheckNewApiPermission()881 int32_t DeviceManagerService::CheckNewApiPermission()
882 {
883     if (!PermissionManager::GetInstance().CheckNewPermission()) {
884         LOGE("The caller does not have permission to call");
885         return ERR_DM_NO_PERMISSION;
886     }
887     return DM_OK;
888 }
889 
GetNetworkTypeByNetworkId(const std::string & pkgName,const std::string & netWorkId,int32_t & networkType)890 int32_t DeviceManagerService::GetNetworkTypeByNetworkId(const std::string &pkgName, const std::string &netWorkId,
891                                                         int32_t &networkType)
892 {
893     if (!PermissionManager::GetInstance().CheckPermission()) {
894         LOGE("The caller: %s does not have permission to call GetNetworkTypeByNetworkId.", pkgName.c_str());
895         return ERR_DM_NO_PERMISSION;
896     }
897     LOGI("DeviceManagerService::GetNetworkTypeByNetworkId begin for pkgName = %s", pkgName.c_str());
898     if (pkgName.empty() || netWorkId.empty()) {
899         LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
900         return ERR_DM_INPUT_PARA_INVALID;
901     }
902     softbusListener_->GetNetworkTypeByNetworkId(netWorkId.c_str(), networkType);
903     return DM_OK;
904 }
905 
ImportAuthCode(const std::string & pkgName,const std::string & authCode)906 int32_t DeviceManagerService::ImportAuthCode(const std::string &pkgName, const std::string &authCode)
907 {
908     if (!PermissionManager::GetInstance().CheckNewPermission()) {
909         LOGE("The caller: %s does not have permission to call ImportAuthCode.", pkgName.c_str());
910         return ERR_DM_NO_PERMISSION;
911     }
912     std::string processName = "";
913     if (PermissionManager::GetInstance().GetCallerProcessName(processName) != DM_OK) {
914         LOGE("Get caller process name failed, pkgname: %s.", pkgName.c_str());
915         return ERR_DM_FAILED;
916     }
917     if (!PermissionManager::GetInstance().CheckProcessNameValidOnAuthCode(processName)) {
918         LOGE("The caller: %s is not in white list.", processName.c_str());
919         return ERR_DM_INPUT_PARA_INVALID;
920     }
921     LOGI("DeviceManagerService::ImportAuthCode begin.");
922     if (authCode.empty() || pkgName.empty()) {
923         LOGE("Invalid parameter, authCode: %s.", authCode.c_str());
924         return ERR_DM_INPUT_PARA_INVALID;
925     }
926     if (!IsDMServiceImplReady()) {
927         LOGE("ImportAuthCode failed, instance not init or init failed.");
928         return ERR_DM_NOT_INIT;
929     }
930     return dmServiceImpl_->ImportAuthCode(pkgName, authCode);
931 }
932 
ExportAuthCode(std::string & authCode)933 int32_t DeviceManagerService::ExportAuthCode(std::string &authCode)
934 {
935     if (!PermissionManager::GetInstance().CheckNewPermission()) {
936         LOGE("The caller does not have permission to call ExportAuthCode.");
937         return ERR_DM_NO_PERMISSION;
938     }
939     std::string processName = "";
940     if (PermissionManager::GetInstance().GetCallerProcessName(processName) != DM_OK) {
941         LOGE("Get caller process name failed, processName: %s.", processName.c_str());
942         return ERR_DM_FAILED;
943     }
944     if (!PermissionManager::GetInstance().CheckProcessNameValidOnAuthCode(processName)) {
945         LOGE("The caller: %s is not in white list.", processName.c_str());
946         return ERR_DM_INPUT_PARA_INVALID;
947     }
948     if (!IsDMServiceImplReady()) {
949         LOGE("ExportAuthCode failed, instance not init or init failed.");
950         return ERR_DM_NOT_INIT;
951     }
952     LOGI("DeviceManagerService::ExportAuthCode begin.");
953     return dmServiceImpl_->ExportAuthCode(authCode);
954 }
955 
UnloadDMServiceImplSo()956 void DeviceManagerService::UnloadDMServiceImplSo()
957 {
958     LOGI("DeviceManagerService::UnloadDMServiceImplSo start.");
959     std::lock_guard<std::mutex> lock(isImplLoadLock_);
960     if (dmServiceImpl_ != nullptr) {
961         dmServiceImpl_->Release();
962     }
963     char path[PATH_MAX + 1] = {0x00};
964     std::string soPathName = std::string(DM_LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
965     if ((soPathName.length() == 0) || (soPathName.length() > PATH_MAX) ||
966         (realpath(soPathName.c_str(), path) == nullptr)) {
967         LOGE("File %s canonicalization failed.", soPathName.c_str());
968         return;
969     }
970     void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
971     if (so_handle != nullptr) {
972         LOGI("DeviceManagerService so_handle is not nullptr.");
973         dlclose(so_handle);
974     }
975 }
976 
IsDMServiceAdapterLoad()977 bool DeviceManagerService::IsDMServiceAdapterLoad()
978 {
979     LOGI("DeviceManagerService::IsDMServiceAdapterLoad start.");
980     std::lock_guard<std::mutex> lock(isAdapterLoadLock_);
981     if (isAdapterSoLoaded_ && (dmServiceImplExt_ != nullptr)) {
982         return true;
983     }
984 
985     char path[PATH_MAX + 1] = {0x00};
986     std::string soName = std::string(DM_LIB_LOAD_PATH) + std::string(LIB_DM_ADAPTER_NAME);
987     if ((soName.length() == 0) || (soName.length() > PATH_MAX) || (realpath(soName.c_str(), path) == nullptr)) {
988         LOGE("File %s canonicalization failed.", soName.c_str());
989         return false;
990     }
991     void *so_handle = dlopen(path, RTLD_NOW | RTLD_NODELETE);
992     if (so_handle == nullptr) {
993         LOGE("load dm service adapter so %s failed.", soName.c_str());
994         return false;
995     }
996     dlerror();
997     auto func = (CreateDMServiceImplExtFuncPtr)dlsym(so_handle, "CreateDMServiceImplExtObject");
998     if (dlerror() != nullptr || func == nullptr) {
999         dlclose(so_handle);
1000         LOGE("Create object function is not exist.");
1001         return false;
1002     }
1003 
1004     dmServiceImplExt_ = std::shared_ptr<IDMServiceImplExt>(func());
1005     if (dmServiceImplExt_->Initialize(listener_) != DM_OK) {
1006         dlclose(so_handle);
1007         dmServiceImplExt_ = nullptr;
1008         isAdapterSoLoaded_ = false;
1009         LOGE("dm service adapter impl ext init failed.");
1010         return false;
1011     }
1012     isAdapterSoLoaded_ = true;
1013     LOGI("DeviceManagerService::IsDMServiceAdapterLoad sucess.");
1014     return true;
1015 }
1016 
UnloadDMServiceAdapter()1017 void DeviceManagerService::UnloadDMServiceAdapter()
1018 {
1019     LOGI("DeviceManagerService::UnloadDMServiceAdapter start.");
1020     std::lock_guard<std::mutex> lock(isAdapterLoadLock_);
1021     if (dmServiceImplExt_ != nullptr) {
1022         dmServiceImplExt_->Release();
1023     }
1024     dmServiceImplExt_ = nullptr;
1025 
1026     char path[PATH_MAX + 1] = {0x00};
1027     std::string soPathName = std::string(DM_LIB_LOAD_PATH) + std::string(LIB_DM_ADAPTER_NAME);
1028     if ((soPathName.length() == 0) || (soPathName.length() > PATH_MAX) ||
1029         (realpath(soPathName.c_str(), path) == nullptr)) {
1030         LOGE("File %s canonicalization failed.", soPathName.c_str());
1031         return;
1032     }
1033     void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
1034     if (so_handle != nullptr) {
1035         LOGI("dm service adapter so_handle is not nullptr.");
1036         dlclose(so_handle);
1037     }
1038 }
1039 
StartDiscovering(const std::string & pkgName,const std::map<std::string,std::string> & discoverParam,const std::map<std::string,std::string> & filterOptions)1040 int32_t DeviceManagerService::StartDiscovering(const std::string &pkgName,
1041     const std::map<std::string, std::string> &discoverParam, const std::map<std::string, std::string> &filterOptions)
1042 {
1043     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1044         LOGE("The caller does not have permission to call");
1045         return ERR_DM_NO_PERMISSION;
1046     }
1047     LOGI("DeviceManagerService::StartDiscovering for pkgName = %s", pkgName.c_str());
1048     if (pkgName.empty()) {
1049         LOGE("Invalid parameter, pkgName is empty.");
1050         return ERR_DM_INPUT_PARA_INVALID;
1051     }
1052     if (discoverParam.find(PARAM_KEY_META_TYPE) != discoverParam.end()) {
1053         LOGI("StartDiscovering input MetaType = %s", (discoverParam.find(PARAM_KEY_META_TYPE)->second).c_str());
1054     }
1055     return discoveryMgr_->StartDiscovering(pkgName, discoverParam, filterOptions);
1056 }
1057 
StopDiscovering(const std::string & pkgName,const std::map<std::string,std::string> & discoverParam)1058 int32_t DeviceManagerService::StopDiscovering(const std::string &pkgName,
1059     const std::map<std::string, std::string> &discoverParam)
1060 {
1061     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1062         LOGE("The caller does not have permission to call");
1063         return ERR_DM_NO_PERMISSION;
1064     }
1065     LOGI("DeviceManagerService::StopDiscovering for pkgName = %s", pkgName.c_str());
1066     if (pkgName.empty()) {
1067         LOGE("Invalid parameter, pkgName is empty.");
1068         return ERR_DM_INPUT_PARA_INVALID;
1069     }
1070     uint16_t subscribeId = -1;
1071     if (discoverParam.find(PARAM_KEY_SUBSCRIBE_ID) != discoverParam.end()) {
1072         subscribeId = std::atoi((discoverParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str());
1073     }
1074     if (discoverParam.find(PARAM_KEY_META_TYPE) != discoverParam.end()) {
1075         LOGI("StopDiscovering input MetaType = %s", (discoverParam.find(PARAM_KEY_META_TYPE)->second).c_str());
1076     }
1077     return discoveryMgr_->StopDiscovering(pkgName, subscribeId);
1078 }
1079 
EnableDiscoveryListener(const std::string & pkgName,const std::map<std::string,std::string> & discoverParam,const std::map<std::string,std::string> & filterOptions)1080 int32_t DeviceManagerService::EnableDiscoveryListener(const std::string &pkgName,
1081     const std::map<std::string, std::string> &discoverParam, const std::map<std::string, std::string> &filterOptions)
1082 {
1083     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1084         LOGE("The caller does not have permission to call");
1085         return ERR_DM_NO_PERMISSION;
1086     }
1087     LOGI("DeviceManagerService::EnableDiscoveryListener for pkgName = %s", pkgName.c_str());
1088     if (pkgName.empty()) {
1089         LOGE("Invalid parameter, pkgName is empty.");
1090         return ERR_DM_INPUT_PARA_INVALID;
1091     }
1092     return discoveryMgr_->EnableDiscoveryListener(pkgName, discoverParam, filterOptions);
1093 }
1094 
DisableDiscoveryListener(const std::string & pkgName,const std::map<std::string,std::string> & extraParam)1095 int32_t DeviceManagerService::DisableDiscoveryListener(const std::string &pkgName,
1096     const std::map<std::string, std::string> &extraParam)
1097 {
1098     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1099         LOGE("The caller does not have permission to call");
1100         return ERR_DM_NO_PERMISSION;
1101     }
1102     LOGI("DeviceManagerService::DisableDiscoveryListener for pkgName = %s", pkgName.c_str());
1103     if (pkgName.empty()) {
1104         LOGE("Invalid parameter, pkgName is empty.");
1105         return ERR_DM_INPUT_PARA_INVALID;
1106     }
1107     return discoveryMgr_->DisableDiscoveryListener(pkgName, extraParam);
1108 }
1109 
StartAdvertising(const std::string & pkgName,const std::map<std::string,std::string> & advertiseParam)1110 int32_t DeviceManagerService::StartAdvertising(const std::string &pkgName,
1111     const std::map<std::string, std::string> &advertiseParam)
1112 {
1113     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1114         LOGE("The caller does not have permission to call");
1115         return ERR_DM_NO_PERMISSION;
1116     }
1117     LOGI("DeviceManagerService::StartAdvertising for pkgName = %s", pkgName.c_str());
1118     if (pkgName.empty()) {
1119         LOGE("Invalid parameter, pkgName is empty.");
1120         return ERR_DM_INPUT_PARA_INVALID;
1121     }
1122     return advertiseMgr_->StartAdvertising(pkgName, advertiseParam);
1123 }
1124 
StopAdvertising(const std::string & pkgName,const std::map<std::string,std::string> & advertiseParam)1125 int32_t DeviceManagerService::StopAdvertising(const std::string &pkgName,
1126     const std::map<std::string, std::string> &advertiseParam)
1127 {
1128     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1129         LOGE("The caller does not have permission to call");
1130         return ERR_DM_NO_PERMISSION;
1131     }
1132     LOGI("DeviceManagerService::StopAdvertising for pkgName = %s", pkgName.c_str());
1133     if (pkgName.empty()) {
1134         LOGE("Invalid parameter, pkgName is empty.");
1135         return ERR_DM_INPUT_PARA_INVALID;
1136     }
1137     if (advertiseParam.find(PARAM_KEY_META_TYPE) != advertiseParam.end()) {
1138         LOGI("StopAdvertising input MetaType=%s", (advertiseParam.find(PARAM_KEY_META_TYPE)->second).c_str());
1139     }
1140     int32_t publishId = -1;
1141     if (advertiseParam.find(PARAM_KEY_PUBLISH_ID) != advertiseParam.end()) {
1142         publishId = std::atoi((advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second).c_str());
1143     }
1144     return advertiseMgr_->StopAdvertising(pkgName, publishId);
1145 }
1146 
BindTarget(const std::string & pkgName,const PeerTargetId & targetId,const std::map<std::string,std::string> & bindParam)1147 int32_t DeviceManagerService::BindTarget(const std::string &pkgName, const PeerTargetId &targetId,
1148     const std::map<std::string, std::string> &bindParam)
1149 {
1150     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1151         LOGE("The caller does not have permission to call");
1152         return ERR_DM_NO_PERMISSION;
1153     }
1154     LOGI("DeviceManagerService::BindTarget for pkgName = %s", pkgName.c_str());
1155     if (pkgName.empty()) {
1156         LOGE("Invalid parameter, pkgName is empty.");
1157         return ERR_DM_INPUT_PARA_INVALID;
1158     }
1159     if (!IsDMServiceImplReady()) {
1160         LOGE("BindTarget failed, DMServiceImpl instance not init or init failed.");
1161         return ERR_DM_NOT_INIT;
1162     }
1163     if (bindParam.find(PARAM_KEY_META_TYPE) == bindParam.end()) {
1164         LOGI("BindTarget stardard begin.");
1165         ConnectionAddrType addrType;
1166         PeerTargetId targetIdTemp;
1167         std::map<std::string, std::string> &noConstBindParam =
1168             const_cast<std::map<std::string, std::string> &>(bindParam);
1169         if (SoftbusListener::GetTargetInfoFromCache(targetId.deviceId, targetIdTemp, addrType) == DM_OK) {
1170             noConstBindParam.insert(std::pair<std::string, std::string>(PARAM_KEY_CONN_ADDR_TYPE, std::to_string(addrType)));
1171         }
1172         const std::map<std::string, std::string> &constBindParam =
1173             const_cast<const std::map<std::string, std::string> &>(noConstBindParam);
1174         return dmServiceImpl_->BindTarget(pkgName, targetId, constBindParam);
1175     }
1176     if (!IsDMServiceAdapterLoad()) {
1177         LOGE("BindTarget failed, adapter instance not init or init failed.");
1178         return ERR_DM_UNSUPPORTED_METHOD;
1179     }
1180     LOGI("BindTarget unstardard begin.");
1181     return dmServiceImplExt_->BindTargetExt(pkgName, targetId, bindParam);
1182 }
1183 
UnbindTarget(const std::string & pkgName,const PeerTargetId & targetId,const std::map<std::string,std::string> & unbindParam)1184 int32_t DeviceManagerService::UnbindTarget(const std::string &pkgName, const PeerTargetId &targetId,
1185     const std::map<std::string, std::string> &unbindParam)
1186 {
1187     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1188         LOGE("The caller does not have permission to call");
1189         return ERR_DM_NO_PERMISSION;
1190     }
1191     LOGI("DeviceManagerService::UnbindTarget for pkgName = %s", pkgName.c_str());
1192     if (pkgName.empty()) {
1193         LOGE("Invalid parameter, pkgName is empty.");
1194         return ERR_DM_INPUT_PARA_INVALID;
1195     }
1196     if (!IsDMServiceAdapterLoad()) {
1197         LOGE("UnbindTarget failed, instance not init or init failed.");
1198         return ERR_DM_UNSUPPORTED_METHOD;
1199     }
1200     if (unbindParam.find(PARAM_KEY_META_TYPE) == unbindParam.end()) {
1201         LOGE("input unbind parameter not contains META_TYPE, dm service adapter not supported.");
1202         return ERR_DM_INPUT_PARA_INVALID;
1203     }
1204     return dmServiceImplExt_->UnbindTargetExt(pkgName, targetId, unbindParam);
1205 }
1206 
RegisterPinHolderCallback(const std::string & pkgName)1207 int32_t DeviceManagerService::RegisterPinHolderCallback(const std::string &pkgName)
1208 {
1209     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1210         LOGE("The caller: %s does not have permission to call ImportAuthCode.", pkgName.c_str());
1211         return ERR_DM_NO_PERMISSION;
1212     }
1213     std::string processName = "";
1214     if (PermissionManager::GetInstance().GetCallerProcessName(processName) != DM_OK) {
1215         LOGE("Get caller process name failed, pkgname: %s.", pkgName.c_str());
1216         return ERR_DM_FAILED;
1217     }
1218     if (!PermissionManager::GetInstance().CheckProcessNameValidOnPinHolder(processName)) {
1219         LOGE("The caller: %s is not in white list.", processName.c_str());
1220         return ERR_DM_INPUT_PARA_INVALID;
1221     }
1222     LOGI("DeviceManagerService::RegisterPinHolderCallback begin.");
1223     if (pkgName.empty()) {
1224         LOGE("Invalid parameter, pkgName: %s.", pkgName.c_str());
1225         return ERR_DM_INPUT_PARA_INVALID;
1226     }
1227     return pinHolder_->RegisterPinHolderCallback(pkgName);
1228 }
1229 
CreatePinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)1230 int32_t DeviceManagerService::CreatePinHolder(const std::string &pkgName, const PeerTargetId &targetId,
1231     DmPinType pinType, const std::string &payload)
1232 {
1233     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1234         LOGE("The caller: %s does not have permission to call CreatePinHolder.", pkgName.c_str());
1235         return ERR_DM_NO_PERMISSION;
1236     }
1237     std::string processName = "";
1238     if (PermissionManager::GetInstance().GetCallerProcessName(processName) != DM_OK) {
1239         LOGE("Get caller process name failed, pkgname: %s.", pkgName.c_str());
1240         return ERR_DM_FAILED;
1241     }
1242     if (!PermissionManager::GetInstance().CheckProcessNameValidOnPinHolder(processName)) {
1243         LOGE("The caller: %s is not in white list.", processName.c_str());
1244         return ERR_DM_INPUT_PARA_INVALID;
1245     }
1246     LOGI("DeviceManagerService::CreatePinHolder begin.");
1247     if (pkgName.empty()) {
1248         LOGE("Invalid parameter, pkgName: %s.", pkgName.c_str());
1249         return ERR_DM_INPUT_PARA_INVALID;
1250     }
1251     return pinHolder_->CreatePinHolder(pkgName, targetId, pinType, payload);
1252 }
1253 
DestroyPinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)1254 int32_t DeviceManagerService::DestroyPinHolder(const std::string &pkgName, const PeerTargetId &targetId,
1255     DmPinType pinType, const std::string &payload)
1256 {
1257     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1258         LOGE("The caller: %s does not have permission to call DestroyPinHolder.", pkgName.c_str());
1259         return ERR_DM_NO_PERMISSION;
1260     }
1261     std::string processName = "";
1262     if (PermissionManager::GetInstance().GetCallerProcessName(processName) != DM_OK) {
1263         LOGE("Get caller process name failed, pkgname: %s.", pkgName.c_str());
1264         return ERR_DM_FAILED;
1265     }
1266     if (!PermissionManager::GetInstance().CheckProcessNameValidOnPinHolder(processName)) {
1267         LOGE("The caller: %s is not in white list.", processName.c_str());
1268         return ERR_DM_INPUT_PARA_INVALID;
1269     }
1270     LOGI("DeviceManagerService::DestroyPinHolder begin.");
1271     if (pkgName.empty()) {
1272         LOGE("Invalid parameter, pkgName: %s.", pkgName.c_str());
1273         return ERR_DM_INPUT_PARA_INVALID;
1274     }
1275     return pinHolder_->DestroyPinHolder(pkgName, targetId, pinType, payload);
1276 }
1277 
OnUnbindSessionOpened(int32_t sessionId,int32_t result)1278 void DeviceManagerService::OnUnbindSessionOpened(int32_t sessionId, int32_t result)
1279 {
1280     if (!IsDMServiceImplReady()) {
1281         LOGE("OnBytesReceived failed, instance not init or init failed.");
1282         return;
1283     }
1284     dmServiceImpl_->OnUnbindSessionOpened(sessionId, result);
1285 }
1286 
OnUnbindSessionCloseed(int32_t sessionId)1287 void DeviceManagerService::OnUnbindSessionCloseed(int32_t sessionId)
1288 {
1289     if (!IsDMServiceImplReady()) {
1290         LOGE("OnBytesReceived failed, instance not init or init failed.");
1291         return;
1292     }
1293     dmServiceImpl_->OnUnbindSessionCloseed(sessionId);
1294 }
1295 
OnUnbindBytesReceived(int32_t sessionId,const void * data,uint32_t dataLen)1296 void DeviceManagerService::OnUnbindBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen)
1297 {
1298     if (!IsDMServiceImplReady()) {
1299         LOGE("OnBytesReceived failed, instance not init or init failed.");
1300         return;
1301     }
1302     dmServiceImpl_->OnUnbindBytesReceived(sessionId, data, dataLen);
1303 }
1304 
DpAclAdd(const std::string & udid)1305 int32_t DeviceManagerService::DpAclAdd(const std::string &udid)
1306 {
1307     if (!PermissionManager::GetInstance().CheckNewPermission()) {
1308         LOGE("The caller does not have permission to call DpAclAdd.");
1309         return ERR_DM_NO_PERMISSION;
1310     }
1311     LOGI("DeviceManagerService DpAclAdd start.");
1312     if (!IsDMServiceImplReady()) {
1313         LOGE("OnBytesReceived failed, instance not init or init failed.");
1314         return ERR_DM_NOT_INIT;
1315     }
1316     dmServiceImpl_->DpAclAdd(udid);
1317     LOGI("DeviceManagerService::DpAclAdd completed");
1318     return DM_OK;
1319 }
1320 } // namespace DistributedHardware
1321 } // namespace OHOS