• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "soft_bus_manager.h"
16 
17 #include <securec.h>
18 #include <thread>
19 #include <pthread.h>
20 
21 #include "accesstoken_log.h"
22 #include "config_policy_loader.h"
23 #include "constant.h"
24 #include "constant_common.h"
25 #include "device_info_manager.h"
26 #include "device_manager.h"
27 #include "ipc_skeleton.h"
28 #include "libraryloader.h"
29 #include "remote_command_manager.h"
30 #include "soft_bus_device_connection_listener.h"
31 #include "soft_bus_socket_listener.h"
32 #include "token_setproc.h"
33 
34 namespace OHOS {
35 namespace Security {
36 namespace AccessToken {
37 namespace {
38 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "SoftBusManager"};
39 static constexpr int32_t DEFAULT_SEND_REQUEST_REPEAT_TIMES = 5;
40 }
41 namespace {
42 static const int MAX_PTHREAD_NAME_LEN = 15; // pthread name max length
43 
44 static const std::string TOKEN_SYNC_PACKAGE_NAME = "ohos.security.distributed_access_token";
45 static const std::string TOKEN_SYNC_SOCKET_NAME = "ohos.security.atm_channel.";
46 
47 static const uint32_t SOCKET_NAME_MAX_LEN = 256;
48 static const uint32_t QOS_LEN = 3;
49 static const int32_t MIN_BW = 64 * 1024; // 64k
50 static const int32_t MAX_LATENCY = 10000; // 10s
51 static const int32_t MIN_LATENCY = 2000; // 2s
52 
53 static const int32_t ERROR_TRANSFORM_STRING_TO_CHAR = -1;
54 static const int32_t ERROR_CREATE_SOCKET_FAIL = -2;
55 static const int32_t ERROR_CREATE_LISTENER_FAIL = -3;
56 static const int32_t ERROR_CLIENT_HAS_BIND_ALREADY = -4;
57 
58 static const int32_t BIND_SERVICE_MAX_RETRY_TIMES = 10;
59 static const int32_t BIND_SERVICE_SLEEP_TIMES_MS = 100; // 0.1s
60 std::recursive_mutex g_instanceMutex;
61 } // namespace
62 
SoftBusManager()63 SoftBusManager::SoftBusManager() : isSoftBusServiceBindSuccess_(false), inited_(false), mutex_(), fulfillMutex_()
64 {
65     ACCESSTOKEN_LOG_DEBUG(LABEL, "SoftBusManager()");
66 }
67 
~SoftBusManager()68 SoftBusManager::~SoftBusManager()
69 {
70     ACCESSTOKEN_LOG_DEBUG(LABEL, "~SoftBusManager()");
71 }
72 
GetInstance()73 SoftBusManager &SoftBusManager::GetInstance()
74 {
75     static SoftBusManager* instance = nullptr;
76     if (instance == nullptr) {
77         std::lock_guard<std::recursive_mutex> lock(g_instanceMutex);
78         if (instance == nullptr) {
79             instance = new SoftBusManager();
80         }
81     }
82     return *instance;
83 }
84 
AddTrustedDeviceInfo()85 int SoftBusManager::AddTrustedDeviceInfo()
86 {
87     std::string packageName = TOKEN_SYNC_PACKAGE_NAME;
88     std::string extra = "";
89     std::vector<DistributedHardware::DmDeviceInfo> deviceList;
90 
91     int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList(packageName,
92         extra, deviceList);
93     if (ret != Constant::SUCCESS) {
94         ACCESSTOKEN_LOG_ERROR(LABEL, "AddTrustedDeviceInfo: GetTrustedDeviceList error, result: %{public}d", ret);
95         return Constant::FAILURE;
96     }
97 
98     for (const DistributedHardware::DmDeviceInfo& device : deviceList) {
99         std::string uuid;
100         std::string udid;
101         DistributedHardware::DeviceManager::GetInstance().GetUuidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, device.networkId,
102             uuid);
103         DistributedHardware::DeviceManager::GetInstance().GetUdidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, device.networkId,
104             udid);
105         if (uuid.empty() || udid.empty()) {
106             ACCESSTOKEN_LOG_ERROR(LABEL, "Uuid = %{public}s, udid = %{public}s, uuid or udid is empty, abort.",
107                 ConstantCommon::EncryptDevId(uuid).c_str(), ConstantCommon::EncryptDevId(udid).c_str());
108             continue;
109         }
110 
111         DeviceInfoManager::GetInstance().AddDeviceInfo(device.networkId, uuid, udid, device.deviceName,
112             std::to_string(device.deviceTypeId));
113         RemoteCommandManager::GetInstance().NotifyDeviceOnline(udid);
114     }
115 
116     return Constant::SUCCESS;
117 }
118 
DeviceInit()119 int SoftBusManager::DeviceInit()
120 {
121     std::string packageName = TOKEN_SYNC_PACKAGE_NAME;
122     std::shared_ptr<TokenSyncDmInitCallback> ptrDmInitCallback = std::make_shared<TokenSyncDmInitCallback>();
123 
124     int ret = DistributedHardware::DeviceManager::GetInstance().InitDeviceManager(packageName, ptrDmInitCallback);
125     if (ret != ERR_OK) {
126         ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: InitDeviceManager error, result: %{public}d", ret);
127         return ret;
128     }
129 
130     ret = AddTrustedDeviceInfo();
131     if (ret != ERR_OK) {
132         ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: AddTrustedDeviceInfo error, result: %{public}d", ret);
133         return ret;
134     }
135 
136     std::string extra = "";
137     std::shared_ptr<SoftBusDeviceConnectionListener> ptrDeviceStateCallback =
138         std::make_shared<SoftBusDeviceConnectionListener>();
139     ret = DistributedHardware::DeviceManager::GetInstance().RegisterDevStateCallback(packageName, extra,
140         ptrDeviceStateCallback);
141     if (ret != ERR_OK) {
142         ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: RegisterDevStateCallback error, result: %{public}d", ret);
143         return ret;
144     }
145 
146     return ERR_OK;
147 }
148 
CheckAndCopyStr(char * dest,uint32_t destLen,const std::string & src)149 bool SoftBusManager::CheckAndCopyStr(char* dest, uint32_t destLen, const std::string& src)
150 {
151     if (destLen < src.length() + 1) {
152         ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid src length");
153         return false;
154     }
155     if (strcpy_s(dest, destLen, src.c_str()) != EOK) {
156         ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid src");
157         return false;
158     }
159     return true;
160 }
161 
ServiceSocketInit()162 int32_t SoftBusManager::ServiceSocketInit()
163 {
164     std::string serviceName = TOKEN_SYNC_SOCKET_NAME + "service";
165     char name[SOCKET_NAME_MAX_LEN + 1];
166     if (!CheckAndCopyStr(name, SOCKET_NAME_MAX_LEN, serviceName)) {
167         return ERROR_TRANSFORM_STRING_TO_CHAR;
168     }
169 
170     char pkgName[SOCKET_NAME_MAX_LEN + 1];
171     if (!CheckAndCopyStr(pkgName, SOCKET_NAME_MAX_LEN, TOKEN_SYNC_PACKAGE_NAME)) {
172         return ERROR_TRANSFORM_STRING_TO_CHAR;
173     }
174 
175     SocketInfo info = {
176         .name = name,
177         .pkgName = pkgName,
178         .dataType = DATA_TYPE_BYTES
179     };
180     int32_t ret = ::Socket(info); // create service socket id
181     if (ret <= Constant::INVALID_SOCKET_FD) {
182         ACCESSTOKEN_LOG_ERROR(LABEL, "Create service socket faild, ret is %{public}d.", ret);
183         return ERROR_CREATE_SOCKET_FAIL;
184     } else {
185         socketFd_ = ret;
186         ACCESSTOKEN_LOG_DEBUG(LABEL, "Create service socket[%{public}d] success.", socketFd_);
187     }
188 
189     // set service qos, no need to regist OnQos now, regist it
190     QosTV serverQos[] = {
191         { .qos = QOS_TYPE_MIN_BW,      .value = MIN_BW },
192         { .qos = QOS_TYPE_MAX_LATENCY, .value = MAX_LATENCY },
193         { .qos = QOS_TYPE_MIN_LATENCY, .value = MIN_LATENCY },
194     };
195 
196     ISocketListener listener;
197     listener.OnBind = SoftBusSocketListener::OnBind; // only service may receive OnBind
198     listener.OnShutdown = SoftBusSocketListener::OnShutdown;
199     listener.OnBytes = SoftBusSocketListener::OnClientBytes;
200 
201     ret = ::Listen(socketFd_, serverQos, QOS_LEN, &listener);
202     if (ret != ERR_OK) {
203         ACCESSTOKEN_LOG_ERROR(LABEL, "Create listener failed, ret is %{public}d.", ret);
204         return ERROR_CREATE_LISTENER_FAIL;
205     } else {
206         ACCESSTOKEN_LOG_DEBUG(LABEL, "Create listener success.");
207     }
208 
209     return ERR_OK;
210 }
211 
GetRepeatTimes()212 int32_t SoftBusManager::GetRepeatTimes()
213 {
214     // this value only set in service OnStart, no need lock when set and get
215     return sendRequestRepeatTimes_;
216 }
217 
SetDefaultConfigValue()218 void SoftBusManager::SetDefaultConfigValue()
219 {
220     ACCESSTOKEN_LOG_INFO(LABEL, "No config file or config file is not valid, use default values");
221 
222     sendRequestRepeatTimes_ = DEFAULT_SEND_REQUEST_REPEAT_TIMES;
223 }
224 
GetConfigValue()225 void SoftBusManager::GetConfigValue()
226 {
227     LibraryLoader loader(CONFIG_POLICY_LIBPATH);
228     ConfigPolicyLoaderInterface* policy = loader.GetObject<ConfigPolicyLoaderInterface>();
229     if (policy == nullptr) {
230         ACCESSTOKEN_LOG_ERROR(LABEL, "Dlopen libaccesstoken_config_policy failed.");
231         return;
232     }
233     AccessTokenConfigValue value;
234     if (policy->GetConfigValue(ServiceType::TOKENSYNC_SERVICE, value)) {
235         sendRequestRepeatTimes_ = value.tsConfig.sendRequestRepeatTimes == 0
236             ? DEFAULT_SEND_REQUEST_REPEAT_TIMES : value.tsConfig.sendRequestRepeatTimes;
237     } else {
238         SetDefaultConfigValue();
239     }
240 
241     ACCESSTOKEN_LOG_INFO(LABEL, "SendRequestRepeatTimes_ is %{public}d.", sendRequestRepeatTimes_);
242 }
243 
Initialize()244 void SoftBusManager::Initialize()
245 {
246     bool inited = false;
247     // cas failed means already inited.
248     if (!inited_.compare_exchange_strong(inited, true)) {
249         ACCESSTOKEN_LOG_DEBUG(LABEL, "Already initialized, skip");
250         return;
251     }
252 
253     GetConfigValue();
254 
255     std::function<void()> runner = [this]() {
256         std::string name = "SoftBusMagInit";
257         pthread_setname_np(pthread_self(), name.substr(0, MAX_PTHREAD_NAME_LEN).c_str());
258         auto sleepTime = std::chrono::milliseconds(1000);
259         while (1) {
260             std::unique_lock<std::mutex> lock(mutex_);
261 
262             int ret = DeviceInit();
263             if (ret != ERR_OK) {
264                 std::this_thread::sleep_for(sleepTime);
265                 continue;
266             }
267 
268             ret = ServiceSocketInit();
269             if (ret != ERR_OK) {
270                 std::this_thread::sleep_for(sleepTime);
271                 continue;
272             }
273 
274             isSoftBusServiceBindSuccess_ = true;
275             this->FulfillLocalDeviceInfo();
276             return;
277         }
278     };
279 
280     std::thread initThread(runner);
281     initThread.detach();
282     ACCESSTOKEN_LOG_DEBUG(LABEL, "Initialize thread started");
283 }
284 
Destroy()285 void SoftBusManager::Destroy()
286 {
287     ACCESSTOKEN_LOG_DEBUG(LABEL, "Destroy, init: %{public}d, isSoftBusServiceBindSuccess: %{public}d", inited_.load(),
288         isSoftBusServiceBindSuccess_);
289 
290     if (!inited_.load()) {
291         ACCESSTOKEN_LOG_DEBUG(LABEL, "Not inited, skip");
292         return;
293     }
294 
295     std::unique_lock<std::mutex> lock(mutex_);
296     if (!inited_.load()) {
297         ACCESSTOKEN_LOG_DEBUG(LABEL, "Not inited, skip");
298         return;
299     }
300 
301     if (isSoftBusServiceBindSuccess_) {
302         if (socketFd_ > Constant::INVALID_SOCKET_FD) {
303             ::Shutdown(socketFd_);
304         }
305 
306         ACCESSTOKEN_LOG_DEBUG(LABEL, "Destroy service socket.");
307 
308         SoftBusSocketListener::CleanUpAllBindSocket();
309 
310         ACCESSTOKEN_LOG_DEBUG(LABEL, "Destroy client socket.");
311 
312         isSoftBusServiceBindSuccess_ = false;
313     }
314 
315     std::string packageName = TOKEN_SYNC_PACKAGE_NAME;
316     int ret = DistributedHardware::DeviceManager::GetInstance().UnRegisterDevStateCallback(packageName);
317     if (ret != ERR_OK) {
318         ACCESSTOKEN_LOG_ERROR(LABEL, "UnRegisterDevStateCallback failed, code: %{public}d", ret);
319     }
320     ret = DistributedHardware::DeviceManager::GetInstance().UnInitDeviceManager(packageName);
321     if (ret != ERR_OK) {
322         ACCESSTOKEN_LOG_ERROR(LABEL, "UnInitDeviceManager failed, code: %{public}d", ret);
323     }
324 
325     inited_.store(false);
326 
327     ACCESSTOKEN_LOG_DEBUG(LABEL, "Destroy, done");
328 }
329 
InitSocketAndListener(const std::string & networkId,ISocketListener & listener)330 int32_t SoftBusManager::InitSocketAndListener(const std::string& networkId, ISocketListener& listener)
331 {
332     std::string clientName = TOKEN_SYNC_SOCKET_NAME + networkId;
333     char name[SOCKET_NAME_MAX_LEN + 1];
334     if (!CheckAndCopyStr(name, SOCKET_NAME_MAX_LEN, clientName)) {
335         return ERROR_TRANSFORM_STRING_TO_CHAR;
336     }
337 
338     std::string serviceName = TOKEN_SYNC_SOCKET_NAME + "service";
339     char peerName[SOCKET_NAME_MAX_LEN + 1];
340     if (!CheckAndCopyStr(peerName, SOCKET_NAME_MAX_LEN, serviceName)) {
341         return ERROR_TRANSFORM_STRING_TO_CHAR;
342     }
343 
344     char peerNetworkId[SOCKET_NAME_MAX_LEN + 1];
345     if (!CheckAndCopyStr(peerNetworkId, SOCKET_NAME_MAX_LEN, networkId)) {
346         return ERROR_TRANSFORM_STRING_TO_CHAR;
347     }
348 
349     char pkgName[SOCKET_NAME_MAX_LEN + 1];
350     if (!CheckAndCopyStr(pkgName, SOCKET_NAME_MAX_LEN, TOKEN_SYNC_PACKAGE_NAME)) {
351         return ERROR_TRANSFORM_STRING_TO_CHAR;
352     }
353 
354     SocketInfo info = {
355         .name = name,
356         .peerName = peerName,
357         .peerNetworkId = peerNetworkId,
358         .pkgName = pkgName,
359         .dataType = DATA_TYPE_BYTES
360     };
361 
362     listener.OnShutdown = SoftBusSocketListener::OnShutdown;
363     listener.OnBytes = SoftBusSocketListener::OnServiceBytes;
364     listener.OnQos = SoftBusSocketListener::OnQos; // only client may receive OnQos
365 
366     return ::Socket(info);
367 }
368 
BindService(const std::string & deviceId)369 int32_t SoftBusManager::BindService(const std::string &deviceId)
370 {
371 #ifdef DEBUG_API_PERFORMANCE
372     ACCESSTOKEN_LOG_INFO(LABEL, "Api_performance:start bind service");
373 #endif
374 
375     DeviceInfo info;
376     bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(deviceId, DeviceIdType::UNKNOWN, info);
377     if (!result) {
378         ACCESSTOKEN_LOG_WARN(LABEL, "Device info not found for deviceId %{public}s",
379             ConstantCommon::EncryptDevId(deviceId).c_str());
380         return Constant::FAILURE;
381     }
382     std::string networkId = info.deviceId.networkId;
383 
384     ISocketListener listener;
385     int32_t socketFd = InitSocketAndListener(networkId, listener);
386     if (socketFd_ <= Constant::INVALID_SOCKET_FD) {
387         ACCESSTOKEN_LOG_ERROR(LABEL, "Create client socket faild.");
388         return ERROR_CREATE_SOCKET_FAIL;
389     }
390 
391     {
392         std::lock_guard<std::mutex> guard(clientSocketMutex_);
393         auto iter = clientSocketMap_.find(socketFd);
394         if (iter == clientSocketMap_.end()) {
395             clientSocketMap_.insert(std::pair<int32_t, std::string>(socketFd, networkId));
396         } else {
397             ACCESSTOKEN_LOG_ERROR(LABEL, "Client socket has bind already");
398             return ERROR_CLIENT_HAS_BIND_ALREADY;
399         }
400     }
401 
402     QosTV clientQos[] = {
403         { .qos = QOS_TYPE_MIN_BW,      .value = MIN_BW },
404         { .qos = QOS_TYPE_MAX_LATENCY, .value = MAX_LATENCY },
405         { .qos = QOS_TYPE_MIN_LATENCY, .value = MIN_LATENCY },
406     };
407 
408     AccessTokenID firstCaller = IPCSkeleton::GetFirstTokenID();
409     SetFirstCallerTokenID(firstCaller);
410     ACCESSTOKEN_LOG_INFO(LABEL, "Bind service and setFirstCaller %{public}u.", firstCaller);
411 
412     // retry 10 times or bind success
413     int32_t retryTimes = 0;
414     auto sleepTime = std::chrono::milliseconds(BIND_SERVICE_SLEEP_TIMES_MS);
415     while (retryTimes < BIND_SERVICE_MAX_RETRY_TIMES) {
416         int32_t res = ::Bind(socketFd, clientQos, QOS_LEN, &listener);
417         if (res != Constant::SUCCESS) {
418             std::this_thread::sleep_for(sleepTime);
419             retryTimes++;
420             continue;
421         }
422         break;
423     }
424 
425     ACCESSTOKEN_LOG_DEBUG(LABEL, "Bind service succeed, socketFd is %{public}d.", socketFd);
426     return socketFd;
427 }
428 
CloseSocket(int socketFd)429 int SoftBusManager::CloseSocket(int socketFd)
430 {
431     if (socketFd <= Constant::INVALID_SOCKET_FD) {
432         ACCESSTOKEN_LOG_INFO(LABEL, "Socket is invalid");
433         return Constant::FAILURE;
434     }
435 
436     ::Shutdown(socketFd);
437 
438     std::lock_guard<std::mutex> guard(clientSocketMutex_);
439     auto iter = clientSocketMap_.find(socketFd);
440     if (iter != clientSocketMap_.end()) {
441         clientSocketMap_.erase(iter);
442     }
443 
444     ACCESSTOKEN_LOG_INFO(LABEL, "Close socket");
445 
446     return Constant::SUCCESS;
447 }
448 
GetNetworkIdBySocket(const int32_t socket,std::string & networkId)449 bool SoftBusManager::GetNetworkIdBySocket(const int32_t socket, std::string& networkId)
450 {
451     std::lock_guard<std::mutex> guard(clientSocketMutex_);
452     auto iter = clientSocketMap_.find(socket);
453     if (iter != clientSocketMap_.end()) {
454         networkId = iter->second;
455         return true;
456     }
457     return false;
458 }
459 
GetUniversallyUniqueIdByNodeId(const std::string & networkId)460 std::string SoftBusManager::GetUniversallyUniqueIdByNodeId(const std::string &networkId)
461 {
462     if (!DataValidator::IsDeviceIdValid(networkId)) {
463         ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid networkId, empty or size extends 256");
464         return "";
465     }
466 
467     std::string uuid;
468     DistributedHardware::DeviceManager::GetInstance().GetUuidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, networkId, uuid);
469     if (uuid.empty()) {
470         ACCESSTOKEN_LOG_ERROR(LABEL, "Softbus return null or empty string");
471         return "";
472     }
473 
474     DeviceInfo info;
475     bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(uuid, DeviceIdType::UNIVERSALLY_UNIQUE_ID, info);
476     if (!result) {
477         ACCESSTOKEN_LOG_DEBUG(LABEL, "Local device info not found for uuid %{public}s",
478             ConstantCommon::EncryptDevId(uuid).c_str());
479     } else {
480         std::string dimUuid = info.deviceId.universallyUniqueId;
481         if (uuid == dimUuid) {
482             // refresh cache
483             std::function<void()> fulfillDeviceInfo = [this]() {this->FulfillLocalDeviceInfo();};
484             std::thread fulfill(fulfillDeviceInfo);
485             fulfill.detach();
486         }
487     }
488 
489     return uuid;
490 }
491 
GetUniqueDeviceIdByNodeId(const std::string & networkId)492 std::string SoftBusManager::GetUniqueDeviceIdByNodeId(const std::string &networkId)
493 {
494     if (!DataValidator::IsDeviceIdValid(networkId)) {
495         ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid networkId: %{public}s", ConstantCommon::EncryptDevId(networkId).c_str());
496         return "";
497     }
498     std::string udid;
499     DistributedHardware::DeviceManager::GetInstance().GetUdidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, networkId, udid);
500     if (udid.empty()) {
501         ACCESSTOKEN_LOG_ERROR(LABEL, "Softbus return null or empty string: %{public}s",
502             ConstantCommon::EncryptDevId(udid).c_str());
503         return "";
504     }
505     std::string localUdid = ConstantCommon::GetLocalDeviceId();
506     if (udid == localUdid) {
507         // refresh cache
508         std::function<void()> fulfillDeviceInfo = [this]() {this->FulfillLocalDeviceInfo();};
509         std::thread fulfill(fulfillDeviceInfo);
510         fulfill.detach();
511     }
512     return udid;
513 }
514 
FulfillLocalDeviceInfo()515 int SoftBusManager::FulfillLocalDeviceInfo()
516 {
517     // repeated task will just skip
518     if (!fulfillMutex_.try_lock()) {
519         ACCESSTOKEN_LOG_INFO(LABEL, "FulfillLocalDeviceInfo already running, skip.");
520         return Constant::SUCCESS;
521     }
522 
523     DistributedHardware::DmDeviceInfo deviceInfo;
524     int32_t res = DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceInfo(TOKEN_SYNC_PACKAGE_NAME,
525         deviceInfo);
526     if (res != Constant::SUCCESS) {
527         ACCESSTOKEN_LOG_ERROR(LABEL, "GetLocalDeviceInfo error");
528         fulfillMutex_.unlock();
529         return Constant::FAILURE;
530     }
531     std::string networkId = std::string(deviceInfo.networkId);
532 
533     ACCESSTOKEN_LOG_DEBUG(LABEL, "Call softbus finished, type:%{public}d", deviceInfo.deviceTypeId);
534 
535     std::string uuid;
536     std::string udid;
537 
538     DistributedHardware::DeviceManager::GetInstance().GetUuidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, networkId, uuid);
539     DistributedHardware::DeviceManager::GetInstance().GetUdidByNetworkId(TOKEN_SYNC_PACKAGE_NAME, networkId, udid);
540     if (uuid.empty() || udid.empty()) {
541         ACCESSTOKEN_LOG_ERROR(LABEL, "FulfillLocalDeviceInfo: uuid or udid is empty, abort.");
542         fulfillMutex_.unlock();
543         return Constant::FAILURE;
544     }
545 
546     DeviceInfoManager::GetInstance().AddDeviceInfo(networkId, uuid, udid, std::string(deviceInfo.deviceName),
547         std::to_string(deviceInfo.deviceTypeId));
548     ACCESSTOKEN_LOG_DEBUG(LABEL, "AddDeviceInfo finished");
549 
550     fulfillMutex_.unlock();
551     return Constant::SUCCESS;
552 }
553 } // namespace AccessToken
554 } // namespace Security
555 } // namespace OHOS
556