summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2010-11-22 15:04:40 -0500
committerNalin Dahyabhai <nalin@redhat.com>2010-11-22 15:04:40 -0500
commit760a6e9b7243834bfa30d6b2ac04fabf5d99cb65 (patch)
tree9bc96caec673f8bd7ef0ca4ba4f445ec3a522018
parente5d73bacd1db958ffe62f8d3a09d085929d0cbdc (diff)
downloadslapi-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.c40
-rwxr-xr-xtests/test24-schema-compat/after.sh8
-rw-r--r--tests/test24-schema-compat/after.txt63
-rwxr-xr-xtests/test24-schema-compat/before.sh8
-rw-r--r--tests/test24-schema-compat/before.txt60
-rwxr-xr-xtests/test24-schema-compat/change.sh9
-rw-r--r--tests/test24-schema-compat/change.txt2
-rw-r--r--tests/test24-schema-compat/description.txt1
-rw-r--r--tests/test24-schema-compat/dse.ldif40
-rw-r--r--tests/test24-schema-compat/userRoot.ldif75
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
+