mirror of
https://gitee.com/openharmony/startup_appspawn
synced 2024-11-23 07:00:17 +00:00
native进程孵化
Signed-off-by: 王达 <wangda20@huawei.com>
This commit is contained in:
parent
188d8c26d7
commit
d47aae6b64
122
appdata-sandbox-isolated.json
Normal file
122
appdata-sandbox-isolated.json
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
{
|
||||||
|
"common": [{
|
||||||
|
"top-sandbox-switch": "ON",
|
||||||
|
"app-base": [{
|
||||||
|
"sandbox-ns-flags" : [ "net" ],
|
||||||
|
"mount-paths" : [{
|
||||||
|
"src-path" : "/dev",
|
||||||
|
"sandbox-path" : "/dev",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/proc",
|
||||||
|
"sandbox-path" : "/proc",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/sys",
|
||||||
|
"sandbox-path" : "/sys",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/fonts",
|
||||||
|
"sandbox-path" : "/system/fonts",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/etc",
|
||||||
|
"sandbox-path" : "/system/etc",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/etc/hosts",
|
||||||
|
"sandbox-path" : "/data/service/el1/network/hosts_user/hosts",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/bin",
|
||||||
|
"sandbox-path" : "/system/bin",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib",
|
||||||
|
"sandbox-path" : "/system/lib",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib64",
|
||||||
|
"sandbox-path" : "/system/lib64",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/platformsdk",
|
||||||
|
"sandbox-path" : "/system/lib/platformsdk",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/ndk",
|
||||||
|
"sandbox-path" : "/system/lib/ndk",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/module",
|
||||||
|
"sandbox-path" : "/system/lib/module",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/chipset-pub-sdk",
|
||||||
|
"sandbox-path" : "/system/lib/chipset-pub-sdk",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/chipset-sdk",
|
||||||
|
"sandbox-path" : "/system/lib/chipset-sdk",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/seccomp",
|
||||||
|
"sandbox-path" : "/system/lib/seccomp",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/extensionability",
|
||||||
|
"sandbox-path" : "/system/lib/extensionability",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/media",
|
||||||
|
"sandbox-path" : "/system/lib/media",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/system/lib/ld-musl-arm.so.1",
|
||||||
|
"sandbox-path" : "/system/lib/ld-musl-arm.so.1",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"src-path" : "/data/app/el1/bundle/public/",
|
||||||
|
"sandbox-path" : "/data/app/el1/bundle/public/",
|
||||||
|
"sandbox-flags" : [ "bind", "rec" ],
|
||||||
|
"check-action-status": "false"
|
||||||
|
}],
|
||||||
|
"symbol-links" : [{
|
||||||
|
"target-name" : "/system/etc",
|
||||||
|
"link-name" : "/etc",
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"target-name" : "/system/bin",
|
||||||
|
"link-name" : "/bin",
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"target-name" : "/system/lib",
|
||||||
|
"link-name" : "/lib",
|
||||||
|
"check-action-status": "false"
|
||||||
|
}, {
|
||||||
|
"target-name" : "/system/lib64",
|
||||||
|
"link-name" : "/lib64",
|
||||||
|
"check-action-status": "false"
|
||||||
|
}]
|
||||||
|
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
12
appspawn.cfg
12
appspawn.cfg
@ -55,6 +55,17 @@
|
|||||||
"gid" : "nwebspawn",
|
"gid" : "nwebspawn",
|
||||||
"option" : [
|
"option" : [
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "NativeSpawn",
|
||||||
|
"family" : "AF_LOCAL",
|
||||||
|
"type" : "SOCK_STREAM",
|
||||||
|
"protocol" : "default",
|
||||||
|
"permissions" : "0666",
|
||||||
|
"uid" : "root",
|
||||||
|
"gid" : "appspawn",
|
||||||
|
"option" : [
|
||||||
|
]
|
||||||
}],
|
}],
|
||||||
"sandbox" : 0,
|
"sandbox" : 0,
|
||||||
"start-mode" : "boot",
|
"start-mode" : "boot",
|
||||||
@ -66,4 +77,3 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,9 +29,33 @@ typedef enum {
|
|||||||
MODE_FOR_NWEB_SPAWN,
|
MODE_FOR_NWEB_SPAWN,
|
||||||
MODE_FOR_APP_COLD_RUN,
|
MODE_FOR_APP_COLD_RUN,
|
||||||
MODE_FOR_NWEB_COLD_RUN,
|
MODE_FOR_NWEB_COLD_RUN,
|
||||||
|
MODE_FOR_NATIVE_SPAWN,
|
||||||
|
MODE_FOR_CJAPP_SPAWN,
|
||||||
MODE_INVALID
|
MODE_INVALID
|
||||||
} RunMode;
|
} RunMode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PROCESS_FOR_APP_SPAWN,
|
||||||
|
PROCESS_FOR_NWEB_SPAWN,
|
||||||
|
PROCESS_FOR_APP_COLD_RUN,
|
||||||
|
PROCESS_FOR_NWEB_COLD_RUN,
|
||||||
|
PROCESS_FOR_NATIVE_SPAWN,
|
||||||
|
PROCESS_FOR_NWEB_RESTART,
|
||||||
|
PROCESS_INVALID
|
||||||
|
} RunProcess;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CJPROCESS_FOR_APP_SPAWN,
|
||||||
|
CJPROCESS_FOR_APP_COLD_RUN,
|
||||||
|
CJPROCESS_INVALID
|
||||||
|
} CJRunProcess;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PROCESS_TYPE_APPSPAWN,
|
||||||
|
PROCESS_TYPE_CJAPPSPAWN,
|
||||||
|
PROCESS_TYPE_INVALID
|
||||||
|
} ProcessType;
|
||||||
|
|
||||||
typedef struct AppSpawnClient {
|
typedef struct AppSpawnClient {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t flags; // Save negotiated flags
|
uint32_t flags; // Save negotiated flags
|
||||||
|
16
etc/BUILD.gn
16
etc/BUILD.gn
@ -28,6 +28,12 @@ if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) {
|
|||||||
part_name = "${part_name}"
|
part_name = "${part_name}"
|
||||||
module_install_dir = "etc/sandbox"
|
module_install_dir = "etc/sandbox"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ohos_prebuilt_etc("appdata-sandbox-isolated.json") {
|
||||||
|
source = "../appdata-sandbox-isolated.json"
|
||||||
|
part_name = "${part_name}"
|
||||||
|
module_install_dir = "etc/sandbox"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ohos_prebuilt_appdata_sandbox("appdata-sandbox.json") {
|
ohos_prebuilt_appdata_sandbox("appdata-sandbox.json") {
|
||||||
source = "../appdata-sandbox.json"
|
source = "../appdata-sandbox.json"
|
||||||
@ -43,6 +49,15 @@ if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) {
|
|||||||
part_name = "${part_name}"
|
part_name = "${part_name}"
|
||||||
module_install_dir = "etc/sandbox"
|
module_install_dir = "etc/sandbox"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ohos_prebuilt_appdata_sandbox("appdata-sandbox-isolated.json") {
|
||||||
|
source = "../appdata-sandbox-isolated.json"
|
||||||
|
patterns = []
|
||||||
|
extra_sandbox_cfgs = []
|
||||||
|
subsystem_name = "${subsystem_name}"
|
||||||
|
part_name = "${part_name}"
|
||||||
|
module_install_dir = "etc/sandbox"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ohos_prebuilt_etc("appspawn_preload.json") {
|
ohos_prebuilt_etc("appspawn_preload.json") {
|
||||||
@ -54,6 +69,7 @@ ohos_prebuilt_etc("appspawn_preload.json") {
|
|||||||
group("etc_files") {
|
group("etc_files") {
|
||||||
deps = [
|
deps = [
|
||||||
":appdata-sandbox.json",
|
":appdata-sandbox.json",
|
||||||
|
":appdata-sandbox-isolated.json",
|
||||||
":appspawn_preload.json",
|
":appspawn_preload.json",
|
||||||
]
|
]
|
||||||
if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) {
|
if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) {
|
||||||
|
@ -91,8 +91,22 @@ APPSPAWN_STATIC void CloseClientSocket(int socketId)
|
|||||||
|
|
||||||
APPSPAWN_STATIC int CreateClientSocket(uint32_t type, uint32_t timeout)
|
APPSPAWN_STATIC int CreateClientSocket(uint32_t type, uint32_t timeout)
|
||||||
{
|
{
|
||||||
const char *socketName = type == CLIENT_FOR_APPSPAWN ? APPSPAWN_SOCKET_NAME :
|
const char *socketName;
|
||||||
(type == CLIENT_FOR_CJAPPSPAWN ? CJAPPSPAWN_SOCKET_NAME : NWEBSPAWN_SOCKET_NAME);
|
|
||||||
|
switch (type) {
|
||||||
|
case CLIENT_FOR_APPSPAWN:
|
||||||
|
socketName = APPSPAWN_SOCKET_NAME;
|
||||||
|
break;
|
||||||
|
case CLIENT_FOR_CJAPPSPAWN:
|
||||||
|
socketName = CJAPPSPAWN_SOCKET_NAME;
|
||||||
|
break;
|
||||||
|
case CLIENT_FOR_NATIVESPAWN:
|
||||||
|
socketName = NATIVESPAWN_SOCKET_NAME;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
socketName = NWEBSPAWN_SOCKET_NAME;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
int socketFd = socket(AF_UNIX, SOCK_STREAM, 0); // SOCK_SEQPACKET
|
int socketFd = socket(AF_UNIX, SOCK_STREAM, 0); // SOCK_SEQPACKET
|
||||||
APPSPAWN_CHECK(socketFd >= 0, return -1,
|
APPSPAWN_CHECK(socketFd >= 0, return -1,
|
||||||
@ -270,6 +284,9 @@ int AppSpawnClientInit(const char *serviceName, AppSpawnClientHandle *handle)
|
|||||||
type = CLIENT_FOR_CJAPPSPAWN;
|
type = CLIENT_FOR_CJAPPSPAWN;
|
||||||
} else if (strcmp(serviceName, NWEBSPAWN_SERVER_NAME) == 0 || strstr(serviceName, NWEBSPAWN_SOCKET_NAME) != NULL) {
|
} else if (strcmp(serviceName, NWEBSPAWN_SERVER_NAME) == 0 || strstr(serviceName, NWEBSPAWN_SOCKET_NAME) != NULL) {
|
||||||
type = CLIENT_FOR_NWEBSPAWN;
|
type = CLIENT_FOR_NWEBSPAWN;
|
||||||
|
} else if (strcmp(serviceName, NATIVESPAWN_SERVER_NAME) == 0 ||
|
||||||
|
strstr(serviceName, NATIVESPAWN_SOCKET_NAME) != NULL) {
|
||||||
|
type = CLIENT_FOR_NATIVESPAWN;
|
||||||
}
|
}
|
||||||
int ret = InitClientInstance(type);
|
int ret = InitClientInstance(type);
|
||||||
APPSPAWN_CHECK(ret == 0, return APPSPAWN_SYSTEM_ERROR, "Failed to create reqMgr");
|
APPSPAWN_CHECK(ret == 0, return APPSPAWN_SYSTEM_ERROR, "Failed to create reqMgr");
|
||||||
|
@ -46,6 +46,7 @@ typedef enum {
|
|||||||
CLIENT_FOR_APPSPAWN,
|
CLIENT_FOR_APPSPAWN,
|
||||||
CLIENT_FOR_NWEBSPAWN,
|
CLIENT_FOR_NWEBSPAWN,
|
||||||
CLIENT_FOR_CJAPPSPAWN,
|
CLIENT_FOR_CJAPPSPAWN,
|
||||||
|
CLIENT_FOR_NATIVESPAWN,
|
||||||
CLIENT_MAX
|
CLIENT_MAX
|
||||||
} AppSpawnClientType;
|
} AppSpawnClientType;
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ typedef void *AppSpawnClientHandle;
|
|||||||
#define APPSPAWN_SERVER_NAME "appspawn"
|
#define APPSPAWN_SERVER_NAME "appspawn"
|
||||||
#define CJAPPSPAWN_SERVER_NAME "cjappspawn"
|
#define CJAPPSPAWN_SERVER_NAME "cjappspawn"
|
||||||
#define NWEBSPAWN_RESTART "nwebRestart"
|
#define NWEBSPAWN_RESTART "nwebRestart"
|
||||||
|
#define NATIVESPAWN_SERVER_NAME "nativespawn"
|
||||||
|
|
||||||
#pragma pack(4)
|
#pragma pack(4)
|
||||||
#define APP_MAX_GIDS 64
|
#define APP_MAX_GIDS 64
|
||||||
@ -175,6 +176,11 @@ typedef enum {
|
|||||||
APP_FLAGS_CHILDPROCESS,
|
APP_FLAGS_CHILDPROCESS,
|
||||||
APP_FLAGS_HWASAN_ENABLED = 21,
|
APP_FLAGS_HWASAN_ENABLED = 21,
|
||||||
APP_FLAGS_UBSAN_ENABLED = 22,
|
APP_FLAGS_UBSAN_ENABLED = 22,
|
||||||
|
APP_FLAGS_ISOLATED_SANDBOX_TYPE,
|
||||||
|
APP_FLAGS_ISOLATED_SELINUX_LABEL,
|
||||||
|
APP_FLAGS_ISOLATED_SECCOMP_TYPE,
|
||||||
|
APP_FLAGS_ISOLATED_NETWORK,
|
||||||
|
APP_FLAGS_ISOLATED_DATAGROUP,
|
||||||
MAX_FLAGS_INDEX = 63,
|
MAX_FLAGS_INDEX = 63,
|
||||||
} AppFlagsIndex;
|
} AppFlagsIndex;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ int SetAppAccessToken(const AppSpawnMgr *content, const AppSpawningCtx *property
|
|||||||
APPSPAWN_LOGV("AppSpawnServer::set access token %{public}" PRId64 " %{public}d",
|
APPSPAWN_LOGV("AppSpawnServer::set access token %{public}" PRId64 " %{public}d",
|
||||||
tokenInfo->accessTokenIdEx, IsNWebSpawnMode(content));
|
tokenInfo->accessTokenIdEx, IsNWebSpawnMode(content));
|
||||||
|
|
||||||
if (IsNWebSpawnMode(content)) {
|
if (IsNWebSpawnMode(content) || IsNativeSpawnMode(content)) {
|
||||||
TokenIdKit tokenIdKit;
|
TokenIdKit tokenIdKit;
|
||||||
tokenId = tokenIdKit.GetRenderTokenID(tokenInfo->accessTokenIdEx);
|
tokenId = tokenIdKit.GetRenderTokenID(tokenInfo->accessTokenIdEx);
|
||||||
} else {
|
} else {
|
||||||
@ -151,7 +151,7 @@ int SetSeccompFilter(const AppSpawnMgr *content, const AppSpawningCtx *property)
|
|||||||
#ifdef WITH_SECCOMP
|
#ifdef WITH_SECCOMP
|
||||||
const char *appName = APP_NAME;
|
const char *appName = APP_NAME;
|
||||||
SeccompFilterType type = APP;
|
SeccompFilterType type = APP;
|
||||||
|
|
||||||
if (IsNWebSpawnMode(content)) {
|
if (IsNWebSpawnMode(content)) {
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
std::string processType =
|
std::string processType =
|
||||||
|
@ -30,6 +30,7 @@ extern "C" {
|
|||||||
#define APPSPAWN_SOCKET_NAME "AppSpawn"
|
#define APPSPAWN_SOCKET_NAME "AppSpawn"
|
||||||
#define CJAPPSPAWN_SOCKET_NAME "CJAppSpawn"
|
#define CJAPPSPAWN_SOCKET_NAME "CJAppSpawn"
|
||||||
#define KEEPALIVE_NAME "keepalive"
|
#define KEEPALIVE_NAME "keepalive"
|
||||||
|
#define NATIVESPAWN_SOCKET_NAME "NativeSpawn"
|
||||||
|
|
||||||
#define APPSPAWN_ALIGN(len) (((len) + 0x03) & (~0x03))
|
#define APPSPAWN_ALIGN(len) (((len) + 0x03) & (~0x03))
|
||||||
#define APPSPAWN_TLV_NAME_LEN 32
|
#define APPSPAWN_TLV_NAME_LEN 32
|
||||||
|
@ -27,6 +27,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define APP_SANDBOX_FILE_NAME "/appdata-sandbox.json"
|
#define APP_SANDBOX_FILE_NAME "/appdata-sandbox.json"
|
||||||
#define WEB_SANDBOX_FILE_NAME "/appdata-sandbox-nweb.json"
|
#define WEB_SANDBOX_FILE_NAME "/appdata-sandbox-nweb.json"
|
||||||
|
#define ISOLATED_SANDBOX_FILE_NAME "/appdata-sandbox-isolated.json"
|
||||||
|
|
||||||
typedef struct TagSandboxQueue SandboxQueue;
|
typedef struct TagSandboxQueue SandboxQueue;
|
||||||
typedef struct TagPermissionNode SandboxPermissionNode;
|
typedef struct TagPermissionNode SandboxPermissionNode;
|
||||||
|
@ -199,7 +199,7 @@ static int InitSandboxContext(SandboxContext *context,
|
|||||||
context->message = property->message;
|
context->message = property->message;
|
||||||
|
|
||||||
context->sandboxNsFlags = CLONE_NEWNS;
|
context->sandboxNsFlags = CLONE_NEWNS;
|
||||||
if (CheckSpawningMsgFlagSet(context, APP_FLAGS_ISOLATED_SANDBOX)) {
|
if (CheckSpawningMsgFlagSet(context, APP_FLAGS_ISOLATED_NETWORK)) {
|
||||||
context->sandboxNsFlags |= sandbox->sandboxNsFlags & CLONE_NEWNET ? CLONE_NEWNET : 0;
|
context->sandboxNsFlags |= sandbox->sandboxNsFlags & CLONE_NEWNET ? CLONE_NEWNET : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ typedef struct {
|
|||||||
AppSpawnSandboxCfg *CreateAppSpawnSandbox(void);
|
AppSpawnSandboxCfg *CreateAppSpawnSandbox(void);
|
||||||
AppSpawnSandboxCfg *GetAppSpawnSandbox(const AppSpawnMgr *content);
|
AppSpawnSandboxCfg *GetAppSpawnSandbox(const AppSpawnMgr *content);
|
||||||
void DeleteAppSpawnSandbox(AppSpawnSandboxCfg *sandbox);
|
void DeleteAppSpawnSandbox(AppSpawnSandboxCfg *sandbox);
|
||||||
int LoadAppSandboxConfig(AppSpawnSandboxCfg *sandbox, int nwebSpawn);
|
int LoadAppSandboxConfig(AppSpawnSandboxCfg *sandbox, RunMode mode);
|
||||||
void DumpAppSpawnSandboxCfg(AppSpawnSandboxCfg *sandbox);
|
void DumpAppSpawnSandboxCfg(AppSpawnSandboxCfg *sandbox);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -661,10 +661,19 @@ APPSPAWN_STATIC int ParseAppSandboxConfig(const cJSON *root, ParseJsonContext *c
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LoadAppSandboxConfig(AppSpawnSandboxCfg *sandbox, int nwebSpawn)
|
APPSPAWN_STATIC const char *GetSandboxNameByMode(RunMode mode)
|
||||||
|
{
|
||||||
|
if (mode == MODE_FOR_NATIVE_SPAWN) {
|
||||||
|
return ISOLATED_SANDBOX_FILE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
return APP_SANDBOX_FILE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LoadAppSandboxConfig(AppSpawnSandboxCfg *sandbox, RunMode mode)
|
||||||
{
|
{
|
||||||
APPSPAWN_CHECK_ONLY_EXPER(sandbox != NULL, return APPSPAWN_ARG_INVALID);
|
APPSPAWN_CHECK_ONLY_EXPER(sandbox != NULL, return APPSPAWN_ARG_INVALID);
|
||||||
const char *sandboxName = nwebSpawn ? WEB_SANDBOX_FILE_NAME : APP_SANDBOX_FILE_NAME;
|
const char *sandboxName = GetSandboxNameByMode(mode);
|
||||||
if (sandbox->depGroupNodes != NULL) {
|
if (sandbox->depGroupNodes != NULL) {
|
||||||
APPSPAWN_LOGW("Sandbox has been load");
|
APPSPAWN_LOGW("Sandbox has been load");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "appspawn_msg.h"
|
#include "appspawn_msg.h"
|
||||||
#include "appspawn_server.h"
|
#include "appspawn_server.h"
|
||||||
#include "appspawn_service.h"
|
#include "appspawn_service.h"
|
||||||
|
#include "appspawn_utils.h"
|
||||||
#include "config_policy_utils.h"
|
#include "config_policy_utils.h"
|
||||||
#include "init_param.h"
|
#include "init_param.h"
|
||||||
#include "parameter.h"
|
#include "parameter.h"
|
||||||
@ -62,6 +63,7 @@ namespace {
|
|||||||
constexpr std::string_view APL_SYSTEM_CORE("system_core");
|
constexpr std::string_view APL_SYSTEM_CORE("system_core");
|
||||||
constexpr std::string_view APL_SYSTEM_BASIC("system_basic");
|
constexpr std::string_view APL_SYSTEM_BASIC("system_basic");
|
||||||
const std::string APP_JSON_CONFIG("/appdata-sandbox.json");
|
const std::string APP_JSON_CONFIG("/appdata-sandbox.json");
|
||||||
|
const std::string APP_ISOLATED_JSON_CONFIG("/appdata-sandbox-isolated.json");
|
||||||
const std::string g_physicalAppInstallPath = "/data/app/el1/bundle/public/";
|
const std::string g_physicalAppInstallPath = "/data/app/el1/bundle/public/";
|
||||||
const std::string g_sandboxGroupPath = "/data/storage/el2/group/";
|
const std::string g_sandboxGroupPath = "/data/storage/el2/group/";
|
||||||
const std::string g_sandboxHspInstallPath = "/data/storage/el1/bundle/";
|
const std::string g_sandboxHspInstallPath = "/data/storage/el1/bundle/";
|
||||||
@ -180,17 +182,17 @@ bool JsonUtils::GetStringFromJson(const nlohmann::json &json, const std::string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<nlohmann::json> SandboxUtils::appSandboxConfig_ = {};
|
std::map<SandboxConfigType, std::vector<nlohmann::json>> SandboxUtils::appSandboxConfig_ = {};
|
||||||
int32_t SandboxUtils::deviceTypeEnable_ = -1;
|
int32_t SandboxUtils::deviceTypeEnable_ = -1;
|
||||||
|
|
||||||
void SandboxUtils::StoreJsonConfig(nlohmann::json &appSandboxConfig)
|
void SandboxUtils::StoreJsonConfig(nlohmann::json &appSandboxConfig, SandboxConfigType type)
|
||||||
{
|
{
|
||||||
SandboxUtils::appSandboxConfig_.push_back(appSandboxConfig);
|
SandboxUtils::appSandboxConfig_[type].push_back(appSandboxConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<nlohmann::json> &SandboxUtils::GetJsonConfig()
|
std::vector<nlohmann::json> &SandboxUtils::GetJsonConfig(SandboxConfigType type)
|
||||||
{
|
{
|
||||||
return SandboxUtils::appSandboxConfig_;
|
return SandboxUtils::appSandboxConfig_[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MakeDirRecursive(const std::string &path, mode_t mode)
|
static void MakeDirRecursive(const std::string &path, mode_t mode)
|
||||||
@ -562,8 +564,9 @@ std::string SandboxUtils::GetSbxPathByConfig(const AppSpawningCtx *appProperty,
|
|||||||
|
|
||||||
std::string sandboxRoot = "";
|
std::string sandboxRoot = "";
|
||||||
const std::string originSandboxPath = "/mnt/sandbox/<PackageName>";
|
const std::string originSandboxPath = "/mnt/sandbox/<PackageName>";
|
||||||
|
std::string isolatedFlagText = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ? "isolated/" : "";
|
||||||
const std::string defaultSandboxRoot = g_sandBoxDir + to_string(dacInfo->uid / UID_BASE) +
|
const std::string defaultSandboxRoot = g_sandBoxDir + to_string(dacInfo->uid / UID_BASE) +
|
||||||
"/" + GetBundleName(appProperty);
|
"/" + isolatedFlagText.c_str() + GetBundleName(appProperty);
|
||||||
if (config.find(g_sandboxRootPrefix) != config.end()) {
|
if (config.find(g_sandboxRootPrefix) != config.end()) {
|
||||||
sandboxRoot = config[g_sandboxRootPrefix].get<std::string>();
|
sandboxRoot = config[g_sandboxRootPrefix].get<std::string>();
|
||||||
if (sandboxRoot == originSandboxPath) {
|
if (sandboxRoot == originSandboxPath) {
|
||||||
@ -934,7 +937,7 @@ int32_t SandboxUtils::DoSandboxFilePermissionBind(AppSpawningCtx *appProperty,
|
|||||||
std::set<std::string> SandboxUtils::GetMountPermissionNames()
|
std::set<std::string> SandboxUtils::GetMountPermissionNames()
|
||||||
{
|
{
|
||||||
std::set<std::string> permissionSet;
|
std::set<std::string> permissionSet;
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
for (auto& config : SandboxUtils::GetJsonConfig(SANBOX_APP_JSON_CONFIG)) {
|
||||||
if (config.find(g_permissionPrefix) == config.end()) {
|
if (config.find(g_permissionPrefix) == config.end()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1081,7 +1084,10 @@ int32_t SandboxUtils::SetRenderSandboxProperty(const AppSpawningCtx *appProperty
|
|||||||
int32_t SandboxUtils::SetRenderSandboxPropertyNweb(const AppSpawningCtx *appProperty,
|
int32_t SandboxUtils::SetRenderSandboxPropertyNweb(const AppSpawningCtx *appProperty,
|
||||||
std::string &sandboxPackagePath)
|
std::string &sandboxPackagePath)
|
||||||
{
|
{
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& config : SandboxUtils::GetJsonConfig(type)) {
|
||||||
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
||||||
if (privateAppConfig.find(g_ohosRender) != privateAppConfig.end()) {
|
if (privateAppConfig.find(g_ohosRender) != privateAppConfig.end()) {
|
||||||
int ret = DoAllMntPointsMount(appProperty, privateAppConfig[g_ohosRender][0], nullptr, g_ohosRender);
|
int ret = DoAllMntPointsMount(appProperty, privateAppConfig[g_ohosRender][0], nullptr, g_ohosRender);
|
||||||
@ -1101,17 +1107,23 @@ int32_t SandboxUtils::SetRenderSandboxPropertyNweb(const AppSpawningCtx *appProp
|
|||||||
int32_t SandboxUtils::SetPrivateAppSandboxProperty(const AppSpawningCtx *appProperty)
|
int32_t SandboxUtils::SetPrivateAppSandboxProperty(const AppSpawningCtx *appProperty)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& config : SandboxUtils::GetJsonConfig(type)) {
|
||||||
ret = SetPrivateAppSandboxProperty_(appProperty, config);
|
ret = SetPrivateAppSandboxProperty_(appProperty, config);
|
||||||
APPSPAWN_CHECK(ret == 0, return ret, "parse adddata-sandbox config failed");
|
APPSPAWN_CHECK(ret == 0, return ret, "parse adddata-sandbox config failed");
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool GetSandboxPrivateSharedStatus(const string &bundleName)
|
static bool GetSandboxPrivateSharedStatus(const string &bundleName, AppSpawningCtx *appProperty)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& config : SandboxUtils::GetJsonConfig(type)) {
|
||||||
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
||||||
if (privateAppConfig.find(bundleName) != privateAppConfig.end() &&
|
if (privateAppConfig.find(bundleName) != privateAppConfig.end() &&
|
||||||
privateAppConfig[bundleName][0].find(g_sandBoxShared) !=
|
privateAppConfig[bundleName][0].find(g_sandBoxShared) !=
|
||||||
@ -1129,7 +1141,10 @@ static bool GetSandboxPrivateSharedStatus(const string &bundleName)
|
|||||||
int32_t SandboxUtils::SetPermissionAppSandboxProperty(AppSpawningCtx *appProperty)
|
int32_t SandboxUtils::SetPermissionAppSandboxProperty(AppSpawningCtx *appProperty)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& config : SandboxUtils::GetJsonConfig(type)) {
|
||||||
ret = SetPermissionAppSandboxProperty_(appProperty, config);
|
ret = SetPermissionAppSandboxProperty_(appProperty, config);
|
||||||
APPSPAWN_CHECK(ret == 0, return ret, "parse adddata-sandbox config failed");
|
APPSPAWN_CHECK(ret == 0, return ret, "parse adddata-sandbox config failed");
|
||||||
}
|
}
|
||||||
@ -1161,7 +1176,10 @@ int32_t SandboxUtils::SetCommonAppSandboxProperty(const AppSpawningCtx *appPrope
|
|||||||
std::string &sandboxPackagePath)
|
std::string &sandboxPackagePath)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
for (auto& jsonConfig : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& jsonConfig : SandboxUtils::GetJsonConfig(type)) {
|
||||||
ret = SetCommonAppSandboxProperty_(appProperty, jsonConfig);
|
ret = SetCommonAppSandboxProperty_(appProperty, jsonConfig);
|
||||||
APPSPAWN_CHECK(ret == 0, return ret,
|
APPSPAWN_CHECK(ret == 0, return ret,
|
||||||
"parse appdata config for common failed, %{public}s", sandboxPackagePath.c_str());
|
"parse appdata config for common failed, %{public}s", sandboxPackagePath.c_str());
|
||||||
@ -1330,7 +1348,7 @@ uint32_t SandboxUtils::GetSandboxNsFlags(bool isNweb)
|
|||||||
return nsFlags;
|
return nsFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& config : SandboxUtils::GetJsonConfig()) {
|
for (auto& config : SandboxUtils::GetJsonConfig(SANBOX_APP_JSON_CONFIG)) {
|
||||||
if (isNweb) {
|
if (isNweb) {
|
||||||
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
nlohmann::json& privateAppConfig = config[g_privatePrefix][0];
|
||||||
if (privateAppConfig.find(g_ohosRender) == privateAppConfig.end()) {
|
if (privateAppConfig.find(g_ohosRender) == privateAppConfig.end()) {
|
||||||
@ -1371,7 +1389,10 @@ bool SandboxUtils::CheckBundleNameForPrivate(const std::string &bundleName)
|
|||||||
|
|
||||||
bool SandboxUtils::CheckTotalSandboxSwitchStatus(const AppSpawningCtx *appProperty)
|
bool SandboxUtils::CheckTotalSandboxSwitchStatus(const AppSpawningCtx *appProperty)
|
||||||
{
|
{
|
||||||
for (auto& wholeConfig : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& wholeConfig : SandboxUtils::GetJsonConfig(type)) {
|
||||||
if (wholeConfig.find(g_commonPrefix) == wholeConfig.end()) {
|
if (wholeConfig.find(g_commonPrefix) == wholeConfig.end()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1392,7 +1413,10 @@ bool SandboxUtils::CheckTotalSandboxSwitchStatus(const AppSpawningCtx *appProper
|
|||||||
bool SandboxUtils::CheckAppSandboxSwitchStatus(const AppSpawningCtx *appProperty)
|
bool SandboxUtils::CheckAppSandboxSwitchStatus(const AppSpawningCtx *appProperty)
|
||||||
{
|
{
|
||||||
bool rc = true;
|
bool rc = true;
|
||||||
for (auto& wholeConfig : SandboxUtils::GetJsonConfig()) {
|
SandboxConfigType type = CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ?
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG : SANBOX_APP_JSON_CONFIG;
|
||||||
|
|
||||||
|
for (auto& wholeConfig : SandboxUtils::GetJsonConfig(type)) {
|
||||||
if (wholeConfig.find(g_privatePrefix) == wholeConfig.end()) {
|
if (wholeConfig.find(g_privatePrefix) == wholeConfig.end()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1584,8 +1608,10 @@ int32_t SandboxUtils::SetAppSandboxProperty(AppSpawningCtx *appProperty, uint32_
|
|||||||
|
|
||||||
std::string sandboxPackagePath = g_sandBoxRootDir + to_string(dacInfo->uid / UID_BASE) + "/";
|
std::string sandboxPackagePath = g_sandBoxRootDir + to_string(dacInfo->uid / UID_BASE) + "/";
|
||||||
const std::string bundleName = GetBundleName(appProperty);
|
const std::string bundleName = GetBundleName(appProperty);
|
||||||
bool sandboxSharedStatus = GetSandboxPrivateSharedStatus(bundleName) || (CheckAppPermissionFlagSet(appProperty,
|
bool sandboxSharedStatus = GetSandboxPrivateSharedStatus(bundleName, appProperty) ||
|
||||||
static_cast<uint32_t>(GetPermissionIndex(nullptr, ACCESS_DLP_FILE_MODE.c_str()))) != 0);
|
(CheckAppPermissionFlagSet(appProperty, static_cast<uint32_t>(GetPermissionIndex(nullptr,
|
||||||
|
ACCESS_DLP_FILE_MODE.c_str()))) != 0);
|
||||||
|
sandboxPackagePath += CheckAppMsgFlagsSet(appProperty, APP_FLAGS_ISOLATED_SANDBOX_TYPE) ? "isolated/" : "";
|
||||||
sandboxPackagePath += bundleName;
|
sandboxPackagePath += bundleName;
|
||||||
MakeDirRecursive(sandboxPackagePath.c_str(), FILE_MODE);
|
MakeDirRecursive(sandboxPackagePath.c_str(), FILE_MODE);
|
||||||
|
|
||||||
@ -1624,7 +1650,7 @@ int32_t SandboxUtils::SetAppSandboxPropertyNweb(AppSpawningCtx *appProperty, uin
|
|||||||
}
|
}
|
||||||
std::string sandboxPackagePath = g_sandBoxRootDirNweb;
|
std::string sandboxPackagePath = g_sandBoxRootDirNweb;
|
||||||
const std::string bundleName = GetBundleName(appProperty);
|
const std::string bundleName = GetBundleName(appProperty);
|
||||||
bool sandboxSharedStatus = GetSandboxPrivateSharedStatus(bundleName);
|
bool sandboxSharedStatus = GetSandboxPrivateSharedStatus(bundleName, appProperty);
|
||||||
sandboxPackagePath += bundleName;
|
sandboxPackagePath += bundleName;
|
||||||
MakeDirRecursive(sandboxPackagePath.c_str(), FILE_MODE);
|
MakeDirRecursive(sandboxPackagePath.c_str(), FILE_MODE);
|
||||||
|
|
||||||
@ -1705,11 +1731,17 @@ int LoadAppSandboxConfig(AppSpawnMgr *content)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
std::string path = files->paths[i];
|
std::string path = files->paths[i];
|
||||||
path += OHOS::AppSpawn::APP_JSON_CONFIG;
|
std::string appPath = path + OHOS::AppSpawn::APP_JSON_CONFIG;
|
||||||
APPSPAWN_LOGI("LoadAppSandboxConfig %{public}s", path.c_str());
|
APPSPAWN_LOGI("LoadAppSandboxConfig %{public}s", appPath.c_str());
|
||||||
rc = OHOS::AppSpawn::JsonUtils::GetJsonObjFromJson(appSandboxConfig, path);
|
rc = OHOS::AppSpawn::JsonUtils::GetJsonObjFromJson(appSandboxConfig, appPath);
|
||||||
APPSPAWN_CHECK(rc, continue, "Failed to load app data sandbox config %{public}s", path.c_str());
|
APPSPAWN_CHECK(rc, continue, "Failed to load app data sandbox config %{public}s", appPath.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(appSandboxConfig);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(appSandboxConfig, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
|
std::string isolatedPath = path + OHOS::AppSpawn::APP_ISOLATED_JSON_CONFIG;
|
||||||
|
APPSPAWN_LOGI("LoadAppSandboxConfig %{public}s", isolatedPath.c_str());
|
||||||
|
rc = OHOS::AppSpawn::JsonUtils::GetJsonObjFromJson(appSandboxConfig, isolatedPath);
|
||||||
|
APPSPAWN_CHECK(rc, continue, "Failed to load app data sandbox config %{public}s", isolatedPath.c_str());
|
||||||
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(appSandboxConfig, SANBOX_ISOLATED_JSON_CONFIG);
|
||||||
}
|
}
|
||||||
FreeCfgFiles(files);
|
FreeCfgFiles(files);
|
||||||
bool isNweb = IsNWebSpawnMode(content);
|
bool isNweb = IsNWebSpawnMode(content);
|
||||||
@ -1736,7 +1768,7 @@ int32_t SetAppSandboxProperty(AppSpawnMgr *content, AppSpawningCtx *property)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint32_t sandboxNsFlags = CLONE_NEWNS;
|
uint32_t sandboxNsFlags = CLONE_NEWNS;
|
||||||
if (CheckAppMsgFlagsSet(property, APP_FLAGS_ISOLATED_SANDBOX)) {
|
if (CheckAppMsgFlagsSet(property, APP_FLAGS_ISOLATED_NETWORK)) {
|
||||||
sandboxNsFlags |= content->content.sandboxNsFlags & CLONE_NEWNET ? CLONE_NEWNET : 0;
|
sandboxNsFlags |= content->content.sandboxNsFlags & CLONE_NEWNET ? CLONE_NEWNET : 0;
|
||||||
}
|
}
|
||||||
APPSPAWN_LOGV("SetAppSandboxProperty sandboxNsFlags 0x%{public}x", sandboxNsFlags);
|
APPSPAWN_LOGV("SetAppSandboxProperty sandboxNsFlags 0x%{public}x", sandboxNsFlags);
|
||||||
|
@ -26,12 +26,17 @@
|
|||||||
#include "appspawn_server.h"
|
#include "appspawn_server.h"
|
||||||
#include "appspawn_manager.h"
|
#include "appspawn_manager.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SANBOX_APP_JSON_CONFIG,
|
||||||
|
SANBOX_ISOLATED_JSON_CONFIG
|
||||||
|
} SandboxConfigType;
|
||||||
|
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace AppSpawn {
|
namespace AppSpawn {
|
||||||
class SandboxUtils {
|
class SandboxUtils {
|
||||||
public:
|
public:
|
||||||
static void StoreJsonConfig(nlohmann::json &appSandboxConfig);
|
static void StoreJsonConfig(nlohmann::json &appSandboxConfig, SandboxConfigType type);
|
||||||
static std::vector<nlohmann::json> &GetJsonConfig();
|
static std::vector<nlohmann::json> &GetJsonConfig(SandboxConfigType type);
|
||||||
static int32_t SetAppSandboxProperty(AppSpawningCtx *client, uint32_t sandboxNsFlags = CLONE_NEWNS);
|
static int32_t SetAppSandboxProperty(AppSpawningCtx *client, uint32_t sandboxNsFlags = CLONE_NEWNS);
|
||||||
static int32_t SetAppSandboxPropertyNweb(AppSpawningCtx *client, uint32_t sandboxNsFlags = CLONE_NEWNS);
|
static int32_t SetAppSandboxPropertyNweb(AppSpawningCtx *client, uint32_t sandboxNsFlags = CLONE_NEWNS);
|
||||||
static uint32_t GetSandboxNsFlags(bool isNweb);
|
static uint32_t GetSandboxNsFlags(bool isNweb);
|
||||||
@ -115,7 +120,7 @@ private:
|
|||||||
const std::string §ion, std::string sandboxRoot);
|
const std::string §ion, std::string sandboxRoot);
|
||||||
static void GetSandboxMountConfig(const AppSpawningCtx *appProperty, const std::string §ion,
|
static void GetSandboxMountConfig(const AppSpawningCtx *appProperty, const std::string §ion,
|
||||||
nlohmann::json &mntPoint,SandboxMountConfig &mountConfig);
|
nlohmann::json &mntPoint,SandboxMountConfig &mountConfig);
|
||||||
static std::vector<nlohmann::json> appSandboxConfig_;
|
static std::map<SandboxConfigType, std::vector<nlohmann::json>> appSandboxConfig_;
|
||||||
static int32_t deviceTypeEnable_;
|
static int32_t deviceTypeEnable_;
|
||||||
};
|
};
|
||||||
class JsonUtils {
|
class JsonUtils {
|
||||||
|
@ -74,7 +74,7 @@ HAP工程根目录
|
|||||||
## 3 Native软件包的使用方法
|
## 3 Native软件包的使用方法
|
||||||
### 3.1 在hap应用中访问Native二进制
|
### 3.1 在hap应用中访问Native二进制
|
||||||
以c++语言为例,可以在hap应用代码中通过system、execv等函数执行二进制。默认公有hnp包软链接路径为/data/service/hnp/bin,默认私有hnp包软链接路径为/data/app/bin,默认软链接路径已加入环境变量中。
|
以c++语言为例,可以在hap应用代码中通过system、execv等函数执行二进制。默认公有hnp包软链接路径为/data/service/hnp/bin,默认私有hnp包软链接路径为/data/app/bin,默认软链接路径已加入环境变量中。
|
||||||
### 3.1 hdc shell执行方法
|
### 3.2 hdc shell执行方法
|
||||||
|
|
||||||
**操作步骤:**
|
**操作步骤:**
|
||||||
1. 从应用市场下载Native软件包hap应用并安装。
|
1. 从应用市场下载Native软件包hap应用并安装。
|
||||||
|
@ -27,6 +27,22 @@
|
|||||||
|
|
||||||
#define APPSPAWN_PRELOAD "libappspawn_helper.z.so"
|
#define APPSPAWN_PRELOAD "libappspawn_helper.z.so"
|
||||||
|
|
||||||
|
static AppSpawnStartArgTemplate g_appSpawnStartArgTemplate[PROCESS_INVALID] = {
|
||||||
|
{APPSPAWN_SERVER_NAME, {MODE_FOR_APP_SPAWN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 1}},
|
||||||
|
{NWEBSPAWN_SERVER_NAME, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}},
|
||||||
|
{"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 0}},
|
||||||
|
{"nweb_cold", {MODE_FOR_NWEB_COLD_RUN, MODULE_NWEBSPAWN, APPSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 0}},
|
||||||
|
{NATIVESPAWN_SERVER_NAME, {MODE_FOR_NATIVE_SPAWN, MODULE_APPSPAWN, NATIVESPAWN_SOCKET_NAME,
|
||||||
|
NATIVESPAWN_SERVER_NAME, 1}},
|
||||||
|
{NWEBSPAWN_RESTART, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}},
|
||||||
|
};
|
||||||
|
|
||||||
|
static AppSpawnStartArgTemplate g_appCJSpawnStartArgTemplate[CJPROCESS_INVALID] = {
|
||||||
|
{CJAPPSPAWN_SERVER_NAME, {MODE_FOR_CJAPP_SPAWN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME,
|
||||||
|
1}},
|
||||||
|
{"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME, 0}},
|
||||||
|
};
|
||||||
|
|
||||||
static void CheckPreload(char *const argv[])
|
static void CheckPreload(char *const argv[])
|
||||||
{
|
{
|
||||||
char buf[256] = APPSPAWN_PRELOAD; // 256 is enough in most cases
|
char buf[256] = APPSPAWN_PRELOAD; // 256 is enough in most cases
|
||||||
@ -58,6 +74,27 @@ static void CheckPreload(char *const argv[])
|
|||||||
APPSPAWN_LOGE("execv fail: %{public}s: %{public}d: %{public}d", buf, errno, ret);
|
APPSPAWN_LOGE("execv fail: %{public}s: %{public}d: %{public}d", buf, errno, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static AppSpawnStartArgTemplate *GetAppSpawnStartArg(const char *serverName, ProcessType type)
|
||||||
|
{
|
||||||
|
if (type == PROCESS_TYPE_APPSPAWN) {
|
||||||
|
for (uint32_t i = 0; i < ARRAY_LENGTH(g_appSpawnStartArgTemplate); i++) {
|
||||||
|
if (strcmp(serverName, g_appSpawnStartArgTemplate[i].serverName) == 0) {
|
||||||
|
return &g_appSpawnStartArgTemplate[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &g_appSpawnStartArgTemplate[PROCESS_FOR_APP_SPAWN];
|
||||||
|
} else {
|
||||||
|
for (uint32_t i = 0; i < ARRAY_LENGTH(g_appCJSpawnStartArgTemplate); i++) {
|
||||||
|
if (strcmp(serverName, g_appCJSpawnStartArgTemplate[i].serverName) == 0) {
|
||||||
|
return &g_appCJSpawnStartArgTemplate[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &g_appCJSpawnStartArgTemplate[CJPROCESS_FOR_APP_SPAWN];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// appspawn -mode appspawn | cold | nwebspawn -param app_property -fd clientFd
|
// appspawn -mode appspawn | cold | nwebspawn -param app_property -fd clientFd
|
||||||
int main(int argc, char *const argv[])
|
int main(int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
@ -74,59 +111,34 @@ int main(int argc, char *const argv[])
|
|||||||
CheckPreload(argv);
|
CheckPreload(argv);
|
||||||
(void)signal(SIGPIPE, SIG_IGN);
|
(void)signal(SIGPIPE, SIG_IGN);
|
||||||
uint32_t argvSize = end - start;
|
uint32_t argvSize = end - start;
|
||||||
AppSpawnStartArg arg = {};
|
AppSpawnStartArg *arg;
|
||||||
#ifndef CJAPP_SPAWN
|
AppSpawnStartArgTemplate *argTemp = NULL;
|
||||||
arg.mode = MODE_FOR_APP_SPAWN;
|
|
||||||
arg.socketName = APPSPAWN_SOCKET_NAME;
|
#ifdef CJAPP_SPAWN
|
||||||
arg.serviceName = APPSPAWN_SERVER_NAME;
|
argTemp = &g_appCJSpawnStartArgTemplate[CJPROCESS_FOR_APP_SPAWN];
|
||||||
arg.moduleType = MODULE_APPSPAWN;
|
if (argc > MODE_VALUE_INDEX) {
|
||||||
arg.initArg = 1;
|
argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], PROCESS_TYPE_CJAPPSPAWN);
|
||||||
if (argc <= MODE_VALUE_INDEX) { // appspawn start
|
|
||||||
arg.mode = MODE_FOR_APP_SPAWN;
|
|
||||||
} else if (strcmp(argv[MODE_VALUE_INDEX], "app_cold") == 0) { // cold start
|
|
||||||
APPSPAWN_CHECK(argc >= ARG_NULL, return 0, "Invalid arg for cold start %{public}d", argc);
|
|
||||||
arg.mode = MODE_FOR_APP_COLD_RUN;
|
|
||||||
arg.initArg = 0;
|
|
||||||
} else if (strcmp(argv[MODE_VALUE_INDEX], "nweb_cold") == 0) { // cold start
|
|
||||||
APPSPAWN_CHECK(argc >= ARG_NULL, return 0, "Invalid arg for cold start %{public}d", argc);
|
|
||||||
arg.mode = MODE_FOR_NWEB_COLD_RUN;
|
|
||||||
arg.moduleType = MODULE_NWEBSPAWN;
|
|
||||||
arg.serviceName = NWEBSPAWN_SERVER_NAME;
|
|
||||||
arg.initArg = 0;
|
|
||||||
} else if (strcmp(argv[MODE_VALUE_INDEX], NWEBSPAWN_SERVER_NAME) == 0) { // nweb spawn start
|
|
||||||
APPSPAWN_CHECK(argvSize >= APP_LEN_PROC_NAME,
|
|
||||||
return 0, "Invalid arg size for service %{public}s", arg.serviceName);
|
|
||||||
arg.mode = MODE_FOR_NWEB_SPAWN;
|
|
||||||
arg.moduleType = MODULE_NWEBSPAWN;
|
|
||||||
arg.socketName = NWEBSPAWN_SOCKET_NAME;
|
|
||||||
arg.serviceName = NWEBSPAWN_SERVER_NAME;
|
|
||||||
} else if (strcmp(argv[MODE_VALUE_INDEX], NWEBSPAWN_RESTART) == 0) { // nweb spawn restart
|
|
||||||
APPSPAWN_CHECK_ONLY_EXPER(argvSize >= APP_LEN_PROC_NAME, argvSize = APP_LEN_PROC_NAME);
|
|
||||||
arg.mode = MODE_FOR_NWEB_SPAWN;
|
|
||||||
arg.moduleType = MODULE_NWEBSPAWN;
|
|
||||||
arg.socketName = NWEBSPAWN_SOCKET_NAME;
|
|
||||||
arg.serviceName = NWEBSPAWN_SERVER_NAME;
|
|
||||||
} else {
|
|
||||||
APPSPAWN_CHECK(argvSize >= APP_LEN_PROC_NAME,
|
|
||||||
return 0, "Invalid arg size for service %{public}s", arg.serviceName);
|
|
||||||
}
|
}
|
||||||
AppSpawnContent *content = StartSpawnService(&arg, argvSize, argc, argv);
|
|
||||||
#else
|
#else
|
||||||
arg.mode = MODE_FOR_APP_SPAWN;
|
argTemp = &g_appSpawnStartArgTemplate[PROCESS_FOR_APP_SPAWN];
|
||||||
arg.socketName = CJAPPSPAWN_SOCKET_NAME;
|
if (argc > MODE_VALUE_INDEX) {
|
||||||
arg.serviceName = CJAPPSPAWN_SERVER_NAME;
|
argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], PROCESS_TYPE_APPSPAWN);
|
||||||
arg.moduleType = MODULE_APPSPAWN;
|
|
||||||
arg.initArg = 1;
|
|
||||||
// cold start in cjappspawn is for ide-sanitizers (asan/tsan/hwasan)
|
|
||||||
if (strcmp(argv[MODE_VALUE_INDEX], "app_cold") == 0) { // cold start
|
|
||||||
APPSPAWN_CHECK(argc >= ARG_NULL, return 0, "Invalid arg for cold start %{public}d", argc);
|
|
||||||
arg.mode = MODE_FOR_APP_COLD_RUN;
|
|
||||||
arg.initArg = 0;
|
|
||||||
}
|
}
|
||||||
AppSpawnContent *content = StartCJSpawnService(&arg, argvSize, argc, argv);
|
|
||||||
#endif
|
#endif
|
||||||
|
arg = &argTemp->arg;
|
||||||
|
if (arg->initArg == 0) {
|
||||||
|
APPSPAWN_CHECK(argc >= ARG_NULL, return 0, "Invalid arg for cold start %{public}d", argc);
|
||||||
|
} else {
|
||||||
|
if (strcmp(argTemp->serverName, NWEBSPAWN_RESTART) == 0) { // nweb spawn restart
|
||||||
|
APPSPAWN_CHECK_ONLY_EXPER(argvSize >= APP_LEN_PROC_NAME, argvSize = APP_LEN_PROC_NAME);
|
||||||
|
} else {
|
||||||
|
APPSPAWN_CHECK(argvSize >= APP_LEN_PROC_NAME, return 0, "Invalid arg size for service %{public}s",
|
||||||
|
arg->serviceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AppSpawnContent *content = StartSpawnService(arg, argvSize, argc, argv);
|
||||||
if (content != NULL) {
|
if (content != NULL) {
|
||||||
if (arg.moduleType == MODULE_APPSPAWN) {
|
if (arg->moduleType == MODULE_APPSPAWN) {
|
||||||
AppSpawnKickDogStart(content);
|
AppSpawnKickDogStart(content);
|
||||||
}
|
}
|
||||||
content->runAppSpawn(content, argc, argv);
|
content->runAppSpawn(content, argc, argv);
|
||||||
|
@ -187,6 +187,11 @@ APPSPAWN_INLINE int IsNWebSpawnMode(const AppSpawnMgr *content)
|
|||||||
(content->content.mode == MODE_FOR_NWEB_SPAWN || content->content.mode == MODE_FOR_NWEB_COLD_RUN);
|
(content->content.mode == MODE_FOR_NWEB_SPAWN || content->content.mode == MODE_FOR_NWEB_COLD_RUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
APPSPAWN_INLINE int IsNativeSpawnMode(const AppSpawnMgr *content)
|
||||||
|
{
|
||||||
|
return (content != NULL) && (content->content.mode == MODE_FOR_NATIVE_SPAWN);
|
||||||
|
}
|
||||||
|
|
||||||
APPSPAWN_INLINE int IsColdRunMode(const AppSpawnMgr *content)
|
APPSPAWN_INLINE int IsColdRunMode(const AppSpawnMgr *content)
|
||||||
{
|
{
|
||||||
return (content != NULL) &&
|
return (content != NULL) &&
|
||||||
|
@ -117,6 +117,16 @@ static void StopAppSpawn(void)
|
|||||||
OH_ListInit(&appInfo->node);
|
OH_ListInit(&appInfo->node);
|
||||||
free(appInfo);
|
free(appInfo);
|
||||||
}
|
}
|
||||||
|
// delete nativespawn, and wait exit. Otherwise, the process of nativespawn spawning will become zombie
|
||||||
|
appInfo = GetSpawnedProcessByName(NATIVESPAWN_SERVER_NAME);
|
||||||
|
if (appInfo != NULL) {
|
||||||
|
APPSPAWN_LOGI("kill %{public}s pid: %{public}d", appInfo->name, appInfo->pid);
|
||||||
|
int exitStatus = 0;
|
||||||
|
KillAndWaitStatus(appInfo->pid, SIGTERM, &exitStatus);
|
||||||
|
OH_ListRemove(&appInfo->node);
|
||||||
|
OH_ListInit(&appInfo->node);
|
||||||
|
free(appInfo);
|
||||||
|
}
|
||||||
TraversalSpawnedProcess(AppQueueDestroyProc, NULL);
|
TraversalSpawnedProcess(AppQueueDestroyProc, NULL);
|
||||||
APPSPAWN_LOGI("StopAppSpawn ");
|
APPSPAWN_LOGI("StopAppSpawn ");
|
||||||
#ifdef APPSPAWN_HISYSEVENT
|
#ifdef APPSPAWN_HISYSEVENT
|
||||||
@ -962,25 +972,54 @@ AppSpawnContent *AppSpawnCreateContent(const char *socketName, char *longProcNam
|
|||||||
return &appSpawnContent->content;
|
return &appSpawnContent->content;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CJAPP_SPAWN
|
APPSPAWN_STATIC void AppSpawnArgSet(RunMode mode, AppSpawnStartArg *arg)
|
||||||
|
{
|
||||||
|
if (mode == MODE_FOR_NWEB_SPAWN) {
|
||||||
|
arg->socketName = NWEBSPAWN_SOCKET_NAME;
|
||||||
|
arg->serviceName = NWEBSPAWN_SERVER_NAME;
|
||||||
|
arg->moduleType = MODULE_NWEBSPAWN;
|
||||||
|
arg->mode = MODE_FOR_NWEB_SPAWN;
|
||||||
|
arg->initArg = 1;
|
||||||
|
} else if (mode == MODE_FOR_NATIVE_SPAWN) {
|
||||||
|
arg->socketName = NATIVESPAWN_SOCKET_NAME;
|
||||||
|
arg->serviceName = NATIVESPAWN_SERVER_NAME;
|
||||||
|
arg->moduleType = MODULE_APPSPAWN;
|
||||||
|
arg->mode = MODE_FOR_NATIVE_SPAWN;
|
||||||
|
arg->initArg = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
APPSPAWN_STATIC void AppSpawnStartServiceEnd(pid_t nwebSpawnPid, pid_t NativeSpawnPid)
|
||||||
|
{
|
||||||
|
AddSpawnedProcess(nwebSpawnPid, NWEBSPAWN_SERVER_NAME);
|
||||||
|
AddSpawnedProcess(NativeSpawnPid, NATIVESPAWN_SERVER_NAME);
|
||||||
|
SetParameter("bootevent.appspawn.started", "true");
|
||||||
|
}
|
||||||
|
|
||||||
AppSpawnContent *StartSpawnService(const AppSpawnStartArg *startArg, uint32_t argvSize, int argc, char *const argv[])
|
AppSpawnContent *StartSpawnService(const AppSpawnStartArg *startArg, uint32_t argvSize, int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
APPSPAWN_CHECK(startArg != NULL && argv != NULL, return NULL, "Invalid start arg");
|
APPSPAWN_CHECK(startArg != NULL && argv != NULL, return NULL, "Invalid start arg");
|
||||||
pid_t pid = 0;
|
pid_t pid = 0;
|
||||||
|
pid_t NativeSpawnPid = 0;
|
||||||
AppSpawnStartArg *arg = (AppSpawnStartArg *)startArg;
|
AppSpawnStartArg *arg = (AppSpawnStartArg *)startArg;
|
||||||
APPSPAWN_LOGV("Start appspawn argvSize %{public}d mode %{public}d service %{public}s",
|
APPSPAWN_LOGV("Start appspawn argvSize %{public}d mode %{public}d service %{public}s",
|
||||||
argvSize, arg->mode, arg->serviceName);
|
argvSize, arg->mode, arg->serviceName);
|
||||||
if (arg->mode == MODE_FOR_APP_SPAWN) {
|
if (arg->mode == MODE_FOR_APP_SPAWN) {
|
||||||
pid = NWebSpawnLaunch();
|
pid = NWebSpawnLaunch();
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
arg->socketName = NWEBSPAWN_SOCKET_NAME;
|
AppSpawnArgSet(MODE_FOR_NWEB_SPAWN, arg);
|
||||||
arg->serviceName = NWEBSPAWN_SERVER_NAME;
|
} else {
|
||||||
arg->moduleType = MODULE_NWEBSPAWN;
|
NativeSpawnPid = NativeSpawnLaunch();
|
||||||
arg->mode = MODE_FOR_NWEB_SPAWN;
|
if (NativeSpawnPid == 0) {
|
||||||
arg->initArg = 1;
|
AppSpawnArgSet(MODE_FOR_NATIVE_SPAWN, arg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (arg->mode == MODE_FOR_NWEB_SPAWN && getuid() == 0) {
|
} else if (arg->mode == MODE_FOR_NWEB_SPAWN && getuid() == 0) {
|
||||||
NWebSpawnInit();
|
NWebSpawnInit();
|
||||||
|
} else if (arg->mode == MODE_FOR_NATIVE_SPAWN && getuid() == 0) {
|
||||||
|
NativeSpawnInit();
|
||||||
}
|
}
|
||||||
if (arg->initArg) {
|
if (arg->initArg) {
|
||||||
int ret = memset_s(argv[0], argvSize, 0, (size_t)argvSize);
|
int ret = memset_s(argv[0], argvSize, 0, (size_t)argvSize);
|
||||||
@ -1007,12 +1046,10 @@ AppSpawnContent *StartSpawnService(const AppSpawnStartArg *startArg, uint32_t ar
|
|||||||
#endif
|
#endif
|
||||||
AddAppSpawnHook(STAGE_CHILD_PRE_RUN, HOOK_PRIO_LOWEST, AppSpawnClearEnv);
|
AddAppSpawnHook(STAGE_CHILD_PRE_RUN, HOOK_PRIO_LOWEST, AppSpawnClearEnv);
|
||||||
if (arg->mode == MODE_FOR_APP_SPAWN) {
|
if (arg->mode == MODE_FOR_APP_SPAWN) {
|
||||||
AddSpawnedProcess(pid, NWEBSPAWN_SERVER_NAME);
|
AppSpawnStartServiceEnd(pid, NativeSpawnPid);
|
||||||
SetParameter("bootevent.appspawn.started", "true");
|
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static AppSpawnMsgNode *ProcessSpawnBegetctlMsg(AppSpawnConnection *connection, AppSpawnMsgNode *message)
|
static AppSpawnMsgNode *ProcessSpawnBegetctlMsg(AppSpawnConnection *connection, AppSpawnMsgNode *message)
|
||||||
{
|
{
|
||||||
@ -1211,41 +1248,4 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess
|
|||||||
DeleteAppSpawnMsg(message);
|
DeleteAppSpawnMsg(message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// To support cjappspawn
|
|
||||||
#ifdef CJAPP_SPAWN
|
|
||||||
AppSpawnContent *StartCJSpawnService(const AppSpawnStartArg *startArg, uint32_t argvSize, int argc, char *const argv[])
|
|
||||||
{
|
|
||||||
APPSPAWN_LOGI("Start CJ Spawn Service ...");
|
|
||||||
APPSPAWN_CHECK(startArg != NULL && argv != NULL, return NULL, "Invalid start arg");
|
|
||||||
AppSpawnStartArg *arg = (AppSpawnStartArg *)startArg;
|
|
||||||
APPSPAWN_LOGV("Start appspawn argvSize %{public}d mode %{public}d service %{public}s",
|
|
||||||
argvSize, arg->mode, arg->serviceName);
|
|
||||||
if (arg->initArg) {
|
|
||||||
int ret = memset_s(argv[0], argvSize, 0, (size_t)argvSize);
|
|
||||||
APPSPAWN_CHECK(ret == EOK, return NULL, "Failed to memset argv[0]");
|
|
||||||
ret = strncpy_s(argv[0], argvSize, arg->serviceName, strlen(arg->serviceName));
|
|
||||||
APPSPAWN_CHECK(ret == EOK, return NULL, "Failed to copy service name %{public}s", arg->serviceName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load module appspawn/common
|
|
||||||
AppSpawnLoadAutoRunModules(MODULE_COMMON);
|
|
||||||
AppSpawnModuleMgrInstall(ASAN_MODULE_PATH);
|
|
||||||
|
|
||||||
APPSPAWN_CHECK(LE_GetDefaultLoop() != NULL, return NULL, "Invalid default loop");
|
|
||||||
AppSpawnContent *content = AppSpawnCreateContent(arg->socketName, argv[0], argvSize, arg->mode);
|
|
||||||
APPSPAWN_CHECK(content != NULL, return NULL, "Failed to create content for %{public}s", arg->socketName);
|
|
||||||
|
|
||||||
AppSpawnLoadAutoRunModules(arg->moduleType); // load corresponding plugin according to startup mode
|
|
||||||
int ret = ServerStageHookExecute(STAGE_SERVER_PRELOAD, content); // Preload, prase the sandbox
|
|
||||||
APPSPAWN_CHECK(ret == 0, AppSpawnDestroyContent(content);
|
|
||||||
return NULL, "Failed to prepare load %{public}s result: %{public}d", arg->serviceName, ret);
|
|
||||||
#ifndef APPSPAWN_TEST
|
|
||||||
APPSPAWN_CHECK(content->runChildProcessor != NULL, AppSpawnDestroyContent(content);
|
|
||||||
return NULL, "No child processor %{public}s result: %{public}d", arg->serviceName, ret);
|
|
||||||
#endif
|
|
||||||
AddAppSpawnHook(STAGE_CHILD_PRE_RUN, HOOK_PRIO_LOWEST, AppSpawnClearEnv);
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -64,8 +64,15 @@ typedef struct TagAppSpawnStartArg {
|
|||||||
uint32_t initArg : 1;
|
uint32_t initArg : 1;
|
||||||
} AppSpawnStartArg;
|
} AppSpawnStartArg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *serverName;
|
||||||
|
AppSpawnStartArg arg;
|
||||||
|
} AppSpawnStartArgTemplate;
|
||||||
|
|
||||||
pid_t NWebSpawnLaunch(void);
|
pid_t NWebSpawnLaunch(void);
|
||||||
void NWebSpawnInit(void);
|
void NWebSpawnInit(void);
|
||||||
|
pid_t NativeSpawnLaunch(void);
|
||||||
|
void NativeSpawnInit(void);
|
||||||
AppSpawnContent *StartSpawnService(const AppSpawnStartArg *arg, uint32_t argvSize, int argc, char *const argv[]);
|
AppSpawnContent *StartSpawnService(const AppSpawnStartArg *arg, uint32_t argvSize, int argc, char *const argv[]);
|
||||||
#ifdef CJAPP_SPAWN
|
#ifdef CJAPP_SPAWN
|
||||||
AppSpawnContent *StartCJSpawnService(const AppSpawnStartArg *arg, uint32_t argvSize, int argc, char *const argv[]);
|
AppSpawnContent *StartCJSpawnService(const AppSpawnStartArg *arg, uint32_t argvSize, int argc, char *const argv[]);
|
||||||
|
@ -41,6 +41,9 @@
|
|||||||
#define NWEB_UID 3081
|
#define NWEB_UID 3081
|
||||||
#define NWEB_GID 3081
|
#define NWEB_GID 3081
|
||||||
#define NWEB_NAME "nwebspawn"
|
#define NWEB_NAME "nwebspawn"
|
||||||
|
#define NATIVE_UID 3082
|
||||||
|
#define NATIVE_GID 3082
|
||||||
|
#define NATIVE_NAME "nativespawn"
|
||||||
#define CAP_NUM 2
|
#define CAP_NUM 2
|
||||||
#define BITLEN32 32
|
#define BITLEN32 32
|
||||||
|
|
||||||
@ -93,3 +96,27 @@ pid_t NWebSpawnLaunch(void)
|
|||||||
APPSPAWN_LOGI("nwebspawn fork success pid: %{public}d", ret);
|
APPSPAWN_LOGI("nwebspawn fork success pid: %{public}d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeSpawnInit(void)
|
||||||
|
{
|
||||||
|
APPSPAWN_LOGI("NativeSpawnInit");
|
||||||
|
#ifdef WITH_SELINUX
|
||||||
|
int ret = setcon("u:r:nativespawn:s0");
|
||||||
|
APPSPAWN_CHECK_ONLY_LOG(ret == 0, "Setcon failed, errno: %{public}d", errno);
|
||||||
|
#endif
|
||||||
|
pid_t pid = getpid();
|
||||||
|
setpriority(PRIO_PROCESS, pid, 0);
|
||||||
|
#ifndef APPSPAWN_TEST
|
||||||
|
(void)prctl(PR_SET_NAME, NATIVE_NAME);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t NativeSpawnLaunch(void)
|
||||||
|
{
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
NativeSpawnInit();
|
||||||
|
}
|
||||||
|
APPSPAWN_LOGI("Nativespawn fork success pid: %{public}d", pid);
|
||||||
|
return pid;
|
||||||
|
}
|
@ -16,6 +16,7 @@
|
|||||||
#include "appspawn.h"
|
#include "appspawn.h"
|
||||||
#include "appspawn_utils.h"
|
#include "appspawn_utils.h"
|
||||||
#include "securec.h"
|
#include "securec.h"
|
||||||
|
#include "appspawn_server.h"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ public:
|
|||||||
void TearDown() {}
|
void TearDown() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static AppSpawnReqMsgHandle CreateMsg(AppSpawnClientHandle handle, const char *bundleName)
|
static AppSpawnReqMsgHandle CreateMsg(AppSpawnClientHandle handle, const char *bundleName, RunMode mode)
|
||||||
{
|
{
|
||||||
AppSpawnReqMsgHandle reqHandle = 0;
|
AppSpawnReqMsgHandle reqHandle = 0;
|
||||||
int ret = AppSpawnReqMsgCreate(MSG_APP_SPAWN, bundleName, &reqHandle);
|
int ret = AppSpawnReqMsgCreate(MSG_APP_SPAWN, bundleName, &reqHandle);
|
||||||
@ -52,6 +53,14 @@ static AppSpawnReqMsgHandle CreateMsg(AppSpawnClientHandle handle, const char *b
|
|||||||
APPSPAWN_CHECK(ret == 0, break, "Failed to add dac %{public}s", APPSPAWN_SERVER_NAME);
|
APPSPAWN_CHECK(ret == 0, break, "Failed to add dac %{public}s", APPSPAWN_SERVER_NAME);
|
||||||
|
|
||||||
AppSpawnReqMsgSetAppFlag(reqHandle, static_cast<AppFlagsIndex>(10)); // 10 test
|
AppSpawnReqMsgSetAppFlag(reqHandle, static_cast<AppFlagsIndex>(10)); // 10 test
|
||||||
|
if (mode == MODE_FOR_NATIVE_SPAWN) {
|
||||||
|
AppSpawnReqMsgSetAppFlag(reqHandle, static_cast<AppFlagsIndex>(23)); // 23 APP_FLAGS_ISOLATED_SANDBOX_TYPE
|
||||||
|
AppSpawnReqMsgSetAppFlag(reqHandle, static_cast<AppFlagsIndex>(26)); // 26 APP_FLAGS_ISOLATED_NETWORK
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *apl = "normal";
|
||||||
|
ret = AppSpawnReqMsgSetAppDomainInfo(reqHandle, 1, apl);
|
||||||
|
APPSPAWN_CHECK(ret == 0, break, "Failed to add domain %{public}s", APPSPAWN_SERVER_NAME);
|
||||||
|
|
||||||
ret = AppSpawnReqMsgSetAppAccessToken(reqHandle, 12345678); // 12345678
|
ret = AppSpawnReqMsgSetAppAccessToken(reqHandle, 12345678); // 12345678
|
||||||
APPSPAWN_CHECK(ret == 0, break, "Failed to add access token %{public}s", APPSPAWN_SERVER_NAME);
|
APPSPAWN_CHECK(ret == 0, break, "Failed to add access token %{public}s", APPSPAWN_SERVER_NAME);
|
||||||
@ -85,7 +94,7 @@ HWTEST_F(AppSpawnClientTest, AppSpawn_Client_test001, TestSize.Level0)
|
|||||||
{
|
{
|
||||||
AppSpawnClientHandle clientHandle = CreateClient(APPSPAWN_SERVER_NAME);
|
AppSpawnClientHandle clientHandle = CreateClient(APPSPAWN_SERVER_NAME);
|
||||||
ASSERT_EQ(clientHandle != NULL, 1);
|
ASSERT_EQ(clientHandle != NULL, 1);
|
||||||
AppSpawnReqMsgHandle reqHandle = CreateMsg(clientHandle, "ohos.samples.clock");
|
AppSpawnReqMsgHandle reqHandle = CreateMsg(clientHandle, "ohos.samples.clock", MODE_FOR_APP_SPAWN);
|
||||||
ASSERT_EQ(reqHandle != INVALID_REQ_HANDLE, 1);
|
ASSERT_EQ(reqHandle != INVALID_REQ_HANDLE, 1);
|
||||||
|
|
||||||
AppSpawnResult result = {};
|
AppSpawnResult result = {};
|
||||||
@ -95,5 +104,21 @@ HWTEST_F(AppSpawnClientTest, AppSpawn_Client_test001, TestSize.Level0)
|
|||||||
}
|
}
|
||||||
AppSpawnClientDestroy(clientHandle);
|
AppSpawnClientDestroy(clientHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWTEST_F(AppSpawnClientTest, AppSpawn_Client_test002, TestSize.Level0)
|
||||||
|
{
|
||||||
|
AppSpawnClientHandle clientHandle = CreateClient(NATIVESPAWN_SERVER_NAME);
|
||||||
|
ASSERT_EQ(clientHandle != NULL, 1);
|
||||||
|
AppSpawnReqMsgHandle reqHandle = CreateMsg(clientHandle, "ohos.samples.clock", MODE_FOR_NATIVE_SPAWN);
|
||||||
|
ASSERT_EQ(reqHandle != INVALID_REQ_HANDLE, 1);
|
||||||
|
|
||||||
|
AppSpawnResult result = {};
|
||||||
|
int ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
|
||||||
|
if (ret == 0 && result.pid > 0) {
|
||||||
|
kill(result.pid, SIGKILL);
|
||||||
|
}
|
||||||
|
AppSpawnClientDestroy(clientHandle);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace AppSpawn
|
} // namespace AppSpawn
|
||||||
} // namespace OHOS
|
} // namespace OHOS
|
||||||
|
@ -88,7 +88,8 @@ static const char *APPSPAWN_TEST_USAGE = "usage: AppSpawnTest <options> \n"
|
|||||||
" --thread xx use multi-thread to send message\n"
|
" --thread xx use multi-thread to send message\n"
|
||||||
" --type xx send msg type \n"
|
" --type xx send msg type \n"
|
||||||
" --pid xx render terminate pid\n"
|
" --pid xx render terminate pid\n"
|
||||||
" --mode nwebspawn send message to nwebspawn service\n";
|
" --mode nwebspawn send message to nwebspawn service\n"
|
||||||
|
" --mode nativespawn send message to nativespawn service\n";
|
||||||
|
|
||||||
int AppSpawnTestCommander::ProcessArgs(int argc, char *const argv[])
|
int AppSpawnTestCommander::ProcessArgs(int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
@ -111,7 +112,13 @@ int AppSpawnTestCommander::ProcessArgs(int argc, char *const argv[])
|
|||||||
sendMsg = 1;
|
sendMsg = 1;
|
||||||
} else if (strcmp(argv[i], "--mode") == 0 && ((i + 1) < argc)) {
|
} else if (strcmp(argv[i], "--mode") == 0 && ((i + 1) < argc)) {
|
||||||
i++;
|
i++;
|
||||||
appSpawn_ = strcmp(argv[i], "nwebspawn") == 0 ? 0 : 1;
|
if (strcmp(argv[i], "nwebspawn") == 0) {
|
||||||
|
appSpawn_ = 0;
|
||||||
|
} else if (strcmp(argv[i], "nativespawn") == 0) {
|
||||||
|
appSpawn_ = 2;
|
||||||
|
} else {
|
||||||
|
appSpawn_ = 1;
|
||||||
|
}
|
||||||
sendMsg = 1;
|
sendMsg = 1;
|
||||||
} else if (strcmp(argv[i], "--type") == 0 && ((i + 1) < argc)) {
|
} else if (strcmp(argv[i], "--type") == 0 && ((i + 1) < argc)) {
|
||||||
i++;
|
i++;
|
||||||
@ -380,7 +387,8 @@ int AppSpawnTestCommander::CreateMsg(AppSpawnReqMsgHandle &reqHandle,
|
|||||||
|
|
||||||
int AppSpawnTestCommander::SendMsg()
|
int AppSpawnTestCommander::SendMsg()
|
||||||
{
|
{
|
||||||
const char *server = appSpawn_ ? APPSPAWN_SERVER_NAME : NWEBSPAWN_SERVER_NAME;
|
const char *server = appSpawn_ == 1 ? APPSPAWN_SERVER_NAME : (appSpawn_ == 2 ? NATIVESPAWN_SERVER_NAME :
|
||||||
|
NWEBSPAWN_SERVER_NAME);
|
||||||
printf("Send msg to server '%s' \n", server);
|
printf("Send msg to server '%s' \n", server);
|
||||||
AppSpawnReqMsgHandle reqHandle = INVALID_REQ_HANDLE;
|
AppSpawnReqMsgHandle reqHandle = INVALID_REQ_HANDLE;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -547,7 +555,8 @@ void AppSpawnTestCommander::DumpThread(ThreadTaskHandle handle, const ThreadCont
|
|||||||
int AppSpawnTestCommander::Run()
|
int AppSpawnTestCommander::Run()
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
const char *name = appSpawn_ ? APPSPAWN_SERVER_NAME : NWEBSPAWN_SERVER_NAME;
|
const char *name = appSpawn_ == 1 ? APPSPAWN_SERVER_NAME : (appSpawn_ == 2 ? NATIVESPAWN_SERVER_NAME :
|
||||||
|
NWEBSPAWN_SERVER_NAME);
|
||||||
if (clientHandle_ == NULL) {
|
if (clientHandle_ == NULL) {
|
||||||
ret = AppSpawnClientInit(name, &clientHandle_);
|
ret = AppSpawnClientInit(name, &clientHandle_);
|
||||||
APPSPAWN_CHECK(ret == 0, return -1, "Failed to create client %{public}s", name);
|
APPSPAWN_CHECK(ret == 0, return -1, "Failed to create client %{public}s", name);
|
||||||
|
@ -101,7 +101,7 @@ private:
|
|||||||
int ptyFd_{-1};
|
int ptyFd_{-1};
|
||||||
uint32_t dumpFlags : 1;
|
uint32_t dumpFlags : 1;
|
||||||
uint32_t exit_ : 1;
|
uint32_t exit_ : 1;
|
||||||
uint32_t appSpawn_ : 1;
|
uint32_t appSpawn_ : 2;
|
||||||
uint32_t msgType_;
|
uint32_t msgType_;
|
||||||
pid_t terminatePid_;
|
pid_t terminatePid_;
|
||||||
uint32_t threadCount_{1};
|
uint32_t threadCount_{1};
|
||||||
|
@ -197,7 +197,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_10, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
g_testHelper.SetTestGid(1000); // 1000 test
|
g_testHelper.SetTestGid(1000); // 1000 test
|
||||||
@ -238,7 +238,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_13, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
@ -278,7 +278,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_14, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_15, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
@ -357,7 +357,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_16, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
GTEST_LOG_(INFO) << "SetAppSandboxProperty start" << std::endl;
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
@ -390,7 +390,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_17, TestSize.Level0)
|
|||||||
\"individual\": [] \
|
\"individual\": [] \
|
||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
std::string value;
|
std::string value;
|
||||||
rc = JsonUtils::GetStringFromJson(j_config, "common", value);
|
rc = JsonUtils::GetStringFromJson(j_config, "common", value);
|
||||||
@ -439,7 +439,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_20, TestSize.Level0)
|
|||||||
\"individual\": [] \
|
\"individual\": [] \
|
||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
g_testHelper.SetTestGid(1000); // 1000 test
|
g_testHelper.SetTestGid(1000); // 1000 test
|
||||||
@ -464,7 +464,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_20, TestSize.Level0)
|
|||||||
}] \
|
}] \
|
||||||
}";
|
}";
|
||||||
nlohmann::json j_config1 = nlohmann::json::parse(mJsconfig1.c_str());
|
nlohmann::json j_config1 = nlohmann::json::parse(mJsconfig1.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config1);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config1, SANBOX_APP_JSON_CONFIG);
|
||||||
OHOS::AppSpawn::SandboxUtils::SetAppSandboxProperty(appProperty);
|
OHOS::AppSpawn::SandboxUtils::SetAppSandboxProperty(appProperty);
|
||||||
DeleteAppSpawningCtx(appProperty);
|
DeleteAppSpawningCtx(appProperty);
|
||||||
}
|
}
|
||||||
@ -485,7 +485,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_22, TestSize.Level0)
|
|||||||
\"individual\": [] \
|
\"individual\": [] \
|
||||||
}";
|
}";
|
||||||
nlohmann::json j_config1 = nlohmann::json::parse(mJsconfig1.c_str());
|
nlohmann::json j_config1 = nlohmann::json::parse(mJsconfig1.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config1);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config1, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
g_testHelper.SetTestUid(1000); // 1000 test
|
g_testHelper.SetTestUid(1000); // 1000 test
|
||||||
g_testHelper.SetTestGid(1000); // 1000 test
|
g_testHelper.SetTestGid(1000); // 1000 test
|
||||||
@ -1108,7 +1108,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_38, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
|
|
||||||
nlohmann::json p_config1 = nlohmann::json::parse(pJsconfig1.c_str());
|
nlohmann::json p_config1 = nlohmann::json::parse(pJsconfig1.c_str());
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(p_config1);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(p_config1, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
std::string sandboxPackagePath = "/mnt/sandbox/100/";
|
std::string sandboxPackagePath = "/mnt/sandbox/100/";
|
||||||
const std::string bundleName = GetBundleName(appProperty);
|
const std::string bundleName = GetBundleName(appProperty);
|
||||||
@ -1206,7 +1206,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_41, TestSize.Level0)
|
|||||||
}";
|
}";
|
||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
uint32_t cloneFlags = OHOS::AppSpawn::SandboxUtils::GetSandboxNsFlags(false);
|
uint32_t cloneFlags = OHOS::AppSpawn::SandboxUtils::GetSandboxNsFlags(false);
|
||||||
EXPECT_EQ(!!(cloneFlags & CLONE_NEWPID), true);
|
EXPECT_EQ(!!(cloneFlags & CLONE_NEWPID), true);
|
||||||
@ -1240,7 +1240,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_42, TestSize.Level0)
|
|||||||
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
nlohmann::json j_config = nlohmann::json::parse(mJsconfig.c_str());
|
||||||
const char *mountPath = "mount-paths";
|
const char *mountPath = "mount-paths";
|
||||||
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
|
|
||||||
std::string fsType = OHOS::AppSpawn::SandboxUtils::GetSandboxFsType(j_secondConfig);
|
std::string fsType = OHOS::AppSpawn::SandboxUtils::GetSandboxFsType(j_secondConfig);
|
||||||
int ret = strcmp(fsType.c_str(), "sharefs");
|
int ret = strcmp(fsType.c_str(), "sharefs");
|
||||||
@ -1273,7 +1273,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_43, TestSize.Level0)
|
|||||||
const char *mountPath = "mount-paths";
|
const char *mountPath = "mount-paths";
|
||||||
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
OHOS::AppSpawn::SandboxUtils::SandboxMountConfig mountConfig;
|
OHOS::AppSpawn::SandboxUtils::SandboxMountConfig mountConfig;
|
||||||
std::string section = "common";
|
std::string section = "common";
|
||||||
AppSpawningCtx *appProperty = GetTestAppProperty();
|
AppSpawningCtx *appProperty = GetTestAppProperty();
|
||||||
@ -1307,7 +1307,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_44, TestSize.Level0)
|
|||||||
const char *mountPath = "mount-paths";
|
const char *mountPath = "mount-paths";
|
||||||
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
OHOS::AppSpawn::SandboxUtils::SandboxMountConfig mountConfig;
|
OHOS::AppSpawn::SandboxUtils::SandboxMountConfig mountConfig;
|
||||||
std::string section = "permission";
|
std::string section = "permission";
|
||||||
AppSpawningCtx *appProperty = GetTestAppProperty();
|
AppSpawningCtx *appProperty = GetTestAppProperty();
|
||||||
@ -1341,7 +1341,7 @@ HWTEST_F(AppSpawnSandboxTest, App_Spawn_Sandbox_45, TestSize.Level0)
|
|||||||
const char *mountPath = "mount-paths";
|
const char *mountPath = "mount-paths";
|
||||||
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
nlohmann::json j_secondConfig = j_config[mountPath][0];
|
||||||
|
|
||||||
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config);
|
OHOS::AppSpawn::SandboxUtils::StoreJsonConfig(j_config, SANBOX_APP_JSON_CONFIG);
|
||||||
AppSpawningCtx *appProperty = GetTestAppProperty();
|
AppSpawningCtx *appProperty = GetTestAppProperty();
|
||||||
std::string options = OHOS::AppSpawn::SandboxUtils::GetSandboxOptions(appProperty, j_secondConfig);
|
std::string options = OHOS::AppSpawn::SandboxUtils::GetSandboxOptions(appProperty, j_secondConfig);
|
||||||
int ret = strcmp(options.c_str(), "support_overwrite=1,user_id=100");
|
int ret = strcmp(options.c_str(), "support_overwrite=1,user_id=100");
|
||||||
|
@ -88,15 +88,15 @@ HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AppSpawnSandboxCfg_002, TestSize.Leve
|
|||||||
OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
|
OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
|
||||||
|
|
||||||
// for appspawn
|
// for appspawn
|
||||||
int ret = LoadAppSandboxConfig(sandbox, 0);
|
int ret = LoadAppSandboxConfig(sandbox, MODE_FOR_APP_SPAWN);
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
ret = LoadAppSandboxConfig(sandbox, 0); // 重复load
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_APP_SPAWN); // 重复load
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
|
|
||||||
DeleteAppSpawnSandbox(sandbox);
|
DeleteAppSpawnSandbox(sandbox);
|
||||||
DeleteAppSpawnMgr(mgr);
|
DeleteAppSpawnMgr(mgr);
|
||||||
|
|
||||||
ret = LoadAppSandboxConfig(nullptr, 0);
|
ret = LoadAppSandboxConfig(nullptr, MODE_FOR_APP_SPAWN);
|
||||||
EXPECT_NE(ret, 0);
|
EXPECT_NE(ret, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,23 +111,23 @@ HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AppSpawnSandboxCfg_003, TestSize.Leve
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef APPSPAWN_SANDBOX_NEW
|
#ifdef APPSPAWN_SANDBOX_NEW
|
||||||
// for nwebspawn
|
// for nwebspawn
|
||||||
ret = LoadAppSandboxConfig(sandbox, 1);
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN);
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
ret = LoadAppSandboxConfig(sandbox, 1); // 重复load
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
ret = LoadAppSandboxConfig(sandbox, 2); // 重复load
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
#else
|
#else
|
||||||
// for nwebspawn
|
// for nwebspawn
|
||||||
ret = LoadAppSandboxConfig(sandbox, 0);
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN);
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
ret = LoadAppSandboxConfig(sandbox, 0); // 重复load
|
ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
#endif
|
#endif
|
||||||
DeleteAppSpawnSandbox(sandbox);
|
DeleteAppSpawnSandbox(sandbox);
|
||||||
DeleteAppSpawnMgr(mgr);
|
DeleteAppSpawnMgr(mgr);
|
||||||
|
|
||||||
ret = LoadAppSandboxConfig(nullptr, 1);
|
ret = LoadAppSandboxConfig(nullptr, MODE_FOR_NWEB_SPAWN);
|
||||||
EXPECT_NE(ret, 0);
|
EXPECT_NE(ret, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user