1 /*
2 * Copyright (c) 2021 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 "client_trans_session_manager.h"
17
18 #include <securec.h>
19
20 #include "client_bus_center_manager.h"
21 #include "client_trans_channel_manager.h"
22 #include "softbus_adapter_mem.h"
23 #include "softbus_app_info.h"
24 #include "softbus_def.h"
25 #include "softbus_errcode.h"
26 #include "softbus_log.h"
27 #include "softbus_utils.h"
28 #include "trans_server_proxy.h"
29
30 static int32_t g_sessionIdNum = 0;
31 static int32_t g_sessionId = 1;
32 static SoftBusList *g_clientSessionServerList = NULL;
33
34 typedef struct {
35 ListNode node;
36 int32_t sessionId;
37 int32_t channelId;
38 ChannelType channelType;
39 void (*OnSessionClosed)(int sessionId);
40 } DestroySessionInfo;
41
CheckPermissionState(int32_t sessionId)42 int32_t CheckPermissionState(int32_t sessionId)
43 {
44 if (g_clientSessionServerList == NULL) {
45 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
46 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
47 }
48 ClientSessionServer *serverNode = NULL;
49 SessionInfo *sessionNode = NULL;
50 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
51 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
52 return SOFTBUS_LOCK_ERR;
53 }
54 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
55 if (IsListEmpty(&serverNode->sessionList)) {
56 continue;
57 }
58 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
59 if (sessionNode->sessionId == sessionId) {
60 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
61 return serverNode->permissionState ? SOFTBUS_OK : SOFTBUS_PERMISSION_DENIED;
62 }
63 }
64 }
65 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
66 return SOFTBUS_TRANS_INVALID_SESSION_ID;
67 }
68
PermissionStateChange(const char * pkgName,int32_t state)69 void PermissionStateChange(const char *pkgName, int32_t state)
70 {
71 if (g_clientSessionServerList == NULL) {
72 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
73 return;
74 }
75 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
76 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
77 return;
78 }
79 ClientSessionServer *serverNode = NULL;
80 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
81 if ((strcmp(serverNode->pkgName, pkgName) == 0)) {
82 serverNode->permissionState = state > 0 ? true : false;
83 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "%s permission change, state = %d", pkgName, state);
84 break;
85 }
86 }
87 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
88 }
89
TransClientInit(void)90 int TransClientInit(void)
91 {
92 g_clientSessionServerList = CreateSoftBusList();
93 if (g_clientSessionServerList == NULL) {
94 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init list failed");
95 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
96 }
97
98 if (TransServerProxyInit() != SOFTBUS_OK) {
99 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init trans ipc proxy failed");
100 return SOFTBUS_ERR;
101 }
102
103 if (ClientTransChannelInit() != SOFTBUS_OK) {
104 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init trans channel failed");
105 return SOFTBUS_ERR;
106 }
107
108 ClientTransRegLnnOffline();
109 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "init trans client success");
110 return SOFTBUS_OK;
111 }
112
SessionIdIsAvailable(int32_t sessionId)113 static bool SessionIdIsAvailable(int32_t sessionId)
114 {
115 ClientSessionServer *serverNode = NULL;
116 SessionInfo *sessionNode = NULL;
117
118 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
119 if (IsListEmpty(&serverNode->sessionList)) {
120 continue;
121 }
122 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
123 if (sessionNode->sessionId == sessionId) {
124 return false;
125 }
126 }
127 }
128
129 return true;
130 }
131
GenerateSessionId(void)132 static int32_t GenerateSessionId(void)
133 {
134 if (g_sessionIdNum >= MAX_SESSION_ID) {
135 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "sessionid num cross the line error");
136 return INVALID_SESSION_ID;
137 }
138 int32_t cnt = MAX_SESSION_ID + 1;
139 int32_t id = INVALID_SESSION_ID;
140
141 while (cnt) {
142 id = g_sessionId++;
143 if (g_sessionId < 0) {
144 g_sessionId = 1;
145 }
146 if (SessionIdIsAvailable(id)) {
147 g_sessionIdNum++;
148 return id;
149 }
150 cnt--;
151 }
152 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "generate id error");
153 return id;
154 }
155
DestroySessionId(void)156 static void DestroySessionId(void)
157 {
158 if (g_sessionIdNum > 0) {
159 g_sessionIdNum--;
160 }
161 return;
162 }
163
CreateDestroySessionNode(SessionInfo * sessionNode,const ClientSessionServer * server)164 static DestroySessionInfo *CreateDestroySessionNode(SessionInfo *sessionNode, const ClientSessionServer *server)
165 {
166 DestroySessionInfo *destroyNode = (DestroySessionInfo *)SoftBusMalloc(sizeof(DestroySessionInfo));
167 if (destroyNode == NULL) {
168 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "destroyList malloc fail.");
169 return NULL;
170 }
171 destroyNode->sessionId = sessionNode->sessionId;
172 destroyNode->channelId = sessionNode->channelId;
173 destroyNode->channelType = sessionNode->channelType;
174 destroyNode->OnSessionClosed = server->listener.session.OnSessionClosed;
175 return destroyNode;
176 }
177
ClientDestroySession(const ListNode * destroyList)178 static void ClientDestroySession(const ListNode *destroyList)
179 {
180 if (IsListEmpty(destroyList)) {
181 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "destroyList is empty fail.");
182 return;
183 }
184 DestroySessionInfo *destroyNode = NULL;
185 DestroySessionInfo *destroyNodeNext = NULL;
186 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSession start");
187 LIST_FOR_EACH_ENTRY_SAFE(destroyNode, destroyNodeNext, destroyList, DestroySessionInfo, node) {
188 int32_t id = destroyNode->sessionId;
189 (void)ClientTransCloseChannel(destroyNode->channelId, destroyNode->channelType);
190 if (destroyNode->OnSessionClosed != NULL) {
191 destroyNode->OnSessionClosed(id);
192 }
193 ListDelete(&(destroyNode->node));
194 SoftBusFree(destroyNode);
195 }
196 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSession end");
197 }
198
DestroyClientSessionServer(ClientSessionServer * server,ListNode * destroyList)199 static void DestroyClientSessionServer(ClientSessionServer *server, ListNode *destroyList)
200 {
201 if (server == NULL) {
202 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid param");
203 return;
204 }
205
206 if (!IsListEmpty(&(server->sessionList))) {
207 SessionInfo *sessionNode = NULL;
208 SessionInfo *sessionNodeNext = NULL;
209 LIST_FOR_EACH_ENTRY_SAFE(sessionNode, sessionNodeNext, &(server->sessionList), SessionInfo, node) {
210 DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, server);
211 if (destroyNode == NULL) {
212 continue;
213 }
214 DestroySessionId();
215 ListDelete(&sessionNode->node);
216 ListAdd(destroyList, &(destroyNode->node));
217 SoftBusFree(sessionNode);
218 }
219 }
220
221 ListDelete(&(server->node));
222 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "destroy session server [%s]", server->sessionName);
223 SoftBusFree(server);
224 }
225
TransClientDeinit(void)226 void TransClientDeinit(void)
227 {
228 if (g_clientSessionServerList == NULL) {
229 return;
230 }
231 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
232 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
233 return;
234 }
235 ClientSessionServer *serverNode = NULL;
236 ClientSessionServer *serverNodeNext = NULL;
237 ListNode destroyList;
238 ListInit(&destroyList);
239 LIST_FOR_EACH_ENTRY_SAFE(serverNode, serverNodeNext, &(g_clientSessionServerList->list),
240 ClientSessionServer, node) {
241 DestroyClientSessionServer(serverNode, &destroyList);
242 }
243 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
244 ClientDestroySession(&destroyList);
245
246 DestroySoftBusList(g_clientSessionServerList);
247 g_clientSessionServerList = NULL;
248 ClientTransChannelDeinit();
249 TransServerProxyDeInit();
250 }
251
SessionServerIsExist(const char * sessionName)252 static bool SessionServerIsExist(const char *sessionName)
253 {
254 /* need get lock before */
255 ListNode *pos = NULL;
256 ListNode *tmp = NULL;
257 ClientSessionServer *node = NULL;
258 LIST_FOR_EACH_SAFE(pos, tmp, &g_clientSessionServerList->list) {
259 node = (ClientSessionServer *)pos;
260 if (strcmp(node->sessionName, sessionName) == 0) {
261 return true;
262 }
263 }
264 return false;
265 }
266
GetNewSessionServer(SoftBusSecType type,const char * sessionName,const char * pkgName,const ISessionListener * listener)267 static ClientSessionServer *GetNewSessionServer(SoftBusSecType type, const char *sessionName,
268 const char *pkgName, const ISessionListener *listener)
269 {
270 ClientSessionServer *server = (ClientSessionServer *)SoftBusCalloc(sizeof(ClientSessionServer));
271 if (server == NULL) {
272 return NULL;
273 }
274 server->type = type;
275 if (strcpy_s(server->pkgName, sizeof(server->pkgName), pkgName) != EOK) {
276 goto EXIT_ERR;
277 }
278 if (strcpy_s(server->sessionName, sizeof(server->sessionName), sessionName) != EOK) {
279 goto EXIT_ERR;
280 }
281 if (memcpy_s(&server->listener.session, sizeof(ISessionListener), listener, sizeof(ISessionListener)) != EOK) {
282 goto EXIT_ERR;
283 }
284
285 ListInit(&server->node);
286 ListInit(&server->sessionList);
287 return server;
288 EXIT_ERR:
289 if (server != NULL) {
290 SoftBusFree(server);
291 }
292 return NULL;
293 }
294
ClientAddSessionServer(SoftBusSecType type,const char * pkgName,const char * sessionName,const ISessionListener * listener)295 int32_t ClientAddSessionServer(SoftBusSecType type, const char *pkgName, const char *sessionName,
296 const ISessionListener *listener)
297 {
298 if (pkgName == NULL || sessionName == NULL || listener == NULL) {
299 return SOFTBUS_INVALID_PARAM;
300 }
301
302 if (g_clientSessionServerList == NULL) {
303 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
304 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
305 }
306 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
307 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
308 return SOFTBUS_LOCK_ERR;
309 }
310 if (SessionServerIsExist(sessionName)) {
311 (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
312 return SOFTBUS_SERVER_NAME_REPEATED;
313 }
314
315 if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
316 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
317 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server num reach max");
318 return SOFTBUS_INVALID_NUM;
319 }
320
321 ClientSessionServer *server = GetNewSessionServer(type, sessionName, pkgName, listener);
322 if (server == NULL) {
323 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
324 return SOFTBUS_MEM_ERR;
325 }
326 server->permissionState = true;
327 ListAdd(&g_clientSessionServerList->list, &server->node);
328 g_clientSessionServerList->cnt++;
329
330 (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
331 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session name [%s], pkg name [%s]",
332 server->sessionName, server->pkgName);
333 return SOFTBUS_OK;
334 }
335
IsValidSessionParam(const SessionParam * param)336 static bool IsValidSessionParam(const SessionParam *param)
337 {
338 if ((param == NULL) ||
339 (param->sessionName == NULL) ||
340 (param->peerSessionName == NULL) ||
341 (param->peerDeviceId == NULL) ||
342 (param->groupId == NULL) ||
343 (param->attr == NULL)) {
344 return false;
345 }
346 return true;
347 }
348
CreateNewSession(const SessionParam * param)349 static SessionInfo *CreateNewSession(const SessionParam *param)
350 {
351 SessionInfo *session = (SessionInfo*)SoftBusCalloc(sizeof(SessionInfo));
352 if (session == NULL) {
353 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "calloc failed");
354 return NULL;
355 }
356
357 if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, param->peerSessionName) != EOK ||
358 strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, param->peerDeviceId) != EOK ||
359 strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, param->groupId) != EOK) {
360 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "strcpy failed");
361 SoftBusFree(session);
362 return NULL;
363 }
364
365 session->sessionId = INVALID_SESSION_ID;
366 session->channelId = INVALID_CHANNEL_ID;
367 session->channelType = CHANNEL_TYPE_BUTT;
368 session->isServer = false;
369 session->isEnable = false;
370 session->info.flag = param->attr->dataType;
371 session->isEncrypt = true;
372
373 return session;
374 }
375
GetExistSession(const SessionParam * param)376 static SessionInfo *GetExistSession(const SessionParam *param)
377 {
378 /* need get lock before */
379 ClientSessionServer *serverNode = NULL;
380 SessionInfo *sessionNode = NULL;
381 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
382 if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList)) {
383 continue;
384 }
385 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
386 if (sessionNode->isServer ||
387 (strcmp(sessionNode->info.peerSessionName, param->peerSessionName) != 0) ||
388 (strcmp(sessionNode->info.peerDeviceId, param->peerDeviceId) != 0) ||
389 (strcmp(sessionNode->info.groupId, param->groupId) != 0) ||
390 (sessionNode->info.flag != param->attr->dataType)) {
391 continue;
392 }
393 return sessionNode;
394 }
395 }
396 return NULL;
397 }
398
GetSessionById(int32_t sessionId,ClientSessionServer ** server,SessionInfo ** session)399 static int32_t GetSessionById(int32_t sessionId, ClientSessionServer **server, SessionInfo **session)
400 {
401 /* need get lock before */
402 ClientSessionServer *serverNode = NULL;
403 SessionInfo *sessionNode = NULL;
404
405 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
406 if (IsListEmpty(&serverNode->sessionList)) {
407 continue;
408 }
409 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
410 if (sessionNode->sessionId == sessionId) {
411 *server = serverNode;
412 *session = sessionNode;
413 return SOFTBUS_OK;
414 }
415 }
416 }
417 return SOFTBUS_ERR;
418 }
419
AddSession(const char * sessionName,SessionInfo * session)420 static int32_t AddSession(const char *sessionName, SessionInfo *session)
421 {
422 /* need get lock before */
423 session->sessionId = GenerateSessionId();
424 if (session->sessionId < 0) {
425 return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
426 }
427 ClientSessionServer *serverNode = NULL;
428 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
429 if (strcmp(serverNode->sessionName, sessionName) != 0) {
430 continue;
431 }
432 ListAdd(&serverNode->sessionList, &session->node);
433 return SOFTBUS_OK;
434 }
435 DestroySessionId();
436 return SOFTBUS_TRANS_SESSIONSERVER_NOT_CREATED;
437 }
438
ClientAddNewSession(const char * sessionName,SessionInfo * session)439 int32_t ClientAddNewSession(const char *sessionName, SessionInfo *session)
440 {
441 if (session == NULL) {
442 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
443 return SOFTBUS_INVALID_PARAM;
444 }
445
446 if (g_clientSessionServerList == NULL) {
447 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
448 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
449 }
450
451 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
452 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
453 return SOFTBUS_LOCK_ERR;
454 }
455
456 int32_t ret = AddSession(sessionName, session);
457 if (ret != SOFTBUS_OK) {
458 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
459 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "add session failed, ret [%d]", ret);
460 return ret;
461 }
462 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
463 return SOFTBUS_OK;
464 }
465
ClientAddSession(const SessionParam * param,int32_t * sessionId,bool * isEnabled)466 int32_t ClientAddSession(const SessionParam *param, int32_t *sessionId, bool *isEnabled)
467 {
468 if (!IsValidSessionParam(param) || (sessionId == NULL) || (isEnabled == NULL)) {
469 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
470 return SOFTBUS_INVALID_PARAM;
471 }
472
473 if (g_clientSessionServerList == NULL) {
474 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
475 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
476 }
477
478 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
479 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
480 return SOFTBUS_LOCK_ERR;
481 }
482
483 SessionInfo *session = GetExistSession(param);
484 if (session != NULL) {
485 *sessionId = session->sessionId;
486 *isEnabled = session->isEnable;
487 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
488 return SOFTBUS_TRANS_SESSION_REPEATED;
489 }
490
491 session = CreateNewSession(param);
492 if (session == NULL) {
493 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
494 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "create session failed");
495 return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
496 }
497
498 int32_t ret = AddSession(param->sessionName, session);
499 if (ret != SOFTBUS_OK) {
500 SoftBusFree(session);
501 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
502 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Add Session failed, ret [%d]", ret);
503 return ret;
504 }
505
506 *sessionId = session->sessionId;
507 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
508 return SOFTBUS_OK;
509 }
510
CreateNonEncryptSessionInfo(const char * sessionName)511 static SessionInfo *CreateNonEncryptSessionInfo(const char *sessionName)
512 {
513 if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
514 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
515 return NULL;
516 }
517 SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
518 if (session == NULL) {
519 return NULL;
520 }
521 session->channelType = CHANNEL_TYPE_AUTH;
522 session->isEncrypt = false;
523 if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK) {
524 SoftBusFree(session);
525 return NULL;
526 }
527 return session;
528 }
529
ClientAddAuthSession(const char * sessionName,int32_t * sessionId)530 int32_t ClientAddAuthSession(const char *sessionName, int32_t *sessionId)
531 {
532 if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) || (sessionId == NULL)) {
533 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
534 return SOFTBUS_INVALID_PARAM;
535 }
536 if (g_clientSessionServerList == NULL) {
537 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
538 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
539 }
540 SessionInfo *session = CreateNonEncryptSessionInfo(sessionName);
541 if (session == NULL) {
542 return SOFTBUS_MALLOC_ERR;
543 }
544 int32_t ret = ClientAddNewSession(sessionName, session);
545 if (ret != SOFTBUS_OK) {
546 SoftBusFree(session);
547 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client add new session failed, ret=%d.", ret);
548 return ret;
549 }
550 *sessionId = session->sessionId;
551 return SOFTBUS_OK;
552 }
553
ClientDeleteSessionServer(SoftBusSecType type,const char * sessionName)554 int32_t ClientDeleteSessionServer(SoftBusSecType type, const char *sessionName)
555 {
556 if ((type == SEC_TYPE_UNKNOWN) || (sessionName == NULL)) {
557 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
558 return SOFTBUS_INVALID_PARAM;
559 }
560
561 if (g_clientSessionServerList == NULL) {
562 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
563 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
564 }
565
566 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
567 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
568 return SOFTBUS_LOCK_ERR;
569 }
570
571 ClientSessionServer *serverNode = NULL;
572 ListNode destroyList;
573 ListInit(&destroyList);
574 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
575 if ((strcmp(serverNode->sessionName, sessionName) == 0) && (serverNode->type == type)) {
576 DestroyClientSessionServer(serverNode, &destroyList);
577 g_clientSessionServerList->cnt--;
578 break;
579 }
580 }
581 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
582 (void)ClientDestroySession(&destroyList);
583 return SOFTBUS_OK;
584 }
585
ClientDeleteSession(int32_t sessionId)586 int32_t ClientDeleteSession(int32_t sessionId)
587 {
588 if (sessionId < 0) {
589 return SOFTBUS_ERR;
590 }
591
592 if (g_clientSessionServerList == NULL) {
593 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
594 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
595 }
596
597 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
598 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
599 return SOFTBUS_LOCK_ERR;
600 }
601
602 ClientSessionServer *serverNode = NULL;
603 SessionInfo *sessionNode = NULL;
604
605 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
606 if (IsListEmpty(&serverNode->sessionList)) {
607 continue;
608 }
609 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
610 if (sessionNode->sessionId != sessionId) {
611 continue;
612 }
613 ListDelete(&(sessionNode->node));
614 DestroySessionId();
615 SoftBusFree(sessionNode);
616 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
617 return SOFTBUS_OK;
618 }
619 }
620
621 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
622 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
623 return SOFTBUS_ERR;
624 }
625
ClientGetSessionDataById(int32_t sessionId,char * data,uint16_t len,SessionKey key)626 int32_t ClientGetSessionDataById(int32_t sessionId, char *data, uint16_t len, SessionKey key)
627 {
628 if ((sessionId < 0) || (data == NULL) || (len == 0)) {
629 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
630 return SOFTBUS_INVALID_PARAM;
631 }
632
633 if (g_clientSessionServerList == NULL) {
634 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
635 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
636 }
637
638 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
639 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
640 return SOFTBUS_LOCK_ERR;
641 }
642
643 ClientSessionServer *serverNode = NULL;
644 SessionInfo *sessionNode = NULL;
645 int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
646 if (ret != SOFTBUS_OK) {
647 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
648 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s: sid[%d] not found", __func__, sessionId);
649 return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
650 }
651
652 switch (key) {
653 case KEY_SESSION_NAME:
654 ret = strcpy_s(data, len, serverNode->sessionName);
655 break;
656 case KEY_PEER_SESSION_NAME:
657 ret = strcpy_s(data, len, sessionNode->info.peerSessionName);
658 break;
659 case KEY_PEER_DEVICE_ID:
660 ret = strcpy_s(data, len, sessionNode->info.peerDeviceId);
661 break;
662 case KEY_PKG_NAME:
663 ret = strcpy_s(data, len, serverNode->pkgName);
664 break;
665 default:
666 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
667 return SOFTBUS_ERR;
668 }
669
670 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
671 if (ret != EOK) {
672 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "copy data failed");
673 return SOFTBUS_ERR;
674 }
675 return SOFTBUS_OK;
676 }
677
ClientGetSessionIntegerDataById(int32_t sessionId,int * data,SessionKey key)678 int32_t ClientGetSessionIntegerDataById(int32_t sessionId, int *data, SessionKey key)
679 {
680 if ((sessionId < 0) || (data == NULL)) {
681 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
682 return SOFTBUS_INVALID_PARAM;
683 }
684
685 if (g_clientSessionServerList == NULL) {
686 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
687 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
688 }
689
690 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
691 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
692 return SOFTBUS_LOCK_ERR;
693 }
694
695 ClientSessionServer *serverNode = NULL;
696 SessionInfo *sessionNode = NULL;
697 int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
698 if (ret != SOFTBUS_OK) {
699 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
700 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
701 return SOFTBUS_ERR;
702 }
703 switch (key) {
704 case KEY_IS_SERVER:
705 *data = sessionNode->isServer;
706 break;
707 case KEY_PEER_PID:
708 *data = sessionNode->peerPid;
709 break;
710 case KEY_PEER_UID:
711 *data = sessionNode->peerUid;
712 break;
713 default:
714 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
715 return SOFTBUS_ERR;
716 }
717
718 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
719 if (ret != EOK) {
720 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "copy data failed");
721 return SOFTBUS_ERR;
722 }
723 return SOFTBUS_OK;
724 }
725
ClientGetChannelBySessionId(int32_t sessionId,int32_t * channelId,int32_t * type,bool * isEnable)726 int32_t ClientGetChannelBySessionId(int32_t sessionId, int32_t *channelId, int32_t *type, bool *isEnable)
727 {
728 if (sessionId < 0) {
729 return SOFTBUS_INVALID_PARAM;
730 }
731 if (g_clientSessionServerList == NULL) {
732 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
733 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
734 }
735 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
736 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
737 return SOFTBUS_LOCK_ERR;
738 }
739
740 ClientSessionServer *serverNode = NULL;
741 SessionInfo *sessionNode = NULL;
742 if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
743 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
744 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
745 return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
746 }
747
748 if (channelId != NULL) {
749 *channelId = sessionNode->channelId;
750 }
751 if (type != NULL) {
752 *type = sessionNode->channelType;
753 }
754 if (isEnable != NULL) {
755 *isEnable = sessionNode->isEnable;
756 }
757 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
758 return SOFTBUS_OK;
759 }
760
ClientGetChannelBusinessTypeBySessionId(int32_t sessionId,int32_t * businessType)761 int32_t ClientGetChannelBusinessTypeBySessionId(int32_t sessionId, int32_t *businessType)
762 {
763 if ((sessionId < 0) || (businessType == NULL)) {
764 return SOFTBUS_INVALID_PARAM;
765 }
766 if (g_clientSessionServerList == NULL) {
767 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
768 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
769 }
770 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
771 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
772 return SOFTBUS_LOCK_ERR;
773 }
774
775 ClientSessionServer *serverNode = NULL;
776 SessionInfo *sessionNode = NULL;
777 if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
778 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
779 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
780 return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
781 }
782
783 *businessType = sessionNode->businessType;
784
785 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
786 return SOFTBUS_OK;
787 }
788
789
ClientSetChannelBySessionId(int32_t sessionId,TransInfo * transInfo)790 int32_t ClientSetChannelBySessionId(int32_t sessionId, TransInfo *transInfo)
791 {
792 if ((sessionId < 0) || (transInfo->channelId < 0)) {
793 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
794 return SOFTBUS_INVALID_PARAM;
795 }
796
797 if (g_clientSessionServerList == NULL) {
798 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
799 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
800 }
801
802 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
803 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
804 return SOFTBUS_LOCK_ERR;
805 }
806
807 ClientSessionServer *serverNode = NULL;
808 SessionInfo *sessionNode = NULL;
809
810 int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
811 if (ret != SOFTBUS_OK) {
812 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
813 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
814 return SOFTBUS_ERR;
815 }
816 sessionNode->channelId = transInfo->channelId;
817 sessionNode->channelType = (ChannelType)transInfo->channelType;
818
819 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
820 return SOFTBUS_OK;
821 }
822
GetEncryptByChannelId(int32_t channelId,int32_t channelType,int32_t * data)823 int32_t GetEncryptByChannelId(int32_t channelId, int32_t channelType, int32_t *data)
824 {
825 if ((channelId < 0) || (data == NULL)) {
826 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
827 return SOFTBUS_INVALID_PARAM;
828 }
829
830 if (g_clientSessionServerList == NULL) {
831 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
832 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
833 }
834
835 ClientSessionServer *serverNode = NULL;
836 SessionInfo *sessionNode = NULL;
837
838 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
839 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
840 return SOFTBUS_LOCK_ERR;
841 }
842
843 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
844 if (IsListEmpty(&serverNode->sessionList)) {
845 continue;
846 }
847
848 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
849 if (sessionNode->channelId == channelId && (int32_t)sessionNode->channelType == channelType) {
850 *data = (int32_t)sessionNode->isEncrypt;
851 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
852 return SOFTBUS_OK;
853 }
854 }
855 }
856
857 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
858 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d]", channelId);
859 return SOFTBUS_ERR;
860 }
861
ClientGetSessionIdByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId)862 int32_t ClientGetSessionIdByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId)
863 {
864 if ((channelId < 0) || (sessionId == NULL)) {
865 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
866 return SOFTBUS_INVALID_PARAM;
867 }
868
869 if (g_clientSessionServerList == NULL) {
870 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
871 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
872 }
873
874 ClientSessionServer *serverNode = NULL;
875 SessionInfo *sessionNode = NULL;
876
877 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
878 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
879 return SOFTBUS_LOCK_ERR;
880 }
881
882 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
883 if (IsListEmpty(&serverNode->sessionList)) {
884 continue;
885 }
886
887 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
888 if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
889 *sessionId = sessionNode->sessionId;
890 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
891 return SOFTBUS_OK;
892 }
893 }
894 }
895
896 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
897 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d]", channelId);
898 return SOFTBUS_ERR;
899 }
900
ClientEnableSessionByChannelId(const ChannelInfo * channel,int32_t * sessionId)901 int32_t ClientEnableSessionByChannelId(const ChannelInfo *channel, int32_t *sessionId)
902 {
903 if ((channel == NULL) || (sessionId == NULL)) {
904 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
905 return SOFTBUS_INVALID_PARAM;
906 }
907
908 if (g_clientSessionServerList == NULL) {
909 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
910 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
911 }
912
913 ClientSessionServer *serverNode = NULL;
914 SessionInfo *sessionNode = NULL;
915
916 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
917 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
918 return SOFTBUS_LOCK_ERR;
919 }
920
921 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
922 if (IsListEmpty(&serverNode->sessionList)) {
923 continue;
924 }
925
926 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
927 if ((sessionNode->channelId == channel->channelId) &&
928 (sessionNode->channelType == (ChannelType)(channel->channelType))) {
929 sessionNode->peerPid = channel->peerPid;
930 sessionNode->peerUid = channel->peerUid;
931 sessionNode->isServer = channel->isServer;
932 sessionNode->isEnable = true;
933 sessionNode->routeType = channel->routeType;
934 sessionNode->businessType = channel->businessType;
935 sessionNode->fileEncrypt = channel->encrypt;
936 sessionNode->algorithm = channel->algorithm;
937 sessionNode->crc = channel->crc;
938 *sessionId = sessionNode->sessionId;
939 if (channel->channelType == CHANNEL_TYPE_AUTH || !sessionNode->isEncrypt) {
940 if (memcpy_s(sessionNode->info.peerDeviceId, DEVICE_ID_SIZE_MAX,
941 channel->peerDeviceId, DEVICE_ID_SIZE_MAX) != EOK) {
942 (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
943 return SOFTBUS_MEM_ERR;
944 }
945 }
946 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
947 return SOFTBUS_OK;
948 }
949 }
950 }
951
952 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
953 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d], channelType [%d]",
954 channel->channelId, channel->channelType);
955 return SOFTBUS_ERR;
956 }
957
ClientGetSessionCallbackById(int32_t sessionId,ISessionListener * callback)958 int32_t ClientGetSessionCallbackById(int32_t sessionId, ISessionListener *callback)
959 {
960 if (sessionId < 0 || callback == NULL) {
961 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
962 return SOFTBUS_INVALID_PARAM;
963 }
964
965 if (g_clientSessionServerList == NULL) {
966 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
967 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
968 }
969
970 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
971 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
972 return SOFTBUS_LOCK_ERR;
973 }
974
975 ClientSessionServer *serverNode = NULL;
976 SessionInfo *sessionNode = NULL;
977 int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
978 if (ret != SOFTBUS_OK) {
979 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
980 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
981 return SOFTBUS_ERR;
982 }
983
984 ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
985
986 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
987 if (ret != EOK) {
988 return SOFTBUS_ERR;
989 }
990 return SOFTBUS_OK;
991 }
992
ClientGetSessionCallbackByName(const char * sessionName,ISessionListener * callback)993 int32_t ClientGetSessionCallbackByName(const char *sessionName, ISessionListener *callback)
994 {
995 if (sessionName == NULL || callback == NULL) {
996 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
997 return SOFTBUS_INVALID_PARAM;
998 }
999
1000 if (g_clientSessionServerList == NULL) {
1001 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1002 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1003 }
1004
1005 ClientSessionServer *serverNode = NULL;
1006
1007 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1008 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1009 return SOFTBUS_LOCK_ERR;
1010 }
1011
1012 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1013 if (strcmp(serverNode->sessionName, sessionName) != 0) {
1014 continue;
1015 }
1016
1017 int32_t ret = memcpy_s(callback, sizeof(ISessionListener),
1018 &serverNode->listener.session, sizeof(ISessionListener));
1019 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1020 if (ret != EOK) {
1021 return SOFTBUS_ERR;
1022 }
1023 return SOFTBUS_OK;
1024 }
1025
1026 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1027 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
1028 return SOFTBUS_ERR;
1029 }
1030
ClientGetSessionSide(int32_t sessionId)1031 int32_t ClientGetSessionSide(int32_t sessionId)
1032 {
1033 if (g_clientSessionServerList == NULL) {
1034 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1035 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1036 }
1037
1038 int32_t side = -1;
1039 ClientSessionServer *serverNode = NULL;
1040 SessionInfo *sessionNode = NULL;
1041
1042 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1043 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1044 return SOFTBUS_LOCK_ERR;
1045 }
1046
1047 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1048 if (IsListEmpty(&serverNode->sessionList)) {
1049 continue;
1050 }
1051 LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1052 if (sessionNode->sessionId != sessionId) {
1053 continue;
1054 }
1055 side = sessionNode->isServer ? IS_SERVER : IS_CLIENT;
1056 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1057 return side;
1058 }
1059 }
1060 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1061 return side;
1062 }
1063
DestroyClientSessionByNetworkId(const ClientSessionServer * server,const char * networkId,int32_t routeType,ListNode * destroyList)1064 static void DestroyClientSessionByNetworkId(const ClientSessionServer *server,
1065 const char *networkId, int32_t routeType, ListNode *destroyList)
1066 {
1067 SessionInfo *sessionNode = NULL;
1068 SessionInfo *sessionNodeNext = NULL;
1069
1070 LIST_FOR_EACH_ENTRY_SAFE(sessionNode, sessionNodeNext, &(server->sessionList), SessionInfo, node) {
1071 if (strcmp(sessionNode->info.peerDeviceId, networkId) != 0) {
1072 continue;
1073 }
1074 if (routeType != ROUTE_TYPE_ALL && sessionNode->routeType != routeType) {
1075 continue;
1076 }
1077
1078 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSessionByNetworkId info={%d, %d, %d}",
1079 sessionNode->channelId, sessionNode->channelType, sessionNode->routeType);
1080 DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, server);
1081 if (destroyNode == NULL) {
1082 continue;
1083 }
1084 DestroySessionId();
1085 ListDelete(&sessionNode->node);
1086 ListAdd(destroyList, &(destroyNode->node));
1087 SoftBusFree(sessionNode);
1088 }
1089 }
1090
ClientTransLnnOfflineProc(NodeBasicInfo * info)1091 static void ClientTransLnnOfflineProc(NodeBasicInfo *info)
1092 {
1093 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "device offline callback enter.");
1094 if (info == NULL) {
1095 return;
1096 }
1097 if (g_clientSessionServerList == NULL) {
1098 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1099 return;
1100 }
1101
1102 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1103 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1104 return;
1105 }
1106
1107 ClientSessionServer *serverNode = NULL;
1108 ListNode destroyList;
1109 ListInit(&destroyList);
1110 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1111 DestroyClientSessionByNetworkId(serverNode, info->networkId, ROUTE_TYPE_ALL, &destroyList);
1112 }
1113 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1114 (void)ClientDestroySession(&destroyList);
1115 return;
1116 }
1117
1118 static INodeStateCb g_transLnnCb = {
1119 .events = EVENT_NODE_STATE_OFFLINE,
1120 .onNodeOffline = ClientTransLnnOfflineProc,
1121 };
1122
ReCreateSessionServerToServer(void)1123 int32_t ReCreateSessionServerToServer(void)
1124 {
1125 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ReCreateSessionServerToServer");
1126 if (g_clientSessionServerList == NULL) {
1127 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1128 return SOFTBUS_ERR;
1129 }
1130 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1131 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1132 return SOFTBUS_LOCK_ERR;
1133 }
1134
1135 ClientSessionServer *serverNode = NULL;
1136 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1137 int32_t ret = ServerIpcCreateSessionServer(serverNode->pkgName, serverNode->sessionName);
1138 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session name [%s], pkg name [%s], ret [%d]",
1139 serverNode->sessionName, serverNode->pkgName, ret);
1140 }
1141
1142 (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
1143 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ReCreateSessionServerToServer ok");
1144 return SOFTBUS_OK;
1145 }
1146
1147
ClientTransRegLnnOffline(void)1148 void ClientTransRegLnnOffline(void)
1149 {
1150 int32_t ret;
1151 ret = RegNodeDeviceStateCbInner("trans", &g_transLnnCb);
1152 if (ret != SOFTBUS_OK) {
1153 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "reg lnn offline fail");
1154 }
1155 }
1156
ClientTransOnLinkDown(const char * networkId,int32_t routeType)1157 void ClientTransOnLinkDown(const char *networkId, int32_t routeType)
1158 {
1159 if (networkId == NULL || g_clientSessionServerList == NULL) {
1160 return;
1161 }
1162 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientTransOnLinkDown: routeType=%d", routeType);
1163
1164 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1165 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1166 return;
1167 }
1168 ClientSessionServer *serverNode = NULL;
1169 ListNode destroyList;
1170 ListInit(&destroyList);
1171 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1172 DestroyClientSessionByNetworkId(serverNode, networkId, routeType, &destroyList);
1173 }
1174 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1175 (void)ClientDestroySession(&destroyList);
1176 return;
1177 }
1178
ClientGrantPermission(int uid,int pid,const char * busName)1179 int32_t ClientGrantPermission(int uid, int pid, const char *busName)
1180 {
1181 if (uid < 0 || pid < 0 || busName == NULL) {
1182 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid parameter");
1183 return SOFTBUS_ERR;
1184 }
1185 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientGrantPermission: sessionName=%s", busName);
1186
1187 int32_t ret = ServerIpcGrantPermission(uid, pid, busName);
1188 if (ret != SOFTBUS_OK) {
1189 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server grant permission failed, ret=%d", ret);
1190 }
1191 return ret;
1192 }
1193
ClientRemovePermission(const char * busName)1194 int32_t ClientRemovePermission(const char *busName)
1195 {
1196 if (busName == NULL) {
1197 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid parameter");
1198 return SOFTBUS_ERR;
1199 }
1200 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientRemovePermission: sessionName=%s", busName);
1201
1202 int32_t ret = ServerIpcRemovePermission(busName);
1203 if (ret != SOFTBUS_OK) {
1204 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server remove permission failed, ret=%d", ret);
1205 }
1206 return ret;
1207 }
1208
ClientGetFileConfigInfoById(int32_t sessionId,int32_t * fileEncrypt,int32_t * algorithm,int32_t * crc)1209 int32_t ClientGetFileConfigInfoById(int32_t sessionId, int32_t *fileEncrypt, int32_t *algorithm, int32_t *crc)
1210 {
1211 if (sessionId < 0 || fileEncrypt == NULL || algorithm == NULL || crc == NULL) {
1212 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
1213 return SOFTBUS_INVALID_PARAM;
1214 }
1215
1216 if (g_clientSessionServerList == NULL) {
1217 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1218 return SOFTBUS_ERR;
1219 }
1220
1221 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1222 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1223 return SOFTBUS_LOCK_ERR;
1224 }
1225
1226 ClientSessionServer *serverNode = NULL;
1227 SessionInfo *sessionNode = NULL;
1228 int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
1229 if (ret != SOFTBUS_OK) {
1230 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1231 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
1232 return SOFTBUS_NOT_FIND;
1233 }
1234 *fileEncrypt = sessionNode->fileEncrypt;
1235 *algorithm = sessionNode->algorithm;
1236 *crc = sessionNode->crc;
1237 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1238 return SOFTBUS_OK;
1239 }
1240
ClientCleanAllSessionWhenServerDeath(void)1241 void ClientCleanAllSessionWhenServerDeath(void)
1242 {
1243 if (g_clientSessionServerList == NULL) {
1244 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client session server list not init.");
1245 return;
1246 }
1247 uint32_t destroyCnt = 0;
1248 ListNode destroyList;
1249 ListInit(&destroyList);
1250 if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != SOFTBUS_OK) {
1251 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client get session server list lock failed.");
1252 return;
1253 }
1254 ClientSessionServer *serverNode = NULL;
1255 SessionInfo *sessionNode = NULL;
1256 SessionInfo *nextSessionNode = NULL;
1257 LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1258 if (IsListEmpty(&serverNode->sessionList)) {
1259 continue;
1260 }
1261 LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1262 DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, serverNode);
1263 if (destroyNode == NULL) {
1264 continue;
1265 }
1266 ListAdd(&destroyList, &(destroyNode->node));
1267 DestroySessionId();
1268 ListDelete(&sessionNode->node);
1269 SoftBusFree(sessionNode);
1270 ++destroyCnt;
1271 }
1272 }
1273 (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
1274 (void)ClientDestroySession(&destroyList);
1275 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "client destroy session cnt[%d].", destroyCnt);
1276 }
1277