From d092f282049736a23a364bb08bb38c496e2deb22 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 18 Dec 2024 16:50:14 +0600 Subject: [PATCH 01/63] Crash fix --- source/ubl-settings-update.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index e3546e8..99f8193 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1024,6 +1024,11 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); + if (!window->sections) { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(window->SourceListBox)); + return; + } const char *repo_name = gtk_entry_get_text(GTK_ENTRY(window->RepoNameEntry)); if (yon_char_is_empty(repo_name)){ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); @@ -1178,6 +1183,11 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ void on_mirror_accept(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); mirror_add_window *window = yon_dictionary_get_data(dict->first->next,mirror_add_window*); + if (!window->sections) { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent((window->PathBox)))))); + return; + } char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); char *paths = ""; dictionary *dact = NULL; From 35c7960c0bd9609721654c3d76c645e9f5522b0f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 18 Dec 2024 16:59:14 +0600 Subject: [PATCH 02/63] Fixed deleting of web publication --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 99f8193..800fa97 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -705,7 +705,7 @@ void on_web_publish_remove_accept(GtkWidget *, main_window *widgets){ free(temp); yon_char_parsed_free(parsed,size); } else full_name = storage; - yon_config_remove_by_key(full_name); + yon_config_remove_by_key(REPOPUBLIC_WEB_full(full_name)); yon_interface_update(widgets); } From 24ed6c977db2278b1e5abe02fb373e16f232db12 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 18 Dec 2024 17:37:21 +0600 Subject: [PATCH 03/63] Fixed enabled repository render after startup --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 800fa97..2555ba9 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -246,7 +246,7 @@ void yon_interface_update(main_window *widgets){ gtk_list_store_append(widgets->ReposList,&iter); char *temp = strstr(parsed[0],",")?yon_char_replace(parsed[0],",","\n"):parsed[0]; parsed[0] = temp; - gtk_list_store_set(widgets->ReposList,&iter,0,cur_size>3&&!strcmp(parsed[3],"")?1:0,1,key,2,parsed[0],3,cur_size>1?parsed[1]:"",4,cur_size>2?parsed[2]:"",-1); + gtk_list_store_set(widgets->ReposList,&iter,0,(cur_size>3&&!strcmp(parsed[3],""))||cur_size<3?1:0,1,key,2,parsed[0],3,cur_size>1?parsed[1]:"",4,cur_size>2?parsed[2]:"",-1); } free(key); From a8d9800eda4b467801d9b251ec9c9abec8b7f48f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 10:09:01 +0600 Subject: [PATCH 04/63] Password has been hidden --- source/ubl-settings-update.c | 10 ++++++---- ubl-settings-update-web-publication-add.glade | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 2555ba9..d733d57 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -415,11 +415,12 @@ void yon_interface_update(main_window *widgets){ gtk_list_store_set(widgets->WebPublicationList,&iter,5,parsed[3],-1); } if (cur_size>4&&!yon_char_is_empty(parsed[4])){ - if (!strcmp(parsed[4],"sha256")||!strcmp(parsed[4],"sha512")){ - gtk_list_store_set(widgets->WebPublicationList,&iter,7,parsed[5],-1); - gtk_list_store_set(widgets->WebPublicationList,&iter,6,parsed[4],-1); + char *hash = yon_char_divide_search(parsed[4],"|",-1); + if (!strcmp(hash,"sha256")||!strcmp(hash,"sha512")){ + gtk_list_store_set(widgets->WebPublicationList,&iter,7,"******",-1); + gtk_list_store_set(widgets->WebPublicationList,&iter,6,hash,-1); } else { - gtk_list_store_set(widgets->WebPublicationList,&iter,6,parsed[4],-1); + gtk_list_store_set(widgets->WebPublicationList,&iter,6,"******",-1); if (cur_size>5&&!yon_char_is_empty(parsed[5])){ gtk_list_store_set(widgets->WebPublicationList,&iter,7,parsed[5],-1); } @@ -660,6 +661,7 @@ void on_password_open(GtkWidget *, web_publication_add_window *window){ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",dialog); yon_dictionary_add_or_create_if_exists_with_data(dict,"target",window->UserPasswordEntry); g_signal_connect(G_OBJECT(dialog->AcceptButton),"clicked",G_CALLBACK(on_password_accept),dict); + g_signal_connect(G_OBJECT(dialog->NoEncriptionCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),dialog->PasswordHashEntry); } void on_web_publish_remove(GtkWidget *self,main_window *widgets){ diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 6f0966e..4a4888c 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -459,7 +459,7 @@ True False 32 - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update From c284c5432872472aa39d1b4456dda543377a5657 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 10:39:00 +0600 Subject: [PATCH 05/63] Web publication's repositories paths shown if every repository is chosen --- source/ubl-settings-update.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index d733d57..c8dc232 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -395,6 +395,19 @@ void yon_interface_update(main_window *widgets){ } int repos_size; config_str repos = yon_char_parse(key,&repos_size,","); + if (!repos_size){ + int temp_size; + config_str contents = yon_dir_get_contents(path,&temp_size); + for (int k=0;kWebPublicationList,&iter,1,path,2,yon_char_parsed_to_string(repos,repos_size,"\n"),-1); int cur_size; @@ -1174,10 +1187,9 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":",full_name,NULL); char *final = yon_char_unite(enabled?"enable":"disable",":",enable_browser?"listing":"",":",port_enabled?port:"",":",username_check?username:"",":",username_check?yon_char_is_empty(encryption)? user_password:encryption:"",":",username_check?!yon_char_is_empty(encryption)?user_password:"":"",NULL); if (!yon_char_is_empty(window->name)&&strcmp(final_name,window->name)){ - yon_config_remove_by_key(REPOPUBLIC_WEB_command(window->name)); - } else { - yon_config_register(REPOPUBLIC_WEB_full(final_name),REPOPUBLIC_WEB_command(final_name),final); + yon_config_remove_by_key(REPOPUBLIC_WEB_full(window->name)); } + yon_config_register(REPOPUBLIC_WEB_full(final_name),REPOPUBLIC_WEB_command(final_name),final); yon_interface_update(widgets); gtk_widget_destroy(window->Window); } From 38bebc18e26aba5eb640889d03a725ea1938aa13 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 10:48:26 +0600 Subject: [PATCH 06/63] Fixed password editing --- ubl-settings-update-web-publication-add.glade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 4a4888c..1c041da 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -374,8 +374,9 @@ True False - True + False User password + False False * ****** From 35b76db46631f9ed93d509dcb3b02b72e266e2fd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 11:48:13 +0600 Subject: [PATCH 07/63] Fixed web publication editing data parsing --- source/ubl-settings-update.c | 33 +++++++++++++------ source/ubl-strings.h | 2 +- ubl-settings-update-web-publication-add.glade | 1 - ubl-settings-update.glade | 2 ++ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index c8dc232..5172548 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -395,6 +395,10 @@ void yon_interface_update(main_window *widgets){ } int repos_size; config_str repos = yon_char_parse(key,&repos_size,","); + + char *repos_paths = yon_char_parsed_to_string(repos,repos_size,","); + char *full_path = yon_char_unite(path,!yon_char_is_empty(repos_paths)?":":"",!yon_char_is_empty(repos_paths)?repos_paths:"",NULL); + if (!yon_char_is_empty(repos_paths)) free(repos_paths); if (!repos_size){ int temp_size; config_str contents = yon_dir_get_contents(path,&temp_size); @@ -409,7 +413,10 @@ void yon_interface_update(main_window *widgets){ } - gtk_list_store_set(widgets->WebPublicationList,&iter,1,path,2,yon_char_parsed_to_string(repos,repos_size,"\n"),-1); + repos_paths = yon_char_parsed_to_string(repos,repos_size,"\n"); + gtk_list_store_set(widgets->WebPublicationList,&iter,1,path,2,repos_paths,8,full_path,-1); + free(repos_paths); + free(full_path); int cur_size; config_str parsed = yon_char_parse(cur,&cur_size,":"); if (cur_size){ @@ -875,14 +882,13 @@ void on_web_publish_edit(GtkWidget *,main_window *widgets){ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->WebPublicationTree)),NULL,&iter)){ char *storage; char *repos; - gtk_tree_model_get(GTK_TREE_MODEL(widgets->WebPublicationList),&iter,1,&storage,2,&repos,-1); + char *full; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->WebPublicationList),&iter,1,&storage,2,&repos,8,&full,-1); gtk_entry_set_text(GTK_ENTRY(window->PathEntry),storage); while(gtk_events_pending()) gtk_main_iteration(); - char *full_name = storage; if(!yon_char_is_empty(repos)){ int size; config_str parsed = yon_char_parse(repos,&size,"\n"); - full_name = yon_char_unite(storage,":",yon_char_replace(repos,"\n",","),NULL); if (size){ GtkTreeIter itar; for_iter(GTK_TREE_MODEL(window->list),&itar){ @@ -894,8 +900,8 @@ void on_web_publish_edit(GtkWidget *,main_window *widgets){ } } } - window->name = full_name; - char *parameter = config(REPOPUBLIC_WEB_full(full_name)); + window->name = full; + char *parameter = config(REPOPUBLIC_WEB_full(full)); int size; config_str parsed = yon_char_parse(parameter,&size,":"); if (size){ @@ -914,6 +920,7 @@ void on_web_publish_edit(GtkWidget *,main_window *widgets){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsernameCheck),1); } if (size>4&&!yon_char_is_empty(parsed[4])){ + gtk_combo_box_set_active(GTK_COMBO_BOX(window->UserPasswordCombo),1); if (!strcmp(parsed[4],"sha256")||!strcmp(parsed[4],"sha512")){ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->UserPasswordCombo),parsed[4]); gtk_entry_set_text(GTK_ENTRY(window->UserPasswordEntry),parsed[5]); @@ -1040,7 +1047,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); if (!window->sections) { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(window->SourceListBox)); return; } @@ -1149,7 +1156,7 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ int username_check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsernameCheck)); char *username = (char*)gtk_entry_get_text(GTK_ENTRY(window->UsernameEntry)); char *user_password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->UserPasswordEntry))); - char *encryption = user_password[5]=='|'?yon_char_divide(user_password,6):NULL; + char *encryption = user_password[6]=='|'?yon_char_divide(user_password,6):NULL; if (username_check&&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->UsernameEntry); @@ -1185,7 +1192,13 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ return; } char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":",full_name,NULL); - char *final = yon_char_unite(enabled?"enable":"disable",":",enable_browser?"listing":"",":",port_enabled?port:"",":",username_check?username:"",":",username_check?yon_char_is_empty(encryption)? user_password:encryption:"",":",username_check?!yon_char_is_empty(encryption)?user_password:"":"",NULL); + char *final = yon_char_unite(enabled?"enable":"disable",":", + enable_browser?"listing":"",":", + port_enabled?port:"",":", + username_check?username:"",":", + username_check?yon_char_is_empty(encryption)? user_password:encryption:"",":", + username_check?!yon_char_is_empty(encryption)?user_password:"":"", + NULL); if (!yon_char_is_empty(window->name)&&strcmp(final_name,window->name)){ yon_config_remove_by_key(REPOPUBLIC_WEB_full(window->name)); } @@ -1198,7 +1211,7 @@ void on_mirror_accept(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); mirror_add_window *window = yon_dictionary_get_data(dict->first->next,mirror_add_window*); if (!window->sections) { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent((window->PathBox)))))); return; } diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 8b70319..6a198c3 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -13,7 +13,7 @@ #define ADD_WEB_LABEL _("Add repository for publication") #define EDIT_WEB_LABEL _("Edit repository for publication") - #define PASSWORD_MISMATCH_LABEL _("passwords do not match") + #define PASSWORD_MISMATCH_LABEL _("Passwords do not match") #define REPO_TOOLTIP_LABEL _("file://\t\t- Directory URL prefix for repository\n\ ftp://\t\t- FTP URL prefix for repository\n\ diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 1c041da..2f4e60f 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -376,7 +376,6 @@ False False User password - False False * ****** diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index 476d005..f0abaab 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -83,6 +83,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + From 0353fc99059ba12e9e51ed07bb1d6563aaaf83d0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 11:52:13 +0600 Subject: [PATCH 08/63] Web publication deleting fix --- source/ubl-settings-update.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 5172548..398a41b 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -715,18 +715,8 @@ void on_web_publish_remove_accept(GtkWidget *, main_window *widgets){ if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->WebPublicationTree)),&model,&iter)) { return; } - char *storage; - char *repositories; - gtk_tree_model_get(model,&iter,1,&storage,2,&repositories,-1); char *full_name = NULL; - if (!yon_char_is_empty(repositories)){ - int size; - config_str parsed = yon_char_parse(repositories,&size,"\n"); - char *temp = yon_char_parsed_to_string(parsed,size,","); - full_name=yon_char_unite(storage,":",temp); - free(temp); - yon_char_parsed_free(parsed,size); - } else full_name = storage; + gtk_tree_model_get(model,&iter,8,&full_name,-1); yon_config_remove_by_key(REPOPUBLIC_WEB_full(full_name)); yon_interface_update(widgets); } From 9e6e6fbff20d6831c853dc2f0f657a43060c3421 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 14:56:06 +0600 Subject: [PATCH 09/63] Fixed mirror deleting --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 398a41b..3adb964 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -729,7 +729,7 @@ void on_mirror_remove_accept(GtkWidget *, main_window *widgets){ } char *repo; gtk_tree_model_get(model,&iter,0,&repo,-1); - yon_config_remove_by_key(repo); + yon_config_remove_by_key(REPOPUBLIC_CACHE_full(repo)); yon_interface_update(widgets); } From 1e5002078a642b52a97b8061cf765225c2fb3334 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 16:59:48 +0600 Subject: [PATCH 10/63] Changed sources logic at repo window; changed types logic at mirror window --- source/ubl-settings-update.c | 41 ++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 3adb964..936fc4c 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1036,7 +1036,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); - if (!window->sections) { + if (!window->sections&&yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->RepoSourceEntry)))) { yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(window->SourceListBox)); return; @@ -1050,10 +1050,20 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ int enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->EnabledCheck)); char *sources = ""; dictionary *dact = NULL; - for_dictionaries (dact, window->sections){ - char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(((path_section*)dact->data)->TypeCombo)); - char *cur = yon_char_unite(type?type:"",type?"@":"",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); - char *temp = yon_char_unite(sources,!yon_char_is_empty(sources)?",":"",cur,NULL); + if (window->sections){ + for_dictionaries (dact, window->sections){ + char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(((path_section*)dact->data)->TypeCombo)); + char *cur = yon_char_unite(type?type:"",type?"@":"",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); + char *temp = yon_char_unite(sources,!yon_char_is_empty(sources)?",":"",cur,NULL); + if (!yon_char_is_empty(sources)) free(sources); + sources = temp; + } + } + char *source_main = (char*)gtk_entry_get_text(GTK_ENTRY(window->RepoSourceEntry)); + if (!yon_char_is_empty(source_main)) { + char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSourceCombo)); + source_main = yon_char_unite(type?type:"",type?"@":"",source_main,NULL); + char *temp = yon_char_unite(sources,!yon_char_is_empty(sources)?",":"",source_main,NULL); if (!yon_char_is_empty(sources)) free(sources); sources = temp; } @@ -1200,18 +1210,27 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ void on_mirror_accept(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); mirror_add_window *window = yon_dictionary_get_data(dict->first->next,mirror_add_window*); - if (!window->sections) { + if (!window->sections&&yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->TypeEntry)))) { yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent((window->PathBox)))))); return; } char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); char *paths = ""; - dictionary *dact = NULL; - for_dictionaries (dact, window->sections){ - - char *cur = yon_char_unite(gtk_combo_box_get_active_id(GTK_COMBO_BOX(((path_section*)dact->data)->TypeCombo)),"@",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); - char *temp = yon_char_unite(paths,!yon_char_is_empty(paths)?",":"",cur,NULL); + if (window->sections){ + dictionary *dact = NULL; + for_dictionaries (dact, window->sections){ + char *cur = yon_char_unite(gtk_combo_box_get_active_id(GTK_COMBO_BOX(((path_section*)dact->data)->TypeCombo)),"@",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); + char *temp = yon_char_unite(paths,!yon_char_is_empty(paths)?",":"",cur,NULL); + if (!yon_char_is_empty(paths)) free(paths); + paths = temp; + } + } + char *source_main = (char*)gtk_entry_get_text(GTK_ENTRY(window->TypeEntry)); + if (!yon_char_is_empty(source_main)) { + char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->TypeCombo)); + source_main = yon_char_unite(type?type:"",type?"@":"",source_main,NULL); + char *temp = yon_char_unite(paths,!yon_char_is_empty(paths)?",":"",source_main,NULL); if (!yon_char_is_empty(paths)) free(paths); paths = temp; } From 61602d2516ce0401a2315efc843748448eab5883 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Dec 2024 17:06:28 +0600 Subject: [PATCH 11/63] Fixed error widget highlight at mirror and repo windows --- source/ubl-settings-update.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 936fc4c..b5aa1c5 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1037,8 +1037,8 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); if (!window->sections&&yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->RepoSourceEntry)))) { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(window->SourceListBox)); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->RepoSourceEntry); return; } const char *repo_name = gtk_entry_get_text(GTK_ENTRY(window->RepoNameEntry)); @@ -1211,8 +1211,8 @@ void on_mirror_accept(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); mirror_add_window *window = yon_dictionary_get_data(dict->first->next,mirror_add_window*); if (!window->sections&&yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->TypeEntry)))) { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - yon_ubl_status_highlight_incorrect(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent((window->PathBox)))))); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->TypeEntry); return; } char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); From 96a3a6d42bbc1c9bfa29d73f56342e4a8c486b65 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 15:17:54 +0600 Subject: [PATCH 12/63] Fixed styles --- ubl-settings-update-mirror-add.glade | 4 ++-- ubl-settings-update-mirror-configure.glade | 4 ++-- ubl-settings-update-mirror-path-add.glade | 8 -------- ubl-settings-update-password.glade | 2 +- ubl-settings-update-repo-add.glade | 4 ++-- ubl-settings-update-repo-path-add.glade | 8 -------- ubl-settings-update.glade | 2 +- 7 files changed, 8 insertions(+), 24 deletions(-) diff --git a/ubl-settings-update-mirror-add.glade b/ubl-settings-update-mirror-add.glade index 46f836b..cb56a6c 100644 --- a/ubl-settings-update-mirror-add.glade +++ b/ubl-settings-update-mirror-add.glade @@ -17,7 +17,7 @@ 500 False True - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update True @@ -324,7 +324,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si True False 32 - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index 8a1d477..cd0bd8b 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -38,7 +38,7 @@ 500 False True - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update True @@ -560,7 +560,7 @@ True False 32 - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-mirror-path-add.glade b/ubl-settings-update-mirror-path-add.glade index 167bd1a..2f7c3f7 100644 --- a/ubl-settings-update-mirror-path-add.glade +++ b/ubl-settings-update-mirror-path-add.glade @@ -26,10 +26,6 @@ True Remove image2 - False @@ -80,10 +76,6 @@ True Edit image1 - False diff --git a/ubl-settings-update-password.glade b/ubl-settings-update-password.glade index 79105de..d3548a2 100644 --- a/ubl-settings-update-password.glade +++ b/ubl-settings-update-password.glade @@ -18,7 +18,7 @@ False True 450 - com.ublinux.ubl-settings-usergroups + com.ublinux.ubl-settings-update True diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index caa9db1..2fe5c9e 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -18,7 +18,7 @@ 300 False True - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update True @@ -1061,7 +1061,7 @@ Configuration - configuration path True False 32 - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-repo-path-add.glade b/ubl-settings-update-repo-path-add.glade index 04856c9..c3fed8f 100644 --- a/ubl-settings-update-repo-path-add.glade +++ b/ubl-settings-update-repo-path-add.glade @@ -26,10 +26,6 @@ True Remove image2 - False @@ -82,10 +78,6 @@ True Edit image1 - False diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index f0abaab..f31a9b6 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -522,7 +522,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False - Update + System update False From a1f57712d6ef3d6aaaa7af8fdeb37be196d33ec1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 15:28:25 +0600 Subject: [PATCH 13/63] Saving fix --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index b5aa1c5..a42f6ed 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1191,7 +1191,7 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ yon_ubl_status_highlight_incorrect(window->PathEntry); return; } - char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":",full_name,NULL); + char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":'",full_name,"'",NULL); char *final = yon_char_unite(enabled?"enable":"disable",":", enable_browser?"listing":"",":", port_enabled?port:"",":", From ed03c0673d5e25e4b962cfbcdd488f20faf42e83 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 17:11:38 +0600 Subject: [PATCH 14/63] Localisation fixes; Added web publish password envryption --- source/ubl-settings-update.c | 7 +- source/ubl-settings-update.h | 3 + source/ubl-strings.h | 1 + ubl-settings-update-repo-add.glade | 5 + ubl-settings-update-web-publication-add.glade | 2 +- ubl-settings-update.pot | 208 ++++++++--------- ubl-settings-update_ru.po | 212 +++++++++--------- 7 files changed, 225 insertions(+), 213 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index a42f6ed..2b9342a 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1333,8 +1333,11 @@ void on_password_accept(GtkWidget *,dictionary *dict){ return; } char *encryption = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->EncryptionCombo)); - char *final_text = yon_char_unite(encryption,"|",password,NULL); - gtk_entry_set_text(GTK_ENTRY(target),final_text); + + int size; + config_str hash = yon_config_load(!strcmp(encryption,"sha512")?sha512_encrypt_command(password):sha256_encrypt_command(password),&size); + yon_char_remove_last_symbol(hash[0],'\n'); + gtk_entry_set_text(GTK_ENTRY(target),hash[0]); } gtk_widget_destroy(window->Window); diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 9082b1d..6a5cf4d 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -41,6 +41,9 @@ #define LocaleName "ubl-settings-update" #define icon_path "com.ublinux.ubl-settings-update" +#define sha256_encrypt_command(taget) yon_char_unite("echo -n \"",target,"\" | sha256sum | cut -f 1 -d ' '",NULL) +#define sha512_encrypt_command(taget) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) + #define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) #define config_get_local_command "ubconfig --source system get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]" #define config_get_global_command "ubconfig --source global get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]" diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 6a198c3..e96bffa 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -48,6 +48,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si #define _LABEL _("Storage path to publish") #define _LABEL _("The full URL of where to find the database, packages, and signatures (if available) for this repository. Multiple can be specified, separated by commas (,)") #define _LABEL _("Update") + #define _LABEL _("System update") #define _LABEL _("Repositories") #define _LABEL _("Publication") #define _LABEL _("WEB-publication") diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 2fe5c9e..088f105 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -901,6 +901,7 @@ Configuration - configuration path True True False + True True @@ -920,6 +921,7 @@ Configuration - configuration path True + False True False True @@ -942,6 +944,7 @@ Configuration - configuration path True + False True False True @@ -964,6 +967,7 @@ Configuration - configuration path True + False True False True @@ -989,6 +993,7 @@ Configuration - configuration path True + False True False True diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 2f4e60f..eab009b 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -25,7 +25,7 @@ 500 False True - com.ublinux.ubl-settings-repomanager + com.ublinux.ubl-settings-update True diff --git a/ubl-settings-update.pot b/ubl-settings-update.pot index 3a5dd3f..01b9281 100644 --- a/ubl-settings-update.pot +++ b/ubl-settings-update.pot @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:4 +#: source/ubl-strings.h:4 source/ubl-strings.h:51 msgid "System update" msgstr "" @@ -58,7 +58,7 @@ msgid "Edit repository for publication" msgstr "" #: source/ubl-strings.h:16 -msgid "passwords do not match" +msgid "Passwords do not match" msgstr "" #: source/ubl-strings.h:18 @@ -137,420 +137,420 @@ msgid "" "commas (,)" msgstr "" -#: source/ubl-strings.h:50 source/ubl-strings.h:80 +#: source/ubl-strings.h:50 source/ubl-strings.h:81 msgid "Update" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:52 msgid "Repositories" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:53 msgid "Publication" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:54 msgid "WEB-publication" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:55 msgid "Mirror publication" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:56 msgid "Date of last automatic update:" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:57 msgid "Date of last automatic update" msgstr "" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:58 msgid "Automatic update" msgstr "" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:59 msgid "First update all modules and then the system" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:60 msgid "Update only modules" msgstr "" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:61 msgid "Update everything in the order of the specified repositories" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:62 msgid "Update mode:" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:63 msgid "Update interval:" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:65 msgid "Update mode" msgstr "" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:66 msgid "Update interval" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:67 msgid "Boot" msgstr "" -#: source/ubl-strings.h:67 source/ubl-strings.h:150 +#: source/ubl-strings.h:68 source/ubl-strings.h:151 msgid "Minutes" msgstr "" -#: source/ubl-strings.h:68 source/ubl-strings.h:151 +#: source/ubl-strings.h:69 source/ubl-strings.h:152 msgid "Hours" msgstr "" -#: source/ubl-strings.h:69 source/ubl-strings.h:152 +#: source/ubl-strings.h:70 source/ubl-strings.h:153 msgid "Days" msgstr "" -#: source/ubl-strings.h:70 source/ubl-strings.h:153 +#: source/ubl-strings.h:71 source/ubl-strings.h:154 msgid "Months" msgstr "" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:72 msgid "Repositories from which the update will occur" msgstr "" -#: source/ubl-strings.h:72 source/ubl-strings.h:95 +#: source/ubl-strings.h:73 source/ubl-strings.h:96 msgid "Repositories list:" msgstr "" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:74 msgid "Repositories list" msgstr "" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:75 msgid "Default" msgstr "" -#: source/ubl-strings.h:75 source/ubl-strings.h:97 +#: source/ubl-strings.h:76 source/ubl-strings.h:98 msgid "Choose" msgstr "" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:77 msgid "Chosen" msgstr "" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:78 msgid "Repository" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:79 msgid "Manage repository list" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:80 msgid "Disable system repositories" msgstr "" -#: source/ubl-strings.h:81 +#: source/ubl-strings.h:82 msgid "Move up" msgstr "" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:83 msgid "Move down" msgstr "" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:84 msgid "Add" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:85 msgid "Edit" msgstr "" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:86 msgid "Remove" msgstr "" -#: source/ubl-strings.h:86 +#: source/ubl-strings.h:87 msgid "Enabled" msgstr "" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:88 msgid "Source" msgstr "" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:89 msgid "Signature level" msgstr "" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:90 msgid "Usage level" msgstr "" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:91 msgid "Repository connection configuration" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:92 msgid "" "Setting up a connection to a distributed repository network and publishing " "your repositories" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:93 msgid "Connect and publish" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:94 msgid "Recieve DB packages from shared network" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:95 msgid "Repositories for publishing" msgstr "" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "All repositories" msgstr "" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:99 msgid "Accept" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "Repository name" msgstr "" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:101 msgid "" "Setting up publication of storage and/or repositories as a local WEB resource" msgstr "" -#: source/ubl-strings.h:101 source/ubl-strings.h:142 +#: source/ubl-strings.h:102 source/ubl-strings.h:143 msgid "Authorization parameters" msgstr "" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Storage" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:104 msgid "Chosen repositories" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Reviewer" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Port" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:107 msgid "Name" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "Password/Hash type" msgstr "" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:109 msgid "Password/Password hash" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "" "Setting up publication of a lazy mirror of connected repositories as a local " "WEB resource" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:111 msgid "Publish lazy mirror" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "Type" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "Resource URL" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "Configure" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:115 msgid "Mirror publish configuration" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:116 msgid "Service port:" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:117 msgid "Cache directory:" msgstr "" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Duration of inactivity (in seconds):" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Timeout (in seconds) for loading internel cache:" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "Work through proxy:" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "User agent:" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Standard expression for cron:" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:123 msgid "" "The number of consecutie days that systems on the network have not been " "updated:" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "The number of consecutive days wthout an update requested:" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Add mirror" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:126 msgid "Repository name:" msgstr "" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Repository type:" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "WEB link" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "Proxy server" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:130 msgid "Mirrors file" msgstr "" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "Source:" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "Configuration" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "Sign level:" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "Enable repository update" msgstr "" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:135 msgid "Enable repository search" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "" "Enable installation of packages from this repository during --sync operation" msgstr "" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:137 msgid "" "Allow this repository to be a valid source of packages when running --" "sysupgrade" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Enable publishing of local repository as WEB resource" msgstr "" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:139 msgid "Path to publication directory:" msgstr "" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Port:" msgstr "" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:141 msgid "Publishing parameters" msgstr "" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "Enable WEB file browser" msgstr "" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:144 msgid "Set" msgstr "" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:145 msgid "Username:" msgstr "" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "User password:" msgstr "" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:147 msgid "Not encrypted" msgstr "" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "Encrypted with SHA256" msgstr "" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:149 msgid "Encrypted with SHA512" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "System" msgstr "" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Sign level" msgstr "" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Password input" msgstr "" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:157 msgid "Password:" msgstr "" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Repeat password:" msgstr "" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:159 msgid "Entryption:" msgstr "" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:160 msgid "Do not encrypt password" msgstr "" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:161 msgid "Password hash:" msgstr "" diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index b061d71..b4fbfc0 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:4 +#: source/ubl-strings.h:4 source/ubl-strings.h:51 msgid "System update" msgstr "Обновление системы" @@ -58,7 +58,7 @@ msgid "Edit repository for publication" msgstr "Редактирование репозитория для публикации" #: source/ubl-strings.h:16 -msgid "passwords do not match" +msgid "Passwords do not match" msgstr "Пароли не совпадают" #: source/ubl-strings.h:18 @@ -113,8 +113,8 @@ msgid "" "• DatabaseTrustAll - If signature is verified only for database\n" msgstr "" "• Never - Проверка подписи выполняться не будет\n" -"• Optional - Подписи будут проверяться при их наличии, но неподписанные " -"базы данных и пакеты также будут приниматься\n" +"• Optional - Подписи будут проверяться при их наличии, но неподписанные базы " +"данных и пакеты также будут приниматься\n" "• Required - Подписи будут необходимы для всех пакетов и баз данных.\n" "• TrustedOnly - Если подпись проверяется для пакетов и базы, она должна " "находиться в связке ключей и быть полностью доверенной; маргинальное доверие " @@ -170,163 +170,163 @@ msgstr "" "Полный адрес места, где можно найти базу данных, пакеты и подписа (если " "доступны) для этого репозитория. Возможно указать несколько через запятую (,)" -#: source/ubl-strings.h:50 source/ubl-strings.h:80 +#: source/ubl-strings.h:50 source/ubl-strings.h:81 msgid "Update" msgstr "Обновить" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:52 msgid "Repositories" msgstr "Репозитории" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:53 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:54 msgid "WEB-publication" msgstr "WEB-публикация" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:55 msgid "Mirror publication" msgstr "Публикация зеркала" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:56 msgid "Date of last automatic update:" msgstr "Дата последнего автообновления:" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:57 msgid "Date of last automatic update" msgstr "Дата последнего автообновления" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:58 msgid "Automatic update" msgstr "Автоматическое обновление" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:59 msgid "First update all modules and then the system" msgstr "Вначале обновлять все модули и после систему" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:60 msgid "Update only modules" msgstr "Обновлять только модули" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:61 msgid "Update everything in the order of the specified repositories" msgstr "Обновлять всё в порядке указанных репозиториев" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:62 msgid "Update mode:" msgstr "Режим обновления:" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:63 msgid "Update interval:" msgstr "Интервал обновлений:" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:65 msgid "Update mode" msgstr "Режим обновления" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:66 msgid "Update interval" msgstr "Интервал обновлений" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:67 msgid "Boot" msgstr "Запуск" -#: source/ubl-strings.h:67 source/ubl-strings.h:150 +#: source/ubl-strings.h:68 source/ubl-strings.h:151 msgid "Minutes" msgstr "минут" -#: source/ubl-strings.h:68 source/ubl-strings.h:151 +#: source/ubl-strings.h:69 source/ubl-strings.h:152 msgid "Hours" msgstr "часов" -#: source/ubl-strings.h:69 source/ubl-strings.h:152 +#: source/ubl-strings.h:70 source/ubl-strings.h:153 msgid "Days" msgstr "дней" -#: source/ubl-strings.h:70 source/ubl-strings.h:153 +#: source/ubl-strings.h:71 source/ubl-strings.h:154 msgid "Months" msgstr "месяцев" -#: source/ubl-strings.h:71 +#: source/ubl-strings.h:72 msgid "Repositories from which the update will occur" msgstr "Репозитории с которых будет происходить обновление" -#: source/ubl-strings.h:72 source/ubl-strings.h:95 +#: source/ubl-strings.h:73 source/ubl-strings.h:96 msgid "Repositories list:" msgstr "Список репозиториев:" -#: source/ubl-strings.h:73 +#: source/ubl-strings.h:74 msgid "Repositories list" msgstr "Список репозиториев" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:75 msgid "Default" msgstr "По умолчанию" -#: source/ubl-strings.h:75 source/ubl-strings.h:97 +#: source/ubl-strings.h:76 source/ubl-strings.h:98 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:76 +#: source/ubl-strings.h:77 msgid "Chosen" msgstr "Выбран" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:78 msgid "Repository" msgstr "Репозиторий" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:79 msgid "Manage repository list" msgstr "Управление списком репозиториев" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:80 msgid "Disable system repositories" msgstr "Отключить системные репозитории" -#: source/ubl-strings.h:81 +#: source/ubl-strings.h:82 msgid "Move up" msgstr "Переместить выше" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:83 msgid "Move down" msgstr "Переместить ниже" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:84 msgid "Add" msgstr "Добавить" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:85 msgid "Edit" msgstr "Изменить" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:86 msgid "Remove" msgstr "Удалить" -#: source/ubl-strings.h:86 +#: source/ubl-strings.h:87 msgid "Enabled" msgstr "Включен" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:88 msgid "Source" msgstr "Источник" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:89 msgid "Signature level" msgstr "Уровень подписи" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:90 msgid "Usage level" msgstr "Уровень использования" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:91 msgid "Repository connection configuration" msgstr "Настройки подключения репозитория" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:92 msgid "" "Setting up a connection to a distributed repository network and publishing " "your repositories" @@ -334,70 +334,70 @@ msgstr "" "Настройки подключения к распределённой сети репозиториев и публикация своих " "репозиториев" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:93 msgid "Connect and publish" msgstr "Подключиться и опубликовать" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:94 msgid "Recieve DB packages from shared network" msgstr "Получать БД пакетов из распределённой сети" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:95 msgid "Repositories for publishing" msgstr "Репозитории для публикации" -#: source/ubl-strings.h:96 +#: source/ubl-strings.h:97 msgid "All repositories" msgstr "Все репозитории" -#: source/ubl-strings.h:98 +#: source/ubl-strings.h:99 msgid "Accept" msgstr "Принять" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:100 msgid "Repository name" msgstr "Имя репозитория" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:101 msgid "" "Setting up publication of storage and/or repositories as a local WEB resource" msgstr "" "Настройка публикации хранилища и/или репозиториев в виде локального WEB " "ресурса" -#: source/ubl-strings.h:101 source/ubl-strings.h:142 +#: source/ubl-strings.h:102 source/ubl-strings.h:143 msgid "Authorization parameters" msgstr "Параметры авторизации" -#: source/ubl-strings.h:102 +#: source/ubl-strings.h:103 msgid "Storage" msgstr "Хранилище" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:104 msgid "Chosen repositories" msgstr "Выбранные репозитории" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:105 msgid "Reviewer" msgstr "Обозреватель" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:106 msgid "Port" msgstr "Порт" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:107 msgid "Name" msgstr "Имя пользователя" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:108 msgid "Password/Hash type" msgstr "Пароль/Тип хэша" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:109 msgid "Password/Password hash" msgstr "Пароль/Хэш пароля" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:110 msgid "" "Setting up publication of a lazy mirror of connected repositories as a local " "WEB resource" @@ -405,117 +405,117 @@ msgstr "" "Настройка публикации ленивого зеркала подключенных репозиториев в виде " "локального WEB ресурса" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:111 msgid "Publish lazy mirror" msgstr "Опубликовать ленивое зеркало" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:112 msgid "Type" msgstr "Тип" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:113 msgid "Resource URL" msgstr "Ресурс URL" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:114 msgid "Configure" msgstr "Настроить" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:115 msgid "Mirror publish configuration" msgstr "Параметры публикации зеркала" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:116 msgid "Service port:" msgstr "Порт сервиса:" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:117 msgid "Cache directory:" msgstr "Каталог кеша:" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:118 msgid "Duration of inactivity (in seconds):" msgstr "Продолжительность бездействия (в секундах):" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:119 msgid "Timeout (in seconds) for loading internel cache:" msgstr "Таймаут (в секундах) для загрузки интернет-кэша:" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:120 msgid "Work through proxy:" msgstr "Работать через прокси:" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:121 msgid "User agent:" msgstr "Пользовательский агент:" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:122 msgid "Standard expression for cron:" msgstr "Стандартное выражение cron:" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:123 msgid "" "The number of consecutie days that systems on the network have not been " "updated:" msgstr "" "Количество дней подряд, в течение которых не обновляются системы в сети:" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:124 msgid "The number of consecutive days wthout an update requested:" msgstr "" "Количество дней подряд, в течение которых не было запрошено обновление:" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:125 msgid "Add mirror" msgstr "Добавить зеркало" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:126 msgid "Repository name:" msgstr "Имя репозитория:" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:127 msgid "Repository type:" msgstr "Тип репозитория:" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:128 msgid "WEB link" msgstr "Вэб ссылка" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:129 msgid "Proxy server" msgstr "Прокси-сервер" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:130 msgid "Mirrors file" msgstr "Файл зеркал" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:131 msgid "Source:" msgstr "Источник:" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:132 msgid "Configuration" msgstr "Конфигурация" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:133 msgid "Sign level:" msgstr "Уровень подписи:" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:134 msgid "Enable repository update" msgstr "Включать обновления для этого репозитория" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:135 msgid "Enable repository search" msgstr "Включать поиск этого репозитория" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:136 msgid "" "Enable installation of packages from this repository during --sync operation" msgstr "" "Включать установку пакетов из этого репозитория во время операции --sync" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:137 msgid "" "Allow this repository to be a valid source of packages when running --" "sysupgrade" @@ -523,79 +523,79 @@ msgstr "" "Позволить этому репозиторию быть действительным источником пакетов при " "выполнении --sysupgrade" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:138 msgid "Enable publishing of local repository as WEB resource" msgstr "Включить публикацию локального репозитория в виде WEB ресурса" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:139 msgid "Path to publication directory:" msgstr "Хранилище:" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:140 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:141 msgid "Publishing parameters" msgstr "Параметры публикации" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:142 msgid "Enable WEB file browser" msgstr "Включить WEB обозреватель файлов" -#: source/ubl-strings.h:143 +#: source/ubl-strings.h:144 msgid "Set" msgstr "Задать" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:145 msgid "Username:" msgstr "Имя пользователя:" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:146 msgid "User password:" msgstr "Пароль:" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:147 msgid "Not encrypted" msgstr "Пароль не требуется" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:148 msgid "Encrypted with SHA256" msgstr "Шфировать с SHA256" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:149 msgid "Encrypted with SHA512" msgstr "Шифровать с SHA512" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "System" msgstr "Система" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Sign level" msgstr "Уровень подписи:" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Password input" msgstr "Ввод пароля" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:157 msgid "Password:" msgstr "Пароль:" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:158 msgid "Repeat password:" msgstr "Подтвердите ввод пароля:" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:159 msgid "Entryption:" msgstr "Алгоритм шифрования пароля:" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:160 msgid "Do not encrypt password" msgstr "Не шифровать пароль" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:161 msgid "Password hash:" msgstr "Пароль/Хэш пароля" From c722432c87ed4a8b72402cce08cea77189622524 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 17:18:49 +0600 Subject: [PATCH 15/63] Fixed source type conficuration wasn't showing up --- source/ubl-settings-update.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 2b9342a..7d7af83 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1438,7 +1438,11 @@ void on_repo_source_add(GtkWidget *, repo_add_window *window){ section->TypeCombo = yon_gtk_builder_get_widget(builder,"TypeCombo"); section->edits=0; - gtk_combo_box_set_active_id(GTK_COMBO_BOX(section->TypeCombo),gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSourceCombo))); + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSourceCombo)); + if (!yon_char_is_empty(id)) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(section->TypeCombo),id); + else + gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),4); yon_dictionary_add_or_create_if_exists_with_data(window->sections,(char*)target,section); gtk_entry_set_text(GTK_ENTRY(section->PathEntry),target); From 82b9b8779ccbe963606aa035b0d5bdc19ea91551 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 18:19:32 +0600 Subject: [PATCH 16/63] Sign levels changes --- source/ubl-settings-update.c | 136 ++---- source/ubl-settings-update.h | 21 +- ubl-settings-update-repo-add.glade | 673 ++++++----------------------- 3 files changed, 175 insertions(+), 655 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 7d7af83..7ed1736 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -796,37 +796,15 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->SignDefaultCheck),0); int cur_size; config_str siglevel = yon_char_parse(parsed[1],&cur_size,","); - if (!strcmp(siglevel[0],"Never")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->NeverRadio),1); - } else if (!strcmp(siglevel[0],"Optional")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->OptionalRadio),1); - } else if (!strcmp(siglevel[0],"Required")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->RequiredRadio),1); - } else if (!strcmp(siglevel[0],"TrustedOnly")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->TrustedOnlyRadio),1); - } else if (!strcmp(siglevel[0],"TrustAll")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->TrustAllRadio),1); - } - if (!strcmp(siglevel[1],"PackageNever")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PackageNeverRadio),1); - } else if (!strcmp(siglevel[1],"DatabaseNever")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DatabaseNeverRadio),1); - } else if (!strcmp(siglevel[1],"PackageOptional")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PackageOptionalRadio),1); - } else if (!strcmp(siglevel[1],"DatabaseOptional")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DatabaseOptionalRadio),1); - } else if (!strcmp(siglevel[1],"PackageRequired")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PackageRequiredRadio),1); - } else if (!strcmp(siglevel[1],"DatabaseRequired")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DatabaseRequiredRadio),1); - } else if (!strcmp(siglevel[1],"PackageTrustedOnly")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PackageTrustedOnlyRadio),1); - } else if (!strcmp(siglevel[1],"DatabaseTrustedOnly")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DatabaseTrustedOnlyRadio),1); - } else if (!strcmp(siglevel[1],"PackageTrustAll")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PackageTrustAllRadio),1); - } else if (!strcmp(siglevel[1],"DatabaseTrustAll")){ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->DatabaseTrustAllRadio),1); + + GtkTreeModel *model = GTK_TREE_MODEL(window->SignList); + GtkTreeIter iter; + for_iter (model,&iter){ + char *target; + gtk_tree_model_get(model,&iter,1,&target,-1); + if (yon_char_parsed_check_exist(siglevel,cur_size,target)>-1){ + gtk_list_store_set(window->SignList,&iter,0,1,-1); + } } } if (size>2&&!yon_char_is_empty(parsed[2])){ @@ -1073,40 +1051,20 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ return; } - char *sign_level_package = ""; - char *sign_level_condiition = ""; - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->NeverRadio))){ - sign_level_package="Never"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->OptionalRadio))){ - sign_level_package="Optional"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->RequiredRadio))){ - sign_level_package="Required"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->TrustedOnlyRadio))){ - sign_level_package="TrustedOnly"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->TrustAllRadio))){ - sign_level_package="TrustAll"; - } - - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PackageNeverRadio))){ - sign_level_condiition="PackageNever"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DatabaseNeverRadio))){ - sign_level_condiition="DatabaseNever"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PackageOptionalRadio))){ - sign_level_condiition="PackageOptional"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DatabaseOptionalRadio))){ - sign_level_condiition="DatabaseOptional"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PackageRequiredRadio))){ - sign_level_condiition="PackageRequired"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DatabaseRequiredRadio))){ - sign_level_condiition="DatabaseRequired"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PackageTrustedOnlyRadio))){ - sign_level_condiition="PackageTrustedOnly"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DatabaseTrustedOnlyRadio))){ - sign_level_condiition="DatabaseTrustedOnly"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PackageTrustAllRadio))){ - sign_level_condiition="PackageTrustAll"; - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->DatabaseTrustAllRadio))){ - sign_level_condiition="DatabaseTrustAll"; + char *sign_level= ""; + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SignDefaultCheck))){ + GtkTreeModel *model = GTK_TREE_MODEL(window->SignList); + GtkTreeIter iter; + for_iter (model,&iter){ + int status; + char *target; + gtk_tree_model_get(model,&iter,0,&status,1,&target,-1); + if (status){ + char *temp = yon_char_unite(sign_level,!yon_char_is_empty(sign_level)?",":"",target,NULL); + if (!yon_char_is_empty(sign_level)) free(sign_level); + sign_level= temp; + } + } } char *usage = ""; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsageDefaultCheck))){ @@ -1132,7 +1090,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ } } - char *final = yon_char_unite(sources,";",sign_level_package,",",sign_level_condiition,";",usage,";",enabled?"":"disable",NULL); + char *final = yon_char_unite(sources,";",sign_level,";",usage,";",enabled?"":"disable",NULL); if (!yon_char_is_empty(window->name)&&strcmp(repo_name,window->name)){ yon_config_remove_by_key(REOSITORY_command(window->name)); @@ -1483,23 +1441,19 @@ password_window *yon_password_window_new(){ return window; } +void on_sign_cell_toggled(GtkWidget *, char *path, repo_add_window *window){ + GtkTreeModel *model = GTK_TREE_MODEL(window->SignList); + GtkTreeIter check_iter; + if (gtk_tree_model_get_iter_from_string(model,&check_iter,path)){ + int check_status; + gtk_tree_model_get(model,&check_iter,0,&check_status,-1); + gtk_list_store_set(window->SignList,&check_iter,0,!check_status,-1); + } +} + void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window){ int status = gtk_toggle_button_get_active(self); - gtk_widget_set_sensitive(window->NeverRadio,!status); - gtk_widget_set_sensitive(window->OptionalRadio,!status); - gtk_widget_set_sensitive(window->RequiredRadio,!status); - gtk_widget_set_sensitive(window->TrustedOnlyRadio,!status); - gtk_widget_set_sensitive(window->TrustAllRadio,!status); - gtk_widget_set_sensitive(window->PackageNeverRadio,!status); - gtk_widget_set_sensitive(window->DatabaseNeverRadio,!status); - gtk_widget_set_sensitive(window->PackageOptionalRadio,!status); - gtk_widget_set_sensitive(window->DatabaseOptionalRadio,!status); - gtk_widget_set_sensitive(window->PackageRequiredRadio,!status); - gtk_widget_set_sensitive(window->DatabaseRequiredRadio,!status); - gtk_widget_set_sensitive(window->PackageTrustedOnlyRadio,!status); - gtk_widget_set_sensitive(window->DatabaseTrustedOnlyRadio,!status); - gtk_widget_set_sensitive(window->PackageTrustAllRadio,!status); - gtk_widget_set_sensitive(window->DatabaseTrustAllRadio,!status); + gtk_widget_set_sensitive(window->SignTree,!status); } repo_add_window *yon_repo_add_window_new(){ @@ -1527,21 +1481,9 @@ repo_add_window *yon_repo_add_window_new(){ window->SourceListBox = yon_gtk_builder_get_widget(builder,"SourceListBox"); window->RepoSourceAddButton = yon_gtk_builder_get_widget(builder,"RepoSourceAddButton"); window->SignDefaultCheck = yon_gtk_builder_get_widget(builder,"SignDefaultCheck"); - window->NeverRadio = yon_gtk_builder_get_widget(builder,"NeverRadio"); - window->OptionalRadio = yon_gtk_builder_get_widget(builder,"OptionalRadio"); - window->RequiredRadio = yon_gtk_builder_get_widget(builder,"RequiredRadio"); - window->TrustedOnlyRadio = yon_gtk_builder_get_widget(builder,"TrustedOnlyRadio"); - window->TrustAllRadio = yon_gtk_builder_get_widget(builder,"TrustAllRadio"); - window->PackageNeverRadio = yon_gtk_builder_get_widget(builder,"PackageNeverRadio"); - window->DatabaseNeverRadio = yon_gtk_builder_get_widget(builder,"DatabaseNeverRadio"); - window->PackageOptionalRadio = yon_gtk_builder_get_widget(builder,"PackageOptionalRadio"); - window->DatabaseOptionalRadio = yon_gtk_builder_get_widget(builder,"DatabaseOptionalRadio"); - window->PackageRequiredRadio = yon_gtk_builder_get_widget(builder,"PackageRequiredRadio"); - window->DatabaseRequiredRadio = yon_gtk_builder_get_widget(builder,"DatabaseRequiredRadio"); - window->PackageTrustedOnlyRadio = yon_gtk_builder_get_widget(builder,"PackageTrustedOnlyRadio"); - window->DatabaseTrustedOnlyRadio = yon_gtk_builder_get_widget(builder,"DatabaseTrustedOnlyRadio"); - window->PackageTrustAllRadio = yon_gtk_builder_get_widget(builder,"PackageTrustAllRadio"); - window->DatabaseTrustAllRadio = yon_gtk_builder_get_widget(builder,"DatabaseTrustAllRadio"); + window->SignTree = yon_gtk_builder_get_widget(builder,"SignTree"); + window->SignCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"SignCell")); + window->SignList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); window->sections = NULL; window->name=NULL; @@ -1554,9 +1496,9 @@ repo_add_window *yon_repo_add_window_new(){ g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageSysupgradeCheck); g_signal_connect(G_OBJECT(window->SignDefaultCheck),"toggled",G_CALLBACK(on_sign_check_toggled),window); + g_signal_connect(G_OBJECT(window->SignCell),"toggled",G_CALLBACK(on_sign_cell_toggled),window); // g_signal_connect(G_OBJECT(window->SourceListBox),"size-allocate",G_CALLBACK(on_scrolled_window_size_allocate),window); gtk_widget_show(window->Window); - gtk_label_set_text(GTK_LABEL(window->SignLevelLabel),SIGN_LEVEL_LABEL); return window; } diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 6a5cf4d..7602ca5 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -172,21 +172,10 @@ typedef struct { GtkWidget *SignLevelLabel; GtkWidget *SignDefaultCheck; - GtkWidget *NeverRadio; - GtkWidget *OptionalRadio; - GtkWidget *RequiredRadio; - GtkWidget *TrustedOnlyRadio; - GtkWidget *TrustAllRadio; - GtkWidget *PackageNeverRadio; - GtkWidget *DatabaseNeverRadio; - GtkWidget *PackageOptionalRadio; - GtkWidget *DatabaseOptionalRadio; - GtkWidget *PackageRequiredRadio; - GtkWidget *DatabaseRequiredRadio; - GtkWidget *PackageTrustedOnlyRadio; - GtkWidget *DatabaseTrustedOnlyRadio; - GtkWidget *PackageTrustAllRadio; - GtkWidget *DatabaseTrustAllRadio; + GtkWidget *SignTree; + GtkCellRenderer *SignCell; + + GtkListStore *SignList; char *name; } repo_add_window; @@ -331,6 +320,8 @@ void on_password_open(GtkWidget *, web_publication_add_window *window); void on_scrolled_window_size_allocate(GtkWidget *, GdkRectangle *allocation, repo_add_window *window); +void on_sign_cell_toggled(GtkWidget *, char *path, repo_add_window *window); + void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window); password_window *yon_password_window_new(); diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 088f105..80cf079 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -304,558 +304,78 @@ Configuration - configuration path True False + vertical 5 - + + Default True - False - vertical - 5 + True + False + True + True + + + False + True + 0 + + + + + True + True + in + 200 - - Default + True + False True - False - True - True - - - False - True - 0 - - - - - True - False - 5 - - - Never - True - False - True - False - Signature verification will not be performed - True - True - RequiredRadio - - - False - True - 0 - - - - - PackageNever - True - False - True - False - For packages only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - - - Optional - True - False - True - False - Signatures will be checked if present, but unsigned databases and packages will also be accepted - True - True - RequiredRadio - - - False - True - 0 - + liststore1 + 0 + both + + - - DatabaseNever - True - False - True - False - For database only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 5 - - - Required - True - False - True - False - Signatures will be required for all packages and databases - True - True - - - False - True - 0 - - - - - PackageOptional - True - False - True - False - For packages only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - 5 - - - TrustedOnly - True - False - True - False - Signatures will be required for all packages and databases - True - True - RequiredRadio - - - False - True - 0 - - - - - DatabaseOptional - True - False - True - False - For database only - True - True - - - False - True - 1 - - - - - False - True - 4 - - - - - True - False - 5 - - - TrustAll - True - False - True - False - If the signature is verified for packages and the database, it must be in the keyring and be fully trusted - True - True - RequiredRadio - - - False - True - 0 - - - - - PackageRequired - True - False - True - False - For packages only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 5 - - - - - True - False - 5 - - - True - False + - + + + 0 + - - False - True - 0 - - - - - DatabaseRequired - True - False - True - False - For database only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - False - True - 6 - - - - - True - False - 5 - - - True - False - - - - - - False - True - 0 - - - - - PackageTrustedOnly - True - False - True - False - For packages only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 7 - - - - - True - False - 5 - - - True - False - - - - - - False - True - 0 - - - - - DatabaseTrustedOnly - True - False - True - False - For database only - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - - False - True - 8 - - - - - True - False - 5 - - True - False + + Sign level - + + + 1 + - - False - True - 0 - - - - - PackageTrustAll - True - False - True - False - If the signature is verified only for packets - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - - False - True - 9 - - - - - True - False - 5 - - True - False + + Description - + + + 2 + - - False - True - 0 - - - - - DatabaseTrustAll - True - False - True - False - If the signature is verified only for the database - True - True - DatabaseOptionalRadio - - - False - True - 1 - - - False - True - 10 - False True - 0 - - - - - True - False - 0 - in - - - True - False - 5 - 5 - 5 - 5 - - - True - True - never - - - True - False - - - True - False - 5 - 5 - - Never - Signature verification will not be performed. Primary -\t- PackageNever - Packages only. Secondary -\t- DatabaseNever - Database only. Secondary -- Optional - Signatures will be verified if present, but unsigned databases and packages will also be accepted. Primary -\t- PackageOptional - Packages only. Secondary -\t- DatabaseOptional - Database only. -- Required - Signatures will be required for all packages and databases. Primary -\t- PackageRequired - Packages only. Secondary -\t- DatabaseRequired - Database only. Secondary -- TrustedOnly - If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable -\t- PackageTrustedOnly - If signature is verified only for packages -\t- DatabaseTrustedOnly - If signature is verified only for database -- TrustAll - If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust) -\t- PackageTrustAll - If signature is verified only for packages -\t- DatabaseTrustAll - If signature is verified only for database - True - 0 - 0 - - - - - - - - - - - - - - - - - True - True 1 @@ -1095,24 +615,91 @@ Configuration - configuration path - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + False + Never + Signature verification will not be performed + + + False + Optional + Signatures will be verified if present, but unsigned databases and packages will also be accepted + + + True + Required + Signatures will be required for all packages and databases + + + False + TrustedOnly + If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable + + + False + TrustAll + If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust) + + + False + PackageNever + Packages only + + + False + DatabaseNever + Database only + + + False + PackageOptional + Packages only + + + True + DatabaseOptional + Database only + + + False + PackageRequired + Packages only + + + False + DatabaseRequired + Database only + + + False + PackageTrustedOnly + If signature is verified only for packages + + + False + DatabaseTrustedOnly + If signature is verified only for database + + + False + PackageTrustAll + If signature is verified only for packages + + + False + DatabaseTrustAll + If signature is verified only for database + + From 1ee60c4d649765671cfc81cf0b71ac60e2d36834 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 18:34:19 +0600 Subject: [PATCH 17/63] Localisation fixes --- source/ubl-strings.h | 25 +-- ubl-settings-update-repo-add.glade | 4 +- ubl-settings-update.pot | 284 +++++++++++++----------- ubl-settings-update_ru.po | 343 +++++++++++++---------------- 4 files changed, 326 insertions(+), 330 deletions(-) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index e96bffa..81acd31 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -23,22 +23,16 @@ Configuration - configuration path") #define MIRROR_TOOLTIP_LABEL _("url - web-link for repository. It is allowed to write multiple, separating with comma (,)\n\ http_proxy - proxy-server for repository, replaces 'http_proxy'. Single parameter per repository\n\ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Single parameter per repository") -#define SIGN_LEVEL_LABEL _("• Never - Signature verification will not be performed\n\ -• Optional - Signatures will be verified if present, but unsigned databases and packages will also be accepted\n\ -• Required - Signatures will be required for all packages and databases\n\ -• TrustedOnly - If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable\n\ -• TrustAll - If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust)\n\ -• PackageNever - Packages only\n\ -• DatabaseNever - Database only\n\ -• PackageOptional - Packages only\n\ -• DatabaseOptional - Database only\n\ -• PackageRequired - Packages only\n\ -• DatabaseRequired - Database only\n\ -• PackageTrustedOnly - If signature is verified only for packages\n\ -• DatabaseTrustedOnly - If signature is verified only for database\n\ -• PackageTrustAll - If signature is verified only for packages\n\ -• DatabaseTrustAll - If signature is verified only for database\n") /* +#define _LABEL _("Signature verification will not be performed") +#define _LABEL _("Signatures will be verified if present, but unsigned databases and packages will also be accepted") +#define _LABEL _("Signatures will be required for all packages and databases") +#define _LABEL _("If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable") +#define _LABEL _("If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust)") +#define _LABEL _("Packages only") +#define _LABEL _("Database only") +#define _LABEL _("If signature is verified only for packages") +#define _LABEL _("If signature is verified only for database") #define _LABEL _("every") #define _LABEL _("Resource link of file path") #define _LABEL _("Open file explorer") @@ -153,6 +147,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si #define _LABEL _("Days") #define _LABEL _("Months") #define _LABEL _("Sign level") + #define _LABEL _("Description") #define _LABEL _("Password input") #define _LABEL _("Password:") #define _LABEL _("Repeat password:") diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 80cf079..8409ea9 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -363,7 +363,9 @@ Configuration - configuration path Description - + + 350 + 2 diff --git a/ubl-settings-update.pot b/ubl-settings-update.pot index 01b9281..d71078d 100644 --- a/ubl-settings-update.pot +++ b/ubl-settings-update.pot @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:4 source/ubl-strings.h:51 +#: source/ubl-strings.h:4 source/ubl-strings.h:45 msgid "System update" msgstr "" @@ -80,477 +80,501 @@ msgid "" "file! Single parameter per repository" msgstr "" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:27 +msgid "Signature verification will not be performed" +msgstr "" + +#: source/ubl-strings.h:28 msgid "" -"• Never - Signature verification will not be performed\n" -"• Optional - Signatures will be verified if present, but unsigned databases " -"and packages will also be accepted\n" -"• Required - Signatures will be required for all packages and databases\n" -"• TrustedOnly - If signature is verified for packages and database, it must " -"be in the keyring and fully trusted; marginal trust not applicable\n" -"• TrustAll - If signature is verified, it must be in keyring, but does not " -"need to have a trust level assigned (e.g. unknown or marginal trust)\n" -"• PackageNever - Packages only\n" -"• DatabaseNever - Database only\n" -"• PackageOptional - Packages only\n" -"• DatabaseOptional - Database only\n" -"• PackageRequired - Packages only\n" -"• DatabaseRequired - Database only\n" -"• PackageTrustedOnly - If signature is verified only for packages\n" -"• DatabaseTrustedOnly - If signature is verified only for database\n" -"• PackageTrustAll - If signature is verified only for packages\n" -"• DatabaseTrustAll - If signature is verified only for database\n" +"Signatures will be verified if present, but unsigned databases and packages " +"will also be accepted" msgstr "" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:29 +msgid "Signatures will be required for all packages and databases" +msgstr "" + +#: source/ubl-strings.h:30 +msgid "" +"If signature is verified for packages and database, it must be in the " +"keyring and fully trusted; marginal trust not applicable" +msgstr "" + +#: source/ubl-strings.h:31 +msgid "" +"If signature is verified, it must be in keyring, but does not need to have a " +"trust level assigned (e.g. unknown or marginal trust)" +msgstr "" + +#: source/ubl-strings.h:32 +msgid "Packages only" +msgstr "" + +#: source/ubl-strings.h:33 +msgid "Database only" +msgstr "" + +#: source/ubl-strings.h:34 +msgid "If signature is verified only for packages" +msgstr "" + +#: source/ubl-strings.h:35 +msgid "If signature is verified only for database" +msgstr "" + +#: source/ubl-strings.h:36 msgid "every" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:37 msgid "Resource link of file path" msgstr "" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:38 msgid "Open file explorer" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:39 msgid "Add source" msgstr "" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:40 msgid "Username" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:41 msgid "User password" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:42 msgid "Storage path to publish" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:43 msgid "" "The full URL of where to find the database, packages, and signatures (if " "available) for this repository. Multiple can be specified, separated by " "commas (,)" msgstr "" -#: source/ubl-strings.h:50 source/ubl-strings.h:81 +#: source/ubl-strings.h:44 source/ubl-strings.h:75 msgid "Update" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:46 msgid "Repositories" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:47 msgid "Publication" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:48 msgid "WEB-publication" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:49 msgid "Mirror publication" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:50 msgid "Date of last automatic update:" msgstr "" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:51 msgid "Date of last automatic update" msgstr "" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:52 msgid "Automatic update" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:53 msgid "First update all modules and then the system" msgstr "" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:54 msgid "Update only modules" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:55 msgid "Update everything in the order of the specified repositories" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:56 msgid "Update mode:" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:57 msgid "Update interval:" msgstr "" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:59 msgid "Update mode" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:60 msgid "Update interval" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:61 msgid "Boot" msgstr "" -#: source/ubl-strings.h:68 source/ubl-strings.h:151 +#: source/ubl-strings.h:62 source/ubl-strings.h:145 msgid "Minutes" msgstr "" -#: source/ubl-strings.h:69 source/ubl-strings.h:152 +#: source/ubl-strings.h:63 source/ubl-strings.h:146 msgid "Hours" msgstr "" -#: source/ubl-strings.h:70 source/ubl-strings.h:153 +#: source/ubl-strings.h:64 source/ubl-strings.h:147 msgid "Days" msgstr "" -#: source/ubl-strings.h:71 source/ubl-strings.h:154 +#: source/ubl-strings.h:65 source/ubl-strings.h:148 msgid "Months" msgstr "" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:66 msgid "Repositories from which the update will occur" msgstr "" -#: source/ubl-strings.h:73 source/ubl-strings.h:96 +#: source/ubl-strings.h:67 source/ubl-strings.h:90 msgid "Repositories list:" msgstr "" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:68 msgid "Repositories list" msgstr "" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:69 msgid "Default" msgstr "" -#: source/ubl-strings.h:76 source/ubl-strings.h:98 +#: source/ubl-strings.h:70 source/ubl-strings.h:92 msgid "Choose" msgstr "" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:71 msgid "Chosen" msgstr "" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:72 msgid "Repository" msgstr "" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:73 msgid "Manage repository list" msgstr "" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:74 msgid "Disable system repositories" msgstr "" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:76 msgid "Move up" msgstr "" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:77 msgid "Move down" msgstr "" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:78 msgid "Add" msgstr "" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:79 msgid "Edit" msgstr "" -#: source/ubl-strings.h:86 +#: source/ubl-strings.h:80 msgid "Remove" msgstr "" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:81 msgid "Enabled" msgstr "" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:82 msgid "Source" msgstr "" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:83 msgid "Signature level" msgstr "" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:84 msgid "Usage level" msgstr "" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:85 msgid "Repository connection configuration" msgstr "" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:86 msgid "" "Setting up a connection to a distributed repository network and publishing " "your repositories" msgstr "" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:87 msgid "Connect and publish" msgstr "" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:88 msgid "Recieve DB packages from shared network" msgstr "" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:89 msgid "Repositories for publishing" msgstr "" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:91 msgid "All repositories" msgstr "" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:93 msgid "Accept" msgstr "" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:94 msgid "Repository name" msgstr "" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:95 msgid "" "Setting up publication of storage and/or repositories as a local WEB resource" msgstr "" -#: source/ubl-strings.h:102 source/ubl-strings.h:143 +#: source/ubl-strings.h:96 source/ubl-strings.h:137 msgid "Authorization parameters" msgstr "" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:97 msgid "Storage" msgstr "" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:98 msgid "Chosen repositories" msgstr "" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:99 msgid "Reviewer" msgstr "" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:100 msgid "Port" msgstr "" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:101 msgid "Name" msgstr "" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:102 msgid "Password/Hash type" msgstr "" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:103 msgid "Password/Password hash" msgstr "" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:104 msgid "" "Setting up publication of a lazy mirror of connected repositories as a local " "WEB resource" msgstr "" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:105 msgid "Publish lazy mirror" msgstr "" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:106 msgid "Type" msgstr "" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:107 msgid "Resource URL" msgstr "" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:108 msgid "Configure" msgstr "" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:109 msgid "Mirror publish configuration" msgstr "" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:110 msgid "Service port:" msgstr "" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:111 msgid "Cache directory:" msgstr "" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:112 msgid "Duration of inactivity (in seconds):" msgstr "" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:113 msgid "Timeout (in seconds) for loading internel cache:" msgstr "" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:114 msgid "Work through proxy:" msgstr "" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:115 msgid "User agent:" msgstr "" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:116 msgid "Standard expression for cron:" msgstr "" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:117 msgid "" "The number of consecutie days that systems on the network have not been " "updated:" msgstr "" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:118 msgid "The number of consecutive days wthout an update requested:" msgstr "" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:119 msgid "Add mirror" msgstr "" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:120 msgid "Repository name:" msgstr "" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:121 msgid "Repository type:" msgstr "" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:122 msgid "WEB link" msgstr "" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:123 msgid "Proxy server" msgstr "" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:124 msgid "Mirrors file" msgstr "" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:125 msgid "Source:" msgstr "" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:126 msgid "Configuration" msgstr "" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:127 msgid "Sign level:" msgstr "" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:128 msgid "Enable repository update" msgstr "" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:129 msgid "Enable repository search" msgstr "" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:130 msgid "" "Enable installation of packages from this repository during --sync operation" msgstr "" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:131 msgid "" "Allow this repository to be a valid source of packages when running --" "sysupgrade" msgstr "" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:132 msgid "Enable publishing of local repository as WEB resource" msgstr "" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:133 msgid "Path to publication directory:" msgstr "" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:134 msgid "Port:" msgstr "" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:135 msgid "Publishing parameters" msgstr "" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:136 msgid "Enable WEB file browser" msgstr "" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:138 msgid "Set" msgstr "" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:139 msgid "Username:" msgstr "" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:140 msgid "User password:" msgstr "" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:141 msgid "Not encrypted" msgstr "" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:142 msgid "Encrypted with SHA256" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:143 msgid "Encrypted with SHA512" msgstr "" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:144 msgid "System" msgstr "" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:149 msgid "Sign level" msgstr "" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:149 +msgid "Description" +msgstr "" + +#: source/ubl-strings.h:150 msgid "Password input" msgstr "" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:151 msgid "Password:" msgstr "" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:152 msgid "Repeat password:" msgstr "" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:153 msgid "Entryption:" msgstr "" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:154 msgid "Do not encrypt password" msgstr "" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:155 msgid "Password hash:" msgstr "" diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index b4fbfc0..9f31adb 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-strings.h:4 source/ubl-strings.h:51 +#: source/ubl-strings.h:4 source/ubl-strings.h:45 msgid "System update" msgstr "Обновление системы" @@ -90,78 +90,81 @@ msgstr "" "mirrorlist - файл зерка, убедитесь что URL текущего сервера НЕ включен в " "этот файл! Допускается только один параметр на репозиторий" -#: source/ubl-strings.h:26 -#, fuzzy +#: source/ubl-strings.h:27 +msgid "Signature verification will not be performed" +msgstr "Проверка подписи выполняться не будет" + +#: source/ubl-strings.h:28 msgid "" -"• Never - Signature verification will not be performed\n" -"• Optional - Signatures will be verified if present, but unsigned databases " -"and packages will also be accepted\n" -"• Required - Signatures will be required for all packages and databases\n" -"• TrustedOnly - If signature is verified for packages and database, it must " -"be in the keyring and fully trusted; marginal trust not applicable\n" -"• TrustAll - If signature is verified, it must be in keyring, but does not " -"need to have a trust level assigned (e.g. unknown or marginal trust)\n" -"• PackageNever - Packages only\n" -"• DatabaseNever - Database only\n" -"• PackageOptional - Packages only\n" -"• DatabaseOptional - Database only\n" -"• PackageRequired - Packages only\n" -"• DatabaseRequired - Database only\n" -"• PackageTrustedOnly - If signature is verified only for packages\n" -"• DatabaseTrustedOnly - If signature is verified only for database\n" -"• PackageTrustAll - If signature is verified only for packages\n" -"• DatabaseTrustAll - If signature is verified only for database\n" +"Signatures will be verified if present, but unsigned databases and packages " +"will also be accepted" msgstr "" -"• Never - Проверка подписи выполняться не будет\n" -"• Optional - Подписи будут проверяться при их наличии, но неподписанные базы " -"данных и пакеты также будут приниматься\n" -"• Required - Подписи будут необходимы для всех пакетов и баз данных.\n" -"• TrustedOnly - Если подпись проверяется для пакетов и базы, она должна " -"находиться в связке ключей и быть полностью доверенной; маргинальное доверие " -"не применимо\n" -"• TrustAll - Если подпись проверена, она должна находиться в связке ключей, " -"но ей не требуется назначать уровень доверия (например, неизвестное или " -"предельное доверие)\n" -"• PackageNever - Только для пакетов\n" -"• DatabaseNever - Только для базы данных\n" -"• PackageOptional - Только для пакетов\n" -"• DatabaseOptional - Только для базы данных\n" -"• PackageRequired - Только для пакетов\n" -"• DatabaseRequired - Только для базы данных\n" -"• PackageTrustedOnly - Если подпись проверяется только для пакетов\n" -"• DatabaseTrustedOnly - Если подпись проверяется только для базы данных\n" -"• PackageTrustAll - Если подпись проверена только для пакетов\n" -"• DatabaseTrustAll - Если подпись проверена только для базы данных\n" +"Подписи будут проверяться при их наличии, но неподписанные базы данных и " +"пакеты также будут приниматься" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:29 +msgid "Signatures will be required for all packages and databases" +msgstr "Подписи будут необходимы для всех пакетов и баз данных" + +#: source/ubl-strings.h:30 +msgid "" +"If signature is verified for packages and database, it must be in the " +"keyring and fully trusted; marginal trust not applicable" +msgstr "" +"Если подпись проверяется для пакетов и базы, она должна находиться в связке " +"ключей и быть полностью доверенной" + +#: source/ubl-strings.h:31 +msgid "" +"If signature is verified, it must be in keyring, but does not need to have a " +"trust level assigned (e.g. unknown or marginal trust)" +msgstr "Если подпись проверена, она должна находиться в связке ключей, но ей не требуется назначать уровень доверия (например, неизвестное или предельное доверие)" + +#: source/ubl-strings.h:32 +msgid "Packages only" +msgstr "Только для пакетов" + +#: source/ubl-strings.h:33 +msgid "Database only" +msgstr "Только для базы данных" + +#: source/ubl-strings.h:34 +msgid "If signature is verified only for packages" +msgstr "Если подпись проверяется только для пакетов" + +#: source/ubl-strings.h:35 +msgid "If signature is verified only for database" +msgstr "Если подпись проверяется только для базы данных" + +#: source/ubl-strings.h:36 msgid "every" msgstr "каждые" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:37 msgid "Resource link of file path" msgstr "Ссылка на ресурс или путь до файла" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:38 msgid "Open file explorer" msgstr "Открыть в файловом менеджере" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:39 msgid "Add source" msgstr "Добавить источник" -#: source/ubl-strings.h:46 +#: source/ubl-strings.h:40 msgid "Username" msgstr "Имя пользователя" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:41 msgid "User password" msgstr "Пароль" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:42 msgid "Storage path to publish" msgstr "Путь до каталога хранилища, который будет опубликован" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:43 msgid "" "The full URL of where to find the database, packages, and signatures (if " "available) for this repository. Multiple can be specified, separated by " @@ -170,163 +173,163 @@ msgstr "" "Полный адрес места, где можно найти базу данных, пакеты и подписа (если " "доступны) для этого репозитория. Возможно указать несколько через запятую (,)" -#: source/ubl-strings.h:50 source/ubl-strings.h:81 +#: source/ubl-strings.h:44 source/ubl-strings.h:75 msgid "Update" msgstr "Обновить" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:46 msgid "Repositories" msgstr "Репозитории" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:47 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:48 msgid "WEB-publication" msgstr "WEB-публикация" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:49 msgid "Mirror publication" msgstr "Публикация зеркала" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:50 msgid "Date of last automatic update:" msgstr "Дата последнего автообновления:" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:51 msgid "Date of last automatic update" msgstr "Дата последнего автообновления" -#: source/ubl-strings.h:58 +#: source/ubl-strings.h:52 msgid "Automatic update" msgstr "Автоматическое обновление" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:53 msgid "First update all modules and then the system" msgstr "Вначале обновлять все модули и после систему" -#: source/ubl-strings.h:60 +#: source/ubl-strings.h:54 msgid "Update only modules" msgstr "Обновлять только модули" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:55 msgid "Update everything in the order of the specified repositories" msgstr "Обновлять всё в порядке указанных репозиториев" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:56 msgid "Update mode:" msgstr "Режим обновления:" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:57 msgid "Update interval:" msgstr "Интервал обновлений:" -#: source/ubl-strings.h:65 +#: source/ubl-strings.h:59 msgid "Update mode" msgstr "Режим обновления" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:60 msgid "Update interval" msgstr "Интервал обновлений" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:61 msgid "Boot" msgstr "Запуск" -#: source/ubl-strings.h:68 source/ubl-strings.h:151 +#: source/ubl-strings.h:62 source/ubl-strings.h:145 msgid "Minutes" msgstr "минут" -#: source/ubl-strings.h:69 source/ubl-strings.h:152 +#: source/ubl-strings.h:63 source/ubl-strings.h:146 msgid "Hours" msgstr "часов" -#: source/ubl-strings.h:70 source/ubl-strings.h:153 +#: source/ubl-strings.h:64 source/ubl-strings.h:147 msgid "Days" msgstr "дней" -#: source/ubl-strings.h:71 source/ubl-strings.h:154 +#: source/ubl-strings.h:65 source/ubl-strings.h:148 msgid "Months" msgstr "месяцев" -#: source/ubl-strings.h:72 +#: source/ubl-strings.h:66 msgid "Repositories from which the update will occur" msgstr "Репозитории с которых будет происходить обновление" -#: source/ubl-strings.h:73 source/ubl-strings.h:96 +#: source/ubl-strings.h:67 source/ubl-strings.h:90 msgid "Repositories list:" msgstr "Список репозиториев:" -#: source/ubl-strings.h:74 +#: source/ubl-strings.h:68 msgid "Repositories list" msgstr "Список репозиториев" -#: source/ubl-strings.h:75 +#: source/ubl-strings.h:69 msgid "Default" msgstr "По умолчанию" -#: source/ubl-strings.h:76 source/ubl-strings.h:98 +#: source/ubl-strings.h:70 source/ubl-strings.h:92 msgid "Choose" msgstr "Выбрать" -#: source/ubl-strings.h:77 +#: source/ubl-strings.h:71 msgid "Chosen" msgstr "Выбран" -#: source/ubl-strings.h:78 +#: source/ubl-strings.h:72 msgid "Repository" msgstr "Репозиторий" -#: source/ubl-strings.h:79 +#: source/ubl-strings.h:73 msgid "Manage repository list" msgstr "Управление списком репозиториев" -#: source/ubl-strings.h:80 +#: source/ubl-strings.h:74 msgid "Disable system repositories" msgstr "Отключить системные репозитории" -#: source/ubl-strings.h:82 +#: source/ubl-strings.h:76 msgid "Move up" msgstr "Переместить выше" -#: source/ubl-strings.h:83 +#: source/ubl-strings.h:77 msgid "Move down" msgstr "Переместить ниже" -#: source/ubl-strings.h:84 +#: source/ubl-strings.h:78 msgid "Add" msgstr "Добавить" -#: source/ubl-strings.h:85 +#: source/ubl-strings.h:79 msgid "Edit" msgstr "Изменить" -#: source/ubl-strings.h:86 +#: source/ubl-strings.h:80 msgid "Remove" msgstr "Удалить" -#: source/ubl-strings.h:87 +#: source/ubl-strings.h:81 msgid "Enabled" msgstr "Включен" -#: source/ubl-strings.h:88 +#: source/ubl-strings.h:82 msgid "Source" msgstr "Источник" -#: source/ubl-strings.h:89 +#: source/ubl-strings.h:83 msgid "Signature level" msgstr "Уровень подписи" -#: source/ubl-strings.h:90 +#: source/ubl-strings.h:84 msgid "Usage level" msgstr "Уровень использования" -#: source/ubl-strings.h:91 +#: source/ubl-strings.h:85 msgid "Repository connection configuration" msgstr "Настройки подключения репозитория" -#: source/ubl-strings.h:92 +#: source/ubl-strings.h:86 msgid "" "Setting up a connection to a distributed repository network and publishing " "your repositories" @@ -334,70 +337,70 @@ msgstr "" "Настройки подключения к распределённой сети репозиториев и публикация своих " "репозиториев" -#: source/ubl-strings.h:93 +#: source/ubl-strings.h:87 msgid "Connect and publish" msgstr "Подключиться и опубликовать" -#: source/ubl-strings.h:94 +#: source/ubl-strings.h:88 msgid "Recieve DB packages from shared network" msgstr "Получать БД пакетов из распределённой сети" -#: source/ubl-strings.h:95 +#: source/ubl-strings.h:89 msgid "Repositories for publishing" msgstr "Репозитории для публикации" -#: source/ubl-strings.h:97 +#: source/ubl-strings.h:91 msgid "All repositories" msgstr "Все репозитории" -#: source/ubl-strings.h:99 +#: source/ubl-strings.h:93 msgid "Accept" msgstr "Принять" -#: source/ubl-strings.h:100 +#: source/ubl-strings.h:94 msgid "Repository name" msgstr "Имя репозитория" -#: source/ubl-strings.h:101 +#: source/ubl-strings.h:95 msgid "" "Setting up publication of storage and/or repositories as a local WEB resource" msgstr "" "Настройка публикации хранилища и/или репозиториев в виде локального WEB " "ресурса" -#: source/ubl-strings.h:102 source/ubl-strings.h:143 +#: source/ubl-strings.h:96 source/ubl-strings.h:137 msgid "Authorization parameters" msgstr "Параметры авторизации" -#: source/ubl-strings.h:103 +#: source/ubl-strings.h:97 msgid "Storage" msgstr "Хранилище" -#: source/ubl-strings.h:104 +#: source/ubl-strings.h:98 msgid "Chosen repositories" msgstr "Выбранные репозитории" -#: source/ubl-strings.h:105 +#: source/ubl-strings.h:99 msgid "Reviewer" msgstr "Обозреватель" -#: source/ubl-strings.h:106 +#: source/ubl-strings.h:100 msgid "Port" msgstr "Порт" -#: source/ubl-strings.h:107 +#: source/ubl-strings.h:101 msgid "Name" msgstr "Имя пользователя" -#: source/ubl-strings.h:108 +#: source/ubl-strings.h:102 msgid "Password/Hash type" msgstr "Пароль/Тип хэша" -#: source/ubl-strings.h:109 +#: source/ubl-strings.h:103 msgid "Password/Password hash" msgstr "Пароль/Хэш пароля" -#: source/ubl-strings.h:110 +#: source/ubl-strings.h:104 msgid "" "Setting up publication of a lazy mirror of connected repositories as a local " "WEB resource" @@ -405,117 +408,117 @@ msgstr "" "Настройка публикации ленивого зеркала подключенных репозиториев в виде " "локального WEB ресурса" -#: source/ubl-strings.h:111 +#: source/ubl-strings.h:105 msgid "Publish lazy mirror" msgstr "Опубликовать ленивое зеркало" -#: source/ubl-strings.h:112 +#: source/ubl-strings.h:106 msgid "Type" msgstr "Тип" -#: source/ubl-strings.h:113 +#: source/ubl-strings.h:107 msgid "Resource URL" msgstr "Ресурс URL" -#: source/ubl-strings.h:114 +#: source/ubl-strings.h:108 msgid "Configure" msgstr "Настроить" -#: source/ubl-strings.h:115 +#: source/ubl-strings.h:109 msgid "Mirror publish configuration" msgstr "Параметры публикации зеркала" -#: source/ubl-strings.h:116 +#: source/ubl-strings.h:110 msgid "Service port:" msgstr "Порт сервиса:" -#: source/ubl-strings.h:117 +#: source/ubl-strings.h:111 msgid "Cache directory:" msgstr "Каталог кеша:" -#: source/ubl-strings.h:118 +#: source/ubl-strings.h:112 msgid "Duration of inactivity (in seconds):" msgstr "Продолжительность бездействия (в секундах):" -#: source/ubl-strings.h:119 +#: source/ubl-strings.h:113 msgid "Timeout (in seconds) for loading internel cache:" msgstr "Таймаут (в секундах) для загрузки интернет-кэша:" -#: source/ubl-strings.h:120 +#: source/ubl-strings.h:114 msgid "Work through proxy:" msgstr "Работать через прокси:" -#: source/ubl-strings.h:121 +#: source/ubl-strings.h:115 msgid "User agent:" msgstr "Пользовательский агент:" -#: source/ubl-strings.h:122 +#: source/ubl-strings.h:116 msgid "Standard expression for cron:" msgstr "Стандартное выражение cron:" -#: source/ubl-strings.h:123 +#: source/ubl-strings.h:117 msgid "" "The number of consecutie days that systems on the network have not been " "updated:" msgstr "" "Количество дней подряд, в течение которых не обновляются системы в сети:" -#: source/ubl-strings.h:124 +#: source/ubl-strings.h:118 msgid "The number of consecutive days wthout an update requested:" msgstr "" "Количество дней подряд, в течение которых не было запрошено обновление:" -#: source/ubl-strings.h:125 +#: source/ubl-strings.h:119 msgid "Add mirror" msgstr "Добавить зеркало" -#: source/ubl-strings.h:126 +#: source/ubl-strings.h:120 msgid "Repository name:" msgstr "Имя репозитория:" -#: source/ubl-strings.h:127 +#: source/ubl-strings.h:121 msgid "Repository type:" msgstr "Тип репозитория:" -#: source/ubl-strings.h:128 +#: source/ubl-strings.h:122 msgid "WEB link" msgstr "Вэб ссылка" -#: source/ubl-strings.h:129 +#: source/ubl-strings.h:123 msgid "Proxy server" msgstr "Прокси-сервер" -#: source/ubl-strings.h:130 +#: source/ubl-strings.h:124 msgid "Mirrors file" msgstr "Файл зеркал" -#: source/ubl-strings.h:131 +#: source/ubl-strings.h:125 msgid "Source:" msgstr "Источник:" -#: source/ubl-strings.h:132 +#: source/ubl-strings.h:126 msgid "Configuration" msgstr "Конфигурация" -#: source/ubl-strings.h:133 +#: source/ubl-strings.h:127 msgid "Sign level:" msgstr "Уровень подписи:" -#: source/ubl-strings.h:134 +#: source/ubl-strings.h:128 msgid "Enable repository update" msgstr "Включать обновления для этого репозитория" -#: source/ubl-strings.h:135 +#: source/ubl-strings.h:129 msgid "Enable repository search" msgstr "Включать поиск этого репозитория" -#: source/ubl-strings.h:136 +#: source/ubl-strings.h:130 msgid "" "Enable installation of packages from this repository during --sync operation" msgstr "" "Включать установку пакетов из этого репозитория во время операции --sync" -#: source/ubl-strings.h:137 +#: source/ubl-strings.h:131 msgid "" "Allow this repository to be a valid source of packages when running --" "sysupgrade" @@ -523,79 +526,83 @@ msgstr "" "Позволить этому репозиторию быть действительным источником пакетов при " "выполнении --sysupgrade" -#: source/ubl-strings.h:138 +#: source/ubl-strings.h:132 msgid "Enable publishing of local repository as WEB resource" msgstr "Включить публикацию локального репозитория в виде WEB ресурса" -#: source/ubl-strings.h:139 +#: source/ubl-strings.h:133 msgid "Path to publication directory:" msgstr "Хранилище:" -#: source/ubl-strings.h:140 +#: source/ubl-strings.h:134 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:141 +#: source/ubl-strings.h:135 msgid "Publishing parameters" msgstr "Параметры публикации" -#: source/ubl-strings.h:142 +#: source/ubl-strings.h:136 msgid "Enable WEB file browser" msgstr "Включить WEB обозреватель файлов" -#: source/ubl-strings.h:144 +#: source/ubl-strings.h:138 msgid "Set" msgstr "Задать" -#: source/ubl-strings.h:145 +#: source/ubl-strings.h:139 msgid "Username:" msgstr "Имя пользователя:" -#: source/ubl-strings.h:146 +#: source/ubl-strings.h:140 msgid "User password:" msgstr "Пароль:" -#: source/ubl-strings.h:147 +#: source/ubl-strings.h:141 msgid "Not encrypted" msgstr "Пароль не требуется" -#: source/ubl-strings.h:148 +#: source/ubl-strings.h:142 msgid "Encrypted with SHA256" msgstr "Шфировать с SHA256" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:143 msgid "Encrypted with SHA512" msgstr "Шифровать с SHA512" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:144 msgid "System" msgstr "Система" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:149 msgid "Sign level" -msgstr "Уровень подписи:" +msgstr "Уровень подписи" -#: source/ubl-strings.h:156 +#: source/ubl-strings.h:149 +msgid "Description" +msgstr "Описание" + +#: source/ubl-strings.h:150 msgid "Password input" msgstr "Ввод пароля" -#: source/ubl-strings.h:157 +#: source/ubl-strings.h:151 msgid "Password:" msgstr "Пароль:" -#: source/ubl-strings.h:158 +#: source/ubl-strings.h:152 msgid "Repeat password:" msgstr "Подтвердите ввод пароля:" -#: source/ubl-strings.h:159 +#: source/ubl-strings.h:153 msgid "Entryption:" msgstr "Алгоритм шифрования пароля:" -#: source/ubl-strings.h:160 +#: source/ubl-strings.h:154 msgid "Do not encrypt password" msgstr "Не шифровать пароль" -#: source/ubl-strings.h:161 +#: source/ubl-strings.h:155 msgid "Password hash:" msgstr "Пароль/Хэш пароля" @@ -607,35 +614,3 @@ msgstr "дней" msgid "Cancel" msgstr "Отмена" - -msgid "Signature verification will not be performed" -msgstr "Проверка подписи выполняться не будет" - -msgid "For packages only" -msgstr "Только для пакетов" - -msgid "For database only" -msgstr "Только для базы данных" - -msgid "" -"Signatures will be checked if present, but unsigned databases and " -"packages will also be accepted" -msgstr "" -"Подписи будут проверяться при их наличии, но неподписанные базы данных и " -"пакеты также будут приниматься" - -msgid "Signatures will be required for all packages and databases" -msgstr "Подписи будут необходимы для всех пакетов и баз данных" - -msgid "" -"If the signature is verified for packages and the database, it must be in " -"the keyring and be fully trusted" -msgstr "" -"Если подпись проверяется для пакетов и базы, она должна находиться в " -"связке ключей и быть полностью доверенной" - -msgid "If the signature is verified only for packets" -msgstr "Если подпись проверяется только для пакетов" - -msgid "If the signature is verified only for the database" -msgstr "Если подпись проверяется только для базы данных" From 5c0a5e2ec7caeeb72487eca09d07dcfa8c2650db Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 23 Dec 2024 15:01:04 +0600 Subject: [PATCH 18/63] Fixed update interval loading --- source/ubl-settings-update.c | 19 ++++++++++++++----- source/ubl-settings-update.h | 3 +++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 7ed1736..ea829c6 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -363,18 +363,27 @@ void yon_interface_update(main_window *widgets){ autoupdate_config = config(AUTOUPDATE_interval); if (!yon_char_is_empty(autoupdate_config)){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->UpdateIntervalDefaultCheck),0); - if (strstr(autoupdate_config,"min")){ + int parsed_size; + config_str parsed = yon_char_parse(autoupdate_config,&parsed_size,","); + if (yon_char_parsed_check_exist(parsed,parsed_size,"boot")!=-1){ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->BootCheck),1); + } + if (strstr(parsed[parsed_size-1],"min")){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo),0); - } else if (autoupdate_config[strlen(autoupdate_config)-1]=='h'){ + } else if (parsed[parsed_size-1][strlen(parsed[parsed_size-1])-1]=='h'){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo),1); - } else if (autoupdate_config[strlen(autoupdate_config)-1]=='d'){ + } else if (parsed[parsed_size-1][strlen(parsed[parsed_size-1])-1]=='d'){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo),2); - } else if (autoupdate_config[strlen(autoupdate_config)-1]=='M'){ + } else if (parsed[parsed_size-1][strlen(parsed[parsed_size-1])-1]=='M'){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo),3); } - gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->UpdateIntervalSpin),atol(autoupdate_config)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->UpdateIntervalSpin),atol(parsed[parsed_size-1])); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->UpdateIntervalDefaultCheck),1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->BootCheck),0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->UpdateIntervalSpin),0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo),0); + } } diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 7602ca5..5a2490f 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -83,6 +83,9 @@ #define AUTOUPDATE_timestamp "AUTOUPDATE[timestamp]" #define AUTOUPDATE_timestamp_command "ubconfig --source global get [update] AUTOUPDATE[timestamp]" + +extern template_app_info template_app_information; + typedef char* string; string version_application; From 3be25858605a70458ba6d86c9ac93399572af97a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 23 Dec 2024 17:29:36 +0600 Subject: [PATCH 19/63] Fixed building --- source/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 330c856..dab8897 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -94,10 +94,14 @@ set(LIBRARIES ublsettingsui-gtk3 ) +set (TARGET_DIRS /usr/include/libublsettingsui-gtk3) + add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) +target_include_directories(${PROJECT_NAME} PUBLIC /usr/include/libublsettingsui-gtk3) + set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} PROPERTIES GENERATED TRUE From f6b96efe68c6b8cb567dc59cf5f5e43d36cb45aa Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 09:45:20 +0600 Subject: [PATCH 20/63] Localisation fixes; Design fixes; Bug fixes --- source/ubl-settings-update.c | 50 +++--- source/ubl-settings-update.h | 14 +- source/ubl-strings.h | 3 + ubl-settings-update-mirror-path-add.glade | 6 + ubl-settings-update-password.glade | 3 +- ubl-settings-update-repo-add.glade | 185 +++++++++++----------- ubl-settings-update-repo-path-add.glade | 6 + ubl-settings-update.pot | 26 ++- ubl-settings-update_ru.po | 31 +++- 9 files changed, 192 insertions(+), 132 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index ea829c6..de93cb8 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -63,11 +63,11 @@ void on_toggle_button_toggled(GtkWidget *self, main_window *widgets){ switch(gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->UpdateIntervalCombo))){ case 0: interval = yon_char_unite(!yon_char_is_empty(interval)?interval:"",!yon_char_is_empty(interval)?",":"",int_str,"min",NULL); break; - case 1: interval = yon_char_unite(int_str,"h",NULL); + case 1: interval = yon_char_unite(!yon_char_is_empty(interval)?interval:"",!yon_char_is_empty(interval)?",":"",int_str,"h",NULL); break; - case 2: interval = yon_char_unite(int_str,"d",NULL); + case 2: interval = yon_char_unite(!yon_char_is_empty(interval)?interval:"",!yon_char_is_empty(interval)?",":"",int_str,"d",NULL); break; - case 3: interval = yon_char_unite(int_str,"M",NULL); + case 3: interval = yon_char_unite(!yon_char_is_empty(interval)?interval:"",!yon_char_is_empty(interval)?",":"",int_str,"M",NULL); break; } yon_config_register(AUTOUPDATE_interval,AUTOUPDATE_interval_command,interval); @@ -159,7 +159,8 @@ void on_toggle_button_toggled(GtkWidget *self, main_window *widgets){ void yon_load_proceed(YON_CONFIG_TYPE type){ yon_config_clean(); - if (!yon_char_is_empty(config_get_default_command)) + char *default_command = yon_char_unite(config_get_default_command,NULL); + if (!yon_char_is_empty(default_command)) yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); if (type==YON_CONFIG_GLOBAL){ yon_config_load_config(type,config_get_global_command,NULL); @@ -681,6 +682,13 @@ void on_mirror_add(GtkWidget *,main_window *widgets){ } +void on_password_encryption_changed(GtkComboBox *self, password_window *dialog){ + int active = gtk_combo_box_get_active(self); + gtk_widget_set_sensitive(dialog->NoEncriptionCheck,!!active); + if (!active) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->NoEncriptionCheck),0); +} + void on_password_open(GtkWidget *, web_publication_add_window *window){ password_window *dialog = yon_password_window_new(); yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(dialog->PasswordEntry)); @@ -691,6 +699,7 @@ void on_password_open(GtkWidget *, web_publication_add_window *window){ yon_dictionary_add_or_create_if_exists_with_data(dict,"target",window->UserPasswordEntry); g_signal_connect(G_OBJECT(dialog->AcceptButton),"clicked",G_CALLBACK(on_password_accept),dict); g_signal_connect(G_OBJECT(dialog->NoEncriptionCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),dialog->PasswordHashEntry); + g_signal_connect(G_OBJECT(dialog->EncryptionCombo),"changed",G_CALLBACK(on_password_encryption_changed),dialog); } void on_web_publish_remove(GtkWidget *self,main_window *widgets){ @@ -1300,11 +1309,15 @@ void on_password_accept(GtkWidget *,dictionary *dict){ return; } char *encryption = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->EncryptionCombo)); - - int size; - config_str hash = yon_config_load(!strcmp(encryption,"sha512")?sha512_encrypt_command(password):sha256_encrypt_command(password),&size); - yon_char_remove_last_symbol(hash[0],'\n'); - gtk_entry_set_text(GTK_ENTRY(target),hash[0]); + if (yon_char_is_empty(encryption)){ + gtk_entry_set_text(GTK_ENTRY(target),password); + + } else { + int size; + config_str hash = yon_config_load(yon_debug_output("%s\n",!strcmp(encryption,"sha512")?sha512_encrypt_command(password):sha256_encrypt_command(password)),&size); + yon_char_remove_last_symbol(hash[0],'\n'); + gtk_entry_set_text(GTK_ENTRY(target),hash[0]); + } } gtk_widget_destroy(window->Window); @@ -1737,7 +1750,16 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->UpdateIntervalDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),widgets->UpdateIntervalSpin); g_signal_connect(G_OBJECT(widgets->UpdateIntervalDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),widgets->BootCheck); - + GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->WebPublicationTree)); + for (unsigned int i=0;iBootCheck),"toggled",G_CALLBACK(on_toggle_button_toggled),widgets); g_signal_connect(G_OBJECT(widgets->UpdateIntervalSpin),"changed",G_CALLBACK(on_toggle_button_toggled),widgets); g_signal_connect(G_OBJECT(widgets->UpdateIntervalCombo),"changed",G_CALLBACK(on_toggle_button_toggled),widgets); @@ -1751,12 +1773,6 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->RecieveDBFromNetCheck),"toggled",G_CALLBACK(on_toggle_button_toggled),widgets); g_signal_connect(G_OBJECT(widgets->MirrorPublicCheck),"toggled",G_CALLBACK(on_toggle_button_toggled),widgets); - GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->WebPublicationTree)); - for (unsigned int i=0;iMirrorTree)); yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UpdateRepoTree)); @@ -1765,8 +1781,6 @@ void yon_main_window_complete(main_window *widgets){ yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->WebPublicationTree)); } yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size); - yon_load_proceed(YON_CONFIG_LOCAL); - yon_interface_update(widgets); yon_save_window_set_postsave_function(on_save_done,widgets); } diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 5a2490f..3ac3928 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -41,14 +41,14 @@ #define LocaleName "ubl-settings-update" #define icon_path "com.ublinux.ubl-settings-update" -#define sha256_encrypt_command(taget) yon_char_unite("echo -n \"",target,"\" | sha256sum | cut -f 1 -d ' '",NULL) -#define sha512_encrypt_command(taget) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) +#define sha256_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha256sum | cut -f 1 -d ' '",NULL) +#define sha512_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) #define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) -#define config_get_local_command "ubconfig --source system get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]" -#define config_get_global_command "ubconfig --source global get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]" -#define config_get_default_command "ubconfig --source global get update AUTOUPDATE[repos]" -#define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update ",target,NULL) +#define config_get_local_command "ubconfig --source system get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_global_command "ubconfig --source global get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_default_command "ubconfig --source default get update AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode]",NULL +#define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update",target,NULL) #define config_get_global_only_parameters "" #define config_get_local_only_parameters "" @@ -327,6 +327,8 @@ void on_sign_cell_toggled(GtkWidget *, char *path, repo_add_window *window); void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window); +void on_password_encryption_changed(GtkComboBox *self, password_window *dialog); + password_window *yon_password_window_new(); repo_add_window *yon_repo_add_window_new(); web_publication_add_window *yon_web_publication_add_window_new(); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 81acd31..0e94d38 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -154,6 +154,9 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si #define _LABEL _("Entryption:") #define _LABEL _("Do not encrypt password") #define _LABEL _("Password hash:") + #define _LABEL _("Default (None)") + #define _LABEL _("Encryption:") + #define _LABEL _("Encryption") */ #endif \ No newline at end of file diff --git a/ubl-settings-update-mirror-path-add.glade b/ubl-settings-update-mirror-path-add.glade index 2f7c3f7..e121a6a 100644 --- a/ubl-settings-update-mirror-path-add.glade +++ b/ubl-settings-update-mirror-path-add.glade @@ -26,6 +26,9 @@ True Remove image2 + False @@ -76,6 +79,9 @@ True Edit image1 + False diff --git a/ubl-settings-update-password.glade b/ubl-settings-update-password.glade index d3548a2..aceb9ba 100644 --- a/ubl-settings-update-password.glade +++ b/ubl-settings-update-password.glade @@ -173,7 +173,7 @@ Encryption 0 - Default + Default (None) SHA-512 SHA-256 @@ -212,6 +212,7 @@ Do not encrypt password True + False True False True diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 8409ea9..3de80b9 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -13,6 +13,93 @@ False com.ublinux.libublsettingsui-gtk3.increase-symbolic + + + + + + + + + + + + False + Never + Signature verification will not be performed + + + False + Optional + Signatures will be verified if present, but unsigned databases and packages will also be accepted + + + True + Required + Signatures will be required for all packages and databases + + + False + TrustedOnly + If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable + + + False + TrustAll + If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust) + + + False + PackageNever + Packages only + + + False + DatabaseNever + Database only + + + False + PackageOptional + Packages only + + + True + DatabaseOptional + Database only + + + False + PackageRequired + Packages only + + + False + DatabaseRequired + Database only + + + False + PackageTrustedOnly + If signature is verified only for packages + + + False + DatabaseTrustedOnly + If signature is verified only for database + + + False + PackageTrustAll + If signature is verified only for packages + + + False + DatabaseTrustAll + If signature is verified only for database + + + 500 300 @@ -123,7 +210,7 @@ False 5 5 - 5 + 3 5 @@ -135,7 +222,6 @@ True False - 3 5 @@ -325,6 +411,8 @@ Configuration - configuration path True True + 3 + 3 in 200 @@ -376,7 +464,7 @@ Configuration - configuration path - False + True True 1 @@ -394,7 +482,7 @@ Configuration - configuration path - False + True True 3 @@ -551,7 +639,7 @@ Configuration - configuration path - True + False True 5 @@ -617,91 +705,4 @@ Configuration - configuration path - - - - - - - - - - - - False - Never - Signature verification will not be performed - - - False - Optional - Signatures will be verified if present, but unsigned databases and packages will also be accepted - - - True - Required - Signatures will be required for all packages and databases - - - False - TrustedOnly - If signature is verified for packages and database, it must be in the keyring and fully trusted; marginal trust not applicable - - - False - TrustAll - If signature is verified, it must be in keyring, but does not need to have a trust level assigned (e.g. unknown or marginal trust) - - - False - PackageNever - Packages only - - - False - DatabaseNever - Database only - - - False - PackageOptional - Packages only - - - True - DatabaseOptional - Database only - - - False - PackageRequired - Packages only - - - False - DatabaseRequired - Database only - - - False - PackageTrustedOnly - If signature is verified only for packages - - - False - DatabaseTrustedOnly - If signature is verified only for database - - - False - PackageTrustAll - If signature is verified only for packages - - - False - DatabaseTrustAll - If signature is verified only for database - - - diff --git a/ubl-settings-update-repo-path-add.glade b/ubl-settings-update-repo-path-add.glade index c3fed8f..07ad7ba 100644 --- a/ubl-settings-update-repo-path-add.glade +++ b/ubl-settings-update-repo-path-add.glade @@ -26,6 +26,9 @@ True Remove image2 + False @@ -78,6 +81,9 @@ True Edit image1 + False diff --git a/ubl-settings-update.pot b/ubl-settings-update.pot index d71078d..685e6a5 100644 --- a/ubl-settings-update.pot +++ b/ubl-settings-update.pot @@ -551,30 +551,42 @@ msgstr "" msgid "Sign level" msgstr "" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "Description" msgstr "" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:151 msgid "Password input" msgstr "" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:152 msgid "Password:" msgstr "" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:153 msgid "Repeat password:" msgstr "" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Entryption:" msgstr "" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Do not encrypt password" msgstr "" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Password hash:" msgstr "" + +#: source/ubl-strings.h:157 +msgid "Default (None)" +msgstr "" + +#: source/ubl-strings.h:158 +msgid "Encryption:" +msgstr "" + +#: source/ubl-strings.h:159 +msgid "Encryption" +msgstr "" diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index 9f31adb..8a654f5 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -118,7 +118,10 @@ msgstr "" msgid "" "If signature is verified, it must be in keyring, but does not need to have a " "trust level assigned (e.g. unknown or marginal trust)" -msgstr "Если подпись проверена, она должна находиться в связке ключей, но ей не требуется назначать уровень доверия (например, неизвестное или предельное доверие)" +msgstr "" +"Если подпись проверена, она должна находиться в связке ключей, но ей не " +"требуется назначать уровень доверия (например, неизвестное или предельное " +"доверие)" #: source/ubl-strings.h:32 msgid "Packages only" @@ -578,34 +581,46 @@ msgstr "Система" msgid "Sign level" msgstr "Уровень подписи" -#: source/ubl-strings.h:149 +#: source/ubl-strings.h:150 msgid "Description" msgstr "Описание" -#: source/ubl-strings.h:150 +#: source/ubl-strings.h:151 msgid "Password input" msgstr "Ввод пароля" -#: source/ubl-strings.h:151 +#: source/ubl-strings.h:152 msgid "Password:" msgstr "Пароль:" -#: source/ubl-strings.h:152 +#: source/ubl-strings.h:153 msgid "Repeat password:" msgstr "Подтвердите ввод пароля:" -#: source/ubl-strings.h:153 +#: source/ubl-strings.h:154 msgid "Entryption:" msgstr "Алгоритм шифрования пароля:" -#: source/ubl-strings.h:154 +#: source/ubl-strings.h:155 msgid "Do not encrypt password" msgstr "Не шифровать пароль" -#: source/ubl-strings.h:155 +#: source/ubl-strings.h:156 msgid "Password hash:" msgstr "Пароль/Хэш пароля" +#: source/ubl-strings.h:157 +msgid "Default (None)" +msgstr "По умолчанию (Отсутствует)" + +#: source/ubl-strings.h:158 +msgid "Encryption:" +msgstr "Алгоритм шифрования пароля:" + +#: source/ubl-strings.h:159 +msgid "Encryption" +msgstr "Алгоритм шифрования пароля" + msgid "Check system updates at system startup" msgstr "Проверять обновления при загрузке системы" From 1d6bb9af7900a4ef9b9dadabf42d1a3a95d92e9c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 10:18:54 +0600 Subject: [PATCH 21/63] Removed disabled saving of autoupdate --- source/ubl-settings-update.c | 2 +- source/ubl-settings-update.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index de93cb8..34e2c5d 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -33,7 +33,7 @@ void on_toggle_button_toggled(GtkWidget *self, main_window *widgets){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->AutoUpdateCheck))){ yon_config_register(AUTOUPDATE,AUTOUPDATE_command,"enable"); } else { - yon_config_register(AUTOUPDATE,AUTOUPDATE_command,"disable"); + yon_config_remove_by_key(AUTOUPDATE); } } else if (self == widgets->UpdateModeCombo){ diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 3ac3928..f2ab223 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -47,7 +47,7 @@ #define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) #define config_get_local_command "ubconfig --source system get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL #define config_get_global_command "ubconfig --source global get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_default_command "ubconfig --source default get update AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode]",NULL +#define config_get_default_command "ubconfig --source default get update AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE",NULL #define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update",target,NULL) #define config_get_global_only_parameters "" From 13f8f718f6b89951c6463fb10a5967505175644f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 10:47:31 +0600 Subject: [PATCH 22/63] Removed unnessessary quotes --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 34e2c5d..a323c64 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1167,7 +1167,7 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ yon_ubl_status_highlight_incorrect(window->PathEntry); return; } - char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":'",full_name,"'",NULL); + char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":",full_name,NULL); char *final = yon_char_unite(enabled?"enable":"disable",":", enable_browser?"listing":"",":", port_enabled?port:"",":", From df1a1ccdcb6e42e80bdd22e70630483ff7ea81ae Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 15:06:52 +0600 Subject: [PATCH 23/63] Fixed port entry allowed symbols --- source/ubl-settings-update.c | 2 ++ ubl-settings-update-web-publication-add.glade | 1 + 2 files changed, 3 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index a323c64..cd21731 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1557,8 +1557,10 @@ web_publication_add_window *yon_web_publication_add_window_new(){ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->PasswordButton),"clicked",G_CALLBACK(on_password_open),window); g_signal_connect(G_OBJECT(window->UsernameCheck),"toggled",G_CALLBACK(on_web_user_check),window); + g_signal_connect(G_OBJECT(window->PortCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->PortEntry); g_signal_connect(G_OBJECT(window->UserPasswordCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box_inversed),window->PasswordButton); g_signal_connect(G_OBJECT(window->UserPasswordCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box_inversed),window->UserPasswordEntry); + g_signal_connect(G_OBJECT(window->PortEntry),"insert-text",G_CALLBACK(yon_on_text_insert_only_digits),NULL); gtk_widget_show(window->Window); return window; diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index eab009b..db8f9e4 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -210,6 +210,7 @@ True + False True Port 8080 From a6d571becb51ac26be838c7b1c64d8c6d860faf3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 15:11:00 +0600 Subject: [PATCH 24/63] Fixed empty mirror adding --- source/ubl-settings-update.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index cd21731..eee3248 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1186,6 +1186,11 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ void on_mirror_accept(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); mirror_add_window *window = yon_dictionary_get_data(dict->first->next,mirror_add_window*); + if (yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->NameEntry)))){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->NameEntry); + return; + } if (!window->sections&&yon_char_is_empty(gtk_entry_get_text(GTK_ENTRY(window->TypeEntry)))) { yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(window->TypeEntry); From 0a6b738a44d5fbd0b7f40a0f1cc55a6262edbee3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 15:23:10 +0600 Subject: [PATCH 25/63] Design minor fixes --- source/ubl-settings-update.c | 8 ++++---- ubl-settings-update-repo-add.glade | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index eee3248..83266cd 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -804,7 +804,7 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ yon_dictionary_add_or_create_if_exists_with_data(window->sections,(char*)target,section); gtk_entry_set_text(GTK_ENTRY(section->PathEntry),repos[i]); - gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,2); + gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } @@ -960,7 +960,7 @@ void on_mirror_edit(GtkWidget *,main_window *widgets){ yon_dictionary_add_or_create_if_exists_with_data(window->sections,(char*)target,section); gtk_entry_set_text(GTK_ENTRY(section->PathEntry),parsed[i]); - gtk_box_pack_start(GTK_BOX(window->PathBox),section->PathRemovalBox,0,0,2); + gtk_box_pack_start(GTK_BOX(window->PathBox),section->PathRemovalBox,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); @@ -1398,7 +1398,7 @@ void on_mirror_path_add(GtkWidget *, mirror_add_window *window){ gtk_entry_set_text(GTK_ENTRY(section->PathEntry),target); gtk_entry_set_text(GTK_ENTRY(window->TypeEntry),""); - gtk_box_pack_start(GTK_BOX(window->PathBox),section->PathRemovalBox,0,0,2); + gtk_box_pack_start(GTK_BOX(window->PathBox),section->PathRemovalBox,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); @@ -1432,7 +1432,7 @@ void on_repo_source_add(GtkWidget *, repo_add_window *window){ gtk_entry_set_text(GTK_ENTRY(section->PathEntry),target); gtk_entry_set_text(GTK_ENTRY(window->RepoSourceEntry),""); - gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,2); + gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 3de80b9..dd79f1a 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -208,8 +208,6 @@ True False - 5 - 5 3 5 @@ -705,4 +703,10 @@ Configuration - configuration path + + + + + + From 4d8884d71ed9b6513ff00dda111a6be5574238ef Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 15:25:38 +0600 Subject: [PATCH 26/63] Design minor fixes --- ubl-settings-update-repo-add.glade | 2 -- 1 file changed, 2 deletions(-) diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index dd79f1a..1f210aa 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -164,7 +164,6 @@ True False - 3 5 @@ -208,7 +207,6 @@ True False - 3 5 From 441032aa8c3c5e79a8f1f0de730ff1d050f3007a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 16:59:49 +0600 Subject: [PATCH 27/63] Fixed repository parameter --- source/ubl-settings-update.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 83266cd..e55114c 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -794,13 +794,29 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ section->TypeCombo = yon_gtk_builder_get_widget(builder,"TypeCombo"); section->edits=0; - if (strstr(repos[i],"@")){ - char *type = yon_char_divide_search(repos[i],"@",-1); - gtk_combo_box_set_active_id(GTK_COMBO_BOX(section->TypeCombo),type); - free(type); + char *path = yon_char_new(repos[i]); + if (strstr(repos[i],"file://")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),0); + free(yon_char_divide(path,6)); - } else + } else if (strstr(repos[i],"ftp://")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),1); + free(yon_char_divide(path,5)); + + } else if (strstr(repos[i],"http://")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),2); + free(yon_char_divide(path,6)); + + } else if (strstr(repos[i],"https://")){ + gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),3); + free(yon_char_divide(path,7)); + + } else { gtk_combo_box_set_active(GTK_COMBO_BOX(section->TypeCombo),4); + + } + gtk_entry_set_text(GTK_ENTRY(section->PathEntry),path); + free(path); yon_dictionary_add_or_create_if_exists_with_data(window->sections,(char*)target,section); gtk_entry_set_text(GTK_ENTRY(section->PathEntry),repos[i]); @@ -1049,7 +1065,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ if (window->sections){ for_dictionaries (dact, window->sections){ char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(((path_section*)dact->data)->TypeCombo)); - char *cur = yon_char_unite(type?type:"",type?"@":"",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); + char *cur = yon_char_unite(type?type:"",(char*)gtk_entry_get_text(GTK_ENTRY(((path_section*)dact->data)->PathEntry)),NULL); char *temp = yon_char_unite(sources,!yon_char_is_empty(sources)?",":"",cur,NULL); if (!yon_char_is_empty(sources)) free(sources); sources = temp; @@ -1058,7 +1074,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ char *source_main = (char*)gtk_entry_get_text(GTK_ENTRY(window->RepoSourceEntry)); if (!yon_char_is_empty(source_main)) { char *type = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSourceCombo)); - source_main = yon_char_unite(type?type:"",type?"@":"",source_main,NULL); + source_main = yon_char_unite(type?type:"",source_main,NULL); char *temp = yon_char_unite(sources,!yon_char_is_empty(sources)?",":"",source_main,NULL); if (!yon_char_is_empty(sources)) free(sources); sources = temp; From 7597654072e659d5dc5a9aba31ea69957f918075 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 17:09:46 +0600 Subject: [PATCH 28/63] Design fix --- ubl-settings-update-repo-add.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 1f210aa..9edd245 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -207,7 +207,6 @@ True False - 5 True From deddfd706d62c8379845cee2523f753a8fa7c594 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 17:16:04 +0600 Subject: [PATCH 29/63] Added ' symbol at restricted to use in passwords --- source/ubl-settings-update.c | 5 +++++ source/ubl-strings.h | 1 + ubl-settings-update.pot | 4 ++++ ubl-settings-update_ru.po | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index e55114c..c0ca695 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1323,6 +1323,11 @@ void on_password_accept(GtkWidget *,dictionary *dict){ } else { char *password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->RepeatPasswordEntry)); + if (strstr(password,"'")){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_RESTRICTED_SYMBOL_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->PasswordEntry); + return; + } if (strcmp(password,password_check)){ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_MISMATCH_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(window->PasswordEntry); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 0e94d38..2387dc9 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -14,6 +14,7 @@ #define EDIT_WEB_LABEL _("Edit repository for publication") #define PASSWORD_MISMATCH_LABEL _("Passwords do not match") + #define PASSWORD_RESTRICTED_SYMBOL_LABEL _("Password contains restricted symbols") #define REPO_TOOLTIP_LABEL _("file://\t\t- Directory URL prefix for repository\n\ ftp://\t\t- FTP URL prefix for repository\n\ diff --git a/ubl-settings-update.pot b/ubl-settings-update.pot index 685e6a5..7076f69 100644 --- a/ubl-settings-update.pot +++ b/ubl-settings-update.pot @@ -61,6 +61,10 @@ msgstr "" msgid "Passwords do not match" msgstr "" +#: source/ubl-strings.h:17 +msgid "Password contains restricted symbols" +msgstr "" + #: source/ubl-strings.h:18 msgid "" "file://\t\t- Directory URL prefix for repository\n" diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index 8a654f5..6aefa16 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -61,6 +61,10 @@ msgstr "Редактирование репозитория для публик msgid "Passwords do not match" msgstr "Пароли не совпадают" +#: source/ubl-strings.h:17 +msgid "Password contains restricted symbols" +msgstr "Пароль содержит запрещённые символы" + #: source/ubl-strings.h:18 msgid "" "file://\t\t- Directory URL prefix for repository\n" From 44bb92d5ba4f96be693863d52096fdeeec6e71e7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 18:06:22 +0600 Subject: [PATCH 30/63] Checking for restricted symbols --- source/ubl-settings-update.c | 13 ++++++++++++- source/ubl-strings.h | 1 + ubl-settings-update.pot | 4 ++++ ubl-settings-update_ru.po | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index c0ca695..b98d3ba 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1149,6 +1149,17 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ char *username = (char*)gtk_entry_get_text(GTK_ENTRY(window->UsernameEntry)); char *user_password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->UserPasswordEntry))); char *encryption = user_password[6]=='|'?yon_char_divide(user_password,6):NULL; + + if (strpbrk(username,"!@#%^&*\'")){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ENTRY_RESTRICTED_SYMBOL_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->UsernameEntry); + return; + } + if (strpbrk(user_password,"!@#%^&*\'")){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_RESTRICTED_SYMBOL_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->UserPasswordEntry); + return; + } if (username_check&&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->UsernameEntry); @@ -1323,7 +1334,7 @@ void on_password_accept(GtkWidget *,dictionary *dict){ } else { char *password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); char *password_check = (char*)gtk_entry_get_text(GTK_ENTRY(window->RepeatPasswordEntry)); - if (strstr(password,"'")){ + if (strpbrk(password,"!@#%^&*\'")){ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_RESTRICTED_SYMBOL_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(window->PasswordEntry); return; diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 2387dc9..92ac93a 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -15,6 +15,7 @@ #define PASSWORD_MISMATCH_LABEL _("Passwords do not match") #define PASSWORD_RESTRICTED_SYMBOL_LABEL _("Password contains restricted symbols") + #define ENTRY_RESTRICTED_SYMBOL_LABEL _("Entry contains restricted symbols") #define REPO_TOOLTIP_LABEL _("file://\t\t- Directory URL prefix for repository\n\ ftp://\t\t- FTP URL prefix for repository\n\ diff --git a/ubl-settings-update.pot b/ubl-settings-update.pot index 7076f69..f1173df 100644 --- a/ubl-settings-update.pot +++ b/ubl-settings-update.pot @@ -65,6 +65,10 @@ msgstr "" msgid "Password contains restricted symbols" msgstr "" +#: source/ubl-strings.h:17 +msgid "Entry contains restricted symbols" +msgstr "" + #: source/ubl-strings.h:18 msgid "" "file://\t\t- Directory URL prefix for repository\n" diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index 6aefa16..77fc9b7 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -65,6 +65,10 @@ msgstr "Пароли не совпадают" msgid "Password contains restricted symbols" msgstr "Пароль содержит запрещённые символы" +#: source/ubl-strings.h:17 +msgid "Entry contains restricted symbols" +msgstr "Поле содержит запрещённые символы" + #: source/ubl-strings.h:18 msgid "" "file://\t\t- Directory URL prefix for repository\n" From fd1e8e33f37b0dd4eb5416aab12ac3eb3435939c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 09:39:04 +0600 Subject: [PATCH 31/63] Design fixes --- source/ubl-settings-update.c | 2 ++ ubl-settings-update-mirror-add.glade | 1 + ubl-settings-update-mirror-configure.glade | 4 +++- ubl-settings-update-repo-add.glade | 5 ++--- ubl-settings-update-web-publication-add.glade | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index b98d3ba..d111bd3 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -824,6 +824,7 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } + gtk_widget_show(window->SourceBox); yon_char_parsed_free(repos,cur_size); } if (size>1&&!yon_char_is_empty(parsed[1])){ //siglevel @@ -1465,6 +1466,7 @@ void on_repo_source_add(GtkWidget *, repo_add_window *window){ gtk_entry_set_text(GTK_ENTRY(section->PathEntry),target); gtk_entry_set_text(GTK_ENTRY(window->RepoSourceEntry),""); gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,0); + gtk_widget_show(window->SourceBox); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } diff --git a/ubl-settings-update-mirror-add.glade b/ubl-settings-update-mirror-add.glade index cb56a6c..7497a63 100644 --- a/ubl-settings-update-mirror-add.glade +++ b/ubl-settings-update-mirror-add.glade @@ -40,6 +40,7 @@ + 800 True False 5 diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index cd0bd8b..e7e4f93 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -35,9 +35,11 @@ com.ublinux.libublsettingsui-gtk3.zoom-symbolic - 500 + 800 False True + 800 + 600 com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 9edd245..01c3dd9 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -101,8 +101,8 @@ - 500 - 300 + 800 + 600 False True com.ublinux.ubl-settings-update @@ -313,7 +313,6 @@ Configuration - configuration path - True False 5 diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index db8f9e4..eca9436 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -22,7 +22,8 @@ - 500 + 800 + 600 False True com.ublinux.ubl-settings-update From e4f27d436cbb1b9e8c9efd0718824f5586b5743a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 09:47:46 +0600 Subject: [PATCH 32/63] Repo add window fix for source fields --- source/ubl-settings-update.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index d111bd3..0431ba0 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -819,12 +819,11 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ free(path); yon_dictionary_add_or_create_if_exists_with_data(window->sections,(char*)target,section); - gtk_entry_set_text(GTK_ENTRY(section->PathEntry),repos[i]); gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,0); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } - gtk_widget_show(window->SourceBox); + gtk_widget_show(window->SourceListBox); yon_char_parsed_free(repos,cur_size); } if (size>1&&!yon_char_is_empty(parsed[1])){ //siglevel @@ -1466,7 +1465,7 @@ void on_repo_source_add(GtkWidget *, repo_add_window *window){ gtk_entry_set_text(GTK_ENTRY(section->PathEntry),target); gtk_entry_set_text(GTK_ENTRY(window->RepoSourceEntry),""); gtk_box_pack_start(GTK_BOX(window->SourceBox),section->PathRemovalBox,0,0,0); - gtk_widget_show(window->SourceBox); + gtk_widget_show(window->SourceListBox); g_signal_connect(gtk_builder_get_object(builder,"PathEditButton"),"clicked",G_CALLBACK(on_mirror_path_edit),window); g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),window); } From 06d642ad2435db7d2989cfc1b08fbe2d37c27a34 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 09:53:42 +0600 Subject: [PATCH 33/63] Added restricted symbols blocking for repository name --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 0431ba0..c0a5d66 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1554,7 +1554,7 @@ repo_add_window *yon_repo_add_window_new(){ g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageEnableSearchCheck); g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageEnableUpdateCheck); g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageSysupgradeCheck); - + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->RepoNameEntry)); g_signal_connect(G_OBJECT(window->SignDefaultCheck),"toggled",G_CALLBACK(on_sign_check_toggled),window); g_signal_connect(G_OBJECT(window->SignCell),"toggled",G_CALLBACK(on_sign_cell_toggled),window); // g_signal_connect(G_OBJECT(window->SourceListBox),"size-allocate",G_CALLBACK(on_scrolled_window_size_allocate),window); From 02b143f1b9947a57760ef4f69559ad77492e96c6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 09:54:07 +0600 Subject: [PATCH 34/63] Added restricted symbols blocking for repository source --- source/ubl-settings-update.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index c0a5d66..1b6697c 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1555,6 +1555,7 @@ repo_add_window *yon_repo_add_window_new(){ g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageEnableUpdateCheck); g_signal_connect(G_OBJECT(window->UsageDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UsageSysupgradeCheck); yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->RepoNameEntry)); + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->RepoSourceEntry)); g_signal_connect(G_OBJECT(window->SignDefaultCheck),"toggled",G_CALLBACK(on_sign_check_toggled),window); g_signal_connect(G_OBJECT(window->SignCell),"toggled",G_CALLBACK(on_sign_cell_toggled),window); // g_signal_connect(G_OBJECT(window->SourceListBox),"size-allocate",G_CALLBACK(on_scrolled_window_size_allocate),window); From 13370100a1b7624c6f6041362161981cbe6735cf Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 09:56:24 +0600 Subject: [PATCH 35/63] Added restricted symbols blocking for web publication window --- source/ubl-settings-update.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 1b6697c..ed1c844 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1589,6 +1589,8 @@ web_publication_add_window *yon_web_publication_add_window_new(){ window->SelectionCellRenderer = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"SelectionCellRenderer")); yon_gtk_entry_set_password_visibility_icon(GTK_ENTRY(window->UserPasswordEntry)); + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->PathEntry)); + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->UsernameEntry)); window->name=NULL; g_signal_connect(G_OBJECT(window->SelectionCellRenderer),"toggled",G_CALLBACK(on_cell_renderer_toggle_toggled),window->RepositoriesTree); g_signal_connect(G_OBJECT(window->PathButton),"clicked",G_CALLBACK(on_file_chooser_open),window->PathEntry); From c673634f0dcedce4e172fbebec02202f5fa4fd83 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:00:34 +0600 Subject: [PATCH 36/63] Design fixes --- ubl-settings-update-mirror-add.glade | 2 ++ ubl-settings-update-mirror-configure.glade | 8 ++++++++ ubl-settings-update-repo-add.glade | 2 +- ubl-settings-update-web-publication-add.glade | 5 ++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ubl-settings-update-mirror-add.glade b/ubl-settings-update-mirror-add.glade index 7497a63..49f86be 100644 --- a/ubl-settings-update-mirror-add.glade +++ b/ubl-settings-update-mirror-add.glade @@ -17,6 +17,8 @@ 500 False True + 800 + 600 com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index e7e4f93..d9af859 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -75,6 +75,7 @@ True False + 3 5 @@ -128,6 +129,7 @@ True False + 3 5 @@ -200,6 +202,7 @@ True False + 3 5 @@ -253,6 +256,7 @@ True False + 3 5 @@ -345,6 +349,7 @@ True False + 3 5 @@ -397,6 +402,7 @@ True False + 3 5 @@ -432,6 +438,7 @@ True False + 3 5 @@ -485,6 +492,7 @@ True False + 3 5 diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 01c3dd9..179149d 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -102,9 +102,9 @@ 800 - 600 False True + 600 com.ublinux.ubl-settings-update diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index eca9436..5dc2c50 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -23,9 +23,10 @@ 800 - 600 False True + 800 + 600 com.ublinux.ubl-settings-update @@ -233,6 +234,7 @@ True False + 3 0.019999999552965164 in @@ -271,6 +273,7 @@ True False + 3 0.019999999552965164 in From 59b4c8b7961170e8c19ffe5329ea83d63372aa65 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:01:57 +0600 Subject: [PATCH 37/63] Design fixes --- ubl-settings-update-password.glade | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ubl-settings-update-password.glade b/ubl-settings-update-password.glade index aceb9ba..a82155b 100644 --- a/ubl-settings-update-password.glade +++ b/ubl-settings-update-password.glade @@ -53,6 +53,7 @@ True False + 3 vertical 5 @@ -152,6 +153,7 @@ True False + 3 5 @@ -227,6 +229,7 @@ True False + 3 5 From 0b64e4341995d9546165d2c55be3bd9b25645582 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:12:46 +0600 Subject: [PATCH 38/63] Replaced Port entry to Port Spin Button --- source/ubl-settings-update.c | 4 ++-- ubl-settings-update-web-publication-add.glade | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index ed1c844..2495cc2 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -914,7 +914,7 @@ void on_web_publish_edit(GtkWidget *,main_window *widgets){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->EnableWebFileBrowserCheck),1); } if (size>2&&!yon_char_is_empty(parsed[2])){ - gtk_entry_set_text(GTK_ENTRY(window->PortEntry),parsed[2]); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->PortEntry),atol(parsed[2])); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->PortCheck),1); } if (size>3&&!yon_char_is_empty(parsed[3])){ @@ -1142,7 +1142,7 @@ void on_web_publish_accept(GtkWidget *, dictionary *dict){ int enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->EnablePublishCheck)); int port_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->PortCheck)); - char *port = (char*)gtk_entry_get_text(GTK_ENTRY(window->PortEntry)); + char *port = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->PortEntry))); int enable_browser = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->EnableWebFileBrowserCheck)); int username_check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsernameCheck)); diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 5dc2c50..f57a3ff 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -3,6 +3,11 @@ + + 65535 + 1 + 10 + True False @@ -210,12 +215,11 @@ - + True False True - Port - 8080 + adjustment1 True From 721cf2fd1812a85232c68680745493e0b798645b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:20:10 +0600 Subject: [PATCH 39/63] Fixed wrong repostirory parameter name for removing from config --- source/ubl-settings-update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 2495cc2..150e9e8 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1127,7 +1127,7 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ char *final = yon_char_unite(sources,";",sign_level,";",usage,";",enabled?"":"disable",NULL); if (!yon_char_is_empty(window->name)&&strcmp(repo_name,window->name)){ - yon_config_remove_by_key(REOSITORY_command(window->name)); + yon_config_remove_by_key(REPOSITORY(window->name)); } yon_config_register(REPOSITORY(repo_name),REOSITORY_command(repo_name),final); yon_interface_update(widgets); From facdb6e56dc7d94ccecb2a82e0661843603201b8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:22:05 +0600 Subject: [PATCH 40/63] Localisation changes --- ubl-settings-update.glade | 2 +- ubl-settings-update_ru.po | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index f31a9b6..f0abaab 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -522,7 +522,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False - System update + Update False diff --git a/ubl-settings-update_ru.po b/ubl-settings-update_ru.po index 77fc9b7..51a670b 100644 --- a/ubl-settings-update_ru.po +++ b/ubl-settings-update_ru.po @@ -186,7 +186,7 @@ msgstr "" #: source/ubl-strings.h:44 source/ubl-strings.h:75 msgid "Update" -msgstr "Обновить" +msgstr "Обновление" #: source/ubl-strings.h:46 msgid "Repositories" From d2a7d4895cdb6308f76980ed9a0cc1b3cb68b005 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:28:02 +0600 Subject: [PATCH 41/63] Changed port spin size --- ubl-settings-update-web-publication-add.glade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index f57a3ff..5b90928 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -222,7 +222,7 @@ adjustment1 - True + False True 2 From 89536dc435a3515e82cc9dd58ebfb8c0564c4544 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 10:29:23 +0600 Subject: [PATCH 42/63] Changed mirror configuration spins size --- ubl-settings-update-mirror-configure.glade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index d9af859..d87929e 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -113,7 +113,7 @@ adjustment1 - False + True True 2 @@ -240,7 +240,7 @@ adjustment2 - False + True True 2 @@ -294,7 +294,7 @@ adjustment3 - False + True True 2 @@ -476,7 +476,7 @@ adjustment4 - False + True True 2 @@ -530,7 +530,7 @@ adjustment5 - False + True True 2 From f31d391c0a80faf824f3aea3deea9c87624e3dcc Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 12:15:45 +0600 Subject: [PATCH 43/63] Design fix --- ubl-settings-update-web-publication-add.glade | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 5b90928..0b79cc1 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -69,6 +69,7 @@ True True False + 3 True @@ -82,6 +83,7 @@ True False 3 + 3 5 @@ -138,6 +140,7 @@ True True 3 + 3 in @@ -185,6 +188,7 @@ True False 3 + 3 5 @@ -239,6 +243,7 @@ True False 3 + 3 0.019999999552965164 in @@ -278,6 +283,7 @@ True False 3 + 3 0.019999999552965164 in From aac328e570f134fa910476e82327bedd8a039403 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 12:54:06 +0600 Subject: [PATCH 44/63] Sign changes --- source/ubl-settings-update.c | 40 +++++++++------ source/ubl-settings-update.h | 9 ++-- ubl-settings-update-repo-add.glade | 36 +++++++++++++ ubl-settings-update.glade | 81 +++++++++++++++++++++++++----- 4 files changed, 133 insertions(+), 33 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 150e9e8..edc1857 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1085,21 +1085,8 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ return; } - char *sign_level= ""; - if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SignDefaultCheck))){ - GtkTreeModel *model = GTK_TREE_MODEL(window->SignList); - GtkTreeIter iter; - for_iter (model,&iter){ - int status; - char *target; - gtk_tree_model_get(model,&iter,0,&status,1,&target,-1); - if (status){ - char *temp = yon_char_unite(sign_level,!yon_char_is_empty(sign_level)?",":"",target,NULL); - if (!yon_char_is_empty(sign_level)) free(sign_level); - sign_level= temp; - } - } - } + char *sign_level= (char*)gtk_entry_get_text(GTK_ENTRY(window->SignLevelCheckEntry)); + char *usage = ""; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsageDefaultCheck))){ usage = "All"; @@ -1506,14 +1493,32 @@ void on_sign_cell_toggled(GtkWidget *, char *path, repo_add_window *window){ GtkTreeIter check_iter; if (gtk_tree_model_get_iter_from_string(model,&check_iter,path)){ int check_status; - gtk_tree_model_get(model,&check_iter,0,&check_status,-1); + char *target; + gtk_tree_model_get(model,&check_iter,0,&check_status,1,&target,-1); gtk_list_store_set(window->SignList,&check_iter,0,!check_status,-1); + char *active_signs = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->SignLevelCheckEntry))); + if (!check_status){ + char *temp = yon_char_unite(active_signs,!yon_char_is_empty(active_signs)?",":"",target,NULL); + gtk_entry_set_text(GTK_ENTRY(window->SignLevelCheckEntry),temp); + } else { + int parsed_size; + config_str parsed = yon_char_parse(active_signs,&parsed_size,","); + if (parsed_size){ + int found = yon_char_parsed_check_exist(parsed,parsed_size,target); + if (found>-1){ + parsed = yon_char_parsed_rip(parsed,&parsed_size,found); + } + char *temp = yon_char_parsed_to_string(parsed,parsed_size,","); + gtk_entry_set_text(GTK_ENTRY(window->SignLevelCheckEntry),temp); + } + } } } void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window){ int status = gtk_toggle_button_get_active(self); gtk_widget_set_sensitive(window->SignTree,!status); + } repo_add_window *yon_repo_add_window_new(){ @@ -1542,6 +1547,7 @@ repo_add_window *yon_repo_add_window_new(){ window->RepoSourceAddButton = yon_gtk_builder_get_widget(builder,"RepoSourceAddButton"); window->SignDefaultCheck = yon_gtk_builder_get_widget(builder,"SignDefaultCheck"); window->SignTree = yon_gtk_builder_get_widget(builder,"SignTree"); + window->SignLevelCheckEntry = yon_gtk_builder_get_widget(builder,"SignLevelCheckEntry"); window->SignCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"SignCell")); window->SignList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); @@ -1663,6 +1669,8 @@ mirror_add_window *yon_mirror_add_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); window->PathBox = yon_gtk_builder_get_widget(builder,"PathBox"); + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->NameEntry)); + yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->TypeEntry)); window->sections = NULL; window->name=NULL; diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index f2ab223..3608cc8 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -44,10 +44,10 @@ #define sha256_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha256sum | cut -f 1 -d ' '",NULL) #define sha512_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) -#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) -#define config_get_local_command "ubconfig --source system get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_global_command "ubconfig --source global get update REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_default_command "ubconfig --source default get update AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE",NULL +#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) +#define config_get_local_command "ubconfig --source system get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_global_command "ubconfig --source global get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_default_command "ubconfig --source default get [update] AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE",NULL #define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update",target,NULL) #define config_get_global_only_parameters "" @@ -176,6 +176,7 @@ typedef struct { GtkWidget *SignDefaultCheck; GtkWidget *SignTree; + GtkWidget *SignLevelCheckEntry; GtkCellRenderer *SignCell; GtkListStore *SignList; diff --git a/ubl-settings-update-repo-add.glade b/ubl-settings-update-repo-add.glade index 179149d..50f3c2b 100644 --- a/ubl-settings-update-repo-add.glade +++ b/ubl-settings-update-repo-add.glade @@ -463,6 +463,42 @@ Configuration - configuration path 1 + + + True + False + 5 + + + True + False + Sign level: + + + False + True + 0 + + + + + True + False + Required,DatabaseOptional + + + True + True + 1 + + + + + False + True + 2 + + diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index f0abaab..53d7722 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -610,6 +610,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0 + + + True + False + + + False + True + 1 + + 26 @@ -643,7 +654,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 1 + 2 @@ -678,7 +689,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 2 + 3 + + + + + True + False + + + False + True + 4 @@ -697,7 +719,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 3 + 5 @@ -717,7 +739,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 4 + 6 @@ -737,7 +759,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 5 + 7 @@ -1117,6 +1139,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0 + + + True + False + + + False + True + 1 + + 26 @@ -1133,7 +1166,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 1 + 2 @@ -1153,7 +1186,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 2 + 3 @@ -1173,7 +1206,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 3 + 4 @@ -1420,7 +1453,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False vertical - 5 + 7 26 @@ -1440,6 +1473,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0 + + + True + False + + + False + True + 1 + + 26 @@ -1456,7 +1500,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 1 + 2 @@ -1476,7 +1520,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 2 + 3 @@ -1496,7 +1540,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 3 + 4 + + + + + True + False + + + False + True + 5 @@ -1515,7 +1570,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True - 4 + 6 From 1e5e8beb11c1c7d1bccfc3771c167994b42a8890 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 13:26:10 +0600 Subject: [PATCH 45/63] Design fixes --- ubl-settings-update.glade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index 53d7722..5c4160d 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -1453,7 +1453,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False vertical - 7 + 5 26 From 04fd0e76110a72614ba94b96ca2f436bcb80df6c Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 13:31:21 +0600 Subject: [PATCH 46/63] Sign changes --- source/ubl-settings-update.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index edc1857..4b25d88 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -838,8 +838,12 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ gtk_tree_model_get(model,&iter,1,&target,-1); if (yon_char_parsed_check_exist(siglevel,cur_size,target)>-1){ gtk_list_store_set(window->SignList,&iter,0,1,-1); + } else { + gtk_list_store_set(window->SignList,&iter,0,0,-1); + } } + gtk_entry_set_text(GTK_ENTRY(window->SignLevelCheckEntry),parsed[1]); } if (size>2&&!yon_char_is_empty(parsed[2])){ int usage_size; From 2af03124e5bff0b4952134e1474677b9a88c2aea Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 13:51:56 +0600 Subject: [PATCH 47/63] Added sensitivity login for source combo at repo add window and type combo at mirror add window --- source/ubl-settings-update.c | 23 ++++++++++++++++++++++- source/ubl-settings-update.h | 2 ++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 4b25d88..7b132cd 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -660,7 +660,6 @@ void on_scrolled_window_size_allocate(GtkWidget *, GdkRectangle *allocation, rep void on_repo_add(GtkWidget *, main_window *widgets){ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MirrorTree))); repo_add_window *window = yon_repo_add_window_new(); - g_signal_connect(G_OBJECT(window->RepoSourceCombo),"changed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_combo_box),window->RepoSourceButton); yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"add_repo_window"); dictionary *dict = NULL; @@ -1525,6 +1524,15 @@ void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window){ } +void on_repo_source_changed(GtkComboBox *self, repo_add_window *window){ + int active = gtk_combo_box_get_active(self); + if (active ==0 || active == 4){ + gtk_widget_set_sensitive(window->RepoSourceButton,1); + } else { + gtk_widget_set_sensitive(window->RepoSourceButton,0); + } +} + repo_add_window *yon_repo_add_window_new(){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_repo_add_path); repo_add_window *window = malloc(sizeof(repo_add_window)); @@ -1568,6 +1576,7 @@ repo_add_window *yon_repo_add_window_new(){ yon_gtk_entry_block_restricted_symbols(GTK_ENTRY(window->RepoSourceEntry)); g_signal_connect(G_OBJECT(window->SignDefaultCheck),"toggled",G_CALLBACK(on_sign_check_toggled),window); g_signal_connect(G_OBJECT(window->SignCell),"toggled",G_CALLBACK(on_sign_cell_toggled),window); + g_signal_connect(G_OBJECT(window->RepoSourceCombo),"changed",G_CALLBACK(on_repo_source_changed),window); // g_signal_connect(G_OBJECT(window->SourceListBox),"size-allocate",G_CALLBACK(on_scrolled_window_size_allocate),window); gtk_widget_show(window->Window); @@ -1659,6 +1668,17 @@ mirror_configure_window *yon_mirror_configure_window_new(){ return window; } +void on_mirror_type_changed(GtkComboBox *self, mirror_add_window *window){ + int active = gtk_combo_box_get_active(self); + if (active == 2){ + gtk_widget_set_sensitive(window->AddButton,1); + gtk_widget_set_sensitive(window->TypeButton,1); + } else { + gtk_widget_set_sensitive(window->AddButton,0); + gtk_widget_set_sensitive(window->TypeButton,0); + } +} + mirror_add_window *yon_mirror_add_window_new(){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_mirror_add_path); mirror_add_window *window = malloc(sizeof(mirror_add_window)); @@ -1682,6 +1702,7 @@ mirror_add_window *yon_mirror_add_window_new(){ g_signal_connect(G_OBJECT(window->TypeButton),"clicked",G_CALLBACK(on_file_chooser_open),window->TypeEntry); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_mirror_path_add),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->TypeCombo),"changed",G_CALLBACK(on_mirror_type_changed),window); gtk_widget_show(window->Window); return window; diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 3608cc8..ad51efc 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -330,6 +330,8 @@ void on_sign_check_toggled(GtkToggleButton *self, repo_add_window *window); void on_password_encryption_changed(GtkComboBox *self, password_window *dialog); +void on_mirror_type_changed(GtkComboBox *self, mirror_add_window *window); +void on_repo_source_changed(GtkComboBox *self, repo_add_window *window); password_window *yon_password_window_new(); repo_add_window *yon_repo_add_window_new(); web_publication_add_window *yon_web_publication_add_window_new(); From 544f4e4ee00dd3db21fc66f28b77ae3e8c2315fa Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:05:22 +0600 Subject: [PATCH 48/63] Fixed sign default check registering --- source/ubl-settings-update.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 7b132cd..26013cf 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -844,13 +844,14 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ } gtk_entry_set_text(GTK_ENTRY(window->SignLevelCheckEntry),parsed[1]); } - if (size>2&&!yon_char_is_empty(parsed[2])){ + if (size>2&&!yon_char_is_empty(parsed[2])){ //usage int usage_size; config_str usage = yon_char_parse(parsed[2],&usage_size,","); for (int i=0;iUsageDefaultCheck),1); } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsageDefaultCheck),0); if (!strcmp(usage[i],"Sync")){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->UsageEnableUpdateCheck),1); } @@ -866,7 +867,7 @@ void on_repo_edit(GtkWidget *,main_window *widgets){ } } if (usage_size) yon_char_parsed_free(usage,usage_size); - } //usage + } if (size<3||yon_char_is_empty(parsed[3])||strcmp(parsed[3],"disable")){ //disable gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->EnabledCheck),1); } @@ -1088,8 +1089,10 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict){ return; } - char *sign_level= (char*)gtk_entry_get_text(GTK_ENTRY(window->SignLevelCheckEntry)); - + char *sign_level= ""; + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SignDefaultCheck))){ + sign_level = (char*)gtk_entry_get_text(GTK_ENTRY(window->SignLevelCheckEntry)); + } char *usage = ""; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UsageDefaultCheck))){ usage = "All"; From e5db05884e3229830bf299ee0c40c0e4e9a4aa2a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:08:47 +0600 Subject: [PATCH 49/63] Fixed switching add button off on mirror window --- source/ubl-settings-update.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 26013cf..3d9f38a 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1674,10 +1674,8 @@ mirror_configure_window *yon_mirror_configure_window_new(){ void on_mirror_type_changed(GtkComboBox *self, mirror_add_window *window){ int active = gtk_combo_box_get_active(self); if (active == 2){ - gtk_widget_set_sensitive(window->AddButton,1); gtk_widget_set_sensitive(window->TypeButton,1); } else { - gtk_widget_set_sensitive(window->AddButton,0); gtk_widget_set_sensitive(window->TypeButton,0); } } From 3ede05f5c9d834894ac23de4948b119d8c97e808 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:11:03 +0600 Subject: [PATCH 50/63] Mirror window sensitivity fix --- ubl-settings-update-mirror-add.glade | 1 + 1 file changed, 1 insertion(+) diff --git a/ubl-settings-update-mirror-add.glade b/ubl-settings-update-mirror-add.glade index 49f86be..3a13866 100644 --- a/ubl-settings-update-mirror-add.glade +++ b/ubl-settings-update-mirror-add.glade @@ -174,6 +174,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si 28 28 True + False True True Open file explorer From 5b44e4981400a7961c89465a9038ab4d9857ef06 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:13:33 +0600 Subject: [PATCH 51/63] Design fixes --- ubl-settings-update-mirror-add.glade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ubl-settings-update-mirror-add.glade b/ubl-settings-update-mirror-add.glade index 3a13866..77ac8ea 100644 --- a/ubl-settings-update-mirror-add.glade +++ b/ubl-settings-update-mirror-add.glade @@ -240,6 +240,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si True False vertical + 5 @@ -255,6 +256,7 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si True False vertical + 5 From 4d63f71af6317929d43212b72fdddb65d5668f12 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:19:04 +0600 Subject: [PATCH 52/63] Design changes --- ubl-settings-update-mirror-configure.glade | 8 ++++++++ ubl-settings-update-password.glade | 3 +++ 2 files changed, 11 insertions(+) diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index d87929e..89343ce 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -76,6 +76,7 @@ True False 3 + 3 5 @@ -130,6 +131,7 @@ True False 3 + 3 5 @@ -203,6 +205,7 @@ True False 3 + 3 5 @@ -257,6 +260,7 @@ True False 3 + 3 5 @@ -350,6 +354,7 @@ True False 3 + 3 5 @@ -403,6 +408,7 @@ True False 3 + 3 5 @@ -439,6 +445,7 @@ True False 3 + 3 5 @@ -493,6 +500,7 @@ True False 3 + 3 5 diff --git a/ubl-settings-update-password.glade b/ubl-settings-update-password.glade index a82155b..04a4dbb 100644 --- a/ubl-settings-update-password.glade +++ b/ubl-settings-update-password.glade @@ -54,6 +54,7 @@ True False 3 + 3 vertical 5 @@ -154,6 +155,7 @@ True False 3 + 3 5 @@ -230,6 +232,7 @@ True False 3 + 3 5 From e079376af6621133dac99348e20f7a180840ba8b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:25:32 +0600 Subject: [PATCH 53/63] Design fixes --- ubl-settings-update-mirror-configure.glade | 16 ---------------- ubl-settings-update-password.glade | 6 ------ 2 files changed, 22 deletions(-) diff --git a/ubl-settings-update-mirror-configure.glade b/ubl-settings-update-mirror-configure.glade index 89343ce..8ed890f 100644 --- a/ubl-settings-update-mirror-configure.glade +++ b/ubl-settings-update-mirror-configure.glade @@ -75,8 +75,6 @@ True False - 3 - 3 5 @@ -130,8 +128,6 @@ True False - 3 - 3 5 @@ -204,8 +200,6 @@ True False - 3 - 3 5 @@ -259,8 +253,6 @@ True False - 3 - 3 5 @@ -353,8 +345,6 @@ True False - 3 - 3 5 @@ -407,8 +397,6 @@ True False - 3 - 3 5 @@ -444,8 +432,6 @@ True False - 3 - 3 5 @@ -499,8 +485,6 @@ True False - 3 - 3 5 diff --git a/ubl-settings-update-password.glade b/ubl-settings-update-password.glade index 04a4dbb..aceb9ba 100644 --- a/ubl-settings-update-password.glade +++ b/ubl-settings-update-password.glade @@ -53,8 +53,6 @@ True False - 3 - 3 vertical 5 @@ -154,8 +152,6 @@ True False - 3 - 3 5 @@ -231,8 +227,6 @@ True False - 3 - 3 5 From 1696d4be72a4f80d61634959319af142484fb08f Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:29:01 +0600 Subject: [PATCH 54/63] Design fixes --- ubl-settings-update-web-publication-add.glade | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 0b79cc1..6a27356 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -82,8 +82,6 @@ True False - 3 - 3 5 @@ -139,8 +137,6 @@ True True - 3 - 3 in @@ -187,8 +183,6 @@ True False - 3 - 3 5 @@ -242,8 +236,6 @@ True False - 3 - 3 0.019999999552965164 in @@ -282,8 +274,6 @@ True False - 3 - 3 0.019999999552965164 in From c54315c45b881558173095a99378b29f4a4b4862 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:46:07 +0600 Subject: [PATCH 55/63] Return of standard port --- ubl-settings-update-web-publication-add.glade | 1 + 1 file changed, 1 insertion(+) diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 6a27356..4729aae 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -218,6 +218,7 @@ False True adjustment1 + 8080 False From 434bce48c142a26a97af58275a1e6e013c624936 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 14:48:30 +0600 Subject: [PATCH 56/63] Added column size saving --- source/ubl-settings-update.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 3d9f38a..77ebcfe 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1834,7 +1834,33 @@ void yon_main_window_complete(main_window *widgets){ } } + + GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->MirrorTree)); + for (guint i=0;iPublicationTree)); + for (guint i=0;iWebPublicationTree)); + for (guint i=0;iRepositoriesTree)); + for (guint i=0;iUpdateRepoTree)); + for (guint i=0;iBootCheck),"toggled",G_CALLBACK(on_toggle_button_toggled),widgets); From 228169573c67f862c9592996f4ea32c4164d1261 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 16:39:35 +0600 Subject: [PATCH 57/63] Fixed repositories visibility on Publication tab --- source/ubl-settings-update.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 77ebcfe..10c61bc 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -290,7 +290,12 @@ void yon_interface_update(main_window *widgets){ yon_char_parsed_free(parsed,cur_size); } } else { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->PublicationCheck),1); + for (int i=0;iPublicationList,&iter); + gtk_list_store_set(widgets->PublicationList,&iter,1,publish_repos[i],0,1,-1); + } + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->PublicationCheck),0); } } { From 398e75e7fe5dc51a99df2117825895f26c896359 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 17:33:14 +0600 Subject: [PATCH 58/63] System update mode default value render edits --- source/ubl-settings-update.c | 19 +++++++++++++++++++ source/ubl-strings.h | 8 +++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 10c61bc..546da07 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -1866,6 +1866,25 @@ void yon_main_window_complete(main_window *widgets){ yon_window_config_add_listener((GtkWidget*)g_list_nth_data(list,i),yon_char_append("UpdateColumn",yon_char_from_int(i)),"fixed-width",YON_TYPE_INT); } g_list_free(list); + { + int size; + config_str parsed = yon_config_load(yon_config_parameter_prepare_command(AUTOUPDATE_mode_command,"default",NULL,NULL),&size); + if (size){ + yon_char_remove_last_symbol(parsed[0],'\n'); + free(yon_char_divide_search(parsed[0],"=",-1)); + char *mode = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->UpdateModeCombo)); + if (!strcmp(parsed[0],"modsys")){ + mode = yon_char_unite(mode," (",MODSYS_UPDATE_MODE_LABEL,")",NULL); + } else if (!strcmp(parsed[0],"modules")){ + mode = yon_char_unite(mode," (",MODULES_UPDATE_MODE_LABEL,")",NULL); + } else if (!strcmp(parsed[0],"system")){ + mode = yon_char_unite(mode," (",SYSTEM_UPDATE_MODE_LABEL,")",NULL); + } + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(widgets->UpdateModeCombo),0); + gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(widgets->UpdateModeCombo),mode); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->UpdateModeCombo),0); + } + } yon_interface_update(widgets); g_signal_connect(G_OBJECT(widgets->BootCheck),"toggled",G_CALLBACK(on_toggle_button_toggled),widgets); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 92ac93a..9a63636 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -17,6 +17,11 @@ #define PASSWORD_RESTRICTED_SYMBOL_LABEL _("Password contains restricted symbols") #define ENTRY_RESTRICTED_SYMBOL_LABEL _("Entry contains restricted symbols") + + #define MODSYS_UPDATE_MODE_LABEL _("First update all modules and then the system") + #define MODULES_UPDATE_MODE_LABEL _("Update only modules") + #define SYSTEM_UPDATE_MODE_LABEL _("Update everything in the order of the specified repositories") + #define REPO_TOOLTIP_LABEL _("file://\t\t- Directory URL prefix for repository\n\ ftp://\t\t- FTP URL prefix for repository\n\ http://\t\t- HTTP URL prefix for repository\n\ @@ -52,9 +57,6 @@ mirrorlist - mirrors file, make sure server URL is NOT included in this file! Si #define _LABEL _("Date of last automatic update:") #define _LABEL _("Date of last automatic update") #define _LABEL _("Automatic update") - #define _LABEL _("First update all modules and then the system") - #define _LABEL _("Update only modules") - #define _LABEL _("Update everything in the order of the specified repositories") #define _LABEL _("Update mode:") #define _LABEL _("Update interval:") From b3fdec9350bc0d15e0b719096e513d1704afe75a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Dec 2024 11:10:49 +0600 Subject: [PATCH 59/63] Added REPOSITORY[*] to default loading --- source/ubl-settings-update.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index ad51efc..2ebc803 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -47,7 +47,7 @@ #define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) #define config_get_local_command "ubconfig --source system get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL #define config_get_global_command "ubconfig --source global get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_default_command "ubconfig --source default get [update] AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE",NULL +#define config_get_default_command "ubconfig --source default get [update] AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE REPOSITORY[*]",NULL #define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update",target,NULL) #define config_get_global_only_parameters "" @@ -87,7 +87,7 @@ extern template_app_info template_app_information; typedef char* string; -string version_application; +string version_application = "1.4"; char *local; From c61130b415a954ad2c0436b7c22375556ba48ba7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Dec 2024 09:15:17 +0600 Subject: [PATCH 60/63] README.md update --- README.md | 3 +++ screenshot/screenshot.png | Bin 51588 -> 78009 bytes source/ubl-settings-update.h | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7055ab1..524394e 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ In order to build ubl-settings-manager you will need: - CMake - C compiler - GTK+ 3 & dependencies +- [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/screenshot/screenshot.png b/screenshot/screenshot.png index 485ce22301e724cfa67371fef5efde3f206cd6e3..5e893b82154fc23482c06b3a71fbc342b930b9c2 100644 GIT binary patch literal 78009 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

+wP?A> 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 literal 51588 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 diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 2ebc803..7413f52 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -87,7 +87,7 @@ extern template_app_info template_app_information; typedef char* string; -string version_application = "1.4"; +string version_application; char *local; From ca602ee22b407bd6cd0fe60a093eeedbb94c18e3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Dec 2024 14:30:02 +0600 Subject: [PATCH 61/63] Test fix for mirror configuration shows at mirrors list --- source/ubl-settings-update.c | 28 +++++++++++++++++++--------- source/ubl-settings-update.h | 10 ++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 546da07..c56b43c 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -311,6 +311,15 @@ void yon_interface_update(main_window *widgets){ config_str mirror_list = yon_config_get_all_by_key(REPOPUBLIC_CACHE_search,&size); if (size){ for (int i=0;iUpdatesRequestDelaySpin = yon_gtk_builder_get_widget(builder,"UpdatesRequestDelaySpin"); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->PortDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->PortSpin); - g_signal_connect(G_OBJECT(window->CacheDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheEntry); - g_signal_connect(G_OBJECT(window->CacheDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheButton); - g_signal_connect(G_OBJECT(window->InactivityDurationDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->InactivityDurationSpin); - g_signal_connect(G_OBJECT(window->CacheTimeoutDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheTimeoutSpin); - g_signal_connect(G_OBJECT(window->ProxyCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->ProxyEntry); - g_signal_connect(G_OBJECT(window->AgentDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->AgentEntry); - g_signal_connect(G_OBJECT(window->UpdatesDelayDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UpdatesDelaySpin); - g_signal_connect(G_OBJECT(window->UpdatesRequestDelayDefaultCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UpdatesRequestDelaySpin); + g_signal_connect(G_OBJECT(window->PortDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->PortSpin); + g_signal_connect(G_OBJECT(window->CacheDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheEntry); + g_signal_connect(G_OBJECT(window->CacheDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheButton); + g_signal_connect(G_OBJECT(window->CacheButton),"clicked",G_CALLBACK(on_file_chooser_open),window->CacheEntry); + g_signal_connect(G_OBJECT(window->InactivityDurationDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->InactivityDurationSpin); + g_signal_connect(G_OBJECT(window->CacheTimeoutDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->CacheTimeoutSpin); + g_signal_connect(G_OBJECT(window->ProxyCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->ProxyEntry); + g_signal_connect(G_OBJECT(window->AgentDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->AgentEntry); + g_signal_connect(G_OBJECT(window->UpdatesDelayDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UpdatesDelaySpin); + g_signal_connect(G_OBJECT(window->UpdatesRequestDelayDefaultCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UpdatesRequestDelaySpin); gtk_widget_show(window->Window); return window; diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 7413f52..70a0f93 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -72,6 +72,16 @@ #define REPOPUBLIC_CACHE_search "REPOPUBLIC_CACHE[" #define REPOPUBLIC_CACHE_full(target) yon_char_unite("REPOPUBLIC_CACHE[",target,"]",NULL) #define REPOPUBLIC_CACHE_full_command(target) yon_char_unite("ubconfig --source global get [update] REPOPUBLIC_CACHE[",target,"]",NULL) +#define REPOPUBLIC_CACHE_port "REPOPUBLIC_CACHE[port]" +#define REPOPUBLIC_CACHE_cache_dir "REPOPUBLIC_CACHE[cache_dir]" +#define REPOPUBLIC_CACHE_purge_files_after "REPOPUBLIC_CACHE[purge_files_after]" +#define REPOPUBLIC_CACHE_download_timeout "REPOPUBLIC_CACHE[download_timeout]" +#define REPOPUBLIC_CACHE_http_proxy "REPOPUBLIC_CACHE[http_proxy]" +#define REPOPUBLIC_CACHE_user_agent "REPOPUBLIC_CACHE[user_agent]" +#define REPOPUBLIC_CACHE_cron "REPOPUBLIC_CACHE[prefetch.cron]" +#define REPOPUBLIC_CACHE_ttl_unaccessed_in_days "REPOPUBLIC_CACHE[prefetch.ttl_unaccessed_in_days]" +#define REPOPUBLIC_CACHE_ttl_unupdated_in_days "REPOPUBLIC_CACHE[prefetch.ttl_unupdated_in_days]" + #define AUTOUPDATE "AUTOUPDATE" #define AUTOUPDATE_command "ubconfig --source global get [update] AUTOUPDATE" #define AUTOUPDATE_mode "AUTOUPDATE[mode]" From 6742c368218175efeeed79c29a3b395b878cec89 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Dec 2024 15:11:29 +0600 Subject: [PATCH 62/63] fixed REPOSITORY parameter loading --- source/ubl-settings-update.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index 70a0f93..e3e409f 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -44,10 +44,10 @@ #define sha256_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha256sum | cut -f 1 -d ' '",NULL) #define sha512_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) -#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) -#define config_get_local_command "ubconfig --source system get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_global_command "ubconfig --source global get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL -#define config_get_default_command "ubconfig --source default get [update] AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE REPOSITORY[*]",NULL +#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL) +#define config_get_local_command "ubconfig --source system get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_global_command "ubconfig --source global get [update] REPOPUBLIC_NET REPOPUBLIC_WEB REPOSITORY REPOSITORY[*] REPOPUBLIC_WEB REPOPUBLIC_WEB[*] REPOPUBLIC_CACHE REPOPUBLIC_CACHE[*] AUTOUPDATE AUTOUPDATE[mode] AUTOUPDATE[interval] AUTOUPDATE[repos] AUTOUPDATE[timestamp]",NULL +#define config_get_default_command "ubconfig --source default get [update] AUTOUPDATE[repos] AUTOUPDATE[interval] AUTOUPDATE[mode] AUTOUPDATE REPOSITORY REPOSITORY[*]",NULL #define config_get_command_no_repos(config,target) yon_char_unite("ubconfig --source ",config," get update",target,NULL) #define config_get_global_only_parameters "" From 60178fe08a34f7374a55ed00b86d8ce4a90b1124 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Dec 2024 17:45:58 +0600 Subject: [PATCH 63/63] Fixed REPOSITORY=disable parameter always saving --- source/ubl-settings-update.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index c56b43c..15490b2 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -24,6 +24,7 @@ void on_save_done(main_window *, config_str output, int size){ break; } textdomain(LocaleName); + yon_config_set_ignore(REPOSITORY_parameter); }