From dab89acaacfc083b9e1141afd69fa98dfe0e9e39 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Tue, 27 Aug 2013 13:13:34 -0400 Subject: Break out passwd-to-slapi_entry conversion Break out a backend_make_user_entry_from_nsswitch_passwd function for converting a passwd structure to an entry, and rename the helper for groups to match it. --- src/back-sch-nss.c | 125 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/back-sch-nss.c b/src/back-sch-nss.c index 4c8eb0c..fd13c8e 100644 --- a/src/back-sch-nss.c +++ b/src/back-sch-nss.c @@ -178,61 +178,30 @@ backend_build_dn(const char *attribute, const char *value, } static Slapi_Entry * -backend_retrieve_user_entry_from_nsswitch(char *user_name, bool_t is_uid, - char *container_sdn, - struct backend_search_cbdata *cbdata) +backend_make_user_entry_from_nsswitch_passwd(struct passwd *pwd, + char *container_sdn, + struct backend_search_cbdata *cbdata) { - struct passwd pwd, *result; Slapi_Entry *entry; - int rc; + int rc, i; char *name; char *dn = NULL; - char *buf = NULL; #ifdef HAVE_SSS_NSS_IDMAP enum sss_id_type id_type; char *sid_str; #endif -repeat: - if (cbdata->nsswitch_buffer == NULL) { - return NULL; - } - - if (is_uid) { - rc = getpwuid_r((uid_t) atoll(user_name), &pwd, - cbdata->nsswitch_buffer, - cbdata->nsswitch_buffer_len, &result); - } else { - rc = getpwnam_r(user_name, &pwd, - cbdata->nsswitch_buffer, - cbdata->nsswitch_buffer_len, &result); - } - if ((result == NULL) || (rc != 0)) { - if (rc == ERANGE) { - buf = realloc(cbdata->nsswitch_buffer, cbdata->nsswitch_buffer_len * 2); - if (buf != NULL) { - cbdata->nsswitch_buffer = buf; - goto repeat; - } - } - return NULL; - } - - if (pwd.pw_uid < cbdata->nsswitch_min_id) { - return NULL; - } - entry = slapi_entry_alloc(); if (entry == NULL) { return NULL; } - dn = backend_build_dn("uid", pwd.pw_name, container_sdn); + dn = backend_build_dn("uid", pwd->pw_name, container_sdn); if (dn == NULL) { slapi_log_error(SLAPI_LOG_FATAL, cbdata->state->plugin_desc->spd_id, "error building DN for uid=%s,%s skipping\n", - pwd.pw_name, container_sdn); + pwd->pw_name, container_sdn); slapi_entry_free(entry); return NULL; } @@ -244,32 +213,32 @@ repeat: slapi_entry_add_string(entry, "objectClass", "extensibleObject"); slapi_entry_add_string(entry, - "uid", pwd.pw_name); + "uid", pwd->pw_name); slapi_entry_attr_set_uint(entry, - "uidNumber", pwd.pw_uid); + "uidNumber", pwd->pw_uid); slapi_entry_attr_set_uint(entry, - "gidNumber", pwd.pw_gid); + "gidNumber", pwd->pw_gid); slapi_entry_add_string(entry, - "gecos", pwd.pw_gecos); - if (strlen(pwd.pw_gecos) > 0) { + "gecos", pwd->pw_gecos); + if (strlen(pwd->pw_gecos) > 0) { slapi_entry_add_string(entry, - "cn", pwd.pw_gecos); + "cn", pwd->pw_gecos); } else { slapi_entry_add_string(entry, - "cn", pwd.pw_name); + "cn", pwd->pw_name); } slapi_entry_add_string(entry, - "homeDirectory", pwd.pw_dir); - if ((pwd.pw_shell != NULL) && (strlen(pwd.pw_shell) > 0)) { + "homeDirectory", pwd->pw_dir); + if ((pwd->pw_shell != NULL) && (strlen(pwd->pw_shell) > 0)) { slapi_entry_add_string(entry, - "loginShell", pwd.pw_shell); + "loginShell", pwd->pw_shell); } slapi_entry_set_dn(entry, dn); #ifdef HAVE_SSS_NSS_IDMAP - rc = sss_nss_getsidbyid(pwd.pw_uid, &sid_str, &id_type); + rc = sss_nss_getsidbyid(pwd->pw_uid, &sid_str, &id_type); if ((rc == 0) && (sid_str != NULL)) { slapi_entry_add_string(entry, "ipaNTSecurityIdentifier", sid_str); free(sid_str); @@ -280,9 +249,55 @@ repeat: } static Slapi_Entry * -backend_retrieve_group_entry_from_nsswitch_helper(struct group *grp, - char *container_sdn, - struct backend_search_cbdata *cbdata) +backend_retrieve_user_entry_from_nsswitch(char *user_name, bool_t is_uid, + char *container_sdn, + struct backend_search_cbdata *cbdata) +{ + struct passwd pwd, *result; + Slapi_Entry *entry; + int rc; + char *name; + char *buf = NULL; + +repeat: + if (cbdata->nsswitch_buffer == NULL) { + return NULL; + } + + if (is_uid) { + rc = getpwuid_r((uid_t) atoll(user_name), &pwd, + cbdata->nsswitch_buffer, + cbdata->nsswitch_buffer_len, &result); + } else { + rc = getpwnam_r(user_name, &pwd, + cbdata->nsswitch_buffer, + cbdata->nsswitch_buffer_len, &result); + } + if ((result == NULL) || (rc != 0)) { + if (rc == ERANGE) { + buf = realloc(cbdata->nsswitch_buffer, cbdata->nsswitch_buffer_len * 2); + if (buf != NULL) { + cbdata->nsswitch_buffer = buf; + goto repeat; + } + } + return NULL; + } + + if (pwd.pw_uid < cbdata->nsswitch_min_id) { + return NULL; + } + + entry = backend_make_user_entry_from_nsswitch_passwd(&pwd, container_sdn, + cbdata); + + return entry; +} + +static Slapi_Entry * +backend_make_group_entry_from_nsswitch_group(struct group *grp, + char *container_sdn, + struct backend_search_cbdata *cbdata) { Slapi_Entry *entry; int rc, i; @@ -376,8 +391,8 @@ repeat: return NULL; } - entry = backend_retrieve_group_entry_from_nsswitch_helper(&grp, container_sdn, - cbdata); + entry = backend_make_group_entry_from_nsswitch_group(&grp, container_sdn, + cbdata); return entry; } @@ -416,8 +431,8 @@ repeat: return NULL; } - entry = backend_retrieve_group_entry_from_nsswitch_helper(&grp, container_sdn, - cbdata); + entry = backend_make_group_entry_from_nsswitch_group(&grp, container_sdn, + cbdata); return entry; } -- cgit