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