xref: /netbsd-src/external/bsd/openldap/dist/tests/scripts/test052-memberof (revision c2f76ff004a2cb67efe5b12d97bd3ef7fe89e18d)
1#! /bin/sh
2# OpenLDAP: pkg/ldap/tests/scripts/test052-memberof,v 1.4.2.6 2010/04/19 19:14:36 quanah Exp
3## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4##
5## Copyright 1998-2010 The OpenLDAP Foundation.
6## All rights reserved.
7##
8## Redistribution and use in source and binary forms, with or without
9## modification, are permitted only as authorized by the OpenLDAP
10## Public License.
11##
12## A copy of this license is available in the file LICENSE in the
13## top-level directory of the distribution or, alternatively, at
14## <http://www.OpenLDAP.org/license.html>.
15
16echo "running defines.sh"
17. $SRCDIR/scripts/defines.sh
18
19if test $MEMBEROF = memberofno; then
20	echo "Memberof overlay not available, test skipped"
21	exit 0
22fi
23
24mkdir -p $TESTDIR $DBDIR1 $TESTDIR/confdir
25
26$SLAPPASSWD -g -n >$CONFIGPWF
27echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf
28
29echo "Starting slapd on TCP/IP port $PORT1..."
30. $CONFFILTER $BACKEND $MONITORDB < $NAKEDCONF > $CONF1
31$SLAPD -f $CONF1 -F $TESTDIR/confdir -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
32PID=$!
33if test $WAIT != 0 ; then
34    echo PID $PID
35    read foo
36fi
37KILLPIDS="$PID"
38
39sleep 1
40for i in 0 1 2 3 4 5; do
41	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
42		'objectclass=*' > /dev/null 2>&1
43	RC=$?
44	if test $RC = 0 ; then
45		break
46	fi
47	echo "Waiting 5 seconds for slapd to start..."
48	sleep 5
49done
50if test $RC != 0 ; then
51	echo "ldapsearch failed ($RC)!"
52	test $KILLSERVERS != no && kill -HUP $KILLPIDS
53	exit $RC
54fi
55
56cat /dev/null > $TESTOUT
57
58if [ "$MEMBEROF" = memberofmod ]; then
59	echo "Inserting memberof overlay on producer..."
60	$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
61dn: cn=module,cn=config
62objectClass: olcModuleList
63cn: module
64olcModulePath: ../servers/slapd/overlays
65olcModuleLoad: memberof.la
66EOF
67	RC=$?
68	if test $RC != 0 ; then
69		echo "ldapadd failed for moduleLoad ($RC)!"
70		test $KILLSERVERS != no && kill -HUP $KILLPIDS
71		exit $RC
72	fi
73fi
74
75bdbInclude="# " nullExclude=""
76case $BACKEND in
77bdb | hdb) bdbInclude="" ;;
78null) nullExclude="# " ;;
79esac
80
81echo "Running ldapadd to build slapd config database..."
82$LDAPADD -h $LOCALHOST -p $PORT1 -D 'cn=config' -w `cat $CONFIGPWF` \
83	>> $TESTOUT 2>&1 <<EOF
84dn: cn=symas group example,cn=schema,cn=config
85objectClass: olcSchemaConfig
86cn: symas group example
87olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.1 
88 NAME 'memberA' SUP distinguishedName )
89olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.2
90 NAME 'memberOfA' SUP distinguishedName )
91olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.3 
92 NAME 'memberB' SUP distinguishedName )
93olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.4 
94 NAME 'memberOfB' SUP distinguishedName )
95olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.1 
96 NAME 'groupA' SUP top STRUCTURAL MUST cn MAY memberA )
97olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.2 
98 NAME 'groupMemberA' SUP top AUXILIARY MAY memberOfA )
99olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.3 
100 NAME 'groupB' SUP top STRUCTURAL MUST cn MAY memberB )
101olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.4 
102 NAME 'groupMemberB' SUP top AUXILIARY MAY memberOfB )
103
104dn: olcDatabase={1}$BACKEND,cn=config
105objectClass: olcDatabaseConfig
106${nullExclude}objectClass: olc${BACKEND}Config
107olcDatabase: {1}$BACKEND
108olcSuffix: $BASEDN
109olcRootDN: cn=Manager,$BASEDN
110olcRootPW:: c2VjcmV0
111olcMonitoring: TRUE
112${nullExclude}olcDbDirectory: $TESTDIR/db.1.a/
113${bdbInclude}olcDbCacheSize: 1000
114${bdbInclude}olcDbIndex: objectClass eq
115${bdbInclude}olcDbIndex: cn pres,eq,sub
116${bdbInclude}olcDbIndex: uid pres,eq,sub
117${bdbInclude}olcDbIndex: sn pres,eq,sub
118${bdbInclude}olcDbMode: 384"
119
120dn: olcOverlay={0}memberof,olcDatabase={1}$BACKEND,cn=config
121objectClass: olcOverlayConfig
122objectClass: olcMemberOf
123olcOverlay: {0}memberof
124olcMemberOfRefInt: TRUE
125olcMemberOfGroupOC: groupOfNames
126olcMemberOfMemberAD: member
127olcMemberOfMemberOfAD: memberOf
128
129dn: olcOverlay={1}memberof,olcDatabase={1}$BACKEND,cn=config
130objectClass: olcOverlayConfig
131objectClass: olcMemberOf
132olcOverlay: {1}memberof
133olcMemberOfRefInt: TRUE
134olcMemberOfGroupOC: groupA
135olcMemberOfMemberAD: memberA
136olcMemberOfMemberOfAD: memberOfA
137
138dn: olcOverlay={2}memberof,olcDatabase={1}$BACKEND,cn=config
139objectClass: olcOverlayConfig
140objectClass: olcMemberOf
141olcOverlay: {2}memberof
142olcMemberOfRefInt: TRUE
143olcMemberOfGroupOC: groupB
144olcMemberOfMemberAD: memberB
145olcMemberOfMemberOfAD: memberOfB
146
147EOF
148RC=$?
149if test $RC != 0 ; then
150	echo "ldapadd failed ($RC)!"
151	test $KILLSERVERS != no && kill -HUP $KILLPIDS
152	exit $RC
153fi
154
155echo "Running ldapadd to build slapd database..."
156$LDAPADD -h $LOCALHOST -p $PORT1 \
157	-D "cn=Manager,$BASEDN" -w secret \
158	>> $TESTOUT 2>&1 << EOF
159dn: $BASEDN
160objectClass: organization
161objectClass: dcObject
162o: Example, Inc.
163dc: example
164
165dn: ou=People,$BASEDN
166objectClass: organizationalUnit
167ou: People
168
169dn: ou=Groups,$BASEDN
170objectClass: organizationalUnit
171ou: Groups
172
173dn: cn=Roger Rabbit,ou=People,$BASEDN
174objectClass: inetOrgPerson
175cn: Roger Rabbit
176sn: Rabbit
177
178dn: cn=Baby Herman,ou=People,$BASEDN
179objectClass: inetOrgPerson
180cn: Baby Herman
181sn: Herman
182
183dn: cn=Cartoonia,ou=Groups,$BASEDN
184objectClass: groupOfNames
185cn: Cartoonia
186member: cn=Roger Rabbit,ou=People,$BASEDN
187member: cn=Baby Herman,ou=People,$BASEDN
188EOF
189RC=$?
190if test $RC != 0 ; then
191	echo "ldapadd failed ($RC)!"
192	test $KILLSERVERS != no && kill -HUP $KILLPIDS
193	exit $RC
194fi
195
196echo "Search the entire database..."
197echo "# Search the entire database..." >> $SEARCHOUT
198$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
199	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
200RC=$?
201if test $RC != 0 ; then
202	echo "ldapsearch failed ($RC)!"
203	test $KILLSERVERS != no && kill -HUP $KILLPIDS
204	exit $RC
205fi
206
207echo "Running ldapmodify to add a member..."
208$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
209	-D "cn=Manager,$BASEDN" -w secret \
210	>> $TESTOUT 2>&1 << EOF
211dn: cn=Jessica Rabbit,ou=People,$BASEDN
212changetype: add
213objectClass: inetOrgPerson
214cn: Jessica Rabbit
215sn: Rabbit
216
217dn: cn=Cartoonia,ou=Groups,$BASEDN
218changetype: modify
219add: member
220member: cn=Jessica Rabbit,ou=People,$BASEDN
221EOF
222
223echo "Re-search the entire database..."
224echo "# Re-search the entire database..." >> $SEARCHOUT
225$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
226	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
227RC=$?
228if test $RC != 0 ; then
229	echo "ldapsearch failed ($RC)!"
230	test $KILLSERVERS != no && kill -HUP $KILLPIDS
231	exit $RC
232fi
233
234echo "Running ldapmodify to add self..."
235$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
236	-D "cn=Manager,$BASEDN" -w secret \
237	>> $TESTOUT 2>&1 << EOF
238dn: cn=Cartoonia,ou=Groups,$BASEDN
239changetype: modify
240add: member
241member: cn=Cartoonia,ou=Groups,$BASEDN
242EOF
243
244echo "Re-search the entire database..."
245echo "# Re-search the entire database..." >> $SEARCHOUT
246$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
247	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
248RC=$?
249if test $RC != 0 ; then
250	echo "ldapsearch failed ($RC)!"
251	test $KILLSERVERS != no && kill -HUP $KILLPIDS
252	exit $RC
253fi
254
255echo "Running ldapdelete to remove a member..."
256$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
257	-D "cn=Manager,$BASEDN" -w secret \
258	>> $TESTOUT 2>&1 << EOF
259dn: cn=Baby Herman,ou=People,$BASEDN
260changetype: delete
261EOF
262
263echo "Re-search the entire database..."
264echo "# Re-search the entire database..." >> $SEARCHOUT
265$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
266	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
267RC=$?
268if test $RC != 0 ; then
269	echo "ldapsearch failed ($RC)!"
270	test $KILLSERVERS != no && kill -HUP $KILLPIDS
271	exit $RC
272fi
273
274echo "Adding groups with MAY member type schemas..."
275$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
276	-D "cn=Manager,$BASEDN" -w secret \
277	>> $TESTOUT 2>&1 <<EOF
278dn: cn=Roger Rabbit,ou=People,$BASEDN
279changetype: delete
280
281dn: cn=Jessica Rabbit,ou=People,$BASEDN
282changetype: delete
283
284dn: cn=Cartoonia,ou=Groups,$BASEDN
285changetype: delete
286
287dn: cn=person1,ou=People,$BASEDN
288changetype: add
289objectClass: person
290objectClass: groupMemberA
291objectClass: groupMemberB
292cn: person1
293sn: person1
294
295dn: cn=person2,ou=People,$BASEDN
296changetype: add
297objectClass: person
298objectClass: groupMemberA
299objectClass: groupMemberB
300cn: person2
301sn: person2
302
303dn: cn=group1,ou=Groups,$BASEDN
304changetype: add
305objectclass: groupA
306cn: group1
307memberA: cn=person1,ou=People,$BASEDN
308memberA: cn=person2,ou=People,$BASEDN
309
310dn: cn=group2,ou=Groups,$BASEDN
311changetype: add
312objectclass: groupB
313cn: group2
314memberB: cn=person1,ou=People,$BASEDN
315memberB: cn=person2,ou=People,$BASEDN
316
317dn: cn=group1,ou=Groups,$BASEDN
318changetype: modify
319delete: memberA
320
321EOF
322
323echo "Re-search the entire database..."
324echo "# Re-search the entire database..." >> $SEARCHOUT
325$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
326	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
327RC=$?
328if test $RC != 0 ; then
329	echo "ldapsearch failed ($RC)!"
330	test $KILLSERVERS != no && kill -HUP $KILLPIDS
331	exit $RC
332fi
333
334test $KILLSERVERS != no && kill -HUP $KILLPIDS
335
336LDIF=$MEMBEROFOUT
337
338echo "Filtering ldapsearch results..."
339$LDIFFILTER < $SEARCHOUT > $SEARCHFLT
340echo "Filtering original ldif used to create database..."
341$LDIFFILTER < $LDIF > $LDIFFLT
342echo "Comparing filter output..."
343$CMP $SEARCHFLT $LDIFFLT > $CMPOUT
344
345if test $? != 0 ; then
346	echo "Comparison failed"
347	exit 1
348fi
349
350echo ">>>>> Test succeeded"
351
352test $KILLSERVERS != no && wait
353
354exit 0
355