• 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 "inner_socket.h"
26 #include "session_ipc_adapter.h"
27 #include "socket.h"
28 #include "softbus_access_token_adapter.h"
29 #include "softbus_adapter_mem.h"
30 #include "softbus_def.h"
31 #include "softbus_error_code.h"
32 #include "softbus_utils.h"
33 #include "trans_log.h"
34 #include "trans_server_proxy.h"
35 
CheckSocketInfoIsValid(const SocketInfo * info)36 static int32_t CheckSocketInfoIsValid(const SocketInfo *info)
37 {
38     if (!IsValidString(info->name, SESSION_NAME_SIZE_MAX - 1) ||
39         !IsValidString(info->pkgName, PKG_NAME_SIZE_MAX - 1)) {
40         TRANS_LOGE(TRANS_SDK, "invalid name or package name of socket");
41         return SOFTBUS_INVALID_PARAM;
42     }
43 
44     if (info->peerName != NULL && !IsValidString(info->peerName, SESSION_NAME_SIZE_MAX - 1)) {
45         char *anonySessionName = NULL;
46         Anonymize(info->peerName, &anonySessionName);
47         TRANS_LOGI(TRANS_SDK, "strcpy peerName failed, peerName=%{public}s, peerNameLen=%{public}zu",
48             AnonymizeWrapper(anonySessionName), strlen(info->peerName));
49         AnonymizeFree(anonySessionName);
50         return SOFTBUS_INVALID_PARAM;
51     }
52 
53     if (info->peerNetworkId != NULL && !IsValidString(info->peerNetworkId, DEVICE_ID_SIZE_MAX - 1)) {
54         char *anonyNetworkId = NULL;
55         Anonymize(info->peerNetworkId, &anonyNetworkId);
56         TRANS_LOGI(TRANS_SDK, "strcpy peerNetworkId failed, peerNetworkId=%{public}s, peerNetworkIdLen=%{public}zu",
57             AnonymizeWrapper(anonyNetworkId), strlen(info->peerNetworkId));
58         AnonymizeFree(anonyNetworkId);
59         return SOFTBUS_INVALID_PARAM;
60     }
61     return SOFTBUS_OK;
62 }
63 
PrintSocketInfo(const SocketInfo * info)64 static void PrintSocketInfo(const SocketInfo *info)
65 {
66     char *tmpMyName = NULL;
67     char *tmpPeerName = NULL;
68     char *tmpPeerNetworkId = NULL;
69     char *tmpPkgName = NULL;
70     Anonymize(info->name, &tmpMyName);
71     Anonymize(info->peerName, &tmpPeerName);
72     Anonymize(info->peerNetworkId, &tmpPeerNetworkId);
73     Anonymize(info->pkgName, &tmpPkgName);
74     TRANS_LOGI(TRANS_SDK,
75         "Socket: mySessionName=%{public}s, peerSessionName=%{public}s, peerNetworkId=%{public}s, "
76         "pkgName=%{public}s, dataType=%{public}d", AnonymizeWrapper(tmpMyName), AnonymizeWrapper(tmpPeerName),
77         AnonymizeWrapper(tmpPeerNetworkId), AnonymizeWrapper(tmpPkgName), info->dataType);
78     AnonymizeFree(tmpMyName);
79     AnonymizeFree(tmpPeerName);
80     AnonymizeFree(tmpPeerNetworkId);
81     AnonymizeFree(tmpPkgName);
82 }
83 
Socket(SocketInfo info)84 int32_t Socket(SocketInfo info)
85 {
86     int32_t ret = CheckSocketInfoIsValid(&info);
87     if (ret != SOFTBUS_OK) {
88         TRANS_LOGW(TRANS_SDK, "invalid SocketInfo");
89         return ret;
90     }
91 
92     PrintSocketInfo(&info);
93     ret = CreateSocket(info.pkgName, info.name);
94     if (ret != SOFTBUS_OK) {
95         TRANS_LOGE(TRANS_SDK, "CreateSocket failed, ret=%{public}d.", ret);
96         return ret;
97     }
98 
99     int32_t socketFd = INVALID_SESSION_ID;
100     char newSessionName[SESSION_NAME_SIZE_MAX + 1] = {0};
101     uint64_t callingFullTokenId = 0;
102     ret = SoftBusGetCallingFullTokenId(&callingFullTokenId);
103     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get callingFullTokenId failed");
104 
105     if (SoftBusCheckIsNormalApp(callingFullTokenId, info.name)) {
106         if (strncpy_s(newSessionName, SESSION_NAME_SIZE_MAX + 1, info.name, strlen(info.name)) != EOK) {
107             TRANS_LOGE(TRANS_SDK, "copy session name failed");
108             return SOFTBUS_STRCPY_ERR;
109         }
110         if (!RemoveAppIdFromSessionName(info.name, newSessionName, SESSION_NAME_SIZE_MAX + 1)) {
111             TRANS_LOGE(TRANS_SDK, "invalid bundlename or appId and delete appId failed");
112             return SOFTBUS_TRANS_NOT_FIND_APPID;
113         }
114         info.name = newSessionName;
115     }
116     ret = ClientAddSocket(&info, &socketFd);
117     SocketServerStateUpdate(info.name);
118     if (ret != SOFTBUS_OK) {
119         TRANS_LOGE(TRANS_SDK, "add socket failed, ret=%{public}d.", ret);
120         return ret;
121     }
122     TRANS_LOGD(TRANS_SDK, "create socket ok, socket=%{public}d", socketFd);
123     return socketFd;
124 }
125 
Listen(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)126 int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
127 {
128     TRANS_LOGD(TRANS_SDK, "Listen: socket=%{public}d", socket);
129     return ClientListen(socket, qos, qosCount, listener);
130 }
131 
StartBindWaitTimer(int32_t socket,const QosTV qos[],uint32_t qosCount)132 static int32_t StartBindWaitTimer(int32_t socket, const QosTV qos[], uint32_t qosCount)
133 {
134 #define DEFAULT_MAX_WAIT_TIMEOUT 30000 // 30s
135     int32_t maxWaitTime;
136     int32_t ret = GetQosValue(qos, qosCount, QOS_TYPE_MAX_WAIT_TIMEOUT, &maxWaitTime, DEFAULT_MAX_WAIT_TIMEOUT);
137     if (ret != SOFTBUS_OK) {
138         TRANS_LOGE(TRANS_SDK, "get max wait timeout fail ret=%{public}d", ret);
139         return ret;
140     }
141 
142     if (maxWaitTime <= 0) {
143         TRANS_LOGE(TRANS_SDK, "invalid max wait timeout. maxWaitTime=%{public}d", maxWaitTime);
144         return SOFTBUS_INVALID_PARAM;
145     }
146 
147     return ClientHandleBindWaitTimer(socket, (uint32_t)maxWaitTime, TIMER_ACTION_START);
148 }
149 
Bind(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)150 int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
151 {
152     TRANS_LOGI(TRANS_SDK, "Bind: socket=%{public}d", socket);
153     if (IsSessionExceedLimit()) {
154         TRANS_LOGE(TRANS_SDK, "Bind failed, over session num limit");
155         return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
156     }
157     int32_t ret = StartBindWaitTimer(socket, qos, qosCount);
158     if (ret == SOFTBUS_ALREADY_TRIGGERED) {
159         TRANS_LOGW(TRANS_SDK, "already success, socket=%{public}d", socket);
160         return SOFTBUS_OK;
161     } else if (ret != SOFTBUS_OK) {
162         TRANS_LOGE(TRANS_SDK, "Start timer failed, ret=%{public}d", ret);
163         return ret;
164     }
165 
166     ret = ClientBind(socket, qos, qosCount, listener, false);
167     TRANS_LOGI(TRANS_SDK, "Bind end, stop timer, socket=%{public}d", socket);
168     (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
169     if (ret != SOFTBUS_OK) {
170         (void)SetSessionStateBySessionId(socket, SESSION_STATE_INIT, 0);
171     }
172     return ret;
173 }
174 
BindAsync(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)175 int32_t BindAsync(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
176 {
177     TRANS_LOGI(TRANS_SDK, "Bind async socket=%{public}d", socket);
178     if (IsSessionExceedLimit()) {
179         TRANS_LOGE(TRANS_SDK, "Bind async failed, over session num limit");
180         return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
181     }
182 
183     int32_t ret = StartBindWaitTimer(socket, qos, qosCount);
184     if (ret == SOFTBUS_ALREADY_TRIGGERED) {
185         TRANS_LOGW(TRANS_SDK, "already success, socket=%{public}d", socket);
186         return SOFTBUS_OK;
187     } else if (ret != SOFTBUS_OK) {
188         TRANS_LOGE(TRANS_SDK, "Start timer failed, ret=%{public}d, socket=%{public}d", ret, socket);
189         return ret;
190     }
191 
192     ret = ClientBind(socket, qos, qosCount, listener, true);
193     if (ret != SOFTBUS_OK) {
194         TRANS_LOGE(TRANS_SDK, "BindAsync fail, stop timer, ret=%{public}d, socket=%{public}d", ret, socket);
195         (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
196         (void)SetSessionStateBySessionId(socket, SESSION_STATE_INIT, 0);
197     }
198     return ret;
199 }
200 
Shutdown(int32_t socket)201 void Shutdown(int32_t socket)
202 {
203     TRANS_LOGI(TRANS_SDK, "Shutdown: socket=%{public}d", socket);
204     (void)ClientHandleBindWaitTimer(socket, 0, TIMER_ACTION_STOP);
205     ClientShutdown(socket, SOFTBUS_TRANS_STOP_BIND_BY_CANCEL);
206 }
207 
EvaluateQos(const char * peerNetworkId,TransDataType dataType,const QosTV * qos,uint32_t qosCount)208 int32_t EvaluateQos(const char *peerNetworkId, TransDataType dataType, const QosTV *qos, uint32_t qosCount)
209 {
210     if (!IsValidString(peerNetworkId, DEVICE_ID_SIZE_MAX) || dataType >= DATA_TYPE_BUTT ||
211         (qos == NULL && qosCount != 0) || (qosCount > QOS_TYPE_BUTT)) {
212         TRANS_LOGE(TRANS_SDK, "invalid param");
213         return SOFTBUS_INVALID_PARAM;
214     }
215 
216     return ServerIpcEvaluateQos(peerNetworkId, dataType, qos, qosCount);
217 }
218 
GetMtuSize(int32_t socket,uint32_t * mtuSize)219 int32_t GetMtuSize(int32_t socket, uint32_t *mtuSize)
220 {
221     TRANS_LOGI(TRANS_SDK, "GetMtuSize: socket=%{public}d", socket);
222     return GetSocketMtuSize(socket, mtuSize);
223 }
224 
DBinderGrantPermission(int32_t uid,int32_t pid,const char * socketName)225 int32_t DBinderGrantPermission(int32_t uid, int32_t pid, const char *socketName)
226 {
227     return ClientGrantPermission(uid, pid, socketName);
228 }
229 
DBinderRemovePermission(const char * socketName)230 int32_t DBinderRemovePermission(const char *socketName)
231 {
232     return ClientRemovePermission(socketName);
233 }
234 
DfsBind(int32_t socket,const ISocketListener * listener)235 int32_t DfsBind(int32_t socket, const ISocketListener *listener)
236 {
237     return ClientDfsBind(socket, listener);
238 }
239 
CheckSocketOptParam(OptLevel level,OptType optType,void * optValue)240 static int32_t CheckSocketOptParam(OptLevel level, OptType optType, void *optValue)
241 {
242     if (level < 0 || level >= OPT_LEVEL_BUTT) {
243         TRANS_LOGE(TRANS_SDK, "invalid level.");
244         return SOFTBUS_INVALID_PARAM;
245     }
246     if (optType < 0) {
247         TRANS_LOGE(TRANS_SDK, "invalid optType.");
248         return SOFTBUS_INVALID_PARAM;
249     }
250     if (optValue == NULL) {
251         TRANS_LOGE(TRANS_SDK, "invalid optValue.");
252         return SOFTBUS_INVALID_PARAM;
253     }
254     return SOFTBUS_OK;
255 }
256 
SetSocketOpt(int32_t socket,OptLevel level,OptType optType,void * optValue,int32_t optValueSize)257 int32_t SetSocketOpt(int32_t socket, OptLevel level, OptType optType, void *optValue, int32_t optValueSize)
258 {
259     int32_t ret = CheckSocketOptParam(level, optType, optValue);
260     if (ret != SOFTBUS_OK) {
261         return ret;
262     }
263     if (optValueSize <= 0) {
264         TRANS_LOGE(TRANS_SDK, "invalid optValueSize.");
265         return SOFTBUS_INVALID_PARAM;
266     }
267     if (optType >= OPT_TYPE_BEGIN && optType < OPT_TYPE_END) {
268         ret = SetCommonSocketOpt(socket, level, optType, optValue, optValueSize);
269     } else {
270         ret = SetExtSocketOpt(socket, level, optType, optValue, optValueSize);
271     }
272     return ret;
273 }
274 
GetSocketOpt(int32_t socket,OptLevel level,OptType optType,void * optValue,int32_t * optValueSize)275 int32_t GetSocketOpt(int32_t socket, OptLevel level, OptType optType, void *optValue, int32_t *optValueSize)
276 {
277     int32_t ret = CheckSocketOptParam(level, optType, optValue);
278     if (ret != SOFTBUS_OK) {
279         return ret;
280     }
281     if (optValueSize == NULL) {
282         TRANS_LOGE(TRANS_SDK, "invalid optValueSize.");
283         return SOFTBUS_INVALID_PARAM;
284     }
285     if (optType >= OPT_TYPE_BEGIN && optType < OPT_TYPE_END) {
286         ret = GetCommonSocketOpt(socket, level, optType, optValue, optValueSize);
287     } else {
288         ret = GetExtSocketOpt(socket, level, optType, optValue, optValueSize);
289     }
290     return ret;
291 }
292 
PrivilegeShutdown(uint64_t tokenId,int32_t pid,const char * peerNetworkId)293 int32_t PrivilegeShutdown(uint64_t tokenId, int32_t pid, const char *peerNetworkId)
294 {
295     if (peerNetworkId == NULL || strlen(peerNetworkId) >= DEVICE_ID_SIZE_MAX) {
296         TRANS_LOGE(TRANS_SDK, "invalid param");
297         return SOFTBUS_INVALID_PARAM;
298     }
299     char *tmpPeerNetworkId = NULL;
300     Anonymize(peerNetworkId, &tmpPeerNetworkId);
301     TRANS_LOGI(TRANS_SDK, "tokenId=%{private}" PRId64 ", pid=%{public}d, networkId=%{public}s", tokenId, pid,
302         AnonymizeWrapper(tmpPeerNetworkId));
303     AnonymizeFree(tmpPeerNetworkId);
304     return ServerIpcPrivilegeCloseChannel(tokenId, pid, peerNetworkId);
305 }
306 
RegisterRelationChecker(IFeatureAbilityRelationChecker * relationChecker)307 int32_t RegisterRelationChecker(IFeatureAbilityRelationChecker *relationChecker)
308 {
309     if (relationChecker == NULL) {
310         TRANS_LOGE(TRANS_SDK, "invalid relationChecker.");
311         return SOFTBUS_INVALID_PARAM;
312     }
313     return ClientRegisterRelationChecker(relationChecker);
314 }
315