/*************************************************************************/ /* LDAPCONF - Linuxconf module for LDAP operation. Copyright (C) 1999,2000,2001 Stein Vråle This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details. **************************************************************************/ /* GROUPADMIN.cc Dialogs for group management. **************************************************************************/ #include "ldapconf_defs.h" #include #include /* Dialog for group managment. */ void ldap_groupadmin(const char *profile_name) { LDAPOBJECT ldap(profile_name); SSTRINGS group_list; int n; DIALOG_RECORDS dia; // Find all groups group_list.remove_all(); ldap.filter.setfrom("cn=*"); ldap.search_base.setfromf("%s,%s",ldap.group_prefix.get(),ldap.bind.base.get()); n = ldap.search_list_val(group_list,"cn"); dia.newf_head ("",MSG_U(H_GROUPS,"Groups")); int nof = 0; // Grouplist while (1) { group_list.sort(); for (int i=0; iget(),""); } dia.remove_last(group_list.getnb()+1); MENU_STATUS code = dia.editmenu (MSG_U(T_GROUP_LIST,"Groups") ,MSG_U(I_GROUP_LIST,"Select a group") ,help_groupadmin ,nof ,MENUBUT_ADD); if (code == MENU_QUIT || code == MENU_ESCAPE){ /* Exit */ break; } else if (nof >=0 && nof < group_list.getnb()){ ldap_group_manage(profile_name,group_list.getitem(nof)->get()); } } } /* Dialog for group managment. */ void ldap_group_manage(const char *profile_name, const char *group_name) { LDAPOBJECT ldap(profile_name); LDAPOBJECT ldapgroup(profile_name); SSTRINGS user_list; SSTRINGS member_list; SSTRINGS nonmember_list; SSTRING member_key; // Lookup all users user_list.remove_all(); ldap.filter.setfrom("uid=*"); ldap.search_base.setfromf("%s,%s",ldap.dn_prefix.get(),ldap.bind.base.get()); //ldap.search_list_val(user_list,"uid"); // it's better to do the group by dn so it's easier to recurse and index (ok, it's less pretty !) ldap.search_list_val(user_list,"uid"); // Lookup group object ldapgroup.filter.setfromf("cn=%s",group_name); ldapgroup.search_base.setfromf("%s,%s", ldapgroup.group_prefix.get(), ldapgroup.bind.base.get()); ldapgroup.search(); // Check type of group class // member for a groupOfNames, uniquemember for a groupOfUniqueNames, memberuid for posixGroup // should adapt to objectclass if (ldapgroup.oc_exist("GroupOfNames")){ member_key.setfrom("member"); } else if (ldapgroup.oc_exist("GroupOfUniqueNames")){ member_key.setfrom("uniqemember"); } else if (ldapgroup.oc_exist("posixGroup")){ member_key.setfrom("memberuid"); } else { // Log error and exit (should maybe default to posixGroup instead) logf(LOG_ERROR,"ldap_group_manage: Invalid group object"); return; } // Find current members in this group member_list.remove_all(); ldapgroup.at_getall(member_key.get(),member_list); // Add users who are not member of this group to the nonmember list for (int i=0; iget())) { nonmember_list.add(new SSTRING(user_list.getitem(i)->get())); } } DIALOG_RECORDS dia; dia.newf_head ("",MSG_U(H_GROUPMEMBERS,"Members")); int nof = 0; // Memberlist while (1) { member_list.sort(); for (int i=0; iget(),""); } dia.remove_last(member_list.getnb()+1); MENU_STATUS code = dia.editmenu (MSG_U(T_GROUPMEMBERS,"Members") ,MSG_U(I_GROUPMEMBERS, "This is the members of current group.\n" "Select Add to add one or more members.\n" "Select Del to remove one or more members.\n" "Select a name in the list to edit the selected member.\n" ) ,help_groupadmin ,nof ,MENUBUT_ADD|MENUBUT_DEL|MENUBUT_ACCEPT); if (code == MENU_QUIT || code == MENU_ESCAPE){ // Cancel - exit without updating directory break; } else if (code == MENU_ACCEPT) { // Accept - exit after updating directory // This will currently only update members, not other groupinfo ldapgroup.reset_data(); ldapgroup.dn.setfromf("dn: cn=%s,%s,%s", group_name, ldap.group_prefix.get(), ldap.bind.base.get()); // SSTRING tempdn; for (int i=0; iget()); } ldapgroup.modify(); break; } else if (code == MENU_ADD) { // Add members group_addmembers(member_list,nonmember_list); } else if (code == MENU_DEL) { // Delete members group_delmembers(member_list,nonmember_list); } else if (nof >=0 && nof < member_list.getnb()){ // Edit user ldap_form_edituser(profile_name,member_list.getitem(nof)->get()); } } } void group_delmembers(SSTRINGS &member_list, SSTRINGS &nonmember_list){ int nof = 0; DIALOG_RECORDS dia; dia.newf_head ("",MSG_U(H_MEMBERS,"Members")); while (1) { member_list.sort(); for (int i=0; iget(),""); } dia.remove_last(member_list.getnb()+1); MENU_STATUS code = dia.editmenu (MSG_U(T_MEMBER_LIST,"Members"), MSG_U(I_MEMBER_LIST, "Select users to be removed from the current group"), help_groupadmin, nof, MENUBUT_ACCEPT); if (code == MENU_QUIT || code == MENU_ESCAPE){ break; } else if (code == MENU_ACCEPT){ break; } else if (nof >=0 && nof < member_list.getnb()){ // Add to nonmember list and remove from member list nonmember_list.add(new SSTRING(member_list.getitem(nof)->get())); member_list.remove_del(nof); } } } void group_addmembers(SSTRINGS &member_list, SSTRINGS &nonmember_list){ int nof = 0; DIALOG_RECORDS dia; dia.newf_head ("",MSG_U(H_NONMEMBERS,"Non-members")); while (1) { nonmember_list.sort(); for (int i=0; iget(),""); } dia.remove_last(nonmember_list.getnb()+1); MENU_STATUS code = dia.editmenu (MSG_U(T_NONMEMBER_LIST,"Non members"), MSG_U(I_NONMEMBER_LIST, "Select users to be added to the current group"), help_groupadmin, nof, MENUBUT_ACCEPT); if (code == MENU_QUIT || code == MENU_ESCAPE){ break; } else if (code == MENU_ACCEPT){ break; } else if (nof >=0 && nof < nonmember_list.getnb()){ // Add selected user to the memberlist and remove from nonmemberlist member_list.add(new SSTRING(nonmember_list.getitem(nof)->get())); nonmember_list.remove_del(nof); } } } /* FIXME: This function is currently disabled, will maybe be removed. Dialog for group managment. Return 1 = Save Return 0 = Cancel */ int group_admin(const char *profile_name,const char *group_name,SSTRINGS &members,SSTRINGS &allusers) { int ret = 0; SSTRING addmember; SSTRING delmember; SSTRINGS nonmembers; // Find non-members for (int i=0; iget())); } } DIALOG dia; dia.newf_info ("Profile",profile_name); dia.newf_info("Group ",group_name); /* Non members */ nonmembers.sort(); FIELD_COMBO *userlist = dia.newf_combo(MSG_U(F_MEMBER_KEY,"Add"),addmember); for (int i=0; iaddopt(nonmembers.getitem(i)->get()); } /* Members */ members.sort(); FIELD_COMBO *memberlist = dia.newf_combo(MSG_U(F_DELMEMBER_KEY,"Delete"),delmember); for (int i=0; iaddopt(members.getitem(i)->get()); } // dia.newf_head ("","Group"); // dia.newf_head(MSG_U(F_GA_MEMBERS,"Members"),""); int nof = 0; while (1) { // Refresh members.sort(); nonmembers.sort(); addmember.setfrom(""); delmember.setfrom(""); /* Members */ // for (int i=0; iget(),"test"); // } // dia.remove_last(members.getnb()+1); MENU_STATUS code = dia.edit (MSG_U(T_GROUP_ADMIN,"Group admin") ,MSG_U(I_GROUP_ADMIN ,"You may add or delete members in this group") ,help_groupadmin ,nof,MENUBUT_ACCEPT|MENUBUT_SAVE|MENUBUT_CANCEL); // dia.save(); if (code == MENU_CANCEL || code == MENU_ESCAPE){ /* Exit */ break; } else if (code == MENU_SAVE) { ret = 1; break; } else { if ( ! addmember.is_empty() ) { // Add member int n = nonmembers.lookup(addmember.get()); if ( n >= 0) { members.add(nonmembers.getitem(n)); nonmembers.remove_del(n); } } if ( ! delmember.is_empty() ){ // Delete member int n = members.lookup(delmember.get()); if (n >= 0 ) { nonmembers.add(members.getitem(n)); members.remove_del(n); } } delmember.setfrom (""); addmember.setfrom (""); dia.reload(); } } return ret; }