1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "device_manager_service.h"
17
18 #include <dlfcn.h>
19 #include <functional>
20
21 #include "dm_anonymous.h"
22 #include "dm_constants.h"
23 #include "dm_hidumper.h"
24 #include "dm_log.h"
25
26 constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.z.so";
27
28 namespace OHOS {
29 namespace DistributedHardware {
30 IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService);
31
~DeviceManagerService()32 DeviceManagerService::~DeviceManagerService()
33 {
34 LOGI("DeviceManagerService destructor");
35 if (dmServiceImpl_ != nullptr) {
36 dmServiceImpl_->Release();
37 }
38 std::string soPathName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
39 void *so_handle = dlopen(soPathName.c_str(), RTLD_NOW | RTLD_NOLOAD);
40 if (so_handle != nullptr) {
41 dlclose(so_handle);
42 }
43 }
44
Init()45 int32_t DeviceManagerService::Init()
46 {
47 InitSoftbusListener();
48 InitDMServiceListener();
49
50 LOGI("Init success, dm service single instance initialized.");
51 return DM_OK;
52 }
53
InitSoftbusListener()54 int32_t DeviceManagerService::InitSoftbusListener()
55 {
56 if (softbusListener_ == nullptr) {
57 softbusListener_ = std::make_shared<SoftbusListener>();
58 }
59 LOGI("SoftbusListener init success.");
60
61 return DM_OK;
62 }
63
UninitSoftbusListener()64 void DeviceManagerService::UninitSoftbusListener()
65 {
66 softbusListener_ = nullptr;
67 LOGI("SoftbusListener uninit.");
68 }
69
InitDMServiceListener()70 int32_t DeviceManagerService::InitDMServiceListener()
71 {
72 if (listener_ == nullptr) {
73 listener_ = std::make_shared<DeviceManagerServiceListener>();
74 }
75
76 LOGI("DeviceManagerServiceListener init success.");
77 return DM_OK;
78 }
79
UninitDMServiceListener()80 void DeviceManagerService::UninitDMServiceListener()
81 {
82 listener_ = nullptr;
83 LOGI("DeviceManagerServiceListener uninit.");
84 }
85
GetTrustedDeviceList(const std::string & pkgName,const std::string & extra,std::vector<DmDeviceInfo> & deviceList)86 int32_t DeviceManagerService::GetTrustedDeviceList(const std::string &pkgName, const std::string &extra,
87 std::vector<DmDeviceInfo> &deviceList)
88 {
89 LOGI("DeviceManagerService::GetTrustedDeviceList begin for pkgName = %s, extra = %s", pkgName.c_str(),
90 extra.c_str());
91 if (pkgName.empty()) {
92 LOGE("Invalid parameter, pkgName is empty.");
93 return ERR_DM_INPUT_PARA_INVALID;
94 }
95 int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
96 if (ret != DM_OK) {
97 LOGE("GetTrustedDeviceList failed");
98 }
99 return ret;
100 }
101
GetLocalDeviceInfo(DmDeviceInfo & info)102 int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info)
103 {
104 LOGI("DeviceManagerService::GetLocalDeviceInfo begin.");
105 int32_t ret = softbusListener_->GetLocalDeviceInfo(info);
106 if (ret != DM_OK) {
107 LOGE("GetLocalDeviceInfo failed");
108 }
109 return ret;
110 }
111
GetUdidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & udid)112 int32_t DeviceManagerService::GetUdidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
113 std::string &udid)
114 {
115 LOGI("DeviceManagerService::GetUdidByNetworkId begin for pkgName = %s", pkgName.c_str());
116 if (pkgName.empty() || netWorkId.empty()) {
117 LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
118 return ERR_DM_INPUT_PARA_INVALID;
119 }
120 SoftbusListener::GetUdidByNetworkId(netWorkId.c_str(), udid);
121 return DM_OK;
122 }
123
GetUuidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & uuid)124 int32_t DeviceManagerService::GetUuidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
125 std::string &uuid)
126 {
127 LOGI("DeviceManagerService::GetUuidByNetworkId begin for pkgName = %s", pkgName.c_str());
128 if (pkgName.empty() || netWorkId.empty()) {
129 LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
130 return ERR_DM_INPUT_PARA_INVALID;
131 }
132 SoftbusListener::GetUuidByNetworkId(netWorkId.c_str(), uuid);
133 return DM_OK;
134 }
135
StartDeviceDiscovery(const std::string & pkgName,const DmSubscribeInfo & subscribeInfo,const std::string & extra)136 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const DmSubscribeInfo &subscribeInfo,
137 const std::string &extra)
138 {
139 LOGI("DeviceManagerService::StartDeviceDiscovery begin for pkgName = %s, extra = %s", pkgName.c_str(),
140 extra.c_str());
141 if (pkgName.empty()) {
142 LOGE("Invalid parameter, pkgName is empty.");
143 return ERR_DM_INPUT_PARA_INVALID;
144 }
145 if (!IsDMServiceImplReady()) {
146 LOGE("StartDeviceDiscovery failed, instance not init or init failed.");
147 return ERR_DM_NOT_INIT;
148 }
149 return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeInfo, extra);
150 }
151
StopDeviceDiscovery(const std::string & pkgName,uint16_t subscribeId)152 int32_t DeviceManagerService::StopDeviceDiscovery(const std::string &pkgName, uint16_t subscribeId)
153 {
154 LOGI("DeviceManagerService::StopDeviceDiscovery 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 if (!IsDMServiceImplReady()) {
160 LOGE("StopDeviceDiscovery failed, instance not init or init failed.");
161 return ERR_DM_NOT_INIT;
162 }
163 return dmServiceImpl_->StopDeviceDiscovery(pkgName, subscribeId);
164 }
165
PublishDeviceDiscovery(const std::string & pkgName,const DmPublishInfo & publishInfo)166 int32_t DeviceManagerService::PublishDeviceDiscovery(const std::string &pkgName, const DmPublishInfo &publishInfo)
167 {
168 LOGI("DeviceManagerService::PublishDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
169 if (pkgName.empty()) {
170 LOGE("Invalid parameter, pkgName is empty.");
171 return ERR_DM_INPUT_PARA_INVALID;
172 }
173 if (!IsDMServiceImplReady()) {
174 LOGE("PublishDeviceDiscovery failed, instance not init or init failed.");
175 return ERR_DM_NOT_INIT;
176 }
177 return dmServiceImpl_->PublishDeviceDiscovery(pkgName, publishInfo);
178 }
179
UnPublishDeviceDiscovery(const std::string & pkgName,int32_t publishId)180 int32_t DeviceManagerService::UnPublishDeviceDiscovery(const std::string &pkgName, int32_t publishId)
181 {
182 if (pkgName.empty()) {
183 LOGE("Invalid parameter, pkgName is empty.");
184 return ERR_DM_INPUT_PARA_INVALID;
185 }
186 if (!IsDMServiceImplReady()) {
187 LOGE("UnPublishDeviceDiscovery failed, instance not init or init failed.");
188 return ERR_DM_NOT_INIT;
189 }
190 return dmServiceImpl_->UnPublishDeviceDiscovery(pkgName, publishId);
191 }
192
AuthenticateDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & extra)193 int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,
194 const std::string &deviceId, const std::string &extra)
195 {
196 if (pkgName.empty() || deviceId.empty()) {
197 LOGE("DeviceManagerService::AuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
198 return ERR_DM_INPUT_PARA_INVALID;
199 }
200 if (!IsDMServiceImplReady()) {
201 LOGE("AuthenticateDevice failed, instance not init or init failed.");
202 return ERR_DM_NOT_INIT;
203 }
204 return dmServiceImpl_->AuthenticateDevice(pkgName, authType, deviceId, extra);
205 }
206
UnAuthenticateDevice(const std::string & pkgName,const std::string & deviceId)207 int32_t DeviceManagerService::UnAuthenticateDevice(const std::string &pkgName, const std::string &deviceId)
208 {
209 LOGI("DeviceManagerService::UnAuthenticateDevice begin for pkgName = %s, deviceId = %s",
210 pkgName.c_str(), GetAnonyString(deviceId).c_str());
211 if (pkgName.empty() || deviceId.empty()) {
212 LOGE("DeviceManagerService::UnAuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
213 return ERR_DM_INPUT_PARA_INVALID;
214 }
215 if (!IsDMServiceImplReady()) {
216 LOGE("UnAuthenticateDevice failed, instance not init or init failed.");
217 return ERR_DM_NOT_INIT;
218 }
219 return dmServiceImpl_->UnAuthenticateDevice(pkgName, deviceId);
220 }
221
VerifyAuthentication(const std::string & authParam)222 int32_t DeviceManagerService::VerifyAuthentication(const std::string &authParam)
223 {
224 if (authParam.empty()) {
225 LOGE("DeviceManagerService::VerifyAuthentication error: Invalid parameter, authParam: %s", authParam.c_str());
226 return ERR_DM_INPUT_PARA_INVALID;
227 }
228 if (!IsDMServiceImplReady()) {
229 LOGE("DeviceManagerService::VerifyAuthentication failed, instance not init or init failed.");
230 return ERR_DM_NOT_INIT;
231 }
232 return dmServiceImpl_->VerifyAuthentication(authParam);
233 }
234
GetFaParam(std::string & pkgName,DmAuthParam & authParam)235 int32_t DeviceManagerService::GetFaParam(std::string &pkgName, DmAuthParam &authParam)
236 {
237 if (pkgName.empty()) {
238 LOGE("Invalid parameter, pkgName is empty.");
239 return ERR_DM_INPUT_PARA_INVALID;
240 }
241 if (!IsDMServiceImplReady()) {
242 LOGE("GetFaParam failed, instance not init or init failed.");
243 return ERR_DM_NOT_INIT;
244 }
245 return dmServiceImpl_->GetFaParam(pkgName, authParam);
246 }
247
SetUserOperation(std::string & pkgName,int32_t action,const std::string & params)248 int32_t DeviceManagerService::SetUserOperation(std::string &pkgName, int32_t action, const std::string ¶ms)
249 {
250 if (pkgName.empty() || params.empty()) {
251 LOGE("DeviceManagerService::SetUserOperation error: Invalid parameter, pkgName: %s", pkgName.c_str(),
252 params.c_str());
253 return ERR_DM_INPUT_PARA_INVALID;
254 }
255 if (!IsDMServiceImplReady()) {
256 LOGE("SetUserOperation failed, instance not init or init failed.");
257 return ERR_DM_NOT_INIT;
258 }
259 return dmServiceImpl_->SetUserOperation(pkgName, action, params);
260 }
261
RegisterDevStateCallback(const std::string & pkgName,const std::string & extra)262 int32_t DeviceManagerService::RegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
263 {
264 if (pkgName.empty()) {
265 LOGE("DeviceManagerService::RegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
266 return ERR_DM_INPUT_PARA_INVALID;
267 }
268 {
269 std::lock_guard<std::mutex> lock(registerDevStateLock_);
270 if (registerDevStateMap_.count(pkgName) == 0) {
271 registerDevStateMap_.insert(std::map<std::string, std::string>::value_type (pkgName, extra));
272 }
273 }
274 return DM_OK;
275 }
276
UnRegisterDevStateCallback(const std::string & pkgName,const std::string & extra)277 int32_t DeviceManagerService::UnRegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
278 {
279 if (pkgName.empty()) {
280 LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
281 return ERR_DM_INPUT_PARA_INVALID;
282 }
283 {
284 std::lock_guard<std::mutex> lock(registerDevStateLock_);
285 if (registerDevStateMap_.count(pkgName) > 0) {
286 registerDevStateMap_.erase(pkgName);
287 }
288 }
289 if (IsDMServiceImplSoLoaded()) {
290 return dmServiceImpl_->UnRegisterDevStateCallback(pkgName, extra);
291 }
292 return DM_OK;
293 }
294
HandleDeviceOnline(const DmDeviceInfo & info)295 void DeviceManagerService::HandleDeviceOnline(const DmDeviceInfo &info)
296 {
297 if (!IsDMServiceImplReady()) {
298 LOGE("HandleDeviceOnline failed, instance not init or init failed.");
299 return;
300 }
301 {
302 std::lock_guard<std::mutex> lock(registerDevStateLock_);
303 for (auto iter : registerDevStateMap_) {
304 dmServiceImpl_->RegisterDevStateCallback(iter.first, iter.second);
305 }
306 }
307 dmServiceImpl_->HandleDeviceOnline(info);
308 }
309
HandleDeviceOffline(const DmDeviceInfo & info)310 void DeviceManagerService::HandleDeviceOffline(const DmDeviceInfo &info)
311 {
312 if (!IsDMServiceImplReady()) {
313 LOGE("HandleDeviceOffline failed, instance not init or init failed.");
314 return;
315 }
316 dmServiceImpl_->HandleDeviceOffline(info);
317 }
318
OnSessionOpened(int sessionId,int result)319 int DeviceManagerService::OnSessionOpened(int sessionId, int result)
320 {
321 if (!IsDMServiceImplReady()) {
322 LOGE("OnSessionOpened failed, instance not init or init failed.");
323 return ERR_DM_NOT_INIT;
324 }
325 return dmServiceImpl_->OnSessionOpened(sessionId, result);
326 }
327
OnSessionClosed(int sessionId)328 void DeviceManagerService::OnSessionClosed(int sessionId)
329 {
330 if (!IsDMServiceImplReady()) {
331 LOGE("OnSessionClosed failed, instance not init or init failed.");
332 return;
333 }
334 dmServiceImpl_->OnSessionClosed(sessionId);
335 }
336
OnBytesReceived(int sessionId,const void * data,unsigned int dataLen)337 void DeviceManagerService::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen)
338 {
339 if (!IsDMServiceImplReady()) {
340 LOGE("OnBytesReceived failed, instance not init or init failed.");
341 return;
342 }
343 dmServiceImpl_->OnBytesReceived(sessionId, data, dataLen);
344 }
345
RequestCredential(const std::string & reqJsonStr,std::string & returnJsonStr)346 int32_t DeviceManagerService::RequestCredential(const std::string &reqJsonStr, std::string &returnJsonStr)
347 {
348 if (!IsDMServiceImplReady()) {
349 LOGE("RequestCredential failed, instance not init or init failed.");
350 return ERR_DM_NOT_INIT;
351 }
352 return dmServiceImpl_->RequestCredential(reqJsonStr, returnJsonStr);
353 }
354
ImportCredential(const std::string & pkgName,const std::string & credentialInfo)355 int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &credentialInfo)
356 {
357 if (!IsDMServiceImplReady()) {
358 LOGE("ImportCredential failed, instance not init or init failed.");
359 return ERR_DM_NOT_INIT;
360 }
361 return dmServiceImpl_->ImportCredential(pkgName, credentialInfo);
362 }
363
DeleteCredential(const std::string & pkgName,const std::string & deleteInfo)364 int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &deleteInfo)
365 {
366 if (!IsDMServiceImplReady()) {
367 LOGE("DeleteCredential failed, instance not init or init failed.");
368 return ERR_DM_NOT_INIT;
369 }
370 return dmServiceImpl_->DeleteCredential(pkgName, deleteInfo);
371 }
372
RegisterCredentialCallback(const std::string & pkgName)373 int32_t DeviceManagerService::RegisterCredentialCallback(const std::string &pkgName)
374 {
375 if (!IsDMServiceImplReady()) {
376 LOGE("RegisterCredentialCallback failed, instance not init or init failed.");
377 return ERR_DM_NOT_INIT;
378 }
379 return dmServiceImpl_->RegisterCredentialCallback(pkgName);
380 }
381
UnRegisterCredentialCallback(const std::string & pkgName)382 int32_t DeviceManagerService::UnRegisterCredentialCallback(const std::string &pkgName)
383 {
384 if (!IsDMServiceImplReady()) {
385 LOGE("UnRegisterCredentialCallback failed, instance not init or init failed.");
386 return ERR_DM_NOT_INIT;
387 }
388 return dmServiceImpl_->UnRegisterCredentialCallback(pkgName);
389 }
390
IsDMServiceImplReady()391 bool DeviceManagerService::IsDMServiceImplReady()
392 {
393 std::lock_guard<std::mutex> lock(isImplLoadLock_);
394 if (isImplsoLoaded_ && (dmServiceImpl_ != nullptr)) {
395 return true;
396 }
397
398 std::string soName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
399 void *so_handle = dlopen(soName.c_str(), RTLD_NOW | RTLD_NOLOAD);
400 if (so_handle == nullptr) {
401 so_handle = dlopen(soName.c_str(), RTLD_NOW);
402 if (so_handle == nullptr) {
403 LOGE("load libdevicemanagerserviceimpl so %s failed.", soName.c_str());
404 return false;
405 }
406 }
407 dlerror();
408 auto func = (CreateDMServiceFuncPtr)dlsym(so_handle, "CreateDMServiceObject");
409 if (dlerror() != nullptr || func == nullptr) {
410 LOGE("Create object function is not exist.");
411 return false;
412 }
413
414 dmServiceImpl_ = std::shared_ptr<IDeviceManagerServiceImpl>(func());
415 if (dmServiceImpl_->Initialize(listener_) != DM_OK) {
416 dlclose(so_handle);
417 dmServiceImpl_ = nullptr;
418 isImplsoLoaded_ = false;
419 return false;
420 }
421 isImplsoLoaded_ = true;
422 return true;
423 }
424
IsDMServiceImplSoLoaded()425 bool DeviceManagerService::IsDMServiceImplSoLoaded()
426 {
427 std::lock_guard<std::mutex> lock(isImplLoadLock_);
428 return isImplsoLoaded_;
429 }
430
DmHiDumper(const std::vector<std::string> & args,std::string & result)431 int32_t DeviceManagerService::DmHiDumper(const std::vector<std::string>& args, std::string &result)
432 {
433 LOGI("HiDump GetTrustedDeviceList");
434 std::vector<HidumperFlag> dumpflag;
435 HiDumpHelper::GetInstance().GetArgsType(args, dumpflag);
436
437 for (unsigned int i = 0; i < dumpflag.size(); i++) {
438 if (dumpflag[i] == HidumperFlag::HIDUMPER_GET_TRUSTED_LIST) {
439 std::vector<DmDeviceInfo> deviceList;
440
441 int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
442 if (ret != DM_OK) {
443 result.append("HiDumpHelper GetTrustedDeviceList failed");
444 LOGE("HiDumpHelper GetTrustedDeviceList failed");
445 return ERR_DM_FAILED;
446 }
447
448 for (unsigned int j = 0; j < deviceList.size(); j++) {
449 HiDumpHelper::GetInstance().SetNodeInfo(deviceList[j]);
450 LOGI("DeviceManagerService::DmHiDumper SetNodeInfo.");
451 }
452 }
453 }
454 HiDumpHelper::GetInstance().HiDump(args, result);
455 return DM_OK;
456 }
457
NotifyEvent(const std::string & pkgName,const int32_t eventId,const std::string & event)458 int32_t DeviceManagerService::NotifyEvent(const std::string &pkgName, const int32_t eventId, const std::string &event)
459 {
460 if (!IsDMServiceImplReady()) {
461 LOGE("NotifyEvent failed, instance not init or init failed.");
462 return ERR_DM_NOT_INIT;
463 }
464 return dmServiceImpl_->NotifyEvent(pkgName, eventId, event);
465 }
466
LoadHardwareFwkService()467 void DeviceManagerService::LoadHardwareFwkService()
468 {
469 std::string extra;
470 std::vector<DmDeviceInfo> deviceList;
471 int32_t ret = GetTrustedDeviceList(DM_PKG_NAME, extra, deviceList);
472 if (ret != DM_OK) {
473 LOGE("LoadHardwareFwkService failed, get trusted devicelist failed.");
474 return;
475 }
476 if (deviceList.size() > 0) {
477 dmServiceImpl_->LoadHardwareFwkService();
478 }
479 }
480
GetEncryptedUuidByNetworkId(const std::string & pkgName,const std::string & networkId,std::string & uuid)481 int32_t DeviceManagerService::GetEncryptedUuidByNetworkId(const std::string &pkgName, const std::string &networkId,
482 std::string &uuid)
483 {
484 if (!IsDMServiceImplReady()) {
485 LOGE("GetEncryptedUuidByNetworkId failed, instance not init or init failed.");
486 return ERR_DM_NOT_INIT;
487 }
488 return dmServiceImpl_->GetEncryptedUuidByNetworkId(pkgName, networkId, uuid);
489 }
490
GenerateEncryptedUuid(const std::string & pkgName,const std::string & uuid,const std::string & appId,std::string & encryptedUuid)491 int32_t DeviceManagerService::GenerateEncryptedUuid(const std::string &pkgName, const std::string &uuid,
492 const std::string &appId, std::string &encryptedUuid)
493 {
494 if (!IsDMServiceImplReady()) {
495 LOGE("GenerateEncryptedUuid failed, instance not init or init failed.");
496 return ERR_DM_NOT_INIT;
497 }
498 return dmServiceImpl_->GenerateEncryptedUuid(pkgName, uuid, appId, encryptedUuid);
499 }
500 } // namespace DistributedHardware
501 } // namespace OHOS
502