From 0a69c78917153f1831fbb97ccd514841a5e4a3c7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 11 Jul 2025 18:05:53 +0600 Subject: [PATCH 1/6] User information window added --- source/ubl-settings-usergroups.c | 32 ++++++++++++++++++++++++++ source/ubl-settings-usergroups.h | 4 ++++ ubl-settings-usergroups.glade | 39 +++++++++++++++++++++++++++++--- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 9dae803..ba994e6 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1854,6 +1854,32 @@ void on_main_delete(GtkWidget *, main_window *widgets){ } } +void on_user_info(GtkWidget *,main_window *widgets){ + int page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook)); + char *target_user = NULL; + GtkTreeIter iter; + GtkTreeModel *model = NULL; + switch (page){ + case 1: + case 3:{ + return; + } break; + case 0:{ + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){ + return; + } + } break; + case 2:{ + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemTree)),&model,&iter)){ + return; + } + } + } + gtk_tree_model_get(model,&iter,2,&target_user,-1); + char *command = user_info_command(target_user); + yon_terminal_window_launch(GTK_WINDOW(widgets->Window),command,yon_char_get_localised_from_lib(SUCCESS_LABEL),yon_char_get_localised_from_lib(FAIL_LABEL)); +} + void on_config_update(GtkWidget *, main_window *widgets){ if (main_config.load_mode==YON_CONFIG_GLOBAL){ on_config_global_load(NULL,widgets); @@ -2103,6 +2129,7 @@ void on_notebook_page_changed(GtkWidget *, GtkWidget *, int num, main_window *wi gtk_widget_show(widgets->AddButton); gtk_widget_show(widgets->EditButton); gtk_widget_show(widgets->DeleteButton); + gtk_widget_show(widgets->UserInfoButton); gtk_widget_hide(widgets->UserAddToConfigButton); GtkTreeModel *model = GTK_TREE_MODEL(widgets->UsersList); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){ @@ -2117,6 +2144,7 @@ void on_notebook_page_changed(GtkWidget *, GtkWidget *, int num, main_window *wi gtk_widget_show(widgets->EditButton); gtk_widget_show(widgets->DeleteButton); gtk_widget_hide(widgets->UserAddToConfigButton); + gtk_widget_hide(widgets->UserInfoButton); GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model,&iter)){ gtk_widget_set_sensitive(widgets->EditButton,1); @@ -2128,6 +2156,7 @@ void on_notebook_page_changed(GtkWidget *, GtkWidget *, int num, main_window *wi } else if (num==2){ gtk_widget_hide(widgets->AddButton); gtk_widget_hide(widgets->EditButton); + gtk_widget_show(widgets->UserInfoButton); gtk_widget_show(widgets->UserAddToConfigButton); GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore1); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemTree)),&model,&iter)){ @@ -2142,6 +2171,7 @@ void on_notebook_page_changed(GtkWidget *, GtkWidget *, int num, main_window *wi gtk_widget_hide(widgets->AddButton); gtk_widget_hide(widgets->EditButton); gtk_widget_show(widgets->UserAddToConfigButton); + gtk_widget_hide(widgets->UserInfoButton); GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemGroupsTree)),&model,&iter)){ gtk_widget_set_sensitive(widgets->UserAddToConfigButton,1); @@ -2213,6 +2243,7 @@ main_window *yon_main_window_complete(main_window *widgets){ widgets->EditButton=yon_gtk_builder_get_widget(builder,"EditButton"); widgets->DeleteButton=yon_gtk_builder_get_widget(builder,"DeleteButton"); widgets->UpdateButton=yon_gtk_builder_get_widget(builder,"UpdateButton"); + widgets->UserInfoButton=yon_gtk_builder_get_widget(builder,"UserInfoButton"); widgets->UsersTree=yon_gtk_builder_get_widget(builder,"UsersTree"); widgets->GroupsTree=yon_gtk_builder_get_widget(builder,"GroupsTree"); widgets->MainNotebook=yon_gtk_builder_get_widget(builder,"MainNotebook"); @@ -2247,6 +2278,7 @@ main_window *yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->button2),"clicked",G_CALLBACK(on_ubl_settings_usergroups_additional_settings_open),widgets); g_signal_connect(G_OBJECT(widgets->UserAddToConfigButton),"clicked",G_CALLBACK(on_user_sync_with_config),widgets); g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_config_update),widgets); + g_signal_connect(G_OBJECT(widgets->UserInfoButton),"clicked",G_CALLBACK(on_user_info),widgets); g_signal_connect(G_OBJECT(widgets->SavingSettingsButton),"clicked",G_CALLBACK(on_saving_settings_open),widgets); g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_save),widgets); g_signal_connect(G_OBJECT(widgets->UsersTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index fedaf42..16ba897 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -98,6 +98,8 @@ #define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) +#define user_info_command(target) yon_char_append("echo ",target) + #define config_get_command(source) yon_char_unite("ubconfig --source ",source," get users DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERADD_SYNC USERADD_SYNC[*] USERSHADOW[*] USERSHADOW_SYNC[*] GROUPADD[*] GROUPADD_SYNC[*] GROUPADD_SYNC",NULL),yon_char_unite("ubconfig --source ",source," get [system] SYSTEMBOOT_STATEMODE",NULL),yon_char_unite("ubconfig --source ",source," get [save] SAVE_ROOTCOPY_CHANGES",NULL) #define config_get_default_command "ubconfig --source default get users DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM" @@ -210,6 +212,7 @@ typedef struct { GtkWidget *EditButton; GtkWidget *DeleteButton; GtkWidget *UpdateButton; + GtkWidget *UserInfoButton; GtkWidget *UsersTree; GtkWidget *GroupsTree; GtkWidget *MainNotebook; @@ -595,4 +598,5 @@ gboolean on_encrypt_update(dictionary *dict); void *yon_passwords_encrypt(dictionary *dict); gboolean on_filter(GtkTreeModel* model, GtkTreeIter *iter, main_window *widgets); void on_filter_changed(GtkWidget *self, main_window *widgets); +void on_user_info(GtkWidget *,main_window *widgets); #endif \ No newline at end of file diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index 4e49f63..0d88248 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -121,6 +121,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False com.ublinux.libublsettingsui-gtk3.move-in-symbolic + + True + False + com.ublinux.libublsettingsui-gtk3.important-symbolic + @@ -194,6 +199,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 2 vertical 5 + + + True + True + True + Update users and groups + image13 + + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + True @@ -308,12 +341,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + True True True - Update users and groups - image13 + Additional settings + image6 -- 2.35.1 From 4fe17fe75ce328bdfaea10f292ca1cb6158d7e01 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 12:31:54 +0600 Subject: [PATCH 2/6] Changed button label --- ubl-settings-usergroups-password.glade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index 7e38555..50bce69 100644 --- a/ubl-settings-usergroups-password.glade +++ b/ubl-settings-usergroups-password.glade @@ -261,7 +261,7 @@ - Accept + Apply True True True -- 2.35.1 From 4483dc791792601233f6e2bb34c780ca3f72695f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 14:36:51 +0600 Subject: [PATCH 3/6] Config loading changes for exit comparing --- source/ubl-settings-usergroups.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index ba994e6..3f85da3 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -14,8 +14,8 @@ int yon_load_proceed(YON_CONFIG_TYPE type){ yon_config_load_config(type,config_get_command("global"),NULL); } if (type==YON_CONFIG_LOCAL){ - yon_config_load_config(type,config_get_command("system"),NULL); yon_config_load_config(YON_CONFIG_GLOBAL,config_get_global_only_parameters,NULL); + yon_config_load_config(type,config_get_command("system"),NULL); yon_config_set_status(DEFAULTPASSWD_parameter,-2); yon_config_set_status(DEFAULTROOTPASSWD_parameter,-2); int size; -- 2.35.1 From 12569020b23a9c0599e72540e68a4dc5825fea75 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 16:57:19 +0600 Subject: [PATCH 4/6] User info window --- source/ubl-settings-usergroups.c | 63 +++++++++++++++++++++++++++++++- source/ubl-settings-usergroups.h | 18 +++++++++ source/ubl-strings.h | 3 ++ ubl-settings-usergroups.glade | 4 +- 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 3f85da3..844901d 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1854,6 +1854,62 @@ void on_main_delete(GtkWidget *, main_window *widgets){ } } +void on_user_info_print(GtkWidget *,yon_user_info_window *window){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SAVE); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->Window),SAVE_USER_INFO_LABEL,icon_path,"filechooser_window"); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pdf"); + gtk_file_filter_set_name(filter,"PDF"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_APPLY){ + char *path = dialog->last_success_selection; + char *command = user_info_pdf_command(window->target_user,path); + yon_launch(command); + free(command); + free(dialog); + } +} + +void on_user_info_save(GtkWidget *,yon_user_info_window *window){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SAVE); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->Window),SAVE_USER_INFO_LABEL,icon_path,"filechooser_window"); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.txt"); + gtk_file_filter_set_name(filter,"TXT"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_APPLY){ + char *path = dialog->last_success_selection; + char *command = user_info_txt_command(window->target_user,path); + yon_launch(command); + free(command); + free(dialog); + } +} + +yon_user_info_window *yon_user_info_window_new(){ + yon_user_info_window *window = new(yon_user_info_window); + GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->Terminal = yon_gtk_builder_get_widget(builder,"DebuggerTerminal"); + window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage"); + window->PrintButton = gtk_button_new_from_icon_name(icon_path_print,GTK_ICON_SIZE_BUTTON); + window->SaveButton = gtk_button_new_from_icon_name(icon_path_save,GTK_ICON_SIZE_BUTTON); + window->target_user = NULL; + + g_signal_connect(G_OBJECT(window->PrintButton),"clicked",G_CALLBACK(on_user_info_print),window); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_user_info_save),window); + + gtk_image_set_from_icon_name(GTK_IMAGE(window->HeaderImage),icon_path,GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_markup(window->PrintButton,PRINT_TOOLTIP_LABEL); + gtk_widget_set_tooltip_markup(window->SaveButton,SAVE_LABEL); + GtkWidget *titlebar = gtk_window_get_titlebar(GTK_WINDOW(window->Window)); + gtk_header_bar_pack_end(GTK_HEADER_BAR(titlebar),window->SaveButton); + gtk_header_bar_pack_end(GTK_HEADER_BAR(titlebar),window->PrintButton); + gtk_widget_show(window->PrintButton); + gtk_widget_show(window->SaveButton); + return window; +} + void on_user_info(GtkWidget *,main_window *widgets){ int page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook)); char *target_user = NULL; @@ -1877,7 +1933,12 @@ void on_user_info(GtkWidget *,main_window *widgets){ } gtk_tree_model_get(model,&iter,2,&target_user,-1); char *command = user_info_command(target_user); - yon_terminal_window_launch(GTK_WINDOW(widgets->Window),command,yon_char_get_localised_from_lib(SUCCESS_LABEL),yon_char_get_localised_from_lib(FAIL_LABEL)); + // yon_terminal_window_launch(GTK_WINDOW(widgets->Window),command,yon_char_get_localised_from_lib(SUCCESS_LABEL),yon_char_get_localised_from_lib(FAIL_LABEL)); + yon_user_info_window *window = yon_user_info_window_new(); + window->target_user = target_user; + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),USER_INFO_LABEL,icon_path,"user_info_window"); + yon_terminal_integrated_start(window->Terminal,command); + gtk_widget_show(window->Window); } void on_config_update(GtkWidget *, main_window *widgets){ diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 16ba897..ca93c78 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -39,6 +39,9 @@ #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define icon_path "com.ublinux.ubl-settings-usergroups" #define sync_parameters_path "resource:///com/ublinux/csv/sync_parameters.csv" + +#define icon_path_print "com.ublinux.libublsettingsui-gtk3.print-symbolic" +#define icon_path_save "com.ublinux.libublsettingsui-gtk3.save-symbolic" #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-usergroups" @@ -99,6 +102,8 @@ #define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) #define user_info_command(target) yon_char_append("echo ",target) +#define user_info_pdf_command(target,path) yon_char_unite("echo ",target,path,NULL) +#define user_info_txt_command(target,path) yon_char_unite("echo ",target,path,NULL) #define config_get_command(source) yon_char_unite("ubconfig --source ",source," get users DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERADD_SYNC USERADD_SYNC[*] USERSHADOW[*] USERSHADOW_SYNC[*] GROUPADD[*] GROUPADD_SYNC[*] GROUPADD_SYNC",NULL),yon_char_unite("ubconfig --source ",source," get [system] SYSTEMBOOT_STATEMODE",NULL),yon_char_unite("ubconfig --source ",source," get [save] SAVE_ROOTCOPY_CHANGES",NULL) #define config_get_default_command "ubconfig --source default get users DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM" @@ -360,6 +365,16 @@ typedef struct{ GtkWidget *NoEncriptionCheck; } ubl_settings_usergroups_password_window; +typedef struct { + GtkWidget *Window; + GtkWidget *Terminal; + GtkWidget *HeaderImage; + GtkWidget *PrintButton; + GtkWidget *SaveButton; + + char *target_user; +} yon_user_info_window; + typedef struct{ GtkListStore *liststore1; GtkListStore *liststore2; @@ -599,4 +614,7 @@ void *yon_passwords_encrypt(dictionary *dict); gboolean on_filter(GtkTreeModel* model, GtkTreeIter *iter, main_window *widgets); void on_filter_changed(GtkWidget *self, main_window *widgets); void on_user_info(GtkWidget *,main_window *widgets); +yon_user_info_window *yon_user_info_window_new(); +void on_user_info_save(GtkWidget *,yon_user_info_window *window); +void on_user_info_print(GtkWidget *,yon_user_info_window *window); #endif \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 6a4c463..58b7ca2 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -28,6 +28,9 @@ #define EXTRA_OPTIONS_USER_LABEL _("Extra options:") #define CANCEL_LABEL _("Cancel") #define OK_LABEL _("Ok") +#define PRINT_TOOLTIP_LABEL _("Print") +#define USER_INFO_LABEL _("User information") +#define SAVE_USER_INFO_LABEL _("Save user information") #define BLOCK_LABEL _("Block") #define MAIN_GROUP_LABEL _("Main\ngroup") diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index 0d88248..3af9b16 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -1,5 +1,5 @@ -