From fe4bd42c8100a25196c866a20f91a74f1c5a4d8d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 16 Jan 2024 11:52:30 +0600 Subject: [PATCH 01/30] Parameters and their sections are moved to macros --- source/ubl-settings-usergroups.c | 63 ++++++++++++++++---------------- source/ubl-settings-usergroups.h | 26 +++++++++++++ 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 8e580d4..12e6b74 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -5,8 +5,9 @@ config main_config; //functions int yon_load_proceed(YON_CONFIG_TYPE type){ - yon_config_load_register(YON_CONFIG_DEFAULT,"users","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); - if (yon_config_load_register_no_cleaning(type,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL)){ + yon_config_load_register(YON_CONFIG_DEFAULT,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,NULL); + if (yon_config_load_register_no_cleaning(type,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL)){ + return 1; } return 0; @@ -18,7 +19,7 @@ void yon_interface_update(main_window *widgets){ gtk_list_store_clear(widgets->GroupsList); int size; GtkTreeIter iter; - config_str users = yon_config_get_all_by_key("USERADD",&size); + config_str users = yon_config_get_all_by_key(USERADD_SIMPLE,&size); if (users){ for (int i=0;iUsersList,&iter); @@ -49,7 +50,7 @@ void yon_interface_update(main_window *widgets){ } free(users); } - config_str groups = yon_config_get_all_by_key("GROUPADD",&size); + config_str groups = yon_config_get_all_by_key(GROUPADD_SIMPLE,&size); if (groups){ for (int i=0;iGroupsList,&iter); @@ -98,15 +99,15 @@ void on_config_global_load(GtkWidget *self, main_window *widgets){ } void on_config_save(){ - yon_save_proceed(NULL,YON_CONFIG_BOTH,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); + yon_save_proceed(NULL,YON_CONFIG_BOTH,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); } void on_config_global_save(){ - yon_save_proceed("global",YON_CONFIG_GLOBAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); + yon_save_proceed("global",YON_CONFIG_GLOBAL,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); } void on_config_local_save(){ - yon_save_proceed("system",YON_CONFIG_LOCAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); + yon_save_proceed("system",YON_CONFIG_LOCAL,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); } void on_password_combo_changed(GtkComboBox *self, GtkWidget *target){ @@ -244,31 +245,31 @@ void on_expiration_clicked(GtkWidget *self, ubl_settings_usergroups_user_window void on_additional_settings_save(GtkWidget *self, ubl_settings_usergroups_additional_settings_window *window){ const char *default_user = (char*)gtk_entry_get_text(GTK_ENTRY(window->DefaultUserNameEntry)); if (!yon_char_is_empty(default_user)){ - yon_config_register("DEFAULTUSER","users",yon_char_new((char*)default_user)); + yon_config_register(DEFAULTUSER_PARAM,DEFAULTUSER_SEC,yon_char_new((char*)default_user)); } else { - yon_config_remove_by_key("DEFAULTUSER"); + yon_config_remove_by_key(DEFAULTUSER_PARAM); } char *default_password = gtk_combo_box_get_active(GTK_COMBO_BOX(window->DefaultPasswordCombo))>1? (char*)gtk_entry_get_text(GTK_ENTRY(window->DefaultPasswordEntry)):NULL; if (!yon_char_is_empty(default_password)){ - yon_config_register("DEFAULTPASSWD","users",default_password); + yon_config_register(DEFAULTPASSWD_PARAM,DEFAULTPASSWD_SEC,default_password); } else { - yon_config_remove_by_key("DEFAULTPASSWD"); + yon_config_remove_by_key(DEFAULTPASSWD_PARAM); } char *root_password = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RootPasswordCombo)) > 1 ? (char*)gtk_entry_get_text(GTK_ENTRY(window->RootPasswordEntry)) : NULL; if (!yon_char_is_empty(root_password)){ - yon_config_register("DEFAULTROOTPASSWD","users",root_password); + yon_config_register(DEFAULTROOTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,root_password); } else { - yon_config_remove_by_key("DEFAULTROOTPASSWD"); + yon_config_remove_by_key(DEFAULTROOTPASSWD_PARAM); } int user_k_admin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DefaultUserAdministratorCheck)); if (user_k_admin){ - yon_config_register("ADDADM","users","yes"); + yon_config_register(ADDADM_PARAM,ADDADM_SEC,"yes"); } else { - yon_config_register("ADDADM","users","no"); + yon_config_register(ADDADM_PARAM,ADDADM_SEC,"no"); } char *hash = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PasswordHashCombo)); if (!yon_char_is_empty(hash)){ - yon_config_register("HASHPASSWD","users",hash); + yon_config_register(HASHPASSWD_PARAM,HASHPASSWD_SEC,hash); } } @@ -319,26 +320,26 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ } yon_char_parsed_free(hash_algos,hash_size); gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordHashCombo),0); - char *default_user = yon_config_get_by_key("DEFAULTUSER"); + char *default_user = yon_config_get_by_key(DEFAULTUSER_PARAM); if (!yon_char_is_empty(default_user)) gtk_entry_set_text(GTK_ENTRY(window->DefaultUserNameEntry),default_user); - char *default_password = yon_config_get_by_key("DEFAULTPASSWD"); + char *default_password = yon_config_get_by_key(DEFAULTPASSWD_PARAM); if (!yon_char_is_empty(default_password)){ gtk_entry_set_text(GTK_ENTRY(window->DefaultPasswordEntry),default_password); - if(!yon_config_check_ignore("DEFAULTPASSWD")) + if(!yon_config_check_ignore(DEFAULTPASSWD_PARAM)) gtk_combo_box_set_active(GTK_COMBO_BOX(window->DefaultPasswordCombo),3); } - char *root_password = yon_config_get_by_key("DEFAULTROOTPASSWD"); + char *root_password = yon_config_get_by_key(DEFAULTROOTPASSWD_PARAM); if (!yon_char_is_empty(root_password)){ gtk_entry_set_text(GTK_ENTRY(window->RootPasswordEntry),root_password); - if(!yon_config_check_ignore("DEFAULTROOTPASSWD")) + if(!yon_config_check_ignore(DEFAULTROOTPASSWD_PARAM)) gtk_combo_box_set_active(GTK_COMBO_BOX(window->RootPasswordCombo),3); } - char *is_k_admin = yon_config_get_by_key("ADDADM"); + char *is_k_admin = yon_config_get_by_key(ADDADM_PARAM); if (!yon_char_is_empty(is_k_admin)) if (!strcmp(is_k_admin,"yes")) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DefaultUserAdministratorCheck),1); - char *hash = yon_config_get_by_key("HASHPASSWD"); + char *hash = yon_config_get_by_key(HASHPASSWD_PARAM); if (!yon_char_is_empty(hash)){ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->PasswordHashCombo),hash); } @@ -397,7 +398,7 @@ void on_GID_update(GtkWidget *self, ubl_settings_usergroups_group_creation_windo if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){ int config_size=0; int final_size=0; - config_str config_groups = yon_config_get_all_by_key("GROUPADD",&config_size); + config_str config_groups = yon_config_get_all_by_key(GROUPADD_SIMPLE,&config_size); yon_char_parsed_prepend_strings(config_groups,config_size,":"); config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_groups,config_size,&final_size); long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))?0:main_config.MINGID; @@ -574,7 +575,7 @@ void on_standard_groups_accept(GtkWidget *self, ubl_settings_usergroups_group_wi standard_groups=extend_groups; } } - yon_config_register("USERGROUPS","users",standard_groups); + yon_config_register(USERGROUPS_PARAM,USERGROUPS_SEC,standard_groups); on_subwindow_close(self); } @@ -593,7 +594,7 @@ void on_standard_groups_open(GtkWidget *self, main_window *widgets){ } g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_standard_groups_accept),window); gtk_window_set_transient_for(GTK_WINDOW(window->GroupsWindow),GTK_WINDOW(widgets->Window)); - char *groups = yon_config_get_by_key("USERGROUPS"); + char *groups = yon_config_get_by_key(USERGROUPS_PARAM); if (!yon_char_is_empty(groups)){ GtkTreeIter iter; int size; @@ -843,7 +844,7 @@ void on_UID_update(GtkWidget *self, ubl_settings_usergroups_user_window *window) if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){ int config_size=0; int final_size=0; - config_str config_users = yon_config_get_all_by_key("USERADD",&config_size); + config_str config_users = yon_config_get_all_by_key(USERADD_SIMPLE,&config_size); yon_char_parsed_prepend_strings(config_users,config_size,":"); config_str final = yon_char_parsed_merge(main_config.users,main_config.users_size,config_users,config_size,&final_size); long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck))?0:main_config.MINGID; @@ -1073,14 +1074,14 @@ void on_user_save(GtkWidget *self, dictionary *dict){ ":",yon_char_return_if_exist(password,"x"), ":",yon_char_return_if_exist(extra_options,""), NULL); - yon_config_register(USERADD(login),"users",final_user); - yon_config_register(USERSHADOW(login),"users",shadow_string); + yon_config_register(USERADD(login),USERADD_SEC,final_user); + yon_config_register(USERSHADOW(login),USERSHADOW_SEC,shadow_string); if (!yon_char_is_empty(useradd_sync_string)) - yon_config_register(USERADD_SYNC(login),"users",useradd_sync_string); + yon_config_register(USERADD_SYNC(login),USERADD_SYNC_SEC,useradd_sync_string); if (!yon_char_is_empty(usershadow_sync_string)) - yon_config_register(USERSHADOW_SYNC(login),"users",usershadow_sync_string); + yon_config_register(USERSHADOW_SYNC(login),USERSHADOW_SYNC_SEC,usershadow_sync_string); GtkTreeIter iter; 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)) diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 30b7fea..c62903e 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -53,6 +53,32 @@ #define USERADD_SYNC(user) yon_char_unite("USERADD_SYNC[",user,"]",NULL) #define USERSHADOW_SYNC(user) yon_char_unite("USERSHADOW_SYNC[",user,"]",NULL) +#define DEFAULTPASSWD_PARAM "DEFAULTPASSWD" +#define DEFAULTPASSWD_SEC "users" +#define DEFAULTROOTPASSWD_PARAM "DEFAULTROOTPASSWD" +#define DEFAULTROOTPASSWD_SEC "users" +#define USERGROUPS_PARAM "USERGROUPS" +#define USERGROUPS_SEC "users" +#define DEFAULTUSER_PARAM "DEFAULTUSER" +#define DEFAULTUSER_SEC "users" +#define HASHPASSWD_PARAM "HASHPASSWD" +#define HASHPASSWD_SEC "users" +#define ADDADM_PARAM "ADDADM" +#define ADDADM_SEC "users" +#define USERADD_PARAM(key) yon_char_unite("USERADD[",key,"]",NULL) +#define USERADD_SIMPLE "USERADD" +#define USERADD_SEC "users" +#define USERSHADOW_PARAM(key) yon_char_unite("USERSHADOW[",key,"]",NULL) +#define USERSHADOW_SIMPLE "USERSHADOW" +#define USERSHADOW_SEC "users" +#define GROUPADD_PARAM(key) yon_char_unite("GROUPADD[",key,"]",NULL) +#define GROUPADD_SIMPLE "GROUPADD" +#define GROUPADD_SEC "users" +#define USERADD_SYNC_PARAM "USERADD_SYNC" +#define USERADD_SYNC_SEC "users" +#define USERSHADOW_SYNC_PARAM "USERSHAODW_SYNC" +#define USERSHADOW_SYNC_SEC "users" + #define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) typedef char* string; -- 2.35.1 From c304280de9b14b8748f6d175694cc4726aa22a31 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 16 Jan 2024 15:30:42 +0600 Subject: [PATCH 02/30] Revertion --- source/ubl-settings-usergroups.c | 63 ++++++++++++++++---------------- source/ubl-settings-usergroups.h | 26 ------------- 2 files changed, 31 insertions(+), 58 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 12e6b74..8e580d4 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -5,9 +5,8 @@ config main_config; //functions int yon_load_proceed(YON_CONFIG_TYPE type){ - yon_config_load_register(YON_CONFIG_DEFAULT,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,NULL); - if (yon_config_load_register_no_cleaning(type,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL)){ - + yon_config_load_register(YON_CONFIG_DEFAULT,"users","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); + if (yon_config_load_register_no_cleaning(type,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL)){ return 1; } return 0; @@ -19,7 +18,7 @@ void yon_interface_update(main_window *widgets){ gtk_list_store_clear(widgets->GroupsList); int size; GtkTreeIter iter; - config_str users = yon_config_get_all_by_key(USERADD_SIMPLE,&size); + config_str users = yon_config_get_all_by_key("USERADD",&size); if (users){ for (int i=0;iUsersList,&iter); @@ -50,7 +49,7 @@ void yon_interface_update(main_window *widgets){ } free(users); } - config_str groups = yon_config_get_all_by_key(GROUPADD_SIMPLE,&size); + config_str groups = yon_config_get_all_by_key("GROUPADD",&size); if (groups){ for (int i=0;iGroupsList,&iter); @@ -99,15 +98,15 @@ void on_config_global_load(GtkWidget *self, main_window *widgets){ } void on_config_save(){ - yon_save_proceed(NULL,YON_CONFIG_BOTH,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); + yon_save_proceed(NULL,YON_CONFIG_BOTH,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); } void on_config_global_save(){ - yon_save_proceed("global",YON_CONFIG_GLOBAL,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); + yon_save_proceed("global",YON_CONFIG_GLOBAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); } void on_config_local_save(){ - yon_save_proceed("system",YON_CONFIG_LOCAL,DEFAULTPASSWD_SEC,DEFAULTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,DEFAULTROOTPASSWD_PARAM,USERGROUPS_SEC,USERGROUPS_PARAM,DEFAULTUSER_SEC,DEFAULTUSER_PARAM,HASHPASSWD_SEC,HASHPASSWD_PARAM,ADDADM_SEC,ADDADM_PARAM,USERADD_SEC,USERADD_PARAM("*"),USERSHADOW_SEC,USERSHADOW_PARAM("*"),GROUPADD_SEC,GROUPADD_PARAM("*"),NULL); + yon_save_proceed("system",YON_CONFIG_LOCAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); } void on_password_combo_changed(GtkComboBox *self, GtkWidget *target){ @@ -245,31 +244,31 @@ void on_expiration_clicked(GtkWidget *self, ubl_settings_usergroups_user_window void on_additional_settings_save(GtkWidget *self, ubl_settings_usergroups_additional_settings_window *window){ const char *default_user = (char*)gtk_entry_get_text(GTK_ENTRY(window->DefaultUserNameEntry)); if (!yon_char_is_empty(default_user)){ - yon_config_register(DEFAULTUSER_PARAM,DEFAULTUSER_SEC,yon_char_new((char*)default_user)); + yon_config_register("DEFAULTUSER","users",yon_char_new((char*)default_user)); } else { - yon_config_remove_by_key(DEFAULTUSER_PARAM); + yon_config_remove_by_key("DEFAULTUSER"); } char *default_password = gtk_combo_box_get_active(GTK_COMBO_BOX(window->DefaultPasswordCombo))>1? (char*)gtk_entry_get_text(GTK_ENTRY(window->DefaultPasswordEntry)):NULL; if (!yon_char_is_empty(default_password)){ - yon_config_register(DEFAULTPASSWD_PARAM,DEFAULTPASSWD_SEC,default_password); + yon_config_register("DEFAULTPASSWD","users",default_password); } else { - yon_config_remove_by_key(DEFAULTPASSWD_PARAM); + yon_config_remove_by_key("DEFAULTPASSWD"); } char *root_password = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RootPasswordCombo)) > 1 ? (char*)gtk_entry_get_text(GTK_ENTRY(window->RootPasswordEntry)) : NULL; if (!yon_char_is_empty(root_password)){ - yon_config_register(DEFAULTROOTPASSWD_PARAM,DEFAULTROOTPASSWD_SEC,root_password); + yon_config_register("DEFAULTROOTPASSWD","users",root_password); } else { - yon_config_remove_by_key(DEFAULTROOTPASSWD_PARAM); + yon_config_remove_by_key("DEFAULTROOTPASSWD"); } int user_k_admin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DefaultUserAdministratorCheck)); if (user_k_admin){ - yon_config_register(ADDADM_PARAM,ADDADM_SEC,"yes"); + yon_config_register("ADDADM","users","yes"); } else { - yon_config_register(ADDADM_PARAM,ADDADM_SEC,"no"); + yon_config_register("ADDADM","users","no"); } char *hash = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PasswordHashCombo)); if (!yon_char_is_empty(hash)){ - yon_config_register(HASHPASSWD_PARAM,HASHPASSWD_SEC,hash); + yon_config_register("HASHPASSWD","users",hash); } } @@ -320,26 +319,26 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ } yon_char_parsed_free(hash_algos,hash_size); gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordHashCombo),0); - char *default_user = yon_config_get_by_key(DEFAULTUSER_PARAM); + char *default_user = yon_config_get_by_key("DEFAULTUSER"); if (!yon_char_is_empty(default_user)) gtk_entry_set_text(GTK_ENTRY(window->DefaultUserNameEntry),default_user); - char *default_password = yon_config_get_by_key(DEFAULTPASSWD_PARAM); + char *default_password = yon_config_get_by_key("DEFAULTPASSWD"); if (!yon_char_is_empty(default_password)){ gtk_entry_set_text(GTK_ENTRY(window->DefaultPasswordEntry),default_password); - if(!yon_config_check_ignore(DEFAULTPASSWD_PARAM)) + if(!yon_config_check_ignore("DEFAULTPASSWD")) gtk_combo_box_set_active(GTK_COMBO_BOX(window->DefaultPasswordCombo),3); } - char *root_password = yon_config_get_by_key(DEFAULTROOTPASSWD_PARAM); + char *root_password = yon_config_get_by_key("DEFAULTROOTPASSWD"); if (!yon_char_is_empty(root_password)){ gtk_entry_set_text(GTK_ENTRY(window->RootPasswordEntry),root_password); - if(!yon_config_check_ignore(DEFAULTROOTPASSWD_PARAM)) + if(!yon_config_check_ignore("DEFAULTROOTPASSWD")) gtk_combo_box_set_active(GTK_COMBO_BOX(window->RootPasswordCombo),3); } - char *is_k_admin = yon_config_get_by_key(ADDADM_PARAM); + char *is_k_admin = yon_config_get_by_key("ADDADM"); if (!yon_char_is_empty(is_k_admin)) if (!strcmp(is_k_admin,"yes")) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DefaultUserAdministratorCheck),1); - char *hash = yon_config_get_by_key(HASHPASSWD_PARAM); + char *hash = yon_config_get_by_key("HASHPASSWD"); if (!yon_char_is_empty(hash)){ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->PasswordHashCombo),hash); } @@ -398,7 +397,7 @@ void on_GID_update(GtkWidget *self, ubl_settings_usergroups_group_creation_windo if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){ int config_size=0; int final_size=0; - config_str config_groups = yon_config_get_all_by_key(GROUPADD_SIMPLE,&config_size); + config_str config_groups = yon_config_get_all_by_key("GROUPADD",&config_size); yon_char_parsed_prepend_strings(config_groups,config_size,":"); config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_groups,config_size,&final_size); long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))?0:main_config.MINGID; @@ -575,7 +574,7 @@ void on_standard_groups_accept(GtkWidget *self, ubl_settings_usergroups_group_wi standard_groups=extend_groups; } } - yon_config_register(USERGROUPS_PARAM,USERGROUPS_SEC,standard_groups); + yon_config_register("USERGROUPS","users",standard_groups); on_subwindow_close(self); } @@ -594,7 +593,7 @@ void on_standard_groups_open(GtkWidget *self, main_window *widgets){ } g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_standard_groups_accept),window); gtk_window_set_transient_for(GTK_WINDOW(window->GroupsWindow),GTK_WINDOW(widgets->Window)); - char *groups = yon_config_get_by_key(USERGROUPS_PARAM); + char *groups = yon_config_get_by_key("USERGROUPS"); if (!yon_char_is_empty(groups)){ GtkTreeIter iter; int size; @@ -844,7 +843,7 @@ void on_UID_update(GtkWidget *self, ubl_settings_usergroups_user_window *window) if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){ int config_size=0; int final_size=0; - config_str config_users = yon_config_get_all_by_key(USERADD_SIMPLE,&config_size); + config_str config_users = yon_config_get_all_by_key("USERADD",&config_size); yon_char_parsed_prepend_strings(config_users,config_size,":"); config_str final = yon_char_parsed_merge(main_config.users,main_config.users_size,config_users,config_size,&final_size); long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck))?0:main_config.MINGID; @@ -1074,14 +1073,14 @@ void on_user_save(GtkWidget *self, dictionary *dict){ ":",yon_char_return_if_exist(password,"x"), ":",yon_char_return_if_exist(extra_options,""), NULL); - yon_config_register(USERADD(login),USERADD_SEC,final_user); - yon_config_register(USERSHADOW(login),USERSHADOW_SEC,shadow_string); + yon_config_register(USERADD(login),"users",final_user); + yon_config_register(USERSHADOW(login),"users",shadow_string); if (!yon_char_is_empty(useradd_sync_string)) - yon_config_register(USERADD_SYNC(login),USERADD_SYNC_SEC,useradd_sync_string); + yon_config_register(USERADD_SYNC(login),"users",useradd_sync_string); if (!yon_char_is_empty(usershadow_sync_string)) - yon_config_register(USERSHADOW_SYNC(login),USERSHADOW_SYNC_SEC,usershadow_sync_string); + yon_config_register(USERSHADOW_SYNC(login),"users",usershadow_sync_string); GtkTreeIter iter; 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)) diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index c62903e..30b7fea 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -53,32 +53,6 @@ #define USERADD_SYNC(user) yon_char_unite("USERADD_SYNC[",user,"]",NULL) #define USERSHADOW_SYNC(user) yon_char_unite("USERSHADOW_SYNC[",user,"]",NULL) -#define DEFAULTPASSWD_PARAM "DEFAULTPASSWD" -#define DEFAULTPASSWD_SEC "users" -#define DEFAULTROOTPASSWD_PARAM "DEFAULTROOTPASSWD" -#define DEFAULTROOTPASSWD_SEC "users" -#define USERGROUPS_PARAM "USERGROUPS" -#define USERGROUPS_SEC "users" -#define DEFAULTUSER_PARAM "DEFAULTUSER" -#define DEFAULTUSER_SEC "users" -#define HASHPASSWD_PARAM "HASHPASSWD" -#define HASHPASSWD_SEC "users" -#define ADDADM_PARAM "ADDADM" -#define ADDADM_SEC "users" -#define USERADD_PARAM(key) yon_char_unite("USERADD[",key,"]",NULL) -#define USERADD_SIMPLE "USERADD" -#define USERADD_SEC "users" -#define USERSHADOW_PARAM(key) yon_char_unite("USERSHADOW[",key,"]",NULL) -#define USERSHADOW_SIMPLE "USERSHADOW" -#define USERSHADOW_SEC "users" -#define GROUPADD_PARAM(key) yon_char_unite("GROUPADD[",key,"]",NULL) -#define GROUPADD_SIMPLE "GROUPADD" -#define GROUPADD_SEC "users" -#define USERADD_SYNC_PARAM "USERADD_SYNC" -#define USERADD_SYNC_SEC "users" -#define USERSHADOW_SYNC_PARAM "USERSHAODW_SYNC" -#define USERSHADOW_SYNC_SEC "users" - #define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) typedef char* string; -- 2.35.1 From 9a363d7f6e061f966783a45c8a95d60665c11312 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 17 Jan 2024 11:28:10 +0600 Subject: [PATCH 03/30] Test fix for crash --- source/ubl-settings-usergroups.c | 180 ++++++++++++++++--------------- 1 file changed, 91 insertions(+), 89 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 8e580d4..7713a24 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1245,103 +1245,105 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ gtk_tree_model_get(GTK_TREE_MODEL(widgets->UsersList),&iter,2,&name,-1); char *parameter_string = yon_config_get_by_key(USERADD(name)); int parsed_size=0; - if (parameter_string[0]=='\"') yon_char_divide(parameter_string,0); - if (parameter_string[strlen(parameter_string)-1]=='\"') parameter_string[strlen(parameter_string)-1]='\0'; - config_str parameters = yon_char_parse(parameter_string,&parsed_size,":"); - gtk_entry_set_text(GTK_ENTRY(window->userLoginEntry), name); - gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry), name); - gtk_entry_set_text(GTK_ENTRY(window->userUserNameEntry), parsed_size>0?parameters[0]:""); - if (parsed_size>1){ - if (strcmp(parameters[1],"x")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck),0); - gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry), parsed_size>1?parameters[1]:""); + if (parameter_string){ + if (parameter_string[0]=='\"') yon_char_divide(parameter_string,0); + if (parameter_string[strlen(parameter_string)-1]=='\"') parameter_string[strlen(parameter_string)-1]='\0'; + config_str parameters = yon_char_parse(parameter_string,&parsed_size,":"); + gtk_entry_set_text(GTK_ENTRY(window->userLoginEntry), name); + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry), name); + gtk_entry_set_text(GTK_ENTRY(window->userUserNameEntry), parsed_size>0?parameters[0]:""); + if (parsed_size>1){ + if (strcmp(parameters[1],"x")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck),0); + gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry), parsed_size>1?parameters[1]:""); + } } - } - if (parsed_size>2){ - if (!strcmp(parameters[2],"x")) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),1); - else - gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry), parsed_size>2?parameters[2]:""); - } - if (parsed_size>3){ - if (strcmp(parameters[3],"x")) - gtk_entry_set_text(GTK_ENTRY(window->userAdditionalGroupsEntry), parsed_size>3?parameters[3]:""); - - } - if (parsed_size>4&&!yon_char_is_empty(parameters[4])){ - int params_size; - config_str parameters_substring = yon_char_parse(parameters[4],¶ms_size," "); - for (int i=0;iuserHomeEntry),parameters_substring[i+1]); - gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); - i++; - } else if (!strcmp(parameters_substring[i],"--shell")||!strcmp(parameters_substring[i],"-s")){ - int active = yon_gtk_combo_box_text_find(window->userShellCombo,parameters_substring[i+1]); - if (!active){ - gtk_entry_set_text(GTK_ENTRY(window->userShellEntry),parameters_substring[i+1]); - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->userShellCombo),"Set"); + if (parsed_size>2){ + if (!strcmp(parameters[2],"x")) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),1); + else + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry), parsed_size>2?parameters[2]:""); + } + if (parsed_size>3){ + if (strcmp(parameters[3],"x")) + gtk_entry_set_text(GTK_ENTRY(window->userAdditionalGroupsEntry), parsed_size>3?parameters[3]:""); + + } + if (parsed_size>4&&!yon_char_is_empty(parameters[4])){ + int params_size; + config_str parameters_substring = yon_char_parse(parameters[4],¶ms_size," "); + for (int i=0;iuserHomeEntry),parameters_substring[i+1]); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); + i++; + } else if (!strcmp(parameters_substring[i],"--shell")||!strcmp(parameters_substring[i],"-s")){ + int active = yon_gtk_combo_box_text_find(window->userShellCombo,parameters_substring[i+1]); + if (!active){ + gtk_entry_set_text(GTK_ENTRY(window->userShellEntry),parameters_substring[i+1]); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->userShellCombo),"Set"); + } + i++; + + }else if (!strcmp(parameters_substring[i],"--system")||!strcmp(parameters_substring[i],"-r")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck),1); + }else if (!strcmp(parameters_substring[i],"--no-create-home")||!strcmp(parameters_substring[i],"-M")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); + }else if (!strcmp(parameters_substring[i],"--no-user-group")||!strcmp(parameters_substring[i],"-N")){ + // gtk + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),0); + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry),""); + }else if (!strcmp(parameters_substring[i],"--non-unique")||!strcmp(parameters_substring[i],"-o")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck),1); + }else if (!strcmp(parameters_substring[i],"--badnames")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userDontCheckCheck),1); } - i++; - - }else if (!strcmp(parameters_substring[i],"--system")||!strcmp(parameters_substring[i],"-r")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck),1); - }else if (!strcmp(parameters_substring[i],"--no-create-home")||!strcmp(parameters_substring[i],"-M")){ - gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); - }else if (!strcmp(parameters_substring[i],"--no-user-group")||!strcmp(parameters_substring[i],"-N")){ - // gtk - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),0); - gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry),""); - }else if (!strcmp(parameters_substring[i],"--non-unique")||!strcmp(parameters_substring[i],"-o")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck),1); - }else if (!strcmp(parameters_substring[i],"--badnames")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userDontCheckCheck),1); } + // gtk_entry_set_text(GTK_ENTRY(window->), parsed_size>4?parameters[4]:""); } - // gtk_entry_set_text(GTK_ENTRY(window->), parsed_size>4?parameters[4]:""); - } - window->old_password=parameters[5]; - if(parsed_size>5){ - if (strcmp(parameters[5],"x")){ - gtk_entry_set_text(GTK_ENTRY(window->userPasswordEntry), parsed_size>5?parameters[5]:""); - gtk_combo_box_set_active(GTK_COMBO_BOX(window->userPasswordCombo),3); - } - - } - free(parameters); - parameters=yon_char_parse(yon_config_get_by_key(USERSHADOW(name)),&parsed_size,":"); - gtk_entry_set_text(GTK_ENTRY(window->userPasswordChangedEntry),parsed_size>0?parameters[0]:""); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin),atol(parsed_size>1?parameters[1]:"0")); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin),atol(parsed_size>2?parameters[2]:"0")); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userWarningSpin),atol(parsed_size>3?parameters[3]:"0")); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userActivitySpin),atol(parsed_size>4?parameters[4]:"0")); - if (parsed_size>5&&!yon_char_is_empty(parameters[5])){ - GDateTime *date = g_date_time_new_from_unix_local(atol(parameters[5])); - gtk_entry_set_text(GTK_ENTRY(window->userPasswordExpirationEntry),g_date_time_format(date,"%c")); - } - gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window)); - gtk_widget_show(window->CreateUserWindow); - - char *useradd_sync = NULL; - useradd_sync = yon_config_get_by_key(USERADD_SYNC(name)); - if (useradd_sync){ - if (strstr(useradd_sync,"boot")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddBootCheck),1); + window->old_password=parameters[5]; + if(parsed_size>5){ + if (strcmp(parameters[5],"x")){ + gtk_entry_set_text(GTK_ENTRY(window->userPasswordEntry), parsed_size>5?parameters[5]:""); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userPasswordCombo),3); + } + } - if (strstr(useradd_sync,"shutdown")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddShutdownCheck),1); + free(parameters); + parameters=yon_char_parse(yon_config_get_by_key(USERSHADOW(name)),&parsed_size,":"); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordChangedEntry),parsed_size>0?parameters[0]:""); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin),atol(parsed_size>1?parameters[1]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin),atol(parsed_size>2?parameters[2]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userWarningSpin),atol(parsed_size>3?parameters[3]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userActivitySpin),atol(parsed_size>4?parameters[4]:"0")); + if (parsed_size>5&&!yon_char_is_empty(parameters[5])){ + GDateTime *date = g_date_time_new_from_unix_local(atol(parameters[5])); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordExpirationEntry),g_date_time_format(date,"%c")); } - free(useradd_sync); - } - char *usershadow_sync =yon_config_get_by_key(USERSHADOW_SYNC(name)); - if (usershadow_sync){ - if (strstr(usershadow_sync,"boot")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowBootCheck),1); + gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window)); + gtk_widget_show(window->CreateUserWindow); + + char *useradd_sync = NULL; + useradd_sync = yon_config_get_by_key(USERADD_SYNC(name)); + if (useradd_sync){ + if (strstr(useradd_sync,"boot")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddBootCheck),1); + } + if (strstr(useradd_sync,"shutdown")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddShutdownCheck),1); + } + free(useradd_sync); } - if (strstr(usershadow_sync,"shutdown")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowShutdownCheck),1); + char *usershadow_sync =yon_config_get_by_key(USERSHADOW_SYNC(name)); + if (usershadow_sync){ + if (strstr(usershadow_sync,"boot")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowBootCheck),1); + } + if (strstr(usershadow_sync,"shutdown")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowShutdownCheck),1); + } + free(usershadow_sync); } - free(usershadow_sync); } } -- 2.35.1 From 0239b8f8cbd8b3fd61fcdf914fd875bfe5e59c6e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 18 Jan 2024 12:35:37 +0600 Subject: [PATCH 04/30] Added new window --- Makefile | 1 + gresource.xml | 1 + ....ubl-settings-usergroups.save-symbolic.svg | 1 + source/CMakeLists.txt | 1 + source/ubl-settings-usergroups.c | 41 ++++- source/ubl-settings-usergroups.h | 11 +- source/ubl-strings.h | 7 +- ubl-settings-usergroups-savesettings.glade | 144 ++++++++++++++++++ ubl-settings-usergroups.glade | 22 +++ ubl-settings-usergroups.pot | 14 ++ ubl-settings-usergroups_ru.po | 16 ++ 11 files changed, 255 insertions(+), 4 deletions(-) create mode 100644 icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg create mode 100644 ubl-settings-usergroups-savesettings.glade diff --git a/Makefile b/Makefile index 7f11cb6..82e76b9 100644 --- a/Makefile +++ b/Makefile @@ -139,6 +139,7 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.accept-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.cancel-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.profile-settings-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.save-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/hash_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/shell_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" diff --git a/gresource.xml b/gresource.xml index 081a63f..08c8d12 100644 --- a/gresource.xml +++ b/gresource.xml @@ -8,6 +8,7 @@ ubl-settings-usergroups-group.glade ubl-settings-usergroups-user.glade ubl-settings-usergroups-system.glade + ubl-settings-usergroups-savesettings.glade ubl-settings-usergroups.css diff --git a/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg b/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg new file mode 100644 index 0000000..d383f09 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 518b1ed..b5fd2fb 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -31,6 +31,7 @@ set(DEPENDFILES ../ubl-settings-usergroups-system.glade ../ubl-settings-usergroups-user.glade ../ubl-settings-usergroups-group.glade + ../ubl-settings-usergroups-savesettings.glade ../gresource.xml ../ubl-settings-usergroups-banner.png ../ubl-settings-usergroups.css diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 7713a24..2d13f9c 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -5,8 +5,8 @@ config main_config; //functions int yon_load_proceed(YON_CONFIG_TYPE type){ - yon_config_load_register(YON_CONFIG_DEFAULT,"users","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); - if (yon_config_load_register_no_cleaning(type,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL)){ + yon_config_load_register(YON_CONFIG_DEFAULT,"[users]","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); + if (yon_config_load_register_no_cleaning(type,"[users]","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]","[system]","SYSTEMBOOT_STATEMODE","[save]","SAVE_ROOTCOPY_CHANGES",NULL)){ return 1; } return 0; @@ -109,6 +109,41 @@ void on_config_local_save(){ yon_save_proceed("system",YON_CONFIG_LOCAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); } +void on_saving_settings_save(GtkWidget *self, yon_savasettings_window *window){ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SambaCheck))){ + if (!yon_config_append("SAVE_ROOTCOPY_CHANGES","/var/lib/samba",",")){ + yon_config_register("SAVE_ROOTCOPY_CHANGES","[save]","/var/lib/samba"); + } + } else { + yon_config_remove_element("SAVE_ROOTCOPY_CHANGES","/var/lib/samba",","); + } + on_subwindow_close(self); +} + +yon_savasettings_window *yon_saving_settings_new(){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_savesettings); + yon_savasettings_window *window = malloc(sizeof(yon_savasettings_window)); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->SambaCheck = yon_gtk_builder_get_widget(builder,"SambaSaveCheck"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + gtk_widget_show(window->Window); + char *string = yon_config_get_by_key("SAVE_ROOTCOPY_CHANGES"); + if (!yon_char_is_empty(string)&&strstr(string,"/var/lib/samba")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->SambaCheck),1); + } + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),SYSTEM_SAVEMODE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + return window; +} + +void on_saving_settings_open(GtkWidget *self, main_window *widgets){ + yon_savasettings_window *window = yon_saving_settings_new(); + gtk_window_set_transient_for(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window)); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_saving_settings_save),window); +} + void on_password_combo_changed(GtkComboBox *self, GtkWidget *target){ gtk_widget_set_sensitive(target,gtk_combo_box_get_active(self)>1); } @@ -1585,6 +1620,7 @@ main_window *yon_main_window_complete(main_window *widgets){ 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"); + widgets->SavingSettingsButton=yon_gtk_builder_get_widget(builder,"SavingSettingsButton"); gtk_style_context_add_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemmiddlemargin"); @@ -1610,6 +1646,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->button1),"clicked",G_CALLBACK(on_settings_usergroups_system_open),widgets); g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_config_update),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); g_signal_connect(G_OBJECT(widgets->GroupsTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 30b7fea..ff40b73 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -26,6 +26,7 @@ #define glade_path_ubl_settings_usergroups_password "/com/ublinux/ui/ubl-settings-usergroups-password.glade" #define glade_path_ubl_settings_usergroups_system "/com/ublinux/ui/ubl-settings-usergroups-system.glade" #define glade_path_ubl_settings_usergroups_user "/com/ublinux/ui/ubl-settings-usergroups-user.glade" +#define glade_path_ubl_settings_usergroups_savesettings "/com/ublinux/ui/ubl-settings-usergroups-savesettings.glade" #define banner_path "/com/ublinux/images/ubl-settings-usergroups-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-usergroups.css" @@ -137,6 +138,7 @@ typedef struct { GtkWidget *UsersTree; GtkWidget *GroupsTree; GtkWidget *MainNotebook; + GtkWidget *SavingSettingsButton; } main_window; @@ -266,7 +268,14 @@ typedef struct{ char *old_password; } ubl_settings_usergroups_user_window; - + typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *CancelButton; + GtkWidget *AcceptButton; + GtkWidget *SambaCheck; + } yon_savasettings_window; + ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_additional_settings_new(); void on_ubl_settings_usergroups_additional_settings_open(GtkWidget *self, main_window *widgets); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 4bb04e3..09e660d 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -155,4 +155,9 @@ //ubl-settings-usergroups-password.glade #define PASSWORD_REPEAT_LABEL _("Repeat password:") -#define PASSWORD_HASH_LABEL _("Password hash:") \ No newline at end of file +#define PASSWORD_HASH_LABEL _("Password hash:") + +//ubl-settings-usergroups-savesettings.glade +#define SAVESETTINGS_TITLE_LABEL _("Additional configuration of service parameter saving") +#define SAMBA_ROOTCOPY_LABEL _("At every system shutdown save changes of /var/lib/samba\ninto /ublinux-data/rootcopy") +#define SYSTEM_SAVEMODE_LABEL _("For system save mode \"Sandbox\"") \ No newline at end of file diff --git a/ubl-settings-usergroups-savesettings.glade b/ubl-settings-usergroups-savesettings.glade new file mode 100644 index 0000000..c10feb7 --- /dev/null +++ b/ubl-settings-usergroups-savesettings.glade @@ -0,0 +1,144 @@ + + + + + + False + False + True + 450 + com.ublinux.ubl-settings-usergroups + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + vertical + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + At every system shutdown save changes of /var/lib/samba +into /ublinux-data/rootcopy + True + True + False + True + + + + + + + True + False + Samba + + + + + False + True + 0 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + Additional configuration of service parameter saving + + + + + + + + Cancel + True + True + True + image4 + + + + + + Accept + True + True + True + image5 + + + + end + 1 + + + + + + + True + False + com.ublinux.ubl-settings-usergroups.cancel-symbolic + + + True + False + com.ublinux.ubl-settings-usergroups.accept-symbolic + + diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index 8061413..b490cce 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -256,6 +256,23 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 8 + + + True + True + True + Update users and groups + image4 + + + + False + True + 9 + + False @@ -560,4 +577,9 @@ status + + True + False + com.ublinux.ubl-settings-usergroups.save-symbolic + diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index 46ff057..f8ab6dd 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -579,3 +579,17 @@ msgstr "" #: source/ubl-strings.h:158 msgid "Password hash:" msgstr "" + +#: source/ubl-strings.h:161 +msgid "Additional configuration of service parameter saving" +msgstr "" + +#: source/ubl-strings.h:162 +msgid "" +"At every system shutdown save changes of /var/lib/samba\n" +"into /ublinux-data/rootcopy" +msgstr "" + +#: source/ubl-strings.h:163 +msgid "For system save mode \"Sandbox\"" +msgstr "" diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 5bc48a9..8c044f3 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -614,3 +614,19 @@ msgstr "Подтверждение пароля:" #: source/ubl-strings.h:158 msgid "Password hash:" msgstr "Хэш пароля:" + +#: source/ubl-strings.h:161 +msgid "Additional configuration of service parameter saving" +msgstr "Дополнительные настройки сохранения параметров сервисов" + +#: source/ubl-strings.h:162 +msgid "" +"At every system shutdown save changes of /var/lib/samba\n" +"into /ublinux-data/rootcopy" +msgstr "" +"При каждом завершении работы ОС сохранять изменения /var/lib/samba\n" +"в /ublinux-data/rootcopy/" + +#: source/ubl-strings.h:163 +msgid "For system save mode \"Sandbox\"" +msgstr "Для режима сохранения системы \"Песочница\"" -- 2.35.1 From 5dee54618e42a5a4556344ba69a38a70909edd8b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 18 Jan 2024 14:29:58 +0600 Subject: [PATCH 05/30] Localisation changes --- source/ubl-strings.h | 2 +- ubl-settings-usergroups-savesettings.glade | 24 +++++++++++----------- ubl-settings-usergroups.pot | 4 ++-- ubl-settings-usergroups_ru.po | 8 ++++---- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 09e660d..143c13a 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -159,5 +159,5 @@ //ubl-settings-usergroups-savesettings.glade #define SAVESETTINGS_TITLE_LABEL _("Additional configuration of service parameter saving") -#define SAMBA_ROOTCOPY_LABEL _("At every system shutdown save changes of /var/lib/samba\ninto /ublinux-data/rootcopy") +#define SAMBA_ROOTCOPY_LABEL _("At every system shutdown save changes of (root)/var/lib/samba\ninto (hd)/ublinux-data/rootcopy") #define SYSTEM_SAVEMODE_LABEL _("For system save mode \"Sandbox\"") \ No newline at end of file diff --git a/ubl-settings-usergroups-savesettings.glade b/ubl-settings-usergroups-savesettings.glade index c10feb7..e5f6bfe 100644 --- a/ubl-settings-usergroups-savesettings.glade +++ b/ubl-settings-usergroups-savesettings.glade @@ -2,6 +2,16 @@ + + True + False + com.ublinux.ubl-settings-usergroups.cancel-symbolic + + + True + False + com.ublinux.ubl-settings-usergroups.accept-symbolic + False False @@ -51,8 +61,8 @@ 5 - At every system shutdown save changes of /var/lib/samba -into /ublinux-data/rootcopy + At every system shutdown save changes of (root)/var/lib/samba +into (hd)/ublinux-data/rootcopy True True False @@ -131,14 +141,4 @@ into /ublinux-data/rootcopy - - True - False - com.ublinux.ubl-settings-usergroups.cancel-symbolic - - - True - False - com.ublinux.ubl-settings-usergroups.accept-symbolic - diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index f8ab6dd..bff1203 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -586,8 +586,8 @@ msgstr "" #: source/ubl-strings.h:162 msgid "" -"At every system shutdown save changes of /var/lib/samba\n" -"into /ublinux-data/rootcopy" +"At every system shutdown save changes of (root)/var/lib/samba\n" +"into (hd)/ublinux-data/rootcopy" msgstr "" #: source/ubl-strings.h:163 diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 8c044f3..ea791f4 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -621,11 +621,11 @@ msgstr "Дополнительные настройки сохранения п #: source/ubl-strings.h:162 msgid "" -"At every system shutdown save changes of /var/lib/samba\n" -"into /ublinux-data/rootcopy" +"At every system shutdown save changes of (root)/var/lib/samba\n" +"into (hd)/ublinux-data/rootcopy" msgstr "" -"При каждом завершении работы ОС сохранять изменения /var/lib/samba\n" -"в /ublinux-data/rootcopy/" +"При каждом завершении работы ОС сохранять изменения (root)/var/lib/samba\n" +"в (hd)/ublinux-data/rootcopy/" #: source/ubl-strings.h:163 msgid "For system save mode \"Sandbox\"" -- 2.35.1 From cba29382fe9c49772f9830a627466fea0dd6fef6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 19 Jan 2024 18:29:50 +0600 Subject: [PATCH 06/30] Changed user confirmation window --- gresource.xml | 1 + ....ubl-settings-usergroups.save-symbolic.svg | 2 +- source/CMakeLists.txt | 1 + source/ubl-settings-usergroups.c | 118 +++++++-- source/ubl-settings-usergroups.h | 12 + source/ubl-strings.h | 10 +- ubl-settings-usergroups-confirmation.glade | 229 ++++++++++++++++++ ubl-settings-usergroups-savesettings.glade | 2 + ubl-settings-usergroups.glade | 25 +- ubl-settings-usergroups.pot | 24 ++ ubl-settings-usergroups_ru.po | 24 ++ 11 files changed, 423 insertions(+), 25 deletions(-) create mode 100644 ubl-settings-usergroups-confirmation.glade diff --git a/gresource.xml b/gresource.xml index 08c8d12..c29a06f 100644 --- a/gresource.xml +++ b/gresource.xml @@ -9,6 +9,7 @@ ubl-settings-usergroups-user.glade ubl-settings-usergroups-system.glade ubl-settings-usergroups-savesettings.glade + ubl-settings-usergroups-confirmation.glade ubl-settings-usergroups.css diff --git a/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg b/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg index d383f09..6ed49b5 100644 --- a/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg +++ b/icons/com.ublinux.ubl-settings-usergroups.save-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index b5fd2fb..30a24e5 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -32,6 +32,7 @@ set(DEPENDFILES ../ubl-settings-usergroups-user.glade ../ubl-settings-usergroups-group.glade ../ubl-settings-usergroups-savesettings.glade + ../ubl-settings-usergroups-confirmation.glade ../gresource.xml ../ubl-settings-usergroups-banner.png ../ubl-settings-usergroups.css diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 2d13f9c..f2122dc 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -5,8 +5,8 @@ config main_config; //functions int yon_load_proceed(YON_CONFIG_TYPE type){ - yon_config_load_register(YON_CONFIG_DEFAULT,"[users]","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); - if (yon_config_load_register_no_cleaning(type,"[users]","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]","[system]","SYSTEMBOOT_STATEMODE","[save]","SAVE_ROOTCOPY_CHANGES",NULL)){ + yon_config_load_register(YON_CONFIG_DEFAULT,"users","DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM",NULL); + if (yon_config_load_register_no_cleaning(type,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]","[system]","SYSTEMBOOT_STATEMODE","[save]","SAVE_ROOTCOPY_CHANGES",NULL)){ return 1; } return 0; @@ -82,7 +82,7 @@ void yon_interface_update(main_window *widgets){ void on_config_local_load(GtkWidget *self, main_window *widgets){ yon_load_proceed(YON_CONFIG_LOCAL); textdomain(template_ui_LocaleName); - yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); textdomain(LocaleName); main_config.load_mode=1; yon_interface_update(widgets); @@ -120,6 +120,104 @@ void on_saving_settings_save(GtkWidget *self, yon_savasettings_window *window){ on_subwindow_close(self); } +void on_delete_confirmation_delete_home_check(GtkCellRenderer *self, char *path, yon_confirmation_window *window){ + GtkTreeIter iter; + gboolean status; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,3,&status,-1); + gtk_list_store_set(window->list,&iter,3,!status,-1); + +} + +void on_delete_confirmation_delete_check(GtkCellRenderer *self, char *path, yon_confirmation_window *window){ + GtkTreeIter iter; + gboolean status; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&status,-1); + gtk_list_store_set(window->list,&iter,0,!status,-1); + +} + +void yon_delete_confirmation_save(GtkWidget *self, dictionary *dict){ + GtkTreeIter iter,itar; + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + yon_confirmation_window *window = yon_dictionary_get_data(dict->first->next,yon_confirmation_window*); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->UsersList),&iter); + for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->UsersList),&iter)){ + char *name; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->UsersList),&iter,2,&name,-1); + int valid2 = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&itar); + for (;valid2;valid2 = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&itar)){ + char *name_check; + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,1,&name_check,-1); + if (!strcmp(name,name_check)){ + GtkTreeIter *it = gtk_tree_iter_copy(&iter); + if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->UsersList),&iter)){ + iter = *gtk_tree_iter_copy(it); + if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(widgets->UsersList),&iter)){ + iter = *gtk_tree_iter_copy(it); + } + } + gtk_list_store_remove(widgets->UsersList,it); + yon_config_remove_by_key(USERADD(name)); + yon_config_remove_by_key(USERSHADOW(name)); + } + } + } + on_subwindow_close(self); +} + +yon_confirmation_window *yon_delete_confirmation_new(){ + yon_confirmation_window *window = malloc(sizeof(yon_confirmation_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_confirmation); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->DeletionTree = yon_gtk_builder_get_widget(builder,"DeletionTree"); + window->DeleteCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"DeleteCell")); + window->DeleteHomeCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"DeleteHomeCell")); + window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + gtk_window_set_title(GTK_WINDOW(window->Window),DELETE_CONFIRMATION_TITLE_LABEL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->DeleteCell),"toggled",G_CALLBACK(on_delete_confirmation_delete_check),window); + g_signal_connect(G_OBJECT(window->DeleteHomeCell),"toggled",G_CALLBACK(on_delete_confirmation_delete_home_check),window); + return window; +} + +void yon_delete_confirmation_open(main_window *widgets){ + yon_confirmation_window *window = yon_delete_confirmation_new(); + GtkTreeIter iter,itar; + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(yon_delete_confirmation_save),dict); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->UsersList),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->UsersList),&iter)){ + char *name,*parameters,*homedir=NULL; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->UsersList),&iter,2,&name,6,¶meters,-1); + if (strstr(parameters,"--home-dir")){ + int size; + config_str parsed = yon_char_parse(parameters,&size," "); + for (int i=0;ilist,&itar); + gtk_list_store_set(window->list,&itar,1,name,2,homedir,3,0,4,status,-1); + free(name); + free(parameters); + free(homedir); + } + gtk_widget_show(window->Window); +} + yon_savasettings_window *yon_saving_settings_new(){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_savesettings); yon_savasettings_window *window = malloc(sizeof(yon_savasettings_window)); @@ -1450,19 +1548,7 @@ void on_main_delete(GtkWidget *self, main_window *widgets){ data->function=NULL; data->data=NULL; if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ - model = GTK_TREE_MODEL(widgets->UsersList); - cur_tree=widgets->UsersTree; - if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(cur_tree)),&model,&iter)){ - char *name; - gtk_tree_model_get(model,&iter,2,&name,-1); - data->action_text=DELETE_CONFIRMATION_LABEL("user",name); - if (yon_confirmation_dialog_call(self,data)==GTK_RESPONSE_ACCEPT){ - yon_config_remove_by_key(USERADD(name)); - yon_config_remove_by_key(USERADD_SYNC(name)); - yon_config_remove_by_key(USERSHADOW(name)); - gtk_list_store_remove(GTK_LIST_STORE(model),&iter); - } - } + yon_delete_confirmation_open(widgets); } else { model = GTK_TREE_MODEL(widgets->GroupsList); cur_tree=widgets->GroupsTree; diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index ff40b73..2369238 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -27,6 +27,7 @@ #define glade_path_ubl_settings_usergroups_system "/com/ublinux/ui/ubl-settings-usergroups-system.glade" #define glade_path_ubl_settings_usergroups_user "/com/ublinux/ui/ubl-settings-usergroups-user.glade" #define glade_path_ubl_settings_usergroups_savesettings "/com/ublinux/ui/ubl-settings-usergroups-savesettings.glade" +#define glade_path_ubl_settings_usergroups_confirmation "/com/ublinux/ui/ubl-settings-usergroups-confirmation.glade" #define banner_path "/com/ublinux/images/ubl-settings-usergroups-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-usergroups.css" @@ -276,6 +277,17 @@ typedef struct{ GtkWidget *SambaCheck; } yon_savasettings_window; + typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *CancelButton; + GtkWidget *AcceptButton; + GtkWidget *DeletionTree; + GtkListStore *list; + GtkCellRenderer *DeleteCell; + GtkCellRenderer *DeleteHomeCell; + } yon_confirmation_window; + ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_additional_settings_new(); void on_ubl_settings_usergroups_additional_settings_open(GtkWidget *self, main_window *widgets); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 143c13a..a72969f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -160,4 +160,12 @@ //ubl-settings-usergroups-savesettings.glade #define SAVESETTINGS_TITLE_LABEL _("Additional configuration of service parameter saving") #define SAMBA_ROOTCOPY_LABEL _("At every system shutdown save changes of (root)/var/lib/samba\ninto (hd)/ublinux-data/rootcopy") -#define SYSTEM_SAVEMODE_LABEL _("For system save mode \"Sandbox\"") \ No newline at end of file +#define SYSTEM_SAVEMODE_LABEL _("For system save mode \"Sandbox\"") + +//ubl-settings-usergroups-confirmation.glade +#define DELETE_CONFIRMATION_TITLE_LABEL _("User deletion") +#define DELETE_CONFIRMATION_CONFIRM_LABEL _("Confirm user(-s) deletion:") +#define DELETE_CONFIRMATION_CHOSEN_LABEL _("Chosen") +#define DELETE_CONFIRMATION_USER_LABEL _("User") +#define DELETE_CONFIRMATION_HOME_LABEL _("Home directory") +#define DELETE_CONFIRMATION_DELETE_HOME_LABEL _("Delete home directory") \ No newline at end of file diff --git a/ubl-settings-usergroups-confirmation.glade b/ubl-settings-usergroups-confirmation.glade new file mode 100644 index 0000000..a99a9ca --- /dev/null +++ b/ubl-settings-usergroups-confirmation.glade @@ -0,0 +1,229 @@ + + + + + + + True + False + com.ublinux.ubl-settings-usergroups.cancel-symbolic + + + True + False + com.ublinux.ubl-settings-usergroups.accept-symbolic + + + + + + + + + + + + + + + + + 450 + 300 + False + False + True + 450 + com.ublinux.ubl-settings-usergroups + + + True + False + vertical + + + True + False + vertical + + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 20 + 20 + 20 + 20 + dialog-question-symbolic + 6 + + + False + True + 0 + + + + + True + False + Confirm user(-s) deletion: + 0 + + + True + True + 1 + + + + + False + True + 0 + + + + + True + True + in + + + True + True + liststore1 + + + + + + Chosen + + + + 0 + + + + + + + User + + + + 1 + + + + + + + Home directory + + + + 2 + + + + + + + Delete home directory + + + + 4 + 3 + + + + + + + + + True + True + 1 + + + + + True + True + 1 + + + + + + + True + False + + + True + False + User deletion + + + + + + + + Cancel + True + True + True + image4 + + + + + + Accept + True + True + True + image5 + + + + end + 1 + + + + + + diff --git a/ubl-settings-usergroups-savesettings.glade b/ubl-settings-usergroups-savesettings.glade index e5f6bfe..fe73517 100644 --- a/ubl-settings-usergroups-savesettings.glade +++ b/ubl-settings-usergroups-savesettings.glade @@ -13,6 +13,8 @@ com.ublinux.ubl-settings-usergroups.accept-symbolic + 450 + 300 False False True diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index b490cce..f55656f 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -100,6 +100,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False com.ublinux.ubl-settings-usergroups.trash-symbolic + + True + False + com.ublinux.ubl-settings-usergroups.save-symbolic + True False @@ -239,6 +244,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 7 + + + True + False + + + False + True + 8 + + True @@ -253,7 +269,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 8 + 9 @@ -270,7 +286,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 9 + 10 @@ -577,9 +593,4 @@ status - - True - False - com.ublinux.ubl-settings-usergroups.save-symbolic - diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index bff1203..321db2c 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -593,3 +593,27 @@ msgstr "" #: source/ubl-strings.h:163 msgid "For system save mode \"Sandbox\"" msgstr "" + +#: source/ubl-strings.h:166 +msgid "User deletion" +msgstr "" + +#: source/ubl-strings.h:167 +msgid "Confirm user(-s) deletion:" +msgstr "" + +#: source/ubl-strings.h:168 +msgid "Chosen" +msgstr "" + +#: source/ubl-strings.h:169 +msgid "User" +msgstr "" + +#: source/ubl-strings.h:170 +msgid "Home directory" +msgstr "" + +#: source/ubl-strings.h:171 +msgid "Delete home directory" +msgstr "" diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index ea791f4..0a9d8d6 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -630,3 +630,27 @@ msgstr "" #: source/ubl-strings.h:163 msgid "For system save mode \"Sandbox\"" msgstr "Для режима сохранения системы \"Песочница\"" + +#: source/ubl-strings.h:166 +msgid "User deletion" +msgstr "Удаление пользователя(-лей)" + +#: source/ubl-strings.h:167 +msgid "Confirm user(-s) deletion:" +msgstr "Подтвердите удаление пользователя (-ей):" + +#: source/ubl-strings.h:168 +msgid "Chosen" +msgstr "Выбран" + +#: source/ubl-strings.h:169 +msgid "User" +msgstr "Пользователь" + +#: source/ubl-strings.h:170 +msgid "Home directory" +msgstr "Домашний каталог" + +#: source/ubl-strings.h:171 +msgid "Delete home directory" +msgstr "Удалить домашний каталог" -- 2.35.1 From 1397780036b90782173ff599fb99cb652be86deb Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 19 Jan 2024 18:37:52 +0600 Subject: [PATCH 07/30] Localisatio updates --- source/ubl-settings-usergroups.c | 8 - source/ubl-strings.h | 1 + ubl-settings-usergroups-confirmation.glade | 2 +- ubl-settings-usergroups.glade | 1 - ubl-settings-usergroups.pot | 234 +++++++++++---------- ubl-settings-usergroups_ru.po | 234 +++++++++++---------- 6 files changed, 240 insertions(+), 240 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index f2122dc..f9caeab 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1639,19 +1639,15 @@ void on_selection_changed(GtkWidget *self, main_window *widgets){ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ 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)){ - gtk_widget_set_sensitive(widgets->DeleteButton,1); gtk_widget_set_sensitive(widgets->EditButton,1); } else { - gtk_widget_set_sensitive(widgets->DeleteButton,0); gtk_widget_set_sensitive(widgets->EditButton,0); } } else { 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->DeleteButton,1); gtk_widget_set_sensitive(widgets->EditButton,1); } else { - gtk_widget_set_sensitive(widgets->DeleteButton,0); gtk_widget_set_sensitive(widgets->EditButton,0); } } @@ -1662,19 +1658,15 @@ void on_notebook_page_changed(GtkWidget *self, GtkWidget *page, int num, main_wi if (num==0){ 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)){ - gtk_widget_set_sensitive(widgets->DeleteButton,1); gtk_widget_set_sensitive(widgets->EditButton,1); } else { - gtk_widget_set_sensitive(widgets->DeleteButton,0); gtk_widget_set_sensitive(widgets->EditButton,0); } } else { 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->DeleteButton,1); gtk_widget_set_sensitive(widgets->EditButton,1); } else { - gtk_widget_set_sensitive(widgets->DeleteButton,0); gtk_widget_set_sensitive(widgets->EditButton,0); } } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index a72969f..c4fe886 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -15,6 +15,7 @@ #define LOGIN_LABEL _("Login") #define PASSWORD_LABEL _("Password") #define USER_NAME_LABEL _("User\nname") +#define APPLY_LABEL _("Apply") #define UID_USER_LABEL _("User UID:") #define USERNAME_USER_LABEL _("User name (description):") diff --git a/ubl-settings-usergroups-confirmation.glade b/ubl-settings-usergroups-confirmation.glade index a99a9ca..e171163 100644 --- a/ubl-settings-usergroups-confirmation.glade +++ b/ubl-settings-usergroups-confirmation.glade @@ -208,7 +208,7 @@ - Accept + Apply True True True diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index f55656f..5c7c76d 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -229,7 +229,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True - False True True Remove diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index 321db2c..c67a5e1 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -97,7 +97,7 @@ msgstr "" msgid "Root user password:" msgstr "" -#: source/ubl-strings.h:12 source/ubl-strings.h:26 +#: source/ubl-strings.h:12 source/ubl-strings.h:27 msgid "Password hash algorythm:" msgstr "" @@ -105,7 +105,7 @@ msgstr "" msgid "UID" msgstr "" -#: source/ubl-strings.h:15 source/ubl-strings.h:81 +#: source/ubl-strings.h:15 source/ubl-strings.h:82 msgid "Login" msgstr "" @@ -119,131 +119,135 @@ msgid "" "name" msgstr "" -#: source/ubl-strings.h:19 -msgid "User UID:" +#: source/ubl-strings.h:18 +msgid "Apply" msgstr "" #: source/ubl-strings.h:20 -msgid "User name (description):" +msgid "User UID:" msgstr "" #: source/ubl-strings.h:21 -msgid "Login:" +msgid "User name (description):" msgstr "" #: source/ubl-strings.h:22 -msgid "Password:" +msgid "Login:" msgstr "" #: source/ubl-strings.h:23 -msgid "Default" +msgid "Password:" msgstr "" #: source/ubl-strings.h:24 -msgid "Main group:" +msgid "Default" msgstr "" #: source/ubl-strings.h:25 +msgid "Main group:" +msgstr "" + +#: source/ubl-strings.h:26 msgid "" "Additional\n" "groups" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:28 msgid "Sync with SAMBA user" msgstr "" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:29 msgid "Extra options:" msgstr "" -#: source/ubl-strings.h:29 +#: source/ubl-strings.h:30 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:31 msgid "Ok" msgstr "" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:33 msgid "Block" msgstr "" -#: source/ubl-strings.h:33 +#: source/ubl-strings.h:34 msgid "" "Main\n" "group" msgstr "" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:35 msgid "" "Additional\n" "parameters" msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:36 msgid "" "Password\n" "status" msgstr "" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:37 msgid "Users" msgstr "" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:38 msgid "GID" msgstr "" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:39 msgid "" "Group\n" "name" msgstr "" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:40 msgid "" "Group\n" "users" msgstr "" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:41 msgid "Groups" msgstr "" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:43 msgid "Password input" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:44 msgid "File owerview" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:46 msgid "Inspect users and groups in system" msgstr "" -#: source/ubl-strings.h:46 source/ubl-strings.h:56 +#: source/ubl-strings.h:47 source/ubl-strings.h:57 msgid "Additional settings" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:48 msgid "Shared groups configuration" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:49 msgid "Create new" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:50 msgid "Edit" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:51 msgid "Remove" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:52 msgid "Update users and groups" msgstr "" @@ -259,361 +263,361 @@ msgstr "" msgid "No password required" msgstr "" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:59 msgid "Set a password" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:60 msgid "Endrypted password" msgstr "" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:73 msgid "Accept" msgstr "" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:76 msgid "Configure group" msgstr "" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:77 msgid "Add group" msgstr "" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:78 msgid "Group id:" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:79 msgid "Group name:" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:80 msgid "Group users:" msgstr "" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:81 msgid "Automatically" msgstr "" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:83 msgid "Create group with ununique GID" msgstr "" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:84 msgid "Create system group" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:85 msgid "Encrypted password" msgstr "" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:86 msgid "Additional configuration" msgstr "" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:89 msgid "Default groups" msgstr "" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:90 msgid "Main group" msgstr "" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:91 msgid "Additional groups" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:92 msgid "Choose groups" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:93 msgid "Choose users" msgstr "" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:96 msgid "System users and groups" msgstr "" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "Blocked" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:98 msgid "Username" msgstr "" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:99 msgid "" "Primary\n" "group" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "" "Home\n" "directory" msgstr "" -#: source/ubl-strings.h:100 source/ubl-strings.h:106 +#: source/ubl-strings.h:101 source/ubl-strings.h:107 msgid "Group" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:102 msgid "Update the system users and groups list" msgstr "" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Toggle system groups and users" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Password mismatch" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Password must be at least" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "characters" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "" "Days until\n" "warning" msgstr "" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:109 msgid "" "Days\n" "without activity" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "" "Shell\n" "path" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:111 msgid "" "Password has\n" "been changed" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "" "Expiration\n" "date" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "" "Password change\n" "interval (min)" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "" "Password change\n" "interval (max)" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:117 msgid "Add user" msgstr "" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Configure user" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Set" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "Empty important field" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "Loading has failed" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Login name" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:123 msgid "Additional groups:" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "Password configuration" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Password has been changed:" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:126 msgid "expiration date:" msgstr "" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Password change interval: minimum" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "days, maximum" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "days" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:130 msgid "Days until warning:" msgstr "" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "Days without activity:" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "Force change at next login" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "User shell:" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "Home directory:" msgstr "" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:135 msgid "Don't set" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "Create system user" msgstr "" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:137 msgid "Create user with ununique (repeating) UID" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Do not check login for compliance with character rules" msgstr "" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:139 msgid "Temporary deactivation" msgstr "" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Save" msgstr "" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:141 msgid "login_name" msgstr "" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "group_name" msgstr "" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:143 msgid "User name" msgstr "" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:145 msgid "User configuration" msgstr "" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "User configuration synchronization" msgstr "" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:147 msgid "During system startup, load the user from the configuration" msgstr "" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "When shutting down the system, save the user into the configuration" msgstr "" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:149 msgid "User password configuration syncronization" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "" "During system startup, load the user's parameters from the configuration" msgstr "" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:151 msgid "" "When shutting down the system, save the user's parameters into the " "configuration" msgstr "" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:153 msgid "Main" msgstr "" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Additional" msgstr "" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Syncronization" msgstr "" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Repeat password:" msgstr "" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:159 msgid "Password hash:" msgstr "" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:162 msgid "Additional configuration of service parameter saving" msgstr "" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:163 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" msgstr "" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:164 msgid "For system save mode \"Sandbox\"" msgstr "" -#: source/ubl-strings.h:166 +#: source/ubl-strings.h:167 msgid "User deletion" msgstr "" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:168 msgid "Confirm user(-s) deletion:" msgstr "" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:169 msgid "Chosen" msgstr "" -#: source/ubl-strings.h:169 +#: source/ubl-strings.h:170 msgid "User" msgstr "" -#: source/ubl-strings.h:170 +#: source/ubl-strings.h:171 msgid "Home directory" msgstr "" -#: source/ubl-strings.h:171 +#: source/ubl-strings.h:172 msgid "Delete home directory" msgstr "" diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 0a9d8d6..e5ff2a5 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -99,7 +99,7 @@ msgstr "Пароль для пользователей по умолчанию:" msgid "Root user password:" msgstr "Пароль пользователя root:" -#: source/ubl-strings.h:12 source/ubl-strings.h:26 +#: source/ubl-strings.h:12 source/ubl-strings.h:27 msgid "Password hash algorythm:" msgstr "Алгоритм хэширования пароля:" @@ -107,7 +107,7 @@ msgstr "Алгоритм хэширования пароля:" msgid "UID" msgstr "UID" -#: source/ubl-strings.h:15 source/ubl-strings.h:81 +#: source/ubl-strings.h:15 source/ubl-strings.h:82 msgid "Login" msgstr "Логин" @@ -123,31 +123,35 @@ msgstr "" "Имя\n" "пользователя" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:18 +msgid "Apply" +msgstr "Применить" + +#: source/ubl-strings.h:20 msgid "User UID:" msgstr "UID пользователя:" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:21 msgid "User name (description):" msgstr "Имя пользователя (описание):" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:22 msgid "Login:" msgstr "Логин:" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:23 msgid "Password:" msgstr "Пароль:" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:24 msgid "Default" msgstr "По умолчанию" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:25 msgid "Main group:" msgstr "Основная группа:" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:26 msgid "" "Additional\n" "groups" @@ -155,27 +159,27 @@ msgstr "" "Дополнительные\n" "группы" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:28 msgid "Sync with SAMBA user" msgstr "Синхронизировать с пользователем SAMBA" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:29 msgid "Extra options:" msgstr "Дополнительные параметры:" -#: source/ubl-strings.h:29 +#: source/ubl-strings.h:30 msgid "Cancel" msgstr "Отменить" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:31 msgid "Ok" msgstr "Применить" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:33 msgid "Block" msgstr "Заблокировано" -#: source/ubl-strings.h:33 +#: source/ubl-strings.h:34 msgid "" "Main\n" "group" @@ -183,7 +187,7 @@ msgstr "" "Основная\n" "группа" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:35 msgid "" "Additional\n" "parameters" @@ -191,7 +195,7 @@ msgstr "" "Дополнительные\n" "параметры" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:36 msgid "" "Password\n" "status" @@ -199,15 +203,15 @@ msgstr "" "Статус\n" "пароля" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:37 msgid "Users" msgstr "Пользователи" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:38 msgid "GID" msgstr "GID" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:39 msgid "" "Group\n" "name" @@ -215,7 +219,7 @@ msgstr "" "Имя\n" "группы" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:40 msgid "" "Group\n" "users" @@ -223,43 +227,43 @@ msgstr "" "Пользователи\n" "группы" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:41 msgid "Groups" msgstr "Группы" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:43 msgid "Password input" msgstr "Ввод пароля" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:44 msgid "File owerview" msgstr "Обзор файлов" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:46 msgid "Inspect users and groups in system" msgstr "Просмотр пользователей и групп в системе" -#: source/ubl-strings.h:46 source/ubl-strings.h:56 +#: source/ubl-strings.h:47 source/ubl-strings.h:57 msgid "Additional settings" msgstr "Дополнительные настройки" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:48 msgid "Shared groups configuration" msgstr "Группы пользователей по умолчанию" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:49 msgid "Create new" msgstr "Создать" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:50 msgid "Edit" msgstr "Редактировать" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:51 msgid "Remove" msgstr "Удалить" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:52 msgid "Update users and groups" msgstr "Обновить список пользователей и групп" @@ -275,91 +279,91 @@ msgstr "Вы уверены, что хотите удалить пользова msgid "No password required" msgstr "Пароль не требуется" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:59 msgid "Set a password" msgstr "Задать пароль" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:60 msgid "Endrypted password" msgstr "Зашифрованный пароль" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:73 msgid "Accept" msgstr "Принять" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:76 msgid "Configure group" msgstr "Редактировать группу" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:77 msgid "Add group" msgstr "Добавить группу" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:78 msgid "Group id:" msgstr "ID Группы:" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:79 msgid "Group name:" msgstr "Имя группы:" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:80 msgid "Group users:" msgstr "Пользователи группы:" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:81 msgid "Automatically" msgstr "Автоматически" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:83 msgid "Create group with ununique GID" msgstr "Создать группу с повторяющимися (не уникальными) GID" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:84 msgid "Create system group" msgstr "Создать системную группу" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:85 msgid "Encrypted password" msgstr "Зашифрованный пароль" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:86 msgid "Additional configuration" msgstr "Дополнительные настройки" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:89 msgid "Default groups" msgstr "Группы пользователей по умолчанию" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:90 msgid "Main group" msgstr "Основная группа" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:91 msgid "Additional groups" msgstr "Дополнительные группы" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:92 msgid "Choose groups" msgstr "Выбрать группы" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:93 msgid "Choose users" msgstr "Выбрать пользователей" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:96 msgid "System users and groups" msgstr "Пользователи и группы в системе" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "Blocked" msgstr "Заблокировано" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:98 msgid "Username" msgstr "Имя пользователя" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:99 msgid "" "Primary\n" "group" @@ -367,7 +371,7 @@ msgstr "" "Основная\n" "группа" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "" "Home\n" "directory" @@ -375,31 +379,31 @@ msgstr "" "Домашний\n" "каталог" -#: source/ubl-strings.h:100 source/ubl-strings.h:106 +#: source/ubl-strings.h:101 source/ubl-strings.h:107 msgid "Group" msgstr "Группа" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:102 msgid "Update the system users and groups list" msgstr "Обновить список пользователей и групп системы" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Toggle system groups and users" msgstr "Переключить видимость системных пользователей и групп" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Password mismatch" msgstr "Несовпадение паролей" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Password must be at least" msgstr "Пароль должен состоять из как минимум" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "characters" msgstr "символов" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "" "Days until\n" "warning" @@ -407,7 +411,7 @@ msgstr "" "Дней до\n" "предупреждения" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:109 msgid "" "Days\n" "without activity" @@ -415,7 +419,7 @@ msgstr "" "Дней без\n" "активности" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "" "Shell\n" "path" @@ -423,7 +427,7 @@ msgstr "" "Путь до\n" "оболочки" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:111 msgid "" "Password has\n" "been changed" @@ -431,7 +435,7 @@ msgstr "" "Пароль\n" "изменён" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "" "Expiration\n" "date" @@ -439,7 +443,7 @@ msgstr "" "Дата\n" "устаревания" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "" "Password change\n" "interval (min)" @@ -447,7 +451,7 @@ msgstr "" "Интервал смены\n" "пароля (мин.)" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "" "Password change\n" "interval (max)" @@ -455,171 +459,171 @@ msgstr "" "Интервал смены\n" "пароля (макс.)" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:117 msgid "Add user" msgstr "Добавить пользователя" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Configure user" msgstr "Редактировать пользователя" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Set" msgstr "Задать" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "Empty important field" msgstr "Пустое важное поле" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "Loading has failed" msgstr "Ошибка загрузки" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Login name" msgstr "Имя логина" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:123 msgid "Additional groups:" msgstr "Дополнительные группы:" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "Password configuration" msgstr "Конфигурация пароля" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Password has been changed:" msgstr "Пароль изменён:" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:126 msgid "expiration date:" msgstr "Дата устаревания:" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Password change interval: minimum" msgstr "Интервал смены пароля: минимум" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "days, maximum" msgstr "дней, максимум" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "days" msgstr "дней" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:130 msgid "Days until warning:" msgstr "Дней до предупреждения:" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "Days without activity:" msgstr "Дней без активности:" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "Force change at next login" msgstr "Принудительно сменить при следующем входе в систему" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "User shell:" msgstr "Оболочка пользователя:" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "Home directory:" msgstr "Домашний каталог:" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:135 msgid "Don't set" msgstr "Не создавать" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "Create system user" msgstr "Создать системного пользователя" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:137 msgid "Create user with ununique (repeating) UID" msgstr "Создать пользователя с повторяющимися (не уникальными) UID" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Do not check login for compliance with character rules" msgstr "Не проверять логин на несоответствие правилам использования символов" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:139 msgid "Temporary deactivation" msgstr "Временное отключение учётной записи" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:141 msgid "login_name" msgstr "Имя_логина" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "group_name" msgstr "Имя_группы" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:143 msgid "User name" msgstr "Имя пользователя" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:145 msgid "User configuration" msgstr "Настройка пользователя" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "User configuration synchronization" msgstr "Синхронизация настроек пользователя" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:147 msgid "During system startup, load the user from the configuration" msgstr "При загрузке системы загрузить пользователя из конфигурации" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "When shutting down the system, save the user into the configuration" msgstr "При завершении работы системы сохранить пользователя в конфигурацию" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:149 msgid "User password configuration syncronization" msgstr "Синхронизация настроек пароля пользователя" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "" "During system startup, load the user's parameters from the configuration" msgstr "При загрузке системы загрузить параметры пользователя из конфигурации" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:151 msgid "" "When shutting down the system, save the user's parameters into the " "configuration" msgstr "" "При завершении работы системы сохранить параметры пользователя в конфигурацию" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:153 msgid "Main" msgstr "Основные" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Additional" msgstr "Дополнительные" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Syncronization" msgstr "Синхронизация" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Repeat password:" msgstr "Подтверждение пароля:" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:159 msgid "Password hash:" msgstr "Хэш пароля:" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:162 msgid "Additional configuration of service parameter saving" msgstr "Дополнительные настройки сохранения параметров сервисов" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:163 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" @@ -627,30 +631,30 @@ msgstr "" "При каждом завершении работы ОС сохранять изменения (root)/var/lib/samba\n" "в (hd)/ublinux-data/rootcopy/" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:164 msgid "For system save mode \"Sandbox\"" msgstr "Для режима сохранения системы \"Песочница\"" -#: source/ubl-strings.h:166 +#: source/ubl-strings.h:167 msgid "User deletion" msgstr "Удаление пользователя(-лей)" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:168 msgid "Confirm user(-s) deletion:" msgstr "Подтвердите удаление пользователя (-ей):" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:169 msgid "Chosen" msgstr "Выбран" -#: source/ubl-strings.h:169 +#: source/ubl-strings.h:170 msgid "User" msgstr "Пользователь" -#: source/ubl-strings.h:170 +#: source/ubl-strings.h:171 msgid "Home directory" msgstr "Домашний каталог" -#: source/ubl-strings.h:171 +#: source/ubl-strings.h:172 msgid "Delete home directory" msgstr "Удалить домашний каталог" -- 2.35.1 From 05bf392186c8cbbe8274a21c39aaa753ff0824c0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 09:20:09 +0600 Subject: [PATCH 08/30] Added logics to user window sensitivity --- source/ubl-settings-usergroups.c | 4 ++++ ubl-settings-usergroups-user.glade | 1 + 2 files changed, 5 insertions(+) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index f9caeab..476126f 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1323,6 +1323,10 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ g_signal_connect(G_OBJECT(window->userCreateSystemCheck),"toggled",G_CALLBACK(on_UID_update),window); g_signal_connect(G_OBJECT(window->userGroupsCheck),"toggled",G_CALLBACK(on_user_login_update),window); g_signal_connect(G_OBJECT(window->userLoginEntry),"changed",G_CALLBACK(on_user_login_update),window); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->userCreateSystemCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button),window->userCreateSystemCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userCreateUnuniqueCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button_inversed),window->userCreateUnuniqueCheck); return window; } diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index a02ef46..4d12717 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -703,6 +703,7 @@ Create user with ununique (repeating) UID True + False True False True -- 2.35.1 From cb7f0f3b5e28110ea59973ab894c0a50e488b43c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 09:23:35 +0600 Subject: [PATCH 09/30] Added sensitivity logic for group creation/editing window --- source/ubl-settings-usergroups.c | 4 ++++ ubl-settings-usergroups-group-creation.glade | 1 + 2 files changed, 5 insertions(+) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 476126f..9226c22 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -652,6 +652,10 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->userGroupsEntry); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(on_GID_update),window); g_signal_connect(G_OBJECT(window->SystemGroupCheck),"toggled",G_CALLBACK(on_GID_update),window); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button),window->SystemGroupCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->SystemGroupCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button_inversed),window->UnuniqueGIDCheck); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UnuniqueGIDCheck); return window; } diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 9739823..8e5faf1 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -233,6 +233,7 @@ Create group with ununique GID True + False True False True -- 2.35.1 From f215cabaf78b59c2351f1caa357a4b89a152e792 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 11:11:04 +0600 Subject: [PATCH 10/30] Changed status icon on saving configuration window --- 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 9226c22..5ddb99b 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -232,7 +232,7 @@ yon_savasettings_window *yon_saving_settings_new(){ if (!yon_char_is_empty(string)&&strstr(string,"/var/lib/samba")){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->SambaCheck),1); } - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),SYSTEM_SAVEMODE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),SYSTEM_SAVEMODE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); return window; } -- 2.35.1 From 4fb19bd833ed0bd4b5c4f606a9f4ae9f21b28190 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 11:33:05 +0600 Subject: [PATCH 11/30] Removed USERSHADOW_SYNC parameter from interface --- ubl-settings-usergroups-user.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 4d12717..4c3cfd1 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -1179,7 +1179,6 @@ - True False 0.019999999552965164 in -- 2.35.1 From 6476b44930d17aff76f992ee1637bd80aac6acc7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 12:51:31 +0600 Subject: [PATCH 12/30] Added 'Default' value to hash combo box --- source/ubl-settings-usergroups.c | 22 ++++++++++++++++++---- source/ubl-settings-usergroups.h | 3 ++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 5ddb99b..3d9902b 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -399,9 +399,13 @@ void on_expiration_clicked(GtkWidget *self, ubl_settings_usergroups_user_window } else { yon_config_register("ADDADM","users","no"); } - char *hash = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PasswordHashCombo)); - if (!yon_char_is_empty(hash)){ - yon_config_register("HASHPASSWD","users",hash); + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->PasswordHashCombo))!=0){ + char *hash = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PasswordHashCombo)); + if (!yon_char_is_empty(hash)){ + yon_config_register("HASHPASSWD","users",hash); + } + }else { + yon_config_remove_by_key("HASHPASSWD"); } } @@ -438,6 +442,16 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"AdditionalSettingsWindow"); gtk_window_set_title(GTK_WINDOW(window->Window),ADDITIONAL_SETTINGS_TITLE_LABEL); + + if (main_config.hash_default_id==-1){ + int size; + config_str ret = yon_config_load(get_default_hash_command,&size); + if (size>0){ + char *hash = ret[0]; + if (hash[strlen(hash)-1]=='\n') hash[strlen(hash)-1]='\0'; + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(window->PasswordHashCombo),yon_char_unite(DEFAULT_USER_LABEL," (",hash,")",NULL)); + } + } int hash_size=0; config_str hash_algos = yon_file_open(hash_list_path,&hash_size); for (int i=1;iPasswordHashCombo),hash); } - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_additional_settings_save),window); @@ -1596,6 +1609,7 @@ void config_init(){ main_config.lock_save_local=0; main_config.groups_size=0; main_config.load_mode=1; + main_config.hash_default_id=-1; main_config.groups = yon_file_open(groups_path,&main_config.groups_size); main_config.users = yon_file_open(users_path,&main_config.users_size); main_config.users_list=NULL; diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 2369238..c2c8dbd 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -36,7 +36,7 @@ #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-usergroups" -#define clear_config_both_command "ubconfig remove TEMP_SECTION TEMP_PATAMETER" +#define get_default_hash_command "ubconfig --raw --source default get [users] HASHPASSWD" #define clear_config_global_command "ubconfig --target global remove TEMP_SECTION TEMP_PATAMETER" #define clear_config_local_command "ubconfig --target system remove TEMP_SECTION TEMP_PATAMETER" @@ -93,6 +93,7 @@ typedef struct { int password_min_length; + int hash_default_id; } config; typedef struct { -- 2.35.1 From c455d129ab7266d4407352019f4a6bdc488071ab Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 12:53:25 +0600 Subject: [PATCH 13/30] Ability to change size of confirmation window --- ubl-settings-usergroups-confirmation.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/ubl-settings-usergroups-confirmation.glade b/ubl-settings-usergroups-confirmation.glade index e171163..d56818e 100644 --- a/ubl-settings-usergroups-confirmation.glade +++ b/ubl-settings-usergroups-confirmation.glade @@ -31,7 +31,6 @@ 450 300 False - False True 450 com.ublinux.ubl-settings-usergroups -- 2.35.1 From db1adeed0c40bd695e79cd84c39678620ae364db Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 22 Jan 2024 12:54:38 +0600 Subject: [PATCH 14/30] Moved separator --- ubl-settings-usergroups.glade | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index 5c7c76d..2ea5df0 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -244,9 +244,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + True - False + True + True + Update users and groups + image13 + False @@ -255,15 +261,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + True - True - True - Update users and groups - image13 - + False False -- 2.35.1 From 22626a2cb8d5e3eaf7214cf549e58f6ac57e6dfd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 23 Jan 2024 09:29:20 +0600 Subject: [PATCH 15/30] Deletion confirmation size and position saving; 'Encrypt all passwords in config' button has been added to additional configuration window --- Makefile | 1 + ....ubl-settings-usergroups.lock-symbolic.svg | 1 + source/ubl-settings-usergroups.c | 11 ++++++++++ source/ubl-settings-usergroups.h | 3 +++ ...tings-usergroups-additional-settings.glade | 22 ++++++++++++++++++- 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 icons/com.ublinux.ubl-settings-usergroups.lock-symbolic.svg diff --git a/Makefile b/Makefile index 82e76b9..ca6fee4 100644 --- a/Makefile +++ b/Makefile @@ -140,6 +140,7 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.cancel-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.profile-settings-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.save-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.lock-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/hash_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/shell_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" diff --git a/icons/com.ublinux.ubl-settings-usergroups.lock-symbolic.svg b/icons/com.ublinux.ubl-settings-usergroups.lock-symbolic.svg new file mode 100644 index 0000000..132b656 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-usergroups.lock-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 3d9902b..5926f1d 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -182,6 +182,7 @@ yon_confirmation_window *yon_delete_confirmation_new(){ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->DeleteCell),"toggled",G_CALLBACK(on_delete_confirmation_delete_check),window); g_signal_connect(G_OBJECT(window->DeleteHomeCell),"toggled",G_CALLBACK(on_delete_confirmation_delete_home_check),window); + yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DeleteConfirmationWindow"); return window; } @@ -342,6 +343,13 @@ void on_groups_multiple_clicked(GtkWidget *self, GtkEntry *output_target){ } +void on_passwords_encrypt(){ + int pid = fork(); + if (!pid){ + exit(system(encrypt_passwords_command)); + } +} + void on_password_change(GtkWidget *self, dictionary *entry_dict){ GtkComboBox *combo = yon_dictionary_get_data(entry_dict->first,GtkComboBox*); GtkEntry *output_target = yon_dictionary_get_data(entry_dict->first->next,GtkEntry*); @@ -437,6 +445,7 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ window->RootPasswordEntry=yon_gtk_builder_get_widget(builder,"RootPasswordEntry"); window->RootPasswordButton=yon_gtk_builder_get_widget(builder,"RootPasswordButton"); window->PasswordHashCombo=yon_gtk_builder_get_widget(builder,"PasswordHashCombo"); + window->EncryptAllPasswordsButton=yon_gtk_builder_get_widget(builder,"EncryptAllPasswordsButton"); window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton"); window->AcceptButton=yon_gtk_builder_get_widget(builder,"AcceptButton"); @@ -502,6 +511,8 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ g_signal_connect(G_OBJECT(window->DefaultPasswordButton),"clicked",G_CALLBACK(on_password_change),default_dict); g_signal_connect(G_OBJECT(window->RootPasswordButton),"clicked",G_CALLBACK(on_password_change),root_dict); + g_signal_connect(G_OBJECT(window->EncryptAllPasswordsButton),"clicked",G_CALLBACK(on_passwords_encrypt),NULL); + g_signal_connect(G_OBJECT(window->RootPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->RootPasswordButton); g_signal_connect(G_OBJECT(window->PasswordHashCombo),"changed",G_CALLBACK(on_hash_changed),window); g_signal_connect(G_OBJECT(window->DefaultPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->DefaultPasswordButton); diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index c2c8dbd..2bbbd5c 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-usergroups" +#define encrypt_passwords_command "/usr/lib/ublinux/functions globalconf_convert_pass_plain_to_hash" #define get_default_hash_command "ubconfig --raw --source default get [users] HASHPASSWD" #define clear_config_global_command "ubconfig --target global remove TEMP_SECTION TEMP_PATAMETER" #define clear_config_local_command "ubconfig --target system remove TEMP_SECTION TEMP_PATAMETER" @@ -168,6 +170,7 @@ typedef struct{ GtkWidget *PasswordHashCombo; GtkWidget *CancelButton; GtkWidget *AcceptButton; + GtkWidget *EncryptAllPasswordsButton; } ubl_settings_usergroups_additional_settings_window; typedef struct{ diff --git a/ubl-settings-usergroups-additional-settings.glade b/ubl-settings-usergroups-additional-settings.glade index 7d7745b..b275db0 100644 --- a/ubl-settings-usergroups-additional-settings.glade +++ b/ubl-settings-usergroups-additional-settings.glade @@ -23,6 +23,11 @@ False com.ublinux.ubl-settings-usergroups.edit-symbolic + + True + False + com.ublinux.ubl-settings-usergroups.lock-symbolic + 600 False @@ -280,7 +285,7 @@ False True - 3 + 2 @@ -329,6 +334,21 @@ 1 + + + Encrypt all passwords + True + True + True + start + image5 + + + False + True + 2 + + -- 2.35.1 From d55bdd2a2051e013c40ef1e71bb3e6ee2d45f0bc Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 23 Jan 2024 10:40:27 +0600 Subject: [PATCH 16/30] Added administrators field --- source/ubl-settings-usergroups.c | 15 ++++- source/ubl-settings-usergroups.h | 2 + ubl-settings-usergroups-group-creation.glade | 63 +++++++++++++++++++- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 5926f1d..4e79a00 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -589,6 +589,7 @@ void on_group_save(GtkWidget *self, dictionary *dict){ char *gid = NULL; char *non_unique = NULL; char *gsystem = NULL; + char *admins = NULL; char *password = NULL; int gid_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck)); if (gid_active){ @@ -616,6 +617,7 @@ void on_group_save(GtkWidget *self, dictionary *dict){ return; } + admins = (char*)gtk_entry_get_text(GTK_ENTRY(window->AdminGroupsEntry)); int non_unique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UnuniqueGIDCheck)); if(non_unique_active){ non_unique=" --non-unique"; @@ -631,6 +633,7 @@ void on_group_save(GtkWidget *self, dictionary *dict){ ":",yon_char_return_if_exist(gid,"x"), ":",yon_char_return_if_exist(non_unique,""), yon_char_return_if_exist(gsystem,""), + ":",yon_char_return_if_exist(admins,"x"), ":",yon_char_return_if_exist(password,"x"), NULL); yon_config_register(GROUPADD(group_name),"users",final_string); @@ -661,6 +664,8 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group window->PasswordEntry=yon_gtk_builder_get_widget(builder,"PasswordEntry"); window->ChangePasswordButton=yon_gtk_builder_get_widget(builder,"ChangePasswordButton"); window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel"); + window->AdminGroupsEntry=yon_gtk_builder_get_widget(builder,"AdminGroupsEntry"); + window->AdminGroupsButton=yon_gtk_builder_get_widget(builder,"AdminGroupsButton"); gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),GROUPS_TITLE_LABEL); @@ -674,6 +679,7 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group g_signal_connect(G_OBJECT(window->PasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->ChangePasswordButton); g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->userGroupsEntry); + g_signal_connect(G_OBJECT(window->AdminGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->AdminGroupsEntry); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(on_GID_update),window); g_signal_connect(G_OBJECT(window->SystemGroupCheck),"toggled",G_CALLBACK(on_GID_update),window); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button),window->SystemGroupCheck); @@ -1555,8 +1561,13 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ } if (size>3){ if (strcmp(parsed[3],"")&&strcmp(parsed[3],"x")){ - gtk_entry_set_text(GTK_ENTRY(window->PasswordEntry),parsed[3]); - gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),3); + gtk_entry_set_text(GTK_ENTRY(window->AdminGroupsEntry),parsed[3]); + } + } + if (size>4){ + if (strcmp(parsed[4],"")&&strcmp(parsed[4],"x")){ + gtk_entry_set_text(GTK_ENTRY(window->PasswordEntry),parsed[4]); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),4); } else { gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),1); } diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 2bbbd5c..1acc0be 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -190,6 +190,8 @@ typedef struct{ GtkWidget *PasswordEntry; GtkWidget *ChangePasswordButton; GtkWidget *userTitleNameLabel; + GtkWidget *AdminGroupsEntry; + GtkWidget *AdminGroupsButton; } ubl_settings_usergroups_group_creation_window; typedef struct{ diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 8e5faf1..9d16064 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -13,6 +13,11 @@ False com.ublinux.ubl-settings-usergroups.edit-symbolic + + True + False + com.ublinux.ubl-settings-usergroups.profile-settings-symbolic + True False @@ -146,7 +151,7 @@ False True - 2 + 1 @@ -198,7 +203,7 @@ False True - 4 + 2 @@ -258,6 +263,58 @@ 1 + + + True + False + 5 + + + True + False + Group administrators: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 2 + + + + + True + True + True + image3 + + + + False + True + 3 + + + + + False + True + 2 + + True @@ -330,7 +387,7 @@ False True - 2 + 3 -- 2.35.1 From a7f81a1d5b8b70beb3af22fd8150540ae673ecf9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 23 Jan 2024 10:41:01 +0600 Subject: [PATCH 17/30] Added screenshot --- screenshot/screenshot.png | Bin 0 -> 75655 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshot/screenshot.png diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f1594a7f0e9a6dcd4a50f6b2f60a9277a7b19a3d GIT binary patch literal 75655 zcma&Nby$?$7d8r_grri^AWDdI*C4Gl(yerZbPXU#NGn}42m*qHbc1wv3^gF#3_T3_ zJ-qMF_dDm0b6sbyi-8&DdG^|S-|JrYT6@iBH5GaMhm;S|(9rPTyq0;3hK7McL%XMo zjS0LX?80;m{JQTd^+ppLc=%zPhohmTI+_>11*uWkbf_e3g^5p+iK2ZR;Gt@?w5i#p(b>c zjArupw&(ZMwWM0nKDBWwFGYW=(0%&fZQW#FhA$%J9`opF z%$jgZj)u#jsq7Cuotf|@4GGNv@mY|ndATshBwc7mGX1wIB1Ee?qy#%^ffC4u%Prm) zSGA2tnKLhMI^({71ik7p&nz*J7(Iv z@kB#q$bAk6^>U&~82$E(m`|+pxSb5m$Lg$RShxuA%GJe+V5$+boO!p)oM7}<&ZnuP zAP*bNmo`6`h!tLIFOdH`LioP(Z7|`t?1Q$70MR+wx-1KWfq~v3Q#T*V5CJN*L=fGa zxN%ZFl@0d&h6Mj)ZJ40Nc@Nl}G=e>l!Wr!ToOH3}bKE_2exfp`*EqKWnT?M$>Y1-D zEz*TfN2#TnC*-j2fGD?!Y7O`bfjl~Hnq*6^@M;a>HM|4j^1M3F_fNvdrOQ>xCT&J0 zs)%e;G!j{c?yc3chJDN4HdWzYx4-o`wnA2x2i*1%YflGB>bi_>`9!bBcL#cVmr)x0 z_O`ZLZnQ=Zj|PR=e~>{zcqY9zQe~k(W-|wS;i)8et{7@n%wdJ_8J0Yv=`?H`d}0Nn z`1bKVNq-+X%<+=ipl|JRaVrC@<6~|6nWB1?@6bO6zT9U1M6?l)=_zhdV?SkLWogcH z_*HS(^fO>`o26<6uj`p1CIO`kgbkXMWO=qX)80+j7*HMQ(W*{LEGrB4`twcxM?rDd z5_arR^9CE?a$kS<*1*=(gGpIaa;v=K*NA%w_bW z!rb4T3nLd!gVnE@G~Z2fcB^qcZS*ppbY!+wLnjdni!4Lp4o@Dy)*o5->?=Gn+ptA~0W=gmH}{tPZ8NCLc+KAHM;EX%xxX$4rnfUMA23#4z-AU_goX zVmoJdzBv3&`f^zN zkb`B0j2DS?*+Oq-{=Up58+r**!w&2HbZ>sKzZ0a&7Tp>{2nXh(`uf|Ar_OsS-}{qJ ztu;AxXedTI*1C22y5M$kl)Hs6^|>|IWP_{CJkKL1??+6oL?*IyY7Lq}DQT2cdNr2O zH$ICCP3Gq2JpN`OK#5EeBK6$C?$%IW5efeB-FrDQC_<}Ye&In&Gjv= zZ=uOo_oTPmtH~HmE{1k68PO=ZoU*`{cdfV3ae4NgInDAyt{-r@e?ct9&ThW3dQglI>#FDfsax;$p@9#bfKH_6IN;K5K+LR(Zs*wV z#H9ISr|lYH%e8XDN(fOws^{rsf+M`|=y~L+1G8$zpH;n=<1=p6`~A$uemEFdgk7*% z1xUXv*Aw%tWm$VR_`~0|hbyW4RaDC9PihLc870O= z*viaon*PG=LA>LjnTm&Y2hnwagj*D=9>u&y9Mhf(Wp7X5cGuTF;pzPHlc{MoNZ z_|NbAfP4_*jtwg+7bbi}KRcr)Epu|8H^#Io4oh^y3H?GgpePC3!a}nt&(87#x-jzq zwP(M{r3|r^n23?{w`d$XpdDCo=b8)m*0SR3iu}W_pPcf$4KAp++uPeI{Jts*HducC zDw!gkXT`az^+zdU?v%WiL(4gY3#zQc;td|(iU@90FUov_{wHKO*8l+K!o zvM=>sYIjA^3~NY$d6xVsC@2iw;qG|ULf8THzc+SZ6^?_pnpzfJyTW(a@8`Ut3GB~T zG28t0zVUp%;%cYn)@0uIP;(yVpp(yul?g-iYDNXPsa;4{yQ@GW@ul&vz$0Sjo}Pi#8!S4@j?K{o$C<}p&U!|3SUEVl_6Srz zc&$w8v~A&0b* z=4->+9u}KbxJ|;`-+yYxrm9_Tu_8x5KSIPlb2+;)Gd=x#o0RR`9zOfYomA>sG8C$+ zp^*bpcmXkRYKafF!1CIN7G&Mj`VB|IRb4e0a}8?BZBZ_?s0#^R+mk0M8A3w|HsfCF zoB?uLlb?{w1@nvf+kUm2Cg)q-yR&tfSajYb@!4v&*3bUoV*rtl-fBUvTUwj}bqBtJ zV;~o4TrZCU0t&j1G)Y2cDoWnX9BJJTmQ3O_=_DP`<8mI6g+p{W4OVaK1XqP|3J*RQ zo!=g!hU^`Chn2mQ3Ps3Q(>3jDO6b4e|9z0qFi^-RbuHZiKFXxvp=M}|{vtZ92x3$N zGd?p6$}*dG6jZ(5&DV7hh={o0vY6#FeDI(a?g%)YmB9|^cOE`f3dl}-j8B}F@TYe1 zZ^ZEu5~W+`M-iW|VgXN^q@HepQnk3@mR#MlE&Ta}-v2pFZjy!=OT!5h}h!a|LgSF2`BK=2}FG8#C{k)NqN zbj3`@8x3oPzLbz;AyG=RGBX%{D=Epj--raENqwVl@*#D(npS5ra$yD7ie6$-R?d

