diff options
author | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-22 15:04:40 -0500 |
---|---|---|
committer | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-22 15:04:40 -0500 |
commit | 760a6e9b7243834bfa30d6b2ac04fabf5d99cb65 (patch) | |
tree | 9bc96caec673f8bd7ef0ca4ba4f445ec3a522018 | |
parent | e5d73bacd1db958ffe62f8d3a09d085929d0cbdc (diff) | |
download | slapi-nis-760a6e9b7243834bfa30d6b2ac04fabf5d99cb65.tar.gz slapi-nis-760a6e9b7243834bfa30d6b2ac04fabf5d99cb65.tar.xz slapi-nis-760a6e9b7243834bfa30d6b2ac04fabf5d99cb65.zip |
- use the filter at the right point in walking a chain
- add a test for deref_rf
-rw-r--r-- | src/format.c | 40 | ||||
-rwxr-xr-x | tests/test24-schema-compat/after.sh | 8 | ||||
-rw-r--r-- | tests/test24-schema-compat/after.txt | 63 | ||||
-rwxr-xr-x | tests/test24-schema-compat/before.sh | 8 | ||||
-rw-r--r-- | tests/test24-schema-compat/before.txt | 60 | ||||
-rwxr-xr-x | tests/test24-schema-compat/change.sh | 9 | ||||
-rw-r--r-- | tests/test24-schema-compat/change.txt | 2 | ||||
-rw-r--r-- | tests/test24-schema-compat/description.txt | 1 | ||||
-rw-r--r-- | tests/test24-schema-compat/dse.ldif | 40 | ||||
-rw-r--r-- | tests/test24-schema-compat/userRoot.ldif | 75 |
10 files changed, 303 insertions, 3 deletions
diff --git a/src/format.c b/src/format.c index 4e0b2c9..c7681c3 100644 --- a/src/format.c +++ b/src/format.c @@ -181,6 +181,34 @@ format_add_sdn_list(struct slapi_dn ***list, const char *dn) return *list; } +static int +format_check_entry(const char *dn, char *filter, void *identity) +{ + Slapi_DN *sdn; + Slapi_Entry *entry; + sdn = slapi_sdn_new_dn_byval(dn); + entry = NULL; + wrap_search_internal_get_entry(sdn, filter, NULL, &entry, identity); + slapi_sdn_free(&sdn); + if (entry != NULL) { + slapi_entry_free(entry); + return 0; + } else { + return ENOENT; + } +} + +static struct slapi_dn ** +format_add_filtered_sdn_list(struct slapi_dn ***list, const char *dn, + char *filter, void *identity) +{ + if (format_check_entry(dn, filter, identity) == 0) { + return format_add_sdn_list(list, dn); + } else { + return *list; + } +} + /* Maintain a reference attribute list, which is group of lists of attribute * names, filters, and search bases. */ void @@ -1056,7 +1084,7 @@ format_deref_rx(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, /* Pull up the named entry. */ entry = NULL; wrap_search_internal_get_entry(these[j], - list->links[i].filter_str, + NULL, attrs, &entry, state->plugin_identity); if (entry == NULL) { @@ -1099,10 +1127,16 @@ format_deref_rx(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } /* Let's visit the named entry this * time, in case we're nesting. */ - format_add_sdn_list(&these, cvalue); + format_add_filtered_sdn_list(&these, + cvalue, + list->links[i + 1].filter_str, + state->plugin_identity); /* We need to visit the named entry * next time. */ - format_add_sdn_list(&next, cvalue); + format_add_filtered_sdn_list(&next, + cvalue, + list->links[i + 1].filter_str, + state->plugin_identity); } else { /* Get the value. */ bval = slapi_value_get_berval(value); diff --git a/tests/test24-schema-compat/after.sh b/tests/test24-schema-compat/after.sh new file mode 100755 index 0000000..cd525e5 --- /dev/null +++ b/tests/test24-schema-compat/after.sh @@ -0,0 +1,8 @@ +#!/bin/sh +tmpfile=`mktemp ${TMP:-/tmp}/ldifXXXXXX` +if test -z "$tmpfile" ; then + echo error creating temporary file +fi +trap 'rm -f "$tmpfile"' EXIT +search -b cn=compat,dc=example,dc=com > $tmpfile +$LDIFSORT $tmpfile diff --git a/tests/test24-schema-compat/after.txt b/tests/test24-schema-compat/after.txt new file mode 100644 index 0000000..668f97c --- /dev/null +++ b/tests/test24-schema-compat/after.txt @@ -0,0 +1,63 @@ +dn: cn=compat, dc=example, dc=com +objectClass: extensibleObject +cn: compat + +dn: cn=g1,ou=deepgroups,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1001 +memberUid: tuser1 +memberUid: tuser3 +cn: g1 + +dn: cn=g1,ou=groupmembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: groupOfNames +objectClass: top +gidNumber: 1001 +cn: g1 + +dn: cn=g1,ou=usermembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1001 +memberUid: tuser1 +memberUid: tuser3 +cn: g1 + +dn: cn=g2,ou=deepgroups,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1002 +memberUid: tuser2 +memberUid: tuser1 +memberUid: tuser3 +cn: g2 + +dn: cn=g2,ou=groupmembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: groupOfNames +objectClass: top +gidNumber: 1002 +memberUid: @g1 +cn: g2 + +dn: cn=g2,ou=usermembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1002 +memberUid: tuser2 +cn: g2 + +dn: ou=deepgroups,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: deepgroups + +dn: ou=groupmembers,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: groupmembers + +dn: ou=usermembers,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: usermembers + diff --git a/tests/test24-schema-compat/before.sh b/tests/test24-schema-compat/before.sh new file mode 100755 index 0000000..cd525e5 --- /dev/null +++ b/tests/test24-schema-compat/before.sh @@ -0,0 +1,8 @@ +#!/bin/sh +tmpfile=`mktemp ${TMP:-/tmp}/ldifXXXXXX` +if test -z "$tmpfile" ; then + echo error creating temporary file +fi +trap 'rm -f "$tmpfile"' EXIT +search -b cn=compat,dc=example,dc=com > $tmpfile +$LDIFSORT $tmpfile diff --git a/tests/test24-schema-compat/before.txt b/tests/test24-schema-compat/before.txt new file mode 100644 index 0000000..30305d0 --- /dev/null +++ b/tests/test24-schema-compat/before.txt @@ -0,0 +1,60 @@ +dn: cn=compat, dc=example, dc=com +objectClass: extensibleObject +cn: compat + +dn: cn=g1,ou=deepgroups,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1001 +memberUid: tuser1 +cn: g1 + +dn: cn=g1,ou=groupmembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: groupOfNames +objectClass: top +gidNumber: 1001 +cn: g1 + +dn: cn=g1,ou=usermembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1001 +memberUid: tuser1 +cn: g1 + +dn: cn=g2,ou=deepgroups,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1002 +memberUid: tuser2 +memberUid: tuser1 +cn: g2 + +dn: cn=g2,ou=groupmembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: groupOfNames +objectClass: top +gidNumber: 1002 +memberUid: @g1 +cn: g2 + +dn: cn=g2,ou=usermembers,cn=compat,dc=example,dc=com +objectClass: posixGroup +objectClass: top +gidNumber: 1002 +memberUid: tuser2 +cn: g2 + +dn: ou=deepgroups,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: deepgroups + +dn: ou=groupmembers,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: groupmembers + +dn: ou=usermembers,cn=compat, dc=example, dc=com +objectClass: extensibleObject +ou: usermembers + diff --git a/tests/test24-schema-compat/change.sh b/tests/test24-schema-compat/change.sh new file mode 100755 index 0000000..9016927 --- /dev/null +++ b/tests/test24-schema-compat/change.sh @@ -0,0 +1,9 @@ +#!/bin/sh +modify << EOF +dn: cn=g1,cn=groups,cn=accounts,dc=example,dc=com +changetype: modify +add: member +member: uid=tuser3,cn=users,cn=accounts,dc=example,dc=com +- + +EOF diff --git a/tests/test24-schema-compat/change.txt b/tests/test24-schema-compat/change.txt new file mode 100644 index 0000000..5dd828a --- /dev/null +++ b/tests/test24-schema-compat/change.txt @@ -0,0 +1,2 @@ +modifying entry "cn=g1,cn=groups,cn=accounts,dc=example,dc=com" + diff --git a/tests/test24-schema-compat/description.txt b/tests/test24-schema-compat/description.txt new file mode 100644 index 0000000..f3e2db7 --- /dev/null +++ b/tests/test24-schema-compat/description.txt @@ -0,0 +1 @@ +deref_rf, with update checking diff --git a/tests/test24-schema-compat/dse.ldif b/tests/test24-schema-compat/dse.ldif new file mode 100644 index 0000000..02a8e88 --- /dev/null +++ b/tests/test24-schema-compat/dse.ldif @@ -0,0 +1,40 @@ +dn: ou=deepgroups, cn=Schema Compatibility, cn=plugins, cn=config +objectClass: top +objectClass: extensibleObject +ou: deepgroups +schema-compat-container-group: cn=compat, dc=example, dc=com +schema-compat-container-rdn: ou=deepgroups +schema-compat-search-base: cn=Groups, cn=Accounts, dc=example, dc=com +schema-compat-search-filter: objectclass=posixGroup +schema-compat-entry-rdn: cn=%{cn} +schema-compat-entry-attribute: objectclass=posixGroup +schema-compat-entry-attribute: gidNumber=%{gidNumber} +schema-compat-entry-attribute: memberUid=%deref_r("member","uid") + +dn: ou=usermembers, cn=Schema Compatibility, cn=plugins, cn=config +objectClass: top +objectClass: extensibleObject +ou: usermembers +schema-compat-container-group: cn=compat, dc=example, dc=com +schema-compat-container-rdn: ou=usermembers +schema-compat-search-base: cn=Groups, cn=Accounts, dc=example, dc=com +schema-compat-search-filter: objectclass=posixGroup +schema-compat-entry-rdn: cn=%{cn} +schema-compat-entry-attribute: objectclass=posixGroup +schema-compat-entry-attribute: gidNumber=%{gidNumber} +schema-compat-entry-attribute: memberUid=%deref_rf("member","objectclass=posixaccount","uid") + +dn: ou=groupmembers, cn=Schema Compatibility, cn=plugins, cn=config +objectClass: top +objectClass: extensibleObject +ou: groupmembers +schema-compat-container-group: cn=compat, dc=example, dc=com +schema-compat-container-rdn: ou=groupmembers +schema-compat-search-base: cn=Groups, cn=Accounts, dc=example, dc=com +schema-compat-search-filter: objectclass=posixGroup +schema-compat-entry-rdn: cn=%{cn} +schema-compat-entry-attribute: objectclass=posixGroup +schema-compat-entry-attribute: objectclass=groupOfNames +schema-compat-entry-attribute: gidNumber=%{gidNumber} +schema-compat-entry-attribute: memberUid=@%deref_rf("member","objectclass=posixgroup","cn") + diff --git a/tests/test24-schema-compat/userRoot.ldif b/tests/test24-schema-compat/userRoot.ldif new file mode 100644 index 0000000..698fd12 --- /dev/null +++ b/tests/test24-schema-compat/userRoot.ldif @@ -0,0 +1,75 @@ +# users, accounts, example.com +dn: cn=users,cn=accounts,dc=example,dc=com +objectClass: top +objectClass: nsContainer +cn: users + +# groups, accounts, example.com +dn: cn=groups,cn=accounts,dc=example,dc=com +objectClass: top +objectClass: nsContainer +cn: groups + +# tuser1, users, accounts, example.com +dn: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com +uid: tuser1 +objectClass: top +objectClass: person +objectClass: posixAccount +loginShell: /bin/sh +gidNumber: 1003 +gecos: tuser1 +sn: User +homeDirectory: /home/tuser1 +cn: Tim User +uidNumber: 1101 + +# tuser2, users, accounts, example.com +dn: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com +uid: tuser2 +objectClass: top +objectClass: person +objectClass: posixAccount +loginShell: /bin/sh +gidNumber: 1004 +gecos: tuser2 +sn: User +homeDirectory: /home/tuser2 +cn: Timmy User +uidNumber: 1102 + +# tuser3, users, accounts, example.com +dn: uid=tuser3,cn=users,cn=accounts,dc=example,dc=com +uid: tuser3 +objectClass: top +objectClass: person +objectClass: posixAccount +loginShell: /bin/sh +gidNumber: 1004 +gecos: tuser3 +sn: User +homeDirectory: /home/tuser3 +cn: Timothy User +uidNumber: 1103 + +# g1, groups, accounts, example.com +dn: cn=g1,cn=groups,cn=accounts,dc=example,dc=com +objectClass: top +objectClass: groupofnames +objectClass: posixGroup +gidNumber: 1001 +cn: g1 +description: g1 +member: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com + +# g2, groups, accounts, example.com +dn: cn=g2,cn=groups,cn=accounts,dc=example,dc=com +objectClass: top +objectClass: groupofnames +objectClass: posixGroup +gidNumber: 1002 +cn: g2 +description: g2 +member: cn=g1,cn=groups,cn=accounts,dc=example,dc=com +member: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com + |