#include #include #include #include "ldapconf_defs.h" #include "fields.h" #include static HELP_FILE help_config ("ldapconf","formclient"); class USERINFO_COMNG: public USERACCT_COMNG{ LDAPOBJECT ldap; FIELD_DEFS userconf_ldapform; bool comng_enabled; const char *domain_profile; /*~PROTOBEG~ USERINFO_COMNG */ public: USERINFO_COMNG (DICTIONARY&_dict); int deluser (PRIVILEGE *); int save (PRIVILEGE *priv); void setupdia (DIALOG&dia); int validate (DIALOG&, int &nof); ~USERINFO_COMNG (void); /*~PROTOEND~ USERINFO_COMNG */ }; PUBLIC USERINFO_COMNG::USERINFO_COMNG( DICTIONARY &_dict) : USERACCT_COMNG (_dict) { // Lookup domain profile const char *domain = dict.get_str("domain"); char fpath[PATH_MAX]; sprintf(fpath,"%s/%s",PROFILE_DIR,domain); comng_enabled = true; if (!strcmp(domain,"/")) { // Maindomain profile domain_profile = "userinfo"; D(debugf(4,"ldap_comng: main domain: %s\n",domain)); } else if (fopen(fpath,"r")){ // Virtual domain profile domain_profile = domain; D(debugf(4,"ldap_comng: virtual domain: %s\n",domain)); } else { // No profile comng_enabled = false; return; } ldap.load_profile(domain_profile); if (!ldap.c_profile->getvalnum("profile","userconf_comng",0)) { // If profile comng is disabled comng_enabled = false; return; } userconf_ldapform.c_form = ldap.form; userconf_ldapform.read(); if (!dict.get_bool ("is_new")){ ldap.filter.setfromf("uid=%s",dict.get_str("name")); ldap.search(); CONFDB db; ldap.export_confdb(db); userconf_ldapform.loadval (&db,dict.get_str("name")); } posix_addcomng(userconf_ldapform); } PUBLIC USERINFO_COMNG::~USERINFO_COMNG() { posix_delcomng(userconf_ldapform); } PUBLIC void USERINFO_COMNG::setupdia ( DIALOG &dia) { if (comng_enabled) { dia.newf_title (MSG_U(T_EXTRA,"LDAP"),1 ,"",MSG_R(T_EXTRA)); userconf_ldapform.setupdia(dia); } } PUBLIC int USERINFO_COMNG::save( PRIVILEGE *priv) { int ret = 0; if (comng_enabled && !mode_posix_accounts){ /* Update the ldapobject to the ldap database */ const char *user = dict.get_str("name"); /* Check if this entry exist */ ldap.filter.setfromf("uid=%s",user); bool is_new = ldap.search() > 0 ? false : true; /* Add DN */ ldap.dn.setfromf("dn: uid=%s,%s,%s",user,ldap.dn_prefix.get(),ldap.bind.base.get()); /* Create a new entry */ if (is_new){ ldap.at_set("uid",user); ldap.at_set("cn",user); // For Netscape search ldap.oc_add("top"); ldap.oc_add("account"); ldap.oc_add("posixAccount"); ldap.add(); } userconf_ldapform.saveval (ldap); ret = ldap.modify(); } return ret; } PUBLIC int USERINFO_COMNG::validate( DIALOG &, int &nof) { int ret = 0; // Validation ? return ret; } PUBLIC int USERINFO_COMNG::deluser ( PRIVILEGE *) { int ret = 0; if (!comng_enabled || mode_posix_accounts) return 0; if (!dict.get_bool("is_new")){ const char *user; user = dict.get_str("name"); ldap.dn.setfromf("dn: uid=%s,%s,%s",user,ldap.dn_prefix.get(),ldap.bind.base.get()); ret = ldap.del(); } return ret; } USERACCT_COMNG *ldapconf_newcomng( const char *key, DICTIONARY &dict) { USERACCT_COMNG *ret = NULL; if (strcmp(key,"user")==0 && mode_ldap_userinfo){ ret = new USERINFO_COMNG (dict); } return ret; } static REGISTER_USERACCT_COMNG xxx (ldapconf_newcomng); class ACCTEXTRA_API_PRIV: public ACCTEXTRA_API{ public: FIELD_DEFS flds; void loadvars(){ if (flds.size()==0){ LDAPOBJECT ldap; ldap.load_profile("userinfo"); if (ldap.c_profile->getvalnum("profile","userconf_comng",0)) { flds.c_form = ldap.form; flds.read(); flds.c_form = NULL; } } } }; static int api_getvars (ACCTEXTRA_API *p, SSTRING_KEYS &tb) { ACCTEXTRA_API_PRIV *api = (ACCTEXTRA_API_PRIV*)p; api->loadvars(); int ret = api->flds.size(); for (int i=0; iflds.getitem(i); tb.add (d->id.get(),d->title.get()); } return ret; } static void api_setvals (ACCTEXTRA_API *p, const SSTRING_KEYS &tb) { ACCTEXTRA_API_PRIV *api = (ACCTEXTRA_API_PRIV*)p; FIELD_DEFS *flds = &api->flds; for (int i=0; iset (k->get(),k->getobjval()); } } static void api_getvals ( ACCTEXTRA_API *p, const char *user, SSTRING_KEYS &tb) { ACCTEXTRA_API_PRIV *api = (ACCTEXTRA_API_PRIV*)p; api->loadvars(); tb.remove_all(); for (int i=0; iflds.size(); i++){ FIELD_DEF *d = api->flds.getitem(i); tb.add (d->id.get(),d->title.get()); } posix_read (user,tb); } void *acctextra_api_get() { ACCTEXTRA_API_PRIV *api = new ACCTEXTRA_API_PRIV; api->getvars = api_getvars; api->setvals = api_setvals; api->getvals = api_getvals; posix_addcomng (api->flds); return api; } void acctextra_api_release(void *p) { ACCTEXTRA_API_PRIV *api = (ACCTEXTRA_API_PRIV*)p; posix_delcomng (api->flds); delete api; }