169570cc8Sopenharmony_ci/*
269570cc8Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
369570cc8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
469570cc8Sopenharmony_ci * you may not use this file except in compliance with the License.
569570cc8Sopenharmony_ci * You may obtain a copy of the License at
669570cc8Sopenharmony_ci *
769570cc8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
869570cc8Sopenharmony_ci *
969570cc8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1069570cc8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1169570cc8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1269570cc8Sopenharmony_ci * See the License for the specific language governing permissions and
1369570cc8Sopenharmony_ci * limitations under the License.
1469570cc8Sopenharmony_ci */
1569570cc8Sopenharmony_ci
1669570cc8Sopenharmony_ci#ifndef APPSPAWN_SANDBOX_H
1769570cc8Sopenharmony_ci#define APPSPAWN_SANDBOX_H
1869570cc8Sopenharmony_ci
1969570cc8Sopenharmony_ci#include "appspawn.h"
2069570cc8Sopenharmony_ci#include "appspawn_hook.h"
2169570cc8Sopenharmony_ci#include "appspawn_manager.h"
2269570cc8Sopenharmony_ci#include "appspawn_utils.h"
2369570cc8Sopenharmony_ci#include "list.h"
2469570cc8Sopenharmony_ci
2569570cc8Sopenharmony_ci#ifdef __cplusplus
2669570cc8Sopenharmony_ciextern "C" {
2769570cc8Sopenharmony_ci#endif
2869570cc8Sopenharmony_ci
2969570cc8Sopenharmony_ci#define SANDBOX_STAMP_FILE_SUFFIX ".stamp"
3069570cc8Sopenharmony_ci#define JSON_FLAGS_INTERNAL "__internal__"
3169570cc8Sopenharmony_ci#define SANDBOX_NWEBSPAWN_ROOT_PATH APPSPAWN_BASE_DIR "/mnt/sandbox/com.ohos.render/"
3269570cc8Sopenharmony_ci#define OHOS_RENDER "__internal__.com.ohos.render"
3369570cc8Sopenharmony_ci
3469570cc8Sopenharmony_ci#define PHYSICAL_APP_INSTALL_PATH "/data/app/el1/bundle/public/"
3569570cc8Sopenharmony_ci#define APL_SYSTEM_CORE "system_core"
3669570cc8Sopenharmony_ci#define APL_SYSTEM_BASIC "system_basic"
3769570cc8Sopenharmony_ci#define DEFAULT_NWEB_SANDBOX_SEC_PATH "/data/app/el1/bundle/public/com.ohos.nweb"  // persist.nweb.sandbox.src_path
3869570cc8Sopenharmony_ci
3969570cc8Sopenharmony_ci#define PARAMETER_PACKAGE_NAME "<PackageName>"
4069570cc8Sopenharmony_ci#define PARAMETER_USER_ID "<currentUserId>"
4169570cc8Sopenharmony_ci#define PARAMETER_PACKAGE_INDEX "<PackageName_index>"
4269570cc8Sopenharmony_ci#define ARK_WEB_PERSIST_PACKAGE_NAME "persist.arkwebcore.package_name"
4369570cc8Sopenharmony_ci#define PARAMETER_ARK_WEB_PACKAGE_INDEX "<arkWebPackageName>"
4469570cc8Sopenharmony_ci#define SHAREFS_OPTION_USER ",user_id="
4569570cc8Sopenharmony_ci
4669570cc8Sopenharmony_ci#define FILE_MODE 0711
4769570cc8Sopenharmony_ci#define MAX_SANDBOX_BUFFER 256
4869570cc8Sopenharmony_ci#define OPTIONS_MAX_LEN 256
4969570cc8Sopenharmony_ci#define APP_FLAGS_SECTION 0x80000000
5069570cc8Sopenharmony_ci#define BASIC_MOUNT_FLAGS (MS_REC | MS_BIND)
5169570cc8Sopenharmony_ci#define INVALID_UID ((uint32_t)-1)
5269570cc8Sopenharmony_ci#define PARAM_BUFFER_SIZE 128
5369570cc8Sopenharmony_ci
5469570cc8Sopenharmony_ci#ifdef APPSPAWN_64
5569570cc8Sopenharmony_ci#define APPSPAWN_LIB_NAME "lib64"
5669570cc8Sopenharmony_ci#else
5769570cc8Sopenharmony_ci#define APPSPAWN_LIB_NAME "lib"
5869570cc8Sopenharmony_ci#endif
5969570cc8Sopenharmony_ci
6069570cc8Sopenharmony_ci#define MOUNT_MODE_NONE 0       // "none"
6169570cc8Sopenharmony_ci#define MOUNT_MODE_ALWAYS 1     // "always"
6269570cc8Sopenharmony_ci#define MOUNT_MODE_NOT_EXIST 2  // "not-exists"
6369570cc8Sopenharmony_ci
6469570cc8Sopenharmony_ci#define MOUNT_PATH_OP_NONE    ((uint32_t)-1)
6569570cc8Sopenharmony_ci#define MOUNT_PATH_OP_SYMLINK SANDBOX_TAG_INVALID
6669570cc8Sopenharmony_ci#define MOUNT_PATH_OP_UNMOUNT    (SANDBOX_TAG_INVALID + 1)
6769570cc8Sopenharmony_ci#define MOUNT_PATH_OP_ONLY_SANDBOX    (SANDBOX_TAG_INVALID + 2)
6869570cc8Sopenharmony_ci#define MOUNT_PATH_OP_REPLACE_BY_SANDBOX    (SANDBOX_TAG_INVALID + 3)
6969570cc8Sopenharmony_ci#define MOUNT_PATH_OP_REPLACE_BY_SRC    (SANDBOX_TAG_INVALID + 4)
7069570cc8Sopenharmony_ci#define FILE_CROSS_APP_MODE "ohos.permission.FILE_CROSS_APP"
7169570cc8Sopenharmony_ci#define FILE_ACCESS_COMMON_DIR_MODE "ohos.permission.FILE_ACCESS_COMMON_DIR"
7269570cc8Sopenharmony_ci#define ACCESS_DLP_FILE_MODE "ohos.permission.ACCESS_DLP_FILE"
7369570cc8Sopenharmony_ci#define FILE_ACCESS_MANAGER_MODE "ohos.permission.FILE_ACCESS_MANAGER"
7469570cc8Sopenharmony_ci
7569570cc8Sopenharmony_citypedef enum SandboxTag {
7669570cc8Sopenharmony_ci    SANDBOX_TAG_MOUNT_PATH = 0,
7769570cc8Sopenharmony_ci    SANDBOX_TAG_MOUNT_FILE,
7869570cc8Sopenharmony_ci    SANDBOX_TAG_SYMLINK,
7969570cc8Sopenharmony_ci    SANDBOX_TAG_PERMISSION,
8069570cc8Sopenharmony_ci    SANDBOX_TAG_PACKAGE_NAME,
8169570cc8Sopenharmony_ci    SANDBOX_TAG_SPAWN_FLAGS,
8269570cc8Sopenharmony_ci    SANDBOX_TAG_NAME_GROUP,
8369570cc8Sopenharmony_ci    SANDBOX_TAG_SYSTEM_CONST,
8469570cc8Sopenharmony_ci    SANDBOX_TAG_APP_VARIABLE,
8569570cc8Sopenharmony_ci    SANDBOX_TAG_APP_CONST,
8669570cc8Sopenharmony_ci    SANDBOX_TAG_REQUIRED,
8769570cc8Sopenharmony_ci    SANDBOX_TAG_INVALID
8869570cc8Sopenharmony_ci} SandboxNodeType;
8969570cc8Sopenharmony_ci
9069570cc8Sopenharmony_citypedef enum {
9169570cc8Sopenharmony_ci    SANDBOX_PACKAGENAME_DEFAULT = 0,
9269570cc8Sopenharmony_ci    SANDBOX_PACKAGENAME_CLONE,
9369570cc8Sopenharmony_ci    SANDBOX_PACKAGENAME_EXTENSION,
9469570cc8Sopenharmony_ci    SANDBOX_PACKAGENAME_CLONE_AND_EXTENSION,
9569570cc8Sopenharmony_ci    SANDBOX_PACKAGENAME_ATOMIC_SERVICE,
9669570cc8Sopenharmony_ci} SandboxVarPackageNameType;
9769570cc8Sopenharmony_ci
9869570cc8Sopenharmony_citypedef struct {
9969570cc8Sopenharmony_ci    struct ListNode node;
10069570cc8Sopenharmony_ci    uint32_t type;
10169570cc8Sopenharmony_ci} SandboxMountNode;
10269570cc8Sopenharmony_ci
10369570cc8Sopenharmony_citypedef struct TagSandboxQueue {
10469570cc8Sopenharmony_ci    struct ListNode front;
10569570cc8Sopenharmony_ci    uint32_t type;
10669570cc8Sopenharmony_ci} SandboxQueue;
10769570cc8Sopenharmony_ci
10869570cc8Sopenharmony_ci/*
10969570cc8Sopenharmony_ci"create-on-demand": {
11069570cc8Sopenharmony_ci    "uid": "userId", // 默认使用消息的uid、gid
11169570cc8Sopenharmony_ci    "gid":  "groupId",
11269570cc8Sopenharmony_ci    "ugo": 750
11369570cc8Sopenharmony_ci    }
11469570cc8Sopenharmony_ci*/
11569570cc8Sopenharmony_citypedef struct {
11669570cc8Sopenharmony_ci    uid_t uid;
11769570cc8Sopenharmony_ci    gid_t gid;
11869570cc8Sopenharmony_ci    uint32_t mode;
11969570cc8Sopenharmony_ci} PathDemandInfo;
12069570cc8Sopenharmony_ci
12169570cc8Sopenharmony_citypedef struct TagPathMountNode {
12269570cc8Sopenharmony_ci    SandboxMountNode sandboxNode;
12369570cc8Sopenharmony_ci    char *source;                  // source 目录,一般是全局的fs 目录
12469570cc8Sopenharmony_ci    char *target;                  // 沙盒化后的目录
12569570cc8Sopenharmony_ci    mode_t destMode;               // "dest-mode": "S_IRUSR | S_IWOTH | S_IRWXU "  默认值:0
12669570cc8Sopenharmony_ci    uint32_t mountSharedFlag : 1;  // "mount-shared-flag" : "true", 默认值:false
12769570cc8Sopenharmony_ci    uint32_t createDemand : 1;
12869570cc8Sopenharmony_ci    uint32_t checkErrorFlag : 1;
12969570cc8Sopenharmony_ci    uint32_t category;
13069570cc8Sopenharmony_ci    char *appAplName;
13169570cc8Sopenharmony_ci    PathDemandInfo demandInfo[0];
13269570cc8Sopenharmony_ci} PathMountNode;
13369570cc8Sopenharmony_ci
13469570cc8Sopenharmony_citypedef struct TagSymbolLinkNode {
13569570cc8Sopenharmony_ci    SandboxMountNode sandboxNode;
13669570cc8Sopenharmony_ci    char *target;
13769570cc8Sopenharmony_ci    char *linkName;
13869570cc8Sopenharmony_ci    mode_t destMode;  // "dest-mode": "S_IRUSR | S_IWOTH | S_IRWXU "
13969570cc8Sopenharmony_ci    uint32_t checkErrorFlag : 1;
14069570cc8Sopenharmony_ci} SymbolLinkNode;
14169570cc8Sopenharmony_ci
14269570cc8Sopenharmony_citypedef struct TagSandboxSection {
14369570cc8Sopenharmony_ci    SandboxMountNode sandboxNode;
14469570cc8Sopenharmony_ci    struct ListNode front;  // mount-path
14569570cc8Sopenharmony_ci    char *name;
14669570cc8Sopenharmony_ci    uint32_t number : 16;
14769570cc8Sopenharmony_ci    uint32_t gidCount : 16;
14869570cc8Sopenharmony_ci    gid_t *gidTable;             // "gids": [1006, 1008],
14969570cc8Sopenharmony_ci    uint32_t sandboxSwitch : 1;  // "sandbox-switch": "ON",
15069570cc8Sopenharmony_ci    uint32_t sandboxShared : 1;  // "sandbox-switch": "ON",
15169570cc8Sopenharmony_ci    SandboxMountNode **nameGroups;
15269570cc8Sopenharmony_ci} SandboxSection;
15369570cc8Sopenharmony_ci
15469570cc8Sopenharmony_citypedef struct {
15569570cc8Sopenharmony_ci    SandboxSection section;
15669570cc8Sopenharmony_ci} SandboxPackageNameNode;
15769570cc8Sopenharmony_ci
15869570cc8Sopenharmony_citypedef struct {
15969570cc8Sopenharmony_ci    SandboxSection section;
16069570cc8Sopenharmony_ci    uint32_t flagIndex;
16169570cc8Sopenharmony_ci} SandboxFlagsNode;
16269570cc8Sopenharmony_ci
16369570cc8Sopenharmony_citypedef struct TagSandboxGroupNode {
16469570cc8Sopenharmony_ci    SandboxSection section;
16569570cc8Sopenharmony_ci    uint32_t destType;
16669570cc8Sopenharmony_ci    PathMountNode *depNode;
16769570cc8Sopenharmony_ci    uint32_t depMode;
16869570cc8Sopenharmony_ci    uint32_t depMounted : 1; // 是否执行了挂载
16969570cc8Sopenharmony_ci} SandboxNameGroupNode;
17069570cc8Sopenharmony_ci
17169570cc8Sopenharmony_citypedef struct TagPermissionNode {
17269570cc8Sopenharmony_ci    SandboxSection section;
17369570cc8Sopenharmony_ci    int32_t permissionIndex;
17469570cc8Sopenharmony_ci} SandboxPermissionNode;
17569570cc8Sopenharmony_ci
17669570cc8Sopenharmony_citypedef struct TagAppSpawnSandboxCfg {
17769570cc8Sopenharmony_ci    AppSpawnExtData extData;
17869570cc8Sopenharmony_ci    SandboxQueue requiredQueue;
17969570cc8Sopenharmony_ci    SandboxQueue permissionQueue;
18069570cc8Sopenharmony_ci    SandboxQueue packageNameQueue;  // SandboxSection
18169570cc8Sopenharmony_ci    SandboxQueue spawnFlagsQueue;
18269570cc8Sopenharmony_ci    SandboxQueue nameGroupsQueue;
18369570cc8Sopenharmony_ci    uint32_t depNodeCount;
18469570cc8Sopenharmony_ci    SandboxNameGroupNode **depGroupNodes;
18569570cc8Sopenharmony_ci    int32_t maxPermissionIndex;
18669570cc8Sopenharmony_ci    uint32_t sandboxNsFlags;  // "sandbox-ns-flags": [ "pid", "net" ], // for appspawn and newspawn
18769570cc8Sopenharmony_ci    // for comm section
18869570cc8Sopenharmony_ci    uint32_t topSandboxSwitch : 1;  // "top-sandbox-switch": "ON",
18969570cc8Sopenharmony_ci    uint32_t appFullMountEnable : 1;
19069570cc8Sopenharmony_ci    uint32_t pidNamespaceSupport : 1;
19169570cc8Sopenharmony_ci    uint32_t mounted : 1;
19269570cc8Sopenharmony_ci    char *rootPath;
19369570cc8Sopenharmony_ci} AppSpawnSandboxCfg;
19469570cc8Sopenharmony_ci
19569570cc8Sopenharmony_cienum {
19669570cc8Sopenharmony_ci    BUFFER_FOR_SOURCE,
19769570cc8Sopenharmony_ci    BUFFER_FOR_TARGET,
19869570cc8Sopenharmony_ci    BUFFER_FOR_TMP,
19969570cc8Sopenharmony_ci    MAX_BUFFER
20069570cc8Sopenharmony_ci};
20169570cc8Sopenharmony_ci
20269570cc8Sopenharmony_citypedef struct TagSandboxBuffer {
20369570cc8Sopenharmony_ci    uint32_t bufferLen;
20469570cc8Sopenharmony_ci    uint32_t current;
20569570cc8Sopenharmony_ci    char *buffer;
20669570cc8Sopenharmony_ci} SandboxBuffer;
20769570cc8Sopenharmony_ci
20869570cc8Sopenharmony_citypedef struct TagSandboxContext {
20969570cc8Sopenharmony_ci    SandboxBuffer buffer[MAX_BUFFER];
21069570cc8Sopenharmony_ci    const char *bundleName;
21169570cc8Sopenharmony_ci    const AppSpawnMsgNode *message;  // 修改成操作消息
21269570cc8Sopenharmony_ci    uint32_t sandboxSwitch : 1;
21369570cc8Sopenharmony_ci    uint32_t sandboxShared : 1;
21469570cc8Sopenharmony_ci    uint32_t bundleHasWps : 1;
21569570cc8Sopenharmony_ci    uint32_t dlpBundle : 1;
21669570cc8Sopenharmony_ci    uint32_t appFullMountEnable : 1;
21769570cc8Sopenharmony_ci    uint32_t nwebspawn : 1;
21869570cc8Sopenharmony_ci    uint32_t sandboxNsFlags;
21969570cc8Sopenharmony_ci    char *rootPath;
22069570cc8Sopenharmony_ci} SandboxContext;
22169570cc8Sopenharmony_ci
22269570cc8Sopenharmony_citypedef struct {
22369570cc8Sopenharmony_ci    const char *sandboxPath;
22469570cc8Sopenharmony_ci    const char *permission;
22569570cc8Sopenharmony_ci} MountSharedTemplate;
22669570cc8Sopenharmony_ci
22769570cc8Sopenharmony_ci/**
22869570cc8Sopenharmony_ci * @brief AppSpawnSandboxCfg op
22969570cc8Sopenharmony_ci *
23069570cc8Sopenharmony_ci * @return AppSpawnSandboxCfg*
23169570cc8Sopenharmony_ci */
23269570cc8Sopenharmony_ciAppSpawnSandboxCfg *CreateAppSpawnSandbox(ExtDataType type);
23369570cc8Sopenharmony_ciAppSpawnSandboxCfg *GetAppSpawnSandbox(const AppSpawnMgr *content, ExtDataType type);
23469570cc8Sopenharmony_civoid DeleteAppSpawnSandbox(AppSpawnSandboxCfg *sandbox);
23569570cc8Sopenharmony_ciint LoadAppSandboxConfig(AppSpawnSandboxCfg *sandbox, RunMode mode);
23669570cc8Sopenharmony_civoid DumpAppSpawnSandboxCfg(AppSpawnSandboxCfg *sandbox);
23769570cc8Sopenharmony_ci
23869570cc8Sopenharmony_ci/**
23969570cc8Sopenharmony_ci * @brief SandboxSection op
24069570cc8Sopenharmony_ci *
24169570cc8Sopenharmony_ci */
24269570cc8Sopenharmony_ciSandboxSection *CreateSandboxSection(const char *name, uint32_t dataLen, uint32_t type);
24369570cc8Sopenharmony_ciSandboxSection *GetSandboxSection(const SandboxQueue *queue, const char *name);
24469570cc8Sopenharmony_civoid AddSandboxSection(SandboxSection *node, SandboxQueue *queue);
24569570cc8Sopenharmony_civoid DeleteSandboxSection(SandboxSection *node);
24669570cc8Sopenharmony_ci__attribute__((always_inline)) inline uint32_t GetSectionType(const SandboxSection *section)
24769570cc8Sopenharmony_ci{
24869570cc8Sopenharmony_ci    return section != NULL ? section->sandboxNode.type : SANDBOX_TAG_INVALID;
24969570cc8Sopenharmony_ci}
25069570cc8Sopenharmony_ci
25169570cc8Sopenharmony_ci/**
25269570cc8Sopenharmony_ci * @brief SandboxMountNode op
25369570cc8Sopenharmony_ci *
25469570cc8Sopenharmony_ci */
25569570cc8Sopenharmony_ciSandboxMountNode *CreateSandboxMountNode(uint32_t dataLen, uint32_t type);
25669570cc8Sopenharmony_ciSandboxMountNode *GetFirstSandboxMountNode(const SandboxSection *section);
25769570cc8Sopenharmony_civoid DeleteSandboxMountNode(SandboxMountNode *mountNode);
25869570cc8Sopenharmony_civoid AddSandboxMountNode(SandboxMountNode *node, SandboxSection *section);
25969570cc8Sopenharmony_ciPathMountNode *GetPathMountNode(const SandboxSection *section, int type, const char *source, const char *target);
26069570cc8Sopenharmony_ciSymbolLinkNode *GetSymbolLinkNode(const SandboxSection *section, const char *target, const char *linkName);
26169570cc8Sopenharmony_ci
26269570cc8Sopenharmony_ci/**
26369570cc8Sopenharmony_ci * @brief sandbox mount interface
26469570cc8Sopenharmony_ci *
26569570cc8Sopenharmony_ci */
26669570cc8Sopenharmony_ciint MountSandboxConfigs(AppSpawnSandboxCfg *sandbox, const AppSpawningCtx *property, int nwebspawn);
26769570cc8Sopenharmony_ciint StagedMountSystemConst(AppSpawnSandboxCfg *sandbox, const AppSpawningCtx *property, int nwebspawn);
26869570cc8Sopenharmony_ciint StagedMountPreUnShare(const SandboxContext *context, AppSpawnSandboxCfg *sandbox);
26969570cc8Sopenharmony_ciint StagedMountPostUnshare(const SandboxContext *context, const AppSpawnSandboxCfg *sandbox);
27069570cc8Sopenharmony_ci// 在子进程退出时,由父进程发起unmount操作
27169570cc8Sopenharmony_ciint UnmountDepPaths(const AppSpawnSandboxCfg *sandbox, uid_t uid);
27269570cc8Sopenharmony_ciint UnmountSandboxConfigs(const AppSpawnSandboxCfg *sandbox, uid_t uid, const char *name);
27369570cc8Sopenharmony_ci
27469570cc8Sopenharmony_ci/**
27569570cc8Sopenharmony_ci * @brief Variable op
27669570cc8Sopenharmony_ci *
27769570cc8Sopenharmony_ci */
27869570cc8Sopenharmony_citypedef struct {
27969570cc8Sopenharmony_ci    struct ListNode node;
28069570cc8Sopenharmony_ci    ReplaceVarHandler replaceVar;
28169570cc8Sopenharmony_ci    char name[0];
28269570cc8Sopenharmony_ci} AppSandboxVarNode;
28369570cc8Sopenharmony_ci
28469570cc8Sopenharmony_citypedef struct TagVarExtraData {
28569570cc8Sopenharmony_ci    uint32_t sandboxTag;
28669570cc8Sopenharmony_ci    uint32_t operation;
28769570cc8Sopenharmony_ci    char *variablePackageName;
28869570cc8Sopenharmony_ci    union {
28969570cc8Sopenharmony_ci        PathMountNode *depNode;
29069570cc8Sopenharmony_ci    } data;
29169570cc8Sopenharmony_ci} VarExtraData;
29269570cc8Sopenharmony_ci
29369570cc8Sopenharmony_civoid ClearVariable(void);
29469570cc8Sopenharmony_civoid AddDefaultVariable(void);
29569570cc8Sopenharmony_ciconst char *GetSandboxRealVar(const SandboxContext *context,
29669570cc8Sopenharmony_ci    uint32_t bufferType, const char *source, const char *prefix, const VarExtraData *extraData);
29769570cc8Sopenharmony_ci
29869570cc8Sopenharmony_ci/**
29969570cc8Sopenharmony_ci * @brief expand config
30069570cc8Sopenharmony_ci *
30169570cc8Sopenharmony_ci */
30269570cc8Sopenharmony_citypedef struct {
30369570cc8Sopenharmony_ci    struct ListNode node;
30469570cc8Sopenharmony_ci    ProcessExpandSandboxCfg cfgHandle;
30569570cc8Sopenharmony_ci    int prio;
30669570cc8Sopenharmony_ci    char name[0];
30769570cc8Sopenharmony_ci} AppSandboxExpandAppCfgNode;
30869570cc8Sopenharmony_ciint ProcessExpandAppSandboxConfig(const SandboxContext *context,
30969570cc8Sopenharmony_ci    const AppSpawnSandboxCfg *appSandBox, const char *name);
31069570cc8Sopenharmony_civoid AddDefaultExpandAppSandboxConfigHandle(void);
31169570cc8Sopenharmony_civoid ClearExpandAppSandboxConfigHandle(void);
31269570cc8Sopenharmony_ci
31369570cc8Sopenharmony_ci__attribute__((always_inline)) inline void *GetSpawningMsgInfo(const SandboxContext *context, uint32_t type)
31469570cc8Sopenharmony_ci{
31569570cc8Sopenharmony_ci    APPSPAWN_CHECK(context->message != NULL,
31669570cc8Sopenharmony_ci        return NULL, "Invalid property for type %{public}u", type);
31769570cc8Sopenharmony_ci    return GetAppSpawnMsgInfo(context->message, type);
31869570cc8Sopenharmony_ci}
31969570cc8Sopenharmony_ci
32069570cc8Sopenharmony_ci/**
32169570cc8Sopenharmony_ci * @brief Sandbox Context op
32269570cc8Sopenharmony_ci *
32369570cc8Sopenharmony_ci * @return SandboxContext*
32469570cc8Sopenharmony_ci */
32569570cc8Sopenharmony_ciSandboxContext *GetSandboxContext(void);
32669570cc8Sopenharmony_civoid DeleteSandboxContext(SandboxContext *context);
32769570cc8Sopenharmony_ci
32869570cc8Sopenharmony_ci/**
32969570cc8Sopenharmony_ci * @brief defineMount Arg Template and operation
33069570cc8Sopenharmony_ci *
33169570cc8Sopenharmony_ci */
33269570cc8Sopenharmony_cienum {
33369570cc8Sopenharmony_ci    MOUNT_TMP_DEFAULT,
33469570cc8Sopenharmony_ci    MOUNT_TMP_RDONLY,
33569570cc8Sopenharmony_ci    MOUNT_TMP_EPFS,
33669570cc8Sopenharmony_ci    MOUNT_TMP_DAC_OVERRIDE_DELETE,
33769570cc8Sopenharmony_ci    MOUNT_TMP_DAC_OVERRIDE,
33869570cc8Sopenharmony_ci    MOUNT_TMP_FUSE,
33969570cc8Sopenharmony_ci    MOUNT_TMP_DLP_FUSE,
34069570cc8Sopenharmony_ci    MOUNT_TMP_SHRED,
34169570cc8Sopenharmony_ci    MOUNT_TMP_MAX
34269570cc8Sopenharmony_ci};
34369570cc8Sopenharmony_ci
34469570cc8Sopenharmony_citypedef struct {
34569570cc8Sopenharmony_ci    char *name;
34669570cc8Sopenharmony_ci    uint32_t category;
34769570cc8Sopenharmony_ci    const char *fsType;
34869570cc8Sopenharmony_ci    unsigned long mountFlags;
34969570cc8Sopenharmony_ci    const char *options;
35069570cc8Sopenharmony_ci    mode_t mountSharedFlag;
35169570cc8Sopenharmony_ci} MountArgTemplate;
35269570cc8Sopenharmony_ci
35369570cc8Sopenharmony_citypedef struct {
35469570cc8Sopenharmony_ci    const char *name;
35569570cc8Sopenharmony_ci    unsigned long flags;
35669570cc8Sopenharmony_ci} SandboxFlagInfo;
35769570cc8Sopenharmony_ci
35869570cc8Sopenharmony_ciuint32_t GetMountCategory(const char *name);
35969570cc8Sopenharmony_ciconst MountArgTemplate *GetMountArgTemplate(uint32_t category);
36069570cc8Sopenharmony_ciconst SandboxFlagInfo *GetSandboxFlagInfo(const char *key, const SandboxFlagInfo *flagsInfos, uint32_t count);
36169570cc8Sopenharmony_ciint GetPathMode(const char *name);
36269570cc8Sopenharmony_ci
36369570cc8Sopenharmony_civoid DumpMountPathMountNode(const PathMountNode *pathNode);
36469570cc8Sopenharmony_ci
36569570cc8Sopenharmony_citypedef struct TagMountArg {
36669570cc8Sopenharmony_ci    const char *originPath;
36769570cc8Sopenharmony_ci    const char *destinationPath;
36869570cc8Sopenharmony_ci    const char *fsType;
36969570cc8Sopenharmony_ci    unsigned long mountFlags;
37069570cc8Sopenharmony_ci    const char *options;
37169570cc8Sopenharmony_ci    mode_t mountSharedFlag;
37269570cc8Sopenharmony_ci} MountArg;
37369570cc8Sopenharmony_ci
37469570cc8Sopenharmony_ciint SandboxMountPath(const MountArg *arg);
37569570cc8Sopenharmony_ci
37669570cc8Sopenharmony_ci__attribute__((always_inline)) inline int IsPathEmpty(const char *path)
37769570cc8Sopenharmony_ci{
37869570cc8Sopenharmony_ci    if (path == NULL || path[0] == '\0') {
37969570cc8Sopenharmony_ci        return 1;
38069570cc8Sopenharmony_ci    }
38169570cc8Sopenharmony_ci    return 0;
38269570cc8Sopenharmony_ci}
38369570cc8Sopenharmony_ci
38469570cc8Sopenharmony_ci#ifdef __cplusplus
38569570cc8Sopenharmony_ci}
38669570cc8Sopenharmony_ci#endif
38769570cc8Sopenharmony_ci#endif  // APPSPAWN_SANDBOX_H
388