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