|
|
|
|
@ -611,6 +611,8 @@ static void usage(int status)
|
|
|
|
|
" from the booster. The score is reset to 0 normally.\n"
|
|
|
|
|
" -T, --test-mode Invoker test mode. Also control file in root home should be in place.\n"
|
|
|
|
|
" -F, --desktop-file Desktop file of the application to notify lipstick of launching app.\n"
|
|
|
|
|
" -I, --id Sandboxing id to check if sandboxing should be forced.\n"
|
|
|
|
|
" If this is not defined, it's guessed from binary name.\n"
|
|
|
|
|
" -h, --help Print this help.\n"
|
|
|
|
|
" -v, --verbose Make invoker more verbose. Can be given several times.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
@ -772,6 +774,7 @@ typedef struct InvokeArgs {
|
|
|
|
|
unsigned int respawn_delay;
|
|
|
|
|
bool test_mode;
|
|
|
|
|
const char *desktop_file;
|
|
|
|
|
char *sandboxing_id;
|
|
|
|
|
unsigned int exit_delay;
|
|
|
|
|
} InvokeArgs;
|
|
|
|
|
|
|
|
|
|
@ -786,6 +789,7 @@ typedef struct InvokeArgs {
|
|
|
|
|
.respawn_delay = RESPAWN_DELAY,\
|
|
|
|
|
.test_mode = false,\
|
|
|
|
|
.desktop_file = NULL,\
|
|
|
|
|
.sandboxing_id = NULL,\
|
|
|
|
|
.exit_delay = EXIT_DELAY,\
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -963,6 +967,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
{"splash", required_argument, NULL, 'S'}, // Legacy, ignored
|
|
|
|
|
{"splash-landscape", required_argument, NULL, 'L'}, // Legacy, ignored
|
|
|
|
|
{"desktop-file", required_argument, NULL, 'F'},
|
|
|
|
|
{"id", required_argument, NULL, 'I'},
|
|
|
|
|
{"verbose", no_argument, NULL, 'v'},
|
|
|
|
|
{0, 0, 0, 0}
|
|
|
|
|
};
|
|
|
|
|
@ -971,7 +976,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
// The use of + for POSIXLY_CORRECT behavior is a GNU extension, but avoids polluting
|
|
|
|
|
// the environment
|
|
|
|
|
int opt;
|
|
|
|
|
while ((opt = getopt_long(argc, argv, "+hvcwnGDsoTd:t:a:Ar:S:L:F:", longopts, NULL)) != -1)
|
|
|
|
|
while ((opt = getopt_long(argc, argv, "+hvcwnGDsoTd:t:a:Ar:S:L:F:I:", longopts, NULL)) != -1)
|
|
|
|
|
{
|
|
|
|
|
switch(opt)
|
|
|
|
|
{
|
|
|
|
|
@ -1043,6 +1048,10 @@ int main(int argc, char *argv[])
|
|
|
|
|
args.desktop_file = optarg;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'I':
|
|
|
|
|
args.sandboxing_id = strdup(optarg);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case '?':
|
|
|
|
|
usage(1);
|
|
|
|
|
}
|
|
|
|
|
@ -1115,25 +1124,36 @@ int main(int argc, char *argv[])
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If sailjail is already used or app specific booster is used, skip checking for sandboxing
|
|
|
|
|
if (!strcmp(args.prog_name, SAILJAIL_PATH) || strcmp(args.app_name, UNDEFINED_APPLICATION)) {
|
|
|
|
|
args.sandboxing_id = NULL;
|
|
|
|
|
} else if (!args.sandboxing_id) {
|
|
|
|
|
// When id is not defined, assume it can be derived from binary path
|
|
|
|
|
char *path = strdup(args.prog_name);
|
|
|
|
|
args.sandboxing_id = strdup(basename(path));
|
|
|
|
|
free(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Application specific boosters are running in sandbox and can
|
|
|
|
|
// thus launch only sandboxed processes, otherwise
|
|
|
|
|
// If arguments don't define sailjail and sailjaild says the app must be sandboxed,
|
|
|
|
|
// we force sandboxing here
|
|
|
|
|
if (!strcmp(args.app_name, UNDEFINED_APPLICATION) &&
|
|
|
|
|
strcmp(args.prog_name, SAILJAIL_PATH) &&
|
|
|
|
|
ask_for_sandboxing(args.prog_name)) {
|
|
|
|
|
if (args.sandboxing_id && ask_for_sandboxing(args.sandboxing_id)) {
|
|
|
|
|
warning("enforcing sandboxing for '%s'", args.prog_name);
|
|
|
|
|
// We must use generic booster here as nothing else would work
|
|
|
|
|
// to run sailjail which is not compiled for launching via booster
|
|
|
|
|
args.app_type = BOOSTER_GENERIC;
|
|
|
|
|
// Prepend sailjail
|
|
|
|
|
char **old_argv = args.prog_argv;
|
|
|
|
|
args.prog_argc += 2;
|
|
|
|
|
args.prog_argc += 4;
|
|
|
|
|
args.prog_argv = (char **)calloc(args.prog_argc + 1, sizeof *args.prog_argv);
|
|
|
|
|
args.prog_argv[0] = SAILJAIL_PATH;
|
|
|
|
|
args.prog_argv[1] = "--";
|
|
|
|
|
for (int i = 2; i < args.prog_argc + 1; ++i)
|
|
|
|
|
args.prog_argv[i] = old_argv[i-2];
|
|
|
|
|
args.prog_argv[1] = "-p";
|
|
|
|
|
args.prog_argv[2] = args.sandboxing_id,
|
|
|
|
|
args.sandboxing_id = NULL;
|
|
|
|
|
args.prog_argv[3] = "--";
|
|
|
|
|
for (int i = 4; i < args.prog_argc + 1; ++i)
|
|
|
|
|
args.prog_argv[i] = old_argv[i-4];
|
|
|
|
|
// Don't free old_argv because it's probably not dynamically allocated
|
|
|
|
|
free(args.prog_name);
|
|
|
|
|
args.prog_name = strdup(SAILJAIL_PATH);
|
|
|
|
|
|