/*************************************************************************/ /* 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. **************************************************************************/ /* OPENLDAP.cc Functions to support the openldap distribution. **************************************************************************/ #include #include "modregister.h" #include "ldapconf_defs.h" static char ID_CLIENT[]="client"; // vregistry /*! LDAP master control dialog */ void ldap_server_control(){ const char *server_start = MSG_U(M_SERVER_START,"Start LDAP server"); const char *server_stop = MSG_U(M_SERVER_STOP,"Stop LDAP server"); const char *server_restart = MSG_U(M_SERVER_RESTART,"Restart LDAP server"); const char *server_status = MSG_U(M_SERVER_STATUS,"LDAP server status"); const char *tbopt[]={ "", server_start, "", server_stop, "", server_restart, "", server_status, NULL }; DIALOG dia; dia.new_menuitems(tbopt); int nof = 0; while (1){ MENU_STATUS code = dia.editmenu (MSG_U(T_SERVER_CONTROL,"Server Control") ,MSG_U(I_SERVER_CONTROL, "Control LDAP server") ,help_ldap ,nof,0); if (code == MENU_ESCAPE || code == MENU_QUIT){ break; }else{ const char *key = dia.getmenustr(nof); if (key == server_start){ sys_command_title ("LDAP server","slapd.init","start"); }else if (key == server_stop){ sys_command_title ("LDAP server","slapd.init","stop"); }else if (key == server_restart){ sys_command_title ("LDAP server","slapd.init","restart"); }else if (key == server_status){ ldap_status(); } } } } /*! LDAP master config dialog */ void ldap_server_config() { CONFIG_FILE f_slapd_conf ("slapd.conf", help_ldap, CONFIGF_OPTIONAL|CONFIGF_MANAGED, mode_slapd_user.get(), mode_slapd_group.get(), 0400, subsys_ldap); VIEWITEMS v_slapd_conf; v_slapd_conf.setcasevar (true); // Global defaults SSTRING slapd_schemacheck = "off"; SSTRING slapd_loglevel = "0"; SSTRING slapd_defaultaccess = "read"; SSTRING slapd_referral = ""; // Read config v_slapd_conf.read (f_slapd_conf); slapd_schemacheck.setfrom (get_keyval(v_slapd_conf,"schemacheck")); slapd_loglevel.setfrom (get_keyval(v_slapd_conf,"loglevel")); slapd_defaultaccess.setfrom (get_keyval(v_slapd_conf,"defaultaccess")); slapd_referral.setfrom (get_keyval(v_slapd_conf,"referral")); // Edit config DIALOG dia; dia.newf_title ("",MSG_U(I_MASTER_GLOBAL,"Global settings")); FIELD_COMBO *schema = dia.newf_combo(MSG_U(F_SLAPD_SCHEMACHECK,"Schemacheck"),slapd_schemacheck); schema->addopt ("on"); schema->addopt ("off"); dia.newf_str (MSG_U(F_SLAPD_LOGLEVEL,"Loglevel"),slapd_loglevel); FIELD_COMBO *accesslist = dia.newf_combo(MSG_U(F_SLAPD_DEFAULTACCESS,"Default access"),slapd_defaultaccess); accesslist->addopt ("none"); accesslist->addopt ("compare"); accesslist->addopt ("search"); accesslist->addopt ("read"); accesslist->addopt ("write"); // accesslist->addopt ("delete"); dia.newf_str (MSG_U(F_SLAPD_REFERRAL,"Referral"),slapd_referral); int nof = 0; while (1){ MENU_STATUS code = dia.edit (MSG_U(T_MASTER_CONFIG,"Server") ,MSG_U(I_MASTER_CONFIG ,"Current LDAP server config") ,help_ldap ,nof); if (code == MENU_CANCEL || code == MENU_ESCAPE){ // Exit break; } else if (code == MENU_ACCEPT){ // Save config set_keyval(v_slapd_conf,"schemacheck",slapd_schemacheck.get()); set_keyval(v_slapd_conf,"loglevel",slapd_loglevel.get()); set_keyval(v_slapd_conf,"defaultaccess",slapd_defaultaccess.get()); set_keyval(v_slapd_conf,"referral",slapd_referral.get()); v_slapd_conf.write (f_slapd_conf,&p_ldap_admin); break; } } } /*! Return list of all LDAP databases */ int ldap_db_getlist (SSTRINGS &lst) { SSTRINGS tb; dir_getfiltered (DBCONF_DIR,tb,".OLD .rpmorig .rpmsave .rpmnew ~"); /* Filter out DB configs */ int n = tb.getnb(); for (int i=0; istrstr(DBCONF_SUFFIX)){ /* Remove suffix */ SSTRINGS buf; char name[256]; str_splitline(tb.getitem(i)->get(),'.',buf); sprintf(name,buf.getitem(0)->get()); strip_end(name); /* Add profilename */ lst.add(new SSTRING(name)); } } lst.sort(); return lst.getnb(); } /*! Select LDAP db */ void ldap_db_select() { SSTRINGS db_lst; DIALOG_LISTE dia; dia.newf_head ("",MSG_U(F_DB_LIST,"Database")); int nof = 0; while (1){ db_lst.remove_all(); int n = ldap_db_getlist(db_lst); for (int i=0; iget(),""); } dia.remove_last (n+1); MENU_STATUS code = dia.editmenu ( MSG_U(T_LDAP_DB_LIST,"Server database list") ,MSG_U(I_LDAP_DB_LIST,"Select database") ,help_ldap ,nof,MENUBUT_ADD); if (code == MENU_QUIT || code == MENU_ESCAPE){ break; } else if (code == MENU_ADD){ char name[100]; if (dialog_inputbox(MSG_U(T_NEWDIRECTORY,"New database") ,MSG_U(I_NEWDIRECTORY ,"Select a nickname for this database") ,help_ldap,name) == MENU_ACCEPT){ LDAPDB db(name); db.init(name); db.config(name); db.menu(); } else { break; } } else if (nof >=0 && nof < db_lst.getnb()){ const char *name = db_lst.getitem(nof)->get(); LDAPDB db(name); db.read(name); db.menu(); } } } /*! LDAP Client config Used by normal user applications */ void ldap_client_config() { VIEWITEMS v_ldap_conf; LDAPPROFILE profile; char buf[ATTR_VAL_MAX]; // Generate defaults */ gethostname(buf,sizeof(buf)); dns2dc(buf,sizeof(buf),1); // Read configfile v_ldap_conf.read (f_ldap_conf); profile.host.setfrom (get_keyval(v_ldap_conf,"host","ldap")); profile.base.setfrom (get_keyval(v_ldap_conf,"base",buf)); profile.dn.setfrom (get_keyval(v_ldap_conf,"binddn")); profile.pw.setfrom (get_keyval(v_ldap_conf,"bindpw")); profile.scope.setfrom (get_keyval(v_ldap_conf,"scope","sub")); profile.port.setfrom (get_keyval(v_ldap_conf,"port","389")); DIALOG dia; // Vregistry support dia.set_registry_id (ID_CLIENT); // Edit config dia.newf_title (MSG_U(I_GENERAL,"General"),1,"",MSG_R(I_GENERAL)); dia.newf_str (MSG_R(F_API_HOST),profile.host); dia.newf_str (MSG_R(F_API_BASE),profile.base); dia.newf_title (MSG_R(I_LDAPBIND),1,"",MSG_R(I_LDAPBIND)); dia.newf_str (MSG_R(F_API_DN),profile.dn); dia.newf_pass (MSG_R(F_API_PW),profile.pw); dia.newf_title (MSG_U(I_MISC,"Misc"),1,"",MSG_R(I_MISC)); dia.newf_str (MSG_R(F_API_PORT),profile.port); FIELD_COMBO *scopelist = dia.newf_combo(MSG_R(F_API_SCOPE),profile.scope); scopelist->addopt ("one"); scopelist->addopt ("base"); scopelist->addopt ("sub"); int nof = 0; while (1){ MENU_STATUS code = dia.edit (MSG_U(T_CLIENT_MENU,"Client") ,MSG_U(I_CLIENT_MENU ,"Default LDAP client configuration for this system.") ,help_ldapclient ,nof); if (code == MENU_CANCEL || code == MENU_ESCAPE){ // Exit break; } else if (code == MENU_ACCEPT){ // Save config set_keyval(v_ldap_conf,"host",profile.host.get()); set_keyval(v_ldap_conf,"port",profile.port.get()); set_keyval(v_ldap_conf,"base",profile.base.get()); set_keyval(v_ldap_conf,"binddn",profile.dn.get()); set_keyval(v_ldap_conf,"bindpw",profile.pw.get()); set_keyval(v_ldap_conf,"scope",profile.scope.get()); v_ldap_conf.write (f_ldap_conf,&p_ldap_admin); break; } } } /*! VREGISTRY support: vregistry --set ldapconf.client.host = vregistry --set ldapconf.client.base = */ static REGISTER_VARIABLE_LOOKUP_MSG ldapconf_var_list[]={ {"client.host",ID_CLIENT,P_MSG_R(F_API_HOST),ldap_client_config,NULL}, {"client.base",ID_CLIENT,P_MSG_R(F_API_BASE),ldap_client_config,NULL}, { NULL, NULL, NULL, NULL } }; static REGISTER_VARIABLES ldapconf_registry("ldapconf",ldapconf_var_list);