Home | History | Annotate | Line # | Download | only in scripts
      1 #! /bin/sh
      2 # $OpenLDAP$
      3 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
      4 ##
      5 ## Copyright 1998-2024 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 
     16 echo "running defines.sh"
     17 . $SRCDIR/scripts/defines.sh
     18 
     19 if test $MEMBEROF = memberofno; then 
     20 	echo "Memberof overlay not available, test skipped"
     21 	exit 0
     22 fi 
     23 
     24 mkdir -p $TESTDIR $DBDIR1 $TESTDIR/confdir
     25 
     26 $SLAPPASSWD -g -n >$CONFIGPWF
     27 echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf
     28 
     29 echo "Starting slapd on TCP/IP port $PORT1..."
     30 . $CONFFILTER $BACKEND < $NAKEDCONF > $CONF1
     31 $SLAPD -f $CONF1 -F $TESTDIR/confdir -h $URI1 -d $LVL > $LOG1 2>&1 &
     32 PID=$!
     33 if test $WAIT != 0 ; then
     34     echo PID $PID
     35     read foo
     36 fi
     37 KILLPIDS="$PID"
     38 
     39 sleep 1
     40 for i in 0 1 2 3 4 5; do
     41 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \
     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
     49 done
     50 if test $RC != 0 ; then
     51 	echo "ldapsearch failed ($RC)!"
     52 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     53 	exit $RC
     54 fi
     55 
     56 cat /dev/null > $TESTOUT
     57 
     58 if [ "$MEMBEROF" = memberofmod ]; then
     59 	echo "Inserting memberof overlay on provider..."
     60 	$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
     61 dn: cn=module,cn=config
     62 objectClass: olcModuleList
     63 cn: module
     64 olcModulePath: ../servers/slapd/overlays
     65 olcModuleLoad: memberof.la
     66 EOF
     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
     73 fi
     74 
     75 indexInclude="" mainInclude="" nullExclude=""
     76 test $INDEXDB = indexdb	|| indexInclude="# "
     77 test $MAINDB  = maindb	|| mainInclude="# "
     78 case $BACKEND in
     79 null) nullExclude="# " ;;
     80 esac
     81 
     82 echo "Running ldapadd to build slapd config database..."
     83 $LDAPADD -H $URI1 -D 'cn=config' -w `cat $CONFIGPWF` \
     84 	>> $TESTOUT 2>&1 <<EOF
     85 dn: cn=symas group example,cn=schema,cn=config
     86 objectClass: olcSchemaConfig
     87 cn: symas group example
     88 olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.1 
     89  NAME 'memberA' SUP distinguishedName )
     90 olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.2
     91  NAME 'memberOfA' SUP distinguishedName )
     92 olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.3 
     93  NAME 'memberB' SUP distinguishedName )
     94 olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.4 
     95  NAME 'memberOfB' SUP distinguishedName )
     96 olcAttributeTypes: ( 1.3.6.1.4.1.4754.31.1.5
     97  NAME 'memberOfC' SUP distinguishedName )
     98 olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.1 
     99  NAME 'groupA' SUP top STRUCTURAL MUST cn MAY memberA )
    100 olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.2 
    101  NAME 'groupMemberA' SUP top AUXILIARY MAY ( memberOfA $ memberOfC ) )
    102 olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.3 
    103  NAME 'groupB' SUP top STRUCTURAL MUST cn MAY memberB )
    104 olcObjectClasses: ( 1.3.6.1.4.1.4754.31.2.4 
    105  NAME 'groupMemberB' SUP top AUXILIARY MAY memberOfB )
    106 
    107 dn: olcDatabase={1}$BACKEND,cn=config
    108 objectClass: olcDatabaseConfig
    109 ${nullExclude}objectClass: olc${BACKEND}Config
    110 olcDatabase: {1}$BACKEND
    111 olcSuffix: $BASEDN
    112 olcRootDN: cn=Manager,$BASEDN
    113 olcRootPW:: c2VjcmV0
    114 olcMonitoring: TRUE
    115 ${nullExclude}olcDbDirectory: $TESTDIR/db.1.a/
    116 ${indexInclude}olcDbIndex: objectClass eq
    117 ${indexInclude}olcDbIndex: cn pres,eq,sub
    118 ${indexInclude}olcDbIndex: uid pres,eq,sub
    119 ${indexInclude}olcDbIndex: sn pres,eq,sub
    120 ${mainInclude}olcDbMode: 384"
    121 
    122 dn: olcOverlay={0}memberof,olcDatabase={1}$BACKEND,cn=config
    123 objectClass: olcOverlayConfig
    124 objectClass: olcMemberOfConfig
    125 olcOverlay: {0}memberof
    126 olcMemberOfRefInt: TRUE
    127 olcMemberOfGroupOC: groupOfNames
    128 olcMemberOfMemberAD: member
    129 olcMemberOfMemberOfAD: memberOf
    130 
    131 dn: olcOverlay={1}memberof,olcDatabase={1}$BACKEND,cn=config
    132 objectClass: olcOverlayConfig
    133 objectClass: olcMemberOfConfig
    134 olcOverlay: {1}memberof
    135 olcMemberOfRefInt: TRUE
    136 olcMemberOfGroupOC: groupA
    137 olcMemberOfMemberAD: memberA
    138 olcMemberOfMemberOfAD: memberOfA
    139 
    140 dn: olcOverlay={2}memberof,olcDatabase={1}$BACKEND,cn=config
    141 objectClass: olcOverlayConfig
    142 objectClass: olcMemberOfConfig
    143 olcOverlay: {2}memberof
    144 olcMemberOfRefInt: TRUE
    145 olcMemberOfGroupOC: groupB
    146 olcMemberOfMemberAD: memberB
    147 olcMemberOfMemberOfAD: memberOfB
    148 
    149 EOF
    150 RC=$?
    151 if test $RC != 0 ; then
    152 	echo "ldapadd failed ($RC)!"
    153 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    154 	exit $RC
    155 fi
    156 
    157 echo "Running ldapadd to build slapd database..."
    158 $LDAPADD -H $URI1 \
    159 	-D "cn=Manager,$BASEDN" -w secret \
    160 	>> $TESTOUT 2>&1 << EOF
    161 dn: $BASEDN
    162 objectClass: organization
    163 objectClass: dcObject
    164 o: Example, Inc.
    165 dc: example
    166 
    167 dn: ou=People,$BASEDN
    168 objectClass: organizationalUnit
    169 ou: People
    170 
    171 dn: ou=Groups,$BASEDN
    172 objectClass: organizationalUnit
    173 ou: Groups
    174 
    175 dn: cn=Roger Rabbit,ou=People,$BASEDN
    176 objectClass: inetOrgPerson
    177 cn: Roger Rabbit
    178 sn: Rabbit
    179 
    180 dn: cn=Baby Herman,ou=People,$BASEDN
    181 objectClass: inetOrgPerson
    182 cn: Baby Herman
    183 sn: Herman
    184 
    185 dn: cn=Cartoonia,ou=Groups,$BASEDN
    186 objectClass: groupOfNames
    187 cn: Cartoonia
    188 member: cn=Roger Rabbit,ou=People,$BASEDN
    189 member: cn=Baby Herman,ou=People,$BASEDN
    190 EOF
    191 RC=$?
    192 if test $RC != 0 ; then
    193 	echo "ldapadd failed ($RC)!"
    194 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    195 	exit $RC
    196 fi
    197 
    198 echo "Search the entire database..."
    199 echo "# Search the entire database..." >> $SEARCHOUT
    200 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    201 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    202 RC=$?
    203 if test $RC != 0 ; then
    204 	echo "ldapsearch failed ($RC)!"
    205 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    206 	exit $RC
    207 fi
    208 
    209 echo "Running ldapmodify to add a member..."
    210 $LDAPMODIFY -H $URI1 \
    211 	-D "cn=Manager,$BASEDN" -w secret \
    212 	>> $TESTOUT 2>&1 << EOF
    213 dn: cn=Jessica Rabbit,ou=People,$BASEDN
    214 changetype: add
    215 objectClass: inetOrgPerson
    216 cn: Jessica Rabbit
    217 sn: Rabbit
    218 
    219 dn: cn=Cartoonia,ou=Groups,$BASEDN
    220 changetype: modify
    221 add: member
    222 member: cn=Jessica Rabbit,ou=People,$BASEDN
    223 EOF
    224 
    225 echo "Re-search the entire database..."
    226 echo "# Re-search the entire database after adding Jessica Rabbit and Cartoonia..." >> $SEARCHOUT
    227 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    228 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    229 RC=$?
    230 if test $RC != 0 ; then
    231 	echo "ldapsearch failed ($RC)!"
    232 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    233 	exit $RC
    234 fi
    235 
    236 echo "Running ldapmodify to rename a member..."
    237 $LDAPMODIFY -H $URI1 \
    238 	-D "cn=Manager,$BASEDN" -w secret \
    239 	>> $TESTOUT 2>&1 << EOF
    240 dn: cn=Baby Herman,ou=People,$BASEDN
    241 changetype: modrdn
    242 newrdn: cn=Baby Herman Jr
    243 deleteoldrdn: 1
    244 EOF
    245 
    246 echo "Re-search the entire database..."
    247 echo "# Re-search the entire database after renaming Baby Herman..." >> $SEARCHOUT
    248 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    249 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    250 RC=$?
    251 if test $RC != 0 ; then
    252 	echo "ldapsearch failed ($RC)!"
    253 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    254 	exit $RC
    255 fi
    256 
    257 echo "Running ldapmodify to rename a group..."
    258 $LDAPMODIFY -H $URI1 \
    259 	-D "cn=Manager,$BASEDN" -w secret \
    260 	>> $TESTOUT 2>&1 << EOF
    261 dn: cn=Cartoonia,ou=Groups,$BASEDN
    262 changetype: modrdn
    263 newrdn: cn=Toon town
    264 deleteoldrdn: 1
    265 
    266 dn: cn=Toon town,ou=Groups,$BASEDN
    267 changetype: modrdn
    268 newrdn: cn=Toon Town
    269 deleteoldrdn: 1
    270 EOF
    271 
    272 echo "Re-search the entire database..."
    273 echo "# Re-search the entire database after renaming Cartoonia..." >> $SEARCHOUT
    274 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    275 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    276 RC=$?
    277 if test $RC != 0 ; then
    278 	echo "ldapsearch failed ($RC)!"
    279 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    280 	exit $RC
    281 fi
    282 
    283 echo "Running ldapmodify to add self..."
    284 $LDAPMODIFY -H $URI1 \
    285 	-D "cn=Manager,$BASEDN" -w secret \
    286 	>> $TESTOUT 2>&1 << EOF
    287 dn: cn=Toon Town,ou=Groups,$BASEDN
    288 changetype: modify
    289 add: member
    290 member: cn=Toon Town,ou=Groups,$BASEDN
    291 EOF
    292 
    293 echo "Re-search the entire database..."
    294 echo "# Re-search the entire database after adding Toon Town to self..." >> $SEARCHOUT
    295 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    296 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    297 RC=$?
    298 if test $RC != 0 ; then
    299 	echo "ldapsearch failed ($RC)!"
    300 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    301 	exit $RC
    302 fi
    303 
    304 echo "Running ldapdelete to remove a member..."
    305 $LDAPMODIFY -H $URI1 \
    306 	-D "cn=Manager,$BASEDN" -w secret \
    307 	>> $TESTOUT 2>&1 << EOF
    308 dn: cn=Baby Herman Jr,ou=People,$BASEDN
    309 changetype: delete
    310 EOF
    311 
    312 echo "Re-search the entire database..."
    313 echo "# Re-search the entire database after deleting Baby Herman..." >> $SEARCHOUT
    314 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    315 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    316 RC=$?
    317 if test $RC != 0 ; then
    318 	echo "ldapsearch failed ($RC)!"
    319 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    320 	exit $RC
    321 fi
    322 
    323 echo "Running ldapdelete to remove a group..."
    324 $LDAPMODIFY -H $URI1 \
    325 	-D "cn=Manager,$BASEDN" -w secret \
    326 	>> $TESTOUT 2>&1 << EOF
    327 dn: cn=Toon Town,ou=Groups,$BASEDN
    328 changetype: delete
    329 EOF
    330 
    331 echo "Re-search the entire database..."
    332 echo "# Re-search the entire database after deleting Toon Town..." >> $SEARCHOUT
    333 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    334 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    335 RC=$?
    336 if test $RC != 0 ; then
    337 	echo "ldapsearch failed ($RC)!"
    338 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    339 	exit $RC
    340 fi
    341 
    342 echo "Adding groups with MAY member type schemas..."
    343 $LDAPMODIFY -H $URI1 \
    344 	-D "cn=Manager,$BASEDN" -w secret \
    345 	>> $TESTOUT 2>&1 <<EOF
    346 dn: cn=Roger Rabbit,ou=People,$BASEDN
    347 changetype: delete
    348 
    349 dn: cn=Jessica Rabbit,ou=People,$BASEDN
    350 changetype: delete
    351 
    352 dn: cn=person1,ou=People,$BASEDN
    353 changetype: add
    354 objectClass: person
    355 objectClass: groupMemberA
    356 objectClass: groupMemberB
    357 cn: person1
    358 sn: person1
    359 
    360 dn: cn=person2,ou=People,$BASEDN
    361 changetype: add
    362 objectClass: person
    363 objectClass: groupMemberA
    364 objectClass: groupMemberB
    365 cn: person2
    366 sn: person2
    367 
    368 dn: cn=group1,ou=Groups,$BASEDN
    369 changetype: add
    370 objectclass: groupA
    371 cn: group1
    372 memberA: cn=person1,ou=People,$BASEDN
    373 memberA: cn=person2,ou=People,$BASEDN
    374 
    375 dn: cn=group2,ou=Groups,$BASEDN
    376 changetype: add
    377 objectclass: groupB
    378 cn: group2
    379 memberB: cn=person1,ou=People,$BASEDN
    380 memberB: cn=person2,ou=People,$BASEDN
    381 
    382 dn: cn=group1,ou=Groups,$BASEDN
    383 changetype: modify
    384 delete: memberA
    385 
    386 EOF
    387 
    388 echo "Re-search the entire database..."
    389 echo "# Re-search the entire database after adding groups with MAY member type schemas..." >> $SEARCHOUT
    390 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    391 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    392 RC=$?
    393 if test $RC != 0 ; then
    394 	echo "ldapsearch failed ($RC)!"
    395 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    396 	exit $RC
    397 fi
    398 
    399 echo "Running ldapmodify to reconfigure the schema used..."
    400 $LDAPADD -H $URI1 -D 'cn=config' -w `cat $CONFIGPWF` \
    401 	>> $TESTOUT 2>&1 <<EOF
    402 dn: olcOverlay={1}memberof,olcDatabase={1}$BACKEND,cn=config
    403 changetype: modify
    404 replace: olcMemberOfMemberOfAD
    405 olcMemberOfMemberOfAD: memberOfC
    406 
    407 EOF
    408 RC=$?
    409 if test $RC != 0 ; then
    410 	echo "ldapadd failed ($RC)!"
    411 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    412 	exit $RC
    413 fi
    414 
    415 echo "Updating groups to expose the new setting..."
    416 $LDAPMODIFY -H $URI1 \
    417 	-D "cn=Manager,$BASEDN" -w secret \
    418 	>> $TESTOUT 2>&1 <<EOF
    419 dn: cn=group1,ou=Groups,$BASEDN
    420 changetype: modify
    421 add: memberA
    422 memberA: cn=person1,ou=People,$BASEDN
    423 memberA: cn=person2,ou=People,$BASEDN
    424 
    425 EOF
    426 RC=$?
    427 if test $RC != 0 ; then
    428 	echo "ldapmodify failed ($RC)!"
    429 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    430 	exit $RC
    431 fi
    432 
    433 echo "Re-search the entire database..."
    434 echo "# Re-search the entire database after updating memberof configuration..." >> $SEARCHOUT
    435 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    436 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    437 RC=$?
    438 if test $RC != 0 ; then
    439 	echo "ldapsearch failed ($RC)!"
    440 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    441 	exit $RC
    442 fi
    443 
    444 echo "Running ldapmodify to enable add checking..."
    445 $LDAPMODIFY -H $URI1 -D 'cn=config' -w `cat $CONFIGPWF` \
    446 	>> $TESTOUT 2>&1 <<EOF
    447 dn: olcOverlay={0}memberof,olcDatabase={1}$BACKEND,cn=config
    448 changetype: modify
    449 replace: olcMemberOfAddCheck
    450 olcMemberOfAddCheck: TRUE
    451 
    452 EOF
    453 RC=$?
    454 if test $RC != 0 ; then
    455 	echo "ldapmodify failed ($RC)!"
    456 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    457 	exit $RC
    458 fi
    459 
    460 echo "Adding group and users out of order..."
    461 $LDAPADD -H $URI1 \
    462 	-D "cn=Manager,$BASEDN" -w secret \
    463 	>> $TESTOUT 2>&1 <<EOF
    464 dn: cn=group3,ou=Groups,$BASEDN
    465 objectclass: groupOfNames
    466 cn: group3
    467 member: cn=New Person,ou=People,$BASEDN
    468 member: cn=New Group,ou=Groups,$BASEDN
    469 
    470 dn: cn=New Group,ou=Groups,$BASEDN
    471 objectclass: groupOfNames
    472 cn: New Group
    473 member: cn=New Person,ou=People,$BASEDN
    474 
    475 dn: cn=New Person,ou=People,$BASEDN
    476 objectclass: person
    477 cn: New Person
    478 sn: Person
    479 
    480 EOF
    481 RC=$?
    482 if test $RC != 0 ; then
    483 	echo "ldapadd failed ($RC)!"
    484 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    485 	exit $RC
    486 fi
    487 
    488 echo "Re-search the entire database..."
    489 echo "# Re-search the entire database after adding out-of-order groups/users..." >> $SEARCHOUT
    490 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    491 	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
    492 RC=$?
    493 if test $RC != 0 ; then
    494 	echo "ldapsearch failed ($RC)!"
    495 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    496 	exit $RC
    497 fi
    498 
    499 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    500 
    501 LDIF=$MEMBEROFOUT
    502 
    503 echo "Filtering ldapsearch results..."
    504 $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
    505 echo "Filtering original ldif used to create database..."
    506 $LDIFFILTER < $LDIF > $LDIFFLT
    507 echo "Comparing filter output..."
    508 $CMP $SEARCHFLT $LDIFFLT > $CMPOUT
    509 
    510 if test $? != 0 ; then
    511 	echo "Comparison failed"
    512 	exit 1
    513 fi
    514 
    515 echo ">>>>> Test succeeded"
    516 
    517 test $KILLSERVERS != no && wait
    518 
    519 exit 0
    520