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