1 /*
2  * Copyright (c) 2021-2023 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_session_service.h"
17 
18 #include <stdatomic.h>
19 
20 #include "anonymizer.h"
21 #include "securec.h"
22 #include "softbus_adapter_mem.h"
23 #include "softbus_def.h"
24 #include "softbus_errcode.h"
25 #include "softbus_permission.h"
26 #include "softbus_qos.h"
27 #include "softbus_scenario_manager.h"
28 #include "softbus_utils.h"
29 #include "trans_channel_manager.h"
30 #include "trans_event.h"
31 #include "trans_log.h"
32 #include "trans_session_manager.h"
33 
34 static _Atomic bool g_transSessionInitFlag = false;
35 
TransServerInit(void)36 int32_t TransServerInit(void)
37 {
38     if (atomic_load_explicit(&g_transSessionInitFlag, memory_order_acquire)) {
39         return SOFTBUS_OK;
40     }
41     int32_t ret = TransPermissionInit();
42     if (ret != SOFTBUS_OK) {
43         TRANS_LOGE(TRANS_INIT, "Init trans permission failed");
44         return ret;
45     }
46     ret = TransSessionMgrInit();
47     if (ret != SOFTBUS_OK) {
48         TRANS_LOGE(TRANS_INIT, "TransSessionMgrInit failed");
49         return ret;
50     }
51     ret = TransChannelInit();
52     if (ret != SOFTBUS_OK) {
53         TRANS_LOGE(TRANS_INIT, "TransChannelInit failed");
54         return ret;
55     }
56     ret = InitQos();
57     if (ret != SOFTBUS_OK) {
58         TRANS_LOGE(TRANS_INIT, "QosInit Failed");
59         return ret;
60     }
61     ret = ScenarioManagerGetInstance();
62     if (ret != SOFTBUS_OK) {
63         TRANS_LOGE(TRANS_INIT, "ScenarioManager init Failed");
64         return ret;
65     }
66     atomic_store_explicit(&g_transSessionInitFlag, true, memory_order_release);
67     TRANS_LOGI(TRANS_INIT, "trans session server list init succ");
68     return SOFTBUS_OK;
69 }
70 
TransServerDeinit(void)71 void TransServerDeinit(void)
72 {
73     if (!atomic_load_explicit(&g_transSessionInitFlag, memory_order_acquire)) {
74         return;
75     }
76 
77     TransSessionMgrDeinit();
78     TransChannelDeinit();
79     TransPermissionDeinit();
80     ScenarioManagerdestroyInstance();
81     atomic_store_explicit(&g_transSessionInitFlag, false, memory_order_release);
82 }
83 
TransServerDeathCallback(const char * pkgName,int32_t pid)84 void TransServerDeathCallback(const char *pkgName, int32_t pid)
85 {
86     TransChannelDeathCallback(pkgName, pid);
87     TransDelItemByPackageName(pkgName, pid);
88 }
89 
TransCreateSessionServer(const char * pkgName,const char * sessionName,int32_t uid,int32_t pid)90 int32_t TransCreateSessionServer(const char *pkgName, const char *sessionName, int32_t uid, int32_t pid)
91 {
92     if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) ||
93         !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
94         return SOFTBUS_INVALID_PARAM;
95     }
96     char *tmpName = NULL;
97     Anonymize(sessionName, &tmpName);
98     TRANS_LOGI(TRANS_CTRL, "pkgName=%{public}s, sessionName=%{public}s, uid=%{public}d, pid=%{public}d",
99         pkgName, tmpName, uid, pid);
100     AnonymizeFree(tmpName);
101     SessionServer *newNode = (SessionServer *)SoftBusCalloc(sizeof(SessionServer));
102     if (newNode == NULL) {
103         return SOFTBUS_MALLOC_ERR;
104     }
105     if (strcpy_s(newNode->pkgName, sizeof(newNode->pkgName), pkgName) != EOK) {
106         SoftBusFree(newNode);
107         return SOFTBUS_STRCPY_ERR;
108     }
109     if (strcpy_s(newNode->sessionName, sizeof(newNode->sessionName), sessionName) != EOK) {
110         SoftBusFree(newNode);
111         return SOFTBUS_STRCPY_ERR;
112     }
113     newNode->type = SEC_TYPE_CIPHERTEXT;
114     newNode->uid = uid;
115     newNode->pid = pid;
116 
117     int32_t ret = TransSessionServerAddItem(newNode);
118     TransEventExtra extra = {
119         .socketName = sessionName,
120         .callerPkg = pkgName,
121         .errcode = ret,
122         .result = ret == SOFTBUS_OK ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED
123     };
124     if (ret != SOFTBUS_OK) {
125         SoftBusFree(newNode);
126         if (ret == SOFTBUS_SERVER_NAME_REPEATED) {
127             TRANS_LOGD(TRANS_CTRL, "session server is already created");
128         }
129         TRANS_EVENT(EVENT_SCENE_TRANS_CREATE_SESS_SERVER, EVENT_STAGE_TRANS_COMMON_ONE, extra);
130         return ret;
131     }
132     TRANS_EVENT(EVENT_SCENE_TRANS_CREATE_SESS_SERVER, EVENT_STAGE_TRANS_COMMON_ONE, extra);
133     TRANS_LOGD(TRANS_CTRL, "ok");
134     return SOFTBUS_OK;
135 }
136 
TransRemoveSessionServer(const char * pkgName,const char * sessionName)137 int32_t TransRemoveSessionServer(const char *pkgName, const char *sessionName)
138 {
139     if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) ||
140         !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
141         return SOFTBUS_INVALID_PARAM;
142     }
143     int32_t ret = TransSessionServerDelItem(sessionName);
144     TransEventExtra extra = {
145         .socketName = sessionName,
146         .callerPkg = pkgName,
147         .errcode = ret,
148         .result = ret == SOFTBUS_OK ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED
149     };
150     TRANS_EVENT(EVENT_SCENE_TRANS_REMOVE_SESS_SERVER, EVENT_STAGE_TRANS_COMMON_ONE, extra);
151     return ret;
152 }
153 
TransOpenSession(const SessionParam * param,TransInfo * info)154 int32_t TransOpenSession(const SessionParam *param, TransInfo *info)
155 {
156     if (!IsValidString(param->sessionName, SESSION_NAME_SIZE_MAX) ||
157         !IsValidString(param->peerSessionName, SESSION_NAME_SIZE_MAX) ||
158         !IsValidString(param->peerDeviceId, DEVICE_ID_SIZE_MAX) ||
159         (param->isQosLane && param->qosCount > QOS_TYPE_BUTT)) {
160         TRANS_LOGE(TRANS_CTRL, "SessionParam check failed");
161         return SOFTBUS_INVALID_PARAM;
162     }
163     if (param->groupId == NULL || strlen(param->groupId) >= GROUP_ID_SIZE_MAX) {
164         TRANS_LOGE(TRANS_CTRL, "invalid groupId");
165         return SOFTBUS_TRANS_SESSION_GROUP_INVALID;
166     }
167 
168     if (!TransSessionServerIsExist(param->sessionName)) {
169         TRANS_LOGE(TRANS_CTRL, "session server invalid");
170         return SOFTBUS_TRANS_SESSION_NAME_NO_EXIST;
171     }
172 
173     return TransOpenChannel(param, info);
174 }
175