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 case "$BACKEND" in ldif | null) 17 echo "$BACKEND backend does not support access controls, test skipped" 18 exit 0 19 esac 20 21 echo "running defines.sh" 22 . $SRCDIR/scripts/defines.sh 23 24 mkdir -p $TESTDIR $DBDIR1 25 26 echo "Running slapadd to build slapd database..." 27 . $CONFFILTER $BACKEND < $ACLCONF > $CONF1 28 $SLAPADD -f $CONF1 -l $LDIFORDERED 29 RC=$? 30 if test $RC != 0 ; then 31 echo "slapadd failed ($RC)!" 32 exit $RC 33 fi 34 35 echo "Starting slapd on TCP/IP port $PORT1..." 36 $SLAPD -f $CONF1 -h $URI1 -d $LVL > $LOG1 2>&1 & 37 PID=$! 38 if test $WAIT != 0 ; then 39 echo PID $PID 40 read foo 41 fi 42 KILLPIDS="$PID" 43 44 sleep 1 45 46 echo "Testing slapd access control..." 47 for i in 0 1 2 3 4 5; do 48 $LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \ 49 'objectclass=*' > /dev/null 2>&1 50 RC=$? 51 if test $RC = 0 ; then 52 break 53 fi 54 echo "Waiting 5 seconds for slapd to start..." 55 sleep 5 56 done 57 58 if test $RC != 0 ; then 59 echo "ldapsearch failed ($RC)!" 60 test $KILLSERVERS != no && kill -HUP $KILLPIDS 61 exit $RC 62 fi 63 64 cat /dev/null > $SEARCHOUT 65 66 echo "# Try to read an entry inside the Alumni Association container. 67 # It should give us noSuchObject if we're not bound..." \ 68 >> $SEARCHOUT 69 # FIXME: temporarily remove the "No such object" message to make 70 # the test succeed even if SLAP_ACL_HONOR_DISCLOSE is not #define'd 71 $LDAPSEARCH -b "$JAJDN" -H $URI1 "(objectclass=*)" \ 72 2>&1 | grep -v "No such object" >> $SEARCHOUT 73 74 echo "# ... and should return all attributes if we're bound as anyone 75 # under Example." \ 76 >> $SEARCHOUT 77 $LDAPSEARCH -b "$JAJDN" -H $URI1 \ 78 -D "$BABSDN" -w bjensen "(objectclass=*)" >> $SEARCHOUT 2>&1 79 80 # ITS#4253, ITS#4255 81 echo "# Checking exact/regex attrval clause" >> $SEARCHOUT 82 $LDAPSEARCH -H $URI1 \ 83 -D "$BABSDN" -w bjensen \ 84 -b "$MELLIOTDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 85 $LDAPSEARCH -H $URI1 \ 86 -D "$BJORNSDN" -w bjorn \ 87 -b "$MELLIOTDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 88 89 $LDAPSEARCH -H $URI1 \ 90 -D "$BABSDN" -w bjensen \ 91 -b "$JOHNDDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 92 $LDAPSEARCH -H $URI1 \ 93 -D "$BJORNSDN" -w bjorn \ 94 -b "$JOHNDDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 95 96 $LDAPSEARCH -H $URI1 \ 97 -D "$BABSDN" -w bjensen \ 98 -b "$BJORNSDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 99 $LDAPSEARCH -H $URI1 \ 100 -D "$BJORNSDN" -w bjorn \ 101 -b "$BABSDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1 102 103 # check selfwrite access (ITS#4587). 6 attempts are made: 104 # 1) delete someone else (should fail) 105 # 2) delete self (should succeed) 106 # 3) add someone else (should fail) 107 # 4) add someone else and self (should fail) 108 # 5) add self and someone else (should fail) 109 # 6) add self (should succeed) 110 # 111 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 112 $TESTOUT 2>&1 << EOMODS 113 dn: cn=All Staff,ou=Groups,dc=example,dc=com 114 changetype: modify 115 delete: member 116 member: $BABSDN 117 EOMODS 118 RC=$? 119 case $RC in 120 50) 121 ;; 122 0) 123 echo "ldapmodify should have failed ($RC)!" 124 test $KILLSERVERS != no && kill -HUP $KILLPIDS 125 exit 1 126 ;; 127 *) 128 echo "ldapmodify failed ($RC)!" 129 test $KILLSERVERS != no && kill -HUP $KILLPIDS 130 exit $RC 131 ;; 132 esac 133 134 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 135 $TESTOUT 2>&1 << EOMODS 136 dn: cn=All Staff,ou=Groups,dc=example,dc=com 137 changetype: modify 138 delete: member 139 member: $JAJDN 140 EOMODS 141 RC=$? 142 if test $RC != 0 ; then 143 echo "ldapmodify failed ($RC)!" 144 test $KILLSERVERS != no && kill -HUP $KILLPIDS 145 exit $RC 146 fi 147 148 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 149 $TESTOUT 2>&1 << EOMODS 150 dn: cn=All Staff,ou=Groups,dc=example,dc=com 151 changetype: modify 152 add: member 153 member: cn=Foo,ou=Bar 154 EOMODS 155 RC=$? 156 case $RC in 157 50) 158 ;; 159 0) 160 echo "ldapmodify should have failed ($RC)!" 161 test $KILLSERVERS != no && kill -HUP $KILLPIDS 162 exit 1 163 ;; 164 *) 165 echo "ldapmodify failed ($RC)!" 166 test $KILLSERVERS != no && kill -HUP $KILLPIDS 167 exit $RC 168 ;; 169 esac 170 171 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 172 $TESTOUT 2>&1 << EOMODS 173 dn: cn=All Staff,ou=Groups,dc=example,dc=com 174 changetype: modify 175 add: member 176 member: cn=Foo,ou=Bar 177 member: $JAJDN 178 EOMODS 179 RC=$? 180 case $RC in 181 50) 182 ;; 183 0) 184 echo "ldapmodify should have failed ($RC)!" 185 test $KILLSERVERS != no && kill -HUP $KILLPIDS 186 exit 1 187 ;; 188 *) 189 echo "ldapmodify failed ($RC)!" 190 test $KILLSERVERS != no && kill -HUP $KILLPIDS 191 exit $RC 192 ;; 193 esac 194 195 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 196 $TESTOUT 2>&1 << EOMODS 197 dn: cn=All Staff,ou=Groups,dc=example,dc=com 198 changetype: modify 199 add: member 200 member: $JAJDN 201 member: cn=Foo,ou=Bar 202 EOMODS 203 RC=$? 204 case $RC in 205 50) 206 ;; 207 0) 208 echo "ldapmodify should have failed ($RC)!" 209 test $KILLSERVERS != no && kill -HUP $KILLPIDS 210 exit 1 211 ;; 212 *) 213 echo "ldapmodify failed ($RC)!" 214 test $KILLSERVERS != no && kill -HUP $KILLPIDS 215 exit $RC 216 ;; 217 esac 218 219 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 220 $TESTOUT 2>&1 << EOMODS 221 dn: cn=All Staff,ou=Groups,dc=example,dc=com 222 changetype: modify 223 add: member 224 member: $JAJDN 225 EOMODS 226 RC=$? 227 if test $RC != 0 ; then 228 echo "ldapmodify failed ($RC)!" 229 test $KILLSERVERS != no && kill -HUP $KILLPIDS 230 exit $RC 231 fi 232 233 # 234 # Check group access. Try to modify Babs' entry. Two attempts: 235 # 1) bound as "James A Jones 1" - should fail 236 # 2) bound as "Bjorn Jensen" - should succeed 237 238 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 239 $TESTOUT 2>&1 << EOMODS5 240 dn: $BABSDN 241 changetype: modify 242 replace: drink 243 drink: wine 244 EOMODS5 245 RC=$? 246 case $RC in 247 50) 248 ;; 249 0) 250 echo "ldapmodify should have failed ($RC)!" 251 test $KILLSERVERS != no && kill -HUP $KILLPIDS 252 exit 1 253 ;; 254 *) 255 echo "ldapmodify failed ($RC)!" 256 test $KILLSERVERS != no && kill -HUP $KILLPIDS 257 exit $RC 258 ;; 259 esac 260 261 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 262 $TESTOUT 2>&1 << EOMODS6 263 dn: $BABSDN 264 changetype: modify 265 add: homephone 266 homephone: +1 313 555 5444 267 EOMODS6 268 RC=$? 269 case $RC in 270 0) 271 ;; 272 *) 273 echo "ldapmodify failed ($RC)!" 274 test $KILLSERVERS != no && kill -HUP $KILLPIDS 275 exit $RC 276 ;; 277 esac 278 279 # 280 # Try to add a "member" attribute to the "ITD Staff" group. It should 281 # fail when we add some DN other than our own, and should succeed when 282 # we add our own DN. 283 # bjensen 284 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 285 $TESTOUT 2>&1 << EOMODS1 286 version: 1 287 dn: cn=ITD Staff, ou=Groups, dc=example, dc=com 288 changetype: modify 289 add: uniquemember 290 uniquemember: cn=Barbara Jensen,ou=Information Technology Division,ou=People,dc=example,dc=com 291 EOMODS1 292 RC=$? 293 case $RC in 294 50) 295 ;; 296 0) 297 echo "ldapmodify should have failed ($RC)!" 298 test $KILLSERVERS != no && kill -HUP $KILLPIDS 299 exit 1 300 ;; 301 *) 302 echo "ldapmodify failed ($RC)!" 303 test $KILLSERVERS != no && kill -HUP $KILLPIDS 304 exit $RC 305 ;; 306 esac 307 308 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 309 $TESTOUT 2>&1 << EOMODS2 310 version: 1 311 312 dn: cn=ITD Staff, ou=Groups, dc=example, dc=com 313 changetype: modify 314 add: uniquemember 315 uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com 316 EOMODS2 317 RC=$? 318 case $RC in 319 0) 320 ;; 321 *) 322 echo "ldapmodify failed ($RC)!" 323 test $KILLSERVERS != no && kill -HUP $KILLPIDS 324 exit $RC 325 ;; 326 esac 327 328 # 329 # Try to modify the "ITD Staff" group. Two attempts are made: 330 # 1) bound as "James A Jones 1" - should fail 331 # 2) bound as "Bjorn Jensen" - should succeed 332 # 333 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 334 $TESTOUT 2>&1 << EOMODS3 335 336 dn: cn=ITD Staff, ou=Groups, dc=example, dc=com 337 changetype: modify 338 delete: description 339 EOMODS3 340 RC=$? 341 case $RC in 342 50) 343 ;; 344 0) 345 echo "ldapmodify should have failed ($RC)!" 346 test $KILLSERVERS != no && kill -HUP $KILLPIDS 347 exit 1 348 ;; 349 *) 350 echo "ldapmodify failed ($RC)!" 351 test $KILLSERVERS != no && kill -HUP $KILLPIDS 352 exit $RC 353 ;; 354 esac 355 356 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 357 $TESTOUT 2>&1 << EOMODS4 358 # COMMENT 359 version: 1 360 # comment 361 dn: cn=ITD Staff, ou=Groups, dc=example, dc=com 362 # comment 363 changetype: modify 364 # comment 365 add: ou 366 # comment 367 ou: Groups 368 # comment 369 EOMODS4 370 RC=$? 371 case $RC in 372 0) 373 ;; 374 *) 375 echo "ldapmodify failed ($RC)!" 376 test $KILLSERVERS != no && kill -HUP $KILLPIDS 377 exit $RC 378 ;; 379 esac 380 381 # 382 # Try to modify the "ITD Staff" group. Two attempts are made: 383 # 1) bound as "James A Jones 1" - should succeed 384 # 2) bound as "Barbara Jensen" - should fail 385 # should exploit sets 386 # 387 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 388 $TESTOUT 2>&1 << EOMODS5 389 dn: cn=Alumni Assoc Staff, ou=Groups, dc=example, dc=com 390 changetype: modify 391 add: description 392 description: added by jaj (should succeed) 393 - 394 EOMODS5 395 RC=$? 396 case $RC in 397 0) 398 ;; 399 *) 400 echo "ldapmodify failed ($RC)!" 401 test $KILLSERVERS != no && kill -HUP $KILLPIDS 402 exit $RC 403 ;; 404 esac 405 406 $LDAPMODIFY -D "$BABSDN" -H $URI1 -w bjensen >> \ 407 $TESTOUT 2>&1 << EOMODS6 408 dn: cn=Alumni Assoc Staff, ou=Groups, dc=example, dc=com 409 changetype: modify 410 add: description 411 description: added by bjensen (should fail) 412 - 413 EOMODS6 414 RC=$? 415 case $RC in 416 50) 417 ;; 418 0) 419 echo "ldapmodify should have failed ($RC)!" 420 test $KILLSERVERS != no && kill -HUP $KILLPIDS 421 exit 1 422 ;; 423 *) 424 echo "ldapmodify failed ($RC)!" 425 test $KILLSERVERS != no && kill -HUP $KILLPIDS 426 exit $RC 427 ;; 428 esac 429 430 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD >> \ 431 $TESTOUT 2>&1 << EOMODS7 432 dn: ou=Add & Delete,dc=example,dc=com 433 changetype: add 434 objectClass: organizationalUnit 435 ou: Add & Delete 436 EOMODS7 437 RC=$? 438 if test $RC != 0 ; then 439 echo "ldapmodify failed ($RC)!" 440 test $KILLSERVERS != no && kill -HUP $KILLPIDS 441 exit $RC 442 fi 443 444 $LDAPMODIFY -D "$BABSDN" -H $URI1 -w bjensen >> \ 445 $TESTOUT 2>&1 << EOMODS8 446 dn: cn=Added by Babs (must fail),ou=Add & Delete,dc=example,dc=com 447 changetype: add 448 objectClass: inetOrgPerson 449 cn: Added by Babs (must fail) 450 sn: None 451 EOMODS8 452 RC=$? 453 case $RC in 454 50) 455 ;; 456 0) 457 echo "ldapmodify should have failed ($RC)!" 458 test $KILLSERVERS != no && kill -HUP $KILLPIDS 459 exit 1 460 ;; 461 *) 462 echo "ldapmodify failed ($RC)!" 463 test $KILLSERVERS != no && kill -HUP $KILLPIDS 464 exit $RC 465 ;; 466 esac 467 468 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 469 $TESTOUT 2>&1 << EOMODS9 470 dn: cn=Added by Bjorn (must succeed),ou=Add & Delete,dc=example,dc=com 471 changetype: add 472 objectClass: inetOrgPerson 473 cn: Added by Bjorn (must succeed) 474 sn: None 475 476 dn: cn=Added by Bjorn (will be deleted),ou=Add & Delete,dc=example,dc=com 477 changetype: add 478 objectClass: inetOrgPerson 479 cn: Added by Bjorn (will be deleted) 480 sn: None 481 482 dn: cn=Added by Bjorn (will be renamed),ou=Add & Delete,dc=example,dc=com 483 changetype: add 484 objectClass: inetOrgPerson 485 cn: Added by Bjorn (will be renamed) 486 sn: None 487 488 dn: cn=Added by Bjorn (must succeed),ou=Add & Delete,dc=example,dc=com 489 changetype: modify 490 add: description 491 description: this attribute value has been added __after__entry creation 492 description: this attribute value will be deleted by Babs (must succeed) 493 description: Bjorn will try to delete this attribute value (should fail) 494 - 495 EOMODS9 496 RC=$? 497 case $RC in 498 0) 499 ;; 500 *) 501 echo "ldapmodify failed ($RC)!" 502 test $KILLSERVERS != no && kill -HUP $KILLPIDS 503 exit $RC 504 ;; 505 esac 506 507 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 508 $TESTOUT 2>&1 << EOMODS10 509 dn: cn=Added by Bjorn (will be deleted),ou=Add & Delete,dc=example,dc=com 510 changetype: delete 511 EOMODS10 512 RC=$? 513 case $RC in 514 50) 515 ;; 516 0) 517 echo "ldapmodify should have failed ($RC)!" 518 test $KILLSERVERS != no && kill -HUP $KILLPIDS 519 exit 1 520 ;; 521 *) 522 echo "ldapmodify failed ($RC)!" 523 test $KILLSERVERS != no && kill -HUP $KILLPIDS 524 exit $RC 525 ;; 526 esac 527 528 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 529 $TESTOUT 2>&1 << EOMODS11 530 dn: cn=Added by Bjorn (will be renamed),ou=Add & Delete,dc=example,dc=com 531 changetype: modrdn 532 newrdn: cn=Added by Bjorn (renamed by Bjorn) 533 deleteoldrdn: 1 534 EOMODS11 535 RC=$? 536 case $RC in 537 50) 538 ;; 539 0) 540 echo "ldapmodify should have failed ($RC)!" 541 test $KILLSERVERS != no && kill -HUP $KILLPIDS 542 exit 1 543 ;; 544 *) 545 echo "ldapmodify failed ($RC)!" 546 test $KILLSERVERS != no && kill -HUP $KILLPIDS 547 exit $RC 548 ;; 549 esac 550 551 $LDAPMODIFY -D "$BABSDN" -H $URI1 -w bjensen >> \ 552 $TESTOUT 2>&1 << EOMODS12 553 dn: cn=Added by Bjorn (will be renamed),ou=Add & Delete,dc=example,dc=com 554 changetype: modrdn 555 newrdn: cn=Added by Bjorn (renamed by Babs) 556 deleteoldrdn: 1 557 EOMODS12 558 RC=$? 559 case $RC in 560 50) 561 ;; 562 0) 563 echo "ldapmodify should have failed ($RC)!" 564 test $KILLSERVERS != no && kill -HUP $KILLPIDS 565 exit 1 566 ;; 567 *) 568 echo "ldapmodify failed ($RC)!" 569 test $KILLSERVERS != no && kill -HUP $KILLPIDS 570 exit $RC 571 ;; 572 esac 573 574 $LDAPMODIFY -D "$JAJDN" -H $URI1 -w jaj >> \ 575 $TESTOUT 2>&1 << EOMODS13 576 dn: cn=Added by Bjorn (will be renamed),ou=Add & Delete,dc=example,dc=com 577 changetype: modrdn 578 newrdn: cn=Added by Bjorn (renamed by Jaj) 579 deleteoldrdn: 1 580 EOMODS13 581 RC=$? 582 case $RC in 583 0) 584 ;; 585 *) 586 echo "ldapmodify failed ($RC)!" 587 test $KILLSERVERS != no && kill -HUP $KILLPIDS 588 exit $RC 589 ;; 590 esac 591 592 $LDAPMODIFY -D "$BJORNSDN" -H $URI1 -w bjorn >> \ 593 $TESTOUT 2>&1 << EOMODS14 594 dn: cn=Added by Bjorn (must succeed),ou=Add & Delete,dc=example,dc=com 595 changetype: modify 596 delete: description 597 description: Bjorn will try to delete this attribute value (should fail) 598 - 599 EOMODS14 600 RC=$? 601 case $RC in 602 50) 603 ;; 604 0) 605 echo "ldapmodify should have failed ($RC)!" 606 test $KILLSERVERS != no && kill -HUP $KILLPIDS 607 exit 1 608 ;; 609 *) 610 echo "ldapmodify failed ($RC)!" 611 test $KILLSERVERS != no && kill -HUP $KILLPIDS 612 exit $RC 613 ;; 614 esac 615 616 $LDAPMODIFY -D "$BABSDN" -H $URI1 -w bjensen >> \ 617 $TESTOUT 2>&1 << EOMODS15 618 dn: cn=Added by Bjorn (will be deleted),ou=Add & Delete,dc=example,dc=com 619 changetype: delete 620 621 dn: cn=Added by Bjorn (must succeed),ou=Add & Delete,dc=example,dc=com 622 changetype: modify 623 delete: description 624 description: this attribute value will be deleted by Babs (must succeed) 625 - 626 EOMODS15 627 RC=$? 628 case $RC in 629 0) 630 ;; 631 *) 632 echo "ldapmodify failed ($RC)!" 633 test $KILLSERVERS != no && kill -HUP $KILLPIDS 634 exit $RC 635 ;; 636 esac 637 638 echo "Using ldapsearch to retrieve all the entries..." 639 echo "# Using ldapsearch to retrieve all the entries..." >> $SEARCHOUT 640 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \ 641 'objectClass=*' >> $SEARCHOUT 2>&1 642 RC=$? 643 test $KILLSERVERS != no && kill -HUP $KILLPIDS 644 if test $RC != 0 ; then 645 echo "ldapsearch failed ($RC)!" 646 exit $RC 647 fi 648 649 LDIF=$ACLOUTPROVIDER 650 651 echo "Filtering ldapsearch results..." 652 $LDIFFILTER < $SEARCHOUT > $SEARCHFLT 653 echo "Filtering original ldif used to create database..." 654 $LDIFFILTER < $LDIF > $LDIFFLT 655 echo "Comparing filter output..." 656 $CMP $SEARCHFLT $LDIFFLT > $CMPOUT 657 658 if test $? != 0 ; then 659 echo "comparison failed - operations did not complete correctly" 660 exit 1 661 fi 662 663 echo ">>>>> Test succeeded" 664 665 test $KILLSERVERS != no && wait 666 667 exit 0 668