master #193

Merged
asmeron merged 28 commits from YanTheKaller/ubl-settings-usergroups:master into master 10 months ago

@ -74,8 +74,7 @@ int yon_load_proceed(YON_CONFIG_TYPE type){
}
void yon_interface_update(main_window *widgets){
gtk_list_store_clear(widgets->UsersList);
gtk_list_store_clear(widgets->GroupsList);
on_system_update(NULL,widgets);
int size;
GtkTreeIter iter;
char *def_groups = yon_config_get_by_key(USERGROUPS_parameter);
@ -149,7 +148,6 @@ void yon_interface_update(main_window *widgets){
if (parameters_size>1&&!strcmp(parameters[1],"x")) parameters[1]="";
char *pars="";
if (parameters_size>4&&strcmp(parameters[4],"x")&&strcmp(parameters[4],"")){
if (!check_is_password_hash(parameters[4])&&parameters[4][0]!='%'&&parameters[4][1]!='%'){
pars = ENCRYPTED_LABEL;
} else {
@ -162,9 +160,9 @@ void yon_interface_update(main_window *widgets){
}
gtk_list_store_set(widgets->GroupsList,&iter,
1,login,
0,parameters_size>1?parameters[1]:"",
2,parameters_size>0?parameters[0]:"",
3,parameters_size>2?parameters[2]:"",
0,parameters_size>2?parameters[2]:"",
2,parameters_size>1?parameters[1]:"",
3,parameters_size>3?parameters[3]:"",
4,pars,
-1);
if(parameters)
@ -215,10 +213,10 @@ if (main_config.sync_users){
int size;
config_str parsed = yon_char_parse(main_config.sync_users[i],&size,":");
if (!yon_char_is_empty(parsed[1])){
if (system (samba_sync_password_command(parsed[0],parsed[1]))){};
yon_launch (yon_debug_output("%s\n",samba_sync_password_command(parsed[0],parsed[1])));
} else {
if (system ( samba_sync_command(parsed[0]))){};
yon_launch (yon_debug_output("%s\n",samba_sync_command(parsed[0])));
}
@ -412,6 +410,9 @@ void on_save_done(main_window *widgets, config_str output, int size){
textdomain(LocaleName);
}
void on_save_failed(main_window *, config_str , int ){
yon_samba_sync_proceed();
}
void on_config_save(GtkWidget *, main_window *){
@ -714,6 +715,20 @@ yon_confirmation_window *yon_delete_confirmation_new(){
return window;
}
void yon_system_delete_confirmation_open(main_window *widgets){
yon_confirmation_window *window = yon_delete_confirmation_new();
gtk_window_set_transient_for(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window));
GtkTreeIter iter;
dictionary *dict = NULL;
yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(yon_delete_confirmation_save),dict);
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore1);
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemTree)),&model,&iter)){
// gtk_tree_model_get(model,&iter,1,,2,,)
}
}
void yon_delete_confirmation_open(main_window *widgets){
yon_confirmation_window *window = yon_delete_confirmation_new();
gtk_window_set_transient_for(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window));
@ -850,8 +865,8 @@ void on_groups_save(GtkWidget *self, dictionary *dict){
void on_groups_clicked(GtkWidget *, GtkEntry *output_target){
ubl_settings_usergroups_group_window *window = yon_ubl_settings_usergroups_group_new(0);
gtk_window_set_title(GTK_WINDOW(window->GroupsWindow),MAIN_GROUP_LABEL);
gtk_label_set_text(GTK_LABEL(window->HeaderLabel),MAIN_GROUP_LABEL);
gtk_window_set_title(GTK_WINDOW(window->GroupsWindow),MAIN_GROUP_TITLE_LABEL);
gtk_label_set_text(GTK_LABEL(window->HeaderLabel),MAIN_GROUP_TITLE_LABEL);
GtkTreeIter iter, itar,itor;
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.groups_list),&iter);
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.groups_list),&iter)){
@ -1003,8 +1018,10 @@ void on_password_change(GtkWidget *, dictionary *entry_dict){
if (!check_is_password_hash(password)){
gtk_entry_set_text(GTK_ENTRY(window->PasswordHashEntry),password);
} else {
if (password[0]=='%'&&password[1]=='%')
if (password[0]=='%'&&password[1]=='%'){
free(yon_char_divide(password,1));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->NoEncriptionCheck),1);
}
gtk_entry_set_text(GTK_ENTRY(window->PasswordEntry),password);
}
}
@ -1320,18 +1337,15 @@ void on_GID_update(GtkWidget *, ubl_settings_usergroups_group_creation_window *w
yon_char_parsed_prepend_strings(config_groups,config_size,":");
config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_groups,config_size,&final_size);
long prev_busy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))?0:main_config.MINGID;
int minimum = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))?0:main_config.MINGID;
int maximum = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))?68000:main_config.MAXGID;
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (atol(parsed[2])>=main_config.MINGID||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck))){
if (atol(parsed[2])>main_config.MAXGID||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck)))
break;
if (atol(parsed[2])==prev_busy+1)
if (parsed_size>2&&minimum<atol(parsed[2])&&atol(parsed[2])<maximum){
if (atol(parsed[2])>prev_busy){
prev_busy=atol(parsed[2]);
else {
yon_char_parsed_free(parsed, parsed_size);
break;
}
}
yon_char_parsed_free(parsed, parsed_size);
@ -1364,28 +1378,35 @@ void on_group_save(GtkWidget *self, dictionary *dict){
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
return;
}
}
int config_size=0;
int final_size=0;
config_str config_users = yon_config_get_all_by_key(USERADD_SEARCH_macro,&config_size);
yon_char_parsed_prepend_strings(config_users,config_size,":");
config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_users,config_size,&final_size);
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UnuniqueGIDCheck))){
int found=0;
char *uid_string = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry));
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (parsed_size>1&&!strcmp(parsed[2],uid_string)&&strcmp(parsed[2],window->last_gid)) found = 1;
if (parsed_size) yon_char_parsed_free(parsed,parsed_size);
}
if (found){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),GID_ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
return;
if (strcmp(gid,window->last_gid)){
int config_size=0;
int final_size=0;
config_str config_users = yon_config_get_all_by_key(GROUPADD_SEARCH_macro,&config_size);
config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_users,config_size,&final_size);
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UnuniqueGIDCheck))){
int found=0;
char *uid_string = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry));
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (parsed_size>2&&!strcmp(parsed[2],uid_string)){
if (yon_char_is_empty(window->last_gid)||(!yon_char_is_empty(window->last_gid)&&strcmp(parsed[2],window->last_gid))){
found = yon_char_parsed_check_exist(config_users,config_size,final[i])>-1?1:2;
break;
}
}
if (parsed_size) yon_char_parsed_free(parsed,parsed_size);
}
if (found){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),found==1?GID_ALREADY_EXIST_CONFIG_LABEL:GID_ALREADY_EXIST_SYSTEM_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
return;
}
}
}
}
group_name = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry));
if (group_name[0]>'0'&&group_name[0]<'9'){
@ -1819,8 +1840,16 @@ void yon_system_load(main_window *window){
void on_system_update(GtkWidget *, main_window *window){
gtk_list_store_clear(window->UsersList);
gtk_list_store_clear(window->GroupsList);
if (main_config.groups_size) yon_char_parsed_free(main_config.groups,main_config.groups_size);
if (main_config.users_size) yon_char_parsed_free(main_config.users,main_config.users_size);
if (main_config.shadow_size) yon_char_parsed_free(main_config.shadow,main_config.shadow_size);
if (main_config.group_shadow_size) yon_char_parsed_free(main_config.group_shadow,main_config.group_shadow_size);
main_config.groups = yon_file_open(groups_path,&main_config.groups_size);
main_config.users = yon_file_open(users_path,&main_config.users_size);
main_config.shadow = yon_file_open(shadow_path,&main_config.shadow_size);
main_config.group_shadow = yon_file_open(group_shadow_path,&main_config.group_shadow_size);
int login_size;
config_str login_defs = yon_file_open(uid_path,&login_size);
for (int i=0;i<login_size;i++){
@ -1912,17 +1941,18 @@ void on_UID_update(GtkWidget *, ubl_settings_usergroups_user_window *window){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (atol(parsed[2])>=main_config.MINUID||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck))){
if (atol(parsed[2])>main_config.MAXUID||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck)))
break;
if (atol(parsed[2])==prev_busy+1)
int minimum = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck))?0:main_config.MINGID;
int maximum = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck))?68000:main_config.MAXGID;
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (minimum<atol(parsed[2])&&atol(parsed[2])<maximum){
if (atol(parsed[2])>prev_busy){
prev_busy=atol(parsed[2]);
else {
yon_char_parsed_free(parsed, parsed_size);
break;
}
}
yon_char_parsed_free(parsed, parsed_size);
}
yon_char_parsed_free(parsed, parsed_size);
}
gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),yon_char_from_long(prev_busy+1));
}
@ -1982,18 +2012,26 @@ void on_user_save(GtkWidget *self, dictionary *dict){
config_str final = yon_char_parsed_merge(main_config.users,main_config.users_size,config_users,config_size,&final_size);
uid_string = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry));
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck))){
int found=0;
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (parsed_size>1&&!strcmp(parsed[2],uid_string)&&(!yon_char_is_empty(window->last_uid)&&strcmp(parsed[2],window->last_uid))) found = 1;
if (parsed_size) yon_char_parsed_free(parsed,parsed_size);
}
if (found){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),UID_ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
return;
if (strcmp(uid_string,window->last_uid)){
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userCreateUnuniqueCheck))){
int found=0;
for (int i=0;i<final_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(final[i],&parsed_size,":");
if (parsed_size>2&&!strcmp(parsed[2],uid_string)){
if (yon_char_is_empty(window->last_uid)||(!yon_char_is_empty(window->last_uid)&&strcmp(parsed[2],window->last_uid))){
found = yon_char_parsed_check_exist(config_users,config_size,final[i])>-1?1:2;
break;
}
}
if (parsed_size) yon_char_parsed_free(parsed,parsed_size);
}
if (found){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),found==1?UID_ALREADY_EXIST_CONFIG_LABEL:UID_ALREADY_EXIST_SYSTEM_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
return;
}
}
}
@ -2110,7 +2148,7 @@ void on_user_save(GtkWidget *self, dictionary *dict){
if (user_shell_active>0){
char *shell_string = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo));
if (strcmp(shell_string,SET_LABEL)){
user_shell = yon_char_unite("--shell ",shell_string,NULL);
user_shell = yon_char_unite("--shell ",shell_string," ",NULL);
} else {
user_shell = yon_char_unite("--shell ",(char*)gtk_entry_get_text(GTK_ENTRY(window->userShellEntry)),NULL);
}
@ -2590,6 +2628,8 @@ void on_main_edit(GtkWidget *, main_window *widgets){
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck),0);
gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry), parsed_size>1?parameters[1]:"");
}
if (!yon_char_is_empty(parameters[1]))
window->last_uid=yon_char_new(parameters[1]);
}
if (parsed_size>2){
if (!strcmp(parameters[2],"x"))
@ -2597,8 +2637,6 @@ void on_main_edit(GtkWidget *, main_window *widgets){
else {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userGroupsCheck),0);
gtk_entry_set_text(GTK_ENTRY(window->userGroupsEntry), parsed_size>2?parameters[2]:"");
if (!yon_char_is_empty(parameters[2]))
window->last_uid=yon_char_new(parameters[2]);
}
}
if (parsed_size>3){
@ -2640,12 +2678,28 @@ void on_main_edit(GtkWidget *, main_window *widgets){
}
}
if (parsed_size>5){
if (check_is_password_hash(parameters[5])){
if (strcmp(parameters[5],"!*")&&!yon_char_check_begins_with(parameters[5],"%%")){
char *temp = yon_char_append("%%",parameters[5]);
free(parameters[5]);
parameters[5]=temp;
}
}
window->old_password=yon_char_new(parameters[5]);
if (strcmp(parameters[5],"x")&&strcmp(parameters[5],"")){
if (yon_check_password_blocked(parameters[5])){
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userDeactivatedCheck),1);
}
if (!yon_char_is_empty(parameters[5])){
if (check_is_password_hash(parameters[5])){
if (yon_char_check_begins_with(parameters[5],"%%")==-1){
char *temp = yon_char_append("%%",parameters[5]);
free(parameters[5]);
parameters[5]=temp;
}
gtk_widget_set_sensitive(window->userSyncSAMBAPasswordCheck,0);
g_signal_handlers_block_by_func(G_OBJECT(window->userSyncSAMBACheck),G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userSyncSAMBAPasswordCheck);
}
if (!strcmp(parameters[5],"!*")){
gtk_combo_box_set_active(GTK_COMBO_BOX(window->userPasswordCombo),1);
} else {
@ -2780,10 +2834,46 @@ void on_main_delete(GtkWidget *, main_window *widgets){
dialog_confirmation_data *data=malloc(sizeof(dialog_confirmation_data));
data->function=NULL;
data->data=NULL;
if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){
int active = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook));
switch(active){
case 0:
yon_delete_confirmation_open(widgets);
} else {
break;
case 1:
yon_group_delete_confirmation_open(widgets);
break;
case 2:{
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore1);
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemTree)),&model,&iter)){
char *target;
gtk_tree_model_get(model,&iter,2,&target,-1);
dialog_confirmation_data data;
int found = !!config(USERADD(target));
if (found){
data.action_text = SYSTEM_USER_CONFIG_REMOVE_CONFIRMATION_LABEL(target);
data.function=NULL;
data.data=NULL;
} else {
data.action_text = SYSTEM_USER_SYSTEM_REMOVE_CONFIRMATION_LABEL(target);
data.function=NULL;
data.data=NULL;
}
if (yon_confirmation_dialog_call(widgets->Window,&data)!=GTK_RESPONSE_ACCEPT){
return;
}
if (found){
yon_delete_confirmation_open(widgets);
} else {
yon_system_delete_confirmation_open(widgets);
}
}
}break;
case 3:{
}break;
}
}
@ -2793,14 +2883,14 @@ void on_config_update(GtkWidget *, main_window *widgets){
} else {
on_config_local_load(NULL,widgets);
}
on_system_update(NULL,widgets);
// on_system_update(NULL,widgets);
}
void on_user_sync_with_config(GtkWidget *,main_window *widgets){
int active = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook));
switch (active){
case 2:
case 2:{
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore1);
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemTree)),&model,&iter)){
@ -2819,40 +2909,79 @@ void on_user_sync_with_config(GtkWidget *,main_window *widgets){
if (yon_confirmation_dialog_call(widgets->Window,&data)!=GTK_RESPONSE_ACCEPT){
return;
}
int size;
config_str passwd_users = yon_file_open(users_path,&size);
int active_usr = yon_char_parsed_strstr(passwd_users,size,target);
int cur_size;
if (size){
yon_char_remove_last_symbol(passwd_users[active_usr],'\n');
config_str cur_user = yon_char_parse(passwd_users[active_usr],&cur_size,":");
int final_size=0;
config_str final_user_parsed = NULL;
yon_char_parsed_add_or_create_if_exists(final_user_parsed,&final_size,cur_user[4]);
yon_char_parsed_add_or_create_if_exists(final_user_parsed,&final_size,cur_user[3]);
yon_char_parsed_add_or_create_if_exists(final_user_parsed,&final_size,"x");
char *extra_groups = yon_char_unite(!yon_char_is_empty(cur_user[6])?"--shell ":"",!yon_char_is_empty(cur_user[6])?cur_user[6]:"",!yon_char_is_empty(cur_user[6])?" ":"",!yon_char_is_empty(cur_user[5])?"--home-dir ":"",!yon_char_is_empty(cur_user[5])?cur_user[5]:"",NULL);
yon_char_parsed_add_or_create_if_exists(final_user_parsed,&final_size,extra_groups);
yon_char_parsed_add_or_create_if_exists(final_user_parsed,&final_size,cur_user[1]);
char *final_user = yon_char_parsed_to_string(final_user_parsed,final_size,":");
if (config(USERADD(target))){
char *final_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",USERADD_SYNC(target));
yon_config_register(USERADD_SYNC(target),final_command,final_user);
} else {
char *final_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",USERADD(target));
yon_config_register(USERADD(target),final_command,final_user);
}
// int shadow_size;
// config_str shadow = yon_file_open(shadow_path,&shadow_size);
char *user = yon_char_parsed_check_exist_begins_with(main_config.groups,main_config.groups_size,target);
char *shadow = yon_char_parsed_check_exist_begins_with(main_config.group_shadow,main_config.group_shadow_size,target);
yon_char_remove_last_symbol(user,'\n');
yon_char_remove_last_symbol(shadow,'\n');
int user_size=0;
int shadow_size=0;
config_str parsed = yon_char_parse(user,&user_size,":");
config_str parsed_shadow = yon_char_parse(shadow,&shadow_size,":");
char *optionals = yon_char_unite(user_size>5? parsed[5]:"",user_size>5?" ":"",user_size>6?parsed[6]:"",NULL);
char *config_user = yon_char_unite(parsed[0],":",
user_size>4?parsed[4]:"",":",
user_size>2?parsed[2]:"",":",
user_size>3?parsed[3]:"",":",
!yon_char_is_empty(optionals)?optionals:"",":",
user_size>1&&strcmp(parsed[1],"x")?yon_char_return_if_exist(parsed[1],""):yon_char_return_if_exist(parsed_shadow[1],""),NULL);
char *config_shadow = yon_char_unite(yon_char_return_if_exist(parsed[2],""),":",
user_size>3?parsed[3]:"",":",
user_size>4?parsed[4]:"",":",
user_size>5?parsed[5]:"",":",
user_size>6?parsed[6]:"",":",
user_size>7?parsed[7]:"",":",NULL);
if (!yon_char_is_empty(config_user)){
char *user_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",USERADD(target));
yon_config_register(USERADD(target),user_command,config_user);
}
if (!yon_char_is_empty(config_shadow)){
char *shadow_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",USERSHADOW(target));
yon_config_register(USERSHADOW(target),shadow_command,config_shadow);
}
yon_interface_update(widgets);
}
yon_interface_update((main_window*)widgets);
break;
case 3:
break;
}break;
case 3:{
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore1);
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemGroupsTree)),&model,&iter)){
char *target;
gtk_tree_model_get(model,&iter,1,&target,-1);
dialog_confirmation_data data;
if (config(GROUPADD(target))){
data.action_text = SYSTEM_GROUP_ADD_CONFIRMATION_LABEL(target);
data.data=NULL;
data.function=NULL;
} else {
data.action_text = SYSTEM_GROUP_SYNC_CONFIRMATION_LABEL(target);
data.data=NULL;
data.function=NULL;
}
if (yon_confirmation_dialog_call(widgets->Window,&data)!=GTK_RESPONSE_ACCEPT){
return;
}
char *group = yon_char_parsed_check_exist_begins_with(main_config.groups,main_config.groups_size,target);
char *group_shadow = yon_char_parsed_check_exist_begins_with(main_config.group_shadow,main_config.group_shadow_size,target);
yon_char_remove_last_symbol(group,'\n');
yon_char_remove_last_symbol(group_shadow,'\n');
int group_size=0;
int group_shadow_size=0;
config_str parsed = yon_char_parse(group,&group_size,":");
config_str parsed_shadow = yon_char_parse(group_shadow,&group_shadow_size,":");
char *config_group = yon_char_unite(parsed[0],":",parsed[3],":",parsed[2],"::",parsed_shadow[2],":",strcmp(parsed[1],"x")?parsed[1]:parsed_shadow[1],NULL);
if (!yon_char_is_empty(config_group)){
char *group_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",GROUPADD(target));
yon_config_register(GROUPADD(target),group_command,config_group);
yon_interface_update(widgets);
}
}
}break;
}
}
@ -2882,6 +3011,8 @@ void config_init(){
main_config.save_config=0;
main_config.groups = yon_file_open(groups_path,&main_config.groups_size);
main_config.users = yon_file_open(users_path,&main_config.users_size);
main_config.shadow = yon_file_open(shadow_path,&main_config.shadow_size);
main_config.group_shadow = yon_file_open(group_shadow_path,&main_config.group_shadow_size);
main_config.users_list=NULL;
main_config.groups_list=NULL;
main_config.password_min_length=6;
@ -3076,25 +3207,32 @@ main_window *yon_main_window_complete(main_window *widgets){
yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size);
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UsersTree));
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->GroupsTree));
yon_load_proceed(YON_CONFIG_LOCAL);
yon_interface_update((main_window*)widgets);
gtk_widget_realize(GTK_WIDGET(widgets->UsersTree));
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UsersTree));
gtk_widget_realize(GTK_WIDGET(widgets->GroupsTree));
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->GroupsTree));
GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->UsersTree));
gtk_tree_view_column_set_min_width(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,1)),50);
gtk_tree_view_column_set_min_width(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,2)),175);
gtk_tree_view_column_set_min_width(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,3)),175);
for (guint i=0;i<g_list_length(list);i++){
if (i!=1&&i!=2&&i!=3)
yon_gtk_tree_view_column_minimal_fixed_size_set(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,i)));
yon_window_config_add_listener((GtkWidget*)g_list_nth_data(list,i),yon_char_append("UserColumn",yon_char_from_int(i)),"fixed-width",YON_TYPE_INT);
}
g_list_free(list);
list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->GroupsTree));
gtk_tree_view_column_set_min_width(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,0)),50);
gtk_tree_view_column_set_min_width(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,1)),175);
for (guint i=0;i<g_list_length(list);i++){
if (i!=0&&i!=1)
yon_gtk_tree_view_column_minimal_fixed_size_set(GTK_TREE_VIEW_COLUMN(g_list_nth_data(list,i)));
yon_window_config_add_listener((GtkWidget*)g_list_nth_data(list,i),yon_char_append("GroupColumn",yon_char_from_int(i)),"fixed-width",YON_TYPE_INT);
}
g_list_free(list);
yon_save_window_set_postsave_function(on_save_done,widgets);
yon_save_window_set_postsave_failure_function(on_save_failed,widgets);
return widgets;
}

