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 2004-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 $UNIQUE = uniqueno; then
     20 	echo "Attribute Uniqueness overlay not available, test skipped"
     21 	exit 0
     22 fi
     23 
     24 RCODEconstraint=19
     25 RCODEnorelax=50
     26 test $BACKEND = null && RCODEconstraint=0
     27 
     28 mkdir -p $TESTDIR $DBDIR1
     29 
     30 $SLAPPASSWD -g -n >$CONFIGPWF
     31 echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf
     32 
     33 echo "Running slapadd to build slapd database..."
     34 . $CONFFILTER $BACKEND < $UNIQUECONF > $CONF1
     35 $SLAPADD -f $CONF1 -l $LDIFUNIQUE
     36 RC=$?
     37 if test $RC != 0 ; then
     38 	echo "slapadd failed ($RC)!"
     39 	exit $RC
     40 fi
     41 
     42 echo "Starting slapd on TCP/IP port $PORT1..."
     43 mkdir $TESTDIR/confdir
     44 $SLAPD -f $CONF1 -F $TESTDIR/confdir -h $URI1 -d $LVL > $LOG1 2>&1 &
     45 PID=$!
     46 if test $WAIT != 0 ; then
     47     echo PID $PID
     48     read foo
     49 fi
     50 KILLPIDS="$PID"
     51 
     52 sleep 1
     53 
     54 echo "Testing slapd attribute uniqueness operations..."
     55 for i in 0 1 2 3 4 5; do
     56 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \
     57 		'objectclass=*' > /dev/null 2>&1
     58 	RC=$?
     59 	if test $RC = 0 ; then
     60 		break
     61 	fi
     62 	echo "Waiting 5 seconds for slapd to start..."
     63 	sleep 5
     64 done
     65 
     66 if test $RC != 0 ; then
     67 	echo "ldapsearch failed ($RC)!"
     68 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     69 	exit $RC
     70 fi
     71 
     72 echo "Adding a unique record..."
     73 $LDAPADD -D "$UNIQUEDN" -H $URI1 -w $PASSWD \
     74 	> /dev/null << EOTUNIQ1
     75 dn: uid=dave,ou=users,o=unique
     76 objectClass: inetOrgPerson
     77 objectClass: simpleSecurityObject
     78 uid: dave
     79 sn: nothere
     80 cn: dave
     81 businessCategory: otest
     82 carLicense: TEST
     83 departmentNumber: 42
     84 # NOTE: use special chars in attr value to be used
     85 # in internal searches ITS#4212
     86 displayName: Dave (ITS#4212)
     87 employeeNumber: 69
     88 employeeType: contractor
     89 givenName: Dave
     90 userpassword: $PASSWD
     91 EOTUNIQ1
     92 RC=$?
     93 if test $RC != 0 ; then
     94 	echo "ldapadd failed ($RC)!"
     95 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     96 	exit $RC
     97 fi
     98 
     99 echo "Adding a non-unique record..."
    100 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    101 	 $TESTOUT 2>&1 << EOTUNIQ2
    102 dn: uid=bill,ou=users,o=unique
    103 objectClass: inetOrgPerson
    104 uid: bill
    105 sn: johnson
    106 cn: bill
    107 businessCategory: rtest
    108 carLicense: ABC123
    109 departmentNumber: 42
    110 displayName: Bill
    111 employeeNumber: 5150
    112 employeeType: contractor
    113 givenName: Bill
    114 EOTUNIQ2
    115 RC=$?
    116 if test $RC != $RCODEconstraint ; then
    117 	echo "unique check failed ($RC)!"
    118 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    119 	exit 1
    120 fi
    121 
    122 # ITS#6641/8057/8245
    123 echo "Trying to bypass uniqueness as a normal user..."
    124 $LDAPADD -e \!relax -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    125 	 $TESTOUT 2>&1 << EOTUNIQ2
    126 dn: uid=bill,ou=users,o=unique
    127 objectClass: inetOrgPerson
    128 uid: bill
    129 sn: johnson
    130 cn: bill
    131 businessCategory: rtest
    132 carLicense: ABC123
    133 departmentNumber: 42
    134 displayName: Bill
    135 employeeNumber: 5150
    136 employeeType: contractor
    137 givenName: Bill
    138 EOTUNIQ2
    139 RC=$?
    140 if test $RC != $RCODEnorelax && test $RC != $RCODEconstraint ; then
    141 	echo "unique check failed ($RC)!"
    142 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    143 	exit 1
    144 fi
    145 
    146 echo "Trying to bypass uniqueness as a normal user with ManageDSAIt..."
    147 $LDAPADD -M -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    148 	 $TESTOUT 2>&1 << EOTUNIQ2
    149 dn: uid=bill,ou=users,o=unique
    150 objectClass: inetOrgPerson
    151 uid: bill
    152 sn: johnson
    153 cn: bill
    154 businessCategory: rtest
    155 carLicense: ABC123
    156 departmentNumber: 42
    157 displayName: Bill
    158 employeeNumber: 5150
    159 employeeType: contractor
    160 givenName: Bill
    161 EOTUNIQ2
    162 RC=$?
    163 if test $RC != $RCODEconstraint ; then
    164 	echo "unique check failed ($RC)!"
    165 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    166 	exit 1
    167 fi
    168 
    169 echo "Bypassing uniqueness as an admin user..."
    170 $LDAPADD -e \!relax -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    171 	 $TESTOUT 2>&1 << EOTUNIQ2
    172 dn: uid=bill,ou=users,o=unique
    173 objectClass: inetOrgPerson
    174 uid: bill
    175 sn: johnson
    176 cn: bill
    177 businessCategory: rtest
    178 carLicense: ABC123
    179 departmentNumber: 42
    180 displayName: Bill
    181 employeeNumber: 5150
    182 employeeType: contractor
    183 givenName: Bill
    184 EOTUNIQ2
    185 RC=$?
    186 if test $RC != 0 ; then
    187 	echo "spurious unique error ($RC)!"
    188 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    189 	exit $RC
    190 fi
    191 
    192 echo "Cleaning up"
    193 $LDAPDELETE -D "$UNIQUEDN" -H $URI1 -w $PASSWD \
    194     "uid=bill,ou=users,o=unique" > $TESTOUT 2>&1
    195 RC=$?
    196 if test $RC != 0; then
    197 	echo "ldapdelete failed ($RC)!"
    198 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    199 	exit $RC
    200 fi
    201 
    202 echo Dynamically retrieving initial configuration...
    203 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/initial-config.ldif
    204 cat <<EOF >$TESTDIR/initial-reference.ldif
    205 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    206 objectClass: olcOverlayConfig
    207 objectClass: olcUniqueConfig
    208 olcOverlay: {0}unique
    209 olcUniqueBase: o=unique
    210 olcUniqueAttribute: employeeNumber
    211 olcUniqueAttribute: displayName
    212 
    213 EOF
    214 diff $TESTDIR/initial-config.ldif $TESTDIR/initial-reference.ldif > /dev/null 2>&1
    215 RC=$?
    216 if test $RC != 0 ; then
    217     echo "Initial configuration is not reported correctly."
    218     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    219     exit 1
    220 fi
    221 
    222 echo Dynamically trying to add a URI with legacy attrs present...
    223 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    224     > $TESTOUT 2>&1 <<EOF
    225 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    226 changetype: modify
    227 add: olcUniqueURI
    228 olcUniqueURI: ldap:///?employeeNumber,displayName?sub
    229 EOF
    230 RC=$?
    231 if test $RC != 80 ; then
    232 	echo "legacy and unique_uri allowed together"
    233 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    234 	exit 1
    235 fi
    236 
    237 echo Dynamically trying to add legacy ignored attrs with legacy attrs present...
    238 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    239     > $TESTOUT 2>&1 <<EOF
    240 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    241 changetype: modify
    242 add: olcUniqueIgnore
    243 olcUniqueIgnore: objectClass
    244 EOF
    245 RC=$?
    246 if test $RC != 80 ; then
    247 	echo "legacy attrs and legacy ignore attrs allowed together"
    248 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    249 	exit 1
    250 fi
    251 
    252 echo Verifying initial configuration intact...
    253 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/initial-config-recheck.ldif
    254 diff $TESTDIR/initial-config-recheck.ldif $TESTDIR/initial-reference.ldif > /dev/null 2>&1
    255 RC=$?
    256 if test $RC != 0 ; then
    257     echo "Initial configuration damaged by unsuccessful modifies."
    258     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    259     exit 1
    260 fi
    261 
    262 echo Dynamically removing legacy base...
    263 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    264     > $TESTOUT 2>&1 <<EOF
    265 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    266 changetype: modify
    267 delete: olcUniqueBase
    268 EOF
    269 RC=$?
    270 if test $RC != 0 ; then
    271 	echo "base removal failed"
    272 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    273 	exit 1
    274 fi
    275 
    276 echo Verifying base removal...
    277 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/baseremoval-config.ldif
    278 cat >$TESTDIR/baseremoval-reference.ldif <<EOF
    279 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    280 objectClass: olcOverlayConfig
    281 objectClass: olcUniqueConfig
    282 olcOverlay: {0}unique
    283 olcUniqueAttribute: employeeNumber
    284 olcUniqueAttribute: displayName
    285 
    286 EOF
    287 diff $TESTDIR/baseremoval-config.ldif $TESTDIR/baseremoval-reference.ldif > /dev/null 2>&1
    288 RC=$?
    289 if test $RC != 0 ; then
    290     echo "Configuration damaged by base removal"
    291     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    292     exit 1
    293 fi
    294 
    295 echo "Adding a non-unique record..."
    296 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    297 	 $TESTOUT 2>&1 << EOTUNIQ2
    298 dn: uid=bill,ou=users,o=unique
    299 objectClass: inetOrgPerson
    300 uid: bill
    301 sn: johnson
    302 cn: bill
    303 businessCategory: rtest
    304 carLicense: ABC123
    305 departmentNumber: 42
    306 displayName: Bill
    307 employeeNumber: 5150
    308 employeeType: contractor
    309 givenName: Bill
    310 EOTUNIQ2
    311 RC=$?
    312 if test $RC != $RCODEconstraint ; then
    313 	echo "unique check failed ($RC)!"
    314 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    315 	exit 1
    316 fi
    317 
    318 echo Trying a legacy base outside of the backend...
    319 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    320     > $TESTOUT 2>&1 <<EOF
    321 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    322 changetype: modify
    323 add: olcUniqueBase
    324 olcUniqueBase: cn=config
    325 EOF
    326 RC=$?
    327 if test $RC != 80 ; then
    328 	echo "out of backend scope base allowed"
    329 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    330 	exit 1
    331 fi
    332 
    333 echo "Adding and removing attrs..."
    334 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    335     > $TESTOUT 2>&1 <<EOF
    336 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    337 changetype: modify
    338 add: olcUniqueAttribute
    339 olcUniqueAttribute: description
    340 olcUniqueAttribute: telephoneNumber
    341 -
    342 delete: olcUniqueAttribute
    343 olcUniqueAttribute: displayName
    344 EOF
    345 RC=$?
    346 if test $RC != 0 ; then
    347 	echo "Unable to remove an attribute"
    348 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    349 	exit 1
    350 fi
    351 
    352 echo "Verifying we removed the right attr..."
    353 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    354 	 $TESTOUT 2>&1 << EOTUNIQ2
    355 dn: uid=bill,ou=users,o=unique
    356 objectClass: inetOrgPerson
    357 uid: bill
    358 sn: johnson
    359 cn: bill
    360 businessCategory: rtest
    361 carLicense: ABC123
    362 departmentNumber: 42
    363 displayName: Bill
    364 employeeNumber: 5150
    365 employeeType: contractor
    366 givenName: Bill
    367 EOTUNIQ2
    368 RC=$?
    369 if test $RC != $RCODEconstraint ; then
    370 	echo "olcUniqueAttribute single deletion hit the wrong value"
    371 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    372 	exit 1
    373 fi
    374 
    375 echo Removing legacy config and adding URIs...
    376 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    377     > $TESTOUT 2>&1 <<EOF
    378 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    379 changetype: modify
    380 delete: olcUniqueAttribute
    381 -
    382 add: olcUniqueURI
    383 olcUniqueURI: ldap:///?employeeNumber,displayName?sub
    384 olcUniqueURI: ldap:///?description?one
    385 EOF
    386 RC=$?
    387 if test $RC != 0 ; then
    388 	echo "Reconfiguration to URIs failed"
    389 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    390 	exit 1
    391 fi
    392 
    393 echo Dynamically retrieving second configuration...
    394 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/second-config.ldif
    395 cat >$TESTDIR/second-reference.ldif <<EOF
    396 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    397 objectClass: olcOverlayConfig
    398 objectClass: olcUniqueConfig
    399 olcOverlay: {0}unique
    400 olcUniqueURI: ldap:///?employeeNumber,displayName?sub
    401 olcUniqueURI: ldap:///?description?one
    402 
    403 EOF
    404 diff $TESTDIR/second-config.ldif $TESTDIR/second-reference.ldif > /dev/null 2>&1
    405 RC=$?
    406 if test $RC != 0 ; then
    407     echo "Second configuration is not reported correctly."
    408     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    409     exit 1
    410 fi
    411 
    412 echo "Adding a non-unique record..."
    413 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    414 	 $TESTOUT 2>&1 << EOTUNIQ2
    415 dn: uid=bill,ou=users,o=unique
    416 objectClass: inetOrgPerson
    417 uid: bill
    418 sn: johnson
    419 cn: bill
    420 businessCategory: rtest
    421 carLicense: ABC123
    422 departmentNumber: 42
    423 displayName: Bill
    424 employeeNumber: 5150
    425 employeeType: contractor
    426 givenName: Bill
    427 EOTUNIQ2
    428 RC=$?
    429 if test $RC != $RCODEconstraint ; then
    430 	echo "unique check failed ($RC)!"
    431 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    432 	exit 1
    433 fi
    434 
    435 echo Dynamically trying to add legacy base
    436 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    437     > $TESTOUT 2>&1 <<EOF
    438 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    439 changetype: modify
    440 add: olcUniqueBase
    441 olcUniqueBase: o=unique
    442 EOF
    443 RC=$?
    444 if test $RC != 80 ; then
    445 	echo "legacy base allowed with URIs"
    446 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    447 	exit 1
    448 fi
    449 
    450 echo Dynamically trying to add legacy attrs
    451 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    452     > $TESTOUT 2>&1 <<EOF
    453 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    454 changetype: modify
    455 add: olcUniqueAttribute
    456 olcUniqueAttribute: description
    457 EOF
    458 RC=$?
    459 if test $RC != 80 ; then
    460 	echo "legacy attributes allowed with URIs"
    461 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    462 	exit 1
    463 fi
    464 
    465 echo Dynamically trying to add legacy strictness
    466 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    467     > $TESTOUT 2>&1 <<EOF
    468 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    469 changetype: modify
    470 add: olcUniqueStrict
    471 olcUniqueStrict: TRUE
    472 EOF
    473 RC=$?
    474 if test $RC != 80 ; then
    475 	echo "legacy strictness allowed with URIs"
    476 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    477 	exit 1
    478 fi
    479 
    480 #echo ----------------------
    481 echo Dynamically trying a bad filter...
    482 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    483     > $TESTOUT 2>&1 <<EOF
    484 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    485 changetype: modify
    486 replace: olcUniqueURI
    487 olcUniqueURI: ldap:///?sn?sub?((cn=e*))
    488 EOF
    489 RC=$?
    490 if test $RC != 80 ; then
    491 	echo "bad filter allowed"
    492 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    493 	exit 1
    494 fi
    495 
    496 echo Verifying second configuration intact...
    497 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/second-config-recheck.ldif
    498 diff $TESTDIR/second-config-recheck.ldif $TESTDIR/second-reference.ldif > /dev/null 2>&1
    499 RC=$?
    500 if test $RC != 0 ; then
    501     echo "Second configuration damaged by rejected modifies."
    502     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    503     exit 1
    504 fi
    505 
    506 #echo ----------------------
    507 echo Dynamically reconfiguring to use different URIs...
    508 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    509     > $TESTOUT 2>&1 <<EOF
    510 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    511 changetype: modify
    512 add: olcUniqueURI
    513 olcUniqueURI: ldap:///?sn?sub?(cn=e*)
    514 olcUniqueURI: ldap:///?uid?sub?(cn=edgar)
    515 -
    516 delete: olcUniqueURI
    517 olcUniqueURI: ldap:///?description?one
    518 EOF
    519 RC=$?
    520 if test $RC != 0 ; then
    521 	echo "unable to reconfigure"
    522 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    523 	exit 1
    524 fi
    525 
    526 echo Dynamically retrieving third configuration...
    527 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/third-config.ldif
    528 cat >$TESTDIR/third-reference.ldif <<EOF
    529 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    530 objectClass: olcOverlayConfig
    531 objectClass: olcUniqueConfig
    532 olcOverlay: {0}unique
    533 olcUniqueURI: ldap:///?employeeNumber,displayName?sub
    534 olcUniqueURI: ldap:///?sn?sub?(cn=e*)
    535 olcUniqueURI: ldap:///?uid?sub?(cn=edgar)
    536 
    537 EOF
    538 diff $TESTDIR/third-config.ldif $TESTDIR/third-reference.ldif > /dev/null 2>&1
    539 RC=$?
    540 if test $RC != 0 ; then
    541     echo "Third configuration is not reported correctly."
    542     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    543     exit 1
    544 fi
    545 
    546 echo "Adding a record unique in both domains if filtered..."
    547 
    548 $LDAPADD -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    549 	 $TESTOUT 2>&1 << EOF
    550 dn: uid=edgar,ou=users,o=unique
    551 objectClass: inetOrgPerson
    552 uid: edgar
    553 sn: johnson
    554 cn: edgar
    555 EOF
    556 
    557 RC=$?
    558 if test $RC != 0 ; then
    559 	echo "unique check failed ($RC)!"
    560 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    561 	exit 1
    562 fi
    563 
    564 echo "Adding a record unique in all domains because of filter conditions "
    565 $LDAPADD -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    566 	 $TESTOUT 2>&1 << EOF
    567 dn: uid=empty,ou=users,o=unique
    568 objectClass: inetOrgPerson
    569 uid: edgar
    570 cn: empty
    571 sn: empty
    572 EOF
    573 
    574 RC=$?
    575 if test $RC != 0 ; then
    576 	echo "spurious unique error ($RC)!"
    577 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    578 	exit 1
    579 fi
    580 
    581 echo "Sending an empty modification"
    582 
    583 $LDAPMODIFY -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    584 	 $TESTOUT 2>&1 << EOF
    585 dn: uid=empty,ou=users,o=unique
    586 changetype: modify
    587 EOF
    588 
    589 RC=$?
    590 if test $RC != 0 ; then
    591 	echo "spurious unique error ($RC)!"
    592 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    593 	exit 1
    594 fi
    595 
    596 echo "Making a record non-unique"
    597 $LDAPMODIFY -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    598     $TESTOUT 2>&1 << EOF
    599 dn: uid=empty,ou=users,o=unique
    600 changetype: modify
    601 replace: sn
    602 sn: johnson
    603 EOF
    604 
    605 RC=$?
    606 if test $RC != $RCODEconstraint ; then
    607 	echo "unique check failed ($RC)!"
    608 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    609 	exit 1
    610 fi
    611 
    612 # ITS#6641/8057/8245
    613 echo "Trying to bypass uniqueness as a normal user..."
    614 $LDAPMODIFY -e \!relax -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    615     $TESTOUT 2>&1 << EOF
    616 dn: uid=empty,ou=users,o=unique
    617 changetype: modify
    618 replace: sn
    619 sn: johnson
    620 EOF
    621 
    622 RC=$?
    623 if test $RC != $RCODEnorelax && test $RC != $RCODEconstraint ; then
    624 	echo "unique check failed ($RC)!"
    625 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    626 	exit 1
    627 fi
    628 
    629 echo "Trying to bypass uniqueness as a normal user with ManageDSAIt..."
    630 $LDAPMODIFY -M -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    631     $TESTOUT 2>&1 << EOF
    632 dn: uid=empty,ou=users,o=unique
    633 changetype: modify
    634 replace: sn
    635 sn: johnson
    636 EOF
    637 
    638 RC=$?
    639 if test $RC != $RCODEconstraint ; then
    640 	echo "unique check failed ($RC)!"
    641 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    642 	exit 1
    643 fi
    644 
    645 echo "Bypassing uniqueness as an admin user..."
    646 $LDAPMODIFY -e \!relax -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    647     $TESTOUT 2>&1 << EOF
    648 dn: uid=empty,ou=users,o=unique
    649 changetype: modify
    650 replace: sn
    651 sn: johnson
    652 EOF
    653 
    654 RC=$?
    655 if test $RC != 0 ; then
    656 	echo "spurious unique error ($RC)!"
    657 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    658 	exit $RC
    659 fi
    660 
    661 echo "Cleaning up"
    662 $LDAPMODIFY -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    663     $TESTOUT 2>&1 << EOF
    664 dn: uid=empty,ou=users,o=unique
    665 changetype: modify
    666 replace: sn
    667 sn: empty
    668 EOF
    669 
    670 RC=$?
    671 if test $RC != 0; then
    672 	echo "ldapmodify failed ($RC)!"
    673 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    674 	exit $RC
    675 fi
    676 
    677 echo "Adding another unique record..."
    678 $LDAPADD -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    679 	 $TESTOUT 2>&1 << EOF
    680 dn: uid=not edgar,uid=edgar,ou=users,o=unique
    681 objectClass: inetOrgPerson
    682 uid: not edgar
    683 sn: Alan
    684 cn: not edgar
    685 EOF
    686 
    687 RC=$?
    688 if test $RC != 0 ; then
    689 	echo "unique check failed ($RC)!"
    690 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    691 	exit 1
    692 fi
    693 
    694 echo "Making the record non-unique with modrdn..."
    695 $LDAPMODRDN -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD \
    696 	"uid=not edgar,uid=edgar,ou=users,o=unique" "uid=edgar" > $TESTOUT 2>&1
    697 
    698 RC=$?
    699 if test $RC != $RCODEconstraint ; then
    700 	echo "unique check failed ($RC)!"
    701 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    702 	exit 1
    703 fi
    704 
    705 # ITS#6641/8057/8245
    706 echo "Trying to bypass uniqueness as a normal user..."
    707 $LDAPMODRDN -e \!relax -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD \
    708 	"uid=not edgar,uid=edgar,ou=users,o=unique" "uid=edgar" > $TESTOUT 2>&1
    709 
    710 RC=$?
    711 if test $RC != $RCODEnorelax && test $RC != $RCODEconstraint ; then
    712 	echo "unique check failed ($RC)!"
    713 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    714 	exit 1
    715 fi
    716 
    717 echo "Trying to bypass uniqueness as a normal user with a ManageDSAIt control..."
    718 $LDAPMODRDN -M -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD \
    719 	"uid=not edgar,uid=edgar,ou=users,o=unique" "uid=edgar" > $TESTOUT 2>&1
    720 
    721 RC=$?
    722 if test $RC != $RCODEconstraint ; then
    723 	echo "unique check failed ($RC)!"
    724 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    725 	exit 1
    726 fi
    727 
    728 echo "Bypassing uniqueness as an admin user..."
    729 $LDAPMODRDN -e \!relax -D "$UNIQUEDN" -H $URI1 -w $PASSWD \
    730 	"uid=not edgar,uid=edgar,ou=users,o=unique" "uid=edgar" > $TESTOUT 2>&1
    731 
    732 RC=$?
    733 if test $RC != 0 ; then
    734 	echo "spurious unique error ($RC)!"
    735 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    736 	exit $RC
    737 fi
    738 
    739 echo "Cleaning up"
    740 $LDAPDELETE -D "$UNIQUEDN" -H $URI1 -w $PASSWD \
    741     "uid=edgar,uid=edgar,ou=users,o=unique" > $TESTOUT 2>&1
    742 RC=$?
    743 if test $RC != 0; then
    744 	echo "ldapdelete failed ($RC)!"
    745 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    746 	exit $RC
    747 fi
    748 
    749 echo "Adding a record unique in one domain, non-unique in the filtered domain..."
    750 
    751 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    752 	 $TESTOUT 2>&1 << EOF
    753 dn: uid=elvis,ou=users,o=unique
    754 objectClass: inetOrgPerson
    755 uid: elvis
    756 sn: johnson
    757 cn: elvis
    758 EOF
    759 
    760 RC=$?
    761 if test $RC != $RCODEconstraint ; then
    762 	echo "unique check failed ($RC)!"
    763 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    764 	exit 1
    765 fi
    766 
    767 #echo ----------------------
    768 echo Dynamically reconfiguring to use attribute-ignore URIs...
    769 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF \
    770     > $TESTOUT 2>&1 <<EOF
    771 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    772 changetype: modify
    773 replace: olcUniqueURI
    774 olcUniqueURI: ignore ldap:///?objectClass,uid,cn,sn?sub
    775 EOF
    776 RC=$?
    777 if test $RC != 0 ; then
    778 	echo "unable to reconfigure"
    779 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    780 	exit 1
    781 fi
    782 
    783 echo Dynamically retrieving fourth configuration...
    784 $LDAPSEARCH -S "" -b olcOverlay='{0}'unique,olcDatabase='{1}'$BACKEND,cn=config -D cn=config -y $CONFIGPWF -H $URI1 -LLL | tr -d \\r >$TESTDIR/fourth-config.ldif
    785 cat >$TESTDIR/fourth-reference.ldif <<EOF
    786 dn: olcOverlay={0}unique,olcDatabase={1}$BACKEND,cn=config
    787 objectClass: olcOverlayConfig
    788 objectClass: olcUniqueConfig
    789 olcOverlay: {0}unique
    790 olcUniqueURI: ignore ldap:///?objectClass,uid,cn,sn?sub
    791 
    792 EOF
    793 diff $TESTDIR/fourth-config.ldif $TESTDIR/fourth-reference.ldif > /dev/null 2>&1
    794 RC=$?
    795 if test $RC != 0 ; then
    796     echo "Fourth configuration is not reported correctly."
    797     test $KILLSERVERS != no && kill -HUP $KILLPIDS
    798     exit 1
    799 fi
    800 
    801 echo "Adding a record unique in the ignore-domain..."
    802 
    803 $LDAPADD -D "$UNIQUEDN" -H $URI1 -w $PASSWD > \
    804 	 $TESTOUT 2>&1 << EOF
    805 dn: uid=elvis,ou=users,o=unique
    806 objectClass: inetOrgPerson
    807 uid: elvis
    808 sn: johnson
    809 cn: elvis
    810 description: left the building
    811 EOF
    812 
    813 RC=$?
    814 if test $RC != 0 ; then
    815 	echo "unique check failed ($RC)!"
    816 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    817 	exit 1
    818 fi
    819 
    820 echo "Adding a record non-unique in the ignore-domain..."
    821 
    822 $LDAPADD -D "uid=dave,ou=users,o=unique" -H $URI1 -w $PASSWD > \
    823 	 $TESTOUT 2>&1 << EOF
    824 dn: uid=harry,ou=users,o=unique
    825 objectClass: inetOrgPerson
    826 uid: harry
    827 sn: johnson
    828 cn: harry
    829 description: left the building
    830 EOF
    831 
    832 RC=$?
    833 if test $RC != $RCODEconstraint ; then
    834 	echo "unique check failed ($RC)!"
    835 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    836 	exit 1
    837 fi
    838 
    839 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    840 
    841 echo ">>>>> Test succeeded"
    842 
    843 test $KILLSERVERS != no && wait
    844 
    845 exit 0
    846