diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 87c4d28..37ef092 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -13,6 +13,11 @@ include_directories(${VTE291_INCLUDE_DIRS}) link_directories(${VTE291_LIBRARY_DIRS}) add_definitions(${VTE291_CFLAGS_OTHER}) +pkg_check_modules(POLKIT REQUIRED polkit-agent-1) +include_directories(${POLKIT_INCLUDE_DIRS}) +link_directories(${POLKIT_LIBRARY_DIRS}) +add_definitions(${POLKIT_CFLAGS_OTHER}) + find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) option(WEBKIT_FOUND "No" OFF) @@ -89,7 +94,8 @@ set(SOURCE_FILES set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} - ${VTE291_LIBRARIES} + ${VTE291_LIBRARIES} + ${POLKIT_LIBRARIES} pthread) diff --git a/source/ubl-settings-logging.c b/source/ubl-settings-logging.c index c75f5d5..b971224 100644 --- a/source/ubl-settings-logging.c +++ b/source/ubl-settings-logging.c @@ -127,20 +127,50 @@ int yon_size_get_int_from_letter(char size){ //functions +void yon_polkit_authorized_action(GCallback *func){ + +} + +void yon_logs_custom_save(main_window *widgets){ + GtkTreeIter iter; + char *name; + char *description; + char *paths; + int standard; + int standard_paths; + int size=0; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->list),&iter); + char *final_strings=NULL; + for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->list),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->list),&iter,0,&name,1,&paths,2,&description,3,&standard,4,&standard_paths,-1); + if (standard!=1){ + for (int i=0;iLogDescriptionEntry))),YON_TYPE_STRING); + yon_window_config_add_custom_parameter(paths,"render_name",yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->LogNameEntry))),YON_TYPE_STRING); GtkTreeModel *model = GTK_TREE_MODEL(main_config.logrotate_list); if (!dialog||!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->MainTree)),&model,&iter)){ gtk_list_store_append(main_config.logrotate_list,&iter); @@ -1430,7 +1461,7 @@ void on_journald_save(GtkWidget *self, journald_window *window){ char *TTY=NULL; if (consoleforwardactive == 1){ confor = "yes"; - TTY = (char*)gtk_entry_get_text(GTK_ENTRY(window->RedirectTTYEntry)); + TTY = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->RedirectTTYEntry))); if (yon_char_is_empty(TTY)) consoleforwardactive=0; } @@ -1637,12 +1668,16 @@ void on_log_save(GtkWidget *self, dictionary *dict){ GtkTreeIter iter; if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gtk_list_store_append(widgets->list,&iter); + int stat; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->list),&iter,3,&stat,-1); + gtk_list_store_set(widgets->list,&iter,3,stat==0?1:stat==1?2:2,-1); yon_window_config_custom_window_set(GTK_WINDOW(window->MainWindow),"AddWindow"); } else { yon_window_config_custom_window_set(GTK_WINDOW(window->MainWindow),"EditWindow"); } gtk_list_store_set(widgets->list,&iter,0,name,1,pathse,2,&desc ? desc : "",-1); } + yon_logs_custom_save(widgets); on_close_subwindow(self,NULL); } @@ -1975,6 +2010,57 @@ void on_enable_disable_clicked(GtkButton *self, main_window *widgets){ // standard functions +void on_permissions_changed(){ + if (g_permission_get_allowed(main_config.permissions)){ + PolkitAuthority *auth = polkit_authority_get_sync(NULL,NULL); + PolkitSubject *subject; + pid_t parent_pid; + parent_pid = getppid (); + subject = polkit_unix_process_new_for_owner (parent_pid,0,getuid()); + PolkitDetails *dets = polkit_details_new(); + if (polkit_authority_check_authorization_sync(auth,subject,"com.ublinux.ubl-settings-logging",dets,POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,NULL,NULL)){ + printf("Allowed\n"); + char *command[] = {"/bin/pkexec","/bin/echo","1", NULL}; + gchar *standard_output = NULL; + gchar *standard_error = NULL; + gint exit_status = -1; // Инициализируем переменную для статуса выхода + + GError *error = NULL; + gboolean success = g_spawn_sync( + NULL, + command, + NULL, + G_SPAWN_DEFAULT, + NULL, + NULL, + &standard_output, + &standard_error, + NULL, + &error + ); + + if (success) { + if (standard_output != NULL) { + printf("Output: %s\n", standard_output); + g_free(standard_output); + } + if (standard_error != NULL) { + printf("Error output: %s\n", standard_error); + g_free(standard_error); + } + printf("Exit status: %d\n", exit_status); + } else { + g_printerr("Error running command: %s\n", error->message); + g_error_free(error); + } + } else { + if (g_permission_get_can_acquire(main_config.permissions)){ + g_permission_acquire(main_config.permissions,NULL,NULL); + } + } + } +} + void config_init(){ main_config.always_open_documentation=0; main_config.win_height=0; @@ -1991,6 +2077,22 @@ void config_init(){ main_config.lock_save_local=0; main_config.logrotate_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING); main_config.logrotate_apps_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING); + + PolkitSubject *subject = NULL; + + pid_t parent_pid; + parent_pid = getppid (); + if (parent_pid == 1) + { + g_printerr ("Parent process was reaped by init(1)\n"); + } + subject = polkit_unix_process_new_for_owner (parent_pid,0,getuid()); + main_config.permissions = polkit_permission_new_sync( + "com.ublinux.ubl-settings-logging", + subject, // Пользователь (текущий пользователь) + NULL, // Опции (NULL, если не требуются) + NULL); + g_signal_connect(G_OBJECT(main_config.permissions),"notify::allowed",G_CALLBACK(on_permissions_changed),NULL); } main_window *setup_window(){ @@ -2037,8 +2139,12 @@ main_window *setup_window(){ widgets->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); widgets->ServicesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"ServicesList")); + widgets->UpgradePermissionsMenuItem = yon_gtk_builder_get_widget(builder,"UpgradePermissionsMenuItem"); + widgets->PermissionsLock = yon_gtk_builder_get_widget(builder,"PermissionsLock"); + widgets->MainTree = yon_gtk_builder_get_widget(builder,"MainTree"); + gtk_lock_button_set_permission(GTK_LOCK_BUTTON(widgets->PermissionsLock),main_config.permissions); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); @@ -2137,6 +2243,34 @@ main_window *setup_window(){ yon_char_divide_search_self(main_config.groups[i],":",-1); } + size =0; + config_str custom_watchers = yon_file_open(custom_logs_saving_file_path,&size); + if (custom_watchers){ + GtkTreeIter itar; + for (int i=0;ilist),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->list),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->list),&iter,0,&cur_name,-1); + if (!strcmp(cur_name,cur_watcher[0])){ + found=1; + break; + } + } + if (!found) + gtk_list_store_append(widgets->list,&iter); + gtk_list_store_set(widgets->list,&iter,0,cur_watcher[0],1,cur_watcher[1],2,cur_watcher[2],-1); + yon_char_parsed_free(cur_watcher,cur_size); + } + } + } else { + FILE *fl = fopen(custom_logs_saving_file_path,"w"); + fclose(fl); + } /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); @@ -2157,6 +2291,8 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_load_global),NULL); g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_load_local),NULL); + g_signal_connect(G_OBJECT(widgets->UpgradePermissionsMenuItem),"activate",G_CALLBACK(on_permissions_changed),NULL); + g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_main_window_tree_selection_changed),widgets); g_signal_connect(G_OBJECT(widgets->ServicesTree),"cursor-changed",G_CALLBACK(on_main_window_services_tree_selection_changed),widgets); @@ -2167,10 +2303,11 @@ main_window *setup_window(){ return widgets; } -int main(int argc, char *argv[]){ +int main(int argc, char *argv[], char **envp){ local=setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); + main_config.envp=envp; int option_index=0; int show_help=0; int debug_mode=0; @@ -2239,9 +2376,9 @@ int main(int argc, char *argv[]){ } if (getuid()!=0){ - main_config.lock_load_global=1; - main_config.lock_save_global=1; - main_config.lock_save_local=1; + // main_config.lock_load_global=1; + // main_config.lock_save_global=1; + // main_config.lock_save_local=1; } gtk_init(&argc,&argv); diff --git a/source/ubl-settings-logging.h b/source/ubl-settings-logging.h index b2da285..80010b8 100644 --- a/source/ubl-settings-logging.h +++ b/source/ubl-settings-logging.h @@ -16,6 +16,7 @@ #include #endif #include "ubl-strings.h" +#include #define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-logging" @@ -39,6 +40,7 @@ #define journald_size_command "journalctl --disk-usage | grep -oE \"[0-9]{1,}.[0-9]{1,}[A-Z]\"" #define logrotate_size_command(paths) yon_char_unite("du ",paths," |grep -oE '^[0-9]{1,}'",NULL) #define logrotate_config_path "/etc/logrotate.d/" +#define custom_logs_saving_file_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/logwatcher.csv",NULL) #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-logging" @@ -69,6 +71,7 @@ string version_application; char *local; typedef struct { + char **envp; int always_open_documentation; int win_pos_x; int win_pos_y; @@ -88,8 +91,13 @@ typedef struct { GtkListStore *logrotate_list; GtkListStore *logrotate_apps_list; + config_str groups; int groups_size; + + config_str *saved_logs; + + GPermission *permissions; } config; typedef struct { @@ -136,6 +144,8 @@ typedef struct { GtkWidget *ServicesEnableDisableButton; GtkListStore *list; GtkListStore *ServicesList; + GtkWidget *UpgradePermissionsMenuItem; + GtkWidget *PermissionsLock; // Custom } main_window; diff --git a/ubl-settings-logging-journald.glade b/ubl-settings-logging-journald.glade index c48b5f4..28726b9 100644 --- a/ubl-settings-logging-journald.glade +++ b/ubl-settings-logging-journald.glade @@ -94,6 +94,7 @@ 5 5 vertical + 5 True diff --git a/ubl-settings-logging.glade b/ubl-settings-logging.glade index 0db3ab8..be7dea7 100644 --- a/ubl-settings-logging.glade +++ b/ubl-settings-logging.glade @@ -508,6 +508,12 @@ translated and supported by community. False False False + + + False + Upgrade permissions to root + + True @@ -719,7 +725,6 @@ translated and supported by community. True - False True True Add log @@ -1043,6 +1048,7 @@ translated and supported by community. True False + 5 True