• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "trans_auth_manager.h"
17 
18 #include "auth_channel.h"
19 #include "auth_manager.h"
20 #include "auth_tcp_connection.h"
21 #include "bus_center_manager.h"
22 #include "common_list.h"
23 #include "comm_log.h"
24 #include "lnn_connection_addr_utils.h"
25 #include "lnn_net_builder.h"
26 #include "g_enhance_auth_func.h"
27 #include "g_enhance_auth_func_pack.h"
28 #include "securec.h"
29 #include "softbus_adapter_mem.h"
30 #include "softbus_adapter_thread.h"
31 #include "softbus_def.h"
32 #include "softbus_error_code.h"
33 #include "softbus_feature_config.h"
34 #include "legacy/softbus_hisysevt_transreporter.h"
35 #include "softbus_utils.h"
36 #include "softbus_init_common.h"
37 #include "legacy/softbus_adapter_hitrace.h"
38 #include "trans_auth_message.h"
39 #include "trans_channel_common.h"
40 #include "trans_channel_limit.h"
41 #include "trans_event.h"
42 #include "trans_session_manager.h"
43 #include "trans_channel_manager.h"
44 #include "trans_log.h"
45 #include "trans_lane_manager.h"
46 #include "wifi_direct_manager.h"
47 
48 #define AUTH_CHANNEL_REQ 0
49 #define AUTH_CHANNEL_REPLY 1
50 
51 #define IPV4_TYPE 1
52 #define IPV6_TYPE 2
53 
54 #define AUTH_GROUP_ID "auth group id"
55 #define AUTH_SESSION_KEY "auth session key"
56 #define ISHARE_AUTH_SESSION "IShareAuthSession"
57 #define DM_PKG_NAME "ohos.distributedhardware.devicemanager.resident"
58 
59 const char *g_serviceForAction[] = {
60     "IShareAuthSession",
61 };
62 
63 #define SERVICE_FOR_ACTION_LEN (sizeof(g_serviceForAction) / sizeof(g_serviceForAction[0]))
64 
65 typedef struct {
66     int32_t channelType;
67     int32_t businessType;
68     ConfigType configType;
69 } ConfigTypeMap;
70 
71 static SoftBusList *g_authChannelList = NULL;
72 static IServerChannelCallBack *g_cb = NULL;
73 
74 static void TransPostAuthChannelErrMsg(int32_t authId, int32_t errcode, const char *errMsg);
75 static int32_t TransPostAuthChannelMsg(const AppInfo *appInfo, int32_t authId, int32_t flag);
76 static AuthChannelInfo *CreateAuthChannelInfo(const char *sessionName, bool isClient);
77 static int32_t AddAuthChannelInfo(AuthChannelInfo *info);
78 static void DelAuthChannelInfoByChanId(int32_t channelId);
79 static void DelAuthChannelInfoByAuthId(int32_t authId);
80 
GetAuthChannelListHead(void)81 SoftBusList *GetAuthChannelListHead(void)
82 {
83     return g_authChannelList;
84 }
85 
GetAuthChannelLock(void)86 int32_t GetAuthChannelLock(void)
87 {
88     if (g_authChannelList == NULL) {
89         TRANS_LOGE(TRANS_SVC, "g_authChannelList not init");
90         return SOFTBUS_NO_INIT;
91     }
92     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
93         TRANS_LOGE(TRANS_SVC, "lock failed");
94         return SOFTBUS_LOCK_ERR;
95     }
96     return SOFTBUS_OK;
97 }
98 
ReleaseAuthChannelLock(void)99 void ReleaseAuthChannelLock(void)
100 {
101     if (g_authChannelList == NULL) {
102         TRANS_LOGE(TRANS_SVC, "g_authChannelList not init");
103         return;
104     }
105     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
106 }
107 
GetAuthChannelInfoByChanId(int32_t channelId,AuthChannelInfo * dstInfo)108 static int32_t GetAuthChannelInfoByChanId(int32_t channelId, AuthChannelInfo *dstInfo)
109 {
110     if (g_authChannelList == NULL) {
111         TRANS_LOGE(TRANS_SVC, "invalid param");
112         return SOFTBUS_INVALID_PARAM;
113     }
114 
115     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
116         TRANS_LOGE(TRANS_SVC, "lock failed");
117         return SOFTBUS_LOCK_ERR;
118     }
119     AuthChannelInfo *info = NULL;
120     LIST_FOR_EACH_ENTRY(info, &g_authChannelList->list, AuthChannelInfo, node) {
121         if (info->appInfo.myData.channelId == channelId) {
122             if (memcpy_s(dstInfo, sizeof(AuthChannelInfo), info, sizeof(AuthChannelInfo)) != EOK) {
123                 TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
124                 (void)SoftBusMutexUnlock(&g_authChannelList->lock);
125                 return SOFTBUS_MEM_ERR;
126             }
127             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
128             return SOFTBUS_OK;
129         }
130     }
131     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
132     return SOFTBUS_TRANS_NODE_NOT_FOUND;
133 }
134 
GetAuthIdByChannelId(int32_t channelId)135 static int32_t GetAuthIdByChannelId(int32_t channelId)
136 {
137     if (g_authChannelList == NULL) {
138         return SOFTBUS_NO_INIT;
139     }
140 
141     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
142         TRANS_LOGE(TRANS_SVC, "lock failed");
143         return SOFTBUS_LOCK_ERR;
144     }
145     int32_t authId = AUTH_INVALID_ID;
146     AuthChannelInfo *info = NULL;
147     LIST_FOR_EACH_ENTRY(info, &g_authChannelList->list, AuthChannelInfo, node) {
148         if (info->appInfo.myData.channelId == channelId) {
149             authId = info->authId;
150             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
151             return authId;
152         }
153     }
154     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
155     return authId;
156 }
157 
GetChannelInfoByAuthId(int32_t authId,AuthChannelInfo * dstInfo)158 static int32_t GetChannelInfoByAuthId(int32_t authId, AuthChannelInfo *dstInfo)
159 {
160     if (dstInfo == NULL || g_authChannelList == NULL) {
161         return SOFTBUS_INVALID_PARAM;
162     }
163 
164     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
165         TRANS_LOGE(TRANS_SVC, "lock failed");
166         return SOFTBUS_LOCK_ERR;
167     }
168     AuthChannelInfo *info = NULL;
169     LIST_FOR_EACH_ENTRY(info, &g_authChannelList->list, AuthChannelInfo, node) {
170         if (info->authId == authId) {
171             if (memcpy_s(dstInfo, sizeof(AuthChannelInfo), info, sizeof(AuthChannelInfo)) != EOK) {
172                 (void)SoftBusMutexUnlock(&g_authChannelList->lock);
173                 return SOFTBUS_MEM_ERR;
174             }
175             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
176             return SOFTBUS_OK;
177         }
178     }
179     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
180     return SOFTBUS_TRANS_NODE_NOT_FOUND;
181 }
182 
NotifyOpenAuthChannelSuccess(const AppInfo * appInfo,bool isServer)183 static int32_t NotifyOpenAuthChannelSuccess(const AppInfo *appInfo, bool isServer)
184 {
185     ChannelInfo channelInfo = {0};
186     channelInfo.channelType = CHANNEL_TYPE_AUTH;
187     channelInfo.isServer = isServer;
188     channelInfo.isEnabled = true;
189     channelInfo.channelId = appInfo->myData.channelId;
190     channelInfo.peerDeviceId = strlen(appInfo->peerNetWorkId) == 0 ?
191         (char *)appInfo->peerData.deviceId : (char *)appInfo->peerNetWorkId;
192     channelInfo.peerSessionName = (char *)appInfo->peerData.sessionName;
193     channelInfo.businessType = BUSINESS_TYPE_NOT_CARE;
194     channelInfo.groupId = (char *)AUTH_GROUP_ID;
195     channelInfo.isEncrypt = false;
196     channelInfo.sessionKey = (char *)AUTH_SESSION_KEY;
197     channelInfo.keyLen = strlen(channelInfo.sessionKey) + 1;
198     channelInfo.autoCloseTime = appInfo->autoCloseTime;
199     channelInfo.reqId = (char *)appInfo->reqId;
200     channelInfo.dataConfig = appInfo->myData.dataConfig;
201     channelInfo.timeStart = appInfo->timeStart;
202     channelInfo.connectType = appInfo->connectType;
203     channelInfo.routeType = appInfo->routeType;
204     channelInfo.osType = appInfo->osType;
205     return g_cb->OnChannelOpened(appInfo->myData.pkgName, appInfo->myData.pid,
206         appInfo->myData.sessionName, &channelInfo);
207 }
208 
NotifyOpenAuthChannelFailed(const char * pkgName,int32_t pid,int32_t channelId,int32_t errCode)209 int32_t NotifyOpenAuthChannelFailed(const char *pkgName, int32_t pid, int32_t channelId, int32_t errCode)
210 {
211     return g_cb->OnChannelOpenFailed(pkgName, pid, channelId, CHANNEL_TYPE_AUTH, errCode);
212 }
213 
NotifyCloseAuthChannel(const char * pkgName,int32_t pid,int32_t channelId)214 static int32_t NotifyCloseAuthChannel(const char *pkgName, int32_t pid, int32_t channelId)
215 {
216     return g_cb->OnChannelClosed(pkgName, pid, channelId, CHANNEL_TYPE_AUTH, MESSAGE_TYPE_NOMAL);
217 }
218 
AuthGetUidAndPidBySessionName(const char * sessionName,int32_t * uid,int32_t * pid)219 static int32_t AuthGetUidAndPidBySessionName(const char *sessionName, int32_t *uid, int32_t *pid)
220 {
221     return g_cb->GetUidAndPidBySessionName(sessionName, uid, pid);
222 }
223 
NotifyOnDataReceived(int32_t authId,const void * data,uint32_t len)224 static int32_t NotifyOnDataReceived(int32_t authId, const void *data, uint32_t len)
225 {
226     AuthChannelInfo channel;
227     int32_t ret = GetChannelInfoByAuthId(authId, &channel);
228     if (ret != SOFTBUS_OK) {
229         TRANS_LOGE(TRANS_SVC, "GetChannelInfoByAuthId failed");
230         return ret;
231     }
232     TransReceiveData receiveData;
233     receiveData.data = (void *)data;
234     receiveData.dataLen = len;
235     receiveData.dataType = TRANS_SESSION_BYTES;
236 
237     return g_cb->OnDataReceived(channel.appInfo.myData.pkgName, channel.appInfo.myData.pid,
238         channel.appInfo.myData.channelId, CHANNEL_TYPE_AUTH, &receiveData);
239 }
240 
CopyPeerAppInfo(AppInfo * recvAppInfo,AppInfo * channelAppInfo)241 static int32_t CopyPeerAppInfo(AppInfo *recvAppInfo, AppInfo *channelAppInfo)
242 {
243     if (memcpy_s(channelAppInfo->peerData.deviceId, DEVICE_ID_SIZE_MAX,
244                  recvAppInfo->peerData.deviceId, DEVICE_ID_SIZE_MAX) != EOK ||
245         memcpy_s(recvAppInfo->myData.deviceId, DEVICE_ID_SIZE_MAX,
246                  channelAppInfo->myData.deviceId, DEVICE_ID_SIZE_MAX) != EOK ||
247         memcpy_s(channelAppInfo->peerData.pkgName, PKG_NAME_SIZE_MAX,
248                  recvAppInfo->peerData.pkgName, PKG_NAME_SIZE_MAX) != EOK ||
249         memcpy_s(recvAppInfo->myData.pkgName, PKG_NAME_SIZE_MAX,
250                  channelAppInfo->myData.pkgName, PKG_NAME_SIZE_MAX) != EOK ||
251         memcpy_s(channelAppInfo->peerData.sessionName, SESSION_NAME_SIZE_MAX,
252                  recvAppInfo->peerData.sessionName, SESSION_NAME_SIZE_MAX) != EOK) {
253         return SOFTBUS_MEM_ERR;
254     }
255     return SOFTBUS_OK;
256 }
257 
InitAuthChannelInfo(int32_t authId,AuthChannelInfo * item,AppInfo * appInfo)258 static int32_t InitAuthChannelInfo(int32_t authId, AuthChannelInfo *item, AppInfo *appInfo)
259 {
260     item->authId = authId;
261     appInfo->myData.channelId = item->appInfo.myData.channelId;
262     appInfo->myData.dataConfig = item->appInfo.myData.dataConfig;
263     item->connOpt.socketOption.moduleId = AUTH_RAW_P2P_SERVER;
264     if (memcpy_s(item->appInfo.reqId, REQ_ID_SIZE_MAX, appInfo->reqId, REQ_ID_SIZE_MAX) != EOK) {
265         TRANS_LOGE(TRANS_SVC, "copy serverReqId fail, reqId=%{public}s", appInfo->reqId);
266         return SOFTBUS_MEM_ERR;
267     }
268     if (appInfo->linkType == LANE_HML_RAW) {
269         item->appInfo.linkType = appInfo->linkType;
270         if (memcpy_s(item->appInfo.peerData.addr, IP_LEN, appInfo->peerData.addr, IP_LEN) != EOK ||
271             memcpy_s(item->appInfo.myData.addr, IP_LEN, appInfo->myData.addr, IP_LEN) != EOK) {
272             char *localIp = NULL;
273             char *remoteIp = NULL;
274             Anonymize(appInfo->myData.addr, &localIp);
275             Anonymize(appInfo->peerData.addr, &remoteIp);
276             TRANS_LOGE(TRANS_CTRL, "copy localIp and remoteIp fail localIp=%{public}s, remoteIp=%{public}s",
277                 AnonymizeWrapper(localIp), AnonymizeWrapper(remoteIp));
278             AnonymizeFree(localIp);
279             AnonymizeFree(remoteIp);
280             return SOFTBUS_MEM_ERR;
281         }
282     }
283     return SOFTBUS_OK;
284 }
285 
OnRequsetUpdateAuthChannel(int32_t authId,AppInfo * appInfo)286 static int32_t OnRequsetUpdateAuthChannel(int32_t authId, AppInfo *appInfo)
287 {
288     AuthChannelInfo *item = NULL;
289     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
290         TRANS_LOGE(TRANS_SVC, "lock failed, authId=%{public}d", authId);
291         return SOFTBUS_LOCK_ERR;
292     }
293     bool exists = false;
294     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
295         if (item->authId == authId) {
296             exists = true;
297             break;
298         }
299     }
300     int32_t ret = SOFTBUS_OK;
301     if (!exists) {
302         item = CreateAuthChannelInfo(appInfo->myData.sessionName, false);
303         if (item == NULL) {
304             TRANS_LOGE(TRANS_SVC, "CreateAuthChannelInfo failed, authId=%{public}d", authId);
305             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
306             return SOFTBUS_TRANS_AUTH_CREATE_CHANINFO_FAIL;
307         }
308         ret = InitAuthChannelInfo(authId, item, appInfo);
309         if (ret != SOFTBUS_OK) {
310             TRANS_LOGE(TRANS_SVC, "init auth channel info failed, ret=%{public}d, authId=%{public}d", ret, authId);
311             SoftBusFree(item);
312             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
313             return ret;
314         }
315         ret = AddAuthChannelInfo(item);
316         if (ret != SOFTBUS_OK) {
317             TRANS_LOGE(TRANS_SVC, "AddAuthChannelInfo failed");
318             SoftBusFree(item);
319             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
320             return ret;
321         }
322     }
323     ret = CopyPeerAppInfo(appInfo, &(item->appInfo));
324     if (ret != SOFTBUS_OK) {
325         ListDelete(&item->node);
326         TRANS_LOGE(TRANS_CTRL, "copy peer appInfo failed ret=%{public}d, delete channelId=%{public}" PRId64,
327             ret, item->appInfo.myData.channelId);
328         SoftBusFree(item);
329         g_authChannelList->cnt--;
330         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
331         return SOFTBUS_MEM_ERR;
332     }
333     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
334     return SOFTBUS_OK;
335 }
336 
337 static const ConfigTypeMap g_configTypeMap[] = {
338     {CHANNEL_TYPE_AUTH, BUSINESS_TYPE_BYTE, SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH},
339     {CHANNEL_TYPE_AUTH, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH},
340 };
341 
FindConfigType(int32_t channelType,int32_t businessType)342 static int32_t FindConfigType(int32_t channelType, int32_t businessType)
343 {
344     uint32_t size = (uint32_t)(sizeof(g_configTypeMap) / sizeof(g_configTypeMap[0]));
345     for (uint32_t i = 0; i < size; i++) {
346         if ((g_configTypeMap[i].channelType == channelType) && (g_configTypeMap[i].businessType == businessType)) {
347             return g_configTypeMap[i].configType;
348         }
349     }
350     return SOFTBUS_CONFIG_TYPE_MAX;
351 }
352 
TransGetLocalConfig(int32_t channelType,int32_t businessType,uint32_t * len)353 static int32_t TransGetLocalConfig(int32_t channelType, int32_t businessType, uint32_t *len)
354 {
355     ConfigType configType = (ConfigType)FindConfigType(channelType, businessType);
356     if (configType == SOFTBUS_CONFIG_TYPE_MAX) {
357         TRANS_LOGE(TRANS_SVC, "Invalid channelType=%{public}d, businessType=%{public}d", channelType, businessType);
358         return SOFTBUS_INVALID_PARAM;
359     }
360     uint32_t maxLen;
361     if (SoftbusGetConfig(configType, (unsigned char *)&maxLen, sizeof(maxLen)) != SOFTBUS_OK) {
362         TRANS_LOGE(TRANS_SVC, "get fail configType=%{public}d", configType);
363         return SOFTBUS_GET_CONFIG_VAL_ERR;
364     }
365     *len = maxLen;
366     TRANS_LOGI(TRANS_SVC, "get appinfo local config len=%{public}d", *len);
367     return SOFTBUS_OK;
368 }
369 
TransAuthFillDataConfig(AppInfo * appInfo)370 static int32_t TransAuthFillDataConfig(AppInfo *appInfo)
371 {
372     if (appInfo == NULL) {
373         TRANS_LOGE(TRANS_SVC, "appInfo is null");
374         return SOFTBUS_INVALID_PARAM;
375     }
376     appInfo->businessType = BUSINESS_TYPE_BYTE;
377     if (appInfo->peerData.dataConfig != 0) {
378         uint32_t localDataConfig = 0;
379         int32_t ret = TransGetLocalConfig(CHANNEL_TYPE_AUTH, appInfo->businessType, &localDataConfig);
380         if (ret != SOFTBUS_OK) {
381             TRANS_LOGE(TRANS_SVC, "get local config failed");
382             return ret;
383         }
384         appInfo->myData.dataConfig = MIN(localDataConfig, appInfo->peerData.dataConfig);
385         TRANS_LOGI(TRANS_SVC, "fill dataConfig succ. dataConfig=%{public}u", appInfo->myData.dataConfig);
386         return SOFTBUS_OK;
387     }
388     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
389         SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH : SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH;
390     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
391         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
392         TRANS_LOGE(TRANS_SVC, "get config failed, configType=%{public}d", configType);
393         return SOFTBUS_GET_CONFIG_VAL_ERR;
394     }
395     TRANS_LOGI(TRANS_SVC, "fill dataConfig=%{public}d", appInfo->myData.dataConfig);
396     return SOFTBUS_OK;
397 }
398 
TransAuthCloseChannel(int32_t authId,int32_t linkType,bool isClient)399 static void TransAuthCloseChannel(int32_t authId, int32_t linkType, bool isClient)
400 {
401     TRANS_LOGI(TRANS_SVC, "authId=%{public}d, linkType=%{public}d, isClient=%{public}d", authId, linkType, isClient);
402     if (linkType == LANE_HML_RAW && isClient) {
403         AuthCloseChannel(authId, AUTH_RAW_P2P_CLIENT);
404     } else if (linkType == LANE_HML_RAW && !isClient) {
405         AuthCloseChannel(authId, AUTH_RAW_P2P_SERVER);
406     } else if (linkType == LANE_USB) {
407         AuthCloseChannel(authId, AUTH_USB);
408     } else {
409         AuthCloseChannel(authId, AUTH);
410     }
411 }
412 
TransHandleErrorAndCloseChannel(TransEventExtra * extra,int32_t authId,int32_t linkType,bool isClient,int32_t ret)413 static void TransHandleErrorAndCloseChannel(TransEventExtra *extra, int32_t authId, int32_t linkType, bool isClient,
414     int32_t ret)
415 {
416     if (extra != NULL && extra->socketName != NULL) {
417         extra->result = EVENT_STAGE_RESULT_FAILED;
418         extra->errcode = ret;
419         TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_REPLY, *extra);
420     }
421 
422     DelAuthChannelInfoByAuthId(authId);
423     TransAuthCloseChannel(authId, linkType, isClient);
424 }
425 
TransHandleAuthChannelSetupProcess(TransEventExtra * extra,int32_t authId,AppInfo * appInfo)426 static void TransHandleAuthChannelSetupProcess(TransEventExtra *extra, int32_t authId, AppInfo *appInfo)
427 {
428     int32_t ret = AuthGetUidAndPidBySessionName(
429         appInfo->myData.sessionName, &appInfo->myData.uid, &appInfo->myData.pid);
430     if (ret != SOFTBUS_OK) {
431         TRANS_LOGE(TRANS_SVC, "auth get id by sessionName failed and send msg to peer");
432         TransPostAuthChannelErrMsg(authId, ret, "session not created");
433         TransHandleErrorAndCloseChannel(extra, authId, appInfo->linkType, appInfo->isClient, ret);
434         return;
435     }
436     ret = TransAuthFillDataConfig(appInfo);
437     if (ret != SOFTBUS_OK) {
438         TRANS_LOGE(TRANS_SVC, "TransAuthFillDataConfig failed");
439         TransHandleErrorAndCloseChannel(extra, authId, appInfo->linkType, appInfo->isClient, ret);
440         return;
441     }
442     ret = OnRequsetUpdateAuthChannel(authId, appInfo);
443     if (ret != SOFTBUS_OK) {
444         TRANS_LOGE(TRANS_SVC, "update auth channel failed");
445         TransPostAuthChannelErrMsg(authId, ret, "unpackRequest");
446         TransHandleErrorAndCloseChannel(extra, authId, appInfo->linkType, appInfo->isClient, ret);
447         return;
448     }
449     extra->result = EVENT_STAGE_RESULT_OK;
450     extra->channelId = appInfo->myData.channelId;
451     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_START, *extra);
452     ret = NotifyOpenAuthChannelSuccess(appInfo, true);
453     if (ret != SOFTBUS_OK) {
454         TRANS_LOGE(TRANS_SVC, "Notify Open Auth Channel send request failed, ret=%{public}d", ret);
455         TransPostAuthChannelErrMsg(authId, ret, "NotifyOpenAuthChannelSuccess failed");
456         TransHandleErrorAndCloseChannel(extra, authId, appInfo->linkType, appInfo->isClient, ret);
457         return;
458     }
459     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_REPLY, *extra);
460 }
461 
OnRecvAuthChannelRequest(int32_t authId,const char * data,int32_t len)462 static void OnRecvAuthChannelRequest(int32_t authId, const char *data, int32_t len)
463 {
464     if (data == NULL || len <= 0) {
465         return;
466     }
467 
468     TransEventExtra extra = {
469         .peerNetworkId = NULL,
470         .calleePkg = NULL,
471         .callerPkg = NULL,
472         .socketName = NULL,
473         .channelType = CHANNEL_TYPE_AUTH,
474         .authId = authId
475     };
476     char localUdid[UDID_BUF_LEN] = { 0 };
477     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, UDID_BUF_LEN) == SOFTBUS_OK) {
478         extra.localUdid = localUdid;
479     }
480     AppInfo appInfo;
481     (void)memset_s(&appInfo, sizeof(AppInfo), 0, sizeof(AppInfo));
482     int32_t ret = TransAuthChannelMsgUnpack(data, &appInfo, len);
483     if (ret != SOFTBUS_OK) {
484         TRANS_LOGE(TRANS_SVC, "unpackRequest failed");
485         TransPostAuthChannelErrMsg(authId, ret, "unpackRequest");
486         TransHandleErrorAndCloseChannel(&extra, authId, appInfo.linkType, appInfo.isClient, ret);
487         return;
488     }
489     extra.socketName = appInfo.myData.sessionName;
490     extra.peerUdid = appInfo.peerData.deviceId;
491     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_START, extra);
492     if (!CheckSessionNameValidOnAuthChannel(appInfo.myData.sessionName)) {
493         TRANS_LOGE(TRANS_SVC, "check auth channel pkginfo invalid.");
494         TransPostAuthChannelErrMsg(authId, SOFTBUS_TRANS_AUTH_NOTALLOW_OPENED, "check msginfo failed");
495         TransHandleErrorAndCloseChannel(&extra, authId, appInfo.linkType, appInfo.isClient,
496             SOFTBUS_TRANS_INVALID_SESSION_NAME);
497         return;
498     }
499 
500     TransHandleAuthChannelSetupProcess(&extra, authId, &appInfo);
501 }
502 
TransAuthProcessDataConfig(AppInfo * appInfo)503 static int32_t TransAuthProcessDataConfig(AppInfo *appInfo)
504 {
505     if (appInfo == NULL) {
506         TRANS_LOGE(TRANS_SVC, "appInfo is null");
507         return SOFTBUS_INVALID_PARAM;
508     }
509     if (appInfo->businessType != BUSINESS_TYPE_MESSAGE && appInfo->businessType != BUSINESS_TYPE_BYTE) {
510         TRANS_LOGI(TRANS_SVC, "invalid businessType=%{public}d", appInfo->businessType);
511         return SOFTBUS_OK;
512     }
513     if (appInfo->peerData.dataConfig != 0) {
514         appInfo->myData.dataConfig = MIN(appInfo->myData.dataConfig, appInfo->peerData.dataConfig);
515         TRANS_LOGI(TRANS_SVC, "process dataConfig succ. dataConfig=%{public}u", appInfo->myData.dataConfig);
516         return SOFTBUS_OK;
517     }
518     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
519         SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH : SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH;
520     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
521         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
522         TRANS_LOGE(TRANS_SVC, "get config failed, configType=%{public}d", configType);
523         return SOFTBUS_GET_CONFIG_VAL_ERR;
524     }
525     TRANS_LOGI(TRANS_SVC, "process dataConfig=%{public}d", appInfo->myData.dataConfig);
526     return SOFTBUS_OK;
527 }
528 
FillExtraByAuthChannelErrorEnd(TransEventExtra * extra,AuthChannelInfo * info,int32_t ret)529 static void FillExtraByAuthChannelErrorEnd(TransEventExtra *extra, AuthChannelInfo *info, int32_t ret)
530 {
531     if (extra == NULL || info == NULL) {
532         TRANS_LOGE(TRANS_SVC, "invalid param.");
533         return;
534     }
535     extra->result = EVENT_STAGE_RESULT_FAILED;
536     extra->errcode = ret;
537     extra->localUdid = info->appInfo.myData.deviceId;
538     if (strlen(info->appInfo.peerVersion) == 0) {
539         TransGetRemoteDeviceVersion(extra->peerUdid, CATEGORY_UDID, info->appInfo.peerVersion,
540             sizeof(info->appInfo.peerVersion));
541     }
542     extra->peerDevVer = info->appInfo.peerVersion;
543 }
544 
InitExtra(TransEventExtra * extra,const AuthChannelInfo * info,int32_t authId)545 static void InitExtra(TransEventExtra *extra, const AuthChannelInfo *info, int32_t authId)
546 {
547     extra->peerNetworkId = NULL;
548     extra->calleePkg = NULL;
549     extra->callerPkg = NULL;
550     extra->socketName = info->appInfo.myData.sessionName;
551     extra->channelId = info->appInfo.myData.channelId;
552     extra->channelType = CHANNEL_TYPE_AUTH;
553     extra->authId = authId;
554     extra->linkType = info->connOpt.type;
555     extra->osType = (info->appInfo.osType < 0) ? UNKNOW_OS_TYPE : info->appInfo.osType;
556 }
557 
ChannelReplyErrProc(TransEventExtra * extra,int32_t errorCode,AuthChannelInfo * info,int32_t authId)558 static void ChannelReplyErrProc(TransEventExtra *extra, int32_t errorCode, AuthChannelInfo *info, int32_t authId)
559 {
560     FillExtraByAuthChannelErrorEnd(extra, info, errorCode);
561     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_OPEN_CHANNEL_END, *extra);
562     TransAuthCloseChannel(authId, info->appInfo.linkType, info->isClient);
563     (void)TransLaneMgrDelLane(info->appInfo.myData.channelId, CHANNEL_TYPE_AUTH, true);
564     DelAuthChannelInfoByChanId((int32_t)(info->appInfo.myData.channelId));
565     (void)NotifyOpenAuthChannelFailed((const char *)(info->appInfo.myData.pkgName),
566         (int32_t)(info->appInfo.myData.pid), (int32_t)(info->appInfo.myData.channelId), errorCode);
567 }
568 
TransAuthGetPeerUdidByChanId(int32_t channelId,char * peerUdid,uint32_t len)569 int32_t TransAuthGetPeerUdidByChanId(int32_t channelId, char *peerUdid, uint32_t len)
570 {
571     if (len < DEVICE_ID_SIZE_MAX || peerUdid == NULL) {
572         TRANS_LOGE(TRANS_SVC, "param err");
573         return SOFTBUS_INVALID_PARAM;
574     }
575     AuthChannelInfo info;
576     int32_t ret = GetAuthChannelInfoByChanId(channelId, &info);
577     if (ret != SOFTBUS_OK) {
578         TRANS_LOGE(TRANS_SVC, "get channel info by chanId failed. chanId=%{public}d", channelId);
579         return ret;
580     }
581     if (strlen(info.appInfo.peerUdid) != 0) {
582         if (memcpy_s(peerUdid, len, info.appInfo.peerUdid, DEVICE_ID_SIZE_MAX) != EOK) {
583             return SOFTBUS_MEM_ERR;
584         }
585     } else {
586         if (memcpy_s(peerUdid, len, info.appInfo.peerData.deviceId, DEVICE_ID_SIZE_MAX) != EOK) {
587             return SOFTBUS_MEM_ERR;
588         }
589     }
590     return SOFTBUS_OK;
591 }
592 
LnnSvrJoinCallback(const ConnectionAddr * connAddr,int32_t errCode)593 static void LnnSvrJoinCallback(const ConnectionAddr *connAddr, int32_t errCode)
594 {
595     SoftBusHitraceChainBegin("LnnSvrJoinCallback");
596     if (connAddr == NULL) {
597         TRANS_LOGE(TRANS_SVC, "invalid param");
598         SoftBusHitraceChainEnd();
599         return;
600     }
601     TRANS_LOGI(TRANS_SVC, "LnnSvrJoinCallback enter");
602     AuthChannelInfo info;
603     int32_t ret = GetAuthChannelInfoByChanId(connAddr->info.session.channelId, &info);
604     if (ret != SOFTBUS_OK) {
605         TRANS_LOGE(TRANS_SVC, "get channel info by chanId failed. chanId=%{public}d", connAddr->info.session.channelId);
606         SoftBusHitraceChainEnd();
607         return;
608     }
609 
610     TransEventExtra extra;
611     (void)memset_s(&extra, sizeof(TransEventExtra), 0, sizeof(TransEventExtra));
612     InitExtra(&extra, &info, info.authId);
613     extra.peerUdid = strlen(info.appInfo.peerUdid) != 0 ? info.appInfo.peerUdid : info.appInfo.peerData.deviceId;
614     if (errCode != SOFTBUS_OK) {
615         TRANS_LOGE(TRANS_SVC, "LnnServerJoinExt failed, chanId=%{public}d, errCode=%{public}d",
616             connAddr->info.session.channelId, errCode);
617     }
618     extra.result = EVENT_STAGE_RESULT_OK;
619     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_REPLY, extra);
620     ret = NotifyOpenAuthChannelSuccess(&info.appInfo, false);
621     if (ret != SOFTBUS_OK) {
622         TRANS_LOGE(TRANS_SVC, "NotifyOpenAuthChannelSuccess failed");
623         ChannelReplyErrProc(&extra, ret, &info, info.authId);
624     }
625     SoftBusHitraceChainEnd();
626 }
627 
UpdateChannelInfo(int32_t authId,const AuthChannelInfo * info)628 static int32_t UpdateChannelInfo(int32_t authId, const AuthChannelInfo *info)
629 {
630     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
631         TRANS_LOGE(TRANS_SVC, "lock failed");
632         return SOFTBUS_LOCK_ERR;
633     }
634     AuthChannelInfo *item = NULL;
635     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
636         if (item->authId == authId) {
637             if (memcpy_s(&(item->appInfo), sizeof(item->appInfo), &(info->appInfo), sizeof(info->appInfo)) != EOK) {
638                 (void)SoftBusMutexUnlock(&g_authChannelList->lock);
639                 return SOFTBUS_MEM_ERR;
640             }
641             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
642             return SOFTBUS_OK;
643         }
644     }
645     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
646     return SOFTBUS_TRANS_NODE_NOT_FOUND;
647 }
648 
AdaptLnnServerJoinExt(int64_t channelId)649 static int32_t AdaptLnnServerJoinExt(int64_t channelId)
650 {
651     ConnectionAddr connAddr;
652     (void)memset_s(&connAddr, sizeof(ConnectionAddr), 0, sizeof(ConnectionAddr));
653     connAddr.type = CONNECTION_ADDR_SESSION;
654     connAddr.info.session.channelId = channelId;
655     LnnServerJoinExtCallBack svrJoinCallBack = {
656         .lnnServerJoinExtCallback = LnnSvrJoinCallback,
657     };
658     return LnnServerJoinExt(&connAddr, &svrJoinCallBack);
659 }
660 
OnRecvAuthChannelReply(int32_t authId,const char * data,int32_t len)661 static void OnRecvAuthChannelReply(int32_t authId, const char *data, int32_t len)
662 {
663     if (data == NULL || len <= 0) {
664         return;
665     }
666     AuthChannelInfo info;
667     if (GetChannelInfoByAuthId(authId, &info) != SOFTBUS_OK) {
668         TRANS_LOGE(TRANS_SVC, "can not find channel info by auth id");
669         return;
670     }
671     TransEventExtra extra;
672     (void)memset_s(&extra, sizeof(TransEventExtra), 0, sizeof(TransEventExtra));
673     InitExtra(&extra, &info, authId);
674     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_REPLY, extra);
675     int32_t ret = TransAuthChannelMsgUnpack(data, &info.appInfo, len);
676     if (ret != SOFTBUS_OK) {
677         TRANS_LOGE(TRANS_SVC, "unpackReply failed");
678         ChannelReplyErrProc(&extra, ret, &info, authId);
679         return;
680     }
681     extra.peerUdid = strlen(info.appInfo.peerUdid) != 0 ? info.appInfo.peerUdid : info.appInfo.peerData.deviceId;
682     ret = TransAuthProcessDataConfig(&info.appInfo);
683     if (ret != SOFTBUS_OK) {
684         TRANS_LOGE(TRANS_SVC, "ProcessDataConfig failed");
685         ChannelReplyErrProc(&extra, ret, &info, authId);
686         return;
687     }
688     extra.result = EVENT_STAGE_RESULT_OK;
689     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_REPLY, extra);
690 
691     if (info.accountInfo) {
692         TRANS_LOGI(TRANS_SVC, "accountInfo=%{public}d, authId=%{public}d, channelId=%{public}" PRId64,
693             info.accountInfo, info.authId, info.appInfo.myData.channelId);
694         if (UpdateChannelInfo(authId, &info) != SOFTBUS_OK) {
695             TRANS_LOGE(TRANS_SVC, "update channelInfo failed, authId=%{public}d", info.authId);
696             return;
697         }
698         int64_t channelId = info.appInfo.myData.channelId;
699         ret = AdaptLnnServerJoinExt(channelId);
700         if (ret == SOFTBUS_OK) {
701             return;
702         }
703         TRANS_LOGI(TRANS_SVC, "adapt LnnServerJoinExt fail, channelId=%{public}" PRId64, channelId);
704     }
705 
706     ret = NotifyOpenAuthChannelSuccess(&info.appInfo, false);
707     if (ret != SOFTBUS_OK) {
708         TRANS_LOGE(TRANS_SVC, "NotifyOpenAuthChannelSuccess failed");
709         ChannelReplyErrProc(&extra, ret, &info, authId);
710     }
711 }
712 
OnAuthChannelDataRecv(int32_t authId,const AuthChannelData * data)713 static void OnAuthChannelDataRecv(int32_t authId, const AuthChannelData *data)
714 {
715     SoftBusHitraceChainBegin("OnAuthChannelDataRecv");
716     if (data == NULL || data->data == NULL || data->len < 1) {
717         TRANS_LOGW(TRANS_SVC, "invalid param.");
718         SoftBusHitraceChainEnd();
719         return;
720     }
721 
722     if (data->flag == AUTH_CHANNEL_REQ) {
723         OnRecvAuthChannelRequest(authId, (const char *)data->data, (int32_t)data->len);
724     } else if (data->flag == AUTH_CHANNEL_REPLY) {
725         OnRecvAuthChannelReply(authId, (const char *)data->data, (int32_t)data->len);
726     } else {
727         TRANS_LOGE(TRANS_SVC, "auth channel flags err, authId=%{public}d", authId);
728     }
729     SoftBusHitraceChainEnd();
730 }
731 
OnAuthMsgDataRecv(int32_t authId,const AuthChannelData * data)732 static void OnAuthMsgDataRecv(int32_t authId, const AuthChannelData *data)
733 {
734     if (data == NULL || data->data == NULL) {
735         return;
736     }
737     if (NotifyOnDataReceived(authId, data->data, data->len) != SOFTBUS_OK) {
738         TRANS_LOGE(TRANS_SVC, "recv MODULE_AUTH_MSG err. authId=%{public}d", authId);
739     }
740 }
741 
OnDisconnect(int32_t authId)742 static void OnDisconnect(int32_t authId)
743 {
744     AuthChannelInfo dstInfo;
745     if (GetChannelInfoByAuthId(authId, &dstInfo) != EOK) {
746         TRANS_LOGE(TRANS_SVC, "channel already removed. authId=%{public}d", authId);
747         return;
748     }
749     TRANS_LOGI(TRANS_SVC, "recv channel disconnect event. authId=%{public}d", authId);
750 
751     // If it is an ishare session, clean up the auth manager
752     if (strcmp(dstInfo.appInfo.myData.sessionName, ISHARE_AUTH_SESSION) == 0) {
753         DelAuthMetaManagerByConnectionIdPacked(authId);
754     }
755     TransAuthCloseChannel(authId, dstInfo.appInfo.linkType, dstInfo.isClient);
756     DelAuthChannelInfoByChanId((int32_t)(dstInfo.appInfo.myData.channelId));
757     (void)NotifyCloseAuthChannel((const char *)dstInfo.appInfo.myData.pkgName,
758         (int32_t)dstInfo.appInfo.myData.pid, (int32_t)dstInfo.appInfo.myData.channelId);
759 }
760 
GetAppInfo(const char * sessionName,int32_t channelId,AppInfo * appInfo,bool isClient)761 int32_t GetAppInfo(const char *sessionName, int32_t channelId, AppInfo *appInfo, bool isClient)
762 {
763     if (sessionName == NULL || appInfo == NULL) {
764         return SOFTBUS_INVALID_PARAM;
765     }
766     appInfo->appType = APP_TYPE_NOT_CARE;
767     appInfo->businessType = BUSINESS_TYPE_BYTE;
768     appInfo->channelType = CHANNEL_TYPE_AUTH;
769     appInfo->myData.channelId = channelId;
770     appInfo->myData.apiVersion = API_V2;
771     appInfo->peerData.apiVersion = API_V2;
772     appInfo->autoCloseTime = 0;
773     int32_t ret = TransGetUidAndPid(sessionName, &appInfo->myData.uid, &appInfo->myData.pid);
774     if (ret != SOFTBUS_OK) {
775         TRANS_LOGE(TRANS_SVC, "TransGetUidAndPid failed");
776         return ret;
777     }
778     ret = TransGetPkgNameBySessionName(sessionName, appInfo->myData.pkgName, PKG_NAME_SIZE_MAX);
779     if (ret != SOFTBUS_OK) {
780         TRANS_LOGE(TRANS_SVC, "TransGetPkgNameBySessionName failed");
781         return ret;
782     }
783     ret = LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, appInfo->myData.deviceId, sizeof(appInfo->myData.deviceId));
784     if (ret != SOFTBUS_OK) {
785         TRANS_LOGE(TRANS_SVC, "LnnGetLocalStrInfo failed");
786         return ret;
787     }
788     if (strcpy_s(appInfo->myData.sessionName, sizeof(appInfo->myData.sessionName), sessionName) != EOK) {
789         TRANS_LOGE(TRANS_SVC, "copy sessionName failed");
790         return SOFTBUS_STRCPY_ERR;
791     }
792     appInfo->peerData.apiVersion = API_V2;
793     if (strcpy_s(appInfo->peerData.sessionName, sizeof(appInfo->peerData.sessionName), sessionName) != EOK) {
794         return SOFTBUS_STRCPY_ERR;
795     }
796     ret = TransGetLocalConfig(appInfo->channelType, appInfo->businessType, &appInfo->myData.dataConfig);
797     if (ret != SOFTBUS_OK) {
798         return ret;
799     }
800     return SOFTBUS_OK;
801 }
802 
AddAuthChannelInfo(AuthChannelInfo * info)803 static int32_t AddAuthChannelInfo(AuthChannelInfo *info)
804 {
805     if (g_authChannelList == NULL || info == NULL) {
806         TRANS_LOGE(TRANS_SVC, "invalid param");
807         return SOFTBUS_INVALID_PARAM;
808     }
809     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
810         TRANS_LOGE(TRANS_SVC, "fail to lock authChannelList.");
811         return SOFTBUS_LOCK_ERR;
812     }
813     AuthChannelInfo *item = NULL;
814     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
815         if (item->appInfo.myData.channelId == info->appInfo.myData.channelId) {
816             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
817             TRANS_LOGE(TRANS_SVC, "found auth channel, channelId=%{public}" PRId64,
818                 info->appInfo.myData.channelId);
819             return SOFTBUS_TRANS_INVALID_CHANNEL_ID;
820         }
821     }
822     ListAdd(&g_authChannelList->list, &info->node);
823     TRANS_LOGI(TRANS_CTRL, "add channelId=%{public}" PRId64 ", isClient=%{public}d",
824         info->appInfo.myData.channelId, info->isClient);
825     g_authChannelList->cnt++;
826     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
827     return SOFTBUS_OK;
828 }
829 
DelAuthChannelInfoByChanId(int32_t channelId)830 static void DelAuthChannelInfoByChanId(int32_t channelId)
831 {
832     if (g_authChannelList == NULL) {
833         return;
834     }
835     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
836         TRANS_LOGE(TRANS_SVC, "lock failed");
837         return;
838     }
839     AuthChannelInfo *item = NULL;
840     AuthChannelInfo *tmp = NULL;
841     LIST_FOR_EACH_ENTRY_SAFE(item, tmp, &g_authChannelList->list, AuthChannelInfo, node) {
842         if (item->appInfo.myData.channelId == channelId) {
843             ListDelete(&item->node);
844             TRANS_LOGI(TRANS_CTRL, "delete channelId=%{public}d", channelId);
845             SoftBusFree(item);
846             g_authChannelList->cnt--;
847             break;
848         }
849     }
850     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
851 }
852 
DelAuthChannelInfoByAuthId(int32_t authId)853 static void DelAuthChannelInfoByAuthId(int32_t authId)
854 {
855     if (g_authChannelList == NULL) {
856         return;
857     }
858     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
859         TRANS_LOGE(TRANS_SVC, "lock failed");
860         return;
861     }
862     AuthChannelInfo *item = NULL;
863     AuthChannelInfo *tmp = NULL;
864     LIST_FOR_EACH_ENTRY_SAFE(item, tmp, &g_authChannelList->list, AuthChannelInfo, node) {
865         if (item->authId == authId) {
866             ListDelete(&item->node);
867             TRANS_LOGI(TRANS_CTRL, "delete authId = %{public}d", item->authId);
868             SoftBusFree(item);
869             g_authChannelList->cnt--;
870             break;
871         }
872     }
873     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
874 }
875 
TransAuthGetNameByChanId(int32_t chanId,char * pkgName,char * sessionName,uint16_t pkgLen,uint16_t sessionLen)876 int32_t TransAuthGetNameByChanId(int32_t chanId, char *pkgName, char *sessionName, uint16_t pkgLen, uint16_t sessionLen)
877 {
878     if (pkgName == NULL || sessionName == NULL) {
879         TRANS_LOGE(TRANS_SVC, "invalid param");
880         return SOFTBUS_INVALID_PARAM;
881     }
882 
883     AuthChannelInfo info;
884     int32_t ret = GetAuthChannelInfoByChanId(chanId, &info);
885     if (ret != SOFTBUS_OK) {
886         TRANS_LOGE(TRANS_SVC, "get channel info by chanId failed. chanId=%{public}d", chanId);
887         return ret;
888     }
889 
890     if (memcpy_s(pkgName, pkgLen, info.appInfo.myData.pkgName, PKG_NAME_SIZE_MAX) != EOK ||
891         memcpy_s(sessionName, sessionLen, info.appInfo.myData.sessionName, SESSION_NAME_SIZE_MAX) != EOK) {
892         TRANS_LOGE(TRANS_SVC, "memcpy_s failed");
893         return SOFTBUS_MEM_ERR;
894     }
895     return SOFTBUS_OK;
896 }
897 
TransAuthInit(IServerChannelCallBack * cb)898 int32_t TransAuthInit(IServerChannelCallBack *cb)
899 {
900     if (cb == NULL) {
901         return SOFTBUS_INVALID_PARAM;
902     }
903     AuthChannelListener channelListener = {
904         .onDataReceived = OnAuthChannelDataRecv,
905         .onDisconnected = OnDisconnect,
906     };
907     AuthChannelListener msgListener = {
908         .onDataReceived = OnAuthMsgDataRecv,
909         .onDisconnected = OnDisconnect,
910     };
911     if (RegAuthChannelListener(MODULE_AUTH_CHANNEL, &channelListener) != SOFTBUS_OK ||
912         RegAuthChannelListener(MODULE_AUTH_MSG, &msgListener) != SOFTBUS_OK) {
913         UnregAuthChannelListener(MODULE_AUTH_CHANNEL);
914         UnregAuthChannelListener(MODULE_AUTH_MSG);
915         return SOFTBUS_TRANS_REG_AUTH_CHANNEL_LISTERNER_FAILED;
916     }
917     if (g_authChannelList == NULL) {
918         g_authChannelList = CreateSoftBusList();
919     }
920     if (g_authChannelList == NULL) {
921         return SOFTBUS_INVALID_PARAM;
922     }
923     if (g_cb == NULL) {
924         g_cb = cb;
925     }
926     return SOFTBUS_OK;
927 }
928 
TransAuthDeinit(void)929 void TransAuthDeinit(void)
930 {
931     UnregAuthChannelListener(MODULE_AUTH_CHANNEL);
932     UnregAuthChannelListener(MODULE_AUTH_MSG);
933     DestroySoftBusList(g_authChannelList);
934     g_authChannelList = NULL;
935     g_cb = NULL;
936 }
937 
TransPostAuthChannelMsg(const AppInfo * appInfo,int32_t authId,int32_t flag)938 static int32_t TransPostAuthChannelMsg(const AppInfo *appInfo, int32_t authId, int32_t flag)
939 {
940     if (appInfo == NULL) {
941         TRANS_LOGW(TRANS_SVC, "invalid param");
942         return SOFTBUS_INVALID_PARAM;
943     }
944     cJSON *msg = cJSON_CreateObject();
945     if (msg == NULL) {
946         TRANS_LOGE(TRANS_SVC, "json failed");
947         return SOFTBUS_MALLOC_ERR;
948     }
949     int32_t ret = TransAuthChannelMsgPack(msg, appInfo);
950     if (ret != SOFTBUS_OK) {
951         cJSON_Delete(msg);
952         TRANS_LOGE(TRANS_SVC, "tran channel msg pack failed");
953         return ret;
954     }
955     char *data = cJSON_PrintUnformatted(msg);
956     cJSON_Delete(msg);
957     if (data == NULL) {
958         TRANS_LOGE(TRANS_SVC, "json failed");
959         return SOFTBUS_PARSE_JSON_ERR;
960     }
961 
962     AuthChannelData channelData = {
963         .module = MODULE_AUTH_CHANNEL,
964         .flag = flag,
965         .seq = 0,
966         .len = strlen(data) + 1,
967         .data = (const uint8_t *)data,
968     };
969     ret = AuthPostChannelData(authId, &channelData);
970     if (ret != SOFTBUS_OK) {
971         TRANS_LOGE(TRANS_SVC, "auth post channel data fail");
972         cJSON_free(data);
973         return ret;
974     }
975     cJSON_free(data);
976     return SOFTBUS_OK;
977 }
978 
TransPostAuthChannelErrMsg(int32_t authId,int32_t errcode,const char * errMsg)979 static void TransPostAuthChannelErrMsg(int32_t authId, int32_t errcode, const char *errMsg)
980 {
981     if (errMsg == NULL) {
982         return;
983     }
984     char cJsonStr[ERR_MSG_MAX_LEN] = {0};
985     int32_t ret = TransAuthChannelErrorPack(errcode, errMsg, cJsonStr, ERR_MSG_MAX_LEN);
986     if (ret != SOFTBUS_OK) {
987         TRANS_LOGE(TRANS_SVC, "TransAuthChannelErrorPack failed");
988         return;
989     }
990     AuthChannelData channelData = {
991         .module = MODULE_AUTH_CHANNEL,
992         .flag = AUTH_CHANNEL_REPLY,
993         .seq = 0,
994         .len = strlen(cJsonStr) + 1,
995         .data = (const uint8_t *)cJsonStr,
996     };
997     if (AuthPostChannelData(authId, &channelData) != SOFTBUS_OK) {
998         TRANS_LOGE(TRANS_SVC, "auth post channel data fail");
999     }
1000 }
1001 
CreateAuthChannelInfo(const char * sessionName,bool isClient)1002 static AuthChannelInfo *CreateAuthChannelInfo(const char *sessionName, bool isClient)
1003 {
1004     AuthChannelInfo *info = (AuthChannelInfo *)SoftBusCalloc(sizeof(AuthChannelInfo));
1005     if (info == NULL) {
1006         return NULL;
1007     }
1008     info->appInfo.myData.channelId = GenerateChannelId(true);
1009     if (info->appInfo.myData.channelId <= INVALID_CHANNEL_ID) {
1010         TRANS_LOGE(TRANS_SVC, "channelId is invalid");
1011         goto EXIT_ERR;
1012     }
1013     if (GetAppInfo(sessionName, info->appInfo.myData.channelId, &info->appInfo, isClient) != SOFTBUS_OK) {
1014         goto EXIT_ERR;
1015     }
1016     info->isClient = isClient;
1017     return info;
1018 EXIT_ERR:
1019     SoftBusFree(info);
1020     return NULL;
1021 }
1022 
FillAndReportEventStart(const char * sessionName,int32_t * channelId,int32_t connType,TransEventExtra * extra,AuthChannelInfo * channel)1023 static void FillAndReportEventStart(const char *sessionName, int32_t *channelId, int32_t connType,
1024     TransEventExtra *extra, AuthChannelInfo *channel)
1025 {
1026     extra->peerNetworkId = NULL;
1027     extra->calleePkg = NULL;
1028     extra->callerPkg = NULL;
1029     extra->socketName = sessionName;
1030     extra->channelId = *channelId;
1031     extra->channelType = CHANNEL_TYPE_AUTH;
1032     extra->linkType = connType;
1033     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_START_CONNECT, *extra);
1034 }
1035 
FillAndReportEventEnd(int32_t authId,TransEventExtra * extra)1036 static void FillAndReportEventEnd(int32_t authId, TransEventExtra *extra)
1037 {
1038     extra->result = EVENT_STAGE_RESULT_OK;
1039     extra->authId = authId;
1040     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_START_CONNECT, *extra);
1041 }
1042 
CheckForAuthWithParam(const char * sessionName,const LaneConnInfo * connInfo,const int32_t * channelId)1043 static bool CheckForAuthWithParam(const char *sessionName, const LaneConnInfo *connInfo, const int32_t *channelId)
1044 {
1045     if (sessionName == NULL || connInfo == NULL || channelId == NULL) {
1046         TRANS_LOGE(TRANS_SVC, "CheckForAuthWithParam invalid param");
1047         return false;
1048     }
1049     if (g_authChannelList == NULL) {
1050         TRANS_LOGE(TRANS_SVC, "CheckForAuthWithParam g_authChannelList is null");
1051         return false;
1052     }
1053     if (connInfo->type != LANE_HML_RAW) {
1054         TRANS_LOGE(TRANS_SVC, "CheckForAuthWithParam connInfo->type is %{public}d", connInfo->type);
1055         return false;
1056     }
1057     return true;
1058 }
1059 
TransFillAuthChannelInfo(AuthChannelInfo * channel,const LaneConnInfo * connInfo,const int32_t * channelId,bool accountInfo)1060 static int32_t TransFillAuthChannelInfo(AuthChannelInfo *channel, const LaneConnInfo *connInfo,
1061     const int32_t *channelId, bool accountInfo)
1062 {
1063     if (channel == NULL || connInfo == NULL || channelId == NULL) {
1064         TRANS_LOGE(TRANS_SVC, "TransFillAuthChannelInfo invalid parm");
1065         return SOFTBUS_INVALID_PARAM;
1066     }
1067 
1068     (void)memset_s(channel->appInfo.reqId, REQ_ID_SIZE_MAX, 0, REQ_ID_SIZE_MAX);
1069     channel->appInfo.myData.channelId = *channelId;
1070     channel->appInfo.timeStart = GetSoftbusRecordTimeMillis();
1071     channel->appInfo.linkType = connInfo->type;
1072     channel->appInfo.routeType = WIFI_P2P;
1073     channel->connOpt.socketOption.moduleId = AUTH_RAW_P2P_CLIENT;
1074     channel->accountInfo = accountInfo;
1075 
1076     if (LnnGetLocalStrInfo(STRING_KEY_NETWORKID,
1077         channel->appInfo.peerNetWorkId, sizeof(channel->appInfo.peerNetWorkId)) != SOFTBUS_OK) {
1078         TRANS_LOGW(TRANS_SVC, "LnnGetLocalStrInfo STRING_KEY_NETWORKID failed");
1079     }
1080 
1081     if (strcpy_s(channel->appInfo.myData.addr, IP_LEN, connInfo->connInfo.rawWifiDirect.localIp) != EOK) {
1082         TRANS_LOGE(TRANS_SVC, "TransFillAuthChannelInfo strcpy_s localIp failed");
1083         return SOFTBUS_STRCPY_ERR;
1084     }
1085     if (strcpy_s(channel->appInfo.peerData.addr, IP_LEN, connInfo->connInfo.rawWifiDirect.peerIp) != EOK) {
1086         TRANS_LOGE(TRANS_SVC, "TransFillAuthChannelInfo strcpy_s perrIp failed");
1087         return SOFTBUS_STRCPY_ERR;
1088     }
1089     return SOFTBUS_OK;
1090 }
1091 
PostAuthMsg(AuthChannelInfo * channel,TransEventExtra * extra,const LaneConnInfo * connInfo,const int32_t * channelId)1092 static int32_t PostAuthMsg(AuthChannelInfo *channel, TransEventExtra *extra, const LaneConnInfo *connInfo,
1093     const int32_t *channelId)
1094 {
1095     int32_t authId = AuthOpenChannelWithAllIp(connInfo->connInfo.rawWifiDirect.localIpv6,
1096         connInfo->connInfo.rawWifiDirect.peerIpv6, connInfo->connInfo.rawWifiDirect.port);
1097     if (authId < 0) {
1098         TRANS_LOGE(TRANS_SVC, "AuthOpenChannelWithAllIp failed");
1099         SoftBusFree(channel);
1100         return SOFTBUS_TRANS_OPEN_AUTH_CHANNEL_FAILED;
1101     }
1102     extra->result = EVENT_STAGE_RESULT_OK;
1103     extra->authId = authId;
1104     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_START_CONNECT, *extra);
1105     channel->authId = authId;
1106     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1107         TRANS_LOGE(TRANS_SVC, "SoftBusMutexLock failed");
1108         TransAuthCloseChannel(channel->authId, LANE_HML_RAW, true);
1109         SoftBusFree(channel);
1110         return SOFTBUS_LOCK_ERR;
1111     }
1112     if (AddAuthChannelInfo(channel) != SOFTBUS_OK) {
1113         TRANS_LOGE(TRANS_SVC, "AddAuthChannelInfo failed");
1114         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1115         TransAuthCloseChannel(channel->authId, LANE_HML_RAW, true);
1116         SoftBusFree(channel);
1117         return SOFTBUS_TRANS_AUTH_ADD_CHANINFO_FAIL;
1118     }
1119     extra->result = 0;
1120     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_START, *extra);
1121     if (TransPostAuthChannelMsg(&channel->appInfo, authId, AUTH_CHANNEL_REQ) != SOFTBUS_OK) {
1122         TRANS_LOGE(TRANS_SVC, "TransPostAuthRequest failed");
1123         DelAuthChannelInfoByChanId(*channelId);
1124         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1125         TransAuthCloseChannel(authId, LANE_HML_RAW, true);
1126         return SOFTBUS_TRANS_AUTH_POST_CHANMSG_FAIL;
1127     }
1128     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1129     return SOFTBUS_OK;
1130 }
1131 
TransOpenAuthMsgChannelWithPara(const char * sessionName,const LaneConnInfo * connInfo,int32_t * channelId,bool accountInfo)1132 int32_t TransOpenAuthMsgChannelWithPara(const char *sessionName, const LaneConnInfo *connInfo, int32_t *channelId,
1133     bool accountInfo)
1134 {
1135     SoftBusHitraceChainBegin("TransOpenAuthMsgChannelWithPara");
1136     if (!CheckForAuthWithParam(sessionName, connInfo, channelId)) {
1137         TRANS_LOGE(TRANS_SVC, "TransOpenAuthMsgChannelWithPara CheckForAuthWithParam fail");
1138         SoftBusHitraceChainEnd();
1139         return SOFTBUS_INVALID_PARAM;
1140     }
1141 
1142     AuthChannelInfo *channel = CreateAuthChannelInfo(sessionName, true);
1143     if (channel == NULL) {
1144         TRANS_LOGE(TRANS_SVC, "TransOpenAuthMsgChannelWithPara CreateAuthChannelInfo fail");
1145         SoftBusHitraceChainEnd();
1146         return SOFTBUS_TRANS_AUTH_CREATE_CHANINFO_FAIL;
1147     }
1148     if (TransFillAuthChannelInfo(channel, connInfo, channelId, accountInfo) != SOFTBUS_OK) {
1149         SoftBusFree(channel);
1150         TRANS_LOGE(TRANS_SVC, "TransOpenAuthMsgChannelWithPara TransFillAuthChannelInfo failed");
1151         SoftBusHitraceChainEnd();
1152         return SOFTBUS_TRANS_AUTH_FILL_CHANINFO_FAIL;
1153     }
1154 
1155     TransEventExtra extra = {
1156         .peerNetworkId = NULL,
1157         .calleePkg = NULL,
1158         .callerPkg = NULL,
1159         .socketName = sessionName,
1160         .channelId = *channelId,
1161         .channelType = CHANNEL_TYPE_AUTH,
1162         .linkType = CONNECT_HML
1163     };
1164     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_START_CONNECT, extra);
1165 
1166     int32_t ret = PostAuthMsg(channel, &extra, connInfo, channelId);
1167     if (ret != SOFTBUS_OK) {
1168         TRANS_LOGE(TRANS_SVC, "PostAuthMsg failed, ret=%{public}d", ret);
1169         SoftBusHitraceChainEnd();
1170         return ret;
1171     }
1172     extra.result = EVENT_STAGE_RESULT_OK;
1173     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_START, extra);
1174     SoftBusHitraceChainEnd();
1175     return SOFTBUS_OK;
1176 }
1177 
TransOpenAuthChannelPrepareParam(const char * sessionName,const ConnectOption * connOpt,int32_t * channelId,const char * reqId)1178 static AuthChannelInfo *TransOpenAuthChannelPrepareParam(const char *sessionName, const ConnectOption *connOpt,
1179     int32_t *channelId, const char *reqId)
1180 {
1181     AuthChannelInfo *channel = CreateAuthChannelInfo(sessionName, true);
1182     TRANS_CHECK_AND_RETURN_RET_LOGE(channel != NULL, NULL, TRANS_SVC, "fail to add pid");
1183     if (strcpy_s(channel->appInfo.reqId, REQ_ID_SIZE_MAX, reqId) != EOK ||
1184         memcpy_s(&channel->connOpt, sizeof(ConnectOption), connOpt, sizeof(ConnectOption)) != EOK) {
1185         SoftBusFree(channel);
1186         TRANS_LOGE(TRANS_SVC, "fail to copy appInfo and connOpt.");
1187         return NULL;
1188     }
1189     *channelId = (int32_t)channel->appInfo.myData.channelId;
1190     channel->appInfo.timeStart = GetSoftbusRecordTimeMillis();
1191     channel->appInfo.connectType = connOpt->type;
1192     if (connOpt->socketOption.moduleId == AUTH_USB) {
1193         channel->appInfo.linkType = LANE_USB;
1194     }
1195     return channel;
1196 }
1197 
TransOpenAuthMsgChannel(const char * sessionName,const ConnectOption * connOpt,int32_t * channelId,const char * reqId)1198 int32_t TransOpenAuthMsgChannel(const char *sessionName, const ConnectOption *connOpt,
1199     int32_t *channelId, const char *reqId)
1200 {
1201     if (connOpt == NULL || channelId == NULL || connOpt->type != CONNECT_TCP || g_authChannelList == NULL) {
1202         return SOFTBUS_INVALID_PARAM;
1203     }
1204     AuthChannelInfo *channel = TransOpenAuthChannelPrepareParam(sessionName, connOpt, channelId, reqId);
1205     if (channel == NULL) {
1206         TRANS_LOGE(TRANS_SVC, "fail to get auth channel info.");
1207         return SOFTBUS_INVALID_PARAM;
1208     }
1209     TransEventExtra extra;
1210     FillAndReportEventStart(sessionName, channelId, connOpt->type, &extra, channel);
1211     int32_t ifnameIdx = (connOpt->socketOption.moduleId == AUTH_USB) ? USB_IF : WLAN_IF;
1212     int32_t authId = AuthOpenChannel(connOpt->socketOption.addr, connOpt->socketOption.port, ifnameIdx);
1213     if (authId < 0) {
1214         TRANS_LOGE(TRANS_SVC, "AuthOpenChannel failed");
1215         SoftBusFree(channel);
1216         return SOFTBUS_TRANS_OPEN_AUTH_CHANNEL_FAILED;
1217     }
1218     FillAndReportEventEnd(authId, &extra);
1219     channel->authId = authId;
1220     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1221         TRANS_LOGE(TRANS_SVC, "SoftBusMutexLock failed");
1222         TransAuthCloseChannel(channel->authId, LANE_HML_RAW, true);
1223         SoftBusFree(channel);
1224         return SOFTBUS_LOCK_ERR;
1225     }
1226     int32_t ret = AddAuthChannelInfo(channel);
1227     if (ret != SOFTBUS_OK) {
1228         TRANS_LOGE(TRANS_SVC, "AddAuthChannelInfo failed");
1229         TransAuthCloseChannel(channel->authId, LANE_HML_RAW, true);
1230         SoftBusFree(channel);
1231         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1232         return ret;
1233     }
1234     extra.result = 0;
1235     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_START, extra);
1236     ret = TransPostAuthChannelMsg(&channel->appInfo, authId, AUTH_CHANNEL_REQ);
1237     if (ret != SOFTBUS_OK) {
1238         TRANS_LOGE(TRANS_SVC, "TransPostAuthRequest failed");
1239         TransAuthCloseChannel(channel->authId, LANE_HML_RAW, true);
1240         DelAuthChannelInfoByChanId(*channelId);
1241         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1242         return ret;
1243     }
1244     extra.result = EVENT_STAGE_RESULT_OK;
1245     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_START, extra);
1246     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1247     return SOFTBUS_OK;
1248 }
1249 
TransCloseAuthChannel(int32_t channelId)1250 int32_t TransCloseAuthChannel(int32_t channelId)
1251 {
1252     AuthChannelInfo *channel = NULL;
1253     AuthChannelInfo *tmp = NULL;
1254     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1255         TRANS_LOGE(TRANS_SVC, "lock failed");
1256         return SOFTBUS_LOCK_ERR;
1257     }
1258     LIST_FOR_EACH_ENTRY_SAFE(channel, tmp, &g_authChannelList->list, AuthChannelInfo, node) {
1259         if (channel->appInfo.myData.channelId != channelId) {
1260             continue;
1261         }
1262         ListDelete(&channel->node);
1263         TRANS_LOGI(TRANS_CTRL, "delete channelId=%{public}d, authId=%{public}d", channelId, channel->authId);
1264         g_authChannelList->cnt--;
1265         // If it is an ishare session, clean up the auth manager
1266         if (strcmp(channel->appInfo.myData.sessionName, ISHARE_AUTH_SESSION) == 0) {
1267             DelAuthMetaManagerByConnectionIdPacked(channel->authId);
1268         }
1269         if (strcmp(channel->appInfo.myData.sessionName, DM_PKG_NAME) == 0) {
1270             DelAuthManagerByConnectionId(channel->authId);
1271         }
1272         TransAuthCloseChannel(channel->authId, channel->appInfo.linkType, channel->isClient);
1273         NotifyCloseAuthChannel(channel->appInfo.myData.pkgName, channel->appInfo.myData.pid, channelId);
1274         SoftBusFree(channel);
1275         (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1276         return SOFTBUS_OK;
1277     }
1278     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1279     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1280 }
1281 
TransSendAuthMsg(int32_t channelId,const char * msg,int32_t len)1282 int32_t TransSendAuthMsg(int32_t channelId, const char *msg, int32_t len)
1283 {
1284     if (msg == NULL || len <= 0) {
1285         return SOFTBUS_INVALID_PARAM;
1286     }
1287 
1288     int32_t authId = GetAuthIdByChannelId(channelId);
1289     if (authId < 0) {
1290         TRANS_LOGE(TRANS_SVC, "Get AuthId failed");
1291         return SOFTBUS_TRANS_AUTH_CHANNEL_NOT_FOUND;
1292     }
1293 
1294     AuthChannelData channelData = {
1295         .module = MODULE_AUTH_MSG,
1296         .flag = 0,
1297         .seq = 0,
1298         .len = (uint32_t)len,
1299         .data = (const uint8_t *)msg,
1300     };
1301     int32_t ret = AuthPostChannelData(authId, &channelData);
1302     if (ret != SOFTBUS_OK) {
1303         TRANS_LOGE(TRANS_SVC, "auth post channel data fail");
1304         return ret;
1305     }
1306     return SOFTBUS_OK;
1307 }
1308 
TransAuthGetConnOptionByChanId(int32_t channelId,ConnectOption * connOpt)1309 int32_t TransAuthGetConnOptionByChanId(int32_t channelId, ConnectOption *connOpt)
1310 {
1311     AuthChannelInfo chanInfo;
1312     int32_t ret = GetAuthChannelInfoByChanId(channelId, &chanInfo);
1313     if (ret != SOFTBUS_OK) {
1314         TRANS_LOGE(TRANS_SVC, "get auth channel info by channelId fail. channelId=%{public}d", channelId);
1315         return ret;
1316     }
1317 
1318     if (!chanInfo.isClient) {
1319         TRANS_LOGE(TRANS_SVC, "auth channel of conn opt invalid");
1320         return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
1321     }
1322 
1323     if (memcpy_s(connOpt, sizeof(ConnectOption), &(chanInfo.connOpt), sizeof(ConnectOption)) != EOK) {
1324         TRANS_LOGE(TRANS_SVC, "auth channel connopt memcpy fail");
1325         return SOFTBUS_MEM_ERR;
1326     }
1327     return SOFTBUS_OK;
1328 }
1329 
TransNotifyAuthDataSuccess(int32_t channelId,const ConnectOption * connOpt)1330 int32_t TransNotifyAuthDataSuccess(int32_t channelId, const ConnectOption *connOpt)
1331 {
1332     if (connOpt == NULL) {
1333         TRANS_LOGW(TRANS_SVC, "invalid param.");
1334         return SOFTBUS_INVALID_PARAM;
1335     }
1336     ConnectionAddr addr;
1337     (void)memset_s(&addr, sizeof(ConnectionAddr), 0, sizeof(ConnectionAddr));
1338     if (!LnnConvertOptionToAddr(&addr, connOpt, CONNECTION_ADDR_WLAN)) {
1339         TRANS_LOGE(TRANS_SVC, "channelId convert addr fail. channelId=%{public}d", channelId);
1340         return SOFTBUS_TRANS_CHANNELID_CONVERT_ADDR_FAILED;
1341     }
1342     LnnDfxDeviceInfoReport infoReport;
1343     (void)memset_s(&infoReport, sizeof(LnnDfxDeviceInfoReport), 0, sizeof(LnnDfxDeviceInfoReport));
1344     return LnnNotifyDiscoveryDevice(&addr, &infoReport, true);
1345 }
1346 
TransAuthGetAppInfoByChanId(int32_t channelId,AppInfo * appInfo)1347 int32_t TransAuthGetAppInfoByChanId(int32_t channelId, AppInfo *appInfo)
1348 {
1349     if (appInfo == NULL || g_authChannelList == NULL) {
1350         return SOFTBUS_INVALID_PARAM;
1351     }
1352 
1353     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1354         TRANS_LOGE(TRANS_SVC, "lock failed");
1355         return SOFTBUS_LOCK_ERR;
1356     }
1357     AuthChannelInfo *info = NULL;
1358     LIST_FOR_EACH_ENTRY(info, &g_authChannelList->list, AuthChannelInfo, node) {
1359         if (info->appInfo.myData.channelId == channelId) {
1360             if (memcpy_s(appInfo, sizeof(AppInfo), &info->appInfo, sizeof(AppInfo)) != EOK) {
1361                 (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1362                 TRANS_LOGE(TRANS_SVC, "auth channel appinfo memcpy fail");
1363                 return SOFTBUS_MEM_ERR;
1364             }
1365             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1366             return SOFTBUS_OK;
1367         }
1368     }
1369     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1370     TRANS_LOGE(TRANS_CTRL, "Auth channel not find: channelId=%{public}d", channelId);
1371     return SOFTBUS_NOT_FIND;
1372 }
1373 
TransAuthGetConnIdByChanId(int32_t channelId,int32_t * connId)1374 int32_t TransAuthGetConnIdByChanId(int32_t channelId, int32_t *connId)
1375 {
1376     if ((g_authChannelList == NULL) || (connId == NULL)) {
1377         TRANS_LOGE(TRANS_SVC, "invalid param");
1378         return SOFTBUS_INVALID_PARAM;
1379     }
1380 
1381     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1382         TRANS_LOGE(TRANS_SVC, "get mutex lock failed");
1383         return SOFTBUS_LOCK_ERR;
1384     }
1385 
1386     AuthChannelInfo *item = NULL;
1387     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
1388         if (item->appInfo.myData.channelId == channelId) {
1389             *connId = item->authId;
1390             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1391             return SOFTBUS_OK;
1392         }
1393     }
1394     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1395     TRANS_LOGE(TRANS_SVC, "get connid failed");
1396     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1397 }
1398 
CheckIsWifiAuthChannel(ConnectOption * connInfo)1399 int32_t CheckIsWifiAuthChannel(ConnectOption *connInfo)
1400 {
1401     if (connInfo == NULL || connInfo->socketOption.moduleId != AUTH) {
1402         TRANS_LOGE(
1403             TRANS_SVC, "invalid param, moduleId=%{public}d", connInfo == NULL ? -1 : connInfo->socketOption.moduleId);
1404         return SOFTBUS_INVALID_PARAM;
1405     }
1406     if (g_authChannelList == NULL) {
1407         TRANS_LOGE(TRANS_SVC, "not init auth channel");
1408         return SOFTBUS_NO_INIT;
1409     }
1410     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1411         TRANS_LOGE(TRANS_SVC, "get mutex lock failed");
1412         return SOFTBUS_LOCK_ERR;
1413     }
1414     AuthChannelInfo *info = NULL;
1415     LIST_FOR_EACH_ENTRY(info, &g_authChannelList->list, AuthChannelInfo, node) {
1416         if (info->connOpt.socketOption.port == connInfo->socketOption.port &&
1417             memcmp(info->connOpt.socketOption.addr, connInfo->socketOption.addr,
1418             strlen(connInfo->socketOption.addr)) == 0) {
1419             TRANS_LOGI(TRANS_SVC, "auth channel type is wifi");
1420             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1421             return SOFTBUS_OK;
1422         }
1423     }
1424     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1425     TRANS_LOGE(TRANS_SVC, "auth channel is not exit");
1426     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1427 }
1428 
TransSetAuthChannelReplyCnt(int32_t channelId)1429 static int32_t TransSetAuthChannelReplyCnt(int32_t channelId)
1430 {
1431     TRANS_CHECK_AND_RETURN_RET_LOGE(
1432         g_authChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_authChannelList is NULL");
1433     int32_t ret = SoftBusMutexLock(&g_authChannelList->lock);
1434     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
1435     AuthChannelInfo *item = NULL;
1436     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
1437         if (item->appInfo.myData.channelId == channelId) {
1438             item->appInfo.waitOpenReplyCnt = CHANNEL_OPEN_SUCCESS;
1439             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1440             return SOFTBUS_OK;
1441         }
1442     }
1443     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1444     TRANS_LOGE(TRANS_SVC, "Auth channel not find: channelId=%{public}d", channelId);
1445     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1446 }
1447 
TransDealAuthChannelOpenResult(int32_t channelId,int32_t openResult,pid_t callingPid)1448 int32_t TransDealAuthChannelOpenResult(int32_t channelId, int32_t openResult, pid_t callingPid)
1449 {
1450     AuthChannelInfo info;
1451     (void)memset_s(&info, sizeof(AuthChannelInfo), 0, sizeof(AuthChannelInfo));
1452     int32_t ret = GetAuthChannelInfoByChanId(channelId, &info);
1453     if (ret != SOFTBUS_OK) {
1454         TRANS_LOGE(TRANS_CTRL, "get auth channel failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
1455         return ret;
1456     }
1457 
1458     int32_t pid = 0;
1459     int32_t uid = 0;
1460     ret = AuthGetUidAndPidBySessionName(info.appInfo.myData.sessionName, &uid, &pid);
1461     if (ret != SOFTBUS_OK) {
1462         TRANS_LOGE(TRANS_SVC, "auth get id by sessionName failed");
1463         return SOFTBUS_TRANS_GET_PID_FAILED;
1464     }
1465     if (callingPid != 0 && pid != callingPid) {
1466         TRANS_LOGE(TRANS_CTRL, "pid does not match callingPid, pid=%{public}d, callingPid=%{public}d", pid, callingPid);
1467         return SOFTBUS_TRANS_CHECK_PID_ERROR;
1468     }
1469 
1470     ret = TransSetAuthChannelReplyCnt(channelId);
1471     if (ret != SOFTBUS_OK) {
1472         TRANS_LOGE(TRANS_CTRL, "update cnt failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
1473         return ret;
1474     }
1475     TransEventExtra extra = {
1476         .peerNetworkId = NULL,
1477         .calleePkg = NULL,
1478         .callerPkg = NULL,
1479         .channelType = CHANNEL_TYPE_AUTH,
1480         .authId = info.authId,
1481         .result = EVENT_STAGE_RESULT_OK,
1482         .channelId = info.appInfo.myData.channelId,
1483         .socketName = info.appInfo.myData.sessionName,
1484         .peerUdid = info.appInfo.peerData.deviceId,
1485     };
1486 
1487     if (openResult != SOFTBUS_OK) {
1488         TRANS_LOGE(TRANS_SVC, "open auth channel failed, openResult=%{public}d", openResult);
1489         TransPostAuthChannelErrMsg(info.authId, openResult, "open auth channel failed");
1490         TransHandleErrorAndCloseChannel(&extra, info.authId, info.appInfo.linkType, info.appInfo.isClient, openResult);
1491         return SOFTBUS_OK;
1492     }
1493     ret = TransPostAuthChannelMsg(&info.appInfo, info.authId, AUTH_CHANNEL_REPLY);
1494     if (ret != SOFTBUS_OK) {
1495         TRANS_LOGE(TRANS_SVC, "send reply failed, ret=%{public}d", ret);
1496         TransHandleErrorAndCloseChannel(&extra, info.authId, info.appInfo.linkType, info.appInfo.isClient, ret);
1497         return ret;
1498     }
1499     return SOFTBUS_OK;
1500 }
1501 
TransCheckAuthChannelOpenStatus(int32_t channelId,int32_t * curCount)1502 static int32_t TransCheckAuthChannelOpenStatus(int32_t channelId, int32_t *curCount)
1503 {
1504     TRANS_CHECK_AND_RETURN_RET_LOGE(
1505         g_authChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_authChannelList is null");
1506     int32_t ret = SoftBusMutexLock(&g_authChannelList->lock);
1507     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
1508     AuthChannelInfo *item = NULL;
1509     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
1510         if (item->appInfo.myData.channelId == channelId) {
1511             if (item->appInfo.waitOpenReplyCnt != CHANNEL_OPEN_SUCCESS) {
1512                 item->appInfo.waitOpenReplyCnt++;
1513             }
1514             *curCount = item->appInfo.waitOpenReplyCnt;
1515             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1516             return SOFTBUS_OK;
1517         }
1518     }
1519     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1520     TRANS_LOGE(TRANS_SVC, "Auth channel not find: channelId=%{public}d", channelId);
1521     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1522 }
1523 
TransAsyncAuthChannelTask(int32_t channelId)1524 void TransAsyncAuthChannelTask(int32_t channelId)
1525 {
1526     int32_t curCount = 0;
1527     int32_t ret = TransCheckAuthChannelOpenStatus(channelId, &curCount);
1528     if (ret != SOFTBUS_OK) {
1529         TRANS_LOGE(TRANS_CTRL, "check auth channel open failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
1530         return;
1531     }
1532     if (curCount == CHANNEL_OPEN_SUCCESS) {
1533         TRANS_LOGI(TRANS_CTRL, "open auth channel success, channelId=%{public}d", channelId);
1534         return;
1535     }
1536     AuthChannelInfo info;
1537     (void)memset_s(&info, sizeof(AuthChannelInfo), 0, sizeof(AuthChannelInfo));
1538     ret = GetAuthChannelInfoByChanId(channelId, &info);
1539     if (ret != SOFTBUS_OK) {
1540         TRANS_LOGE(TRANS_CTRL, "get auth channel failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
1541         return;
1542     }
1543     if (curCount >= LOOPER_REPLY_CNT_MAX) {
1544         TRANS_LOGE(TRANS_CTRL, "open auth channel timeout, channelId=%{public}d", channelId);
1545         TransPostAuthChannelErrMsg(
1546             info.authId,  SOFTBUS_TRANS_OPEN_CHANNEL_NEGTIATE_TIMEOUT, "open auth channel failed");
1547         DelAuthChannelInfoByAuthId(info.authId);
1548         TransAuthCloseChannel(info.authId, info.appInfo.linkType, info.isClient);
1549         return;
1550     }
1551     TRANS_LOGI(TRANS_CTRL, "Open channelId=%{public}d not finished, generate new task and waiting", channelId);
1552     uint32_t delayTime = (curCount <= LOOPER_SEPARATE_CNT) ? FAST_INTERVAL_MILLISECOND : SLOW_INTERVAL_MILLISECOND;
1553     TransCheckChannelOpenToLooperDelay(channelId, CHANNEL_TYPE_AUTH, delayTime);
1554 }
1555 
TransAuthDestroyChannelList(const ListNode * destroyList)1556 static void TransAuthDestroyChannelList(const ListNode *destroyList)
1557 {
1558     TRANS_CHECK_AND_RETURN_LOGE(
1559         (destroyList != NULL && !IsListEmpty(destroyList)), TRANS_CTRL, "destroyList is null");
1560 
1561     AuthChannelInfo *destroyNode = NULL;
1562     AuthChannelInfo *nextDestroyNode = NULL;
1563     LIST_FOR_EACH_ENTRY_SAFE(destroyNode, nextDestroyNode, destroyList, AuthChannelInfo, node) {
1564         ListDelete(&(destroyNode->node));
1565         TransAuthCloseChannel(destroyNode->authId, destroyNode->appInfo.linkType, destroyNode->isClient);
1566         NotifyCloseAuthChannel(destroyNode->appInfo.myData.pkgName,
1567             destroyNode->appInfo.myData.pid, destroyNode->appInfo.myData.channelId);
1568 
1569         if (destroyNode->appInfo.fastTransData != NULL) {
1570             SoftBusFree((void *)destroyNode->appInfo.fastTransData);
1571         }
1572         (void)memset_s(destroyNode->appInfo.sessionKey, sizeof(destroyNode->appInfo.sessionKey), 0,
1573             sizeof(destroyNode->appInfo.sessionKey));
1574         SoftBusFree(destroyNode);
1575     }
1576     return;
1577 }
1578 
TransAuthDeathCallback(const char * pkgName,int32_t pid)1579 void TransAuthDeathCallback(const char *pkgName, int32_t pid)
1580 {
1581     if (g_authChannelList == NULL || pkgName == NULL) {
1582         TRANS_LOGE(TRANS_CTRL, "invalid param.");
1583         return;
1584     }
1585 
1586     char *anonymizePkgName = NULL;
1587     Anonymize(pkgName, &anonymizePkgName);
1588     TRANS_LOGI(TRANS_CTRL, "pkgName=%{public}s, pid=%{public}d.", AnonymizeWrapper(anonymizePkgName), pid);
1589     AnonymizeFree(anonymizePkgName);
1590 
1591     ListNode destroyList;
1592     ListInit(&destroyList);
1593     AuthChannelInfo *item = NULL;
1594     AuthChannelInfo *tmp = NULL;
1595 
1596     if (SoftBusMutexLock(&g_authChannelList->lock) != SOFTBUS_OK) {
1597         TRANS_LOGE(TRANS_CTRL, "lock failed.");
1598         return;
1599     }
1600     LIST_FOR_EACH_ENTRY_SAFE(item, tmp, &g_authChannelList->list, AuthChannelInfo, node) {
1601         if ((strcmp(item->appInfo.myData.pkgName, pkgName) == 0) && (item->appInfo.myData.pid == pid)) {
1602             ListDelete(&(item->node));
1603             g_authChannelList->cnt--;
1604             ListAdd(&destroyList, &(item->node));
1605             TRANS_LOGE(TRANS_CTRL, "add to destroyList channelId=%{public}" PRId64, item->appInfo.myData.channelId);
1606             continue;
1607         }
1608     }
1609     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1610     TransAuthDestroyChannelList(&destroyList);
1611 }
1612 
TransAuthGetRoleByAuthId(int32_t authId,bool * isClient)1613 int32_t TransAuthGetRoleByAuthId(int32_t authId, bool *isClient)
1614 {
1615     TRANS_CHECK_AND_RETURN_RET_LOGE(
1616         g_authChannelList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_authChannelList is null.");
1617     TRANS_CHECK_AND_RETURN_RET_LOGE(
1618         isClient != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "invalid param.");
1619     int32_t ret = SoftBusMutexLock(&g_authChannelList->lock);
1620     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock mutex fail!");
1621     AuthChannelInfo *item = NULL;
1622     LIST_FOR_EACH_ENTRY(item, &g_authChannelList->list, AuthChannelInfo, node) {
1623         if (item->authId == authId) {
1624             *isClient = item->isClient;
1625             (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1626             return SOFTBUS_OK;
1627         }
1628     }
1629     (void)SoftBusMutexUnlock(&g_authChannelList->lock);
1630     TRANS_LOGE(TRANS_SVC, "Auth channel not find: authId=%{public}d", authId);
1631     return SOFTBUS_TRANS_NODE_NOT_FOUND;
1632 }
1633