diff options
author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2009-05-07 16:24:27 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2009-05-07 16:24:27 -0400 |
commit | 1066dffe368e20ae43b1e6191a9138598da4f816 (patch) | |
tree | 172df0a0fd544255c6646c166ab85c967c56dd19 | |
parent | ebd466d34ccd21f4d47246d2f831c00cf4bde9d4 (diff) | |
download | slapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.tar.gz slapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.tar.xz slapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.zip |
- make sure that %referred() and %deref() don't return empty strings
-rw-r--r-- | doc/format-specifiers.txt | 3 | ||||
-rw-r--r-- | src/format.c | 18 | ||||
-rwxr-xr-x | tests/test32-nis-empty/before.sh | 8 | ||||
-rw-r--r-- | tests/test32-nis-empty/before.txt | 17 | ||||
-rw-r--r-- | tests/test32-nis-empty/description.txt | 1 | ||||
-rw-r--r-- | tests/test32-nis-empty/dse.ldif | 22 | ||||
-rw-r--r-- | tests/test32-nis-empty/userRoot.ldif | 28 |
7 files changed, 88 insertions, 9 deletions
diff --git a/doc/format-specifiers.txt b/doc/format-specifiers.txt index 437f11f..c9cd87d 100644 --- a/doc/format-specifiers.txt +++ b/doc/format-specifiers.txt @@ -335,7 +335,7 @@ here (except for ''VALUEATTRIBUTE'') should be indexed. merge(''SEPARATOR'',''EXPRESSION''[,...]) Evaluates and then creates a single value using multiple expressions -which can evaluate to either single values or lists. Any expressions +which may evaluate to either single values or lists. Any expressions which cannot be evaluated are ignored. Here are some example entries: @@ -354,6 +354,7 @@ Here are some example entries: And here's how an example expression evaluates for ''cn=group'': %merge(":","%{membername}","%deref(\"member\",\"uid\")") -> jim:bob:pete + %merge(":","%{madeup}") -> (empty string) === collect === diff --git a/src/format.c b/src/format.c index c32ad83..3cc1b64 100644 --- a/src/format.c +++ b/src/format.c @@ -918,9 +918,9 @@ format_deref(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, if (slapi_vattr_values_get(e, ref_attr, &ref_values, &ref_disposition, &actual_ref_attr, 0, &ref_buffer_flags) != 0) { - /* No references means we're done. */ + /* No references means we're done, no answers to give. */ format_free_parsed_args(argv); - return 0; + return -ENOENT; } /* Retrieve these attributes from the referred-to entries. */ attrs[0] = ref_attr; @@ -1280,7 +1280,7 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, backend_free_set_config(set_bases, set_filter); slapi_pblock_destroy(local_pb); format_free_parsed_args(argv); - return 0; + return -ENOENT; } /* Note that the attribute in this map refers to this entry. */ @@ -1337,16 +1337,18 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } free(filter); + backend_free_set_config(set_bases, set_filter); + slapi_pblock_destroy(local_pb); + format_free_parsed_args(argv); + /* Return any values we found. */ if (cbdata.choices != NULL) { format_add_choice(outbuf_choices, outbuf, cbdata.choices); format_free_bv_list(cbdata.choices); + return 0; + } else { + return -ENOENT; } - - backend_free_set_config(set_bases, set_filter); - slapi_pblock_destroy(local_pb); - format_free_parsed_args(argv); - return 0; } /* Add the name of this entry to the DN list in the cbdata. */ diff --git a/tests/test32-nis-empty/before.sh b/tests/test32-nis-empty/before.sh new file mode 100755 index 0000000..27afbdf --- /dev/null +++ b/tests/test32-nis-empty/before.sh @@ -0,0 +1,8 @@ +#!/bin/sh +echo map list: +$YP maplist example.com +$YP -c maplist example.com +for map in `$YP maplist example.com` ; do + echo contents of example.com:"$map": + $YP cat example.com $map +done diff --git a/tests/test32-nis-empty/before.txt b/tests/test32-nis-empty/before.txt new file mode 100644 index 0000000..6d4b257 --- /dev/null +++ b/tests/test32-nis-empty/before.txt @@ -0,0 +1,17 @@ +map list: +groups +memberships +groups +memberships +contents of example.com:groups: +group1 group1-fake-uid:group1 +group2 group2-fake-uid:group2,group2-fake-uid:group2-alternate-name +group2-alternate-name group2-fake-uid:group2,group2-fake-uid:group2-alternate-name +contents of example.com:memberships: +user1 group1 +user1a +user1b +user1c +user2a +user2b +user2c diff --git a/tests/test32-nis-empty/description.txt b/tests/test32-nis-empty/description.txt new file mode 100644 index 0000000..795f1be --- /dev/null +++ b/tests/test32-nis-empty/description.txt @@ -0,0 +1 @@ +deref() and referred() not returning empties diff --git a/tests/test32-nis-empty/dse.ldif b/tests/test32-nis-empty/dse.ldif new file mode 100644 index 0000000..b371b01 --- /dev/null +++ b/tests/test32-nis-empty/dse.ldif @@ -0,0 +1,22 @@ +dn: nis-domain=example.com+nis-map=groups,cn=NIS Server,cn=plugins,cn=config +objectClass: top +objectClass: extensibleObject +nis-domain: example.com +nis-map: groups +nis-base: cn=Groups1, cn=Accounts, dc=example, dc=com +nis-base: cn=Groups2, cn=Accounts, dc=example, dc=com +nis-filter: objectclass=posixGroup +nis-keys-format: %{cn} +nis-values-format: %merge(",", "%deref(\"member\", \"madeup\")", "%deref(\"madeup\", \"madeup\")", "%{uid}:%{cn}") + +dn: nis-domain=example.com+nis-map=memberships,cn=NIS Server,cn=plugins,cn=config +objectClass: top +objectClass: extensibleObject +nis-domain: example.com +nis-map: memberships +nis-base: cn=Users1, cn=Accounts, dc=example, dc=com +nis-base: cn=Users2, cn=Accounts, dc=example, dc=com +nis-filter: objectclass=posixAccount +nis-keys-format: %{uid} +nis-values-format: %merge(",", "%referred(\"groups\", \"member\", \"cn\")", "%referred(\"groups\", \"member\", \"madeup\")", "%referred(\"groups\", \"madeup\", \"madeup\")", "%referred(\"madeup\", \"madeup\", \"madeup\")") + diff --git a/tests/test32-nis-empty/userRoot.ldif b/tests/test32-nis-empty/userRoot.ldif new file mode 100644 index 0000000..876d6ed --- /dev/null +++ b/tests/test32-nis-empty/userRoot.ldif @@ -0,0 +1,28 @@ +dn: uid=user1, cn=Users1, cn=Accounts, dc=example, dc=com +objectClass: posixAccount +objectClass: inetUser +cn: user1 +uid: user1 +uidNumber: 1001 +gidNumber: 1001 +gecos: User +loginShell: /bin/bash +homeDirectory: /home/user + +dn: cn=group1, cn=Groups1, cn=Accounts, dc=example, dc=com +objectClass: posixgroup +objectClass: extensibleObject +cn: group1 +uid: group1-fake-uid +gidNumber: 1002 +member: uid=user1, cn=Users1, cn=Accounts, dc=example, dc=com + +dn: cn=group2, cn=Groups1, cn=Accounts, dc=example, dc=com +objectClass: posixgroup +objectClass: extensibleObject +cn: group2 +cn: group2-alternate-name +uid: group2-fake-uid +gidNumber: 1003 +member: cn=group1, cn=Groups1, cn=Accounts, dc=example, dc=com + |