⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libldap.c

📁 pwdutils是一套密码管理工具
💻 C
📖 第 1 页 / 共 4 页
字号:
}/* ldap_delete_group: Deletes an group entry in the LDAP database.   session: pointer to struct with LDAP session data.   group: Name of the group, which should be removed from the LDAP database.   binddn: Optional, DN as which we should bind to the server.           If not given, we will use the user DN for binding.	   password: Password used for binding to the LDAP server. */intldap_delete_group (ldap_session_t *session, const char *group,		   const char *binddn, const char *password){  char *groupdn;  int rc;  /* Sanity check.  */  if (session == NULL || group == NULL || binddn == NULL)    return 1;  if (session->bind == NULL)    {      int i;      /* If no binding is created yet, call ldap_authentication,	 which creates the binding and checks the password.  */      if ((i = ldap_authentication (session, NULL, binddn, password)) != 0)	{	  fprintf (stderr, _("Authentication failure.\n"));	  return i;	}    }  groupdn = convert_group_to_dn (session, group);  if (groupdn == NULL)    return 1;  if (!session->bind->bound_as_user)    {      rc = reopen_ldap_session (session);      if (rc != LDAP_SUCCESS)	return rc;      rc = connect_with_dn (session);      if (rc != LDAP_SUCCESS)	return rc;    }  rc = ldap_delete_s (session->ld, groupdn);  return rc;}/* Try to find the baseou for passwd and group in LDAP. At first we try   to find a posixAccount or posixGroup object. If we don't find one, try   to find a organizationalUnit with ou=People or ou=Groups. The result   will always be a guess, there is no way to determine this without   explicit option by the admin.  */static char *find_baseou (ldap_session_t *session, const char *filter, char *prefer[]){    int ldap_errors;  LDAPMessage *searchresults = NULL;  LDAPMessage *entry = NULL;  char *dn = NULL;  ldap_errors = ldap_search_s (session->ld, session->conf->base,			       LDAP_SCOPE_SUBTREE,                               "objectclass=organizationalUnit", NULL, 0,                               &searchresults);  if (ldap_errors)    {      fprintf (stderr, "ldap_search_s: %s.\n", ldap_err2string (ldap_errors));      return NULL;    }  entry = ldap_first_entry (session->ld, searchresults);  while (entry)    {      LDAPMessage *search2results = NULL, *entry2 = NULL;      ldap_errors = ldap_search_s (session->ld,				   ldap_get_dn (session->ld, entry),				   LDAP_SCOPE_ONELEVEL, filter, NULL, 0,                                   &search2results);      if (ldap_errors)        {          fprintf (stderr, "ldap_search_s: %s.\n",		   ldap_err2string (ldap_errors));          return NULL;        }      entry2 = ldap_first_entry (session->ld, search2results);      if (entry2)        {          if (dn)            free (dn);          dn = ldap_get_dn (session->ld, entry);        }      else if (dn == NULL)        {          BerElement *attributehandler;          char *attribute = ldap_first_attribute (session->ld, entry,						  &attributehandler);          while (attribute)            {              char **value_collection = NULL;	      int i;              if (strcasecmp (attribute, "ou") == 0)                {                  value_collection = ldap_get_values (session->ld,						      entry, attribute);		  for (i = 0; prefer[i]; i++)		    {		      if (strcasecmp (value_collection[0], prefer[i]) == 0)			dn = ldap_get_dn (session->ld, entry);		    }                  ldap_value_free (value_collection);                }              attribute = ldap_next_attribute (session->ld,					       entry, attributehandler);            }        }      entry = ldap_next_entry (session->ld, entry);    }  ldap_msgfree (searchresults);  return dn;}char *ldap_find_user_baseou (ldap_session_t *session){  char *prefer[] = {"People", "User", NULL};  return find_baseou (session, "objectclass=posixAccount", prefer);}char *ldap_find_group_baseou (ldap_session_t *session){  char *prefer[] = {"Group", "Groups", NULL};  return find_baseou (session, "objectclass=posixGroup", prefer);}intldap_create_user (ldap_session_t *session, struct passwd *pw,		  struct spwd *sp, const char *binddn, const char *password){  LDAPMod *mods[8], mod[8];  char *strvals[8][2];  char *userdn, *baseou;  int i, rc;  /* Sanity check.  */  if (session == NULL || pw == NULL)    return 1;  if (session->bind == NULL)    {      /* If no binding is created yet, call ldap_authentication,	 which creates the binding and checks the password.  */      if ((i = ldap_authentication (session, NULL, binddn, password)) != 0)	{	  fprintf (stderr, _("Authentication failure.\n"));	  return i;	}    }  baseou = ldap_find_user_baseou (session);  if (baseou == NULL)    {      fprintf (stderr, _("Cannot find base ou for new users.\n"));      return 1;    }  printf (_("Base DN for user account `%s' is \"%s\".\n"),	  pw->pw_name, baseou);  /* create top account object */  strvals[0][0] = "account";  strvals[0][1] = NULL;  strvals[1][0] = pw->pw_name;  strvals[1][1] = NULL;  mod[0].mod_values = strvals[0];  mod[0].mod_type = "objectClass";  mod[0].mod_op = LDAP_MOD_ADD;  mod[1].mod_values = strvals[1];  mod[1].mod_type = "uid";  mod[1].mod_op = LDAP_MOD_ADD;  mods[0] = &mod[0];  mods[1] = &mod[1];  mods[2] = NULL;  if (!session->bind->bound_as_user)    {      rc = reopen_ldap_session (session);      if (rc != LDAP_SUCCESS)	return rc;      rc = connect_with_dn (session);      if (rc != LDAP_SUCCESS)	return rc;    }  asprintf (&userdn, "uid=%s,%s", pw->pw_name, baseou);  rc = ldap_add_s (session->ld, userdn, mods);  if (rc != 0)    {      free (userdn);      return rc;    }  /* create posixAccount object */  strvals[0][0] = "posixAccount";  strvals[0][1] = NULL;  strvals[1][0] = pw->pw_name;  strvals[1][1] = NULL;  if (sp && sp->sp_pwdp)    strvals[2][0] = sp->sp_pwdp;  else    strvals[2][0] = pw->pw_passwd ?: "x";  strvals[2][1] = NULL;  asprintf (&strvals[3][0], "%u", pw->pw_uid);  strvals[3][1] = NULL;  asprintf (&strvals[4][0], "%u", pw->pw_gid);  strvals[4][1] = NULL;  strvals[5][0] = pw->pw_dir ?: "";  strvals[5][1] = NULL;  strvals[6][0] = pw->pw_shell ?: "";  strvals[6][1] = NULL;  strvals[7][0] = pw->pw_gecos;  strvals[7][1] = NULL;  mod[0].mod_values = strvals[0];  mod[0].mod_type = "objectClass";  mod[0].mod_op = LDAP_MOD_ADD;  mod[1].mod_values = strvals[1];  mod[1].mod_type = "cn";  mod[1].mod_op = LDAP_MOD_ADD;  mod[2].mod_values = strvals[2];  mod[2].mod_type = "userPassword";  mod[2].mod_op = LDAP_MOD_ADD;  mod[3].mod_values = strvals[3];  mod[3].mod_type = "uidNumber";  mod[3].mod_op = LDAP_MOD_ADD;  mod[4].mod_values = strvals[4];  mod[4].mod_type = "gidNumber";  mod[4].mod_op = LDAP_MOD_ADD;  mod[5].mod_values = strvals[5];  mod[5].mod_type = "homeDirectory";  mod[5].mod_op = LDAP_MOD_ADD;  mod[6].mod_values = strvals[6];  mod[6].mod_type = "loginShell";  mod[6].mod_op = LDAP_MOD_ADD;  mod[7].mod_values = strvals[7];  mod[7].mod_type = "gecos";  mod[7].mod_op = LDAP_MOD_ADD;  mods[0] = &mod[0];  mods[1] = &mod[1];  mods[2] = &mod[2];  mods[3] = &mod[3];  mods[4] = &mod[4];  mods[5] = &mod[5];  mods[6] = &mod[6];  if (pw->pw_gecos && pw->pw_gecos[0] != '\0')    {      mods[7] = &mod[7];      mods[8] = NULL;    }  else    mods[7] = NULL;  rc = ldap_modify_s (session->ld, userdn, mods);  if (rc != 0)    {      ldap_delete_s (session->ld, userdn);      free (userdn);      return rc;    }  /* create shadowAccount object */  i = 0;  strvals[i][0] = "shadowAccount";  strvals[i][1] = NULL;  mod[i].mod_values = strvals[i];  mod[i].mod_type = "objectClass";  mod[i].mod_op = LDAP_MOD_ADD;  mods[i] = &mod[i];  i++;  if (sp->sp_lstchg > 0)    {      asprintf (&strvals[i][0], "%lu", sp->sp_lstchg);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowLastChange";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  if (sp->sp_min >= 0)    {      asprintf (&strvals[i][0], "%ld", sp->sp_min);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowMin";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  if (sp->sp_max >= 0)    {      asprintf (&strvals[i][0], "%ld", sp->sp_max);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowMax";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  if (sp->sp_warn >= 0)    {      asprintf (&strvals[i][0], "%ld", sp->sp_warn);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowWarning";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];    }  if (sp->sp_inact >= 0)    {      asprintf (&strvals[i][0], "%ld", sp->sp_inact);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowInactive";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  if (sp->sp_expire >= 0)    {      asprintf (&strvals[i][0], "%ld", sp->sp_expire);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowExpire";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  if ((long int) sp->sp_flag != -1 )    {      asprintf (&strvals[i][0], "%lu", sp->sp_flag);      strvals[i][1] = NULL;      mod[i].mod_values = strvals[i];      mod[i].mod_type = "shadowFlag";      mod[i].mod_op = LDAP_MOD_ADD;      mods[i] = &mod[i];      i++;    }  mods[i] = NULL;  rc = ldap_modify_s (session->ld, userdn, mods);  if (rc != 0)    ldap_delete_s (session->ld, userdn);  free (userdn);  return rc;}intldap_create_group (ldap_session_t *session, struct group *gr,		   const char *binddn, const char *password){  LDAPMod *mods[8], mod[8];  char *strvals[8][2];  char *groupdn, *baseou;  int i, rc;  /* Sanity check.  */  if (session == NULL || gr == NULL)    return 1;  if (session->bind == NULL)    {      /* If no binding is created yet, call ldap_authentication,	 which creates the binding and checks the password.  */      if ((i = ldap_authentication (session, NULL, binddn, password)) != 0)	{	  fprintf (stderr, _("Authentication failure.\n"));	  return i;	}    }  baseou = ldap_find_group_baseou (session);  if (baseou == NULL)    {      fprintf (stderr, _("Cannot find base ou for new groups.\n"));      return 1;    }  printf (_("Base DN for group `%s' is \"%s\".\n"),	  gr->gr_name, baseou);  asprintf (&groupdn, "cn=%s,%s", gr->gr_name, baseou);  if (!session->bind->bound_as_user)    {      rc = reopen_ldap_session (session);      if (rc != LDAP_SUCCESS)	return rc;      rc = connect_with_dn (session);      if (rc != LDAP_SUCCESS)	return rc;    }  /* create top objectClass.  */  strvals[0][0] = "namedObject";  strvals[0][1] = NULL;  strvals[1][0] = gr->gr_name;  strvals[1][1] = NULL;  mod[0].mod_values = strvals[0];  mod[0].mod_type = "objectClass";  mod[0].mod_op = LDAP_MOD_ADD;  mod[1].mod_values = strvals[1];  mod[1].mod_type = "cn";  mod[1].mod_op = LDAP_MOD_ADD;  mods[0] = &mod[0];  mods[1] = &mod[1];  mods[2] = NULL;  rc = ldap_add_s (session->ld, groupdn, mods);  if (rc != 0)    {      ldap_delete_s (session->ld, groupdn);      free (groupdn);      return rc;    }#if 0  /* Create nameObject objectClass.  */  strvals[0][0] = "namedObject";  strvals[0][1] = NULL;  mod[0].mod_values = strvals[0];  mod[0].mod_type = "objectClass";  mod[0].mod_op = LDAP_MOD_ADD;  mods[0] = &mod[0];  mods[1] = NULL;  rc = ldap_modify_s (session->ld, groupdn, mods);  if (rc != 0)    {      ldap_delete_s (session->ld, groupdn);      free (groupdn);      return rc;    }#endif  strvals[0][0] = "posixGroup";  strvals[0][1] = NULL;  asprintf (&strvals[2][0], "%u", gr->gr_gid);  strvals[2][1] = NULL;  mod[0].mod_values = strvals[0];  mod[0].mod_type = "objectClass";  mod[0].mod_op = LDAP_MOD_ADD;  mod[1].mod_values = strvals[2];  mod[1].mod_type = "gidNumber";  mod[1].mod_op = LDAP_MOD_ADD;  mods[0] = &mod[0];  mods[1] = &mod[1];  mods[2] = NULL;  rc = ldap_modify_s (session->ld, groupdn, mods);  free (strvals[1][0]);  if (rc != 0)    ldap_delete_s (session->ld, groupdn);  free (groupdn);  return rc;}#endif /* USE_LDAP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -