From d1f3a4ab6309091604087ee36c3725692c742ffe Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 24 May 2024 10:23:02 +0600 Subject: [PATCH] Fixed crashes at storage window --- source/ubl-settings-repomanager.c | 119 +++++++++++++++++++++++------- source/ubl-settings-repomanager.h | 11 ++- source/ubl-strings.h | 4 +- ubl-settings-repomanager.css | 4 + 4 files changed, 109 insertions(+), 29 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e5a0520..9a6c3f9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -39,8 +39,9 @@ void yon_storage_config_update(storage_config_window *window){ gtk_widget_destroy((GtkWidget*)g_list_nth_data(children,i)); } GtkTreeIter iter,itar; - if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StoragePathCombo),GTK_TREE_MODEL(window->storages_copy),&iter)){ - + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id); if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter)){ int valid = 1; for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ @@ -82,15 +83,18 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ if (!yon_char_is_empty(path)){ GtkTreeIter iter, itar; gtk_tree_store_append(window->storages_copy,&iter,NULL); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); char *name = yon_char_new(path); free(yon_char_divide(name,yon_char_find_last(name,'/'))); gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); char *repos=NULL; int repos_size=0; yon_window_config_get_parameter("storage_info",path,&repos,YON_TYPE_STRING); + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); if (!yon_char_is_empty(repos)){ config_str repos_list = yon_char_parse(repos,&repos_size,","); for (int i=0;istorages_copy,&iter,NULL); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); char *name = yon_char_new(path); free(yon_char_divide(name,yon_char_find_last(name,'/'))); gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&itar); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); } @@ -138,11 +145,25 @@ void on_storage_disable(GtkWidget *self, storage_config_window *window){ data->data=NULL; GtkTreeIter iter,itar; if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - if (yon_confirmation_dialog_call(self,data)){ - char *storage; - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,0,&storage,-1); + if (yon_confirmation_dialog_call(self,data)){GtkTreeIter itar; + char *storage; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + } } yon_storage_config_update(window); } @@ -153,22 +174,26 @@ void on_storage_remove(GtkWidget *self, storage_config_window *window){ data->function=NULL; data->data=NULL; if (yon_confirmation_dialog_call(self,data)){ - GtkTreeIter iter,itar; + GtkTreeIter itar; char *storage; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter); - gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); - char *repos; - yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); - int repo_size; - config_str repo_list = yon_char_parse(repos,&repo_size,","); - for (int i=0;iStoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); } - if (repo_size) - yon_char_parsed_free(repo_list,repo_size); - yon_window_config_erase_custom_parameter(storage,"storage_info"); - rmdir(storage); } yon_storage_config_update(window); } @@ -182,8 +207,9 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ return; } GtkTreeIter iter,itar, childiter; - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->StorageFilter),&itar,&iter); + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); char *path; gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1); char *child_path = yon_char_unite(path,"/",new_repo,NULL); @@ -616,6 +642,9 @@ void on_add_clicked(GtkWidget *self, main_window *widgets){ } } + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_add_target_package_selection_changed),window); @@ -761,6 +790,10 @@ void on_move_clicked(GtkWidget *self, main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetStorageEntry),path,current); } } + + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); + gtk_widget_destroy(gtk_widget_get_parent(window->StorageCombo)); g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_storage_changed),window); g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window); @@ -848,6 +881,8 @@ void on_remove_clicked(GtkWidget *self, main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current); } } + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo)); g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window); g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window); @@ -870,6 +905,9 @@ void config_init(){ main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; + main_config.signs=NULL; + main_config.signs_size=0; + yon_sign_list_update(); } void yon_config_load_update(main_window *widgets){ @@ -960,6 +998,32 @@ void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets){ } } +void yon_combo_box_text_set_signs(GtkComboBoxText *target){ + yon_sign_list_update(); + g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); + gtk_combo_box_text_remove_all(target); + gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL); + for (int i=0;i'); + gtk_combo_box_text_append(target,temp,main_config.signs[i]); + free(temp); + } +} + +void yon_sign_list_update(){ + if (main_config.signs&&main_config.signs_size) yon_char_parsed_free(main_config.signs,main_config.signs_size); + main_config.signs = yon_config_load(get_gpg_keys_command,&main_config.signs_size); + for (int i=0;iMoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ReposTree),"cursor-changed",G_CALLBACK(on_main_tree_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->CloudButton),"clicked",G_CALLBACK(on_ubl_settings_update_launch),widgets); gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 555bb19..e08dc05 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -56,6 +56,7 @@ typedef char* string; #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) +#define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) string version_application; char *local; @@ -64,6 +65,8 @@ typedef struct { template_config_fields GtkTreeStore *tree_store; int lock_root; + config_str signs; + int signs_size; } config; typedef struct { @@ -152,4 +155,10 @@ main_window *setup_window(); void yon_storage_config_update(storage_config_window *window); -void yon_storage_config_update(storage_config_window *window); \ No newline at end of file +void yon_storage_config_update(storage_config_window *window); + +void yon_sign_list_update(); + +void yon_combo_box_text_set_signs(GtkComboBoxText *target); + +void on_storage_changed(GtkWidget *self, storage_config_window *window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 61ef52f..a9d5c59 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -69,4 +69,6 @@ #define DISABLE_CONFIRMATION_LABEL _("Are you sure want to disable?") -#define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") \ No newline at end of file +#define REMOVE_CONFIRMATION_LABEL _("Are you sure want to remove?") + +#define DO_NOT_SIGN_LABEL _("Do not sign") \ No newline at end of file diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 1ca94fe..af0b6cc 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -134,6 +134,10 @@ background:transparent; margin-right: 2px; } +.spinner_image{ + -gtk-icon-transform: scale(2); +} + treeview row:nth-child(odd) { background-color: #000000; } treeview row:nth-child(even) { background-color: #ffffff; } \ No newline at end of file