• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param->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, &param->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(&param, 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, &param.isAsync);
223     ReadInt32(req, &param.sessionId);
224     ServerReadSessionAttrs(req, &getAttr);
225     param.attr = &getAttr;
226     if (!ReadQosInfo(req, &param)) {
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(&param, &(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(&param, 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, "", &param);
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];
299     char sessionName[SESSION_NAME_SIZE_MAX];
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 }