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