1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "string.h"
17 #include <securec.h>
18
19 #include "anonymizer.h"
20 #include "client_trans_session_adapter.h"
21 #include "client_trans_session_manager.h"
22 #include "client_trans_session_service.h"
23 #include "client_trans_socket_manager.h"
24 #include "client_trans_socket_option.h"
25 #include "g_enhance_sdk_func.h"
26 #include "inner_socket.h"
27 #include "session_ipc_adapter.h"
28 #include "socket.h"
29 #include "softbus_access_token_adapter.h"
30 #include "softbus_adapter_mem.h"
31 #include "softbus_def.h"
32 #include "softbus_error_code.h"
33 #include "softbus_utils.h"
34 #include "trans_log.h"
35 #include "trans_server_proxy.h"
36
CheckSocketInfoIsValid(const SocketInfo * info)37 static int32_t CheckSocketInfoIsValid(const SocketInfo *info)
38 {
39 if (!IsValidString(info->name, SESSION_NAME_SIZE_MAX - 1) ||
40 !IsValidString(info->pkgName, PKG_NAME_SIZE_MAX - 1)) {
41 TRANS_LOGE(TRANS_SDK, "invalid name or package name of socket");
42 return SOFTBUS_INVALID_PARAM;
43 }
44
45 if (info->peerName != NULL && !IsValidString(info->peerName, SESSION_NAME_SIZE_MAX - 1)) {
46 char *anonySessionName = NULL;
47 Anonymize(info->peerName, &anonySessionName);
48 TRANS_LOGI(TRANS_SDK, "strcpy peerName failed, peerName=%{public}s, peerNameLen=%{public}zu",
49 AnonymizeWrapper(anonySessionName), strlen(info->peerName));
50 AnonymizeFree(anonySessionName);
51 return SOFTBUS_INVALID_PARAM;
52 }
53
54 if (info->peerNetworkId != NULL && !IsValidString(info->peerNetworkId, DEVICE_ID_SIZE_MAX - 1)) {
55 char *anonyNetworkId = NULL;
56 Anonymize(info->peerNetworkId, &anonyNetworkId);
57 TRANS_LOGI(TRANS_SDK, "strcpy peerNetworkId failed, peerNetworkId=%{public}s, peerNetworkIdLen=%{public}zu",
58 AnonymizeWrapper(anonyNetworkId), strlen(info->peerNetworkId));
59 AnonymizeFree(anonyNetworkId);
60 return SOFTBUS_INVALID_PARAM;
61 }
62 return SOFTBUS_OK;
63 }
64
PrintSocketInfo(const SocketInfo * info)65 static void PrintSocketInfo(const SocketInfo *info)
66 {
67 char *tmpMyName = NULL;
68 char *tmpPeerName = NULL;
69 char *tmpPeerNetworkId = NULL;
70 char *tmpPkgName = NULL;
71 Anonymize(info->name, &tmpMyName);
72 Anonymize(info->peerName, &tmpPeerName);
73 Anonymize(info->peerNetworkId, &tmpPeerNetworkId);
74 Anonymize(info->pkgName, &tmpPkgName);
75 TRANS_LOGI(TRANS_SDK,
76 "Socket: mySessionName=%{public}s, peerSessionName=%{public}s, peerNetworkId=%{public}s, "
77 "pkgName=%{public}s, dataType=%{public}d", AnonymizeWrapper(tmpMyName), AnonymizeWrapper(tmpPeerName),
78 AnonymizeWrapper(tmpPeerNetworkId), AnonymizeWrapper(tmpPkgName), info->dataType);
79 AnonymizeFree(tmpMyName);
80 AnonymizeFree(tmpPeerName);
81 AnonymizeFree(tmpPeerNetworkId);
82 AnonymizeFree(tmpPkgName);
83 }
84
Socket(SocketInfo info)85 int32_t Socket(SocketInfo info)
86 {
87 int32_t ret = CheckSocketInfoIsValid(&info);
88 if (ret != SOFTBUS_OK) {
89 TRANS_LOGW(TRANS_SDK, "invalid SocketInfo");
90 return ret;
91 }
92
93 PrintSocketInfo(&info);
94 ret = CreateSocket(info.pkgName, info.name);
95 if (ret != SOFTBUS_OK) {
96 TRANS_LOGE(TRANS_SDK, "CreateSocket failed, ret=%{public}d.", ret);
97 return ret;
98 }
99
100 int32_t socketFd = INVALID_SESSION_ID;
101 char newSessionName[SESSION_NAME_SIZE_MAX + 1] = {0};
102 uint64_t callingFullTokenId = 0;
103 ret = SoftBusGetCallingFullTokenId(&callingFullTokenId);
104 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get callingFullTokenId failed");
105
106 if (SoftBusCheckIsNormalApp(callingFullTokenId, info.name)) {
107 if (strncpy_s(newSessionName, SESSION_NAME_SIZE_MAX + 1, info.name, strlen(info.name)) != EOK) {
108 TRANS_LOGE(TRANS_SDK, "copy session name failed");
109 return SOFTBUS_STRCPY_ERR;
110 }
111 if (!RemoveAppIdFromSessionName(info.name, newSessionName, SESSION_NAME_SIZE_MAX + 1)) {
112 TRANS_LOGE(TRANS_SDK, "invalid bundlename or appId and delete appId failed");
113 return SOFTBUS_TRANS_NOT_FIND_APPID;
114 }
115 info.name = newSessionName;
116 }
117 ret = ClientAddSocket(&info, &socketFd);
118 SocketServerStateUpdate(info.name);
119 if (ret != SOFTBUS_OK) {
120 TRANS_LOGE(TRANS_SDK, "add socket failed, ret=%{public}d.", ret);
121 return ret;
122 }
123 TRANS_LOGD(TRANS_SDK, "create socket ok, socket=%{public}d", socketFd);
124 return socketFd;
125 }
126
Listen(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)127 int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
128 {
129 TRANS_LOGD(TRANS_SDK, "Listen: socket=%{public}d", socket);
130 return ClientListen(socket, qos, qosCount, listener);
131 }
132
StartBindWaitTimer(int32_t socket,const QosTV qos[],uint32_t qosCount)133 static int32_t StartBindWaitTimer(int32_t socket, const QosTV qos[], uint32_t qosCount)
134 {
135 #define DEFAULT_MAX_WAIT_TIMEOUT 30000 // 30s
136 int32_t maxWaitTime;
137 int32_t ret = GetQosValue(qos, qosCount, QOS_TYPE_MAX_WAIT_TIMEOUT, &maxWaitTime, DEFAULT_MAX_WAIT_TIMEOUT);
138 if (ret != SOFTBUS_OK) {
139 TRANS_LOGE(TRANS_SDK, "get max wait timeout fail ret=%{public}d", ret);
140 return ret;
141 }
142
143 if (maxWaitTime <= 0) {
144 TRANS_LOGE(TRANS_SDK, "invalid max wait timeout. maxWaitTime=%{public}d", maxWaitTime);
145 return SOFTBUS_INVALID_PARAM;
146 }
147
148 return ClientHandleBindWaitTimer(socket, (uint32_t)maxWaitTime, TIMER_ACTION_START);
149 }
150
Bind(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)151 int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
152 {
153 TRANS_LOGI(TRANS_SDK, "Bind: socket=%{public}d", socket);
154 if (IsSessionExceedLimit()) {
155 TRANS_LOGE(TRANS_SDK, "Bind failed, over session num limit");
156 return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
157 }
158 int32_t ret = StartBindWaitTimer(socket, qos, qosCount);
159 if (ret == SOFTBUS_ALREADY_TRIGGERED) {
160 TRANS_LOGW(TRANS_SDK, "already success, socket=%{public}d", socket);
161 return SOFTBUS_OK;
162 } else if (ret != SOFTBUS_OK) {
163 TRANS_LOGE(TRANS_SDK, "Start timer failed, ret=%{public}d", ret);
164 return ret;
165 }
166
167 ret = ClientBind(socket, qos, qosCount, listener, false);
168 TRANS_LOGI(TRANS_SDK, "Bind end, stop timer, socket=%{public}d", socket);
169 (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
170 if (ret != SOFTBUS_OK) {
171 (void)SetSessionStateBySessionId(socket, SESSION_STATE_INIT, 0);
172 }
173 return ret;
174 }
175
BindAsync(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)176 int32_t BindAsync(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
177 {
178 TRANS_LOGI(TRANS_SDK, "Bind async socket=%{public}d", socket);
179 if (IsSessionExceedLimit()) {
180 TRANS_LOGE(TRANS_SDK, "Bind async failed, over session num limit");
181 return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
182 }
183
184 int32_t ret = StartBindWaitTimer(socket, qos, qosCount);
185 if (ret == SOFTBUS_ALREADY_TRIGGERED) {
186 TRANS_LOGW(TRANS_SDK, "already success, socket=%{public}d", socket);
187 return SOFTBUS_OK;
188 } else if (ret != SOFTBUS_OK) {
189 TRANS_LOGE(TRANS_SDK, "Start timer failed, ret=%{public}d, socket=%{public}d", ret, socket);
190 return ret;
191 }
192
193 ret = ClientBind(socket, qos, qosCount, listener, true);
194 if (ret != SOFTBUS_OK) {
195 TRANS_LOGE(TRANS_SDK, "BindAsync fail, stop timer, ret=%{public}d, socket=%{public}d", ret, socket);
196 (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
197 (void)SetSessionStateBySessionId(socket, SESSION_STATE_INIT, 0);
198 }
199 return ret;
200 }
201
Shutdown(int32_t socket)202 void Shutdown(int32_t socket)
203 {
204 TRANS_LOGI(TRANS_SDK, "Shutdown: socket=%{public}d", socket);
205 (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
206 ClientShutdown(socket, SOFTBUS_TRANS_STOP_BIND_BY_CANCEL);
207 }
208
EvaluateQos(const char * peerNetworkId,TransDataType dataType,const QosTV * qos,uint32_t qosCount)209 int32_t EvaluateQos(const char *peerNetworkId, TransDataType dataType, const QosTV *qos, uint32_t qosCount)
210 {
211 if (!IsValidString(peerNetworkId, DEVICE_ID_SIZE_MAX) || dataType >= DATA_TYPE_BUTT ||
212 (qos == NULL && qosCount != 0) || (qosCount > QOS_TYPE_BUTT)) {
213 TRANS_LOGE(TRANS_SDK, "invalid param");
214 return SOFTBUS_INVALID_PARAM;
215 }
216
217 return ServerIpcEvaluateQos(peerNetworkId, dataType, qos, qosCount);
218 }
219
GetMtuSize(int32_t socket,uint32_t * mtuSize)220 int32_t GetMtuSize(int32_t socket, uint32_t *mtuSize)
221 {
222 TRANS_LOGI(TRANS_SDK, "GetMtuSize: socket=%{public}d", socket);
223 return GetSocketMtuSize(socket, mtuSize);
224 }
225
DBinderGrantPermission(int32_t uid,int32_t pid,const char * socketName)226 int32_t DBinderGrantPermission(int32_t uid, int32_t pid, const char *socketName)
227 {
228 return ClientGrantPermission(uid, pid, socketName);
229 }
230
DBinderRemovePermission(const char * socketName)231 int32_t DBinderRemovePermission(const char *socketName)
232 {
233 return ClientRemovePermission(socketName);
234 }
235
DfsBind(int32_t socket,const ISocketListener * listener)236 int32_t DfsBind(int32_t socket, const ISocketListener *listener)
237 {
238 return ClientDfsBind(socket, listener);
239 }
240
CheckSocketOptParam(OptLevel level,OptType optType,void * optValue)241 static int32_t CheckSocketOptParam(OptLevel level, OptType optType, void *optValue)
242 {
243 if (level < 0 || level >= OPT_LEVEL_BUTT) {
244 TRANS_LOGE(TRANS_SDK, "invalid level.");
245 return SOFTBUS_INVALID_PARAM;
246 }
247 if (optType < 0) {
248 TRANS_LOGE(TRANS_SDK, "invalid optType.");
249 return SOFTBUS_INVALID_PARAM;
250 }
251 if (optValue == NULL) {
252 TRANS_LOGE(TRANS_SDK, "invalid optValue.");
253 return SOFTBUS_INVALID_PARAM;
254 }
255 return SOFTBUS_OK;
256 }
257
ClientCheckFuncPointer(void * func)258 static int32_t ClientCheckFuncPointer(void *func)
259 {
260 if (func == NULL) {
261 TRANS_LOGE(TRANS_SDK, "enhance func not register");
262 return SOFTBUS_FUNC_NOT_REGISTER;
263 }
264 return SOFTBUS_OK;
265 }
266
SetExtSocketOptPacked(int32_t socket,OptLevel level,OptType optType,void * optValue,uint32_t optValueSize)267 static int32_t SetExtSocketOptPacked(
268 int32_t socket, OptLevel level, OptType optType, void *optValue, uint32_t optValueSize)
269 {
270 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
271 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->setExtSocketOpt) != SOFTBUS_OK) {
272 return SOFTBUS_NOT_IMPLEMENT;
273 }
274 return pfnClientEnhanceFuncList->setExtSocketOpt(socket, level, optType, optValue, optValueSize);
275 }
276
SetSocketOpt(int32_t socket,OptLevel level,OptType optType,void * optValue,int32_t optValueSize)277 int32_t SetSocketOpt(int32_t socket, OptLevel level, OptType optType, void *optValue, int32_t optValueSize)
278 {
279 int32_t ret = CheckSocketOptParam(level, optType, optValue);
280 if (ret != SOFTBUS_OK) {
281 return ret;
282 }
283 if (optValueSize <= 0) {
284 TRANS_LOGE(TRANS_SDK, "invalid optValueSize.");
285 return SOFTBUS_INVALID_PARAM;
286 }
287 if (optType >= OPT_TYPE_BEGIN && optType < OPT_TYPE_END) {
288 ret = SetCommonSocketOpt(socket, level, optType, optValue, optValueSize);
289 } else {
290 ret = SetExtSocketOptPacked(socket, level, optType, optValue, optValueSize);
291 }
292 return ret;
293 }
294
GetExtSocketOptPacked(int32_t socket,OptLevel level,OptType optType,void * optValue,int32_t * optValueSize)295 static int32_t GetExtSocketOptPacked(
296 int32_t socket, OptLevel level, OptType optType, void *optValue, int32_t *optValueSize)
297 {
298 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
299 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->getExtSocketOpt) != SOFTBUS_OK) {
300 return SOFTBUS_NOT_IMPLEMENT;
301 }
302 return pfnClientEnhanceFuncList->getExtSocketOpt(socket, level, optType, optValue, optValueSize);
303 }
304
GetSocketOpt(int32_t socket,OptLevel level,OptType optType,void * optValue,int32_t * optValueSize)305 int32_t GetSocketOpt(int32_t socket, OptLevel level, OptType optType, void *optValue, int32_t *optValueSize)
306 {
307 int32_t ret = CheckSocketOptParam(level, optType, optValue);
308 if (ret != SOFTBUS_OK) {
309 return ret;
310 }
311 if (optValueSize == NULL) {
312 TRANS_LOGE(TRANS_SDK, "invalid optValueSize.");
313 return SOFTBUS_INVALID_PARAM;
314 }
315 if (optType >= OPT_TYPE_BEGIN && optType < OPT_TYPE_END) {
316 ret = GetCommonSocketOpt(socket, level, optType, optValue, optValueSize);
317 } else {
318 ret = GetExtSocketOptPacked(socket, level, optType, optValue, optValueSize);
319 }
320 return ret;
321 }
322
PrivilegeShutdown(uint64_t tokenId,int32_t pid,const char * peerNetworkId)323 int32_t PrivilegeShutdown(uint64_t tokenId, int32_t pid, const char *peerNetworkId)
324 {
325 if (peerNetworkId == NULL || strlen(peerNetworkId) >= DEVICE_ID_SIZE_MAX) {
326 TRANS_LOGE(TRANS_SDK, "invalid param");
327 return SOFTBUS_INVALID_PARAM;
328 }
329 char *tmpPeerNetworkId = NULL;
330 Anonymize(peerNetworkId, &tmpPeerNetworkId);
331 TRANS_LOGI(TRANS_SDK, "tokenId=%{private}" PRId64 ", pid=%{public}d, networkId=%{public}s", tokenId, pid,
332 AnonymizeWrapper(tmpPeerNetworkId));
333 AnonymizeFree(tmpPeerNetworkId);
334 return ServerIpcPrivilegeCloseChannel(tokenId, pid, peerNetworkId);
335 }
336
RegisterRelationChecker(IFeatureAbilityRelationChecker * relationChecker)337 int32_t RegisterRelationChecker(IFeatureAbilityRelationChecker *relationChecker)
338 {
339 if (relationChecker == NULL) {
340 TRANS_LOGE(TRANS_SDK, "invalid relationChecker.");
341 return SOFTBUS_INVALID_PARAM;
342 }
343 return ClientRegisterRelationChecker(relationChecker);
344 }
345
WriteAcessInfoToBuf(uint8_t * buf,uint32_t bufLen,char * sessionName,SocketAccessInfo * accessInfo)346 static int32_t WriteAcessInfoToBuf(uint8_t *buf, uint32_t bufLen, char *sessionName, SocketAccessInfo *accessInfo)
347 {
348 int32_t offSet = 0;
349 int32_t ret = WriteInt32ToBuf(buf, bufLen, &offSet, accessInfo->userId);
350 if (ret != SOFTBUS_OK) {
351 TRANS_LOGE(TRANS_CTRL, "write userId=%{public}d to buf failed! ret=%{public}d", accessInfo->userId, ret);
352 return ret;
353 }
354 ret = WriteUint64ToBuf(buf, bufLen, &offSet, accessInfo->localTokenId);
355 if (ret != SOFTBUS_OK) {
356 TRANS_LOGE(TRANS_CTRL, "write tokenId to buf failed! ret=%{public}d", ret);
357 return ret;
358 }
359 ret = WriteStringToBuf(buf, bufLen, &offSet, sessionName, strlen(sessionName) + 1);
360 if (ret != SOFTBUS_OK) {
361 TRANS_LOGE(TRANS_CTRL, "write sessionName to buf failed! ret=%{public}d", ret);
362 return ret;
363 }
364 ret = WriteStringToBuf(buf, bufLen, &offSet, accessInfo->extraAccessInfo, strlen(accessInfo->extraAccessInfo) + 1);
365 if (ret != SOFTBUS_OK) {
366 TRANS_LOGE(TRANS_CTRL, "write extraAccessInfo to buf failed! ret=%{public}d", ret);
367 return ret;
368 }
369 return SOFTBUS_OK;
370 }
371
SetAccessInfo(int32_t socket,SocketAccessInfo accessInfo)372 int32_t SetAccessInfo(int32_t socket, SocketAccessInfo accessInfo)
373 {
374 #define WRITE_BUF_PARAM_NUM 5 // tokenId + userId + 2 * string info len
375 TRANS_LOGI(TRANS_SDK, "SetAccessInfo: socket=%{public}d", socket);
376 if (accessInfo.extraAccessInfo == NULL || accessInfo.userId < 0) {
377 TRANS_LOGE(TRANS_SDK, "accessInfo param invalid, socket=%{public}d.", socket);
378 return SOFTBUS_INVALID_PARAM;
379 }
380 uint32_t extraInfoLen = strnlen(accessInfo.extraAccessInfo, EXTRA_ACCESS_INFO_LEN_MAX) + 1;
381 TRANS_CHECK_AND_RETURN_RET_LOGE(extraInfoLen <= EXTRA_ACCESS_INFO_LEN_MAX,
382 SOFTBUS_INVALID_PARAM, TRANS_SDK, "extra info len over limit");
383 char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
384 int32_t ret = ClientGetSessionNameBySessionId(socket, sessionName);
385 TRANS_CHECK_AND_RETURN_RET_LOGE(
386 ret == SOFTBUS_OK, ret, TRANS_SDK, "get sessionName by socket=%{public}d failed, ret=%{public}d", socket, ret);
387
388 uint32_t bufLen = sizeof(int32_t) * WRITE_BUF_PARAM_NUM + extraInfoLen + strlen(sessionName) + 1;
389 uint8_t *buf = (uint8_t *)SoftBusCalloc(bufLen);
390 if (buf == NULL) {
391 TRANS_LOGE(TRANS_SDK, "malloc buf failed, socket=%{public}d.", socket);
392 return SOFTBUS_MALLOC_ERR;
393 }
394 ret = WriteAcessInfoToBuf(buf, bufLen, sessionName, &accessInfo);
395 if (ret != SOFTBUS_OK) {
396 TRANS_LOGE(TRANS_CTRL, "Write accessinfo to buf failed! ret=%{public}d", ret);
397 SoftBusFree(buf);
398 return ret;
399 }
400 ret = ServerIpcProcessInnerEvent(EVENT_TYPE_SET_ACCESS_INFO, buf, bufLen);
401 if (ret != SOFTBUS_OK) {
402 TRANS_LOGE(TRANS_CTRL, "ServerIpcProcessInnerEvent failed! ret=%{public}d", ret);
403 }
404 SoftBusFree(buf);
405 return ret;
406 }
407