diff --git a/Makefile b/Makefile index 435c5d1..7f11cb6 100644 --- a/Makefile +++ b/Makefile @@ -139,6 +139,8 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.accept-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.cancel-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.profile-settings-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/hash_list.csv" + @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv" "csv/shell_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \ 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 diff --git a/csv/hash_list.csv b/csv/hash_list.csv new file mode 100644 index 0000000..7909c68 --- /dev/null +++ b/csv/hash_list.csv @@ -0,0 +1,16 @@ +hash_algoritm;hash_description +des +md5 +yescrypt +gost-yescrypt;GOST-YESCRYPT (Конструкция согласно ГОСТ Р 34.11─2012) +scrypt +bf +bcrypt +bcrypt-a +sha512crypt;SHA512 (Хеш-функция из семейства алгоритмов SHA-2) +sha256crypt +!sunmd5 +md5crypt +!bsdicrypt +descrypt +!nt \ No newline at end of file diff --git a/csv/shell_list.csv b/csv/shell_list.csv new file mode 100644 index 0000000..5b334ac --- /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..518b1ed 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,26 +8,15 @@ 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) if(WEBKIT_LIBRARIES_FOUND) - option(WEBKIT_FOUND "Yes" ON) PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0) include_directories(${WEBKIT_INCLUDE_DIRS}) link_directories(${WEBKIT_LIBRARY_DIRS}) add_definitions(${WEBKIT_CFLAGS_OTHER}) endif() -configure_file(ubl-cmake.in ubl-cmake.h) - -file(COPY ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h DESTINATION ./) - set(GRESOURCE_C resources.c) set(GRESOURCE_XML gresource.xml) @@ -79,20 +68,31 @@ set(SOURCE_FILES ubl-settings-usergroups.c ubl-settings-usergroups.h ubl-strings.h - ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ) set(LIBRARIES ${GTK_LIBRARIES} - ${WEBKIT_LIBRARIES} - ${VTE291_LIBRARIES} - ubl-utils - ublsettings-ui + ublsettings + ublsettings-gtk3 + ublsettingsui-gtk3 pthread) 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 1843f6e..e006eef 100644 --- a/source/ubl-settings-usergroups.c +++ b/source/ubl-settings-usergroups.c @@ -4,38 +4,227 @@ config main_config; //functions -void yon_load_proceed(char *command){ - -} +int yon_load_proceed(YON_CONFIG_TYPE type){ + 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 = NULL; + if (strstr(parameters[0],"\"")){ + login = yon_char_divide_search(parameters[0],"\"",-1); + login[strlen(login)-2]='\0'; + } else { + login = yon_char_divide_search(parameters[0],"=",-1); + login[strlen(login)-1]='\0'; + } + if (!strcmp(parameters[1],"x")) parameters[1]=AUTOMATICALLY_LABEL; + if (!strcmp(parameters[2],"x")) parameters[2]=login; + 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; + if (strstr(parameters[0],"\"")){ + login = yon_char_divide_search(parameters[0],"\"",-1); + login[strlen(login)-2]='\0'; + } else { + login = yon_char_divide_search(parameters[0],"=",-1); + login[strlen(login)-1]='\0'; + } + login[strlen(login)-2]='\0'; + if (!strcmp(parameters[1],"x")) parameters[1]=AUTOMATICALLY_LABEL; + 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); + textdomain(template_ui_LocaleName); + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + textdomain(LocaleName); + 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); + textdomain(template_ui_LocaleName); + yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + textdomain(LocaleName); + main_config.load_mode=0; + yon_interface_update(widgets); +} -void yon_save_proceed(char *section,YON_CONFIG_TYPE type){ -} +void on_config_save(){ + 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,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); +} + +void on_config_local_save(){ + yon_save_proceed("system",YON_CONFIG_LOCAL,"users", "DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); +} + +void on_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(FILECHOOSER_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); + } + 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); // 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_window_set_title(GTK_WINDOW(window->GroupsWindow),MAIN_GROUP_LABEL); + gtk_label_set_text(GTK_LABEL(window->HeaderLabel),MAIN_GROUP_LABEL); + GtkTreeIter iter, itar; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.groups_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.groups_list),&iter)){ + char *groupname; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.groups_list),&iter,1,&groupname,-1); + gtk_list_store_append(window->list,&itar); + gtk_list_store_set(window->list,&itar,1,groupname,-1); + free(groupname); + } 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); + gtk_window_set_title(GTK_WINDOW(window->GroupsWindow),ADDITIONAL_GROUPS_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->HeaderLabel),ADDITIONAL_GROUPS_TITLE_LABEL); + GtkTreeIter iter, itar; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.groups_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.groups_list),&iter)){ + char *groupname; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.groups_list),&iter,1,&groupname,-1); + gtk_list_store_append(window->list,&itar); + gtk_list_store_set(window->list,&itar,1,groupname,-1); + free(groupname); + } + 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){ +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(); - g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + 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); + 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); } @@ -47,13 +236,42 @@ void on_additional_settings_clicked(GtkWidget *self, GtkEntry *output_target){ } -void on_expiration_clicked(GtkWidget *self, GtkEntry *output_target){ - +void on_expiration_clicked(GtkWidget *self, ubl_settings_usergroups_user_window *window){ + gtk_popover_popup(GTK_POPOVER(window->CalendarPopup)); } // 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,16 +282,66 @@ 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"); + + yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"AdditionalSettingsWindow"); + gtk_window_set_title(GTK_WINDOW(window->Window),ADDITIONAL_SETTINGS_TITLE_LABEL); + int hash_size=0; + config_str hash_algos = yon_file_open(hash_list_path,&hash_size); + for (int i=1;iPasswordHashCombo),parsed[0]); + yon_char_parsed_free(parsed,parsed_size); + } + } + yon_char_parsed_free(hash_algos,hash_size); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->PasswordHashCombo),0); + char *default_user = yon_config_get_by_key("DEFAULTUSER"); + 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); + 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); + return window; } - void on_ubl_settings_usergroups_additional_settings_open(GtkWidget *self, main_window *widgets){ 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); @@ -83,17 +351,99 @@ 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_label_set_text(GTK_LABEL(window->HeaderLabel),GROUP_USERS_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->HeaderLabel),GROUP_USERS_TITLE_LABEL); + GtkTreeIter iter, itar; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.users_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.users_list),&iter)){ + char *groupname; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.users_list),&iter,2,&groupname,-1); + gtk_list_store_append(window->list,&itar); + gtk_list_store_set(window->list,&itar,1,groupname,-1); + free(groupname); + } + 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); + return; + } + } + + 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); + return; + } + + 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); + return; + } + + 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)); + 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; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList); + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model,&iter)) + gtk_list_store_append(widgets->GroupsList,&iter); + gtk_list_store_set(widgets->GroupsList,&iter,0,strcmp(gid,"x")?gid:AUTOMATICALLY_LABEL,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"); @@ -102,62 +452,309 @@ ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group window->PasswordCombo=yon_gtk_builder_get_widget(builder,"PasswordCombo"); window->PasswordEntry=yon_gtk_builder_get_widget(builder,"PasswordEntry"); window->ChangePasswordButton=yon_gtk_builder_get_widget(builder,"ChangePasswordButton"); + window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel"); + + gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),GROUPS_TITLE_LABEL); - 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); + int config_size=0; + int final_size=0; + config_str config_groups = yon_config_get_all_by_key("GROUPADD",&config_size); + yon_char_parsed_prepend_strings(config_groups,config_size,":"); + config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_groups,config_size,&final_size); + long prev_busy=main_config.MINUID; + for (int i=0;i=main_config.MINUID){ + if (atol(parsed[2])>main_config.MAXUID) + break; + if (atol(parsed[2])==prev_busy+1) + prev_busy=atol(parsed[2]); + else { + yon_char_parsed_free(parsed, parsed_size); + break; + } + } + yon_char_parsed_free(parsed, parsed_size); + } + gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),yon_char_from_long(prev_busy+1)); + 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); + yon_window_config_custom_window_setup(GTK_WINDOW(window->CreateGroupWindow),"GroupAddWindow"); + 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->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->userGroupsEntry); 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->HeaderLabel=yon_gtk_builder_get_widget(builder,"HeaderLabel"); + window->StatusCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"StatusCell")); + window->list = gtk_list_store_new(2,G_TYPE_BOOLEAN,G_TYPE_STRING); + + yon_window_config_custom_window_setup(GTK_WINDOW(window->GroupsWindow),"GroupWindow"); + gtk_window_set_title(GTK_WINDOW(window->GroupsWindow),GROUPS_TITLE_LABEL); + 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); + gtk_window_set_title(GTK_WINDOW(window->GroupsWindow),DEFAULT_GROUPS_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->HeaderLabel),DEFAULT_GROUPS_TITLE_LABEL); + GtkTreeIter iter, itar; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.groups_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.groups_list),&iter)){ + char *groupname; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.groups_list),&iter,1,&groupname,-1); + gtk_list_store_append(window->list,&itar); + gtk_list_store_set(window->list,&itar,1,groupname,-1); + free(groupname); + } + 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*); + 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))); + if (yon_char_is_empty(password)){ + yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + if (strlen(password)StatusBox),PASSWORD_SHORT_LABEL(yon_char_from_int(main_config.password_min_length)),5,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); +} 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->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"); + + yon_window_config_custom_window_setup(GTK_WINDOW(window->CreateGroupWindow),"PasswordWindow"); 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),GROUPS_TITLE_LABEL); + return window; } +void yon_system_load(ubl_settings_usergroups_system_window *window){ + gtk_list_store_clear(window->liststore1); + gtk_list_store_clear(window->liststore2); + GtkTreeIter iter; + for (int i=0;i=main_config.MINGID&&atoi(parsed[2])<=main_config.MAXGID){ + gtk_list_store_append(window->liststore2,&iter); + gtk_list_store_set(window->liststore2,&iter,0,atol(parsed[2]),1,parsed[0],2,parsed[3],-1); + } + } + for (int i=0;i=main_config.MINUID&&atoi(parsed[2])<=main_config.MAXUID)||window->show_all==1){ + char *groups_string=""; + char *main_group_name=""; + for (int j=0;jliststore1,&iter); + gtk_list_store_set(window->liststore1,&iter,1,atol(parsed[2]),2,parsed[0],3,parsed[0],4,main_group_name,5,groups_string,6,parsed[5],-1); + } + yon_char_parsed_free(parsed,parsed_size); + } + int shadow_size; + config_str shadow = yon_file_open(shadow_path,&shadow_size); + for (int i=0;iliststore1,&iter,3,parsed[0])){ + GDateTime *date = g_date_time_new_from_unix_local(atol(parsed[2])); + char *date_string; + date_string = g_date_time_format(date,"%c"); + + gtk_list_store_set(window->liststore1,&iter,8,parsed_size>2?date_string:"",9,parsed_size>7?parsed[7]:"",10,parsed_size>3?parsed[3]:"",11,parsed_size>4?parsed[4]:"",12,parsed_size>5?parsed[5]:"",13,parsed_size>2?parsed[6]:"",-1); + } + } +} +void on_mode_changed(GtkWidget *self, ubl_settings_usergroups_system_window *window){ + if (window->show_all==0){ + window->show_all=1; + } else { + window->show_all=0; + } + yon_system_load(window); +} + +void on_system_update(GtkWidget *self, ubl_settings_usergroups_system_window *window){ + + main_config.groups = yon_file_open(groups_path,&main_config.groups_size); + main_config.users = yon_file_open(users_path,&main_config.users_size); + int login_size; + config_str login_defs = yon_file_open(uid_path,&login_size); + for (int i=0;iliststore1=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); window->liststore2=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2")); window->MonitorWindow=yon_gtk_builder_get_widget(builder,"MonitorWindow"); - window->SettingsBar=yon_gtk_builder_get_widget(builder,"SettingsBar"); + window->ToggleAllButton=yon_gtk_builder_get_widget(builder,"ToggleAllButton"); + window->UpdateButton=yon_gtk_builder_get_widget(builder,"UpdateButton"); + window->SystemTree = yon_gtk_builder_get_widget(builder,"SystemTree"); + window->show_all=0; + yon_window_config_custom_window_setup(GTK_WINDOW(window->MonitorWindow),"InspectorWindow"); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(window->SystemTree)); + GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(window->SystemTree)); + for (int i=0;iMonitorWindow),INSPECTOR_TITLE_LABEL); + + g_signal_connect(G_OBJECT(window->ToggleAllButton),"clicked",G_CALLBACK(on_mode_changed),window); + g_signal_connect(G_OBJECT(window->UpdateButton),"clicked",G_CALLBACK(on_system_update),window); + + yon_system_load(window); return window; } void on_settings_usergroups_system_open(GtkWidget *self, main_window *widgets){ ubl_settings_usergroups_system_window *window = yon_ubl_settings_usergroups_system_new(); - gtk_window_set_transient_for(GTK_WINDOW(window->MonitorWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->MonitorWindow); } @@ -182,6 +794,245 @@ 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, 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; + 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; + char *useradd_boot = ""; + char *useradd_shutdown = ""; + char *usershadow_boot = ""; + char *usershadow_shutdown = ""; + + int uid_auto_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck)); + if (uid_auto_active){ + uid_string=""; + } 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; + } + + 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)); + 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; + } + + 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 = ""; + } + + additional_groups = (char*)gtk_entry_get_text(GTK_ENTRY(window->userAdditionalGroupsEntry)); + + 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; + + 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; + + + 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 = yon_char_from_long(window->expiration_unix); + } + + warning_days = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->userWarningSpin))); + + 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)); + if (force_at_next_login_active){ + + } + + 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=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) + create_system_user = " --system"; + + int create_ununique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck)); + 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_actve) + do_not_check = " --badnames"; + + 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)); + + 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); + } + + int useradd_boot_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UseraddBootCheck)); + if (useradd_boot_active){ + useradd_boot = "boot"; + } + + int useradd_shutdown_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UseraddShutdownCheck)); + if (useradd_shutdown_active){ + useradd_shutdown = "shutdown"; + } + + int usershadow_boot_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsershadowBootCheck)); + if (usershadow_boot_active){ + usershadow_boot = "boot"; + } + + int usershadow_shutdown_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsershadowShutdownCheck)); + if (usershadow_shutdown_active){ + usershadow_shutdown = "shutdown"; + } + + char *useradd_sync_string = NULL; + useradd_sync_string = yon_char_unite(useradd_boot,!yon_char_is_empty(useradd_boot)?",":"",useradd_shutdown,NULL); + char *usershadow_sync_string = NULL; + usershadow_sync_string = yon_char_unite(usershadow_boot,!yon_char_is_empty(usershadow_boot)?",":"",usershadow_shutdown,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); + + if (!yon_char_is_empty(useradd_sync_string)) + yon_config_register(USERADD_SYNC(login),"users",useradd_sync_string); + + if (!yon_char_is_empty(usershadow_sync_string)) + yon_config_register(USERSHADOW_SYNC(login),"users",usershadow_sync_string); + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->UsersList); + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)) + gtk_list_store_append(widgets->UsersList,&iter); + gtk_list_store_set(widgets->UsersList,&iter, + 1,yon_char_return_if_exist(uid_string,AUTOMATICALLY_LABEL), + 2,yon_char_return_if_exist(login,""), + 3,yon_char_return_if_exist(username,""), + 4,yon_char_return_if_exist(main_group,login), + 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); +} + +void on_date_selected(GtkWidget *self, ubl_settings_usergroups_user_window *window){ + int year=0, month=0, day=0; + gtk_calendar_get_date(GTK_CALENDAR(window->ExpirationCalendar),&year,&month,&day); + GDateTime *date = g_date_time_new_local(year,month,day,23,59,59); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordExpirationEntry), g_date_time_format(date,"%c")); + window->expiration_unix=g_date_time_to_unix(date); +} ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ ubl_settings_usergroups_user_window *window = malloc(sizeof(ubl_settings_usergroups_user_window)); @@ -221,14 +1072,71 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ window->userExtraOptionsEntry=yon_gtk_builder_get_widget(builder,"userExtraOptionsEntry"); window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); - + window->CalendarPopup=yon_gtk_builder_get_widget(builder,"CalendarPopover"); + window->UseraddBootCheck=yon_gtk_builder_get_widget(builder,"UseraddBootCheck"); + window->ExpirationCalendar=yon_gtk_builder_get_widget(builder,"ExpirationCalendar"); + window->UseraddShutdownCheck=yon_gtk_builder_get_widget(builder,"UseraddShutdownCheck"); + window->UsershadowBootCheck=yon_gtk_builder_get_widget(builder,"UsershadowBootCheck"); + window->UsershadowShutdownCheck=yon_gtk_builder_get_widget(builder,"UsershadowShutdownCheck"); + window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel"); + + int config_size=0; + int final_size=0; + config_str config_users = yon_config_get_all_by_key("USERADD",&config_size); + yon_char_parsed_prepend_strings(config_users,config_size,":"); + config_str final = yon_char_parsed_merge(main_config.users,main_config.users_size,config_users,config_size,&final_size); + long prev_busy=main_config.MINUID; + for (int i=0;i=main_config.MINUID){ + if (atol(parsed[2])>main_config.MAXUID) + break; + if (atol(parsed[2])==prev_busy+1) + prev_busy=atol(parsed[2]); + else { + yon_char_parsed_free(parsed, parsed_size); + break; + } + } + yon_char_parsed_free(parsed, parsed_size); + } + gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),yon_char_from_long(prev_busy+1)); + int shell_size=0; + config_str shells = yon_file_open(shell_list_path,&shell_size); + for (int i=1;iuserShellCombo),parsed[0]); + yon_char_parsed_free(parsed,parsed_size); + } + } + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(window->userShellCombo),SET_LABEL); + yon_char_parsed_free(shells,shell_size); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userShellCombo),0); + window->old_password=NULL; + dictionary *entry_dict = NULL; + yon_window_config_custom_window_setup(GTK_WINDOW(window->CreateUserWindow),"UserWindow"); + 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->userPasswordExpirationButton),"clicked",G_CALLBACK(on_expiration_clicked),window); + 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); + 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->userGroupsCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UserGroupsButton); + g_signal_connect(G_OBJECT(window->userShellCombo),"changed",G_CALLBACK(on_user_shell_changed),window); + g_signal_connect(G_OBJECT(window->ExpirationCalendar),"day-selected",G_CALLBACK(on_date_selected),window); return window; } @@ -238,15 +1146,27 @@ void on_main_add(GtkWidget *self, main_window *widgets){ GtkTreeIter iter; if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ model = GTK_TREE_MODEL(widgets->UsersList); + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree))); 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); + gtk_window_set_title(GTK_WINDOW(window->CreateUserWindow),ADD_USER_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->userTitleNameLabel),ADD_USER_TITLE_LABEL); + 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); + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree))); 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); + gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),ADD_GROUP_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->userTitleNameLabel),ADD_GROUP_TITLE_LABEL); + 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); @@ -262,16 +1182,156 @@ 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); - + gtk_window_set_title(GTK_WINDOW(window->CreateUserWindow),CONFIGURE_USER_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->userTitleNameLabel),CONFIGURE_USER_TITLE_LABEL); + 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=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]:""); + 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]); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); + i++; + } else if (!strcmp(parameters_substring[i],"--shell")||!strcmp(parameters_substring[i],"-s")){ + int active = yon_gtk_combo_box_text_find(window->userShellCombo,parameters_substring[i+1]); + if (!active){ + gtk_entry_set_text(GTK_ENTRY(window->userShellEntry),parameters_substring[i+1]); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->userShellCombo),"Set"); + } + i++; + + }else if (!strcmp(parameters_substring[i],"--system")||!strcmp(parameters_substring[i],"-r")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck),1); + }else if (!strcmp(parameters_substring[i],"--no-create-home")||!strcmp(parameters_substring[i],"-M")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2); + }else if (!strcmp(parameters_substring[i],"--no-user-group")||!strcmp(parameters_substring[i],"-N")){ + // gtk + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),0); + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry),""); + }else if (!strcmp(parameters_substring[i],"--non-unique")||!strcmp(parameters_substring[i],"-o")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck),1); + }else if (!strcmp(parameters_substring[i],"--badnames")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userDontCheckCheck),1); + } + } + // 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,":"); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordChangedEntry),parsed_size>0?parameters[0]:""); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMinimumSpin),atol(parsed_size>1?parameters[1]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userPasswordChangeDelayMaximumSpin),atol(parsed_size>2?parameters[2]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userWarningSpin),atol(parsed_size>3?parameters[3]:"0")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->userActivitySpin),atol(parsed_size>4?parameters[4]:"0")); + if (parsed_size>5&&!yon_char_is_empty(parameters[5])){ + GDateTime *date = g_date_time_new_from_unix_local(atol(parameters[5])); + gtk_entry_set_text(GTK_ENTRY(window->userPasswordExpirationEntry),g_date_time_format(date,"%c")); + } gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window)); gtk_widget_show(window->CreateUserWindow); + + char *useradd_sync = NULL; + useradd_sync = yon_config_get_by_key(USERADD_SYNC(name)); + if (useradd_sync){ + if (strstr(useradd_sync,"boot")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddBootCheck),1); + } + if (strstr(useradd_sync,"shutdown")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UseraddShutdownCheck),1); + } + free(useradd_sync); + } + char *usershadow_sync =yon_config_get_by_key(USERSHADOW_SYNC(name)); + if (usershadow_sync){ + if (strstr(usershadow_sync,"boot")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowBootCheck),1); + } + if (strstr(usershadow_sync,"shutdown")){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsershadowShutdownCheck),1); + } + free(usershadow_sync); + } } } else { 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); + gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),CONFIGURE_GROUP_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(window->userTitleNameLabel),CONFIGURE_GROUP_TITLE_LABEL); + 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); + 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); + if (size>1&&strcmp(parsed[0],"x")) + gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry),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); @@ -287,13 +1347,29 @@ void on_main_delete(GtkWidget *self, main_window *widgets){ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ model = GTK_TREE_MODEL(widgets->UsersList); cur_tree=widgets->UsersTree; + if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(cur_tree)),&model,&iter)){ + char *name; + gtk_tree_model_get(model,&iter,2,&name,-1); + yon_config_remove_by_key(USERADD(name)); + yon_config_remove_by_key(USERADD_SYNC(name)); + yon_config_remove_by_key(USERSHADOW(name)); + gtk_list_store_remove(GTK_LIST_STORE(model),&iter); + } } else { model = GTK_TREE_MODEL(widgets->GroupsList); cur_tree=widgets->GroupsTree; + if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(cur_tree)),&model,&iter)){ + char *name; + gtk_tree_model_get(model,&iter,1,&name,-1); + yon_config_remove_by_key(GROUPADD(name)); + gtk_list_store_remove(GTK_LIST_STORE(model),&iter); + } } - if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(cur_tree)),&model,&iter)){ - gtk_list_store_remove(GTK_LIST_STORE(model),&iter); - } +} + +void on_config_update(GtkWidget *self, main_window *widgets){ + yon_config_load_register(main_config.load_mode==1?YON_CONFIG_LOCAL:YON_CONFIG_GLOBAL,"users","DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERSHADOW[*] GROUPADD[*]",NULL); + yon_interface_update(widgets); } @@ -309,19 +1385,110 @@ 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.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); + main_config.users = yon_file_open(users_path,&main_config.users_size); + main_config.users_list=NULL; + main_config.groups_list=NULL; + main_config.password_min_length=6; + int login_size; + config_str login_defs = yon_file_open(uid_path,&login_size); + for (int i=0;iMainNotebook))==0){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->UsersList); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){ + gtk_widget_set_sensitive(widgets->DeleteButton,1); + gtk_widget_set_sensitive(widgets->EditButton,1); + } else { + gtk_widget_set_sensitive(widgets->DeleteButton,0); + gtk_widget_set_sensitive(widgets->EditButton,0); + } + } else { + GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model,&iter)){ + gtk_widget_set_sensitive(widgets->DeleteButton,1); + gtk_widget_set_sensitive(widgets->EditButton,1); + } else { + gtk_widget_set_sensitive(widgets->DeleteButton,0); + gtk_widget_set_sensitive(widgets->EditButton,0); + } + } +} +void on_notebook_page_changed(GtkWidget *self, GtkWidget *page, int num, main_window *widgets){ + GtkTreeIter iter; + if (num==0){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->UsersList); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){ + gtk_widget_set_sensitive(widgets->DeleteButton,1); + gtk_widget_set_sensitive(widgets->EditButton,1); + } else { + gtk_widget_set_sensitive(widgets->DeleteButton,0); + gtk_widget_set_sensitive(widgets->EditButton,0); + } + } else { + GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model,&iter)){ + gtk_widget_set_sensitive(widgets->DeleteButton,1); + gtk_widget_set_sensitive(widgets->EditButton,1); + } else { + gtk_widget_set_sensitive(widgets->DeleteButton,0); + gtk_widget_set_sensitive(widgets->EditButton,0); + } + } +} + /**yon_main_window_complete(main_window *widgets) * [EN] * * [RU] * Функция настройки основного окна приложения. [widgets] - структура со стандартным интерфейсом. */ -void yon_main_window_complete(main_window *widgets){ +main_window *yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"PlugBox"),1,1,0); @@ -341,9 +1508,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){ @@ -357,6 +1521,8 @@ void yon_main_window_complete(main_window *widgets){ gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0); gtk_widget_set_sensitive(widgets->SaveMenuItem,0); } + main_config.users_list = widgets->UsersList; + main_config.groups_list = widgets->GroupsList; /* Signal connection | Присоединение сигналов */ g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_main_add),widgets); @@ -365,13 +1531,37 @@ 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->UpdateButton),"clicked",G_CALLBACK(on_config_update),widgets); + g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_save),widgets); + g_signal_connect(G_OBJECT(widgets->UsersTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->GroupsTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->MainNotebook),"switch-page",G_CALLBACK(on_notebook_page_changed),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); + gtk_widget_realize(GTK_WIDGET(widgets->UsersTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UsersTree)); + gtk_widget_realize(GTK_WIDGET(widgets->GroupsTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->GroupsTree)); + GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->UsersTree)); + for (int i=0;iGroupsTree)); + for (int i=0;i #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../compile/ubl-cmake.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef WEBKIT_FOUND #include #endif @@ -32,12 +32,29 @@ #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define LocalePath "/usr/share/locale" -#define LocaleName "ubl-settings-usergroups" +#define LocaleName "ubl-settings-usergroups" #define clear_config_both_command "ubconfig remove TEMP_SECTION TEMP_PATAMETER" #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/group" +#define users_path "/etc/passwd" +#define shadow_path "/etc/shadow" +#define uid_path "/etc/login.defs" +#define password_limits_path "/etc/security/pwquiality.conf" + +#define hash_list_path "/usr/share/ubl-settings-usergroups/csv/hash_list.csv" +#define shell_list_path "/usr/share/ubl-settings-usergroups/csv/shell_list.csv" + +#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 USERADD_SYNC(user) yon_char_unite("USERADD_SYNC[",user,"]",NULL) +#define USERSHADOW_SYNC(user) yon_char_unite("USERSHADOW_SYNC[",user,"]",NULL) + +#define password_hash_get_command(passwd) yon_char_append("mkpasswd2 ",passwd) + typedef char* string; string version_application; @@ -45,20 +62,34 @@ 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_str users; + int users_size; + GtkListStore *users_list; + GtkListStore *groups_list; + + int MAXUID; + int MINUID; + + int MAXGID; + int MINGID; + + int password_min_length; } config; @@ -126,8 +157,10 @@ typedef struct{ GtkWidget *DefaultUserAdministratorCheck; GtkWidget *DefaultPasswordCombo; GtkWidget *DefaultPasswordEntry; + GtkWidget *DefaultPasswordButton; GtkWidget *RootPasswordCombo; GtkWidget *RootPasswordEntry; + GtkWidget *RootPasswordButton; GtkWidget *PasswordHashCombo; GtkWidget *CancelButton; GtkWidget *AcceptButton; @@ -149,26 +182,17 @@ typedef struct{ GtkWidget *PasswordCombo; GtkWidget *PasswordEntry; GtkWidget *ChangePasswordButton; + GtkWidget *userTitleNameLabel; } 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; + GtkWidget *HeaderLabel; + GtkCellRenderer *StatusCell; } ubl_settings_usergroups_group_window; typedef struct{ @@ -176,13 +200,21 @@ typedef struct{ GtkWidget *StatusBox; GtkWidget *UserCancelButton; GtkWidget *UserOkButton; + GtkWidget *PasswordEntry; + GtkWidget *RepeatPasswordEntry; + GtkWidget *PasswordHashEntry; + GtkWidget *HashBox; + GtkWidget *PasswordBox; } ubl_settings_usergroups_password_window; typedef struct{ GtkListStore *liststore1; GtkListStore *liststore2; GtkWidget *MonitorWindow; - GtkWidget *SettingsBar; + GtkWidget *ToggleAllButton; + GtkWidget *UpdateButton; + GtkWidget *SystemTree; + int show_all; } ubl_settings_usergroups_system_window; typedef struct{ @@ -221,6 +253,17 @@ typedef struct{ GtkWidget *userExtraOptionsEntry; GtkWidget *UserCancelButton; GtkWidget *UserOkButton; + GtkWidget *CalendarPopup; + GtkWidget *ExpirationCalendar; + GtkWidget *UseraddBootCheck; + GtkWidget *UseraddShutdownCheck; + GtkWidget *UsershadowBootCheck; + GtkWidget *UsershadowShutdownCheck; + GtkWidget *userTitleNameLabel; + + long expiration_unix; + + char *old_password; } ubl_settings_usergroups_user_window; @@ -240,4 +283,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..ba76057 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,5 +1,5 @@ -#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-usergroups version:")," ", version_application,"\n",_("Users and groups"),"\n",_("Usage:"), " ubl-settings-usergroups ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) +#define VERSION_LABEL yon_char_unite(_("Version:")," ",!yon_char_is_empty(version_application)?version_application:"","\n",NULL) +#define HELP_LABEL yon_char_unite(_("ubl-settings-usergroups version:")," ", !yon_char_is_empty(version_application)?version_application:"","\n",_("Users and groups"),"\n",_("Usage:"), " ubl-settings-usergroups ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",NULL) #define TITLE_LABEL _("Users and groups") #define TITLE_INFO_LABEL _("System users and groups configuration") @@ -16,8 +16,8 @@ #define PASSWORD_LABEL _("Password") #define USER_NAME_LABEL _("User name") -#define UID_USER_LABEL _("UID:") -#define USERNAME_USER_LABEL _("User name:") +#define UID_USER_LABEL _("User UID:") +#define USERNAME_USER_LABEL _("User name (description):") #define LOGIn_USER_LABEL _("Login:") #define PASSWORD_USER_LABEL _("Password:") #define DEFAULT_USER_LABEL _("Default") @@ -39,12 +39,24 @@ #define GROUPS_USERS_LABEL _("Group users") #define GROUPS_LABEL _("Groups") +#define PASSWORD_TITLE_LABEL _("Password input") +#define FILECHOOSER_TITLE_LABEL _("File owerview") + +#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 _("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,32 +70,82 @@ #define ACCEPT_LABEL _("Accept") //ubl-settings-usergroups-group-creation.glade +#define CONFIGURE_GROUP_TITLE_LABEL _("Configure group") +#define ADD_GROUP_TITLE_LABEL _("Add group") +#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 ADM_LABEL "adm" -#define AUDIO_LABEL "audio" -#define AUTOLIGIN_LABEL "autologin" -#define AVAHI_LABEL "avahi" -#define BIN_LABEL "bin" -#define BRLAPI_LABEL "brlapi" -#define BRITTY_LABEL "britty" -#define BUMBLBEE_LABEL "bumblbee" -#define CHRONY_LABEL "chrony" -#define CLAMAV_LABEL "clamav" -#define COLORD_LABEL "colord" +#define DEFAULT_GROUPS_TITLE_LABEL _("Default groups") +#define MAIN_GROUP_TITLE_LABEL _("Main group") +#define ADDITIONAL_GROUPS_TITLE_LABEL _("Additional groups") +#define GROUPS_TITLE_LABEL _("Choose groups") +#define GROUP_USERS_TITLE_LABEL _("Choose users") //ubl-settings-usergroups-system.glade +#define INSPECTOR_TITLE_LABEL _("System users and groups") #define BLOCKED_LABEL _("Blocked") #define USERNAME_LABEL _("Username") #define PRIMARY_GROUP_LABEL _("Primary group") #define HOME_DIRECTORY_LABEL _("Home directory") #define GROUP_LABEL _("Group") +#define UPDATE_SYSTEM_LABEL _("Update the system users and groups list") +#define TOGGLE_SYSTEM_LABEL _("Toggle system groups and users") +#define PASSWORD_MISMATCH_LABEL _("Password mismatch") +#define PASSWORD_SHORT_LABEL(min_size_char) yon_char_unite(_("Password must be at least")," ", min_size_char," ",_("characters")) #define GROUP_LABEL _("Group") -#define GROUP_LABEL _("Group") \ No newline at end of file +#define DAYS_WARNING_TABLE_LABEL _("Days until warning") +#define DAYS_ACTIVITY_TABLE_LABEL _("Days without activity") +#define SHALL_TABLE_LABEL _("Shell path") +#define PASSWORD_CHANGED_TABLE_LABEL _("Password has been changed") +#define EXPIRATION_TABLE_LABEL _("Expiration date") +#define INTERVAL_MIN_TABLE_LABEL _("Password change interval (min)") +#define INTERVAL_MAX_TABLE_LABEL _("Password change interval (max)") + +//ubl-settings-usergroups-user.glade +#define ADD_USER_TITLE_LABEL _("Add user") +#define CONFIGURE_USER_TITLE_LABEL _("Configure user") +#define SET_LABEL _("Set") +#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") +#define LOGIN_TOOLTIP_NAME_LABEL _("login_name") +#define GROUP_TOOLTIP_NAME_LABEL _("group_name") +#define USER_NAME_LABEL _("User name") + +#define USERADD_SYNC_LABEL _("System user synchronization mode with configuration") +#define USERADD_BOOT_LABEL _("During system startup, load the user from the configuration") +#define USERADD_SHUTDOWN_LABEL _("When shutting down the system, save the user into the configuration") +#define USERSHADOW_SYNC_LABEL _("The mode of synchronizing system user settings with the configuration") +#define USERSHADOW_BOOT_LABEL _("When the system boots up, load the user's settings from the configuration") +#define USERSHADOW_SHUTDOWN_LABEL _("When shutting down the system, save the user's settings into the configuration") + +//ubl-settings-usergroups-password.glade +#define PASSWORD_REPEAT_LABEL _("Repeat password:") +#define PASSWORD_HASH_LABEL _("Password hash:") \ No newline at end of file diff --git a/ubl-settings-usergroups-additional-settings.glade b/ubl-settings-usergroups-additional-settings.glade index d088cc7..19ba439 100644 --- a/ubl-settings-usergroups-additional-settings.glade +++ b/ubl-settings-usergroups-additional-settings.glade @@ -13,11 +13,20 @@ 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 False - False True com.ublinux.ubl-settings-usergroups @@ -60,7 +69,7 @@ True False 5 - 5 + 4 Default user name (if there's no another): 0 @@ -75,6 +84,7 @@ True True com.ublinux.ubl-settings-usergroups.profile-symbolic + superadmin True @@ -118,8 +128,7 @@ True False - 5 - 5 + 4 Default user password: 0 @@ -150,6 +159,7 @@ True + False True 30 False @@ -164,6 +174,23 @@ 2 + + + True + False + True + True + image3 + + + + False + True + 3 + + False @@ -180,6 +207,7 @@ True False + 4 Root user password: 0 @@ -210,6 +238,7 @@ True + False True 30 False @@ -221,10 +250,26 @@ True True - end 2 + + + True + False + True + True + image4 + + + + False + True + 4 + + False @@ -249,7 +294,7 @@ True False 5 - 5 + 4 Password hash algorythm: 0 @@ -264,22 +309,6 @@ True False 0 - - md5 - yescrypt - ghost-yescrypt - scrypt - bf - bcrypt - bcrypt-a - sha512crypt - sha256crypt - sunmd5 - md5crypt - bsdicrypt - desctrypt - nt - True @@ -307,6 +336,7 @@ False end 5 + True Cancel @@ -323,7 +353,7 @@ - Accept + Ok True True True @@ -354,7 +384,7 @@ True False - Users and groups + Additional settings diff --git a/ubl-settings-usergroups-group-creation.glade b/ubl-settings-usergroups-group-creation.glade index 3d1a328..eaa557b 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 @@ -68,7 +67,7 @@ True False - Group Id: + Group id: 0 @@ -83,6 +82,7 @@ True True False + True True @@ -94,6 +94,7 @@ True + False True 1007 number @@ -134,7 +135,7 @@ True True com.ublinux.ubl-settings-usergroups.profile-symbolic - login + group_name True @@ -236,7 +237,7 @@ - Save + Accept True True True @@ -346,6 +347,7 @@ True + False True False * @@ -361,6 +363,7 @@ True + False True True image2 @@ -399,6 +402,43 @@ 3 + + + True + False + 5 + 5 + 5 + + + True + False + Extra options: + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 4 + + @@ -410,7 +450,7 @@ True False - Users and groups + Add group diff --git a/ubl-settings-usergroups-group.glade b/ubl-settings-usergroups-group.glade index ee79aea..052f4b4 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 @@ -200,13 +13,12 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic - + 250 385 False - False True - dialog-question-symbolic + com.ublinux.ubl-settings-usergroups True @@ -228,13 +40,16 @@ True True + vertical - + + 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 @@ -317,10 +168,10 @@ False True - + True False - Users and groups + Choose groups diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index cbe7be8..2a96f8d 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 @@ -28,7 +13,7 @@ False com.ublinux.ubl-settings-usergroups.accept-symbolic - + False False True @@ -85,7 +70,7 @@ - Save + Accept True True True @@ -117,31 +102,46 @@ vertical 5 - + True False + vertical 5 - + True False - Parrword: - 0 - - - False - True - 0 - - - - - True - True - False - * - com.ublinux.ubl-settings-usergroups.key-symbolic - ******** + 5 + + + True + False + Password: + 0 + + + False + True + 0 + + + + + True + True + False + * + True + com.ublinux.ubl-settings-usergroups.view-symbolic + ******** + password + + + True + True + 1 + + True @@ -150,106 +150,64 @@ - - True - True - True - image3 - - - - False - True - 2 - - - - - True - True - 0 - - - - - True - False - 5 - - + True False - Repeat password: - 0 - - - False - True - 0 - - - - - True - True - False - * - com.ublinux.ubl-settings-usergroups.key-symbolic - ******** + 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 - - - - - True - True - True - image1 - - - - False - True 2 - - True - True - 1 - - - - - True - False - False True - 2 + 1 - + True False + vertical 5 - + True False - Password hash: - 0 False @@ -258,9 +216,37 @@ - + True - True + False + 5 + + + True + False + Password hash: + 0 + + + False + True + 0 + + + + + True + True + False + * + com.ublinux.ubl-settings-usergroups.view-symbolic + + + True + True + 1 + + True @@ -268,25 +254,9 @@ 1 - - - True - True - True - image2 - - - - False - True - 2 - - - True + False True 3 @@ -309,7 +279,7 @@ True False - Users and groups + Password input @@ -320,9 +290,8 @@ - - + diff --git a/ubl-settings-usergroups-system.glade b/ubl-settings-usergroups-system.glade index 0403f40..26ceded 100644 --- a/ubl-settings-usergroups-system.glade +++ b/ubl-settings-usergroups-system.glade @@ -13,13 +13,53 @@ False com.ublinux.ubl-settings-usergroups.sync-symbolic - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 800 600 False - False + True com.ublinux.ubl-settings-usergroups @@ -37,10 +77,11 @@ vertical 5 - + True True True + Toggle system groups and users image1