@ -47,9 +47,18 @@
#define get_passwords_command "ubconfig --target global get [users] USERADD[*] GROUPADD[*]"
#define check_is_password_hash(password) system(yon_char_unite("/lib/ublinux/functions is_hash_password '", password,"'",NULL))
#define get_system_user_command(target) yon_char_unite("/usr/lib/ublinux/functions get_conf_useradd_from_system ",target,NULL)
#define get_system_shadow_command(target) yon_char_unite("/usr/lib/ublinux/functions get_conf_usershadow_from_system ",target,NULL)
#define get_system_group_command(target) yon_char_unite("/usr/lib/ublinux/functions get_conf_groupadd_from_system ",target,NULL)
#define remove_user_from_system_command(target) yon_char_append("userdel ",target)
#define remove_user_and_homedir_from_system_command yon_char_append("userdel -r ",target)
#define remove_group_from_system_command yon_char_append("groupdel ",target)
#define groups_path "/etc/group"
#define users_path "/etc/passwd"
#define shadow_path "/etc/shadow"
#define group_shadow_path "/etc/gshadow"
#define uid_path "/etc/login.defs"
#define password_limits_path "/etc/security/pwquiality.conf"
#define get_user_info_command(target) yon_char_unite("getent passwd \"",target,"\"",NULL)
@ -139,10 +148,16 @@ char *local;
typedef struct {
template_config_fields
config_str groups;
int groups_size;
config_str users;
int users_size;
config_str shadow;
int shadow_size;
config_str group_shadow;
int group_shadow_size;
GtkListStore *users_list;
GtkListStore *groups_list;
@ -389,6 +404,7 @@ void yon_samba_sync_proceed();
void yon_accept_changes();
void yon_hide_passwords(template_saving_window *window);
void on_save_done(main_window *widgets, config_str output, int size);
void on_save_failed(main_window *, config_str , int );
void on_config_save(GtkWidget *self, main_window *widgets);
void on_config_global_save(GtkWidget *self, main_window *widgets);
void on_config_local_save(GtkWidget *self, main_window *widgets);
@ -403,6 +419,8 @@ void yon_delete_confirmation_save(GtkWidget *self, dictionary *dict);
void yon_group_delete_confirmation_save(GtkWidget *self, dictionary *dict);
int yon_check_password_blocked(char *password);
yon_confirmation_window *yon_delete_confirmation_new();
void yon_system_delete_confirmation_open(main_window *widgets);
void yon_delete_confirmation_open(main_window *widgets);
void yon_group_delete_confirmation_open(main_window *widgets);
yon_savasettings_window *yon_saving_settings_new();

@ -51,8 +51,15 @@
#define UPDATE_LABEL _("Update users and groups")
#define SAVING_CONFIGURATION_LABEL _("Additional saving configuration")
#define SYSTEM_USER_ADD_CONFIRMATION_LABEL(target) yon_char_unite(_("This user doesn't exist in configuration. Are you sure want to add user")," ",target," ", _("to configuration?"),NULL)
#define SYSTEM_USER_SYNC_CONFIRMATION_LABEL(target) yon_char_unite(_("This user exists in configuration. Are you sure want to update user")," ",target," ", _("data at configuration?"),NULL)
#define SYSTEM_USER_ADD_CONFIRMATION_LABEL(target) yon_char_unite(_("This user doesn't exist in configuration. Are you sure want to add user")," <b>",target,"</b> ", _("to configuration?"),NULL)
#define SYSTEM_USER_SYNC_CONFIRMATION_LABEL(target) yon_char_unite(_("This user exists in configuration. Are you sure want to update user")," <b>",target,"</b> ", _("data at configuration?"),NULL)
#define SYSTEM_GROUP_SYNC_CONFIRMATION_LABEL(target) yon_char_unite(_("This group doesn't exist in configuration. Are you sure want to add group")," <b>",target,"</b> ", _("to configuration?"),NULL)
#define SYSTEM_GROUP_ADD_CONFIRMATION_LABEL(target) yon_char_unite(_("This group exists in configuration. Are you sure want to update group")," <b>",target,"</b> ", _("data at configuration?"),NULL)
#define SYSTEM_USER_SYSTEM_REMOVE_CONFIRMATION_LABEL(target) yon_char_unite(_("This user doesn't exist in configuration and will be removed from the system. Are you sure want to remove user")," <b>",target,"</b> ", _("from the system??"),NULL)
#define SYSTEM_USER_CONFIG_REMOVE_CONFIRMATION_LABEL(target) yon_char_unite(_("This user exists in configuration. Are you sure want to remove user")," <b>",target,"</b> ", _("?"),NULL)
#define SYSTEM_GROUP_SYSTEM_REMOVE_CONFIRMATION_LABEL(target) yon_char_unite(_("This group doesn't exist in configuration and will be removed from the system. Are you sure want to remove group")," <b>",target,"</b> ", _("from the system?"),NULL)
#define SYSTEM_GROUP_CONFIG_REMOVE_CONFIRMATION_LABEL(target) yon_char_unite(_("This group exists in configuration. Are you sure want to remove group")," <b>",target,"</b>", _("?"),NULL)
//ubl-settings-usergroups-additional-settings.glade
@ -187,8 +194,10 @@
#define PASSWORD_NO_SET_LABEL _("Not specified")
#define UID_ALREADY_EXIST_LABEL _("UID already busy")
#define GID_ALREADY_EXIST_LABEL _("GID already busy")
#define UID_ALREADY_EXIST_CONFIG_LABEL _("UID already exists in configuration")
#define UID_ALREADY_EXIST_SYSTEM_LABEL _("UID already exists in system")
#define GID_ALREADY_EXIST_CONFIG_LABEL _("GID already exists in configuration")
#define GID_ALREADY_EXIST_SYSTEM_LABEL _("GID already exists in system")
//ubl-settings-usergroups-password.glade
#define PASSWORD_REPEAT_LABEL _("Repeat password:")

@ -199,8 +199,7 @@
<property name="resizable">True</property>
<property name="sizing">fixed</property>
<property name="min-width">50</property>
<property name="title" translatable="yes">Primary
group</property>
<property name="title" translatable="yes">Primary group</property>
<property name="sort-column-id">4</property>
<child>
<object class="GtkCellRendererText"/>

@ -1187,6 +1187,7 @@
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="halign">start</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
@ -1202,6 +1203,7 @@
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="halign">start</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>

@ -374,7 +374,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="sizing">fixed</property>
<property name="fixed-width">10</property>
<property name="fixed-width">50</property>
<property name="min-width">10</property>
<property name="title" translatable="yes">UID</property>
<property name="sort-column-id">1</property>

@ -53,7 +53,7 @@ msgstr ""
msgid "UID"
msgstr ""
#: source/ubl-strings.h:14 source/ubl-strings.h:102
#: source/ubl-strings.h:14 source/ubl-strings.h:107
msgid "Login"
msgstr ""
@ -175,7 +175,7 @@ msgstr ""
msgid "Inspect users and groups in system"
msgstr ""
#: source/ubl-strings.h:46 source/ubl-strings.h:56
#: source/ubl-strings.h:46 source/ubl-strings.h:61
msgid "Additional settings"
msgstr ""
@ -203,521 +203,554 @@ msgstr ""
msgid "Additional saving configuration"
msgstr ""
#: source/ubl-strings.h:54
msgid "This user doesn't exist in configuration. Are you sure want to add user"
msgstr ""
#: source/ubl-strings.h:54 source/ubl-strings.h:56
msgid "to configuration?"
msgstr ""
#: source/ubl-strings.h:55
msgid "This user exists in configuration. Are you sure want to update user"
msgstr ""
#: source/ubl-strings.h:55 source/ubl-strings.h:57
msgid "data at configuration?"
msgstr ""
#: source/ubl-strings.h:56
msgid ""
"This group doesn't exist in configuration. Are you sure want to add group"
msgstr ""
#: source/ubl-strings.h:57
msgid "This group exists in configuration. Are you sure want to update group"
msgstr ""
#: source/ubl-strings.h:62
msgid "No password required"
msgstr ""
#: source/ubl-strings.h:58
#: source/ubl-strings.h:63
msgid "Set a password"
msgstr ""
#: source/ubl-strings.h:59 source/ubl-strings.h:105
#: source/ubl-strings.h:64 source/ubl-strings.h:110
msgid "Encrypted"
msgstr ""
#: source/ubl-strings.h:60
#: source/ubl-strings.h:65
msgid "Unencrypted"
msgstr ""
#: source/ubl-strings.h:73
#: source/ubl-strings.h:78
msgid "Accept"
msgstr ""
#: source/ubl-strings.h:74
#: source/ubl-strings.h:79
msgid ""
"Are you sure want to encrypt all passwords?\n"
"This action can't be undone."
msgstr ""
#: source/ubl-strings.h:75
#: source/ubl-strings.h:80
msgid "Encrypt all unencrypted passwords at global configuration"
msgstr ""
#: source/ubl-strings.h:76
#: source/ubl-strings.h:81
msgid "DES (Algorithm for Symmetric Encryption)"
msgstr ""
#: source/ubl-strings.h:77
#: source/ubl-strings.h:82
msgid "MD5 (128-bit hashing algorithm)"
msgstr ""
#: source/ubl-strings.h:78
#: source/ubl-strings.h:83
msgid "yescrypt (Cryptographic hash function)"
msgstr ""
#: source/ubl-strings.h:79
#: source/ubl-strings.h:84
msgid "GOST-YESCRYPT (Design according to GOST R 34.11─2012)"
msgstr ""
#: source/ubl-strings.h:80
#: source/ubl-strings.h:85
msgid "scrypt (Adaptive cryptographic key generation function)"
msgstr ""
#: source/ubl-strings.h:81
#: source/ubl-strings.h:86
msgid "Blowfish (Symmetric Block Cipher Algorithm)"
msgstr ""
#: source/ubl-strings.h:82
#: source/ubl-strings.h:87
msgid "bcrypt (Adaptive hash function from the Blowfish family of algorithms)"
msgstr ""
#: source/ubl-strings.h:83
#: source/ubl-strings.h:88
msgid ""
"bcrypt-a (Adaptive hash function from the Blowfish family of algorithms)"
msgstr ""
#: source/ubl-strings.h:84
#: source/ubl-strings.h:89
msgid "SHA512 (Hash function from the SHA-2 family of algorithms)"
msgstr ""
#: source/ubl-strings.h:85
#: source/ubl-strings.h:90
msgid "SHA256 (Hash function from the SHA-2 family of algorithms)"
msgstr ""
#: source/ubl-strings.h:86
#: source/ubl-strings.h:91
msgid "Sun MD5 (Hash algorithm from Sun Microsystems)"
msgstr ""
#: source/ubl-strings.h:87
#: source/ubl-strings.h:92
msgid "MD5 Unix (Hash algorithm calls standard MD5 thousand times)"
msgstr ""
#: source/ubl-strings.h:88
#: source/ubl-strings.h:93
msgid ""
"Extended DES Crypt (Hash function from the BSDi family of DES algorithms)"
msgstr ""
#: source/ubl-strings.h:89
#: source/ubl-strings.h:94
msgid "descrypt (Hash function from the DES family of algorithms)"
msgstr ""
#: source/ubl-strings.h:90
#: source/ubl-strings.h:95
msgid "NTHash (Hash function from the NT Windows family of algorithms)"
msgstr ""
#: source/ubl-strings.h:92
#: source/ubl-strings.h:97
msgid ""
"While booting the operating system, apply the settings of all users from the "
"configuration"
msgstr ""
#: source/ubl-strings.h:93
#: source/ubl-strings.h:98
msgid ""
"While shutdown, save the settings of all users with UID>=1000 to the "
"configuration"
msgstr ""
#: source/ubl-strings.h:96
#: source/ubl-strings.h:101
msgid "Configure group"
msgstr ""
#: source/ubl-strings.h:97
#: source/ubl-strings.h:102
msgid "Add group"
msgstr ""
#: source/ubl-strings.h:98
#: source/ubl-strings.h:103
msgid "Group id:"
msgstr ""
#: source/ubl-strings.h:99
#: source/ubl-strings.h:104
msgid "Group name:"
msgstr ""
#: source/ubl-strings.h:100
#: source/ubl-strings.h:105
msgid "Group users:"
msgstr ""
#: source/ubl-strings.h:101
#: source/ubl-strings.h:106
msgid "Automatically"
msgstr ""
#: source/ubl-strings.h:103
#: source/ubl-strings.h:108
msgid "Create group with ununique GID"
msgstr ""
#: source/ubl-strings.h:104
#: source/ubl-strings.h:109
msgid "Create system group"
msgstr ""
#: source/ubl-strings.h:106
#: source/ubl-strings.h:111
msgid "Additional configuration"
msgstr ""
#: source/ubl-strings.h:107
#: source/ubl-strings.h:112
msgid "Group configuration synchronization"
msgstr ""
#: source/ubl-strings.h:108
#: source/ubl-strings.h:113
msgid "When shutting down the system, save the group into the configuration"
msgstr ""
#: source/ubl-strings.h:109
#: source/ubl-strings.h:114
msgid "Group administrators:"
msgstr ""
#: source/ubl-strings.h:110
#: source/ubl-strings.h:115
msgid "Group name must not start with digit"
msgstr ""
#: source/ubl-strings.h:113
#: source/ubl-strings.h:118
msgid "Default groups"
msgstr ""
#: source/ubl-strings.h:114
#: source/ubl-strings.h:119
msgid "Main group"
msgstr ""
#: source/ubl-strings.h:115
#: source/ubl-strings.h:120
msgid "Additional groups"
msgstr ""
#: source/ubl-strings.h:116
#: source/ubl-strings.h:121
msgid "Choose groups"
msgstr ""
#: source/ubl-strings.h:117
#: source/ubl-strings.h:122
msgid "Choose users"
msgstr ""
#: source/ubl-strings.h:120
#: source/ubl-strings.h:125
msgid "System users and groups"
msgstr ""
#: source/ubl-strings.h:121
#: source/ubl-strings.h:126
msgid "Locked"
msgstr ""
#: source/ubl-strings.h:122
#: source/ubl-strings.h:127
msgid "Username"
msgstr ""
#: source/ubl-strings.h:123
#: source/ubl-strings.h:128
msgid ""
"Primary\n"
"group"
msgstr ""
#: source/ubl-strings.h:124
#: source/ubl-strings.h:129
msgid ""
"Home\n"
"directory"
msgstr ""
#: source/ubl-strings.h:125 source/ubl-strings.h:131
#: source/ubl-strings.h:130 source/ubl-strings.h:136
msgid "Group"
msgstr ""
#: source/ubl-strings.h:126
#: source/ubl-strings.h:131
msgid "Update the system users and groups list"
msgstr ""
#: source/ubl-strings.h:127
#: source/ubl-strings.h:132
msgid "Toggle system groups and users"
msgstr ""
#: source/ubl-strings.h:129
#: source/ubl-strings.h:134
msgid "Password mismatch"
msgstr ""
#: source/ubl-strings.h:130
#: source/ubl-strings.h:135
msgid "Password must be at least"
msgstr ""
#: source/ubl-strings.h:130
#: source/ubl-strings.h:135
msgid "characters"
msgstr ""
#: source/ubl-strings.h:132
#: source/ubl-strings.h:137
msgid ""
"Days until\n"
"warning"
msgstr ""
#: source/ubl-strings.h:133
#: source/ubl-strings.h:138
msgid ""
"Days\n"
"without activity"
msgstr ""
#: source/ubl-strings.h:134
#: source/ubl-strings.h:139
msgid ""
"Shell\n"
"path"
msgstr ""
#: source/ubl-strings.h:135
#: source/ubl-strings.h:140
msgid ""
"Password has\n"
"been changed"
msgstr ""
#: source/ubl-strings.h:136
#: source/ubl-strings.h:141
msgid ""
"Expiration\n"
"date"
msgstr ""
#: source/ubl-strings.h:137
#: source/ubl-strings.h:142
msgid ""
"Password change\n"
"interval (min)"
msgstr ""
#: source/ubl-strings.h:138
#: source/ubl-strings.h:143
msgid ""
"Password change\n"
"interval (max)"
msgstr ""
#: source/ubl-strings.h:141
#: source/ubl-strings.h:146
msgid "Add user"
msgstr ""
#: source/ubl-strings.h:142
#: source/ubl-strings.h:147
msgid "Configure user"
msgstr ""
#: source/ubl-strings.h:143
#: source/ubl-strings.h:148
msgid "Set"
msgstr ""
#: source/ubl-strings.h:144
#: source/ubl-strings.h:149
msgid "Empty important field"
msgstr ""
#: source/ubl-strings.h:145
#: source/ubl-strings.h:150
msgid "Login must not start with digit"
msgstr ""
#: source/ubl-strings.h:146
#: source/ubl-strings.h:151
msgid "Loading has failed"
msgstr ""
#: source/ubl-strings.h:147
#: source/ubl-strings.h:152
msgid "Login name"
msgstr ""
#: source/ubl-strings.h:148
#: source/ubl-strings.h:153
msgid "Additional groups:"
msgstr ""
#: source/ubl-strings.h:149
#: source/ubl-strings.h:154
msgid "Password configuration"
msgstr ""
#: source/ubl-strings.h:150
#: source/ubl-strings.h:155
msgid "Password has been changed:"
msgstr ""
#: source/ubl-strings.h:151
#: source/ubl-strings.h:156
msgid "expiration date:"
msgstr ""
#: source/ubl-strings.h:152
#: source/ubl-strings.h:157
msgid "Password change interval: minimum"
msgstr ""
#: source/ubl-strings.h:153
#: source/ubl-strings.h:158
msgid "days, maximum"
msgstr ""
#: source/ubl-strings.h:154
#: source/ubl-strings.h:159
msgid "days"
msgstr ""
#: source/ubl-strings.h:155
#: source/ubl-strings.h:160
msgid "Days until warning:"
msgstr ""
#: source/ubl-strings.h:156
#: source/ubl-strings.h:161
msgid "Days without activity:"
msgstr ""
#: source/ubl-strings.h:157
#: source/ubl-strings.h:162
msgid "Force change at next login"
msgstr ""
#: source/ubl-strings.h:158
#: source/ubl-strings.h:163
msgid "User shell:"
msgstr ""
#: source/ubl-strings.h:159
#: source/ubl-strings.h:164
msgid "Home directory:"
msgstr ""
#: source/ubl-strings.h:160
#: source/ubl-strings.h:165
msgid "Don't set"
msgstr ""
#: source/ubl-strings.h:161
#: source/ubl-strings.h:166
msgid "Create system user"
msgstr ""
#: source/ubl-strings.h:162
#: source/ubl-strings.h:167
msgid "Create user with ununique (repeating) UID"
msgstr ""
#: source/ubl-strings.h:163
#: source/ubl-strings.h:168
msgid "Do not check login for compliance with character rules"
msgstr ""
#: source/ubl-strings.h:164
#: source/ubl-strings.h:169
msgid "Temporary deactivation"
msgstr ""
#: source/ubl-strings.h:165
#: source/ubl-strings.h:170
msgid "Save"
msgstr ""
#: source/ubl-strings.h:166
#: source/ubl-strings.h:171
msgid "login_name"
msgstr ""
#: source/ubl-strings.h:167
#: source/ubl-strings.h:172
msgid "group_name"
msgstr ""
#: source/ubl-strings.h:168
#: source/ubl-strings.h:173
msgid "User name"
msgstr ""
#: source/ubl-strings.h:169
#: source/ubl-strings.h:174
msgid "Sync user"
msgstr ""
#: source/ubl-strings.h:170
#: source/ubl-strings.h:175
msgid "Sync user with password"
msgstr ""
#: source/ubl-strings.h:171
#: source/ubl-strings.h:176
msgid "Encrypt all passwords"
msgstr ""
#: source/ubl-strings.h:173
#: source/ubl-strings.h:178
msgid "User configuration"
msgstr ""
#: source/ubl-strings.h:174
#: source/ubl-strings.h:179
msgid "User configuration synchronization"
msgstr ""
#: source/ubl-strings.h:175
#: source/ubl-strings.h:180
msgid "During system startup, load the user from the configuration"
msgstr ""
#: source/ubl-strings.h:176
#: source/ubl-strings.h:181
msgid "When shutting down the system, save the user into the configuration"
msgstr ""
#: source/ubl-strings.h:177
#: source/ubl-strings.h:182
msgid "User password configuration syncronization"
msgstr ""
#: source/ubl-strings.h:178
#: source/ubl-strings.h:183
msgid ""
"During system startup, load the user's parameters from the configuration"
msgstr ""
#: source/ubl-strings.h:179
#: source/ubl-strings.h:184
msgid ""
"When shutting down the system, save the user's parameters into the "
"configuration"
msgstr ""
#: source/ubl-strings.h:181
#: source/ubl-strings.h:186
msgid "Basic"
msgstr ""
#: source/ubl-strings.h:182
#: source/ubl-strings.h:187
msgid "Additional"
msgstr ""
#: source/ubl-strings.h:183
#: source/ubl-strings.h:188
msgid "Syncronization"
msgstr ""
#: source/ubl-strings.h:185
#: source/ubl-strings.h:190
msgid "Not specified"
msgstr ""
#: source/ubl-strings.h:187
msgid "UID already busy"
#: source/ubl-strings.h:192
msgid "UID already exists in configuration"
msgstr ""
#: source/ubl-strings.h:188
msgid "GID already busy"
#: source/ubl-strings.h:193
msgid "UID already exists in system"
msgstr ""
#: source/ubl-strings.h:191
#: source/ubl-strings.h:194
msgid "GID already exists in configuration"
msgstr ""
#: source/ubl-strings.h:195
msgid "GID already exists in system"
msgstr ""
#: source/ubl-strings.h:198
msgid "Repeat password:"
msgstr ""
#: source/ubl-strings.h:192
#: source/ubl-strings.h:199
msgid "Password hash:"
msgstr ""
#: source/ubl-strings.h:193
#: source/ubl-strings.h:200
msgid "Do not encrypt password"
msgstr ""
#: source/ubl-strings.h:196
#: source/ubl-strings.h:203
msgid "Additional configuration of service parameter saving"
msgstr ""
#: source/ubl-strings.h:197
#: source/ubl-strings.h:204
msgid ""
"At every system shutdown save changes of (root)/var/lib/samba\n"
"into (hd)/ublinux-data/rootcopy"
msgstr ""
#: source/ubl-strings.h:198
#: source/ubl-strings.h:205
msgid "For system save mode \"Sandbox\""
msgstr ""
#: source/ubl-strings.h:201
#: source/ubl-strings.h:208
msgid "Group deletion"
msgstr ""
#: source/ubl-strings.h:202
#: source/ubl-strings.h:209
msgid "Confirm group(-s) deletion:"
msgstr ""
#: source/ubl-strings.h:204
#: source/ubl-strings.h:211
msgid "User deletion"
msgstr ""
#: source/ubl-strings.h:205
#: source/ubl-strings.h:212
msgid "Confirm user(-s) deletion:"
msgstr ""
#: source/ubl-strings.h:206
#: source/ubl-strings.h:213
msgid "Chosen"
msgstr ""
#: source/ubl-strings.h:207
#: source/ubl-strings.h:214
msgid "User"
msgstr ""
#: source/ubl-strings.h:208
#: source/ubl-strings.h:215
msgid "Home directory"
msgstr ""
#: source/ubl-strings.h:209
#: source/ubl-strings.h:216
msgid "Delete home directory"
msgstr ""
#: source/ubl-strings.h:211
#: source/ubl-strings.h:218
msgid "Configuration users"
msgstr ""
#: source/ubl-strings.h:212
#: source/ubl-strings.h:219
msgid "Configuration groups"
msgstr ""
#: source/ubl-strings.h:213
#: source/ubl-strings.h:220
msgid "System users"
msgstr ""
#: source/ubl-strings.h:214
#: source/ubl-strings.h:221
msgid "System groups"
msgstr ""

@ -53,7 +53,7 @@ msgstr "Алгоритм хэширования пароля:"
msgid "UID"
msgstr "UID"
#: source/ubl-strings.h:14 source/ubl-strings.h:102
#: source/ubl-strings.h:14 source/ubl-strings.h:107
msgid "Login"
msgstr "Логин"
@ -189,7 +189,7 @@ msgstr "Обзор файлов"
msgid "Inspect users and groups in system"
msgstr "Просмотр пользователей и групп в системе"
#: source/ubl-strings.h:46 source/ubl-strings.h:56
#: source/ubl-strings.h:46 source/ubl-strings.h:61
msgid "Additional settings"
msgstr "Дополнительные настройки"
@ -217,27 +217,58 @@ msgstr "Обновить список пользователей и групп"
msgid "Additional saving configuration"
msgstr "Дополнительные настройки сохранения"
#: source/ubl-strings.h:54
msgid "This user doesn't exist in configuration. Are you sure want to add user"
msgstr ""
"Пользователь в конфигурации отсутствует, но его можно добавить. Вы "
"действительно хотите добавить пользователя"
#: source/ubl-strings.h:54 source/ubl-strings.h:56
msgid "to configuration?"
msgstr "в конфигурацию?"
#: source/ubl-strings.h:55
msgid "This user exists in configuration. Are you sure want to update user"
msgstr ""
"Пользователь уже присутствует в конфигурации. Хотите обновить данные "
"пользователя"
#: source/ubl-strings.h:55 source/ubl-strings.h:57
msgid "data at configuration?"
msgstr "в конфигурации?"
#: source/ubl-strings.h:56
msgid ""
"This group doesn't exist in configuration. Are you sure want to add group"
msgstr ""
"Группа в конфигурации отсутствует, но её можно добавить. Вы действительно "
"хотите добавить группу"
#: source/ubl-strings.h:57
msgid "This group exists in configuration. Are you sure want to update group"
msgstr "Группа уже присутствует в конфигурации. Хотите обновить данные группы"
#: source/ubl-strings.h:62
msgid "No password required"
msgstr "Пароль не требуется"
#: source/ubl-strings.h:58
#: source/ubl-strings.h:63
msgid "Set a password"
msgstr "Задать пароль"
#: source/ubl-strings.h:59 source/ubl-strings.h:105
#: source/ubl-strings.h:64 source/ubl-strings.h:110
msgid "Encrypted"
msgstr "Зашифрован"
#: source/ubl-strings.h:60
#: source/ubl-strings.h:65
msgid "Unencrypted"
msgstr "Незашифрован"
msgstr "Не зашифрован"
#: source/ubl-strings.h:73
#: source/ubl-strings.h:78
msgid "Accept"
msgstr "Принять"
#: source/ubl-strings.h:74
#: source/ubl-strings.h:79
msgid ""
"Are you sure want to encrypt all passwords?\n"
"This action can't be undone."
@ -245,73 +276,73 @@ msgstr ""
"Вы уверены что хотите зашифровать все пароли?\n"
"Это действие нельзя отменить."
#: source/ubl-strings.h:75
#: source/ubl-strings.h:80
msgid "Encrypt all unencrypted passwords at global configuration"
msgstr "Зашифровать все незашифрованные пароли в глобальной конфигурации"
#: source/ubl-strings.h:76
#: source/ubl-strings.h:81
msgid "DES (Algorithm for Symmetric Encryption)"
msgstr "DES (Алгоритм для симметричного шифрования)"
#: source/ubl-strings.h:77
#: source/ubl-strings.h:82
msgid "MD5 (128-bit hashing algorithm)"
msgstr "MD5 (128-битный алгоритм хеширования)"
#: source/ubl-strings.h:78
#: source/ubl-strings.h:83
msgid "yescrypt (Cryptographic hash function)"
msgstr "yescrypt (Криптографическая хэш-функция)"
#: source/ubl-strings.h:79
#: source/ubl-strings.h:84
msgid "GOST-YESCRYPT (Design according to GOST R 34.11─2012)"
msgstr "GOST-YESCRYPT (Конструкция согласно ГОСТ Р 34.11─2012)"
#: source/ubl-strings.h:80
#: source/ubl-strings.h:85
msgid "scrypt (Adaptive cryptographic key generation function)"
msgstr "scrypt (Адаптивная криптографическая функция формирования ключа)"
#: source/ubl-strings.h:81
#: source/ubl-strings.h:86
msgid "Blowfish (Symmetric Block Cipher Algorithm)"
msgstr "Blowfish (Алгоритм блочного симметричного шифрования)"
#: source/ubl-strings.h:82
#: source/ubl-strings.h:87
msgid "bcrypt (Adaptive hash function from the Blowfish family of algorithms)"
msgstr "bcrypt (Адаптивная хеш-функция из семейства алгоритмов Blowfish)"
#: source/ubl-strings.h:83
#: source/ubl-strings.h:88
msgid ""
"bcrypt-a (Adaptive hash function from the Blowfish family of algorithms)"
msgstr "bcrypt-a (Адаптивная хеш-функция из семейства алгоритмов Blowfish)"
#: source/ubl-strings.h:84
#: source/ubl-strings.h:89
msgid "SHA512 (Hash function from the SHA-2 family of algorithms)"
msgstr "SHA512 (Хеш-функция из семейства алгоритмов SHA-2)"
#: source/ubl-strings.h:85
#: source/ubl-strings.h:90
msgid "SHA256 (Hash function from the SHA-2 family of algorithms)"
msgstr "SHA256 (Хеш-функция из семейства алгоритмов SHA-2)"
#: source/ubl-strings.h:86
#: source/ubl-strings.h:91
msgid "Sun MD5 (Hash algorithm from Sun Microsystems)"
msgstr "Sun MD5 (Хеш-алгоритм от Sun Microsystems)"
#: source/ubl-strings.h:87
#: source/ubl-strings.h:92
msgid "MD5 Unix (Hash algorithm calls standard MD5 thousand times)"
msgstr "MD5 Unix (Хэш-алгоритм вызывает тысячу раз стандартный MD5)"
#: source/ubl-strings.h:88
#: source/ubl-strings.h:93
msgid ""
"Extended DES Crypt (Hash function from the BSDi family of DES algorithms)"
msgstr "Extended DES Crypt (Хеш-функция из семейства алгоритмов DES от BSDi)"
#: source/ubl-strings.h:89
#: source/ubl-strings.h:94
msgid "descrypt (Hash function from the DES family of algorithms)"
msgstr "descrypt (Хеш-функция из семейства алгоритмов DES)"
#: source/ubl-strings.h:90
#: source/ubl-strings.h:95
msgid "NTHash (Hash function from the NT Windows family of algorithms)"
msgstr "NTHash (Хеш-функция из семейства алгоритмов NT Windows)"
#: source/ubl-strings.h:92
#: source/ubl-strings.h:97
msgid ""
"While booting the operating system, apply the settings of all users from the "
"configuration"
@ -319,7 +350,7 @@ msgstr ""
"При запуске операционной системы применять настройки всех пользователей из "
"конфигурации"
#: source/ubl-strings.h:93
#: source/ubl-strings.h:98
msgid ""
"While shutdown, save the settings of all users with UID>=1000 to the "
"configuration"
@ -327,91 +358,91 @@ msgstr ""
"При завершении работы сохранить настройки пользователей с UID>=1000 в "
"конфигурацию"
#: source/ubl-strings.h:96
#: source/ubl-strings.h:101
msgid "Configure group"
msgstr "Редактировать группу"
#: source/ubl-strings.h:97
#: source/ubl-strings.h:102
msgid "Add group"
msgstr "Добавить группу"
#: source/ubl-strings.h:98
#: source/ubl-strings.h:103
msgid "Group id:"
msgstr "Идентификатор группы (GID):"
#: source/ubl-strings.h:99
#: source/ubl-strings.h:104
msgid "Group name:"
msgstr "Имя группы:"
#: source/ubl-strings.h:100
#: source/ubl-strings.h:105
msgid "Group users:"
msgstr "Пользователи группы:"
#: source/ubl-strings.h:101
#: source/ubl-strings.h:106
msgid "Automatically"
msgstr "Автоматически"
#: source/ubl-strings.h:103
#: source/ubl-strings.h:108
msgid "Create group with ununique GID"
msgstr "Создать группу с повторяющимися (не уникальными) GID"
#: source/ubl-strings.h:104
#: source/ubl-strings.h:109
msgid "Create system group"
msgstr "Создать системную группу"
#: source/ubl-strings.h:106
#: source/ubl-strings.h:111
msgid "Additional configuration"
msgstr "Дополнительные настройки"
#: source/ubl-strings.h:107
#: source/ubl-strings.h:112
msgid "Group configuration synchronization"
msgstr "Синхронизация настроек группы"
#: source/ubl-strings.h:108
#: source/ubl-strings.h:113
msgid "When shutting down the system, save the group into the configuration"
msgstr "При завершении работы системы сохранить группу в конфигурацию"
#: source/ubl-strings.h:109
#: source/ubl-strings.h:114
msgid "Group administrators:"
msgstr "Администраторы группы:"
#: source/ubl-strings.h:110
#: source/ubl-strings.h:115
msgid "Group name must not start with digit"
msgstr "Имя группы не должно начинаться с цифры"
#: source/ubl-strings.h:113
#: source/ubl-strings.h:118
msgid "Default groups"
msgstr "Группы пользователей по умолчанию"
#: source/ubl-strings.h:114
#: source/ubl-strings.h:119
msgid "Main group"
msgstr "Основная группа"
#: source/ubl-strings.h:115
#: source/ubl-strings.h:120
msgid "Additional groups"
msgstr "Дополнительные группы"
#: source/ubl-strings.h:116
#: source/ubl-strings.h:121
msgid "Choose groups"
msgstr "Выбрать группы"
#: source/ubl-strings.h:117
#: source/ubl-strings.h:122
msgid "Choose users"
msgstr "Выбрать пользователей"
#: source/ubl-strings.h:120
#: source/ubl-strings.h:125
msgid "System users and groups"
msgstr "Пользователи и группы в системе"
#: source/ubl-strings.h:121
#: source/ubl-strings.h:126
msgid "Locked"
msgstr "Отключен"
#: source/ubl-strings.h:122
#: source/ubl-strings.h:127
msgid "Username"
msgstr "Имя пользователя"
#: source/ubl-strings.h:123
#: source/ubl-strings.h:128
msgid ""
"Primary\n"
"group"
@ -419,7 +450,7 @@ msgstr ""
"Основная\n"
"группа"
#: source/ubl-strings.h:124
#: source/ubl-strings.h:129
msgid ""
"Home\n"
"directory"
@ -427,31 +458,31 @@ msgstr ""
"Домашний\n"
"каталог"
#: source/ubl-strings.h:125 source/ubl-strings.h:131
#: source/ubl-strings.h:130 source/ubl-strings.h:136
msgid "Group"
msgstr "Группа"
#: source/ubl-strings.h:126
#: source/ubl-strings.h:131
msgid "Update the system users and groups list"
msgstr "Обновить список пользователей и групп системы"
#: source/ubl-strings.h:127
#: source/ubl-strings.h:132
msgid "Toggle system groups and users"
msgstr "Переключить видимость системных пользователей и групп"
#: source/ubl-strings.h:129
#: source/ubl-strings.h:134
msgid "Password mismatch"
msgstr "Несовпадение паролей"
#: source/ubl-strings.h:130
#: source/ubl-strings.h:135
msgid "Password must be at least"
msgstr "Пароль должен состоять из как минимум"
#: source/ubl-strings.h:130
#: source/ubl-strings.h:135
msgid "characters"
msgstr "символов"
#: source/ubl-strings.h:132
#: source/ubl-strings.h:137
msgid ""
"Days until\n"
"warning"
@ -459,7 +490,7 @@ msgstr ""
"Дней до\n"
"предупреждения"
#: source/ubl-strings.h:133
#: source/ubl-strings.h:138
msgid ""
"Days\n"
"without activity"
@ -467,7 +498,7 @@ msgstr ""
"Дней без\n"
"активности"
#: source/ubl-strings.h:134
#: source/ubl-strings.h:139
msgid ""
"Shell\n"
"path"
@ -475,7 +506,7 @@ msgstr ""
"Путь до\n"
"оболочки"
#: source/ubl-strings.h:135
#: source/ubl-strings.h:140
msgid ""
"Password has\n"
"been changed"
@ -483,7 +514,7 @@ msgstr ""
"Пароль\n"
"изменён"
#: source/ubl-strings.h:136
#: source/ubl-strings.h:141
msgid ""
"Expiration\n"
"date"
@ -491,7 +522,7 @@ msgstr ""
"Дата\n"
"устаревания"
#: source/ubl-strings.h:137
#: source/ubl-strings.h:142
msgid ""
"Password change\n"
"interval (min)"
@ -499,7 +530,7 @@ msgstr ""
"Интервал смены\n"
"пароля (мин.)"
#: source/ubl-strings.h:138
#: source/ubl-strings.h:143
msgid ""
"Password change\n"
"interval (max)"
@ -507,207 +538,215 @@ msgstr ""
"Интервал смены\n"
"пароля (макс.)"
#: source/ubl-strings.h:141
#: source/ubl-strings.h:146
msgid "Add user"
msgstr "Добавить пользователя"
#: source/ubl-strings.h:142
#: source/ubl-strings.h:147
msgid "Configure user"
msgstr "Редактировать пользователя"
#: source/ubl-strings.h:143
#: source/ubl-strings.h:148
msgid "Set"
msgstr "Задать"
#: source/ubl-strings.h:144
#: source/ubl-strings.h:149
msgid "Empty important field"
msgstr "Пустое важное поле"
#: source/ubl-strings.h:145
#: source/ubl-strings.h:150
msgid "Login must not start with digit"
msgstr "Логин не должен начинаться с цифры"
#: source/ubl-strings.h:146
#: source/ubl-strings.h:151
msgid "Loading has failed"
msgstr "Ошибка загрузки"
#: source/ubl-strings.h:147
#: source/ubl-strings.h:152
msgid "Login name"
msgstr "Имя логина"
#: source/ubl-strings.h:148
#: source/ubl-strings.h:153
msgid "Additional groups:"
msgstr "Дополнительные группы:"
#: source/ubl-strings.h:149
#: source/ubl-strings.h:154
msgid "Password configuration"
msgstr "Конфигурация пароля"
#: source/ubl-strings.h:150
#: source/ubl-strings.h:155
msgid "Password has been changed:"
msgstr "Пароль изменён:"
#: source/ubl-strings.h:151
#: source/ubl-strings.h:156
msgid "expiration date:"
msgstr "Дата устаревания:"
#: source/ubl-strings.h:152
#: source/ubl-strings.h:157
msgid "Password change interval: minimum"
msgstr "Интервал смены пароля: минимум"
#: source/ubl-strings.h:153
#: source/ubl-strings.h:158
msgid "days, maximum"
msgstr "дней, максимум"
#: source/ubl-strings.h:154
#: source/ubl-strings.h:159
msgid "days"
msgstr "дней"
#: source/ubl-strings.h:155
#: source/ubl-strings.h:160
msgid "Days until warning:"
msgstr "Дней до предупреждения:"
#: source/ubl-strings.h:156
#: source/ubl-strings.h:161
msgid "Days without activity:"
msgstr "Дней без активности:"
#: source/ubl-strings.h:157
#: source/ubl-strings.h:162
msgid "Force change at next login"
msgstr "Принудительно сменить при следующем входе в систему"
#: source/ubl-strings.h:158
#: source/ubl-strings.h:163
msgid "User shell:"
msgstr "Оболочка пользователя:"
#: source/ubl-strings.h:159
#: source/ubl-strings.h:164
msgid "Home directory:"
msgstr "Домашний каталог:"
#: source/ubl-strings.h:160
#: source/ubl-strings.h:165
msgid "Don't set"
msgstr "Не создавать"
#: source/ubl-strings.h:161
#: source/ubl-strings.h:166
msgid "Create system user"
msgstr "Создать системного пользователя"
#: source/ubl-strings.h:162
#: source/ubl-strings.h:167
msgid "Create user with ununique (repeating) UID"
msgstr "Создать пользователя с повторяющимися (не уникальными) UID"
#: source/ubl-strings.h:163
#: source/ubl-strings.h:168
msgid "Do not check login for compliance with character rules"
msgstr "Не проверять логин на несоответствие правилам использования символов"
#: source/ubl-strings.h:164
#: source/ubl-strings.h:169
msgid "Temporary deactivation"
msgstr "Временное отключение учётной записи"
#: source/ubl-strings.h:165
#: source/ubl-strings.h:170
msgid "Save"
msgstr "Сохранить"
#: source/ubl-strings.h:166
#: source/ubl-strings.h:171
msgid "login_name"
msgstr "Имя_логина"
#: source/ubl-strings.h:167
#: source/ubl-strings.h:172
msgid "group_name"
msgstr "Имя_группы"
#: source/ubl-strings.h:168
#: source/ubl-strings.h:173
msgid "User name"
msgstr "Имя пользователя"
#: source/ubl-strings.h:169
#: source/ubl-strings.h:174
msgid "Sync user"
msgstr "Синхронизировать пользователя"
#: source/ubl-strings.h:170
#: source/ubl-strings.h:175
msgid "Sync user with password"
msgstr "Синхронизировать пользователя с паролем"
#: source/ubl-strings.h:171
#: source/ubl-strings.h:176
msgid "Encrypt all passwords"
msgstr "Зашифровать все пароли"
#: source/ubl-strings.h:173
#: source/ubl-strings.h:178
msgid "User configuration"
msgstr "Настройка пользователя"
#: source/ubl-strings.h:174
#: source/ubl-strings.h:179
msgid "User configuration synchronization"
msgstr "Синхронизация настроек пользователя"
#: source/ubl-strings.h:175
#: source/ubl-strings.h:180
msgid "During system startup, load the user from the configuration"
msgstr ""
"При запуске операционной системы применять настройки пользователя из "
"конфигурации"
#: source/ubl-strings.h:176
#: source/ubl-strings.h:181
msgid "When shutting down the system, save the user into the configuration"
msgstr ""
"При завершении работы операционной системы сохранить настройки пользователя "
"в конфигурацию"
#: source/ubl-strings.h:177
#: source/ubl-strings.h:182
msgid "User password configuration syncronization"
msgstr "Синхронизация настроек пароля пользователя"
#: source/ubl-strings.h:178
#: source/ubl-strings.h:183
msgid ""
"During system startup, load the user's parameters from the configuration"
msgstr "При загрузке системы загрузить параметры пользователя из конфигурации"
#: source/ubl-strings.h:179
#: source/ubl-strings.h:184
msgid ""
"When shutting down the system, save the user's parameters into the "
"configuration"
msgstr ""
"При завершении работы системы сохранить параметры пользователя в конфигурацию"
#: source/ubl-strings.h:181
#: source/ubl-strings.h:186
msgid "Basic"
msgstr "Основные"
#: source/ubl-strings.h:182
#: source/ubl-strings.h:187
msgid "Additional"
msgstr "Дополнительные"
#: source/ubl-strings.h:183
#: source/ubl-strings.h:188
msgid "Syncronization"
msgstr "Синхронизация"
#: source/ubl-strings.h:185
#: source/ubl-strings.h:190
msgid "Not specified"
msgstr "Не задан"
#: source/ubl-strings.h:187
msgid "UID already busy"
msgstr "UID уже существует"
#: source/ubl-strings.h:192
msgid "UID already exists in configuration"
msgstr "UID уже существует в конфигурации"
#: source/ubl-strings.h:188
msgid "GID already busy"
msgstr "GID уже существует"
#: source/ubl-strings.h:193
msgid "UID already exists in system"
msgstr "UID уже существует в системе"
#: source/ubl-strings.h:194
msgid "GID already exists in configuration"
msgstr "GID уже существует в конфигурации"
#: source/ubl-strings.h:195
msgid "GID already exists in system"
msgstr "GID уже существует в системе"
#: source/ubl-strings.h:191
#: source/ubl-strings.h:198
msgid "Repeat password:"
msgstr "Подтверждение пароля:"
#: source/ubl-strings.h:192
#: source/ubl-strings.h:199
msgid "Password hash:"
msgstr "Хэш пароля:"
#: source/ubl-strings.h:193
#: source/ubl-strings.h:200
msgid "Do not encrypt password"
msgstr "Не шифровать пароль"
#: source/ubl-strings.h:196
#: source/ubl-strings.h:203
msgid "Additional configuration of service parameter saving"
msgstr "Дополнительные настройки сохранения параметров сервисов"
#: source/ubl-strings.h:197
#: source/ubl-strings.h:204
msgid ""
"At every system shutdown save changes of (root)/var/lib/samba\n"
"into (hd)/ublinux-data/rootcopy"
@ -715,54 +754,54 @@ msgstr ""
"При каждом завершении работы ОС сохранять изменения (root)/var/lib/samba\n"
"в (hd)/ublinux-data/rootcopy/"
#: source/ubl-strings.h:198
#: source/ubl-strings.h:205
msgid "For system save mode \"Sandbox\""
msgstr "Для режима сохранения системы \"Песочница\""
#: source/ubl-strings.h:201
#: source/ubl-strings.h:208
msgid "Group deletion"
msgstr "Удаление групп(-ы)"
#: source/ubl-strings.h:202
#: source/ubl-strings.h:209
msgid "Confirm group(-s) deletion:"
msgstr "Подтвердите удаление групп(-ы):"
#: source/ubl-strings.h:204
#: source/ubl-strings.h:211
msgid "User deletion"
msgstr "Удаление пользователя(-ей)"
#: source/ubl-strings.h:205
#: source/ubl-strings.h:212
msgid "Confirm user(-s) deletion:"
msgstr "Подтвердите удаление пользователя (-ей):"
#: source/ubl-strings.h:206
#: source/ubl-strings.h:213
msgid "Chosen"
msgstr "Выбран"
#: source/ubl-strings.h:207
#: source/ubl-strings.h:214
msgid "User"
msgstr "Пользователь"
#: source/ubl-strings.h:208
#: source/ubl-strings.h:215
msgid "Home directory"
msgstr "Домашний каталог"
#: source/ubl-strings.h:209
#: source/ubl-strings.h:216
msgid "Delete home directory"
msgstr "Удалить домашний каталог"
#: source/ubl-strings.h:211
#: source/ubl-strings.h:218
msgid "Configuration users"
msgstr "Пользователи конфигурации"
#: source/ubl-strings.h:212
#: source/ubl-strings.h:219
msgid "Configuration groups"
msgstr "Группы конфигурации"
#: source/ubl-strings.h:213
#: source/ubl-strings.h:220
msgid "System users"
msgstr "Пользователи системы"
#: source/ubl-strings.h:214
#: source/ubl-strings.h:221
msgid "System groups"
msgstr "Группы системы"

Loading…
Cancel
Save