• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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