You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
16 KiB
338 lines
16 KiB
#include "ubl-settings-usergroups.h"
|
|
|
|
|
|
|
|
|
|
ubl_settings_usergroups_group_creation_window *yon_ubl_settings_usergroups_group_creation_new(){
|
|
ubl_settings_usergroups_group_creation_window *window = malloc(sizeof(ubl_settings_usergroups_group_creation_window));
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_group_creation);
|
|
window->CreateGroupWindow=yon_gtk_builder_get_widget(builder,"CreateGroupWindow");
|
|
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
|
|
window->userUIDAutoCheck=yon_gtk_builder_get_widget(builder,"GIDAutoCheck");
|
|
window->userUIDEntry=yon_gtk_builder_get_widget(builder,"userUIDEntry");
|
|
window->userLoginEntry=yon_gtk_builder_get_widget(builder,"userLoginEntry");
|
|
window->userGroupsEntry=yon_gtk_builder_get_widget(builder,"userGroupsEntry");
|
|
window->UserAdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"AdditionalGroupsButton");
|
|
window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton");
|
|
window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton");
|
|
window->AdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"AdditionalGroupsButton");
|
|
window->UnuniqueGIDCheck=yon_gtk_builder_get_widget(builder,"UnuniqueGIDCheck");
|
|
window->SystemGroupCheck=yon_gtk_builder_get_widget(builder,"SystemGroupCheck");
|
|
window->PasswordCombo=yon_gtk_builder_get_widget(builder,"PasswordCombo");
|
|
window->PasswordEntry=yon_gtk_builder_get_widget(builder,"PasswordEntry");
|
|
window->ChangePasswordButton=yon_gtk_builder_get_widget(builder,"ChangePasswordButton");
|
|
window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel");
|
|
window->AdminGroupsEntry=yon_gtk_builder_get_widget(builder,"AdminGroupsEntry");
|
|
window->AdminGroupsButton=yon_gtk_builder_get_widget(builder,"AdminGroupsButton");
|
|
window->GroupaddShutdownCheck=yon_gtk_builder_get_widget(builder,"GroupaddShutdownCheck");
|
|
window->groupExtraOptionsEntry=yon_gtk_builder_get_widget(builder,"groupExtraOptionsEntry");
|
|
window->MainNotebook=yon_gtk_builder_get_widget(builder,"MainNotebook");
|
|
window->last_gid=NULL;
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window->CreateGroupWindow),GROUPS_TITLE_LABEL);
|
|
|
|
yon_gtk_entry_block_symbols(GTK_ENTRY(window->userLoginEntry),":\n");
|
|
on_GID_update(NULL,window);
|
|
dictionary *entry_dict=NULL;
|
|
yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"combo",window->PasswordCombo);
|
|
yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"entry",window->PasswordEntry);
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->CreateGroupWindow),"GroupAddWindow");
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"clicked",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry);
|
|
g_signal_connect(G_OBJECT(window->ChangePasswordButton),"clicked",G_CALLBACK(on_password_change),entry_dict);
|
|
g_signal_connect(G_OBJECT(window->PasswordCombo),"changed",G_CALLBACK(on_password_combo_changed),window->ChangePasswordButton);
|
|
g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
|
|
g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->userGroupsEntry);
|
|
g_signal_connect(G_OBJECT(window->AdminGroupsButton),"clicked",G_CALLBACK(on_user_choose),window->AdminGroupsEntry);
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(on_GID_update),window);
|
|
g_signal_connect(G_OBJECT(window->SystemGroupCheck),"toggled",G_CALLBACK(on_GID_update),window);
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button),window->SystemGroupCheck);
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->SystemGroupCheck);
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_toggle_button_set_inactive_from_toggle_button_inversed),window->UnuniqueGIDCheck);
|
|
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->UnuniqueGIDCheck);
|
|
g_signal_connect(G_OBJECT(window->UnuniqueGIDCheck),"toggled",G_CALLBACK(on_system_parameter_changed),window);
|
|
g_signal_connect(G_OBJECT(window->SystemGroupCheck),"toggled",G_CALLBACK(on_system_parameter_changed),window);
|
|
g_signal_connect(G_OBJECT(window->userUIDEntry),"insert-text",G_CALLBACK(yon_on_text_insert_only_digits),NULL);
|
|
return window;
|
|
}
|
|
|
|
|
|
|
|
void on_GID_update(GtkWidget *, ubl_settings_usergroups_group_creation_window *window){
|
|
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck))){
|
|
if (window->last_gid){
|
|
gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),window->last_gid);
|
|
} else {
|
|
int config_size=0;
|
|
int final_size=0;
|
|
config_str config_groups = yon_config_get_all_by_key(GROUPADD_parameter,&config_size);
|
|
yon_char_parsed_prepend_strings(config_groups,config_size,":");
|
|
config_str final = yon_char_parsed_merge(main_config.groups,main_config.groups_size,config_groups,config_size,&final_size);
|
|
long prev_busy=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 (parsed_size>2&&minimum<atol(parsed[2])&&atol(parsed[2])<maximum){
|
|
if (atol(parsed[2])>prev_busy){
|
|
prev_busy=atol(parsed[2]);
|
|
}
|
|
}
|
|
yon_char_parsed_free(parsed, parsed_size);
|
|
}
|
|
gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),yon_char_from_long(prev_busy+1));
|
|
}
|
|
} else {
|
|
gtk_entry_set_text(GTK_ENTRY(window->userUIDEntry),"");
|
|
}
|
|
}
|
|
|
|
void on_group_save(GtkWidget *self, dictionary *dict){
|
|
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
|
|
ubl_settings_usergroups_group_creation_window *window = yon_dictionary_get_data(dict->first->next,ubl_settings_usergroups_group_creation_window*);
|
|
char *final_string = NULL;
|
|
char *group_name = NULL;
|
|
char *group_users = NULL;
|
|
char *gid = NULL;
|
|
char *non_unique = NULL;
|
|
char *gsystem = NULL;
|
|
char *admins = NULL;
|
|
char *password = NULL;
|
|
int gid_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck));
|
|
if (gid_active){
|
|
gid="x";
|
|
} else {
|
|
gid = (char*)gtk_entry_get_text(GTK_ENTRY(window->userUIDEntry));
|
|
if (yon_char_is_empty(gid)){
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
yon_ubl_status_highlight_incorrect(window->userUIDEntry);
|
|
return;
|
|
}
|
|
|
|
|
|
if (!yon_char_is_empty(window->last_gid)&&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);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
group_name = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry));
|
|
if (group_name[0]>'0'&&group_name[0]<'9'){
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),GROUP_BEGINS_WITH_DIGIT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
yon_ubl_status_highlight_incorrect(window->userLoginEntry);
|
|
return;
|
|
}
|
|
if (yon_char_is_empty(group_name)){
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
yon_ubl_status_highlight_incorrect(window->userLoginEntry);
|
|
return;
|
|
}
|
|
{
|
|
GtkTreeIter iter;
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList);
|
|
for_iter(model,&iter){
|
|
char *cur;
|
|
gtk_tree_model_get(model,&iter,1, &cur,-1);
|
|
if (!yon_char_is_empty(cur)&&!strcmp(cur,group_name)){
|
|
if (!gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&iter)){
|
|
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),GROUP_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
yon_ubl_status_highlight_incorrect(window->userLoginEntry);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
group_users = (char*)gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry));
|
|
|
|
admins = (char*)gtk_entry_get_text(GTK_ENTRY(window->AdminGroupsEntry));
|
|
int non_unique_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->UnuniqueGIDCheck));
|
|
if(non_unique_active){
|
|
non_unique="--non-unique";
|
|
} else non_unique="";
|
|
|
|
int gsystem_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->SystemGroupCheck));
|
|
if(gsystem_active){
|
|
gsystem="--system";
|
|
} else gsystem="";
|
|
|
|
int shutdown_sync_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupaddShutdownCheck));
|
|
if (shutdown_sync_active){
|
|
char *final_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",GROUPADD_SYNC(group_name));
|
|
yon_config_register(GROUPADD_SYNC(group_name),final_command,"shutdown");
|
|
} else {
|
|
yon_config_remove_by_key(GROUPADD_SYNC(group_name));
|
|
}
|
|
|
|
|
|
int password_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->PasswordCombo));
|
|
if (password_active == 0){
|
|
password = "";
|
|
} else if (password_active ==5){
|
|
password = " ";
|
|
} else if (password_active == 1){
|
|
password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry));
|
|
if (yon_char_is_empty(password)){
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
yon_ubl_status_highlight_incorrect(window->PasswordEntry);
|
|
return;
|
|
}
|
|
} else if (password_active==2){
|
|
password = "!*";
|
|
} else if (password_active ==3){
|
|
password = (char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry));
|
|
if (password[0]!='!') {
|
|
char *temp = yon_char_append("!",password);
|
|
password=temp;
|
|
}
|
|
} else if (password_active == 4){
|
|
password = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)));
|
|
if (yon_char_is_empty(password)){
|
|
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
yon_ubl_status_highlight_incorrect(window->PasswordEntry);
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
|
|
return;
|
|
}
|
|
if (password[0]=='!'){
|
|
free(yon_char_divide(password,0));
|
|
}
|
|
}
|
|
final_string = yon_char_unite(yon_char_return_if_exist(group_users,""),
|
|
":",yon_char_return_if_exist(gid,"x"),
|
|
":",yon_char_return_if_exist(non_unique,""),
|
|
yon_char_return_if_exist(gsystem,""),
|
|
":",yon_char_return_if_exist(admins,""),
|
|
":",yon_char_return_if_exist(password,""),
|
|
NULL);
|
|
char *final_command = yon_config_parameter_prepare_command(dull_parameter_get_command,NULL,"users",GROUPADD_SYNC(group_name));
|
|
yon_config_register(GROUPADD(group_name),final_command,final_string);
|
|
yon_interface_update(widgets);
|
|
on_subwindow_close(self);
|
|
}
|
|
|
|
void on_group_delete_toggled(GtkWidget *,gchar* path,yon_confirmation_window *window){
|
|
int found=0;
|
|
GtkTreeModel *model = GTK_TREE_MODEL(window->list);
|
|
GtkTreeIter iter;
|
|
char *target;
|
|
gtk_tree_model_get_iter_from_string(model,&iter,path);
|
|
gtk_tree_model_get(model,&iter,1,&target,-1);
|
|
char *parameter = config(GROUPADD(target));
|
|
int size;
|
|
config_str parsed = yon_char_parse(parameter,&size,":");
|
|
int users_size;
|
|
config_str users = yon_config_get_all_by_key(USERADD_SEARCH_macro,&users_size);
|
|
for (int i=0;i<users_size;i++){
|
|
int parsed_user_size;
|
|
char *name = yon_char_divide_search(users[i],"=",-1);
|
|
free(yon_char_divide_search(name,"[",-1));
|
|
name[strlen(name)-1]='\0';
|
|
config_str user_parsed = yon_char_parse(users[i], &parsed_user_size,":");
|
|
|
|
int compare_size;
|
|
config_str compare_group = yon_config_load(get_group_info_command(user_parsed[2]),&compare_size);
|
|
int compare_parsed_size;
|
|
|
|
config_str compare_parsed = yon_char_parse(compare_group[0],&compare_parsed_size,":");
|
|
if (!strcmp(compare_parsed[1],parsed[1])){
|
|
found = 1;
|
|
}
|
|
|
|
}
|
|
if (found ==1 ){
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"group_occupied","",BACKGROUND_IMAGE_INFO_TYPE);
|
|
}
|
|
|
|
}
|
|
|
|
void yon_group_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));
|
|
// g_signal_connect(G_OBJECT(window->DeleteCell),"toggled",G_CALLBACK(on_group_delete_toggled),window);
|
|
GtkTreeIter iter,itar;
|
|
dictionary *dict = NULL;
|
|
gtk_label_set_text(GTK_LABEL(window->TitleLabel),DELETE_GROUP_CONFIRMATION_CONFIRM_LABEL);
|
|
gtk_tree_view_column_set_title(window->UserCell,GROUP_LABEL);
|
|
gtk_label_set_text(GTK_LABEL(window->HatLabel),DELETE_GROUP_CONFIRMATION_TITLE_LABEL);
|
|
gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(window->DeletionTree),2),0);
|
|
gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(window->DeletionTree),3),0);
|
|
gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(window->DeletionTree),4),0);
|
|
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_group_delete_confirmation_save),dict);
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->GroupsList);
|
|
GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)),&model);
|
|
int chosen_size=0;
|
|
config_str chosen = NULL;
|
|
for (guint i=0;i<g_list_length(list);i++){
|
|
char *current;
|
|
gtk_tree_model_get_iter(model,&iter,(GtkTreePath*)g_list_nth_data(list,i));
|
|
gtk_tree_model_get(model,&iter,1,¤t,-1);
|
|
yon_char_parsed_add_or_create_if_exists(chosen,&chosen_size,current);
|
|
}
|
|
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->GroupsList),&iter);
|
|
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->GroupsList),&iter)){
|
|
char *name;
|
|
gtk_tree_model_get(GTK_TREE_MODEL(widgets->GroupsList),&iter,1,&name,-1);
|
|
gtk_list_store_append(window->list,&itar);
|
|
gtk_list_store_set(window->list,&itar,0,yon_char_parsed_check_exist(chosen,chosen_size,name)>-1?1:0,1,name,-1);
|
|
|
|
free(name);
|
|
}
|
|
gtk_widget_show(window->Window);
|
|
}
|
|
|
|
void yon_group_delete_confirmation_save(GtkWidget *self, dictionary *dict){
|
|
GtkTreeIter iter,itar;
|
|
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
|
|
yon_confirmation_window *window = yon_dictionary_get_data(dict->first->next,yon_confirmation_window*);
|
|
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->GroupsList),&iter);
|
|
for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->GroupsList),&iter)){
|
|
char *name;
|
|
gtk_tree_model_get(GTK_TREE_MODEL(widgets->GroupsList),&iter,1,&name,-1);
|
|
int valid2 = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&itar);
|
|
for (;valid2;valid2 = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&itar)){
|
|
char *name_check;
|
|
int delete;
|
|
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&delete,1,&name_check,-1);
|
|
if (!strcmp(name,name_check)&&delete){
|
|
yon_config_remove_by_key(GROUPADD(name));
|
|
yon_config_remove_by_key(GROUPADD_SYNC(name));
|
|
valid=0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
yon_interface_update(widgets);
|
|
|
|
on_subwindow_close(self);
|
|
} |