File: /usr/ports/net/yptransitd/files/patch-src_modules_ldap_cache.c
--- src/modules/ldap/cache.c.orig 2001-10-09 02:34:51 UTC
+++ src/modules/ldap/cache.c
@@ -278,8 +278,8 @@ int assemble_passwd(valdat *val, LDAPMes
} else
if(!strcasecmp(attr, "userpassword"))
{
- pwinfo->userpassword = fix_password(values);
- pwinfo->size += strlen(pwinfo->userpassword);
+ pwinfo->userpassword = safe_strdup("*");
+ pwinfo->size += strlen("*");
} else
if(!strcasecmp(attr, "uidnumber"))
{
@@ -322,6 +322,73 @@ int assemble_passwd(valdat *val, LDAPMes
return (rval);
}
+int assemble_master_passwd(valdat *val, LDAPMessage *user, struct pwinfo *pwinfo)
+{
+ ypstat rval;
+ char *attr;
+ BerElement *ber = NULL;
+
+ rval = YP_YPERR;
+ fill_pwinfo(pwinfo);
+
+ for (attr = ldap_first_attribute (ldaprefs.ldap, user, &ber); attr; attr = ldap_next_attribute (ldaprefs.ldap, user, ber))
+ {
+ char **values;
+
+ values = ldap_get_values (ldaprefs.ldap, user, attr);
+ if (values)
+ {
+ if(!strcasecmp(attr, "uid"))
+ {
+ pwinfo->uid = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ } else
+ if(!strcasecmp(attr, "userpassword"))
+ {
+ pwinfo->userpassword = fix_password(values);
+ pwinfo->size += strlen(pwinfo->userpassword);
+ } else
+ if(!strcasecmp(attr, "uidnumber"))
+ {
+ pwinfo->uidnumber = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ } else
+ if(!strcasecmp(attr, "gidnumber"))
+ {
+ pwinfo->gidnumber = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ } else
+ if(!strcasecmp(attr, "gecos"))
+ {
+ pwinfo->gecos = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ } else
+ if(!strcasecmp(attr, "homedirectory"))
+ {
+ pwinfo->homedirectory = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ } else
+ if(!strcasecmp(attr, "loginshell"))
+ {
+ pwinfo->loginshell = safe_strdup(values[0]);
+ pwinfo->size += strlen(values[0]);
+ }
+ ldap_value_free(values);
+ }
+ }
+ if (check_pwinfo(pwinfo) == YP_TRUE)
+ {
+ val->valdat_len = pwinfo->size + MPWLINE_SIZE;
+ val->valdat_val = safe_malloc(val->valdat_len + 1);
+ sprintf(val->valdat_val, MPWLINE, pwinfo->uid, pwinfo->userpassword, pwinfo->uidnumber, pwinfo->gidnumber, pwinfo->gecos, pwinfo->homedirectory, pwinfo->loginshell);
+ rval = YP_TRUE;
+ } else {
+ rval = YP_NOKEY;
+ }
+
+ return (rval);
+}
+
int assemble_group(valdat *val, LDAPMessage *group, struct gwinfo *gwinfo)
{
ypstat rval;
@@ -452,7 +519,7 @@ struct mapcache *create_cache (ypmaplist
valdat *val;
int rval;
- (void *) mapcache_current = (void *) mapcache_head = (void *) ldapreturn = (void *) record = NULL;
+ mapcache_current = mapcache_head = ldapreturn = record = NULL;
val = safe_malloc(sizeof(valdat));
for(maplist_current = maps; maplist_current; maplist_current = maplist_current->next)
@@ -538,6 +605,80 @@ struct mapcache *create_cache (ypmaplist
free(filter);
free(base);
}
+ else if (!strcmp((char *) mapcache_current->map, "master.passwd.byname"))
+ {
+ /* XXX Add preferences for filter and basedn */
+ base = safe_malloc(strlen(ldaprefs.basedn) + strlen("ou=Staffs,") + 1);
+ sprintf(base, "%s%s", "ou=Staffs,", ldaprefs.basedn);
+ filter = safe_strdup("(objectClass=posixAccount)");
+
+ if(ldap_search_s(ldaprefs.ldap,
+ base,
+ LDAP_SCOPE_ONELEVEL,
+ filter,
+ user_attributes,
+ 0,
+ &ldapreturn) != -1)
+ {
+ for (record = ldap_first_entry(ldaprefs.ldap, ldapreturn); record; record = ldap_next_entry(ldaprefs.ldap, record))
+ {
+ pwinfo = safe_malloc(sizeof(struct pwinfo));
+ rval = assemble_master_passwd(val, record, pwinfo);
+ if(rval == YP_TRUE);
+ {
+ if(check_unique(mapcache_current, pwinfo->uid) == YP_NOKEY)
+ {
+ mapentry_current = safe_malloc(sizeof(struct mapentry));
+ mapentry_current->key = safe_strdup(pwinfo->uid);
+ mapentry_current->val = val->valdat_val;
+ mapentry_current->next = mapcache_current->mapentry;
+ mapcache_current->mapentry = mapentry_current;
+ }
+ }
+ clean_pwinfo(pwinfo);
+ }
+ }
+ ldap_msgfree(ldapreturn);
+ free(filter);
+ free(base);
+ }
+ else if (!strcmp((char *) mapcache_current->map, "master.passwd.byuid"))
+ {
+ /* XXX Add preferences for filter and basedn */
+ base = safe_malloc(strlen(ldaprefs.basedn) + strlen("ou=Staffs,") + 1);
+ sprintf(base, "%s%s", "ou=Staffs,", ldaprefs.basedn);
+ filter = safe_strdup("(objectClass=posixAccount)");
+
+ if(ldap_search_s(ldaprefs.ldap,
+ base,
+ LDAP_SCOPE_ONELEVEL,
+ filter,
+ user_attributes,
+ 0,
+ &ldapreturn) != -1)
+ {
+ for (record = ldap_first_entry(ldaprefs.ldap, ldapreturn); record; record = ldap_next_entry(ldaprefs.ldap, record))
+ {
+ pwinfo = safe_malloc(sizeof(struct pwinfo));
+ rval = assemble_master_passwd(val, record, pwinfo);
+ if(rval == YP_TRUE);
+ {
+ if(check_unique(mapcache_current, pwinfo->uidnumber) == YP_NOKEY)
+ {
+ mapentry_current = safe_malloc(sizeof(struct mapentry));
+ mapentry_current->key = safe_strdup(pwinfo->uidnumber);
+ mapentry_current->val = val->valdat_val;
+ mapentry_current->next = mapcache_current->mapentry;
+ mapcache_current->mapentry = mapentry_current;
+ }
+ }
+ clean_pwinfo(pwinfo);
+ }
+ }
+ ldap_msgfree(ldapreturn);
+ free(filter);
+ free(base);
+ }
else if (!strcmp((char *) mapcache_current->map, "group.byname"))
{
/* XXX Add preferences for filter and basedn */