00001
00002 00003 00004 00005 00006 00007 00008 00009 00010 00011
00012 00013 00014 00015 00016
00017 #include "ldapconf_defs.h"
00018 #include <subsys.h>
00019 #include <confdb.h>
00020
00021 00022 00023 00024 00025
00026 void ldap_groupadmin(const char *profile_name)
00027 {
00028 LDAPOBJECT ldap;
00029 SSTRINGS group_list;
00030 SSTRINGS user_list;
00031 SSTRINGS member_list;
00032 SSTRING mainbase;
00033 int n;
00034
00035
00036 ldap.load_profile(profile_name);
00037 mainbase.setfrom(ldap.base.get());
00038
00039 DIALOG_RECORDS dia;
00040
00041
00042 group_list.remove_all();
00043 ldap.filter.setfrom("cn=*");
00044 ldap.base.setfromf("%s,%s",ldap.group_prefix.get(),mainbase.get());
00045 n = ldap.search_list_val(group_list,"cn");
00046
00047
00048 member_list.remove_all();
00049 ldap.filter.setfrom("uid=*");
00050 ldap.base.setfromf("%s,%s",ldap.dn_prefix.get(),mainbase.get());
00051 n = ldap.search_list_val(user_list,"uid");
00052
00053 dia.newf_head ("",MSG_U(H_GROUPS,"Groups"));
00054
00055 int nof = 0;
00056 while (1) {
00057
00058 group_list.sort();
00059
00060 for (int i=0; i<group_list.getnb(); i++){
00061 dia.set_menuitem (i,group_list.getitem(i)->get(),"");
00062 }
00063 dia.remove_last(group_list.getnb()+1);
00064
00065 MENU_STATUS code = dia.editmenu (MSG_U(T_GROUP_LIST,"Group list")
00066 ,MSG_U(I_GROUP_LIST,"Select a group")
00067 ,help_groupadmin
00068 ,nof
00069 ,0);
00070
00071 if (code == MENU_QUIT || code == MENU_ESCAPE){
00072 break;
00073 } else if (nof >=0 && nof < group_list.getnb()){
00074
00075 const char *group_name = group_list.getitem(nof)->get();
00076
00077 member_list.remove_all();
00078 ldap.filter.setfromf("cn=%s",group_name);
00079 ldap.base.setfromf("%s,%s",ldap.group_prefix.get(),mainbase.get());
00080 ldap.search();
00081 n = ldap.at_getall("memberuid",member_list);
00082
00083 if (group_admin(profile_name,group_name,member_list,user_list)){
00084
00085 ldap.at_del("memberuid");
00086 for (int i=0; i<member_list.getnb(); i++){
00087 ldap.at_add("memberuid",member_list.getitem(i)->get());
00088 }
00089 ldap.dn.setfromf("cn=%s,%s,%s",group_name,ldap.group_prefix.get(),mainbase.get());
00090 ldap.modify();
00091 }
00092 }
00093 }
00094 }
00095
00096 00097 00098 00099 00100 00101 00102
00103 int group_admin(const char *profile_name,const char *group_name,SSTRINGS &members,SSTRINGS &allusers)
00104 {
00105 int ret = 0;
00106 SSTRING addmember;
00107 SSTRING delmember;
00108 SSTRINGS nonmembers;
00109
00110
00111 for (int i=0; i<allusers.getnb(); i++){
00112 if ( members.lookup(allusers.getitem(i)) < 0 ) { nonmembers.add(new SSTRING (allusers.getitem(i)->get())); }
00113 }
00114
00115 DIALOG dia;
00116
00117
00118 dia.newf_info ("Profile",profile_name);
00119 dia.newf_info("Group ",group_name);
00120
00121
00122 nonmembers.sort();
00123 FIELD_COMBO *userlist = dia.newf_combo(MSG_U(F_MEMBER_KEY,"Add"),addmember);
00124 for (int i=0; i<nonmembers.getnb(); i++){
00125 userlist->addopt(nonmembers.getitem(i)->get());
00126 }
00127
00128
00129 members.sort();
00130 FIELD_COMBO *memberlist = dia.newf_combo(MSG_U(F_DELMEMBER_KEY,"Delete"),delmember);
00131 for (int i=0; i<members.getnb(); i++){
00132 memberlist->addopt(members.getitem(i)->get());
00133 }
00134 int nof = 0;
00135
00136 while (1) {
00137
00138
00139 members.sort();
00140 nonmembers.sort();
00141 addmember.setfrom("");
00142 delmember.setfrom("");
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 MENU_STATUS code = dia.edit (MSG_U(T_GROUP_ADMIN,"Group admin")
00154 ,MSG_U(I_GROUP_ADMIN
00155 ,"You may add or delete members in this group")
00156 ,help_groupadmin
00157 ,nof,MENUBUT_ACCEPT|MENUBUT_SAVE|MENUBUT_CANCEL);
00158
00159 dia.save();
00160 if (code == MENU_CANCEL || code == MENU_ESCAPE){
00161 break;
00162 } else if (code == MENU_SAVE) {
00163 ret = 1;
00164 break;
00165 } else {
00166 if ( ! addmember.is_empty() ) {
00167 int n = nonmembers.lookup(addmember.get());
00168 if ( n >= 0) { members.add(new SSTRING (nonmembers.getitem(n)->get())); nonmembers.remove_del(n); }
00169 }
00170 if ( ! delmember.is_empty() ){
00171 int n = members.lookup(delmember.get());
00172 if (n >= 0 ) { nonmembers.add(new SSTRING (members.getitem(n)->get())); members.remove_del(n); }
00173 }
00174 delmember.setfrom ("");
00175 addmember.setfrom ("");
00176 dia.reload();
00177 }
00178 }
00179
00180 return ret;
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192