LcjrNT!CyIUq73{!2VZjPZ5F5X4OEfabP^s3 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ÑT*VNVlHxmKM8;2( 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 YB8pKxJd-UK%5Shh{~*6=-{Zgh4Qa+{5dZ)H literal 0 HcmV?d00001 -- 2.35.1 From 4e2a3ea9d0c161ff588a66dee50213b60712589d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 24 Jan 2024 18:15:54 +0600 Subject: [PATCH 18/30] Interface edits, localisation for chenged interface --- source/ubl-settings-usergroups.c | 114 ++++++++++++++---- source/ubl-settings-usergroups.h | 7 ++ source/ubl-strings.h | 3 + ...tings-usergroups-additional-settings.glade | 2 +- ubl-settings-usergroups-password.glade | 16 ++- ubl-settings-usergroups-user.glade | 71 +++++++++-- ubl-settings-usergroups.glade | 2 +- ubl-settings-usergroups.pot | 74 +++++++----- ubl-settings-usergroups_ru.po | 56 +++++---- 9 files changed, 254 insertions(+), 91 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 4e79a00..cf33de2 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -97,6 +97,19 @@ void on_config_global_load(GtkWidget *self, main_window *widgets){ yon_interface_update(widgets); } +void yon_samba_sync_proceed(){ +if (main_config.sync_users){ + for (int i=0;i-1){ + config_str temp = yon_char_parsed_rip(main_config.sync_users,&main_config.sync_size,sync_place); + free(main_config.sync_users); + main_config.sync_users = temp; + } + +} + +int yon_samba_sync_get(char *user){ + int sync_place = yon_char_parsed_check_exist(main_config.sync_users,main_config.sync_size,yon_char_append(user,":")); + if (sync_place>-1){ + if (!main_config.sync_users) + return 0; + int active = main_config.sync_users[sync_place][strlen(main_config.sync_users[sync_place])-1]==':'? 1:2; + return active; + } + return 0; +} + void on_delete_confirmation_delete_home_check(GtkCellRenderer *self, char *path, yon_confirmation_window *window){ GtkTreeIter iter; gboolean status; @@ -229,11 +270,12 @@ yon_savasettings_window *yon_saving_settings_new(){ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); gtk_widget_show(window->Window); + yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"savingSettingsWindow"); char *string = yon_config_get_by_key("SAVE_ROOTCOPY_CHANGES"); if (!yon_char_is_empty(string)&&strstr(string,"/var/lib/samba")){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->SambaCheck),1); } - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),SYSTEM_SAVEMODE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savemode",SYSTEM_SAVEMODE_LABEL,BACKGROUND_IMAGE_INFO_TYPE); return window; } @@ -354,11 +396,6 @@ void on_password_change(GtkWidget *self, dictionary *entry_dict){ GtkComboBox *combo = yon_dictionary_get_data(entry_dict->first,GtkComboBox*); GtkEntry *output_target = yon_dictionary_get_data(entry_dict->first->next,GtkEntry*); ubl_settings_usergroups_password_window *window = yon_ubl_settings_usergroups_password_new(); - int active = gtk_combo_box_get_active(combo); - if (active == 2) - gtk_widget_hide(window->HashBox); - else if (active==3) - gtk_widget_hide(window->PasswordBox); dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); yon_dictionary_add_or_create_if_exists_with_data(dict,"target",output_target); @@ -796,7 +833,9 @@ void on_password_changed(GtkEntry *self, ubl_settings_usergroups_password_window char *self_text = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); char *pair_text = (char*)gtk_entry_get_text(GTK_ENTRY(window->RepeatPasswordEntry)); if ((!yon_char_is_empty(self_text)&&!yon_char_is_empty(pair_text))&&strcmp(self_text,pair_text)){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_mismatch",PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else if (strlen(self_text)StatusBox),"password_short",PASSWORD_SHORT_LABEL(yon_char_from_int(main_config.password_min_length)),BACKGROUND_IMAGE_FAIL_TYPE); } else { yon_ubl_status_box_despawn_infinite(GTK_CONTAINER(window->StatusBox)); } @@ -805,18 +844,16 @@ void on_password_changed(GtkEntry *self, ubl_settings_usergroups_password_window void on_password_accept(GtkWidget *self, dictionary *dict){ ubl_settings_usergroups_password_window *window = yon_dictionary_get_data(dict->first,ubl_settings_usergroups_password_window*); GtkEntry *entry = yon_dictionary_get_data(dict->first->next,GtkEntry*); - if (gtk_widget_get_visible(window->HashBox)){ - char *pasted_hash = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordHashEntry)); - if (yon_char_is_empty(pasted_hash)){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - return; - } else { + char *pasted_hash = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordHashEntry)); + if (!yon_char_is_empty(pasted_hash)){ gtk_entry_set_text(entry,pasted_hash); - } } else { char *password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry))); if (yon_char_is_empty(password)){ - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_empty",EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } else if (password[0]=='%'&&password[1]=='%'){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_wrong",EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return; } if (strlen(password)RepeatPasswordEntry)); if (!strcmp(password,password_check)){ - char *passwd_hash = g_malloc0(101); - FILE *fl = popen(password_hash_get_command(password),"r"); - fgets(passwd_hash,100,fl); - if (passwd_hash[strlen(passwd_hash)-1]=='\n') passwd_hash[strlen(passwd_hash)-1]='\0'; - gtk_entry_set_text(entry,passwd_hash); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->NoEncriptionCheck))){ + char *pasw=yon_char_append("%%",password); + free(password); + password=pasw; + } + gtk_entry_set_text(GTK_ENTRY(entry),password); } else { - yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_mismatch",PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return; } } @@ -848,6 +886,7 @@ ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_ne window->PasswordHashEntry=yon_gtk_builder_get_widget(builder,"PasswordHashEntry"); window->HashBox=yon_gtk_builder_get_widget(builder,"HashBox"); window->PasswordBox=yon_gtk_builder_get_widget(builder,"PasswordBox"); + window->NoEncriptionCheck=yon_gtk_builder_get_widget(builder,"NoEncriptionCheck"); window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); @@ -1010,7 +1049,7 @@ void on_UID_update(GtkWidget *self, ubl_settings_usergroups_user_window *window) if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){ int config_size=0; int final_size=0; - config_str config_users = yon_config_get_all_by_key("USERADD",&config_size); + config_str config_users = yon_config_get_all_by_key("USERADD[",&config_size); yon_char_parsed_prepend_strings(config_users,config_size,":"); config_str final = yon_char_parsed_merge(main_config.users,main_config.users_size,config_users,config_size,&final_size); long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck))?0:main_config.MINGID; @@ -1066,13 +1105,15 @@ void on_user_save(GtkWidget *self, dictionary *dict){ char *create_system_user = NULL; char *create_ununique = NULL; char *do_not_check = NULL; - char *samba_sync = NULL; + int samba_sync = 0; + int samba_password_sync = 0; char *deactivate = NULL; char *extra_options = NULL; char *useradd_boot = ""; char *useradd_shutdown = ""; char *usershadow_boot = ""; char *usershadow_shutdown = ""; + int uid_auto_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck)); if (uid_auto_active){ @@ -1181,8 +1222,19 @@ void on_user_save(GtkWidget *self, dictionary *dict){ if (do_not_check_actve) do_not_check = " --badnames"; - int samba_sync_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck)); - if (samba_sync_active); + samba_sync = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck)); + samba_password_sync = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck)); + if (samba_sync){ + if (yon_samba_sync_get(login)==2) + yon_samba_sync_remove(login); + yon_samba_sync_add(login,NULL); + } else if (samba_password_sync){ + if (yon_samba_sync_get(login)==1) + yon_samba_sync_remove(login); + yon_samba_sync_add(login,password); + } else { + yon_samba_sync_remove(login); + } int deactivate_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userDeactivatedCheck)); if (deactivate_active); @@ -1215,6 +1267,7 @@ void on_user_save(GtkWidget *self, dictionary *dict){ usershadow_shutdown = "shutdown"; } + char *useradd_sync_string = NULL; useradd_sync_string = yon_char_unite(useradd_boot,!yon_char_is_empty(useradd_boot)?",":"",useradd_shutdown,NULL); char *usershadow_sync_string = NULL; @@ -1306,6 +1359,7 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ window->userCreateUnuniqueCheck=yon_gtk_builder_get_widget(builder,"userCreateUnuniqueCheck"); window->userDontCheckCheck=yon_gtk_builder_get_widget(builder,"userDontCheckCheck"); window->userSyncSAMBACheck=yon_gtk_builder_get_widget(builder,"userSyncSAMBACheck"); + window->userSyncSAMBAPasswordCheck=yon_gtk_builder_get_widget(builder,"userSyncSAMBAPasswordCheck"); window->userDeactivatedCheck=yon_gtk_builder_get_widget(builder,"userDeactivatedCheck"); window->userExtraOptionsEntry=yon_gtk_builder_get_widget(builder,"userExtraOptionsEntry"); window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); @@ -1480,6 +1534,12 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ } } + int samba_sync = yon_samba_sync_get(name); + if (samba_sync==1){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),1); + } else if (samba_sync==2){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),1); + } free(parameters); parameters=yon_char_parse(yon_config_get_by_key(USERSHADOW(name)),&parsed_size,":"); gtk_entry_set_text(GTK_ENTRY(window->userPasswordChangedEntry),parsed_size>0?parameters[0]:""); @@ -1637,6 +1697,8 @@ void config_init(){ main_config.users_list=NULL; main_config.groups_list=NULL; main_config.password_min_length=6; + main_config.sync_users = NULL; + main_config.sync_size=0; int login_size; config_str login_defs = yon_file_open(uid_path,&login_size); for (int i=0;iTrue True True - start + end image5

diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index 9ea91b3..e5dbfc0 100644 --- a/ubl-settings-usergroups-password.glade +++ b/ubl-settings-usergroups-password.glade @@ -163,6 +163,20 @@ 0
+ + + Do not encrypt password + True + True + False + True + + + False + True + 1 + + True @@ -199,7 +213,7 @@ True True - 1 + 2 diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 4c3cfd1..15e8121 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -323,7 +323,7 @@ False True - 3 + 4 @@ -392,7 +392,7 @@ False True - 4 + 5 @@ -443,7 +443,7 @@ False True - 5 + 6
@@ -469,14 +469,67 @@ True False vertical + 5 - - Sync with SAMBA user + True - True - False - start - True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + 5 + + + Sync user + True + True + False + start + True + + + False + True + 0 + + + + + Sync user with password + True + True + False + start + True + + + False + True + 1 + + + + + + + + + True + False + Samba + + False diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index 2ea5df0..88e0262 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -276,7 +276,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True True - Update users and groups + Additional saving configuration image4 - - - False - True - 3 - - -
- - False - True - 2 - - -
- - False - True - 1 - -
- - - True - False - 5 - 5 - 0 - in - - - True - False - 5 - 5 - 5 + vertical True False + 5 + 5 vertical 5 - - - Create group with ununique GID - True - False - True - False - True - - - False - True - 0 - - - - - Create system group - True - True - False - True - - - False - True - 1 - - True False 5 - + True False - Group administrators: + Group id: 0 @@ -282,37 +91,38 @@ - + + Automatically True True + False + True + True - True + False True 2 - + True + False True - True - image3 - + number - False + True True - 3 + 4 False True - 2 + 0 @@ -321,10 +131,11 @@ False 5 - + True False - Password: + Group name: + 0 False @@ -333,16 +144,11 @@ - + True - False - 0 - - Default - No password required - Set a password - Encrypted password - + True + com.ublinux.ubl-settings-usergroups.profile-symbolic + group_name True @@ -350,15 +156,35 @@ 1 + + + False + True + 1 + + + + + True + False + 5 - + + True + False + Group users: + 0 + + + False + True + 0 + + + + True - False True - False - * - com.ublinux.ubl-settings-usergroups.key-symbolic - ******** True @@ -367,12 +193,11 @@ - + True - False True True - image2 + image1 @@ -387,62 +212,279 @@ False True - 3 + 2 + + False + True + 0 + + + + + True + False + 5 + 5 + 0 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + 5 + + + Create group with ununique GID + True + False + True + False + True + + + False + True + 0 + + + + + Create system group + True + True + False + True + + + False + True + 1 + + + + + True + False + 5 + + + True + False + Group administrators: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 2 + + + + + True + True + True + image3 + + + + False + True + 3 + + + + + False + True + 2 + + + + + True + False + 5 + + + True + False + Password: + + + False + True + 0 + + + + + True + False + 0 + + Default + No password required + Set a password + Encrypted password + + + + True + True + 1 + + + + + True + False + True + False + * + com.ublinux.ubl-settings-usergroups.key-symbolic + ******** + + + True + True + 2 + + + + + True + False + True + True + image2 + + + + False + True + 3 + + + + + False + True + 3 + + + + + + + + + True + False + Additional configuration + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + + + True + False + Extra options: + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 2 + - - - True - False - Additional configuration - - - - - False - True - 3 - - - - - True - False - 5 - 5 - 5 - + True False - Extra options: + Main - False - True - 0 + False - + + + + True - True + False + Syncronization - True - True 1 + False False True - 4 + 1 diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index 4e5ffc5..126fddd 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -600,40 +600,44 @@ msgstr "" msgid "Password hash:" msgstr "" -#: source/ubl-strings.h:166 -msgid "Additional configuration of service parameter saving" +#: source/ubl-strings.h:164 +msgid "Do not encrypt password" msgstr "" #: source/ubl-strings.h:167 +msgid "Additional configuration of service parameter saving" +msgstr "" + +#: source/ubl-strings.h:168 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" msgstr "" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:169 msgid "For system save mode \"Sandbox\"" msgstr "" -#: source/ubl-strings.h:171 +#: source/ubl-strings.h:172 msgid "User deletion" msgstr "" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:173 msgid "Confirm user(-s) deletion:" msgstr "" -#: source/ubl-strings.h:173 +#: source/ubl-strings.h:174 msgid "Chosen" msgstr "" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:175 msgid "User" msgstr "" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:176 msgid "Home directory" msgstr "" -#: source/ubl-strings.h:176 +#: source/ubl-strings.h:177 msgid "Delete home directory" msgstr "" diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 7cf5b55..037acb2 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -635,11 +635,15 @@ msgstr "Подтверждение пароля:" msgid "Password hash:" msgstr "Хэш пароля:" -#: source/ubl-strings.h:166 +#: source/ubl-strings.h:164 +msgid "Do not encrypt password" +msgstr "Не шифровать пароль" + +#: source/ubl-strings.h:167 msgid "Additional configuration of service parameter saving" msgstr "Дополнительные настройки сохранения параметров сервисов" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:168 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" @@ -647,30 +651,30 @@ msgstr "" "При каждом завершении работы ОС сохранять изменения (root)/var/lib/samba\n" "в (hd)/ublinux-data/rootcopy/" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:169 msgid "For system save mode \"Sandbox\"" msgstr "Для режима сохранения системы \"Песочница\"" -#: source/ubl-strings.h:171 +#: source/ubl-strings.h:172 msgid "User deletion" msgstr "Удаление пользователя(-лей)" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:173 msgid "Confirm user(-s) deletion:" msgstr "Подтвердите удаление пользователя (-ей):" -#: source/ubl-strings.h:173 +#: source/ubl-strings.h:174 msgid "Chosen" msgstr "Выбран" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:175 msgid "User" msgstr "Пользователь" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:176 msgid "Home directory" msgstr "Домашний каталог" -#: source/ubl-strings.h:176 +#: source/ubl-strings.h:177 msgid "Delete home directory" msgstr "Удалить домашний каталог" -- 2.35.1 From d2bd4709250873bebf9e6be6196de16d22b13888 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 26 Jan 2024 18:02:01 +0600 Subject: [PATCH 23/30] Added new tab at group window & localisation --- source/CMakeLists.txt | 11 -- source/ubl-settings-usergroups.c | 24 ++- source/ubl-settings-usergroups.h | 2 + source/ubl-strings.h | 3 + ubl-settings-usergroups-group-creation.glade | 47 ++++- ubl-settings-usergroups.pot | 180 ++++++++++--------- ubl-settings-usergroups_ru.po | 162 +++++++++-------- 7 files changed, 257 insertions(+), 172 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 30a24e5..1dc287a 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -83,17 +83,6 @@ set(LIBRARIES add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) -list(FIND LIBRARIES "vte-2.91" VTE_FOUND_INDEX) -list(FIND LIBRARIES "webkit" WEBKIT_FOUND_INDEX) - -if(NOT VTE_FOUND_INDEX EQUAL -1) - message(STATUS "Библиотека VTE не добавлена в target_link_libraries()") - add_definitions(-DVTE_INCLUDE) -endif() - -if(NOT WEBKIT_FOUND_INDEX EQUAL -1) - add_definitions(-DWEBKIT_INCLUDE) -endif() target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) set_source_files_properties( diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 7520fd4..9fc47bc 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -234,6 +234,16 @@ void yon_delete_confirmation_open(main_window *widgets){ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(yon_delete_confirmation_save),dict); + GtkTreeModel *model = GTK_TREE_MODEL(widgets->UsersList); + GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model); + int chosen_size=0; + config_str chosen = NULL; + for (int i=0;iUsersList),&iter); for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->UsersList),&iter)){ char *name,*parameters,*homedir=NULL; @@ -252,7 +262,7 @@ void yon_delete_confirmation_open(main_window *widgets){ int status=0; if (homedir) status=1; gtk_list_store_append(window->list,&itar); - gtk_list_store_set(window->list,&itar,1,name,2,homedir,3,0,4,status,-1); + gtk_list_store_set(window->list,&itar,0,yon_char_parsed_check_exist(chosen,chosen_size,name)>-1?1:0,1,name,2,homedir,3,0,4,status,-1); free(name); free(parameters); free(homedir); @@ -665,6 +675,13 @@ void on_group_save(GtkWidget *self, dictionary *dict){ gsystem=" --system"; } else gsystem=""; + int shutdown_sync_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupaddShutdownCheck)); + if (shutdown_sync_active){ + yon_config_register(GROUPADD_SYNC(group_name),"users","shutdown"); + } else { + yon_config_remove_by_key(GROUPADD_SYNC(group_name)); + } + password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); final_string = yon_char_unite(yon_char_return_if_exist(group_users,"x"), ":",yon_char_return_if_exist(gid,"x"), @@ -703,6 +720,7 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel"); window->AdminGroupsEntry=yon_gtk_builder_get_widget(builder,"AdminGroupsEntry"); window->AdminGroupsButton=yon_gtk_builder_get_widget(builder,"AdminGroupsButton"); + window->GroupaddShutdownCheck=yon_gtk_builder_get_widget(builder,"GroupaddShutdownCheck"); gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),GROUPS_TITLE_LABEL); @@ -1652,6 +1670,10 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),1); } } + char *sync = yon_config_get_by_key(GROUPADD_SYNC(name)); + if (sync){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->GroupaddShutdownCheck),1); + } } else { yon_ubl_status_box_render(LOADING_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index f010b4c..d2dcf13 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -59,6 +59,7 @@ #define USERSHADOW(user) yon_char_unite("USERSHADOW[",user,"]",NULL) #define USERADD_SYNC(user) yon_char_unite("USERADD_SYNC[",user,"]",NULL) #define USERSHADOW_SYNC(user) yon_char_unite("USERSHADOW_SYNC[",user,"]",NULL) +#define GROUPADD_SYNC(user) yon_char_unite("GROUPADD_SYNC[",user,"]",NULL) #define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) @@ -197,6 +198,7 @@ typedef struct{ GtkWidget *userTitleNameLabel; GtkWidget *AdminGroupsEntry; GtkWidget *AdminGroupsButton; + GtkWidget *GroupaddShutdownCheck; } ubl_settings_usergroups_group_creation_window; typedef struct{ diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 5f49cfb..fc8bc19 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -85,6 +85,9 @@ #define CREATE_SYSTEM_GROUP_LABEL _("Create system group") #define ENCRYPTED_PASSWORD_LABEL _("Encrypted password") #define ADDITIONAL_CONFIGURATION_LABEL _("Additional configuration") +#define GROUPADD_SYNC_LABEL _("Group configuration synchronization") +#define GROUPADD_SHUTDOWN_LABEL _("When shutting down the system, save the group into the configuration") +#define ADMINISTRATORS_LABEL _("Group administrators:") //ubl-settings-usergroups-group.glade #define DEFAULT_GROUPS_TITLE_LABEL _("Default groups") diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 96cbf4a..926414e 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -467,7 +467,52 @@ - + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + + + When shutting down the system, save the group into the configuration + True + True + False + True + + + False + True + 0 + + + + + + + + + True + False + Group configuration synchronization + + + + + 1 + diff --git a/ubl-settings-usergroups.pot b/ubl-settings-usergroups.pot index 126fddd..407478a 100644 --- a/ubl-settings-usergroups.pot +++ b/ubl-settings-usergroups.pot @@ -1,20 +1,20 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. +# Language translations for ubl-settings-usergroups package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-usergroups package. +# UBLinux Team , 2022 # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: ubl-settings-usergroups 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-24 18:10+0600\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2023-05-22 16:12+0600\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: source/ubl-strings.h:1 @@ -319,325 +319,337 @@ msgstr "" msgid "Additional configuration" msgstr "" +#: source/ubl-strings.h:88 +msgid "Group configuration synchronization" +msgstr "" + +#: source/ubl-strings.h:89 +msgid "When shutting down the system, save the group into the configuration" +msgstr "" + #: source/ubl-strings.h:90 +msgid "Group administrators:" +msgstr "" + +#: source/ubl-strings.h:93 msgid "Default groups" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 msgid "Main group" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:95 msgid "Additional groups" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:96 msgid "Choose groups" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:97 msgid "Choose users" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:100 msgid "System users and groups" msgstr "" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:101 msgid "Blocked" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:102 msgid "Username" msgstr "" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:103 msgid "" "Primary\n" "group" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:104 msgid "" "Home\n" "directory" msgstr "" -#: source/ubl-strings.h:102 source/ubl-strings.h:108 +#: source/ubl-strings.h:105 source/ubl-strings.h:111 msgid "Group" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:106 msgid "Update the system users and groups list" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:107 msgid "Toggle system groups and users" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:109 msgid "Password mismatch" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "Password must be at least" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "characters" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:112 msgid "" "Days until\n" "warning" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:113 msgid "" "Days\n" "without activity" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:114 msgid "" "Shell\n" "path" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:115 msgid "" "Password has\n" "been changed" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:116 msgid "" "Expiration\n" "date" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:117 msgid "" "Password change\n" "interval (min)" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:118 msgid "" "Password change\n" "interval (max)" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:121 msgid "Add user" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:122 msgid "Configure user" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:123 msgid "Set" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:124 msgid "Empty important field" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:125 msgid "Loading has failed" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:126 msgid "Login name" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:127 msgid "Additional groups:" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:128 msgid "Password configuration" msgstr "" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:129 msgid "Password has been changed:" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:130 msgid "expiration date:" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:131 msgid "Password change interval: minimum" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:132 msgid "days, maximum" msgstr "" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:133 msgid "days" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:134 msgid "Days until warning:" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:135 msgid "Days without activity:" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:136 msgid "Force change at next login" msgstr "" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:137 msgid "User shell:" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:138 msgid "Home directory:" msgstr "" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:139 msgid "Don't set" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:140 msgid "Create system user" msgstr "" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:141 msgid "Create user with ununique (repeating) UID" msgstr "" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:142 msgid "Do not check login for compliance with character rules" msgstr "" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:143 msgid "Temporary deactivation" msgstr "" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:144 msgid "Save" msgstr "" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:145 msgid "login_name" msgstr "" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:146 msgid "group_name" msgstr "" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:147 msgid "User name" msgstr "" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:148 msgid "Sync user" msgstr "" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:149 msgid "Sync user with password" msgstr "" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:150 msgid "Encrypt all passwords" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:152 msgid "User configuration" msgstr "" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:153 msgid "User configuration synchronization" msgstr "" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:154 msgid "During system startup, load the user from the configuration" msgstr "" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:155 msgid "When shutting down the system, save the user into the configuration" msgstr "" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:156 msgid "User password configuration syncronization" msgstr "" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:157 msgid "" "During system startup, load the user's parameters from the configuration" msgstr "" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:158 msgid "" "When shutting down the system, save the user's parameters into the " "configuration" msgstr "" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:160 msgid "Main" msgstr "" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:161 msgid "Additional" msgstr "" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:162 msgid "Syncronization" msgstr "" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:165 msgid "Repeat password:" msgstr "" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:166 msgid "Password hash:" msgstr "" -#: source/ubl-strings.h:164 +#: source/ubl-strings.h:167 msgid "Do not encrypt password" msgstr "" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:170 msgid "Additional configuration of service parameter saving" msgstr "" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:171 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" msgstr "" -#: source/ubl-strings.h:169 +#: source/ubl-strings.h:172 msgid "For system save mode \"Sandbox\"" msgstr "" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:175 msgid "User deletion" msgstr "" -#: source/ubl-strings.h:173 +#: source/ubl-strings.h:176 msgid "Confirm user(-s) deletion:" msgstr "" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:177 msgid "Chosen" msgstr "" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:178 msgid "User" msgstr "" -#: source/ubl-strings.h:176 +#: source/ubl-strings.h:179 msgid "Home directory" msgstr "" -#: source/ubl-strings.h:177 +#: source/ubl-strings.h:180 msgid "Delete home directory" msgstr "" diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 037acb2..9c1c79f 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ubl-ubl-settings-usergroups 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-24 18:10+0600\n" +"POT-Creation-Date: 2023-05-22 16:12+0600\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -335,39 +335,51 @@ msgstr "Зашифрованный пароль" msgid "Additional configuration" msgstr "Дополнительные настройки" +#: source/ubl-strings.h:88 +msgid "Group configuration synchronization" +msgstr "Синхронизация настроек группы" + +#: source/ubl-strings.h:89 +msgid "When shutting down the system, save the group into the configuration" +msgstr "При завершении работы системы сохранить группу в конфигурацию" + #: source/ubl-strings.h:90 +msgid "Group administrators:" +msgstr "Администраторы группы:" + +#: source/ubl-strings.h:93 msgid "Default groups" msgstr "Группы пользователей по умолчанию" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:94 msgid "Main group" msgstr "Основная группа" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:95 msgid "Additional groups" msgstr "Дополнительные группы" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:96 msgid "Choose groups" msgstr "Выбрать группы" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:97 msgid "Choose users" msgstr "Выбрать пользователей" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:100 msgid "System users and groups" msgstr "Пользователи и группы в системе" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:101 msgid "Blocked" msgstr "Заблокировано" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:102 msgid "Username" msgstr "Имя пользователя" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:103 msgid "" "Primary\n" "group" @@ -375,7 +387,7 @@ msgstr "" "Основная\n" "группа" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:104 msgid "" "Home\n" "directory" @@ -383,31 +395,31 @@ msgstr "" "Домашний\n" "каталог" -#: source/ubl-strings.h:102 source/ubl-strings.h:108 +#: source/ubl-strings.h:105 source/ubl-strings.h:111 msgid "Group" msgstr "Группа" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:106 msgid "Update the system users and groups list" msgstr "Обновить список пользователей и групп системы" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:107 msgid "Toggle system groups and users" msgstr "Переключить видимость системных пользователей и групп" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:109 msgid "Password mismatch" msgstr "Несовпадение паролей" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "Password must be at least" msgstr "Пароль должен состоять из как минимум" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:110 msgid "characters" msgstr "символов" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:112 msgid "" "Days until\n" "warning" @@ -415,7 +427,7 @@ msgstr "" "Дней до\n" "предупреждения" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:113 msgid "" "Days\n" "without activity" @@ -423,7 +435,7 @@ msgstr "" "Дней без\n" "активности" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:114 msgid "" "Shell\n" "path" @@ -431,7 +443,7 @@ msgstr "" "Путь до\n" "оболочки" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:115 msgid "" "Password has\n" "been changed" @@ -439,7 +451,7 @@ msgstr "" "Пароль\n" "изменён" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:116 msgid "" "Expiration\n" "date" @@ -447,7 +459,7 @@ msgstr "" "Дата\n" "устаревания" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:117 msgid "" "Password change\n" "interval (min)" @@ -455,7 +467,7 @@ msgstr "" "Интервал смены\n" "пароля (мин.)" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:118 msgid "" "Password change\n" "interval (max)" @@ -463,187 +475,187 @@ msgstr "" "Интервал смены\n" "пароля (макс.)" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:121 msgid "Add user" msgstr "Добавить пользователя" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:122 msgid "Configure user" msgstr "Редактировать пользователя" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:123 msgid "Set" msgstr "Задать" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:124 msgid "Empty important field" msgstr "Пустое важное поле" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:125 msgid "Loading has failed" msgstr "Ошибка загрузки" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:126 msgid "Login name" msgstr "Имя логина" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:127 msgid "Additional groups:" msgstr "Дополнительные группы:" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:128 msgid "Password configuration" msgstr "Конфигурация пароля" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:129 msgid "Password has been changed:" msgstr "Пароль изменён:" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:130 msgid "expiration date:" msgstr "Дата устаревания:" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:131 msgid "Password change interval: minimum" msgstr "Интервал смены пароля: минимум" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:132 msgid "days, maximum" msgstr "дней, максимум" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:133 msgid "days" msgstr "дней" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:134 msgid "Days until warning:" msgstr "Дней до предупреждения:" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:135 msgid "Days without activity:" msgstr "Дней без активности:" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:136 msgid "Force change at next login" msgstr "Принудительно сменить при следующем входе в систему" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:137 msgid "User shell:" msgstr "Оболочка пользователя:" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:138 msgid "Home directory:" msgstr "Домашний каталог:" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:139 msgid "Don't set" msgstr "Не создавать" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:140 msgid "Create system user" msgstr "Создать системного пользователя" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:141 msgid "Create user with ununique (repeating) UID" msgstr "Создать пользователя с повторяющимися (не уникальными) UID" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:142 msgid "Do not check login for compliance with character rules" msgstr "Не проверять логин на несоответствие правилам использования символов" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:143 msgid "Temporary deactivation" msgstr "Временное отключение учётной записи" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:144 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:145 msgid "login_name" msgstr "Имя_логина" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:146 msgid "group_name" msgstr "Имя_группы" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:147 msgid "User name" msgstr "Имя пользователя" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:148 msgid "Sync user" msgstr "Синхронизировать пользователя" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:149 msgid "Sync user with password" msgstr "Синхронизировать пользователя с паролем" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:150 msgid "Encrypt all passwords" msgstr "Зашифровать все пароли" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:152 msgid "User configuration" msgstr "Настройка пользователя" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:153 msgid "User configuration synchronization" msgstr "Синхронизация настроек пользователя" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:154 msgid "During system startup, load the user from the configuration" msgstr "При загрузке системы загрузить пользователя из конфигурации" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:155 msgid "When shutting down the system, save the user into the configuration" msgstr "При завершении работы системы сохранить пользователя в конфигурацию" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:156 msgid "User password configuration syncronization" msgstr "Синхронизация настроек пароля пользователя" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:157 msgid "" "During system startup, load the user's parameters from the configuration" msgstr "При загрузке системы загрузить параметры пользователя из конфигурации" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:158 msgid "" "When shutting down the system, save the user's parameters into the " "configuration" msgstr "" "При завершении работы системы сохранить параметры пользователя в конфигурацию" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:160 msgid "Main" msgstr "Основные" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:161 msgid "Additional" msgstr "Дополнительные" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:162 msgid "Syncronization" msgstr "Синхронизация" -#: source/ubl-strings.h:162 +#: source/ubl-strings.h:165 msgid "Repeat password:" msgstr "Подтверждение пароля:" -#: source/ubl-strings.h:163 +#: source/ubl-strings.h:166 msgid "Password hash:" msgstr "Хэш пароля:" -#: source/ubl-strings.h:164 +#: source/ubl-strings.h:167 msgid "Do not encrypt password" msgstr "Не шифровать пароль" -#: source/ubl-strings.h:167 +#: source/ubl-strings.h:170 msgid "Additional configuration of service parameter saving" msgstr "Дополнительные настройки сохранения параметров сервисов" -#: source/ubl-strings.h:168 +#: source/ubl-strings.h:171 msgid "" "At every system shutdown save changes of (root)/var/lib/samba\n" "into (hd)/ublinux-data/rootcopy" @@ -651,30 +663,30 @@ msgstr "" "При каждом завершении работы ОС сохранять изменения (root)/var/lib/samba\n" "в (hd)/ublinux-data/rootcopy/" -#: source/ubl-strings.h:169 +#: source/ubl-strings.h:172 msgid "For system save mode \"Sandbox\"" msgstr "Для режима сохранения системы \"Песочница\"" -#: source/ubl-strings.h:172 +#: source/ubl-strings.h:175 msgid "User deletion" msgstr "Удаление пользователя(-лей)" -#: source/ubl-strings.h:173 +#: source/ubl-strings.h:176 msgid "Confirm user(-s) deletion:" msgstr "Подтвердите удаление пользователя (-ей):" -#: source/ubl-strings.h:174 +#: source/ubl-strings.h:177 msgid "Chosen" msgstr "Выбран" -#: source/ubl-strings.h:175 +#: source/ubl-strings.h:178 msgid "User" msgstr "Пользователь" -#: source/ubl-strings.h:176 +#: source/ubl-strings.h:179 msgid "Home directory" msgstr "Домашний каталог" -#: source/ubl-strings.h:177 +#: source/ubl-strings.h:180 msgid "Delete home directory" msgstr "Удалить домашний каталог" -- 2.35.1 From 3efbccb016febdba5944f55f6050629f35ba1aaa Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 26 Jan 2024 18:38:15 +0600 Subject: [PATCH 24/30] Samba check buttons logic --- source/ubl-settings-usergroups.c | 50 +++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 9fc47bc..7ef8479 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -102,8 +102,15 @@ if (main_config.sync_users){ for (int i=0;iPasswordEntry))); + char *password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); if (yon_char_is_empty(password)){ yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_empty",EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return; @@ -885,6 +892,7 @@ void on_password_accept(GtkWidget *self, dictionary *dict){ free(password); password=pasw; } + password = yon_char_append(" . ",password); gtk_entry_set_text(GTK_ENTRY(entry),password); } else { yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"password_mismatch",PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -1335,10 +1343,35 @@ void on_user_save(GtkWidget *self, dictionary *dict){ on_subwindow_close(self); } -void on_toggle_button_set_active_from_combo_box(GtkComboBox *self,GtkToggleButton *target){ - if (gtk_combo_box_get_active(self)<=1){ - gtk_toggle_button_set_active(target,0); - gtk_widget_set_sensitive(GTK_WIDGET(target),0); +void on_toggle_button_set_active_from_combo_box(GtkComboBox *self,ubl_settings_usergroups_user_window *window){ + char *passw = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); + if (gtk_combo_box_get_active(self)<=1||(passw[0]!=' '&&passw[1]!='.'&&passw[2]!=' ')){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); + }else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),1); + + } +} + +void on_password_user_changed(GtkComboBox *self,ubl_settings_usergroups_user_window *window){ + char *passw = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); + if ((passw[0]!=' '&&passw[1]!='.'&&passw[2]!=' ')){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),1); + } } @@ -1452,8 +1485,9 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ g_signal_connect(G_OBJECT(window->userSyncSAMBAPasswordCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userSyncSAMBACheck); g_signal_connect(G_OBJECT(window->userSyncSAMBACheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window->userSyncSAMBAPasswordCheck); g_signal_connect(G_OBJECT(window->userSyncSAMBAPasswordCheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window->userSyncSAMBACheck); - g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window->userSyncSAMBAPasswordCheck); - g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window->userSyncSAMBACheck); + g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window); + g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window); + g_signal_connect(G_OBJECT(window->userPasswordEntry),"changed",G_CALLBACK(on_password_user_changed),window); return window; } -- 2.35.1 From ad681791b2a8daf3b17bb418b6659afb30f97cdb Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 26 Jan 2024 18:45:18 +0600 Subject: [PATCH 25/30] Fixed unsenitiveness of unwanted check box --- source/ubl-settings-usergroups.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 7ef8479..adbd27b 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1347,7 +1347,6 @@ void on_toggle_button_set_active_from_combo_box(GtkComboBox *self,ubl_settings_u char *passw = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); if (gtk_combo_box_get_active(self)<=1||(passw[0]!=' '&&passw[1]!='.'&&passw[2]!=' ')){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); - gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); }else { @@ -1363,7 +1362,6 @@ void on_password_user_changed(GtkComboBox *self,ubl_settings_usergroups_user_win char *passw = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); if ((passw[0]!=' '&&passw[1]!='.'&&passw[2]!=' ')){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck),0); - gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); } else { -- 2.35.1 From ec5ae6bd6e0d80ad5cffa14c173575cdf762bd26 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Jan 2024 09:42:30 +0600 Subject: [PATCH 26/30] Fixed Samba checks sensitiveness logic --- source/ubl-settings-usergroups.c | 24 +++++++++++++++++++----- ubl-settings-usergroups-user.glade | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index adbd27b..323e502 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1373,9 +1373,23 @@ void on_password_user_changed(GtkComboBox *self,ubl_settings_usergroups_user_win } } -void on_toggle_button_set_active_from_toggle_button_inversed(GtkToggleButton *self, GtkToggleButton *target){ - if (gtk_toggle_button_get_active(self)){ - gtk_toggle_button_set_active(target,0); +void on_toggle_button_set_active_from_toggle_button_inversed(GtkToggleButton *self, ubl_settings_usergroups_user_window *window){ + char *passw = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); + if ((passw[0]==' '&&passw[1]=='.'&&passw[2]==' ')&>k_combo_box_get_active(GTK_COMBO_BOX(window->userPasswordCombo))>1){ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck))){ + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); + } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck))){ + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),0); + + } else { + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),1); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),1); + } + } else { + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBACheck),1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBAPasswordCheck),0); + gtk_widget_set_sensitive(GTK_WIDGET(window->userSyncSAMBAPasswordCheck),0); + } } @@ -1481,8 +1495,8 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button_inversed),window->userCreateUnuniqueCheck); g_signal_connect(G_OBJECT(window->userSyncSAMBACheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userSyncSAMBAPasswordCheck); g_signal_connect(G_OBJECT(window->userSyncSAMBAPasswordCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userSyncSAMBACheck); - g_signal_connect(G_OBJECT(window->userSyncSAMBACheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window->userSyncSAMBAPasswordCheck); - g_signal_connect(G_OBJECT(window->userSyncSAMBAPasswordCheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window->userSyncSAMBACheck); + g_signal_connect(G_OBJECT(window->userSyncSAMBACheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window); + g_signal_connect(G_OBJECT(window->userSyncSAMBAPasswordCheck),"toggled",G_CALLBACK(on_toggle_button_set_active_from_toggle_button_inversed),window); g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window); g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_toggle_button_set_active_from_combo_box),window); g_signal_connect(G_OBJECT(window->userPasswordEntry),"changed",G_CALLBACK(on_password_user_changed),window); diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 15e8121..e6b56f8 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -508,6 +508,7 @@ Sync user with password True + False True False start -- 2.35.1 From a7405a8c7a314eff49859b58726b9a52d7926895 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Jan 2024 09:46:39 +0600 Subject: [PATCH 27/30] Removed 'Encrypted password' from password combo boxes --- source/ubl-settings-usergroups.c | 4 ++-- ubl-settings-usergroups-user.glade | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 323e502..eca8d33 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -1615,7 +1615,7 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ if(parsed_size>5){ if (strcmp(parameters[5],"x")){ gtk_entry_set_text(GTK_ENTRY(window->userPasswordEntry), parsed_size>5?parameters[5]:""); - gtk_combo_box_set_active(GTK_COMBO_BOX(window->userPasswordCombo),3); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userPasswordCombo),2); } } @@ -1711,7 +1711,7 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ if (size>4){ if (strcmp(parsed[4],"")&&strcmp(parsed[4],"x")){ gtk_entry_set_text(GTK_ENTRY(window->PasswordEntry),parsed[4]); - gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),4); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),2); } else { gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),1); } diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index e6b56f8..8a6640a 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -237,7 +237,6 @@ Default No password required Set a password - Encrypted password -- 2.35.1 From 69877404edd96b94046997518c322ef47c2407c0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Jan 2024 09:47:08 +0600 Subject: [PATCH 28/30] Removed 'Encrypted password' from password combo boxes --- ubl-settings-usergroups-group-creation.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 926414e..148270b 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -350,7 +350,6 @@ Default No password required Set a password - Encrypted password -- 2.35.1 From 597bffbcda030f4d9e6022c255bcd9c891e34e1a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Jan 2024 09:53:12 +0600 Subject: [PATCH 29/30] Group creation window style fixes --- ubl-settings-usergroups-group-creation.glade | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 148270b..41a4a85 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -59,11 +59,16 @@ True True + 5 + 5 True False + 5 + 5 vertical + 5 True @@ -228,7 +233,7 @@ False 5 5 - 0 + 0.019999999552965164 in @@ -469,6 +474,9 @@ True False + 5 + 5 + 5 0.019999999552965164 in -- 2.35.1 From e2b303d43cd7b3590a1bd6b2c70c1c77aaebc545 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Jan 2024 11:25:17 +0600 Subject: [PATCH 30/30] Changed default hash information --- source/ubl-settings-usergroups.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index eca8d33..2d989eb 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -506,17 +506,29 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"AdditionalSettingsWindow"); gtk_window_set_title(GTK_WINDOW(window->Window),ADDITIONAL_SETTINGS_TITLE_LABEL); + int hash_size=0; + config_str hash_algos = yon_file_open(hash_list_path,&hash_size); if (main_config.hash_default_id==-1){ int size; config_str ret = yon_config_load(get_default_hash_command,&size); if (size>0){ char *hash = ret[0]; if (hash[strlen(hash)-1]=='\n') hash[strlen(hash)-1]='\0'; - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(window->PasswordHashCombo),yon_char_unite(DEFAULT_USER_LABEL," (",hash,")",NULL)); + for (int i=0;iPasswordHashCombo),yon_char_unite(DEFAULT_USER_LABEL," (",def,")",NULL)); + } + } + } } } - int hash_size=0; - config_str hash_algos = yon_file_open(hash_list_path,&hash_size); for (int i=1;i