1/*
2 * Copyright (c) 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#ifndef APPSPAWN_H
17#define APPSPAWN_H
18
19#include <stdint.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <unistd.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28/**
29 * @brief appspawn请求消息构造句柄,不支持多线程消息构建
30 *
31 * 根据业务使用AppSpawnReqMsgCreate/AppSpawnTerminateMsgCreate 构建消息
32 * 如果调用AppSpawnClientSendMsg后,消息句柄不需要处理
33 * 否则需要调用 AppSpawnReqMsgFree 释放句柄
34 *
35 * 所有字符串输入的接口,只能接受合法的字符串,输入null、""、和大于合法长度的字符串都返回错误
36 *
37 */
38typedef void *AppSpawnReqMsgHandle;
39
40/**
41 * @brief 支持多线程获取句柄,这个是线程安全的。使用时,全局创建一个句柄,支持多线程发送对应线程的消息请求
42 *
43 */
44typedef void *AppSpawnClientHandle;
45
46#define INVALID_PERMISSION_INDEX (-1)
47#define INVALID_REQ_HANDLE NULL
48#define NWEBSPAWN_SERVER_NAME "nwebspawn"
49#define APPSPAWN_SERVER_NAME "appspawn"
50#define CJAPPSPAWN_SERVER_NAME "cjappspawn"
51#define NWEBSPAWN_RESTART "nwebRestart"
52#define NATIVESPAWN_SERVER_NAME "nativespawn"
53
54#pragma pack(4)
55#define APP_MAX_GIDS 64
56#define APP_USER_NAME 64
57#define APP_MAX_FD_COUNT 16
58#define APP_FDENV_PREFIX "APPSPAWN_FD_"
59#define APP_FDNAME_MAXLEN 20
60typedef struct {
61    uint32_t uid;       // the UNIX uid that the child process setuid() to after fork()
62    uint32_t gid;       // the UNIX gid that the child process setgid() to after fork()
63    uint32_t gidCount;  // the size of gidTable
64    uint32_t gidTable[APP_MAX_GIDS];
65    char userName[APP_USER_NAME];
66} AppDacInfo;
67
68typedef struct {
69    int result;
70    pid_t pid;
71} AppSpawnResult;
72#pragma pack()
73
74/**
75 * @brief init spawn client, eg: nwebspawn、appspawn
76 *
77 * @param serviceName service name, eg: nwebspawn、appspawn
78 * @param handle handle for client
79 * @return if succeed return 0,else return other value
80 */
81int AppSpawnClientInit(const char *serviceName, AppSpawnClientHandle *handle);
82/**
83 * @brief destroy client
84 *
85 * @param handle handle for client
86 * @return if succeed return 0,else return other value
87 */
88int AppSpawnClientDestroy(AppSpawnClientHandle handle);
89
90/**
91 * @brief send client request
92 *
93 * @param handle handle for client
94 * @param reqHandle handle for request
95 * @param result result from appspawn service
96 * @return if succeed return 0,else return other value
97 */
98int AppSpawnClientSendMsg(AppSpawnClientHandle handle, AppSpawnReqMsgHandle reqHandle, AppSpawnResult *result);
99
100typedef enum {
101    MSG_APP_SPAWN = 0,
102    MSG_GET_RENDER_TERMINATION_STATUS,
103    MSG_SPAWN_NATIVE_PROCESS,
104    MSG_DUMP,
105    MSG_BEGET_CMD,
106    MSG_BEGET_SPAWNTIME,
107    MSG_UPDATE_MOUNT_POINTS,
108    MSG_RESTART_SPAWNER,
109    MSG_DEVICE_DEBUG,
110    MAX_TYPE_INVALID
111} AppSpawnMsgType;
112
113/**
114 * @brief create spawn request
115 *
116 * @param msgType msg type. eg: MSG_APP_SPAWN,MSG_SPAWN_NATIVE_PROCESS
117 * @param processName process name, max length is 255
118 * @param reqHandle handle for request message
119 * @return if succeed return 0,else return other value
120 */
121int AppSpawnReqMsgCreate(AppSpawnMsgType msgType, const char *processName, AppSpawnReqMsgHandle *reqHandle);
122
123/**
124 * @brief create request
125 *
126 * @param pid process pid
127 * @param reqHandle handle for request message
128 * @return if succeed return 0,else return other value
129 */
130int AppSpawnTerminateMsgCreate(pid_t pid, AppSpawnReqMsgHandle *reqHandle);
131
132/**
133 * @brief destroy request
134 *
135 * @param reqHandle handle for request
136 */
137void AppSpawnReqMsgFree(AppSpawnReqMsgHandle reqHandle);
138
139/**
140 * @brief set bundle info
141 *
142 * @param reqHandle handle for request message
143 * @param bundleIndex bundle index
144 * @param bundleName bundle name, max length is 255
145 * @return if succeed return 0,else return other value
146 */
147int AppSpawnReqMsgSetBundleInfo(AppSpawnReqMsgHandle reqHandle, uint32_t bundleIndex, const char *bundleName);
148
149/**
150 * @brief set app flags info
151 *
152 * @param reqHandle handle for request message
153 * @param flagIndex flags index from AppFlagsIndex
154 * @return if succeed return 0,else return other value
155 */
156typedef enum {
157    APP_FLAGS_COLD_BOOT = 0,
158    APP_FLAGS_BACKUP_EXTENSION = 1,
159    APP_FLAGS_DLP_MANAGER = 2,
160    APP_FLAGS_DEBUGGABLE = 3,
161    APP_FLAGS_ASANENABLED = 4,
162    APP_FLAGS_ACCESS_BUNDLE_DIR = 5,
163    APP_FLAGS_NATIVEDEBUG = 6,
164    APP_FLAGS_NO_SANDBOX = 7,
165    APP_FLAGS_OVERLAY = 8,
166    APP_FLAGS_BUNDLE_RESOURCES = 9,
167    APP_FLAGS_GWP_ENABLED_FORCE,   // APP_GWP_ENABLED_FORCE 0x400
168    APP_FLAGS_GWP_ENABLED_NORMAL,  // APP_GWP_ENABLED_NORMAL 0x800
169    APP_FLAGS_TSAN_ENABLED,  // APP_TSANENABLED 0x1000
170    APP_FLAGS_IGNORE_SANDBOX = 13,  // ignore sandbox result
171    APP_FLAGS_ISOLATED_SANDBOX,
172    APP_FLAGS_EXTENSION_SANDBOX,
173    APP_FLAGS_CLONE_ENABLE,
174    APP_FLAGS_DEVELOPER_MODE = 17,
175    APP_FLAGS_BEGETCTL_BOOT, // Start an app from begetctl.
176    APP_FLAGS_ATOMIC_SERVICE,
177    APP_FLAGS_CHILDPROCESS,
178    APP_FLAGS_HWASAN_ENABLED = 21,
179    APP_FLAGS_UBSAN_ENABLED = 22,
180    APP_FLAGS_ISOLATED_SANDBOX_TYPE,
181    APP_FLAGS_ISOLATED_SELINUX_LABEL,
182    APP_FLAGS_ISOLATED_SECCOMP_TYPE,
183    APP_FLAGS_ISOLATED_NETWORK,
184    APP_FLAGS_ISOLATED_DATAGROUP,
185    APP_FLAGS_TEMP_JIT = 28,
186    MAX_FLAGS_INDEX = 63,
187} AppFlagsIndex;
188
189int AppSpawnReqMsgSetAppFlag(AppSpawnReqMsgHandle reqHandle, AppFlagsIndex flagIndex);
190
191/**
192 * @brief set dac info
193 *
194 * @param reqHandle handle for request message
195 * @param dacInfo dac info from AppDacInfo
196 * @return if succeed return 0,else return other value
197 */
198int AppSpawnReqMsgSetAppDacInfo(AppSpawnReqMsgHandle reqHandle, const AppDacInfo *dacInfo);
199
200/**
201 * @brief set domain info
202 *
203 * @param reqHandle handle for request message
204 * @param hapFlags hap of flags
205 * @param apl apl value, max length is 31
206 * @return if succeed return 0,else return other value
207 */
208int AppSpawnReqMsgSetAppDomainInfo(AppSpawnReqMsgHandle reqHandle, uint32_t hapFlags, const char *apl);
209
210/**
211 * @brief set internet permission info
212 *
213 * @param reqHandle handle for request message
214 * @param allowInternet
215 * @param setAllowInternet
216 * @return if succeed return 0,else return other value
217 */
218int AppSpawnReqMsgSetAppInternetPermissionInfo(AppSpawnReqMsgHandle reqHandle, uint8_t allow, uint8_t setAllow);
219
220/**
221 * @brief set access token info
222 *
223 * @param reqHandle handle for request message
224 * @param accessTokenIdEx access tokenId
225 * @return if succeed return 0,else return other value
226 */
227int AppSpawnReqMsgSetAppAccessToken(AppSpawnReqMsgHandle reqHandle, uint64_t accessTokenIdEx);
228
229/**
230 * @brief set owner info
231 *
232 * @param reqHandle handle for request message
233 * @param ownerId owner id, max length is 63
234 * @return if succeed return 0,else return other value
235 */
236int AppSpawnReqMsgSetAppOwnerId(AppSpawnReqMsgHandle reqHandle, const char *ownerId);
237
238/**
239 * @brief add permission to message
240 *
241 * @param reqHandle handle for request message
242 * @param permission permission name
243 * @return if succeed return 0,else return other value
244 */
245int AppSpawnReqMsgAddPermission(AppSpawnReqMsgHandle reqHandle, const char *permission);
246
247/**
248 * @brief add permission to message
249 *
250 * @param handle handle for client
251 * @param reqHandle handle for request message
252 * @param permission permission name
253 * @return if succeed return 0,else return other value
254 */
255int AppSpawnClientAddPermission(AppSpawnClientHandle handle, AppSpawnReqMsgHandle reqHandle, const char *permission);
256
257/**
258 * @brief add extend info to message
259 *
260 * @param reqHandle handle for request message
261 * @param name extend name, max length is 31
262 * @param value extend value, max length is 32768
263 * @param valueLen extend value length
264 * @return if succeed return 0,else return other value
265 */
266#define MSG_EXT_NAME_RENDER_CMD "render-cmd"
267#define MSG_EXT_NAME_HSP_LIST "HspList"
268#define MSG_EXT_NAME_OVERLAY "Overlay"
269#define MSG_EXT_NAME_DATA_GROUP "DataGroup"
270#define MSG_EXT_NAME_APP_ENV "AppEnv"
271#define MSG_EXT_NAME_APP_EXTENSION "AppExtension"
272#define MSG_EXT_NAME_BEGET_PID "AppPid"
273#define MSG_EXT_NAME_BEGET_PTY_NAME "ptyName"
274#define MSG_EXT_NAME_ACCOUNT_ID "AccountId"
275#define MSG_EXT_NAME_PROVISION_TYPE "ProvisionType"
276#define MSG_EXT_NAME_PROCESS_TYPE "ProcessType"
277#define MSG_EXT_NAME_MAX_CHILD_PROCCESS_MAX "MaxChildProcess"
278#define MSG_EXT_NAME_APP_FD "AppFd"
279
280int AppSpawnReqMsgAddExtInfo(AppSpawnReqMsgHandle reqHandle, const char *name, const uint8_t *value, uint32_t valueLen);
281
282/**
283 * @brief add extend info to message
284 *
285 * @param reqHandle handle for request message
286 * @param name extend name, max length is 31
287 * @param value extend value, max length is 32767
288 * @return if succeed return 0,else return other value
289 */
290int AppSpawnReqMsgAddStringInfo(AppSpawnReqMsgHandle reqHandle, const char *name, const char *value);
291
292/**
293 * @brief add fd info to message
294 *
295 * @param reqHandle handle for request message
296 * @param name fd name
297 * @param value fd value
298 * @return if succeed return 0,else return other value
299 */
300int AppSpawnReqMsgAddFd(AppSpawnReqMsgHandle reqHandle, const char* fdName, int fd);
301
302/**
303 * @brief Get the permission index by permission name
304 *
305 * @param handle handle for client
306 * @param permission permission name
307 * @return int32_t permission index, if not exit, return INVALID_PERMISSION_INDEX
308 */
309int32_t GetPermissionIndex(AppSpawnClientHandle handle, const char *permission);
310
311/**
312 * @brief Get the max permission Index
313 *
314 * @param handle handle for client
315 * @return int32_t max permission Index
316 */
317int32_t GetMaxPermissionIndex(AppSpawnClientHandle handle);
318
319/**
320 * @brief Get the permission name by index
321 *
322 * @param handle handle for client
323 * @param index permission index
324 * @return const char* permission name
325 */
326const char *GetPermissionByIndex(AppSpawnClientHandle handle, int32_t index);
327
328#ifdef __cplusplus
329}
330#endif
331
332#endif
333