• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 "softbus_connector.h"
17 
18 #include <algorithm>
19 #include <securec.h>
20 #include <unistd.h>
21 
22 #include "dm_anonymous.h"
23 #include "dm_constants.h"
24 #include "dm_crypto.h"
25 #include "dm_device_info.h"
26 #include "dm_log.h"
27 #include "dm_radar_helper.h"
28 #include "dm_softbus_cache.h"
29 #include "json_object.h"
30 #include "parameter.h"
31 #include "system_ability_definition.h"
32 
33 namespace OHOS {
34 namespace DistributedHardware {
35 const int32_t SOFTBUS_SUBSCRIBE_ID_MASK = 0x0000FFFF;
36 const int32_t SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE = 100;
37 const int32_t SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE = 100;
38 
39 constexpr const char* WIFI_IP = "WIFI_IP";
40 constexpr const char* WIFI_PORT = "WIFI_PORT";
41 constexpr const char* BR_MAC = "BR_MAC";
42 constexpr const char* BLE_MAC = "BLE_MAC";
43 constexpr const char* ETH_IP = "ETH_IP";
44 constexpr const char* ETH_PORT = "ETH_PORT";
45 constexpr const char* NCM_IP = "NCM_IP";
46 constexpr const char* NCM_PORT = "NCM_PORT";
47 
48 namespace {
49     const char* TAG_ACL = "accessControlTable";
50     const char* TAG_DMVERSION = "dmVersion";
51 }
52 
53 std::string SoftbusConnector::remoteUdidHash_ = "";
54 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusConnector::discoveryDeviceInfoMap_ = {};
55 std::unordered_map<std::string, std::string> SoftbusConnector::deviceUdidMap_ = {};
56 std::vector<ProcessInfo> SoftbusConnector::processInfoVec_ = {};
57 std::vector<ProcessInfo> SoftbusConnector::processChangeInfoVec_ = {};
58 std::mutex SoftbusConnector::discoveryDeviceInfoMutex_;
59 std::mutex SoftbusConnector::deviceUdidLocks_;
60 std::mutex SoftbusConnector::processInfoVecMutex_;
61 std::mutex SoftbusConnector::processChangeInfoVecMutex_;
62 std::shared_ptr<ISoftbusConnectorCallback> SoftbusConnector::connectorCallback_ = nullptr;
63 
SoftbusConnector()64 SoftbusConnector::SoftbusConnector()
65 {
66 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
67     softbusSession_ = std::make_shared<SoftbusSession>();
68     hiChainAuthConnector_ = std::make_shared<HiChainAuthConnector>();
69 #endif
70     LOGD("SoftbusConnector constructor.");
71 }
72 
~SoftbusConnector()73 SoftbusConnector::~SoftbusConnector()
74 {
75     LOGD("SoftbusConnector destructor.");
76 }
77 
SyncAclList(int32_t userId,std::string credId,int32_t sessionKeyId,int32_t aclId)78 void SoftbusConnector::SyncAclList(int32_t userId, std::string credId,
79     int32_t sessionKeyId, int32_t aclId)
80 {
81     LOGI("userId:%{public}d, credId:%{public}s, sessionKeyId:%{public}d, aclId:%{public}d",
82         userId, credId.c_str(), sessionKeyId, aclId);
83 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
84     // 根据skid删除sk,删除skid
85     int32_t ret = DeviceProfileConnector::GetInstance().DeleteSessionKey(userId, sessionKeyId);
86     if (ret != DM_OK) {
87         LOGE("SyncAclList DeleteSessionKey failed.");
88     }
89     if (hiChainAuthConnector_ != nullptr) {
90         // 根据凭据id 删除sink端多余的凭据
91         ret = hiChainAuthConnector_->DeleteCredential(userId, credId);
92         if (ret != DM_OK) {
93             LOGE("SyncAclList DeleteCredential failed.");
94         }
95     }
96     // 删除本条acl
97     DeviceProfileConnector::GetInstance().DeleteAccessControlById(aclId);
98 #endif
99 }
100 
101 
102 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
SyncLocalAclList5_1_0(const std::string localUdid,const std::string remoteUdid,DistributedDeviceProfile::AccessControlProfile & localAcl,std::vector<std::string> & acLStrList)103 int32_t SoftbusConnector::SyncLocalAclList5_1_0(const std::string localUdid, const std::string remoteUdid,
104     DistributedDeviceProfile::AccessControlProfile &localAcl, std::vector<std::string> &acLStrList)
105 {
106     bool res = DeviceProfileConnector::GetInstance().ChecksumAcl(localAcl, acLStrList);
107     if (res) {
108         return DM_OK;
109     }
110     if (localAcl.GetAccesser().GetAccesserDeviceId() == localUdid &&
111         localAcl.GetAccessee().GetAccesseeDeviceId() == remoteUdid) {
112         LOGI("SyncLocalAclListProcess Src.");
113         SyncAclList(localAcl.GetAccesser().GetAccesserUserId(),
114             localAcl.GetAccesser().GetAccesserCredentialIdStr(),
115             localAcl.GetAccesser().GetAccesserSessionKeyId(), localAcl.GetAccessControlId());
116     }
117     if (localAcl.GetAccesser().GetAccesserDeviceId() == remoteUdid &&
118         localAcl.GetAccessee().GetAccesseeDeviceId() == localUdid) {
119         LOGI("SyncLocalAclListProcess Sink.");
120         SyncAclList(localAcl.GetAccessee().GetAccesseeUserId(),
121             localAcl.GetAccessee().GetAccesseeCredentialIdStr(),
122             localAcl.GetAccessee().GetAccesseeSessionKeyId(), localAcl.GetAccessControlId());
123     }
124     return DM_OK;
125 }
126 
ParaseAclChecksumList(const std::string & jsonString,std::vector<AclHashItem> & remoteAllAclList)127 int32_t SoftbusConnector::ParaseAclChecksumList(const std::string &jsonString,
128     std::vector<AclHashItem> &remoteAllAclList)
129 {
130     JsonObject aclChecksumjson(JsonCreateType::JSON_CREATE_TYPE_ARRAY);
131     aclChecksumjson.Parse(jsonString);
132     if (aclChecksumjson.IsDiscarded()) {
133         LOGE("ParseSyncMessage aclChecksumjson error");
134         return ERR_DM_FAILED;
135     }
136     DeviceProfileConnector::GetInstance().AclHashVecFromJson(aclChecksumjson, remoteAllAclList);
137     return DM_OK;
138 }
139 
GetLocalVersion(const std::string localUdid,const std::string remoteUdid,std::string & localVersion,DistributedDeviceProfile::AccessControlProfile & localAcl)140 int32_t SoftbusConnector::GetLocalVersion(const std::string localUdid, const std::string remoteUdid,
141     std::string &localVersion, DistributedDeviceProfile::AccessControlProfile &localAcl)
142 {
143     int32_t ret = ERR_DM_FAILED;
144     if (localAcl.GetAccesser().GetAccesserDeviceId() == localUdid &&
145         localAcl.GetAccessee().GetAccesseeDeviceId() == remoteUdid) {
146         std::string extraInfo = localAcl.GetAccesser().GetAccesserExtraData();
147         ret = DeviceProfileConnector::GetInstance().GetVersionByExtra(extraInfo, localVersion);
148     } else if (localAcl.GetAccesser().GetAccesserDeviceId() == remoteUdid &&
149         localAcl.GetAccessee().GetAccesseeDeviceId() == localUdid) {
150             std::string extraInfo = localAcl.GetAccessee().GetAccesseeExtraData();
151         ret = DeviceProfileConnector::GetInstance().GetVersionByExtra(extraInfo, localVersion);
152     }
153     return DM_OK;
154 }
155 #endif
156 
157 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
SortAclListDesc(const std::vector<AclHashItem> & remoteAllAclList,std::vector<std::string> & aclVerDesc,std::map<std::string,AclHashItem> & remoteAllAclMap)158 void SoftbusConnector::SortAclListDesc(const std::vector<AclHashItem> &remoteAllAclList,
159     std::vector<std::string> &aclVerDesc, std::map<std::string, AclHashItem> &remoteAllAclMap)
160 {
161     aclVerDesc.clear();
162     remoteAllAclMap.clear();
163     for (const auto &item : remoteAllAclList) {
164         aclVerDesc.push_back(item.version);
165         remoteAllAclMap[item.version] = item;
166     }
167 
168     std::sort(aclVerDesc.begin(), aclVerDesc.end(), [](const std::string &a, const std::string &b) {
169         return CompareVersion(a, b);
170     });
171 }
172 
MatchTargetVersion(const std::string & localVersion,const std::vector<std::string> & remoteVerDesc)173 std::string SoftbusConnector::MatchTargetVersion(const std::string &localVersion,
174     const std::vector<std::string> &remoteVerDesc)
175 {
176     if (remoteVerDesc.empty()) {
177         return localVersion;
178     }
179 
180     // if local version bigger than remote max version, use remote max version to process acl aging.
181     if (CompareVersion(localVersion, remoteVerDesc[0])) {
182         return remoteVerDesc[0];
183     }
184 
185     // if local version equal or smaller than remote max version, use local version to process acl aging.
186     return localVersion;
187 }
188 #endif
189 
SyncLocalAclListProcess(const DevUserInfo & localDevUserInfo,const DevUserInfo & remoteDevUserInfo,std::string remoteAclList)190 int32_t SoftbusConnector::SyncLocalAclListProcess(const DevUserInfo &localDevUserInfo,
191     const DevUserInfo &remoteDevUserInfo, std::string remoteAclList)
192 {
193 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
194     std::vector<AclHashItem> remoteAllAclList;
195     int32_t ret = ParaseAclChecksumList(remoteAclList, remoteAllAclList);
196     if (ret != DM_OK) {
197         LOGE("SyncLocalAclListProcess TAG_ACL error");
198         return ret;
199     }
200 
201     std::vector<std::string> aclVerDesc;
202     std::map<std::string, AclHashItem> remoteAllAclMap;
203     SortAclListDesc(remoteAllAclList, aclVerDesc, remoteAllAclMap);
204     std::string matchVersion = MatchTargetVersion(DM_ACL_AGING_VERSION, aclVerDesc);
205 
206     std::vector<std::string> remoteAclHashList = {};
207     if (remoteAllAclMap.find(matchVersion) != remoteAllAclMap.end()) {
208         remoteAclHashList = remoteAllAclMap[matchVersion].aclHashList;
209     }
210     std::vector<DistributedDeviceProfile::AccessControlProfile> localAclList =
211         DeviceProfileConnector::GetInstance().GetAclList(localDevUserInfo.deviceId, localDevUserInfo.userId,
212             remoteDevUserInfo.deviceId, remoteDevUserInfo.userId);
213 
214     for (auto &localAcl : localAclList) {
215         int32_t versionNum = 0;
216         if (!GetVersionNumber(matchVersion, versionNum)) {
217             LOGE("SyncLocalAclList GetVersionNumber error");
218             continue;
219         }
220         switch (versionNum) {
221             case DM_VERSION_INT_5_1_0:
222                 ret = SyncLocalAclList5_1_0(localDevUserInfo.deviceId, remoteDevUserInfo.deviceId, localAcl,
223                     remoteAclHashList);
224                 break;
225             default:
226                 LOGE("versionNum is invaild, ver: %{public}d", versionNum);
227                 break;
228         }
229     }
230     return DM_OK;
231 #else
232     (void)localDevUserInfo;
233     (void)remoteDevUserInfo;
234     (void)remoteAclList;
235     return DM_OK;
236 #endif
237 }
238 
GetAclListHash(const DevUserInfo & localDevUserInfo,const DevUserInfo & remoteDevUserInfo,std::string & aclList)239 int32_t SoftbusConnector::GetAclListHash(const DevUserInfo &localDevUserInfo,
240     const DevUserInfo &remoteDevUserInfo, std::string &aclList)
241 {
242 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
243     return DeviceProfileConnector::GetInstance().GetAclListHashStr(localDevUserInfo, remoteDevUserInfo, aclList);
244 #else
245     (void)localDevUserInfo;
246     (void)remoteDevUserInfo;
247     (void)aclList;
248     return DM_OK;
249 #endif
250 }
251 
RegisterConnectorCallback(std::shared_ptr<ISoftbusConnectorCallback> callback)252 int32_t SoftbusConnector::RegisterConnectorCallback(std::shared_ptr<ISoftbusConnectorCallback> callback)
253 {
254     connectorCallback_ = callback;
255     return DM_OK;
256 }
257 
UnRegisterConnectorCallback()258 int32_t SoftbusConnector::UnRegisterConnectorCallback()
259 {
260     connectorCallback_ = nullptr;
261     return DM_OK;
262 }
263 
RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)264 int32_t SoftbusConnector::RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)
265 {
266     deviceStateManagerCallback_ = callback;
267     return DM_OK;
268 }
269 
UnRegisterSoftbusStateCallback()270 int32_t SoftbusConnector::UnRegisterSoftbusStateCallback()
271 {
272     deviceStateManagerCallback_ = nullptr;
273     return DM_OK;
274 }
275 
JoinLnn(const std::string & deviceId,bool isForceJoin)276 void SoftbusConnector::JoinLnn(const std::string &deviceId, bool isForceJoin)
277 {
278     std::string connectAddr;
279     LOGI("start, deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
280     auto addrInfo = GetConnectAddr(deviceId, connectAddr);
281     if (addrInfo == nullptr) {
282         LOGE("addrInfo is nullptr.");
283         return;
284     }
285     if (addrInfo->type == ConnectionAddrType::CONNECTION_ADDR_BLE &&
286         Crypto::ConvertHexStringToBytes(addrInfo->info.ble.udidHash, UDID_HASH_LEN,
287         remoteUdidHash_.c_str(), remoteUdidHash_.length()) != DM_OK) {
288         LOGE("convert remoteUdid hash failed, remoteUdidHash_: %{public}s.", GetAnonyString(remoteUdidHash_).c_str());
289         return;
290     }
291     int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo.get(), OnSoftbusJoinLNNResult, isForceJoin);
292     if (ret != DM_OK) {
293         LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
294     }
295     return;
296 }
297 
JoinLnn(const std::string & deviceId,const std::string & remoteUdidHash)298 void SoftbusConnector::JoinLnn(const std::string &deviceId, const std::string &remoteUdidHash)
299 {
300     std::string connectAddr;
301     LOGI("start, deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
302     auto addrInfo = GetConnectAddr(deviceId, connectAddr);
303     if (addrInfo == nullptr) {
304         LOGE("addrInfo is nullptr.");
305         return;
306     }
307     if (addrInfo->type == ConnectionAddrType::CONNECTION_ADDR_BLE &&
308         Crypto::ConvertHexStringToBytes(addrInfo->info.ble.udidHash, UDID_HASH_LEN,
309         remoteUdidHash.c_str(), remoteUdidHash.length()) != DM_OK) {
310         LOGE("convert remoteUdid hash failed, remoteUdidHash_: %{public}s.", GetAnonyString(remoteUdidHash).c_str());
311         return;
312     }
313     int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo.get(), OnSoftbusJoinLNNResult, false);
314     if (ret != DM_OK) {
315         LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
316     }
317     return;
318 }
319 
JoinLNNBySkId(int32_t sessionId,int32_t sessionKeyId,int32_t remoteSessionKeyId,std::string udid,std::string udidHash,bool isForceJoin)320 void SoftbusConnector::JoinLNNBySkId(int32_t sessionId, int32_t sessionKeyId, int32_t remoteSessionKeyId,
321     std::string udid, std::string udidHash, bool isForceJoin)
322 {
323     LOGI("start, JoinLNNBySkId sessionId: %{public}d, udid: %{public}s.", sessionId, GetAnonyString(udid).c_str());
324     std::string connectAddr;
325     auto addrInfo = GetConnectAddr(udid, connectAddr);
326     if (addrInfo == nullptr) {
327         LOGE("addrInfo is nullptr.");
328         return;
329     }
330     LOGI("addrInfo->type: %{public}d", addrInfo->type);
331     if (addrInfo->type == CONNECTION_ADDR_BLE) {
332         if (Crypto::ConvertHexStringToBytes(addrInfo->info.ble.udidHash, UDID_HASH_LEN, udidHash.c_str(),
333                                             udidHash.length()) != DM_OK) {
334             LOGE("convert remoteUdid hash failed, udidHash: %{public}s.", GetAnonyString(udidHash).c_str());
335             return;
336         }
337     }
338 
339     if (sessionKeyId > 0 && remoteSessionKeyId > 0) {
340         addrInfo->deviceKeyId.hasDeviceKeyId = true;  // 总线修改后适配
341         addrInfo->deviceKeyId.localDeviceKeyId = sessionKeyId; // 总线修改后适配
342         addrInfo->deviceKeyId.remoteDeviceKeyId = remoteSessionKeyId; // 总线修改后适配
343         LOGI("sessionKeyId valid");
344     } else {
345         addrInfo->deviceKeyId.hasDeviceKeyId = false;  // 总线修改后适配
346         addrInfo->deviceKeyId.localDeviceKeyId = 0; // 总线修改后适配
347         addrInfo->deviceKeyId.remoteDeviceKeyId = 0; // 总线修改后适配
348     }
349     int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo.get(), OnSoftbusJoinLNNResult, isForceJoin);
350     if (ret != DM_OK) {
351         LOGE("[SOFTBUS]JoinLNNBySkId failed, ret: %{public}d.", ret);
352     }
353 }
354 
JoinLnnByHml(int32_t sessionId,int32_t sessionKeyId,int32_t remoteSessionKeyId,bool isForceJoin)355 void SoftbusConnector::JoinLnnByHml(int32_t sessionId, int32_t sessionKeyId, int32_t remoteSessionKeyId,
356     bool isForceJoin)
357 {
358     LOGI("start, JoinLnnByHml sessionId: %{public}d.", sessionId);
359     ConnectionAddr addrInfo;
360     addrInfo.type = CONNECTION_ADDR_SESSION_WITH_KEY;
361     addrInfo.info.session.sessionId = sessionId;
362     addrInfo.deviceKeyId.hasDeviceKeyId = true;
363     if (sessionKeyId > 0 && remoteSessionKeyId > 0) {
364         addrInfo.deviceKeyId.localDeviceKeyId = sessionKeyId;
365         addrInfo.deviceKeyId.remoteDeviceKeyId = remoteSessionKeyId;
366         LOGI("sessionKeyId valid");
367     } else {
368         addrInfo.deviceKeyId.localDeviceKeyId = 0;
369         addrInfo.deviceKeyId.remoteDeviceKeyId = 0;
370     }
371     int32_t ret = ::JoinLNN(DM_PKG_NAME, &addrInfo, OnSoftbusJoinLNNResult, isForceJoin);
372     if (ret != DM_OK) {
373         LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
374     }
375 }
376 
GetUdidByNetworkId(const char * networkId,std::string & udid)377 int32_t SoftbusConnector::GetUdidByNetworkId(const char *networkId, std::string &udid)
378 {
379     LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
380     return SoftbusCache::GetInstance().GetUdidFromCache(networkId, udid);
381 }
382 
GetUuidByNetworkId(const char * networkId,std::string & uuid)383 int32_t SoftbusConnector::GetUuidByNetworkId(const char *networkId, std::string &uuid)
384 {
385     LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
386     return SoftbusCache::GetInstance().GetUuidFromCache(networkId, uuid);
387 }
388 
389 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
GetSoftbusSession()390 std::shared_ptr<SoftbusSession> SoftbusConnector::GetSoftbusSession()
391 {
392     return softbusSession_;
393 }
394 #endif
395 
HaveDeviceInMap(std::string deviceId)396 bool SoftbusConnector::HaveDeviceInMap(std::string deviceId)
397 {
398     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
399     auto iter = discoveryDeviceInfoMap_.find(deviceId);
400     if (iter == discoveryDeviceInfoMap_.end()) {
401         LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
402         return false;
403     }
404     return true;
405 }
406 
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)407 ConnectionAddr *SoftbusConnector::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
408 {
409     if (deviceInfo == nullptr) {
410         return nullptr;
411     }
412     for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
413         if (deviceInfo->addr[i].type == type) {
414             return &deviceInfo->addr[i];
415         }
416     }
417     return nullptr;
418 }
419 
GetDeviceInfoFromMap(const std::string & deviceId)420 std::shared_ptr<DeviceInfo> SoftbusConnector::GetDeviceInfoFromMap(const std::string &deviceId)
421 {
422     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
423     auto iter = discoveryDeviceInfoMap_.find(deviceId);
424     if (iter == discoveryDeviceInfoMap_.end()) {
425         LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
426         return nullptr;
427     }
428     return iter->second;
429 }
430 
SetAddrAndJson(const ConnectionAddr * addr,JsonObject & jsonPara,std::string & connectAddr)431 std::shared_ptr<ConnectionAddr> SoftbusConnector::SetAddrAndJson(const ConnectionAddr *addr,
432     JsonObject &jsonPara, std::string &connectAddr)
433 {
434     if (addr == nullptr) {
435         LOGE("Param  not valid, addr is null.");
436         return nullptr;
437     }
438     std::shared_ptr<ConnectionAddr> connectAddrPtr = std::make_shared<ConnectionAddr>();
439     *connectAddrPtr = *addr;
440     connectAddr = jsonPara.Dump();
441     return connectAddrPtr;
442 }
443 
GetConnectAddr(const std::string & deviceId,std::string & connectAddr)444 std::shared_ptr<ConnectionAddr> SoftbusConnector::GetConnectAddr(const std::string &deviceId, std::string &connectAddr)
445 {
446     std::shared_ptr<DeviceInfo> deviceInfo = GetDeviceInfoFromMap(deviceId);
447     if (deviceInfo == nullptr || deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
448         LOGE("deviceInfo addrNum not valid, addrNum: %{public}d.", (deviceInfo != nullptr) ? deviceInfo->addrNum : 0);
449         return nullptr;
450     }
451     JsonObject jsonPara;
452     ConnectionAddr *addr = GetConnectAddrByType(deviceInfo.get(), ConnectionAddrType::CONNECTION_ADDR_ETH);
453     if (addr != nullptr) {
454         LOGI("[SOFTBUS]get ETH ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
455         jsonPara[ETH_IP] = addr->info.ip.ip;
456         jsonPara[ETH_PORT] = addr->info.ip.port;
457         return SetAddrAndJson(addr, jsonPara, connectAddr);
458     }
459     addr = GetConnectAddrByType(deviceInfo.get(), ConnectionAddrType::CONNECTION_ADDR_WLAN);
460     if (addr != nullptr) {
461         jsonPara[WIFI_IP] = addr->info.ip.ip;
462         jsonPara[WIFI_PORT] = addr->info.ip.port;
463         LOGI("[SOFTBUS]get WLAN ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
464         return SetAddrAndJson(addr, jsonPara, connectAddr);
465     }
466     addr = GetConnectAddrByType(deviceInfo.get(), ConnectionAddrType::CONNECTION_ADDR_BR);
467     if (addr != nullptr) {
468         jsonPara[BR_MAC] = addr->info.br.brMac;
469         LOGI("[SOFTBUS]get BR ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
470         return SetAddrAndJson(addr, jsonPara, connectAddr);
471     }
472     addr = GetConnectAddrByType(deviceInfo.get(), ConnectionAddrType::CONNECTION_ADDR_BLE);
473     if (addr != nullptr) {
474         jsonPara[BLE_MAC] = addr->info.ble.bleMac;
475         addr->info.ble.priority = BLE_PRIORITY_HIGH;
476         return SetAddrAndJson(addr, jsonPara, connectAddr);
477     }
478     addr = GetConnectAddrByType(deviceInfo.get(), ConnectionAddrType::CONNECTION_ADDR_NCM);
479     if (addr != nullptr) {
480         LOGI("[SOFTBUS]get NCM ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
481         jsonPara[NCM_IP] = addr->info.ip.ip;
482         jsonPara[NCM_PORT] = addr->info.ip.port;
483         return SetAddrAndJson(addr, jsonPara, connectAddr);
484     }
485     LOGE("[SOFTBUS]failed to get ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
486     return nullptr;
487 }
488 
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceInfo & dmDeviceInfo)489 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceInfo &dmDeviceInfo)
490 {
491     if (memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo)) != EOK) {
492         LOGE("ConvertDeviceInfoToDmDevice memset_s failed.");
493         return;
494     }
495 
496     if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
497                  std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != EOK) {
498         LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
499         return;
500     }
501 
502     if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
503                  std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != EOK) {
504         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
505         return;
506     }
507 
508     dmDeviceInfo.deviceTypeId = deviceInfo.devType;
509     dmDeviceInfo.range = deviceInfo.range;
510 }
511 
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceBasicInfo & dmDeviceBasicInfo)512 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceBasicInfo &dmDeviceBasicInfo)
513 {
514     if (memset_s(&dmDeviceBasicInfo, sizeof(DmDeviceBasicInfo), 0, sizeof(DmDeviceBasicInfo)) != EOK) {
515         LOGE("ConvertDeviceInfoToDmDevice memset_s failed.");
516         return;
517     }
518 
519     if (memcpy_s(dmDeviceBasicInfo.deviceId, sizeof(dmDeviceBasicInfo.deviceId), deviceInfo.devId,
520                  std::min(sizeof(dmDeviceBasicInfo.deviceId), sizeof(deviceInfo.devId))) != EOK) {
521         LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
522         return;
523     }
524 
525     if (memcpy_s(dmDeviceBasicInfo.deviceName, sizeof(dmDeviceBasicInfo.deviceName), deviceInfo.devName,
526                  std::min(sizeof(dmDeviceBasicInfo.deviceName), sizeof(deviceInfo.devName))) != EOK) {
527         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
528         return;
529     }
530 
531     dmDeviceBasicInfo.deviceTypeId = deviceInfo.devType;
532 }
533 
OnSoftbusJoinLNNResult(ConnectionAddr * addr,const char * networkId,int32_t result)534 void SoftbusConnector::OnSoftbusJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t result)
535 {
536     (void)networkId;
537     LOGI("[SOFTBUS]OnSoftbusJoinLNNResult, result: %{public}d.", result);
538 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
539     if (addr == nullptr) {
540         LOGE("addr is null.");
541         return;
542     }
543     if (addr->type != CONNECTION_ADDR_SESSION_WITH_KEY) {
544         LOGI("addr type is not session.");
545         return;
546     }
547     int32_t sessionId = addr->info.session.sessionId;
548     CHECK_NULL_VOID(connectorCallback_);
549     connectorCallback_->OnSoftbusJoinLNNResult(sessionId, networkId, result);
550 #else
551     (void)addr;
552     (void)networkId;
553     (void)result;
554 #endif
555 }
556 
GetDeviceUdidByUdidHash(const std::string & udidHash)557 std::string SoftbusConnector::GetDeviceUdidByUdidHash(const std::string &udidHash)
558 {
559     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
560     for (auto &iter : deviceUdidMap_) {
561         if (iter.second == udidHash) {
562             return iter.first;
563         }
564     }
565     LOGE("failed, udidHash: %{public}s", GetAnonyString(udidHash).c_str());
566     return udidHash;
567 }
568 
GetDeviceUdidHashByUdid(const std::string & udid)569 std::string SoftbusConnector::GetDeviceUdidHashByUdid(const std::string &udid)
570 {
571     {
572         std::lock_guard<std::mutex> lock(deviceUdidLocks_);
573         auto iter = deviceUdidMap_.find(udid);
574         if (iter != deviceUdidMap_.end()) {
575             return deviceUdidMap_[udid];
576         }
577     }
578 
579     char udidHash[DM_MAX_DEVICE_ID_LEN] = {0};
580     if (Crypto::GetUdidHash(udid, reinterpret_cast<uint8_t *>(udidHash)) != DM_OK) {
581         LOGE("get udidhash by udid: %{public}s failed.", GetAnonyString(udid).c_str());
582         return "";
583     }
584     LOGI("get udidhash: %{public}s by udid: %{public}s.", GetAnonyString(udidHash).c_str(),
585         GetAnonyString(udid).c_str());
586     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
587     deviceUdidMap_[udid] = udidHash;
588     return udidHash;
589 }
590 
EraseUdidFromMap(const std::string & udid)591 void SoftbusConnector::EraseUdidFromMap(const std::string &udid)
592 {
593     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
594     auto iter = deviceUdidMap_.find(udid);
595     if (iter == deviceUdidMap_.end()) {
596         return;
597     }
598     size_t mapSize = deviceUdidMap_.size();
599     if (mapSize >= SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE) {
600         deviceUdidMap_.erase(udid);
601     }
602 }
603 
GetLocalDeviceName()604 std::string SoftbusConnector::GetLocalDeviceName()
605 {
606     NodeBasicInfo nodeBasicInfo;
607     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
608     if (ret != DM_OK) {
609         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
610         return "";
611     }
612     return nodeBasicInfo.deviceName;
613 }
614 
GetLocalDeviceTypeId()615 int32_t SoftbusConnector::GetLocalDeviceTypeId()
616 {
617     NodeBasicInfo nodeBasicInfo;
618     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
619     if (ret != DM_OK) {
620         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
621         return DmDeviceType::DEVICE_TYPE_UNKNOWN;
622     }
623     return nodeBasicInfo.deviceTypeId;
624 }
625 
GetLocalDeviceNetworkId()626 std::string SoftbusConnector::GetLocalDeviceNetworkId()
627 {
628     NodeBasicInfo nodeBasicInfo;
629     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
630     if (ret != DM_OK) {
631         LOGE("[SOFTBUS]GetLocalDeviceNetworkId failed, ret: %{public}d.", ret);
632         return "";
633     }
634     return nodeBasicInfo.networkId;
635 }
636 
AddMemberToDiscoverMap(const std::string & deviceId,std::shared_ptr<DeviceInfo> deviceInfo)637 int32_t SoftbusConnector::AddMemberToDiscoverMap(const std::string &deviceId, std::shared_ptr<DeviceInfo> deviceInfo)
638 {
639     if (deviceId.empty()) {
640         LOGE("AddMemberToDiscoverMap failed, deviceId is empty.");
641         return ERR_DM_INPUT_PARA_INVALID;
642     }
643     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
644     discoveryDeviceInfoMap_[deviceId] = std::move(deviceInfo);
645     deviceInfo = nullptr;
646     return DM_OK;
647 }
648 
GetNetworkIdByDeviceId(const std::string & deviceId)649 std::string SoftbusConnector::GetNetworkIdByDeviceId(const std::string &deviceId)
650 {
651     LOGI("start");
652     int32_t deviceCount = 0;
653     NodeBasicInfo *nodeInfo = nullptr;
654     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
655         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
656         return "";
657     }
658     for (int32_t i = 0; i < deviceCount; ++i) {
659         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
660         uint8_t mUdid[UDID_BUF_LEN] = {0};
661         if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
662             NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
663             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
664         }
665         if (reinterpret_cast<char *>(mUdid) == deviceId) {
666             FreeNodeInfo(nodeInfo);
667             return static_cast<std::string>(nodeBasicInfo->networkId);
668         }
669     }
670     FreeNodeInfo(nodeInfo);
671     return "";
672 }
673 
SetProcessInfo(ProcessInfo processInfo)674 void SoftbusConnector::SetProcessInfo(ProcessInfo processInfo)
675 {
676     LOGI("start");
677     std::lock_guard<std::mutex> lock(processInfoVecMutex_);
678     processInfoVec_.push_back(processInfo);
679 }
680 
SetProcessInfoVec(std::vector<ProcessInfo> processInfoVec)681 void SoftbusConnector::SetProcessInfoVec(std::vector<ProcessInfo> processInfoVec)
682 {
683     LOGI("start");
684     std::lock_guard<std::mutex> lock(processInfoVecMutex_);
685     processInfoVec_ = processInfoVec;
686 }
687 
GetProcessInfo()688 std::vector<ProcessInfo> SoftbusConnector::GetProcessInfo()
689 {
690     LOGI("start");
691     std::lock_guard<std::mutex> lock(processInfoVecMutex_);
692     return processInfoVec_;
693 }
694 
ClearProcessInfo()695 void SoftbusConnector::ClearProcessInfo()
696 {
697     LOGI("start");
698     std::lock_guard<std::mutex> lock(processInfoVecMutex_);
699     processInfoVec_.clear();
700 }
701 
SetChangeProcessInfo(ProcessInfo processInfo)702 void SoftbusConnector::SetChangeProcessInfo(ProcessInfo processInfo)
703 {
704     LOGI("start");
705     std::lock_guard<std::mutex> lock(processChangeInfoVecMutex_);
706     processChangeInfoVec_.push_back(processInfo);
707 }
708 
GetChangeProcessInfo()709 std::vector<ProcessInfo> SoftbusConnector::GetChangeProcessInfo()
710 {
711     LOGI("start");
712     std::lock_guard<std::mutex> lock(processChangeInfoVecMutex_);
713     return processChangeInfoVec_;
714 }
715 
ClearChangeProcessInfo()716 void SoftbusConnector::ClearChangeProcessInfo()
717 {
718     LOGI("start");
719     std::lock_guard<std::mutex> lock(processChangeInfoVecMutex_);
720     processChangeInfoVec_.clear();
721 }
722 
HandleDeviceOnline(std::string deviceId,int32_t authForm)723 void SoftbusConnector::HandleDeviceOnline(std::string deviceId, int32_t authForm)
724 {
725     LOGI("start");
726     deviceStateManagerCallback_->OnDeviceOnline(deviceId, authForm);
727     return;
728 }
729 
HandleDeviceOffline(std::string deviceId)730 void SoftbusConnector::HandleDeviceOffline(std::string deviceId)
731 {
732     LOGI("start");
733     deviceStateManagerCallback_->OnDeviceOffline(deviceId);
734     return;
735 }
736 
DeleteOffLineTimer(std::string & udidHash)737 void SoftbusConnector::DeleteOffLineTimer(std::string &udidHash)
738 {
739     LOGI("start");
740     remoteUdidHash_ = udidHash;
741     if (deviceStateManagerCallback_ != nullptr) {
742         deviceStateManagerCallback_->DeleteOffLineTimer(udidHash);
743     }
744 }
745 
CheckIsNeedJoinLnn(const std::string & udid,const std::string & deviceId)746 bool SoftbusConnector::CheckIsNeedJoinLnn(const std::string &udid, const std::string &deviceId)
747 {
748     if (udid.empty() || deviceId.empty()) {
749         return false;
750     }
751     std::string connectAddr;
752     auto addrInfo = GetConnectAddr(deviceId, connectAddr);
753     if (addrInfo == nullptr) {
754         LOGE("addrInfo is nullptr.");
755         return false;
756     }
757     std::string networkId = "";
758     SoftbusCache::GetInstance().GetNetworkIdFromCache(udid, networkId);
759     if (networkId.empty()) {
760         LOGI("networkId is empty: %{public}s", GetAnonyString(udid).c_str());
761         return true;
762     }
763     int32_t networkType = -1;
764     int32_t ret = GetNodeKeyInfo(DM_PKG_NAME, networkId.c_str(), NodeDeviceInfoKey::NODE_KEY_NETWORK_TYPE,
765         reinterpret_cast<uint8_t *>(&networkType), LNN_COMMON_LEN);
766     if (ret != DM_OK || networkType < 0) {
767         LOGE("[SOFTBUS]GetNodeKeyInfo networkType failed, ret:%{public}d.", ret);
768         return false;
769     }
770     uint32_t addrTypeMask = 0;
771     switch (addrInfo->type) {
772         case CONNECTION_ADDR_WLAN:
773             addrTypeMask = 1 << NetworkType::BIT_NETWORK_TYPE_WIFI;
774             break;
775         case CONNECTION_ADDR_BR:
776             addrTypeMask = 1 << NetworkType::BIT_NETWORK_TYPE_BR;
777             break;
778         case CONNECTION_ADDR_BLE:
779             addrTypeMask = 1 << NetworkType::BIT_NETWORK_TYPE_BLE;
780             break;
781         case CONNECTION_ADDR_NCM:
782             addrTypeMask = 1 << NetworkType::BIT_NETWORK_TYPE_USB;
783             break;
784         default:
785             LOGE("Unknown addr type.");
786             return false;
787     }
788     LOGI("GetNetworkTypeByNetworkId networkType %{public}d, addrTypeMask %{public}d.", networkType, addrTypeMask);
789     if ((static_cast<uint32_t>(networkType) & addrTypeMask) != 0x0) {
790         return false;
791     }
792     return true;
793 }
794 
795 // isHash:传入的deviceId是否为哈希值
CheckIsOnline(const std::string & targetDeviceIdHash,bool isHash)796 bool SoftbusConnector::CheckIsOnline(const std::string &targetDeviceIdHash, bool isHash)
797 {
798     LOGI("start.");
799     int32_t deviceCount = 0;
800     NodeBasicInfo *nodeInfo = nullptr;
801     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
802         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
803         return false;
804     }
805     for (int32_t i = 0; i < deviceCount; ++i) {
806         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
807         uint8_t mUdid[UDID_BUF_LEN] = {0};
808         if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
809             NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
810             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
811         }
812         std::string udid = reinterpret_cast<char *>(mUdid);
813         if ((isHash == false && udid == targetDeviceIdHash) ||
814             (isHash == true && Crypto::Sha256(udid).find(targetDeviceIdHash) == 0)) {
815             LOGI("The device is online.");
816             FreeNodeInfo(nodeInfo);
817             return true;
818         }
819     }
820     LOGI("The device is not online.");
821     FreeNodeInfo(nodeInfo);
822     return false;
823 }
824 
CheckIsOnline(const std::string & targetDeviceId)825 bool SoftbusConnector::CheckIsOnline(const std::string &targetDeviceId)
826 {
827     return CheckIsOnline(targetDeviceId, false);
828 }
829 
GetDeviceInfoByDeviceId(const std::string & deviceId)830 DmDeviceInfo SoftbusConnector::GetDeviceInfoByDeviceId(const std::string &deviceId)
831 {
832     LOGI("start");
833     DmDeviceInfo info;
834     int32_t deviceCount = 0;
835     NodeBasicInfo *nodeInfo = nullptr;
836     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
837         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
838         return info;
839     }
840     char deviceIdHash[DM_MAX_DEVICE_ID_LEN] = {0};
841     if (Crypto::GetUdidHash(deviceId, reinterpret_cast<uint8_t *>(deviceIdHash)) != DM_OK) {
842         LOGE("get deviceIdHash by deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
843         FreeNodeInfo(nodeInfo);
844         return info;
845     }
846     for (int32_t i = 0; i < deviceCount; ++i) {
847         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
848         uint8_t mUdid[UDID_BUF_LEN] = {0};
849         if (GetNodeKeyInfo(DM_PKG_NAME, nodeBasicInfo->networkId, NodeDeviceInfoKey::NODE_KEY_UDID,
850             mUdid, sizeof(mUdid)) != DM_OK) {
851             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
852             FreeNodeInfo(nodeInfo);
853             return info;
854         }
855         std::string udid = reinterpret_cast<char *>(mUdid);
856         if (udid != deviceId) {
857             continue;
858         } else {
859             ConvertNodeBasicInfoToDmDevice(*nodeBasicInfo, info);
860             if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, deviceIdHash, DM_MAX_DEVICE_ID_LEN) != 0) {
861                 LOGE("Get deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
862             }
863             break;
864         }
865     }
866     FreeNodeInfo(nodeInfo);
867     return info;
868 }
869 
ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo & nodeBasicInfo,DmDeviceInfo & dmDeviceInfo)870 void SoftbusConnector::ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo &nodeBasicInfo, DmDeviceInfo &dmDeviceInfo)
871 {
872     if (memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo)) != EOK) {
873         LOGE("ConvertNodeBasicInfoToDmDevice memset_s failed.");
874         return;
875     }
876 
877     if (memcpy_s(dmDeviceInfo.networkId, sizeof(dmDeviceInfo.networkId), nodeBasicInfo.networkId,
878                  std::min(sizeof(dmDeviceInfo.networkId), sizeof(nodeBasicInfo.networkId))) != EOK) {
879         LOGE("ConvertNodeBasicInfoToDmDevice copy deviceId data failed.");
880         return;
881     }
882 
883     if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), nodeBasicInfo.deviceName,
884                  std::min(sizeof(dmDeviceInfo.deviceName), sizeof(nodeBasicInfo.deviceName))) != EOK) {
885         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
886         return;
887     }
888 
889     dmDeviceInfo.deviceTypeId = nodeBasicInfo.deviceTypeId;
890     std::string extraData = dmDeviceInfo.extraData;
891     JsonObject extraJson;
892     if (!extraData.empty()) {
893         extraJson.Parse(extraData);
894     }
895     if (!extraJson.IsDiscarded()) {
896         extraJson[PARAM_KEY_OS_TYPE] = nodeBasicInfo.osType;
897         extraJson[PARAM_KEY_OS_VERSION] = std::string(nodeBasicInfo.osVersion);
898         dmDeviceInfo.extraData = ToString(extraJson);
899     }
900 }
901 } // namespace DistributedHardware
902 } // namespace OHOS
903