]> git.sur5r.net Git - openldap/blob - tests/scripts/test006-acls
aad1b51ee729361ba2ae5a18c73bb31cfbf776e5
[openldap] / tests / scripts / test006-acls
1 #! /bin/sh
2 # $OpenLDAP$
3 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 ##
5 ## Copyright 1998-2017 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 $MONITORDB < $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 $TIMING > $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 $LOCALHOST -p $PORT1 \
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 $LOCALHOST -p $PORT1 "(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 $LOCALHOST -p $PORT1 \
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 $LOCALHOST -p $PORT1 \
83         -D "$BABSDN" -w bjensen \
84         -b "$MELLIOTDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1
85 $LDAPSEARCH -h $LOCALHOST -p $PORT1 \
86         -D "$BJORNSDN" -w bjorn \
87         -b "$MELLIOTDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1
88
89 $LDAPSEARCH -h $LOCALHOST -p $PORT1 \
90         -D "$BABSDN" -w bjensen \
91         -b "$JOHNDDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1
92 $LDAPSEARCH -h $LOCALHOST -p $PORT1 \
93         -D "$BJORNSDN" -w bjorn \
94         -b "$JOHNDDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1
95
96 $LDAPSEARCH -h $LOCALHOST -p $PORT1 \
97         -D "$BABSDN" -w bjensen \
98         -b "$BJORNSDN" -s base "(objectclass=*)" cn >> $SEARCHOUT 2>&1
99 $LDAPSEARCH -h $LOCALHOST -p $PORT1 \
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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 -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 $LOCALHOST -p $PORT1 \
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=$ACLOUTMASTER
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