Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nslcd/cfg.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2007-02-01 22:51:56 +0100
committerArthur de Jong <arthur@arthurdejong.org>2007-02-01 22:51:56 +0100
commit7e126ec34ee493043efc55971135d7e132e2e175 (patch)
treebf2a764459d1f567e1fe4bf0ae1f0b339c1b0d98 /nslcd/cfg.c
parent20481e8d3b817d2f9c560aaf4a56581325ad1572 (diff)
add new dictionary module and use it for the attribute mapping stuff
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-ldapd@231 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nslcd/cfg.c')
-rw-r--r--nslcd/cfg.c97
1 files changed, 40 insertions, 57 deletions
diff --git a/nslcd/cfg.c b/nslcd/cfg.c
index fabf73f..a9ba6a1 100644
--- a/nslcd/cfg.c
+++ b/nslcd/cfg.c
@@ -178,7 +178,7 @@ static enum nss_status _nss_ldap_init_config(struct ldap_config *result)
{
for (j=0;j<=MAP_MAX;j++)
{
- result->ldc_maps[i][j]=(void *)dict_new();
+ result->ldc_maps[i][j]=dict_new();
if (result->ldc_maps[i][j] == NULL)
return NSS_STATUS_UNAVAIL;
}
@@ -283,66 +283,49 @@ static enum nss_status _nss_ldap_map_put(
const char *from,
const char *to)
{
- struct ldap_datum key, val;
- void **map;
- enum nss_status retv;
-
- switch (type)
+ DICT *map;
+ /* we do some special handling for attribute type mapping to do some
+ basic detection of what kind of LDAP server we're talking to */
+ if (type==MAP_ATTRIBUTE)
+ {
+ /* special handling for attribute mapping */
+ if (strcasecmp(from,"userPassword")==0)
{
- case MAP_ATTRIBUTE:
- /* special handling for attribute mapping */ if (strcmp
- (from,
- "userPassword") == 0)
- {
- if (strcasecmp (to, "userPassword") == 0)
- config->ldc_password_type = LU_RFC2307_USERPASSWORD;
- else if (strcasecmp (to, "authPassword") == 0)
- config->ldc_password_type = LU_RFC3112_AUTHPASSWORD;
- else
- config->ldc_password_type = LU_OTHER_PASSWORD;
- }
- else if (strcmp (from, "shadowLastChange") == 0)
- {
- if (strcasecmp (to, "shadowLastChange") == 0)
- config->ldc_shadow_type = LS_RFC2307_SHADOW;
- else if (strcasecmp (to, "pwdLastSet") == 0)
- config->ldc_shadow_type = LS_AD_SHADOW;
- else
- config->ldc_shadow_type = LS_OTHER_SHADOW;
- }
- break;
- case MAP_OBJECTCLASS:
- case MAP_OVERRIDE:
- case MAP_DEFAULT:
- break;
- default:
- return NSS_STATUS_NOTFOUND;
- break;
+ if (strcasecmp(to,"userPassword")==0)
+ config->ldc_password_type=LU_RFC2307_USERPASSWORD;
+ else if (strcasecmp (to,"authPassword")==0)
+ config->ldc_password_type=LU_RFC3112_AUTHPASSWORD;
+ else
+ config->ldc_password_type=LU_OTHER_PASSWORD;
}
-
- assert (sel <= LM_NONE);
- map = &config->ldc_maps[sel][type];
- assert (*map != NULL);
-
- NSS_LDAP_DATUM_ZERO (&key);
- key.data = (void *) from;
- key.size = strlen (from) + 1;
-
- NSS_LDAP_DATUM_ZERO (&val);
- val.data = (void *) to;
- val.size = strlen (to) + 1;
-
- retv = dict_put (*map, NSS_LDAP_DB_NORMALIZE_CASE, &key, &val);
- if (retv == NSS_STATUS_SUCCESS &&
- (type == MAP_ATTRIBUTE || type == MAP_OBJECTCLASS))
+ else if (strcasecmp(from,"shadowLastChange")==0)
{
- type = (type == MAP_ATTRIBUTE) ? MAP_ATTRIBUTE_REVERSE : MAP_OBJECTCLASS_REVERSE;
- map = &config->ldc_maps[sel][type];
-
- retv = dict_put (*map, NSS_LDAP_DB_NORMALIZE_CASE, &val, &key);
+ if (strcasecmp(to,"shadowLastChange")==0)
+ config->ldc_shadow_type=LS_RFC2307_SHADOW;
+ else if (strcasecmp (to,"pwdLastSet")==0)
+ config->ldc_shadow_type=LS_AD_SHADOW;
+ else
+ config->ldc_shadow_type=LS_OTHER_SHADOW;
}
-
- return retv;
+ }
+ assert(sel <= LM_NONE);
+ map=config->ldc_maps[sel][type];
+ assert(map!=NULL);
+ if (dict_put(map,from,to))
+ return NSS_STATUS_TRYAGAIN;
+ if (type==MAP_ATTRIBUTE)
+ {
+ map = config->ldc_maps[sel][MAP_ATTRIBUTE_REVERSE];
+ if (dict_put(map,to,from))
+ return NSS_STATUS_TRYAGAIN;
+ }
+ else if (type==MAP_OBJECTCLASS)
+ {
+ map = config->ldc_maps[sel][MAP_OBJECTCLASS_REVERSE];
+ if (dict_put(map,to,from))
+ return NSS_STATUS_TRYAGAIN;
+ }
+ return NSS_STATUS_SUCCESS;
}
static enum nss_status do_parse_map_statement(