@ -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 ) ;