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 ¶ms)
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