From ca469554c2cf3ae3b65aedc32b83755794fea557 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 14 Dec 2023 16:11:55 +0600 Subject: [PATCH 01/68] Windows interactions partially implements --- csv/shell_list.csv | 10 + source/CMakeLists.txt | 5 +- source/ubl-settings-usergroups.c | 279 ++++++++++++++++-- source/ubl-settings-usergroups.h | 57 ++-- source/ubl-strings.h | 2 +- ...tings-usergroups-additional-settings.glade | 56 +++- ubl-settings-usergroups-group.glade | 233 +++------------ ubl-settings-usergroups-password.glade | 82 +---- ubl-settings-usergroups-user.glade | 45 ++- ubl-settings-usergroups.css | 6 + 10 files changed, 446 insertions(+), 329 deletions(-) create mode 100644 csv/shell_list.csv diff --git a/csv/shell_list.csv b/csv/shell_list.csv new file mode 100644 index 0000000..5cb00f0 --- /dev/null +++ b/csv/shell_list.csv @@ -0,0 +1,10 @@ +Shell +/bin/bash +/bin/sh +/bin/ksh +/bin/csh +/bin/tcsh +/bin/dash +/usr/bin/nologin +/usr/bin/git-shell +/usr/bin/zsh \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 33d015f..3e6ddde 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -86,8 +86,9 @@ set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} ${VTE291_LIBRARIES} - ubl-utils - ublsettings-ui + ublsettings + ublsettings-gtk3 + ublsettingsui-gtk3 pthread) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 1843f6e..97d51a9 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -4,38 +4,111 @@ config main_config; //functions -void yon_load_proceed(char *command){ - +int yon_load_proceed(YON_CONFIG_TYPE type){ + if (yon_config_load_register(type,"logging","",NULL)){ + return 1; + } + } -void yon_save_proceed(char *section,YON_CONFIG_TYPE type){ -} +void on_config_save(){ + yon_save_proceed(NULL,YON_CONFIG_BOTH,"logging", "",NULL); + +} + +void on_config_global_save(){ + yon_save_proceed("global",YON_CONFIG_GLOBAL,"logging", "",NULL); +} + +void on_config_local_save(){ + yon_save_proceed("system",YON_CONFIG_LOCAL,"logging", "",NULL); +} + +void on_password_combo_changed(GtkComboBox *self, GtkWidget *target){ + gtk_widget_set_sensitive(target,gtk_combo_box_get_active(self)>1); +} + void on_filechooser_open(GtkWidget *self, GtkEntry *output_target){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,ACCEPT_LABEL,GTK_RESPONSE_ACCEPT,NULL); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce==GTK_RESPONSE_ACCEPT){ + char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + gtk_entry_set_text(output_target,filename); + } + // ubl_settings_usergroups_additional_settings_window *window = yon_ubl_settings_usergroups_additional_settings_new(); // g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); // gtk_widget_show(window->Window); } +void on_groups_save(GtkWidget *self, dictionary *dict){ + ubl_settings_usergroups_group_window *window = yon_dictionary_get_data(dict->first,ubl_settings_usergroups_group_window*); + GtkEntry *output = yon_dictionary_get_data(dict->first->next,GtkEntry*); + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(window->list); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->GroupsTree)),&model,&iter)){ + char *name; + gtk_tree_model_get(model,&iter,1,&name,-1); + gtk_entry_set_text(output,name); + free(name); + } + on_subwindow_close(self); +} + void on_groups_clicked(GtkWidget *self, GtkEntry *output_target){ ubl_settings_usergroups_group_window *window = yon_ubl_settings_usergroups_group_new(); gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(window->GroupsTree),0),0); - g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->GroupsTree)),GTK_SELECTION_SINGLE); + 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,"output",output_target); + + g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_groups_save),dict); gtk_widget_show(window->GroupsWindow); } +void on_groups_multiple_save(GtkWidget *self, dictionary *dict){ + ubl_settings_usergroups_group_window *window = yon_dictionary_get_data(dict->first,ubl_settings_usergroups_group_window*); + GtkEntry *output = yon_dictionary_get_data(dict->first->next,GtkEntry*); + GtkTreeIter iter; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter); + char *full_groups=""; + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){ + char *name; + int status; + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&status,1,&name,-1); + if (status){ + char *extend_groups = yon_char_unite(full_groups,!yon_char_is_empty(full_groups)?",":"",name,NULL); + if (!yon_char_is_empty(full_groups)) + free(full_groups); + full_groups=extend_groups; + } + } + gtk_entry_set_text(output,full_groups); + on_subwindow_close(self); +} + void on_groups_multiple_clicked(GtkWidget *self, GtkEntry *output_target){ ubl_settings_usergroups_group_window *window = yon_ubl_settings_usergroups_group_new(); - g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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,"output",output_target); + g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_groups_multiple_save),dict); gtk_widget_show(window->GroupsWindow); } void on_password_change(GtkWidget *self, GtkEntry *output_target){ ubl_settings_usergroups_password_window *window = yon_ubl_settings_usergroups_password_new(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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); + g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_password_accept),dict); + g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + gtk_window_set_transient_for(GTK_WINDOW(window->CreateGroupWindow),GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(output_target)))); gtk_widget_show(window->CreateGroupWindow); } @@ -53,7 +126,36 @@ void on_expiration_clicked(GtkWidget *self, GtkEntry *output_target){ // standard functions - + 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)); + } else { + yon_config_remove_by_key("DEFAULTUSER"); + } + char *default_password = (char*)gtk_entry_get_text(GTK_ENTRY(window->DefaultPasswordEntry)); + if (!yon_char_is_empty(default_password)){ + yon_config_register("DEFAULTPASSWD","users",default_password); + } else { + yon_config_remove_by_key("DEFAULTPASSWD"); + } + char *root_password = (char*)gtk_entry_get_text(GTK_ENTRY(window->RootPasswordEntry)); + if (!yon_char_is_empty(root_password)){ + yon_config_register("DEFAULTROOTPASSWD","users",root_password); + } else { + 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","users","yes"); + } else { + yon_config_register("ADDADM","users","no"); + } + char *hash = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->PasswordHashCombo)); + if (!yon_char_is_empty(hash)){ + yon_config_register("HASHPASSWD","users",hash); + } + } ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_additional_settings_new(){ ubl_settings_usergroups_additional_settings_window *window = malloc(sizeof(ubl_settings_usergroups_additional_settings_window)); @@ -64,12 +166,41 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ window->DefaultUserAdministratorCheck=yon_gtk_builder_get_widget(builder,"DefaultUserAdministratorCheck"); window->DefaultPasswordCombo=yon_gtk_builder_get_widget(builder,"DefaultPasswordCombo"); window->DefaultPasswordEntry=yon_gtk_builder_get_widget(builder,"DefaultPasswordEntry"); + window->DefaultPasswordButton=yon_gtk_builder_get_widget(builder,"DefaultPasswordButton"); window->RootPasswordCombo=yon_gtk_builder_get_widget(builder,"RootPasswordCombo"); 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->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton"); window->AcceptButton=yon_gtk_builder_get_widget(builder,"AcceptButton"); + + 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"); + if (!yon_char_is_empty(default_password)) + gtk_entry_set_text(GTK_ENTRY(window->DefaultPasswordEntry),default_password); + 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); + 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"); + if (!yon_char_is_empty(hash)){ + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordHashCombo),yon_gtk_combo_box_text_find(window->PasswordHashCombo,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); + g_signal_connect(G_OBJECT(window->DefaultPasswordButton),"clicked",G_CALLBACK(on_password_change),window->DefaultPasswordEntry); + g_signal_connect(G_OBJECT(window->RootPasswordButton),"clicked",G_CALLBACK(on_password_change),window->RootPasswordEntry); + + g_signal_connect(G_OBJECT(window->RootPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->RootPasswordButton); + g_signal_connect(G_OBJECT(window->DefaultPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->DefaultPasswordButton); + return window; } @@ -111,49 +242,136 @@ return window; } +void on_group_clicked(GtkCellRenderer *self, char *path, ubl_settings_usergroups_group_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); +} ubl_settings_usergroups_group_window *yon_ubl_settings_usergroups_group_new(){ ubl_settings_usergroups_group_window *window = malloc(sizeof(ubl_settings_usergroups_group_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_group); - window->groupsAdmGroupCheck=yon_gtk_builder_get_widget(builder,"groupsAdmGroupCheck"); - window->groupsAudioGroupCheck=yon_gtk_builder_get_widget(builder,"groupsAudioGroupCheck"); - window->groupsAutologinGroupCheck=yon_gtk_builder_get_widget(builder,"groupsAutologinGroupCheck"); - window->groupsAvahiGroupCheck=yon_gtk_builder_get_widget(builder,"groupsAvahiGroupCheck"); - window->groupsBinGroupCheck=yon_gtk_builder_get_widget(builder,"groupsBinGroupCheck"); - window->groupsBrlapiGroupCheck=yon_gtk_builder_get_widget(builder,"groupsBrlapiGroupCheck"); - window->groupsBrittyGroupCheck=yon_gtk_builder_get_widget(builder,"groupsBrittyGroupCheck"); - window->groupsBumblbeeGroupCheck=yon_gtk_builder_get_widget(builder,"groupsBumblbeeGroupCheck"); - window->groupsChronyGroupCheck=yon_gtk_builder_get_widget(builder,"groupsChronyGroupCheck"); - window->groupsClamavGroupCheck=yon_gtk_builder_get_widget(builder,"groupsClamavGroupCheck"); - window->groupsCockpitWsGroupCheck=yon_gtk_builder_get_widget(builder,"groupsCockpitWsGroupCheck"); - window->groupsCockpitWsinstanceGroupCheck=yon_gtk_builder_get_widget(builder,"groupsCockpitWsinstanceGroupCheck"); - window->groupsColordGroupCheck=yon_gtk_builder_get_widget(builder,"groupsColordGroupCheck"); window->GroupsWindow=yon_gtk_builder_get_widget(builder,"GroupsWindow"); window->GroupsTree=yon_gtk_builder_get_widget(builder,"GroupsTree"); window->GroupsCancelButton=yon_gtk_builder_get_widget(builder,"GroupsCancelButton"); window->GroupsOkButton=yon_gtk_builder_get_widget(builder,"GroupsOkButton"); + window->StatusCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"StatusCell")); + window->list = gtk_list_store_new(2,G_TYPE_BOOLEAN,G_TYPE_STRING); + + g_signal_connect(G_OBJECT(window->StatusCell),"toggled",G_CALLBACK(on_group_clicked),window); + GtkTreeIter iter; + gtk_tree_view_set_model(GTK_TREE_VIEW(window->GroupsTree),GTK_TREE_MODEL(window->list)); + for (int i=0;ilist,&iter); + gtk_list_store_set(window->list,&iter,0,0,1,group_name,-1); + } + g_signal_connect(G_OBJECT(window->GroupsCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } +void on_standard_groups_accept(GtkWidget *self, ubl_settings_usergroups_group_window *window){ + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(window->list); + int valid = gtk_tree_model_get_iter_first(model,&iter); + char *standard_groups=""; + for (;valid;valid=gtk_tree_model_iter_next(model,&iter)){ + int status; + char *group; + gtk_tree_model_get(model,&iter,0,&status,1,&group,-1); + if (status){ + char *extend_groups = yon_char_unite(standard_groups,!yon_char_is_empty(standard_groups)?",":"",group,NULL); + if (!yon_char_is_empty(standard_groups)) + free(standard_groups); + standard_groups=extend_groups; + } + } + yon_config_register("USERGROUPS","users",standard_groups); + on_subwindow_close(self); +} + void on_standard_groups_open(GtkWidget *self, main_window *widgets){ ubl_settings_usergroups_group_window *window = yon_ubl_settings_usergroups_group_new(); - g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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"); + if (!yon_char_is_empty(groups)){ + GtkTreeIter iter; + int size; + config_str standard_groups = yon_char_parse(groups,&size,","); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){ + char *cur_name; + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,1,&cur_name,-1); + for (int i=0;ilist,&iter,0,1,-1); + } + } + free(cur_name); + } + } gtk_widget_show(window->GroupsWindow); } +void on_password_show_hide(GtkEntry *self, GtkEntryIconPosition icon_pos, GdkEvent* event){ + if (icon_pos == GTK_ENTRY_ICON_SECONDARY){ + int visible = gtk_entry_get_visibility(self); + if (!visible){ + gtk_entry_set_visibility(self,1); + } else { + gtk_entry_set_visibility(self,0); + gtk_entry_set_invisible_char(self,'*'); + } + } +} + +void on_password_changed(GtkEntry *self, ubl_settings_usergroups_password_window *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); + } else { + yon_ubl_status_box_despawn_infinite(GTK_CONTAINER(window->StatusBox)); + } +} + +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*); + char *password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry))); + char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + if (strcmp(password,password_check)){ + + } + +} ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_new(){ ubl_settings_usergroups_password_window *window = malloc(sizeof(ubl_settings_usergroups_password_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_password); window->CreateGroupWindow=yon_gtk_builder_get_widget(builder,"CreateGroupWindow"); window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox"); + window->PasswordEntry=yon_gtk_builder_get_widget(builder,"PasswordEntry"); + window->RepeatPasswordEntry=yon_gtk_builder_get_widget(builder,"RepeatPasswordEntry"); + window->PasswordHashEntry=yon_gtk_builder_get_widget(builder,"PasswordHashEntry"); + window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->PasswordEntry),"icon-press",G_CALLBACK(on_password_show_hide),NULL); + g_signal_connect(G_OBJECT(window->RepeatPasswordEntry),"icon-press",G_CALLBACK(on_password_show_hide),NULL); + g_signal_connect(G_OBJECT(window->PasswordHashEntry),"icon-press",G_CALLBACK(on_password_show_hide),NULL); + g_signal_connect(G_OBJECT(window->PasswordEntry),"changed",G_CALLBACK(on_password_changed),window); + g_signal_connect(G_OBJECT(window->RepeatPasswordEntry),"changed",G_CALLBACK(on_password_changed),window); + gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),TITLE_LABEL); + return window; } @@ -229,6 +447,10 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ g_signal_connect(G_OBJECT(window->userPasswordButton),"clicked",G_CALLBACK(on_password_change),window->userPasswordEntry); g_signal_connect(G_OBJECT(window->userAdditionalGroupsButton),"clicked",G_CALLBACK(on_groups_multiple_clicked),window->userAdditionalGroupsEntry); g_signal_connect(G_OBJECT(window->userPasswordExpirationButton),"clicked",G_CALLBACK(on_expiration_clicked),window->userPasswordExpirationEntry); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); + g_signal_connect(G_OBJECT(window->userHomeCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userHomeEntry); + g_signal_connect(G_OBJECT(window->userHomeCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userHomeButton); + g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userPasswordButton); return window; } @@ -312,7 +534,9 @@ void config_init(){ main_config.lock_help=0; main_config.lock_load_global=0; main_config.lock_save_global=0; - main_config.lock_save_local=0; + main_config.lock_save_local=0; + main_config.groups_size=0; + main_config.groups = yon_file_open(groups_path,&main_config.groups_size); } /**yon_main_window_complete(main_window *widgets) @@ -341,9 +565,6 @@ void 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"); - - main_config.usersListStore = GTK_LIST_STORE(gtk_builder_get_object(builder,"UsersList")); - main_config.groupsListStore = GTK_LIST_STORE(gtk_builder_get_object(builder,"GroupsList")); if (main_config.lock_load_global == 1){ @@ -365,6 +586,9 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->button3),"clicked",G_CALLBACK(on_standard_groups_open),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->SaveMenuItem),"activate",G_CALLBACK(on_config_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),widgets); gtk_widget_show(widgets->Window); @@ -450,6 +674,7 @@ int main(int argc, char *argv[]){ yon_ubl_connect_config((_template_config*)&main_config); yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); template_main_window *widgets = yon_ubl_window_setup(); - yon_main_window_complete((main_window*)widgets); + yon_main_window_complete((main_window*)widgets); + yon_load_proceed(YON_CONFIG_LOCAL); gtk_main(); } \ No newline at end of file diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 4ee3e97..cae69b7 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -7,8 +7,9 @@ #include #include #include -#include -#include +#include +#include +#include #include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include @@ -38,6 +39,8 @@ #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" +#define groups_path "/etc/passwd" + typedef char* string; string version_application; @@ -45,20 +48,22 @@ char *local; typedef struct { // Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT { - int socket_id; - int load_socket_id; - int save_socket_id; - - int lock_help; - int lock_save_local; - int lock_save_global; - int lock_load_global; - - int always_open_documentation; + int socket_id; + int load_socket_id; + int save_socket_id; + + int lock_help; + int lock_save_local; + int lock_save_global; + int lock_load_global; + + int load_mode; + + int always_open_documentation; // } Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT // Type custom parameters below: : - GtkListStore *usersListStore; - GtkListStore *groupsListStore; + config_str groups; + int groups_size; } config; @@ -126,8 +131,10 @@ typedef struct{ GtkWidget *DefaultUserAdministratorCheck; GtkWidget *DefaultPasswordCombo; GtkWidget *DefaultPasswordEntry; + GtkWidget *DefaultPasswordButton; GtkWidget *RootPasswordCombo; GtkWidget *RootPasswordEntry; + GtkWidget *RootPasswordButton; GtkWidget *PasswordHashCombo; GtkWidget *CancelButton; GtkWidget *AcceptButton; @@ -152,23 +159,12 @@ typedef struct{ } ubl_settings_usergroups_group_creation_window; typedef struct{ - GtkWidget *groupsAdmGroupCheck; - GtkWidget *groupsAudioGroupCheck; - GtkWidget *groupsAutologinGroupCheck; - GtkWidget *groupsAvahiGroupCheck; - GtkWidget *groupsBinGroupCheck; - GtkWidget *groupsBrlapiGroupCheck; - GtkWidget *groupsBrittyGroupCheck; - GtkWidget *groupsBumblbeeGroupCheck; - GtkWidget *groupsChronyGroupCheck; - GtkWidget *groupsClamavGroupCheck; - GtkWidget *groupsCockpitWsGroupCheck; - GtkWidget *groupsCockpitWsinstanceGroupCheck; - GtkWidget *groupsColordGroupCheck; GtkWidget *GroupsWindow; GtkWidget *GroupsTree; + GtkListStore *list; GtkWidget *GroupsCancelButton; GtkWidget *GroupsOkButton; + GtkCellRenderer *StatusCell; } ubl_settings_usergroups_group_window; typedef struct{ @@ -176,6 +172,9 @@ typedef struct{ GtkWidget *StatusBox; GtkWidget *UserCancelButton; GtkWidget *UserOkButton; + GtkWidget *PasswordEntry; + GtkWidget *RepeatPasswordEntry; + GtkWidget *PasswordHashEntry; } ubl_settings_usergroups_password_window; typedef struct{ @@ -240,4 +239,6 @@ ubl_settings_usergroups_system_window *yon_ubl_settings_usergroups_system_new(); void on_settings_usergroups_system_open(GtkWidget *self, main_window *widgets); -ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(); \ No newline at end of file +ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(); + +void on_password_accept(GtkWidget *self, dictionary *dict); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index cfe1e13..3b9ef8c 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -85,5 +85,5 @@ #define HOME_DIRECTORY_LABEL _("Home directory") #define GROUP_LABEL _("Group") -#define GROUP_LABEL _("Group") +#define PASSWORD_MISMATCH_LABEL _("Password mismatch") #define GROUP_LABEL _("Group") \ No newline at end of file diff --git a/ubl-settings-usergroups-additional-settings.glade b/ubl-settings-usergroups-additional-settings.glade index d088cc7..0dba5a6 100644 --- a/ubl-settings-usergroups-additional-settings.glade +++ b/ubl-settings-usergroups-additional-settings.glade @@ -13,6 +13,16 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic + + True + False + com.ublinux.ubl-settings-usergroups.edit-symbolic + + + True + False + com.ublinux.ubl-settings-usergroups.edit-symbolic + 600 350 @@ -60,7 +70,7 @@ True False 5 - 5 + 4 Default user name (if there's no another): 0 @@ -75,6 +85,7 @@ True True com.ublinux.ubl-settings-usergroups.profile-symbolic + superuser True @@ -118,8 +129,7 @@ True False - 5 - 5 + 4 Default user password: 0 @@ -150,6 +160,7 @@ True + False True 30 False @@ -164,6 +175,23 @@ 2 + + + True + False + True + True + image3 + + + + False + True + 3 + + False @@ -180,6 +208,7 @@ True False + 4 Root user password: 0 @@ -210,6 +239,7 @@ True + False True 30 False @@ -221,10 +251,26 @@ True True - end 2 + + + True + False + True + True + image4 + + + + False + True + 4 + + False @@ -249,7 +295,7 @@ True False 5 - 5 + 4 Password hash algorythm: 0 diff --git a/ubl-settings-usergroups-group.glade b/ubl-settings-usergroups-group.glade index ee79aea..b04bc10 100644 --- a/ubl-settings-usergroups-group.glade +++ b/ubl-settings-usergroups-group.glade @@ -3,193 +3,6 @@ - - True - False - vertical - - - adm - True - True - False - True - - - False - True - 0 - - - - - audio - True - True - False - True - - - False - True - 1 - - - - - autologin - True - True - False - True - - - False - True - 2 - - - - - avahi - True - True - False - True - - - False - True - 3 - - - - - bin - True - True - False - True - - - False - True - 4 - - - - - brlapi - True - True - False - True - - - False - True - 5 - - - - - britty - True - True - False - True - - - False - True - 6 - - - - - bumblbee - True - True - False - True - - - False - True - 7 - - - - - chrony - True - True - False - True - - - False - True - 8 - - - - - clamav - True - True - False - True - - - False - True - 9 - - - - - cockpit-ws - True - True - False - True - - - False - True - 10 - - - - - cockpit-wsinstance - True - True - False - True - - - False - True - 11 - - - - - colord - True - True - False - True - - - False - True - 12 - - - True False @@ -206,7 +19,7 @@ False False True - dialog-question-symbolic + com.ublinux.ubl-settings-usergroups True @@ -229,12 +42,14 @@ True True - + + none + - + 0 @@ -261,6 +76,42 @@ 0 + + + False + 5 + + + Add to new: + True + True + False + True + + + False + True + 0 + + + + + True + True + + + False + True + 1 + + + + + False + True + 1 + + True @@ -306,7 +157,7 @@ False True - 1 + 2 diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index cbe7be8..fcd4258 100644 --- a/ubl-settings-usergroups-password.glade +++ b/ubl-settings-usergroups-password.glade @@ -3,21 +3,6 @@ - - True - False - com.ublinux.ubl-settings-usergroups.view-symbolic - - - True - False - com.ublinux.ubl-settings-usergroups.view-symbolic - - - True - False - com.ublinux.ubl-settings-usergroups.view-symbolic - True False @@ -85,7 +70,7 @@ - Save + Accept True True True @@ -135,13 +120,15 @@ - + True True False * - com.ublinux.ubl-settings-usergroups.key-symbolic + True + com.ublinux.ubl-settings-usergroups.view-symbolic ******** + password True @@ -149,22 +136,6 @@ 1 - - - True - True - True - image3 - - - - False - True - 2 - - True @@ -191,13 +162,15 @@ - + True True False * - com.ublinux.ubl-settings-usergroups.key-symbolic + True + com.ublinux.ubl-settings-usergroups.view-symbolic ******** + password True @@ -205,22 +178,6 @@ 1 - - - True - True - True - image1 - - - - False - True - 2 - - True @@ -258,9 +215,12 @@ - + True True + False + * + com.ublinux.ubl-settings-usergroups.view-symbolic True @@ -268,22 +228,6 @@ 1 - - - True - True - True - image2 - - - - False - True - 2 - - True diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index a6c6d20..217655b 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -5,22 +5,22 @@ - 100 + 1e+21 1 10 - 100 + 1e+21 1 10 - 100 + 1e+21 1 10 - 100 + 1e+21 1 10 @@ -234,6 +234,7 @@ True + False True False * @@ -252,6 +253,7 @@ True + False True True image3 @@ -430,7 +432,7 @@ True False - 0 + 0.019999999552965164 in @@ -711,7 +713,7 @@ True False - 0 + 0.019999999552965164 in @@ -747,8 +749,19 @@ True False + 0 Default + /bin/bash + /bin/sh + /bin/ksh + /bin/csh + /bin/tcsh + /bin/dash + /usr/bin/nologin + /usr/bin/git-shell + /usr/bin/zsh + Set @@ -760,6 +773,7 @@ True + False True @@ -796,8 +810,11 @@ True False + 0 Default + Don't set + Set @@ -809,6 +826,7 @@ True + False True @@ -820,6 +838,7 @@ True + False True True image2 @@ -1094,4 +1113,18 @@ + + False + userPasswordExpirationButton + none + + + True + True + 2023 + 11 + 14 + + + diff --git a/ubl-settings-usergroups.css b/ubl-settings-usergroups.css index 8687d4a..6be07f0 100644 --- a/ubl-settings-usergroups.css +++ b/ubl-settings-usergroups.css @@ -105,4 +105,10 @@ background:transparent; .boxInfoMessOK{ background-color: #f3f0ac; +} + +.errorBox { + border-width: 2px; + border-color: #ea9999; + border-style:solid; } \ No newline at end of file From e3b907180320cd15314dfddc17825be995b84ab5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 14 Dec 2023 17:56:37 +0600 Subject: [PATCH 02/68] user adding window saving - WIP --- source/ubl-settings-usergroups.c | 156 +++++++++++++++++++++++++++++ source/ubl-strings.h | 6 +- ubl-settings-usergroups-user.glade | 1 + 3 files changed, 162 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 97d51a9..091a62a 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -36,6 +36,7 @@ void on_filechooser_open(GtkWidget *self, GtkEntry *output_target){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); gtk_entry_set_text(output_target,filename); } + on_subwindow_close(dialog); // ubl_settings_usergroups_additional_settings_window *window = yon_ubl_settings_usergroups_additional_settings_new(); // g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); @@ -400,6 +401,159 @@ void on_settings_usergroups_system_open(GtkWidget *self, main_window *widgets){ +void on_user_shell_changed(GtkWidget *self, ubl_settings_usergroups_user_window *window){ + if (!strcmp(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo)),SET_LABEL)){ + if(gtk_combo_box_get_active(GTK_COMBO_BOX(window->userShellCombo))>1){ + gtk_widget_set_sensitive(window->userShellEntry,1); + } else { + gtk_widget_set_sensitive(window->userShellEntry,0); + } + } else { + gtk_widget_set_sensitive(window->userShellEntry,0); + } +} + +void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ + char *final_user=""; + char *uid_string = NULL; + char *password = NULL; + char *login = NULL; + char *username = NULL; + char *main_group = NULL; + char *additional_groups = NULL; + char *password_changed_date = NULL; + char *password_expiration_date = NULL; + char *password_change_interval_minimum = NULL; + char *password_change_interval_maximum = NULL; + char *warning_days = NULL; + char *no_activity_days = NULL; + char *force_at_next_login = NULL; + char *user_shell = NULL; + char *user_home = NULL; + char *create_system_user = NULL; + char *create_ununique = NULL; + char *do_not_check = NULL; + char *samba_sync = NULL; + char *deactivate = NULL; + char *extra_options = NULL; + + int uid_auto_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck)); + if (uid_auto_active){ + uid_string="x"; + } else { + uid_string = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry)); + if (yon_char_is_empty(uid_string)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userUIDEntry); + return; + } + } + + login = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry)); + if (yon_char_is_empty(login)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userLoginEntry); + return; + } + + password = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); + if (yon_char_is_empty(password)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userPasswordEntry); + return; + } + + username = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUserNameEntry)); + if (yon_char_is_empty(username)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userUserNameEntry); + return; + } + + main_group = (char*)gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry)); + if (yon_char_is_empty(main_group)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userGroupsEntry); + return; + } + + additional_groups = (char*)gtk_entry_get_text(GTK_ENTRY(window->userAdditionalGroupsEntry)); + if (yon_char_is_empty(additional_groups)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userAdditionalGroupsEntry); + return; + } + + password_change_interval_minimum = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin))); + if (yon_char_is_empty(password_change_interval_minimum)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userPasswordChangeDelayMinimumSpin); + return; + } + + password_change_interval_maximum = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin))); + if (yon_char_is_empty(password_change_interval_maximum)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userPasswordChangeDelayMaximumSpin); + return; + } + + warning_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userWarningSpin))); + if (yon_char_is_empty(warning_days)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userWarningSpin); + return; + } + + no_activity_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userActivitySpin))); + if (yon_char_is_empty(no_activity_days)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userActivitySpin); + return; + } + + int force_at_next_login_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userForceChangeCheck)); + if (force_at_next_login_active){ + + } + + user_shell = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo)); + if (!strcmp(user_shell,SET_LABEL)){ + user_shell = (char*)gtk_entry_get_text(GTK_ENTRY(window->userShellCombo)); + if (yon_char_is_empty(user_shell)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userShellEntry); + return; + } + } + + int user_home_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->userHomeCombo)); + if (user_home_active==2){ + user_home=(char*)gtk_entry_get_text(GTK_ENTRY(window->userHomeEntry)); + if (yon_char_is_empty(user_home)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userHomeCombo); + return; + } + } + + int system_user_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck)); + if (system_user_active); + + int create_ununique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck)); + if (create_ununique_active); + + int do_not_check_actve = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userDontCheckCheck)); + if (do_not_check); + + int samba_sync_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userSyncSAMBACheck)); + if (samba_sync_active); + + int deactivate_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userDeactivatedCheck)); + if (deactivate_active); + + extra_options=(char*)gtk_entry_get_text(GTK_ENTRY(window->userExtraOptionsEntry)); +} ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ ubl_settings_usergroups_user_window *window = malloc(sizeof(ubl_settings_usergroups_user_window)); @@ -451,6 +605,8 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ g_signal_connect(G_OBJECT(window->userHomeCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userHomeEntry); g_signal_connect(G_OBJECT(window->userHomeCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userHomeButton); g_signal_connect(G_OBJECT(window->userPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->userPasswordButton); + g_signal_connect(G_OBJECT(window->userGroupsCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userGroupsEntry); + g_signal_connect(G_OBJECT(window->userShellCombo),"changed",G_CALLBACK(on_user_shell_changed),window); return window; } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 3b9ef8c..684a255 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -86,4 +86,8 @@ #define GROUP_LABEL _("Group") #define PASSWORD_MISMATCH_LABEL _("Password mismatch") -#define GROUP_LABEL _("Group") \ No newline at end of file +#define GROUP_LABEL _("Group") + +//ubl-settings-usergroups-user.glade +#define SET_LABEL _("Set") +#define EMPTY_IMPORTANT_LABEL _("Empty important field") \ No newline at end of file diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 217655b..935fe26 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -141,6 +141,7 @@ True True + 5 1001 number From 4606cbf550f725d575bb16e0199e613bffee255c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 15 Dec 2023 12:01:15 +0600 Subject: [PATCH 03/68] Description has been fixed --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5a8ac35..2793625 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# ubl-ubl-settings-usergroups +# ubl-settings-usergroups # Выполнить # Build -In order to build ubl-ubl-settings-usergroups you will need: +In order to build ubl-settings-usergroups you will need: - CMake - C compiler - GTK+ 3 & dependencies - webkit2gtk -- [libublsettings-ui](https://gitea.ublinux.ru/Applications/libublsettings-ui) +- [libublsettings](https://gitea.ublinux.ru/Applications/libublsettings) +- [libublsettings-gtk3](https://gitea.ublinux.ru/Applications/libublsettings-gtk3) +- [libublsettingsui-gtk3](https://gitea.ublinux.ru/Applications/libublsettingsui-gtk3) Once you have all the necessary dependencies, you can use: ```sh From 63953afc7c164be12a67d0ba88db1a1760ae3fd0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 19 Dec 2023 09:30:16 +0600 Subject: [PATCH 04/68] Localisation updates --- ubl-settings-usergroups-system.glade | 2 +- ubl-settings-usergroups_ru.po | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ubl-settings-usergroups-system.glade b/ubl-settings-usergroups-system.glade index 0403f40..8404a6d 100644 --- a/ubl-settings-usergroups-system.glade +++ b/ubl-settings-usergroups-system.glade @@ -144,7 +144,7 @@ - UID + GID diff --git a/ubl-settings-usergroups_ru.po b/ubl-settings-usergroups_ru.po index 9bae460..10464e6 100644 --- a/ubl-settings-usergroups_ru.po +++ b/ubl-settings-usergroups_ru.po @@ -170,7 +170,7 @@ msgstr "Основная группа" #: source/ubl-strings.h:34 msgid "Additional parameters" -msgstr "Дополнительные группы" +msgstr "Дополнительные параметры" #: source/ubl-strings.h:35 msgid "Password status" @@ -185,7 +185,6 @@ msgid "GID" msgstr "GID" #: source/ubl-strings.h:38 -#, fuzzy msgid "Group name" msgstr "Имя группы" @@ -199,7 +198,7 @@ msgstr "Группы" #: source/ubl-strings.h:43 msgid "Set a password" -msgstr "Установать пароль" +msgstr "Установить пароль" #: source/ubl-strings.h:44 msgid "Endrypted password" From e77cc22c1a7e5e72f4e89af421a8e618d1117693 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 19 Dec 2023 09:37:26 +0600 Subject: [PATCH 05/68] User window saving and loading --- source/ubl-settings-usergroups.c | 319 ++++++++++++++++++++++++------- source/ubl-settings-usergroups.h | 12 +- 2 files changed, 258 insertions(+), 73 deletions(-) diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 091a62a..19f77ae 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -215,17 +215,87 @@ void on_ubl_settings_usergroups_additional_settings_open(GtkWidget *self, main_w } +void on_user_choose(GtkWidget *self, GtkEntry *target){ + ubl_settings_usergroups_group_window *window = yon_ubl_settings_usergroups_group_new(); + gtk_list_store_new(2,G_TYPE_BOOLEAN,G_TYPE_STRING); + 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,"output",target); + g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_groups_multiple_save),dict); + gtk_widget_show(window->GroupsWindow); +} + +void on_group_save(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + ubl_settings_usergroups_group_creation_window *window = yon_dictionary_get_data(dict->first->next,ubl_settings_usergroups_group_creation_window*); + char *final_string = NULL; + char *group_name = NULL; + char *group_users = NULL; + char *gid = NULL; + char *non_unique = NULL; + char *gsystem = NULL; + char *password = NULL; + int gid_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck)); + if (gid_active){ + gid="x"; + } else { + gid = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry)); + if (yon_char_is_empty(gid)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userUIDEntry); + } + } + + group_name = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry)); + if (yon_char_is_empty(group_name)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userLoginEntry); + } + + group_users = (char*)gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry)); + if (yon_char_is_empty(group_users)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userGroupsEntry); + } + + int non_unique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UnuniqueGIDCheck)); + if(non_unique_active){ + non_unique=" --non-unique"; + } else non_unique=""; + + int gsystem_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck)); + if(gsystem_active){ + gsystem=" --system"; + } else gsystem=""; + + password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + if (yon_char_is_empty(password)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->PasswordEntry); + } + final_string = yon_char_unite(yon_char_return_if_exist(group_users,"x"), + ":",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(password,"x"), + NULL); + yon_config_register(GROUPADD(group_name),"users",final_string); + GtkTreeIter iter; + gtk_list_store_append(widgets->GroupsList,&iter); + gtk_list_store_set(widgets->GroupsList,&iter,0,gid,1,group_name,2,group_users,3,yon_char_append(non_unique,gsystem),4,gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->PasswordCombo)),-1); + on_subwindow_close(self); +} ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group_creation_new(){ ubl_settings_usergroups_group_creation_window *window = malloc(sizeof(ubl_settings_usergroups_group_creation_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_group_creation); window->CreateGroupWindow=yon_gtk_builder_get_widget(builder,"CreateGroupWindow"); window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox"); - window->userUIDAutoCheck=yon_gtk_builder_get_widget(builder,"userUIDAutoCheck"); + window->userUIDAutoCheck=yon_gtk_builder_get_widget(builder,"GIDAutoCheck"); window->userUIDEntry=yon_gtk_builder_get_widget(builder,"userUIDEntry"); window->userLoginEntry=yon_gtk_builder_get_widget(builder,"userLoginEntry"); window->userGroupsEntry=yon_gtk_builder_get_widget(builder,"userGroupsEntry"); - window->UserAdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"UserAdditionalGroupsButton"); + window->UserAdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"AdditionalGroupsButton"); window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); window->AdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"AdditionalGroupsButton"); @@ -236,9 +306,11 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group window->ChangePasswordButton=yon_gtk_builder_get_widget(builder,"ChangePasswordButton"); g_signal_connect(G_OBJECT(window->UnuniqueGIDCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userLoginEntry); - g_signal_connect(G_OBJECT(window->AdditionalGroupsButton),"clicked",G_CALLBACK(on_groups_multiple_clicked),window->userGroupsEntry); g_signal_connect(G_OBJECT(window->ChangePasswordButton),"clicked",G_CALLBACK(on_password_change),window->PasswordEntry); + g_signal_connect(G_OBJECT(window->PasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->ChangePasswordButton); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); 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); return window; } @@ -346,12 +418,19 @@ 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*); - char *password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry))); - char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); - if (strcmp(password,password_check)){ - + char *pasted_hash = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordHashEntry)); + if (yon_char_is_empty(pasted_hash)){ + char *password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry))); + char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); + 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); + } } - + on_subwindow_close(self); } ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_new(){ @@ -413,7 +492,9 @@ void on_user_shell_changed(GtkWidget *self, ubl_settings_usergroups_user_window } } -void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ +void on_user_save(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + ubl_settings_usergroups_user_window *window = yon_dictionary_get_data(dict->first->next,ubl_settings_usergroups_user_window*); char *final_user=""; char *uid_string = NULL; char *password = NULL; @@ -456,11 +537,16 @@ void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ return; } - password = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); - if (yon_char_is_empty(password)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userPasswordEntry); - return; + int password_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->userPasswordCombo)); + if (password_active > 1){ + password = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry)); + if (yon_char_is_empty(password)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userPasswordEntry); + return; + } + } else { + password="x"; } username = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUserNameEntry)); @@ -470,46 +556,43 @@ void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ return; } - main_group = (char*)gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry)); - if (yon_char_is_empty(main_group)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userGroupsEntry); - return; + int main_group_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck)); + if (!main_group_active){ + main_group = (char*)gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry)); + if (yon_char_is_empty(main_group)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->userGroupsEntry); + return; + } + } else { + main_group = "x"; } additional_groups = (char*)gtk_entry_get_text(GTK_ENTRY(window->userAdditionalGroupsEntry)); - if (yon_char_is_empty(additional_groups)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userAdditionalGroupsEntry); - return; - } - password_change_interval_minimum = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin))); - if (yon_char_is_empty(password_change_interval_minimum)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userPasswordChangeDelayMinimumSpin); - return; - } + long password_change_interval_minimum_active = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin)); + if (password_change_interval_minimum_active>0){ + password_change_interval_minimum = yon_char_from_long(password_change_interval_minimum_active); + } else password_change_interval_minimum = 0; - password_change_interval_maximum = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin))); - if (yon_char_is_empty(password_change_interval_maximum)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userPasswordChangeDelayMaximumSpin); - return; - } + long password_change_interval_maximum_active = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin)); + if (password_change_interval_minimum_active>0){ + password_change_interval_maximum = yon_char_from_long(password_change_interval_maximum_active); + } else password_change_interval_maximum = 0; - warning_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userWarningSpin))); - if (yon_char_is_empty(warning_days)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userWarningSpin); - return; + + long password_interval_maximum = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin)); + + password_expiration_date = (char*)gtk_entry_get_text(GTK_ENTRY(window->userPasswordExpirationEntry)); + if (!yon_char_is_empty(password_expiration_date)){ + password_expiration_date = password_expiration_date; } + + warning_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userWarningSpin))); - no_activity_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userActivitySpin))); - if (yon_char_is_empty(no_activity_days)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userActivitySpin); - return; + int no_activity_days_active = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userActivitySpin)); + if (no_activity_days_active>0){ + no_activity_days = yon_char_from_long(no_activity_days_active); } int force_at_next_login_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userForceChangeCheck)); @@ -517,34 +600,30 @@ void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ } - user_shell = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo)); - if (!strcmp(user_shell,SET_LABEL)){ - user_shell = (char*)gtk_entry_get_text(GTK_ENTRY(window->userShellCombo)); - if (yon_char_is_empty(user_shell)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userShellEntry); - return; - } - } + int user_shell_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->userShellCombo)); + if (user_shell_active>0){ + user_shell = yon_char_unite(" --shell ",(char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo)),NULL); + if (!strcmp(user_shell,SET_LABEL)){ + user_shell = yon_char_unite(" --shell ",(char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo)),NULL); + } + } else user_shell=""; int user_home_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->userHomeCombo)); if (user_home_active==2){ - user_home=(char*)gtk_entry_get_text(GTK_ENTRY(window->userHomeEntry)); - if (yon_char_is_empty(user_home)){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(window->userHomeCombo); - return; - } - } + user_home=yon_char_unite(" --home-dir ",(char*)gtk_entry_get_text(GTK_ENTRY(window->userHomeEntry)),NULL); + } else user_home = ""; int system_user_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck)); - if (system_user_active); + if (system_user_active) + create_system_user = " --system"; int create_ununique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck)); - if (create_ununique_active); + if (create_ununique_active) + create_ununique = " --non-unique"; int do_not_check_actve = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userDontCheckCheck)); - if (do_not_check); + 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); @@ -553,6 +632,38 @@ void on_user_save(GtkWidget *self, ubl_settings_usergroups_user_window *window){ if (deactivate_active); extra_options=(char*)gtk_entry_get_text(GTK_ENTRY(window->userExtraOptionsEntry)); + + time_t t = time(NULL); + struct tm tm = *localtime(&t); + password_changed_date = yon_char_unite(yon_char_from_int(tm.tm_mday),".",yon_char_from_int(tm.tm_mon+1),".",yon_char_from_int(1900+tm.tm_year),NULL); + + char *shadow_string = NULL; + shadow_string = yon_char_unite(yon_char_return_if_exist(password_changed_date,""), + ":",yon_char_return_if_exist(password_change_interval_minimum,""), + ":",yon_char_return_if_exist(password_change_interval_maximum,""), + ":",yon_char_return_if_exist(warning_days,""), + ":",yon_char_return_if_exist(no_activity_days,""), + ":",yon_char_return_if_exist(password_expiration_date,""), + NULL); + + final_user = yon_char_unite(yon_char_return_if_exist(username,"x"), + ":",yon_char_return_if_exist(uid_string,"x"), + ":",yon_char_return_if_exist(main_group,"x"), + ":",yon_char_return_if_exist(additional_groups,"x"), + ":",yon_char_return_if_exist(user_home,""), + yon_char_return_if_exist(user_shell,""), + yon_char_return_if_exist(create_system_user,""), + yon_char_return_if_exist(create_ununique,""), + yon_char_return_if_exist(do_not_check,""), + ":",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); + GtkTreeIter iter; + gtk_list_store_append(widgets->UsersList,&iter); + gtk_list_store_set(widgets->UsersList,&iter,1,yon_char_return_if_exist(uid_string,""),2,yon_char_return_if_exist(login,""),3,yon_char_return_if_exist(username,""),4,yon_char_return_if_exist(main_group,""),5,yon_char_return_if_exist(additional_groups,""),6,yon_char_unite(yon_char_return_if_exist(user_home,""),yon_char_return_if_exist(user_shell,""),yon_char_return_if_exist(create_system_user,""),yon_char_return_if_exist(create_ununique,""),yon_char_return_if_exist(do_not_check,""),NULL),7,yon_char_return_if_exist(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userPasswordCombo)),""),-1); + on_subwindow_close(self); } ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ @@ -617,14 +728,20 @@ void on_main_add(GtkWidget *self, main_window *widgets){ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ model = GTK_TREE_MODEL(widgets->UsersList); ubl_settings_usergroups_user_window *window = yon_ubl_settings_usergroups_user_new(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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->UserOkButton),"clicked",G_CALLBACK(on_user_save),dict); gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateUserWindow); } else { model = GTK_TREE_MODEL(widgets->GroupsList); ubl_settings_usergroups_group_creation_window *window = yon_ubl_settings_usergroups_group_creation_new(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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->UserOkButton),"clicked",G_CALLBACK(on_group_save),dict); gtk_window_set_transient_for(GTK_WINDOW(window->CreateGroupWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateGroupWindow); @@ -640,8 +757,67 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ model = GTK_TREE_MODEL(widgets->UsersList); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){ ubl_settings_usergroups_user_window *window = yon_ubl_settings_usergroups_user_new(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - + 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->UserOkButton),"clicked",G_CALLBACK(on_user_save),dict); + char *name; + 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; + 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->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),1); + else + 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]:""); + } + 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]); + 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]); + } + 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 + }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->userPasswordEntry), parsed_size>5?parameters[5]:""); + 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")); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordExpirationEntry),parsed_size>5?parameters[5]:""); gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateUserWindow); } @@ -649,7 +825,10 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ model = GTK_TREE_MODEL(widgets->GroupsList); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model,&iter)){ ubl_settings_usergroups_group_creation_window *window = yon_ubl_settings_usergroups_group_creation_new(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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->UserOkButton),"clicked",G_CALLBACK(on_group_save),dict); gtk_window_set_transient_for(GTK_WINDOW(window->CreateGroupWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateGroupWindow); diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index cae69b7..f0359c3 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -7,9 +7,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include @@ -41,6 +41,12 @@ #define groups_path "/etc/passwd" +#define USERADD(user) yon_char_unite("USERADD[",user,"]",NULL) +#define GROUPADD(group) yon_char_unite("GROUPADD[",group,"]",NULL) +#define USERSHADOW(user) yon_char_unite("USERSHADOW[",user,"]",NULL) + +#define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) + typedef char* string; string version_application; From 98dab018a4bcad686893746d15918751f79aacf8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 20 Dec 2023 11:48:21 +0600 Subject: [PATCH 06/68] Russian localisation, saving and loading --- source/CMakeLists.txt | 20 +- source/ubl-settings-usergroups.c | 203 +++++++++++++++--- source/ubl-settings-usergroups.h | 4 + source/ubl-strings.h | 42 +++- ...tings-usergroups-additional-settings.glade | 3 +- ubl-settings-usergroups-group-creation.glade | 7 +- ubl-settings-usergroups-group.glade | 3 +- ubl-settings-usergroups-password.glade | 180 +++++++++------- ubl-settings-usergroups-system.glade | 4 +- ubl-settings-usergroups-user.glade | 5 +- ubl-settings-usergroups.desktop | 2 +- ubl-settings-usergroups.glade | 98 ++++----- ubl-settings-usergroups.pot | 176 +++++++++++++-- ubl-settings-usergroups_ru.po | 187 ++++++++++++++-- 14 files changed, 725 insertions(+), 209 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 3e6ddde..ffaa9fd 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,11 +8,6 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) -pkg_check_modules(VTE291 REQUIRED vte-2.91) -include_directories(${VTE291_INCLUDE_DIRS}) -link_directories(${VTE291_LIBRARY_DIRS}) -add_definitions(${VTE291_CFLAGS_OTHER}) - find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) option(WEBKIT_FOUND "No" OFF) @@ -84,8 +79,6 @@ set(SOURCE_FILES set(LIBRARIES ${GTK_LIBRARIES} - ${WEBKIT_LIBRARIES} - ${VTE291_LIBRARIES} ublsettings ublsettings-gtk3 ublsettingsui-gtk3 @@ -94,6 +87,19 @@ 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( ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c index 19f77ae..90df422 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -5,23 +5,87 @@ config main_config; //functions int yon_load_proceed(YON_CONFIG_TYPE type){ - if (yon_config_load_register(type,"logging","",NULL)){ - return 1; + if (yon_config_load_register(type,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL)){ + return 1; } + return 0; -} +} + +void yon_interface_update(main_window *widgets){ + gtk_list_store_clear(widgets->UsersList); + gtk_list_store_clear(widgets->GroupsList); + int size; + GtkTreeIter iter; + config_str users = yon_config_get_all_by_key("USERADD",&size); + if (users){ + for (int i=0;iUsersList,&iter); + int parameters_size; + config_str parameters = yon_char_parse(users[i],¶meters_size,":"); + free(yon_char_divide(parameters[0],7)); + char *login = yon_char_divide_search(parameters[i],"\"",-1); + login[strlen(login)-2]='\0'; + gtk_list_store_set(widgets->UsersList,&iter, + 2,login, + 3,parameters_size>0?parameters[0]:"", + 1,parameters_size>1?parameters[1]:"", + 4,parameters_size>2?parameters[2]:"", + 5,parameters_size>3?parameters[3]:"", + 6,parameters_size>4?parameters[4]:"", + 7,parameters_size>5?ENDRYPTED_LABEL:DEFAULT_USER_LABEL, + -1); + if(parameters) + free(parameters); + } + free(users); + } + config_str groups = yon_config_get_all_by_key("GROUPADD",&size); + if (groups){ + for (int i=0;iGroupsList,&iter); + int parameters_size; + config_str parameters = yon_char_parse(groups[i],¶meters_size,":"); + free(yon_char_divide(parameters[0],8)); + char *login = yon_char_divide_search(parameters[i],"\"",-1); + login[strlen(login)-2]='\0'; + gtk_list_store_set(widgets->GroupsList,&iter, + 1,login, + 0,parameters_size>1?parameters[1]:"", + 2,parameters_size>0?parameters[0]:"", + 3,parameters_size>2?parameters[2]:"", + 4,parameters_size>3?ENDRYPTED_LABEL:DEFAULT_USER_LABEL, + -1); + if(parameters) + free(parameters); + + } + } +} + +void on_config_local_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_LOCAL); + main_config.load_mode=1; + yon_interface_update(widgets); +} + +void on_config_global_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_GLOBAL); + main_config.load_mode=0; + yon_interface_update(widgets); +} void on_config_save(){ - yon_save_proceed(NULL,YON_CONFIG_BOTH,"logging", "",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,"logging", "",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,"logging", "",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){ @@ -102,8 +166,15 @@ void on_groups_multiple_clicked(GtkWidget *self, GtkEntry *output_target){ } -void on_password_change(GtkWidget *self, GtkEntry *output_target){ +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); @@ -122,7 +193,7 @@ void on_additional_settings_clicked(GtkWidget *self, GtkEntry *output_target){ } void on_expiration_clicked(GtkWidget *self, GtkEntry *output_target){ - + } // standard functions @@ -196,8 +267,15 @@ ubl_settings_usergroups_additional_settings_window *yon_ubl_settings_usergroups_ 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); - g_signal_connect(G_OBJECT(window->DefaultPasswordButton),"clicked",G_CALLBACK(on_password_change),window->DefaultPasswordEntry); - g_signal_connect(G_OBJECT(window->RootPasswordButton),"clicked",G_CALLBACK(on_password_change),window->RootPasswordEntry); + dictionary *default_dict=NULL; + yon_dictionary_add_or_create_if_exists_with_data(default_dict,"combo",window->DefaultPasswordCombo); + yon_dictionary_add_or_create_if_exists_with_data(default_dict,"entry",window->DefaultPasswordEntry); + + dictionary *root_dict=NULL; + yon_dictionary_add_or_create_if_exists_with_data(root_dict,"combo",window->RootPasswordCombo); + yon_dictionary_add_or_create_if_exists_with_data(root_dict,"entry",window->RootPasswordEntry); + 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->RootPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->RootPasswordButton); g_signal_connect(G_OBJECT(window->DefaultPasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->DefaultPasswordButton); @@ -305,12 +383,15 @@ 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"); - g_signal_connect(G_OBJECT(window->UnuniqueGIDCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userLoginEntry); - g_signal_connect(G_OBJECT(window->ChangePasswordButton),"clicked",G_CALLBACK(on_password_change),window->PasswordEntry); + gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),TITLE_LABEL); + dictionary *entry_dict=NULL; + yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"combo",window->PasswordCombo); + yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"entry",window->PasswordEntry); + g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); + g_signal_connect(G_OBJECT(window->ChangePasswordButton),"clicked",G_CALLBACK(on_password_change),entry_dict); g_signal_connect(G_OBJECT(window->PasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->ChangePasswordButton); - g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); 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); + g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->userGroupsEntry); return window; } @@ -418,16 +499,30 @@ 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*); - char *pasted_hash = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordHashEntry)); - if (yon_char_is_empty(pasted_hash)){ + 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 { + gtk_entry_set_text(entry,pasted_hash); + } + } else { char *password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry))); - char *password_check = (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); + return; + } + char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->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); + } else { + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),PASSWORD_MISMATCH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + return; } } on_subwindow_close(self); @@ -441,6 +536,8 @@ ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_ne window->PasswordEntry=yon_gtk_builder_get_widget(builder,"PasswordEntry"); window->RepeatPasswordEntry=yon_gtk_builder_get_widget(builder,"RepeatPasswordEntry"); 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->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); @@ -633,9 +730,11 @@ void on_user_save(GtkWidget *self, dictionary *dict){ extra_options=(char*)gtk_entry_get_text(GTK_ENTRY(window->userExtraOptionsEntry)); - time_t t = time(NULL); - struct tm tm = *localtime(&t); - password_changed_date = yon_char_unite(yon_char_from_int(tm.tm_mday),".",yon_char_from_int(tm.tm_mon+1),".",yon_char_from_int(1900+tm.tm_year),NULL); + if (window->old_password&&strcmp(window->old_password,password)){ + time_t t = time(NULL); + struct tm tm = *localtime(&t); + password_changed_date = yon_char_unite(yon_char_from_int(tm.tm_mday),".",yon_char_from_int(tm.tm_mon+1),".",yon_char_from_int(1900+tm.tm_year),NULL); + } char *shadow_string = NULL; shadow_string = yon_char_unite(yon_char_return_if_exist(password_changed_date,""), @@ -705,11 +804,15 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); + window->old_password=NULL; + dictionary *entry_dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"combo",window->userPasswordCombo); + yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"entry",window->userPasswordEntry); g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); g_signal_connect(G_OBJECT(window->userHomeButton),"clicked",G_CALLBACK(on_filechooser_open),window->userHomeEntry); g_signal_connect(G_OBJECT(window->UserGroupsButton),"clicked",G_CALLBACK(on_groups_clicked),window->userGroupsEntry); - g_signal_connect(G_OBJECT(window->userPasswordButton),"clicked",G_CALLBACK(on_password_change),window->userPasswordEntry); + g_signal_connect(G_OBJECT(window->userPasswordButton),"clicked",G_CALLBACK(on_password_change),entry_dict); g_signal_connect(G_OBJECT(window->userAdditionalGroupsButton),"clicked",G_CALLBACK(on_groups_multiple_clicked),window->userAdditionalGroupsEntry); g_signal_connect(G_OBJECT(window->userPasswordExpirationButton),"clicked",G_CALLBACK(on_expiration_clicked),window->userPasswordExpirationEntry); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); @@ -764,7 +867,9 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ char *name; 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; + 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->userUserNameEntry), parsed_size>0?parameters[0]:""); @@ -809,6 +914,7 @@ void on_main_edit(GtkWidget *self, main_window *widgets){ } // gtk_entry_set_text(GTK_ENTRY(window->), parsed_size>4?parameters[4]:""); } + window->old_password=parameters[5]; gtk_entry_set_text(GTK_ENTRY(window->userPasswordEntry), parsed_size>5?parameters[5]:""); free(parameters); parameters=yon_char_parse(yon_config_get_by_key(USERSHADOW(name)),&parsed_size,":"); @@ -829,6 +935,47 @@ void on_main_edit(GtkWidget *self, 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->UserOkButton),"clicked",G_CALLBACK(on_group_save),dict); + char *name; + gtk_tree_model_get(model,&iter,1,&name,-1); + char *config_string = yon_config_get_by_key(GROUPADD(name)); + if (!yon_char_is_empty(config_string)){ + if (config_string[0]=='\"') yon_char_divide(config_string,0); + if (config_string[strlen(config_string)-1]=='\"') config_string[strlen(config_string)-1]='\0'; + int size; + config_str parsed = yon_char_parse(config_string,&size,":"); + gtk_entry_set_text(GTK_ENTRY(window->userLoginEntry),name); + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry),size>1?parsed[0]:""); + if (size>1){ + if (!strcmp(parsed[1],"")||!strcmp(parsed[1],"x")) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck),1); + else + gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),parsed[1]); + } + if (size>2&&!yon_char_is_empty(parsed[2])){ + int parsed_size=0; + config_str substring = yon_char_parse(parsed[2],&parsed_size," "); + for (int i=0;iUnuniqueGIDCheck),1); + } else if (!strcmp(substring[i],"--system")||!strcmp(substring[i],"-r")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck),1); + } + } + } + free(substring); + } + 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); + } else { + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordCombo),1); + } + } + } else { + yon_ubl_status_box_render(LOADING_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } gtk_window_set_transient_for(GTK_WINDOW(window->CreateGroupWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateGroupWindow); @@ -866,11 +1013,11 @@ void config_init(){ main_config.save_socket_id=-1; main_config.load_socket_id=-1; main_config.lock_help=0; - main_config.lock_help=0; main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; main_config.groups_size=0; + main_config.load_mode=1; main_config.groups = yon_file_open(groups_path,&main_config.groups_size); } @@ -924,9 +1071,12 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_save),widgets); g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),widgets); g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),widgets); - - gtk_widget_show(widgets->Window); + g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); + g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); + yon_load_proceed(YON_CONFIG_LOCAL); + yon_interface_update((main_window*)widgets); + } int main(int argc, char *argv[]){ @@ -1010,6 +1160,5 @@ int main(int argc, char *argv[]){ yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); template_main_window *widgets = yon_ubl_window_setup(); yon_main_window_complete((main_window*)widgets); - yon_load_proceed(YON_CONFIG_LOCAL); - gtk_main(); + gtk_main(); } \ No newline at end of file diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index f0359c3..ca5ce0f 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -181,6 +181,8 @@ typedef struct{ GtkWidget *PasswordEntry; GtkWidget *RepeatPasswordEntry; GtkWidget *PasswordHashEntry; + GtkWidget *HashBox; + GtkWidget *PasswordBox; } ubl_settings_usergroups_password_window; typedef struct{ @@ -226,6 +228,8 @@ typedef struct{ GtkWidget *userExtraOptionsEntry; GtkWidget *UserCancelButton; GtkWidget *UserOkButton; + + char *old_password; } ubl_settings_usergroups_user_window; diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 684a255..8a04bb9 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -39,12 +39,21 @@ #define GROUPS_USERS_LABEL _("Group users") #define GROUPS_LABEL _("Groups") +#define INSPECT_SYSTEM_LABEL _("Inspect users and groups in system") +#define ADDITIONAL_SETTINGS_LABEL _("Additional settings") +#define SHARED_GROUPS_SETTINGS_LABEL _("Shared groups configuration") +#define CREATE_NEW_LABEL _("Create new") +#define EDIT_LABEL _("Edit") +#define REMOVE_LABEL _("Remove") +#define UPDATE_LABEL _("Update users and groups") + //ubl-settings-usergroups-additional-settings.glade +#define ADDITIONAL_SETTINGS_TITLE_LABEL _("Users and groups - additional settings") +#define NO_PASSWORD_LABEL _("No password required") #define SET_PASSWORD_LABEL _("Set a password") #define ENDRYPTED_LABEL _("Endrypted password") #define MD5_LABEL "md5" #define YESCRYPT_LABEL "yescrypt" -#define NO_PASSWORD_LABEL _("No password required") #define SCRYPT_LABEL "scrypt" #define BF_LABEL "bf" #define BCRYPT_LABEL "bcrypt" @@ -58,14 +67,19 @@ #define ACCEPT_LABEL _("Accept") //ubl-settings-usergroups-group-creation.glade +#define GROUP_TITLE_LABEL _("Users and groups - group configuration") +#define GROUP_ID_LABEL _("Group id:") +#define GROUP_CREATION_NAME_LABEL _("Group name:") +#define GROUP_USERS_LABEL _("Group users:") #define AUTOMATICALLY_LABEL _("Automatically") -#define LOGIN_GROUP_LABEL _("login") +#define LOGIN_GROUP_LABEL _("Login") #define CREATE_GROUP_UNUNIQUE_LABEL _("Create group with ununique GID") #define CREATE_SYSTEM_GROUP_LABEL _("Create system group") #define ENCRYPTED_PASSWORD_LABEL _("Encrypted password") #define ADDITIONAL_CONFIGURATION_LABEL _("Additional configuration") //ubl-settings-usergroups-group.glade +#define GROUPS_TITLE_LABEL _("Users and groups - groups") #define ADM_LABEL "adm" #define AUDIO_LABEL "audio" #define AUTOLIGIN_LABEL "autologin" @@ -79,6 +93,7 @@ #define COLORD_LABEL "colord" //ubl-settings-usergroups-system.glade +#define INSPECTOR_TITLE_LABEL _("Users and groups - system users and groups") #define BLOCKED_LABEL _("Blocked") #define USERNAME_LABEL _("Username") #define PRIMARY_GROUP_LABEL _("Primary group") @@ -89,5 +104,26 @@ #define GROUP_LABEL _("Group") //ubl-settings-usergroups-user.glade +#define USER_TITLE_LABEL _("Users and groups - user configuration") #define SET_LABEL _("Set") -#define EMPTY_IMPORTANT_LABEL _("Empty important field") \ No newline at end of file +#define EMPTY_IMPORTANT_LABEL _("Empty important field") +#define LOADING_FAILED_LABEL _("Loading has failed") +#define LOGIN_NAME_LABEL _("Login name") +#define ADDITIONAL_GROUPS_LABEL _("Additional groups:") +#define PASSWORD_SECTION_LABEL _("Password configuration") +#define PASSWORD_CHANGE_DATA_LABEL _("Password has been changed:") +#define EXPIRATION_DATE_LABEL _("expiration date:") +#define PASSWORD_MIN_INTERVAL_LABEL _("Password change interval: minimum") +#define PASSWORD_MAX_INTERVAL_LABEL _("days, maximum") +#define DAYS_LABEL _("days") +#define DAYS_WARNING_LABEL _("Days until warning") +#define DAYS_ACTIVITY_LABEL _("Days without activity") +#define FORCE_CONFIGURE_LABEL _("Force change at next login") +#define USER_SHELL_LABEL _("User shell") +#define HOME_DIR_LABEL _("Home directory") +#define DONT_SET_LABEL _("Don't set") +#define CREATE_SYSTEM_USER_LABEL _("Create system user") +#define CREATE_UNUNIQUE_LABEL _("Create user with ununique (repeating) UID") +#define DO_NOT_CHECK_LABEL _("Do not check login for compliance with character rules") +#define TEMPORARY_DEACTIVATION_LABEL _("Temporary deactivation") +#define SAVE_LABEL _("Save") \ No newline at end of file diff --git a/ubl-settings-usergroups-additional-settings.glade b/ubl-settings-usergroups-additional-settings.glade index 0dba5a6..28670dd 100644 --- a/ubl-settings-usergroups-additional-settings.glade +++ b/ubl-settings-usergroups-additional-settings.glade @@ -23,11 +23,10 @@ False com.ublinux.ubl-settings-usergroups.edit-symbolic - + 600 350 False - False True com.ublinux.ubl-settings-usergroups diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 3d1a328..e852c66 100644 --- a/ubl-settings-usergroups-group-creation.glade +++ b/ubl-settings-usergroups-group-creation.glade @@ -23,9 +23,8 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic - + False - False True 450 com.ublinux.ubl-settings-usergroups @@ -236,7 +235,7 @@ - Save + Accept True True True @@ -346,6 +345,7 @@ True + False True False * @@ -361,6 +361,7 @@ True + False True True image2 diff --git a/ubl-settings-usergroups-group.glade b/ubl-settings-usergroups-group.glade index b04bc10..48784f1 100644 --- a/ubl-settings-usergroups-group.glade +++ b/ubl-settings-usergroups-group.glade @@ -13,11 +13,10 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic - + 250 385 False - False True com.ublinux.ubl-settings-usergroups diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index fcd4258..1fcc102 100644 --- a/ubl-settings-usergroups-password.glade +++ b/ubl-settings-usergroups-password.glade @@ -13,7 +13,7 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic - + False False True @@ -102,33 +102,46 @@ vertical 5 - + True False + vertical 5 - + True False - Parrword: - 0 - - - False - True - 0 - - - - - True - True - False - * - True - com.ublinux.ubl-settings-usergroups.view-symbolic - ******** - password + 5 + + + True + False + Parrword: + 0 + + + False + True + 0 + + + + + True + True + False + * + True + com.ublinux.ubl-settings-usergroups.view-symbolic + ******** + password + + + True + True + 1 + + True @@ -136,77 +149,65 @@ 1 - - - True - True - 0 - - - - - True - False - 5 - + True False - Repeat password: - 0 - - - False - True - 0 - - - - - True - True - False - * - True - com.ublinux.ubl-settings-usergroups.view-symbolic - ******** - password + 5 + + + True + False + Repeat password: + 0 + + + False + True + 0 + + + + + True + True + False + * + True + com.ublinux.ubl-settings-usergroups.view-symbolic + ******** + password + + + True + True + 1 + + True True - 1 + 2 - - True - True - 1 - - - - - True - False - False True - 2 + 1 - + True False + vertical 5 - + True False - Password hash: - 0 False @@ -215,12 +216,37 @@ - + True - True - False - * - com.ublinux.ubl-settings-usergroups.view-symbolic + False + 5 + + + True + False + Password hash: + 0 + + + False + True + 0 + + + + + True + True + False + * + com.ublinux.ubl-settings-usergroups.view-symbolic + + + True + True + 1 + + True @@ -230,7 +256,7 @@ - True + False True 3 diff --git a/ubl-settings-usergroups-system.glade b/ubl-settings-usergroups-system.glade index 8404a6d..facfde8 100644 --- a/ubl-settings-usergroups-system.glade +++ b/ubl-settings-usergroups-system.glade @@ -15,11 +15,11 @@ - + 800 600 False - False + True com.ublinux.ubl-settings-usergroups diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 935fe26..e0e8f79 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -59,10 +59,9 @@ False com.ublinux.ubl-settings-usergroups.cancel-symbolic - + 500 False - False True com.ublinux.ubl-settings-usergroups @@ -75,6 +74,7 @@ True False + vertical @@ -468,6 +468,7 @@ True + False True diff --git a/ubl-settings-usergroups.desktop b/ubl-settings-usergroups.desktop index e192dfd..3fb651c 100644 --- a/ubl-settings-usergroups.desktop +++ b/ubl-settings-usergroups.desktop @@ -12,4 +12,4 @@ Icon=com.ublinux.ubl-settings-usergroups Terminal=false X-XfcePluggable=true X-UBLPluggable=true -Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-Personal-Settings; +Categories=XFCE;GTK;Settings;DesktopSettings;X-UBL-SettingsManager;X-UBL-Personal-Settings; diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade index c7b056e..b9980df 100644 --- a/ubl-settings-usergroups.glade +++ b/ubl-settings-usergroups.glade @@ -33,62 +33,36 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - - - - - - - - - - + - + - - - + - - - + - + - - - - - - - - - + - + - + - + - - - + - - - + - + + + - - @@ -149,6 +123,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True True + Inspect users and groups in system image12