/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "device_manager_service.h" #include #include #include "app_manager.h" #include "dm_anonymous.h" #include "dm_constants.h" #include "dm_hidumper.h" #include "dm_log.h" #include "dm_softbus_adapter_crypto.h" #include "parameter.h" #include "permission_manager.h" constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.z.so"; namespace OHOS { namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService); DeviceManagerService::~DeviceManagerService() { LOGI("DeviceManagerService destructor"); if (dmServiceImpl_ != nullptr) { dmServiceImpl_->Release(); } char path[PATH_MAX + 1] = {0x00}; std::string soPathName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME); if ((soPathName.length() == 0) || (soPathName.length() > PATH_MAX) || (realpath(soPathName.c_str(), path) == nullptr)) { LOGE("File %s canonicalization failed.", soPathName.c_str()); return; } void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD); if (so_handle != nullptr) { dlclose(so_handle); } } int32_t DeviceManagerService::Init() { InitSoftbusListener(); InitDMServiceListener(); LOGI("Init success, dm service single instance initialized."); return DM_OK; } int32_t DeviceManagerService::InitSoftbusListener() { if (softbusListener_ == nullptr) { softbusListener_ = std::make_shared(); } LOGI("SoftbusListener init success."); return DM_OK; } void DeviceManagerService::UninitSoftbusListener() { softbusListener_ = nullptr; LOGI("SoftbusListener uninit."); } int32_t DeviceManagerService::InitDMServiceListener() { if (listener_ == nullptr) { listener_ = std::make_shared(); } LOGI("DeviceManagerServiceListener init success."); return DM_OK; } void DeviceManagerService::UninitDMServiceListener() { listener_ = nullptr; LOGI("DeviceManagerServiceListener uninit."); } void DeviceManagerService::RegisterDeviceManagerListener(const std::string &pkgName) { listener_->RegisterDmListener(pkgName, AppManager::GetInstance().GetAppId()); } void DeviceManagerService::UnRegisterDeviceManagerListener(const std::string &pkgName) { listener_->UnRegisterDmListener(pkgName); } int32_t DeviceManagerService::GetTrustedDeviceList(const std::string &pkgName, const std::string &extra, std::vector &deviceList) { LOGI("DeviceManagerService::GetTrustedDeviceList begin for pkgName = %s, extra = %s", pkgName.c_str(), extra.c_str()); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList); if (ret != DM_OK) { LOGE("GetTrustedDeviceList failed"); return ret; } if (deviceList.size() > 0 && IsDMServiceImplReady()) { return dmServiceImpl_->GetGroupType(deviceList); } return DM_OK; } int32_t DeviceManagerService::GetAvailableDeviceList(const std::string &pkgName, std::vector &deviceBasicInfoList) { LOGI("DeviceManagerService::GetAvailableDeviceList begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } int32_t ret = softbusListener_->GetAvailableDeviceList(deviceBasicInfoList); if (ret != DM_OK) { LOGE("GetAvailableDeviceList failed"); return ret; } if (deviceBasicInfoList.size() > 0 && IsDMServiceImplReady()) { for (auto it = deviceBasicInfoList.begin(); it != deviceBasicInfoList.end(); ++it) { std::string udidHash = ""; ret = dmServiceImpl_->GetUdidHashByNetWorkId(it->networkId, udidHash); if (ret != DM_OK) { LOGE("DeviceManagerService::GetAvailableDeviceList get UdidHash by network failed."); return ret; } std::string deviceId = listener_->CalcDeviceId(pkgName, udidHash); if (memcpy_s(it->deviceId, DM_MAX_DEVICE_ID_LEN, deviceId.c_str(), deviceId.length()) != 0) { LOGE("get deviceId: %s failed", GetAnonyString(deviceId).c_str()); } } } return DM_OK; } int32_t DeviceManagerService::ShiftLNNGear(const std::string &pkgName, const std::string &callerId, bool isRefresh) { LOGI("DeviceManagerService::ShiftLNNGear begin for pkgName = %s, callerId = %s, isRefresh = %d", pkgName.c_str(), callerId.c_str(), isRefresh); if (pkgName.empty() || callerId.empty()) { LOGE("Invalid parameter, parameter is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (isRefresh) { int32_t ret = softbusListener_->ShiftLNNGear(); if (ret != DM_OK) { LOGE("ShiftLNNGear error, failed ret: %d", ret); return ret; } } return DM_OK; } int32_t DeviceManagerService::GetDeviceInfo(const std::string &networkId, DmDeviceInfo &info) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller does not have permission to call GetDeviceInfo."); return ERR_DM_NO_PERMISSION; } if (networkId.empty()) { LOGE("Invalid parameter, networkId is empty."); return ERR_DM_INPUT_PARA_INVALID; } LOGI("DeviceManagerService::GetDeviceInfo begin by networkId : %s.", GetAnonyString(networkId).c_str()); int32_t ret = softbusListener_->GetDeviceInfo(networkId, info); if (ret != DM_OK) { LOGE("Get DeviceInfo By NetworkId failed, ret : %d", ret); } return ret; } int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info) { LOGI("DeviceManagerService::GetLocalDeviceInfo begin."); int32_t ret = softbusListener_->GetLocalDeviceInfo(info); if (ret != DM_OK) { LOGE("GetLocalDeviceInfo failed"); return ret; } if (localDeviceId_.empty()) { char localDeviceId[DEVICE_UUID_LENGTH] = {0}; char udidHash[DEVICE_UUID_LENGTH] = {0}; GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH); if (DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId, (uint8_t *)udidHash) == DM_OK) { localDeviceId_ = udidHash; } } if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, localDeviceId_.c_str(), localDeviceId_.length()) != 0) { LOGE("get deviceId: %s failed", GetAnonyString(localDeviceId_).c_str()); } return DM_OK; } int32_t DeviceManagerService::GetLocalDeviceNetworkId(std::string &networkId) { LOGI("DeviceManagerService::GetLocalDeviceNetworkId begin."); int32_t ret = softbusListener_->GetLocalDeviceNetworkId(networkId); if (ret != DM_OK) { LOGE("GetLocalDeviceNetworkId failed"); return ret; } return DM_OK; } int32_t DeviceManagerService::GetLocalDeviceId(const std::string &pkgName, std::string &deviceId) { LOGI("DeviceManagerService::GetLocalDeviceId begin."); char localDeviceId[DEVICE_UUID_LENGTH] = {0}; char udidHash[DEVICE_UUID_LENGTH] = {0}; GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH); int32_t ret = DmSoftbusAdapterCrypto::GetUdidHash(localDeviceId, (uint8_t *)udidHash); if (ret != DM_OK) { LOGE("get udidhash by udid: %s failed.", GetAnonyString(localDeviceId).c_str()); deviceId = ""; return ret; } deviceId = listener_->CalcDeviceId(pkgName, static_cast(udidHash)); return DM_OK; } int32_t DeviceManagerService::GetLocalDeviceName(std::string &deviceName) { LOGI("DeviceManagerService::GetLocalDeviceName begin."); int32_t ret = softbusListener_->GetLocalDeviceName(deviceName); if (ret != DM_OK) { LOGE("GetLocalDeviceName failed"); return ret; } return DM_OK; } int32_t DeviceManagerService::GetLocalDeviceType(int32_t &deviceType) { LOGI("DeviceManagerService::GetLocalDeviceType begin."); int32_t ret = softbusListener_->GetLocalDeviceType(deviceType); if (ret != DM_OK) { LOGE("GetLocalDeviceType failed"); return ret; } return DM_OK; } int32_t DeviceManagerService::GetUdidByNetworkId(const std::string &pkgName, const std::string &netWorkId, std::string &udid) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call GetUdidByNetworkId.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::GetUdidByNetworkId begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty() || netWorkId.empty()) { LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str()); return ERR_DM_INPUT_PARA_INVALID; } SoftbusListener::GetUdidByNetworkId(netWorkId.c_str(), udid); return DM_OK; } int32_t DeviceManagerService::GetUuidByNetworkId(const std::string &pkgName, const std::string &netWorkId, std::string &uuid) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call GetUuidByNetworkId.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::GetUuidByNetworkId begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty() || netWorkId.empty()) { LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str()); return ERR_DM_INPUT_PARA_INVALID; } SoftbusListener::GetUuidByNetworkId(netWorkId.c_str(), uuid); return DM_OK; } int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const DmSubscribeInfo &subscribeInfo, const std::string &extra) { if (!PermissionManager::GetInstance().CheckPermission()) { LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::StartDeviceDiscovery begin for pkgName = %s, extra = %s", pkgName.c_str(), extra.c_str()); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("StartDeviceDiscovery failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeInfo, extra); } int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const uint16_t subscribeId, const std::string &filterOptions) { if (!PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call StartDeviceDiscovery.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("StartDeviceDiscovery begin for pkgName = %s, filterOptions = %s, subscribeId = %d", pkgName.c_str(), filterOptions.c_str(), subscribeId); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("StartDeviceDiscovery failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeId, filterOptions); } int32_t DeviceManagerService::StopDeviceDiscovery(const std::string &pkgName, uint16_t subscribeId) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call StopDeviceDiscovery.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::StopDeviceDiscovery begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("StopDeviceDiscovery failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->StopDeviceDiscovery(pkgName, subscribeId); } int32_t DeviceManagerService::PublishDeviceDiscovery(const std::string &pkgName, const DmPublishInfo &publishInfo) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call PublishDeviceDiscovery.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::PublishDeviceDiscovery begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("PublishDeviceDiscovery failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->PublishDeviceDiscovery(pkgName, publishInfo); } int32_t DeviceManagerService::UnPublishDeviceDiscovery(const std::string &pkgName, int32_t publishId) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call UnPublishDeviceDiscovery.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("UnPublishDeviceDiscovery failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->UnPublishDeviceDiscovery(pkgName, publishId); } int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType, const std::string &deviceId, const std::string &extra) { if (!PermissionManager::GetInstance().CheckPermission()) { LOGE("The caller: %s does not have permission to call AuthenticateDevice.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (pkgName.empty() || deviceId.empty()) { LOGE("DeviceManagerService::AuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("AuthenticateDevice failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->AuthenticateDevice(pkgName, authType, deviceId, extra); } int32_t DeviceManagerService::UnAuthenticateDevice(const std::string &pkgName, const std::string &networkId) { if (!PermissionManager::GetInstance().CheckPermission()) { LOGE("The caller: %s does not have permission to call UnAuthenticateDevice.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::UnAuthenticateDevice begin for pkgName = %s, networkId = %s", pkgName.c_str(), GetAnonyString(networkId).c_str()); if (pkgName.empty() || networkId.empty()) { LOGE("DeviceManagerService::UnAuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("UnAuthenticateDevice failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->UnAuthenticateDevice(pkgName, networkId); } int32_t DeviceManagerService::BindDevice(const std::string &pkgName, int32_t authType, const std::string &deviceId, const std::string &bindParam) { if (!PermissionManager::GetInstance().CheckNewPermission()) { LOGI("The caller does not have permission to call BindDevice."); return ERR_DM_NO_PERMISSION; } if (pkgName.empty() || deviceId.empty()) { LOGE("DeviceManagerService::BindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("BindDevice failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } std::string udidHash = listener_->GetUdidHash(deviceId); return dmServiceImpl_->BindDevice(pkgName, authType, udidHash, bindParam); } int32_t DeviceManagerService::UnBindDevice(const std::string &pkgName, const std::string &deviceId) { if (!PermissionManager::GetInstance().CheckNewPermission()) { LOGI("The caller does not have permission to call UnBindDevice."); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::UnBindDevice begin for pkgName = %s, deviceId = %s", pkgName.c_str(), GetAnonyString(deviceId).c_str()); if (pkgName.empty() || deviceId.empty()) { LOGE("DeviceManagerService::UnBindDevice error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("UnBindDevice failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } std::string udidHash = listener_->GetUdidHash(deviceId); listener_->DeleteDeviceIdFromMap(deviceId); return dmServiceImpl_->UnBindDevice(pkgName, udidHash); } int32_t DeviceManagerService::VerifyAuthentication(const std::string &authParam) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call VerifyAuthentication."); return ERR_DM_NO_PERMISSION; } if (authParam.empty()) { LOGE("DeviceManagerService::VerifyAuthentication error: Invalid parameter, authParam: %s", authParam.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("DeviceManagerService::VerifyAuthentication failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->VerifyAuthentication(authParam); } int32_t DeviceManagerService::GetFaParam(std::string &pkgName, DmAuthParam &authParam) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call GetFaParam.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("GetFaParam failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->GetFaParam(pkgName, authParam); } int32_t DeviceManagerService::SetUserOperation(std::string &pkgName, int32_t action, const std::string ¶ms) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call SetUserOperation.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (pkgName.empty() || params.empty()) { LOGE("DeviceManagerService::SetUserOperation error: Invalid parameter, pkgName: %s", pkgName.c_str(), params.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("SetUserOperation failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->SetUserOperation(pkgName, action, params); } int32_t DeviceManagerService::RegisterDevStateCallback(const std::string &pkgName, const std::string &extra) { if (pkgName.empty()) { LOGE("DeviceManagerService::RegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } { std::lock_guard lock(registerDevStateLock_); if (registerDevStateMap_.count(pkgName) == 0) { registerDevStateMap_.insert(std::map::value_type (pkgName, extra)); } } return DM_OK; } int32_t DeviceManagerService::UnRegisterDevStateCallback(const std::string &pkgName, const std::string &extra) { if (pkgName.empty()) { LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } { std::lock_guard lock(registerDevStateLock_); if (registerDevStateMap_.count(pkgName) > 0) { registerDevStateMap_.erase(pkgName); } } if (IsDMServiceImplSoLoaded()) { return dmServiceImpl_->UnRegisterDevStateCallback(pkgName, extra); } return DM_OK; } void DeviceManagerService::HandleDeviceOnline(DmDeviceInfo &info) { if (!IsDMServiceImplReady()) { LOGE("HandleDeviceOnline failed, instance not init or init failed."); return; } { std::lock_guard lock(registerDevStateLock_); for (auto iter : registerDevStateMap_) { dmServiceImpl_->RegisterDevStateCallback(iter.first, iter.second); } } dmServiceImpl_->HandleDeviceOnline(info); } void DeviceManagerService::HandleDeviceOffline(DmDeviceInfo &info) { if (!IsDMServiceImplReady()) { LOGE("HandleDeviceOffline failed, instance not init or init failed."); return; } dmServiceImpl_->HandleDeviceOffline(info); } void DeviceManagerService::HandleDeviceNameChange(DmDeviceInfo &info) { if (!IsDMServiceImplReady()) { LOGE("HandleDeviceNameChange failed, instance not init or init failed."); return; } dmServiceImpl_->HandleDeviceNameChange(info); } int DeviceManagerService::OnSessionOpened(int sessionId, int result) { if (!IsDMServiceImplReady()) { LOGE("OnSessionOpened failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->OnSessionOpened(sessionId, result); } void DeviceManagerService::OnSessionClosed(int sessionId) { if (!IsDMServiceImplReady()) { LOGE("OnSessionClosed failed, instance not init or init failed."); return; } dmServiceImpl_->OnSessionClosed(sessionId); } void DeviceManagerService::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen) { if (!IsDMServiceImplReady()) { LOGE("OnBytesReceived failed, instance not init or init failed."); return; } dmServiceImpl_->OnBytesReceived(sessionId, data, dataLen); } int32_t DeviceManagerService::RequestCredential(const std::string &reqJsonStr, std::string &returnJsonStr) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller does not have permission to call RequestCredential."); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("RequestCredential failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->RequestCredential(reqJsonStr, returnJsonStr); } int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &credentialInfo) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call ImportCredential.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("ImportCredential failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->ImportCredential(pkgName, credentialInfo); } int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &deleteInfo) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call DeleteCredential.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("DeleteCredential failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->DeleteCredential(pkgName, deleteInfo); } int32_t DeviceManagerService::RegisterCredentialCallback(const std::string &pkgName) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call RegisterCredentialCallback.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("RegisterCredentialCallback failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->RegisterCredentialCallback(pkgName); } int32_t DeviceManagerService::UnRegisterCredentialCallback(const std::string &pkgName) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call UnRegisterCredentialCallback.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("UnRegisterCredentialCallback failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->UnRegisterCredentialCallback(pkgName); } int32_t DeviceManagerService::RegisterUiStateCallback(const std::string &pkgName) { if (pkgName.empty()) { LOGE("DeviceManagerService::RegisterUiStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("RegisterUiStateCallback failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->RegisterUiStateCallback(pkgName); } int32_t DeviceManagerService::UnRegisterUiStateCallback(const std::string &pkgName) { if (pkgName.empty()) { LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str()); return ERR_DM_INPUT_PARA_INVALID; } if (!IsDMServiceImplReady()) { LOGE("UnRegisterUiStateCallback failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->UnRegisterUiStateCallback(pkgName); } bool DeviceManagerService::IsDMServiceImplReady() { std::lock_guard lock(isImplLoadLock_); if (isImplsoLoaded_ && (dmServiceImpl_ != nullptr)) { return true; } char path[PATH_MAX + 1] = {0x00}; std::string soName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME); if ((soName.length() == 0) || (soName.length() > PATH_MAX) || (realpath(soName.c_str(), path) == nullptr)) { LOGE("File %s canonicalization failed.", soName.c_str()); return false; } void *so_handle = dlopen(path, RTLD_NOW | RTLD_NOLOAD); if (so_handle == nullptr) { so_handle = dlopen(path, RTLD_NOW); if (so_handle == nullptr) { LOGE("load libdevicemanagerserviceimpl so %s failed.", soName.c_str()); return false; } } dlerror(); auto func = (CreateDMServiceFuncPtr)dlsym(so_handle, "CreateDMServiceObject"); if (dlerror() != nullptr || func == nullptr) { dlclose(so_handle); LOGE("Create object function is not exist."); return false; } dmServiceImpl_ = std::shared_ptr(func()); if (dmServiceImpl_->Initialize(listener_) != DM_OK) { dlclose(so_handle); dmServiceImpl_ = nullptr; isImplsoLoaded_ = false; return false; } isImplsoLoaded_ = true; return true; } bool DeviceManagerService::IsDMServiceImplSoLoaded() { std::lock_guard lock(isImplLoadLock_); return isImplsoLoaded_; } int32_t DeviceManagerService::DmHiDumper(const std::vector& args, std::string &result) { LOGI("HiDump GetTrustedDeviceList"); std::vector dumpflag; HiDumpHelper::GetInstance().GetArgsType(args, dumpflag); for (unsigned int i = 0; i < dumpflag.size(); i++) { if (dumpflag[i] == HidumperFlag::HIDUMPER_GET_TRUSTED_LIST) { std::vector deviceList; int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList); if (ret != DM_OK) { result.append("HiDumpHelper GetTrustedDeviceList failed"); LOGE("HiDumpHelper GetTrustedDeviceList failed"); return ERR_DM_FAILED; } for (unsigned int j = 0; j < deviceList.size(); j++) { HiDumpHelper::GetInstance().SetNodeInfo(deviceList[j]); LOGI("DeviceManagerService::DmHiDumper SetNodeInfo."); } } } HiDumpHelper::GetInstance().HiDump(args, result); return DM_OK; } int32_t DeviceManagerService::NotifyEvent(const std::string &pkgName, const int32_t eventId, const std::string &event) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call NotifyEvent.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } if (!IsDMServiceImplReady()) { LOGE("NotifyEvent failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->NotifyEvent(pkgName, eventId, event); } void DeviceManagerService::LoadHardwareFwkService() { std::string extra; std::vector deviceList; int32_t ret = GetTrustedDeviceList(DM_PKG_NAME, extra, deviceList); if (ret != DM_OK) { LOGE("LoadHardwareFwkService failed, get trusted devicelist failed."); return; } if (deviceList.size() > 0) { dmServiceImpl_->LoadHardwareFwkService(); } } int32_t DeviceManagerService::GetEncryptedUuidByNetworkId(const std::string &pkgName, const std::string &networkId, std::string &uuid) { if (!IsDMServiceImplReady()) { LOGE("GetEncryptedUuidByNetworkId failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->GetEncryptedUuidByNetworkId(pkgName, networkId, uuid); } int32_t DeviceManagerService::GenerateEncryptedUuid(const std::string &pkgName, const std::string &uuid, const std::string &appId, std::string &encryptedUuid) { if (!IsDMServiceImplReady()) { LOGE("GenerateEncryptedUuid failed, instance not init or init failed."); return ERR_DM_NOT_INIT; } return dmServiceImpl_->GenerateEncryptedUuid(pkgName, uuid, appId, encryptedUuid); } int32_t DeviceManagerService::CheckApiPermission() { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller does not have permission to call"); return ERR_DM_NO_PERMISSION; } return DM_OK; } int32_t DeviceManagerService::CheckNewApiPermission() { if (!PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller does not have permission to call"); return ERR_DM_NO_PERMISSION; } return DM_OK; } int32_t DeviceManagerService::GetNetworkTypeByNetworkId(const std::string &pkgName, const std::string &netWorkId, int32_t &networkType) { if (!PermissionManager::GetInstance().CheckPermission() && !PermissionManager::GetInstance().CheckNewPermission()) { LOGE("The caller: %s does not have permission to call GetNetworkTypeByNetworkId.", pkgName.c_str()); return ERR_DM_NO_PERMISSION; } LOGI("DeviceManagerService::GetNetworkTypeByNetworkId begin for pkgName = %s", pkgName.c_str()); if (pkgName.empty() || netWorkId.empty()) { LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str()); return ERR_DM_INPUT_PARA_INVALID; } SoftbusListener::GetNetworkTypeByNetworkId(netWorkId.c_str(), networkType); return DM_OK; } } // namespace DistributedHardware } // namespace OHOS