@ -22,6 +22,93 @@ void update_time_table(vector* vec_temp) {
}
}
}
# define yon_char_is_empty(string) !(string&&strcmp(string,""))
int arg_size ;
config_str arg_target ;
gboolean __yon_app_check_helper ( const char * app , config_str argv , int argc ) {
char * helper_path = yon_char_unite ( " /usr/bin/ " , app , " -root " , NULL ) ;
if ( ! access ( helper_path , F_OK ) ) {
for ( int i = 1 ; i < arg_size ; i + + ) {
char * temp = yon_char_unite ( helper_path , " " , arg_target [ i ] , NULL ) ;
if ( strcmp ( helper_path , " " ) & & strcmp ( helper_path , LocaleName ) )
free ( helper_path ) ;
helper_path = temp ;
}
if ( getuid ( ) ! = 0 ) {
int size = 0 ;
config_str parsed = NULL ;
g_shell_parse_argv ( helper_path , & size , & parsed , NULL ) ;
execve ( parsed [ 0 ] , parsed , __environ ) ;
return 1 ;
}
}
return 0 ;
}
void on_root_access ( GtkWidget * , GtkWidget * window ) {
if ( getuid ( ) ) {
char * argline = yon_char_new ( arg_target [ 0 ] ) ;
int last_pos = yon_char_find_last ( argline , ' / ' ) ;
if ( last_pos > - 1 ) {
free ( yon_char_divide ( argline , last_pos ) ) ;
}
if ( ! __yon_app_check_helper ( argline , arg_target , arg_size ) ) {
for ( int i = 1 ; i < arg_size ; i + + ) {
char * temp = yon_char_unite ( argline , " " , arg_target [ i ] , NULL ) ;
if ( strcmp ( argline , " " ) & & strcmp ( argline , LocaleName ) )
free ( argline ) ;
argline = temp ;
}
if ( getuid ( ) ! = 0 ) {
const char * session = getenv ( " XDG_SESSION_TYPE " ) ;
const char * desktop = getenv ( " XDG_CURRENT_DESKTOP " ) ;
const char * backend = getenv ( " GDK_BACKEND " ) ;
int size = 0 ;
config_str parsed = NULL ;
char * command = yon_char_unite ( " /usr/bin/bash -c \" pkexec " , argline , " " ,
! yon_char_is_empty ( session ) & & ! strcmp ( session , " wayland " ) & & ! yon_char_is_empty ( desktop ) & & strcmp ( desktop , " KDE " ) & & yon_char_is_empty ( backend ) ?
" --setenv= \\ \" GDK_BACKEND=x11 \\ \" " : " --setenv= \\ \" GDK_BACKEND=${GDK_BACKEND} \\ \" " ,
" --setenv= \\ \" XAUTHORITY=${XAUTHORITY} \\ \" \
- - setenv = \ \ \ " DISPLAY=${DISPLAY} \\ \" \
- - setenv = \ \ \ " WAYLAND_DISPLAY=${XDG_RUNTIME_DIR}/${WAYLAND_DISPLAY} \\ \" \
- - setenv = \ \ \ " XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} \\ \" \
- - setenv = \ \ \ " XDG_SESSION_TYPE=${XDG_SESSION_TYPE} \\ \" \
- - setenv = \ \ \ " XDG_CURRENT_DESKTOP=${XDG_CURRENT_DESKTOP} \\ \" ; exit \" " , NULL ) ;
g_shell_parse_argv ( command , & size , & parsed , NULL ) ;
execve ( parsed [ 0 ] , parsed , __environ ) ;
}
}
}
}
void yon_root_button_init ( GtkWidget * root_item , GtkWindow * window ) {
g_signal_connect ( G_OBJECT ( root_item ) , " activate " , G_CALLBACK ( on_root_access ) , window ) ;
}
GtkWidget * yon_root_button_new ( config_str args , int args_size ) {
textdomain ( " libublsettingsui-gtk3 " ) ;
arg_size = args_size ;
arg_target = args ;
GtkWidget * root_item = gtk_menu_item_new ( ) ;
gtk_style_context_add_class ( gtk_widget_get_style_context ( root_item ) , " menuitemtop " ) ;
GtkWidget * box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
GtkWidget * root_label = gtk_label_new ( _ ( " Grant root access " ) ) ;
GtkWidget * root_check = gtk_check_button_new ( ) ;
g_object_set_data ( G_OBJECT ( root_item ) , " Label " , root_label ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , root_check , 0 , 0 , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , root_label , 1 , 1 , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( root_item ) , box ) ;
gtk_widget_show_all ( root_item ) ;
if ( getuid ( ) = = 0 ) {
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( root_check ) , 1 ) ;
gtk_widget_set_sensitive ( root_item , 0 ) ;
}
textdomain ( LocaleName ) ;
return root_item ;
}
void entry_user_disk ( GtkWidget * self , int * flag_update ) {
@ -570,6 +657,9 @@ int main(int argc, char *argv[]){
gtk_init ( & argc , & argv ) ;
main_window * widgets = setup_window ( & cfg_main_gui , & cfg_custom_gui ) ;
GtkWidget * root_button = yon_root_button_new ( argv , argc ) ;
yon_root_button_init ( root_button , GTK_WINDOW ( widgets - > Window ) ) ;
gtk_menu_shell_prepend ( GTK_MENU_SHELL ( gtk_widget_get_parent ( widgets - > DocumentationMenuItem ) ) , root_button ) ;
filters_set_name ( " prjquota " ) ;
filters_init_flag ( ) ;
control_event ( widgets , & cfg_custom_gui ) ;