1 /*
2 * Copyright (c) 2021-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 "trans_server_stub.h"
17
18 #include "ipc_skeleton.h"
19 #include "lnn_connection_addr_utils.h"
20 #include "securec.h"
21 #include "softbus_common.h"
22 #include "softbus_conn_interface.h"
23 #include "softbus_error_code.h"
24 #include "softbus_permission.h"
25 #include "softbus_proxychannel_manager.h"
26 #include "softbus_trans_def.h"
27 #include "trans_auth_manager.h"
28 #include "trans_channel_manager.h"
29 #include "trans_log.h"
30 #include "trans_session_manager.h"
31 #include "trans_session_service.h"
32
ServerCreateSessionServer(IpcIo * req,IpcIo * reply)33 int32_t ServerCreateSessionServer(IpcIo *req, IpcIo *reply)
34 {
35 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
36 if (req == NULL || reply == NULL) {
37 TRANS_LOGW(TRANS_CTRL, "invalid param");
38 return SOFTBUS_INVALID_PARAM;
39 }
40 size_t size;
41 const char *pkgName = (const char*)ReadString(req, &size);
42 if (pkgName == NULL) {
43 TRANS_LOGE(TRANS_CTRL, "ServerCreateSessionServer pkgName is null");
44 return SOFTBUS_IPC_ERR;
45 }
46 const char *sessionName = (const char *)ReadString(req, &size);
47 if (sessionName == NULL) {
48 TRANS_LOGE(TRANS_CTRL, "sessionName pkgName is null");
49 return SOFTBUS_IPC_ERR;
50 }
51 int32_t callingUid = GetCallingUid();
52 int32_t callingPid = GetCallingPid();
53 if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) {
54 TRANS_LOGE(TRANS_CTRL, "no permission");
55 WriteInt32(reply, SOFTBUS_PERMISSION_DENIED);
56 return SOFTBUS_PERMISSION_DENIED;
57 }
58 int32_t ret = TransCreateSessionServer(pkgName, sessionName, callingUid, callingPid);
59 (void)WriteInt32(reply, ret);
60 return ret;
61 }
62
ServerRemoveSessionServer(IpcIo * req,IpcIo * reply)63 int32_t ServerRemoveSessionServer(IpcIo *req, IpcIo *reply)
64 {
65 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
66 if (req == NULL || reply == NULL) {
67 TRANS_LOGW(TRANS_CTRL, "invalid param");
68 return SOFTBUS_INVALID_PARAM;
69 }
70 size_t size;
71 const char *pkgName = (const char*)ReadString(req, &size);
72 if (pkgName == NULL) {
73 TRANS_LOGE(TRANS_CTRL, "ServerRemoveSessionServer pkgName is null");
74 return SOFTBUS_IPC_ERR;
75 }
76 const char *sessionName = (const char *)ReadString(req, &size);
77 if (sessionName == NULL) {
78 TRANS_LOGE(TRANS_CTRL, "ServerRemoveSessionServer sessionName is null");
79 return SOFTBUS_IPC_ERR;
80 }
81 int32_t callingUid = GetCallingUid();
82 int32_t callingPid = GetCallingPid();
83 if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_CREATE) != SOFTBUS_OK) {
84 TRANS_LOGE(TRANS_CTRL, "no permission");
85 WriteInt32(reply, SOFTBUS_PERMISSION_DENIED);
86 return SOFTBUS_PERMISSION_DENIED;
87 }
88 int32_t ret = TransRemoveSessionServer(pkgName, sessionName);
89 WriteInt32(reply, ret);
90 return ret;
91 }
92
CheckOpenSessionPremission(const char * sessionName,const char * peerSessionName)93 static int32_t CheckOpenSessionPremission(const char *sessionName, const char *peerSessionName)
94 {
95 char pkgName[PKG_NAME_SIZE_MAX] = {0};
96 if (TransGetPkgNameBySessionName(sessionName, pkgName, PKG_NAME_SIZE_MAX) != SOFTBUS_OK) {
97 TRANS_LOGE(TRANS_CTRL, "TransGetPkgNameBySessionName failed");
98 return SOFTBUS_INVALID_PARAM;
99 }
100
101 int32_t callingUid = GetCallingUid();
102 int32_t callingPid = GetCallingPid();
103 if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_OPEN) != SOFTBUS_OK) {
104 TRANS_LOGE(TRANS_CTRL, "no permission");
105 return SOFTBUS_PERMISSION_DENIED;
106 }
107
108 if (CheckTransSecLevel(sessionName, peerSessionName) != SOFTBUS_OK) {
109 TRANS_LOGE(TRANS_CTRL, "sec level invalid");
110 return SOFTBUS_PERMISSION_DENIED;
111 }
112 return SOFTBUS_OK;
113 }
114
ServerReadSessionAttrs(IpcIo * req,SessionAttribute * getAttr)115 static void ServerReadSessionAttrs(IpcIo *req, SessionAttribute *getAttr)
116 {
117 if (getAttr == NULL || req == NULL) {
118 TRANS_LOGE(TRANS_CTRL, "getAttr and req is NULL");
119 return;
120 }
121 LinkType *pGetArr = NULL;
122
123 if (!ReadInt32(req, &getAttr->dataType)) {
124 TRANS_LOGE(TRANS_CTRL, "read dataType failed");
125 return;
126 }
127
128 if (!ReadInt32(req, &getAttr->linkTypeNum)) {
129 TRANS_LOGE(TRANS_CTRL, "read linkTypeNum failed");
130 return;
131 }
132
133 if (getAttr->linkTypeNum > 0) {
134 pGetArr = (LinkType *)ReadBuffer(req, sizeof(LinkType) * getAttr->linkTypeNum);
135 }
136
137 if (pGetArr != NULL && getAttr->linkTypeNum <= LINK_TYPE_MAX) {
138 (void)memcpy_s(getAttr->linkType, sizeof(LinkType) * LINK_TYPE_MAX,
139 pGetArr, sizeof(LinkType) * getAttr->linkTypeNum);
140 }
141
142 if (!ReadInt32(req, &getAttr->attr.streamAttr.streamType)) {
143 TRANS_LOGE(TRANS_CTRL, "read streamType failed");
144 return;
145 }
146
147 if (!ReadUint16(req, &getAttr->fastTransDataSize)) {
148 TRANS_LOGE(TRANS_CTRL, "read fastTransDataSize failed");
149 return;
150 }
151
152 if (getAttr->fastTransDataSize != 0) {
153 getAttr->fastTransData = (uint8_t *)ReadRawData(req, getAttr->fastTransDataSize);
154 }
155 }
156
ReadQosInfo(IpcIo * req,SessionParam * param)157 static bool ReadQosInfo(IpcIo *req, SessionParam *param)
158 {
159 if (req == NULL || param == NULL) {
160 TRANS_LOGE(TRANS_CTRL, "param or req is NULL");
161 return false;
162 }
163
164 if (!ReadBool(req, ¶m->isQosLane)) {
165 TRANS_LOGE(TRANS_SDK, "read qos flag failed!");
166 return false;
167 }
168
169 if (!param->isQosLane) {
170 return true;
171 }
172
173 if (!ReadUint32(req, ¶m->qosCount)) {
174 TRANS_LOGE(TRANS_SDK, "read count of qos failed!");
175 return false;
176 }
177
178 if (param->qosCount == 0) {
179 return true;
180 }
181
182 if (param->qosCount > QOS_TYPE_BUTT) {
183 TRANS_LOGE(TRANS_SDK, "read invalid qosCount=%{public}" PRIu32, param->qosCount);
184 return false;
185 }
186
187 const QosTV *qosInfo = (QosTV *)ReadBuffer(req, sizeof(QosTV) * param->qosCount);
188 if (qosInfo == NULL) {
189 COMM_LOGE(COMM_SVC, "failed to read qos data");
190 return false;
191 }
192
193 if (memcpy_s(param->qos, sizeof(QosTV) * QOS_TYPE_BUTT, qosInfo, sizeof(QosTV) * param->qosCount) != EOK) {
194 COMM_LOGE(COMM_SVC, "failed memcpy qos info");
195 return false;
196 }
197
198 return true;
199 }
200
ServerOpenSession(IpcIo * req,IpcIo * reply)201 int32_t ServerOpenSession(IpcIo *req, IpcIo *reply)
202 {
203 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
204 if (req == NULL || reply == NULL) {
205 TRANS_LOGW(TRANS_CTRL, "invalid param");
206 return SOFTBUS_INVALID_PARAM;
207 }
208
209 int32_t ret;
210 size_t size;
211 SessionParam param;
212 SessionAttribute getAttr;
213 (void)memset_s(¶m, sizeof(SessionParam), 0, sizeof(SessionParam));
214 (void)memset_s(&getAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute));
215 TransSerializer transSerializer;
216 transSerializer.transInfo.channelId = INVALID_CHANNEL_ID;
217 transSerializer.transInfo.channelType = CHANNEL_TYPE_BUTT;
218 param.sessionName = (const char*)ReadString(req, &size);
219 param.peerSessionName = (const char *)ReadString(req, &size);
220 param.peerDeviceId = (const char *)ReadString(req, &size);
221 param.groupId = (const char *)ReadString(req, &size);
222 ReadBool(req, ¶m.isAsync);
223 ReadInt32(req, ¶m.sessionId);
224 ServerReadSessionAttrs(req, &getAttr);
225 param.attr = &getAttr;
226 if (!ReadQosInfo(req, ¶m)) {
227 TRANS_LOGE(TRANS_CTRL, "failed to read qos info");
228 return SOFTBUS_IPC_ERR;
229 }
230
231 ret = CheckOpenSessionPremission(param.sessionName, param.peerSessionName);
232 if (ret != SOFTBUS_OK) {
233 transSerializer.ret = ret;
234 WriteUint32(reply, sizeof(TransSerializer));
235 bool value = WriteBuffer(reply, (void *)&transSerializer, sizeof(TransSerializer));
236 if (!value) {
237 return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED;
238 }
239 return ret;
240 }
241
242 ret = TransOpenSession(¶m, &(transSerializer.transInfo));
243 transSerializer.ret = ret;
244 WriteUint32(reply, sizeof(TransSerializer));
245 bool value = WriteBuffer(reply, (void *)&transSerializer, sizeof(TransSerializer));
246 if (!value) {
247 return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED;
248 }
249 return ret;
250 }
251
ServerOpenAuthSession(IpcIo * req,IpcIo * reply)252 int32_t ServerOpenAuthSession(IpcIo *req, IpcIo *reply)
253 {
254 TRANS_LOGD(TRANS_CTRL, "ipc server pop");
255 if (req == NULL || reply == NULL) {
256 TRANS_LOGW(TRANS_CTRL, "invalid param");
257 return SOFTBUS_INVALID_PARAM;
258 }
259 int32_t ret;
260 size_t size;
261 ConnectOption connOpt;
262 const char *sessionName = (const char*)ReadString(req, &size);
263 ConnectionAddr *addr = (ConnectionAddr *)ReadRawData(req, sizeof(ConnectionAddr));
264 if (!LnnConvertAddrToOption(addr, &connOpt)) {
265 TRANS_LOGE(TRANS_CTRL, "LnnConvertAddrToOption fail");
266 WriteInt32(reply, SOFTBUS_NO_INIT);
267 return SOFTBUS_NO_INIT;
268 }
269 ConnectParam param;
270 (void)memset_s(¶m, sizeof(ConnectParam), 0, sizeof(ConnectParam));
271 if (addr->type == CONNECTION_ADDR_BLE) {
272 param.blePriority = addr->info.ble.priority;
273 }
274
275 ret = CheckOpenSessionPremission(sessionName, sessionName);
276 if (ret != SOFTBUS_OK) {
277 WriteInt32(reply, ret);
278 return ret;
279 }
280 ret = TransOpenAuthChannel(sessionName, &connOpt, "", ¶m);
281 WriteInt32(reply, ret);
282 return ret;
283 }
284
ServerNotifyAuthSuccess(IpcIo * req,IpcIo * reply)285 int32_t ServerNotifyAuthSuccess(IpcIo *req, IpcIo *reply)
286 {
287 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
288 if (req == NULL || reply == NULL) {
289 TRANS_LOGW(TRANS_CTRL, "invalid param");
290 return SOFTBUS_INVALID_PARAM;
291 }
292 int32_t channelId = 0;
293 int32_t channelType = -1;
294 ReadInt32(req, &channelId);
295 ReadInt32(req, &channelType);
296 int32_t callingUid = GetCallingUid();
297 int32_t callingPid = GetCallingPid();
298 char pkgName[PKG_NAME_SIZE_MAX] = { 0 };
299 char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
300 if (TransAuthGetNameByChanId(channelId, pkgName, sessionName,
301 PKG_NAME_SIZE_MAX, SESSION_NAME_SIZE_MAX) != SOFTBUS_OK) {
302 TRANS_LOGE(TRANS_CTRL, "get session name fail");
303 WriteInt32(reply, SOFTBUS_TRANS_UDP_INVALID_CHANNEL_ID);
304 return SOFTBUS_TRANS_UDP_INVALID_CHANNEL_ID;
305 }
306 if (CheckTransPermission(callingUid, callingPid, pkgName, sessionName, ACTION_OPEN) != SOFTBUS_OK) {
307 TRANS_LOGE(TRANS_CTRL, "ServerCloseChannel no permission");
308 WriteInt32(reply, SOFTBUS_PERMISSION_DENIED);
309 return SOFTBUS_PERMISSION_DENIED;
310 }
311
312 int32_t ret = TransNotifyAuthSuccess(channelId, channelType);
313 WriteInt32(reply, ret);
314 return ret;
315 }
316
ServerCloseChannel(IpcIo * req,IpcIo * reply)317 int32_t ServerCloseChannel(IpcIo *req, IpcIo *reply)
318 {
319 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
320 if (req == NULL || reply == NULL) {
321 TRANS_LOGW(TRANS_CTRL, "invalid param");
322 return SOFTBUS_INVALID_PARAM;
323 }
324
325 int32_t ret;
326 int32_t channelId = 0;
327 int32_t channelType = 0;
328 const char *sessionName = NULL;
329 uint32_t size;
330 ReadInt32(req, &channelId);
331 ReadInt32(req, &channelType);
332 if (channelType == CHANNEL_TYPE_UNDEFINED) {
333 sessionName = (const char*)ReadString(req, &size);
334 if (sessionName == NULL) {
335 TRANS_LOGE(TRANS_CTRL, "ServerCloseChannel sessionName is null");
336 return SOFTBUS_IPC_ERR;
337 }
338 }
339 ret = TransCloseChannel(sessionName, channelId, channelType);
340
341 WriteInt32(reply, ret);
342 return ret;
343 }
344
ServerSendSessionMsg(IpcIo * req,IpcIo * reply)345 int32_t ServerSendSessionMsg(IpcIo *req, IpcIo *reply)
346 {
347 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
348 if (req == NULL || reply == NULL) {
349 TRANS_LOGW(TRANS_CTRL, "invalid param");
350 return SOFTBUS_INVALID_PARAM;
351 }
352 int32_t channelId = 0;
353 int32_t channelType = 0;
354 int32_t msgType = 0;
355 (void)ReadInt32(req, &channelId);
356 (void)ReadInt32(req, &channelType);
357 (void)ReadInt32(req, &msgType);
358 uint32_t size = 0;
359 ReadUint32(req, &size);
360 const void *data = (const void *)ReadBuffer(req, size);
361 int32_t ret = TransSendMsg(channelId, channelType, data, size, msgType);
362 WriteInt32(reply, ret);
363 return ret;
364 }
365
ServerReleaseResources(IpcIo * req,IpcIo * reply)366 int32_t ServerReleaseResources(IpcIo *req, IpcIo *reply)
367 {
368 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
369 if (req == NULL || reply == NULL) {
370 TRANS_LOGW(TRANS_CTRL, "invalid param");
371 return SOFTBUS_INVALID_PARAM;
372 }
373 int32_t channelId = 0;
374 if (!ReadInt32(req, &channelId)) {
375 TRANS_LOGE(TRANS_CTRL, "failed to read channelId");
376 return SOFTBUS_IPC_ERR;
377 }
378
379 int32_t ret = TransReleaseUdpResources(channelId);
380 return ret;
381 }
382
ServerProcessInnerEvent(IpcIo * req,IpcIo * reply)383 int32_t ServerProcessInnerEvent(IpcIo *req, IpcIo *reply)
384 {
385 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
386 if (req == NULL || reply == NULL) {
387 TRANS_LOGW(TRANS_CTRL, "invalid param");
388 return SOFTBUS_INVALID_PARAM;
389 }
390 int32_t eventType = 0;
391 if (!ReadInt32(req, &eventType)) {
392 TRANS_LOGE(TRANS_CTRL, "failed to read eventType");
393 return SOFTBUS_IPC_ERR;
394 }
395 uint32_t len = 0;
396 if (!ReadUint32(req, &len)) {
397 TRANS_LOGE(TRANS_CTRL, "failed to read len");
398 return SOFTBUS_IPC_ERR;
399 }
400 uint8_t* buf = (uint8_t *)ReadRawData(req, len);
401 if (buf == NULL) {
402 TRANS_LOGE(TRANS_CTRL, "failed to read buf");
403 return SOFTBUS_IPC_ERR;
404 }
405 int32_t ret = TransProcessInnerEvent(eventType, buf, len);
406 return ret;
407 }
408
ServerPrivilegeCloseChannel(IpcIo * req,IpcIo * reply)409 int32_t ServerPrivilegeCloseChannel(IpcIo *req, IpcIo *reply)
410 {
411 #define DMS_CALLING_UID 5522
412 TRANS_LOGI(TRANS_CTRL, "ipc server pop");
413 if (req == NULL || reply == NULL) {
414 TRANS_LOGW(TRANS_CTRL, "invalid param");
415 return SOFTBUS_INVALID_PARAM;
416 }
417 int32_t callingUid = GetCallingUid();
418 if (callingUid != DMS_CALLING_UID) {
419 TRANS_LOGE(TRANS_CTRL, "uid check failed");
420 return SOFTBUS_PERMISSION_DENIED;
421 }
422 int32_t ret;
423 uint64_t tokenId = 0;
424 int32_t pid = 0;
425 const char *peerNetworkId = NULL;
426 uint32_t size;
427 if (ReadUint64(req, &tokenId)) {
428 TRANS_LOGE(TRANS_CTRL, "failed to read tokenId");
429 return SOFTBUS_IPC_ERR;
430 }
431 if (ReadInt32(req, &pid)) {
432 TRANS_LOGE(TRANS_CTRL, "failed to read pid");
433 return SOFTBUS_IPC_ERR;
434 }
435 peerNetworkId = (const char*)ReadString(req, &size);
436 if (peerNetworkId == NULL) {
437 TRANS_LOGE(TRANS_CTRL, "peerNetWorkId is null");
438 return SOFTBUS_IPC_ERR;
439 }
440 ret = TransPrivilegeCloseChannel(tokenId, pid, peerNetworkId);
441 WriteInt32(reply, ret);
442 return ret;
443 }