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