CVE-2018-14628: python:descriptor: let samba-tool dbcheck fix the nTSecurityDescripto...
[metze/samba/wip.git] / testprogs / blackbox / dbcheck-links.sh
1 #!/bin/sh
2
3 if [ $# -lt 1 ]; then
4         cat <<EOF
5 Usage: dbcheck-links.sh PREFIX RELEASE
6 EOF
7         exit 1
8 fi
9
10 PREFIX_ABS="$1"
11 RELEASE="$2"
12 shift 2
13
14 . $(dirname $0)/subunit.sh
15
16 . $(dirname $0)/common_test_fns.inc
17 . $(dirname $0)/common-links.sh
18
19 failed=0
20
21 if [ ! -x $samba_undump ] || [ ! -d $release_dir ]; then
22         subunit_start_test $RELEASE
23         subunit_skip_test $RELEASE <<EOF
24 no test provision
25 EOF
26
27         subunit_start_test "tombstones_expunge"
28         subunit_skip_test "tombstones_expunge" <<EOF
29 no test provision
30 EOF
31
32         exit 0
33 fi
34
35 dbcheck()
36 {
37         tmpfile=$PREFIX_ABS/$RELEASE/expected-dbcheck-link-output${1}.txt.tmp
38         tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp1
39
40         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --scope=base -b '' | grep highestCommittedUSN >$tmpldif1
41
42         $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $3 --fix --yes >$tmpfile
43         if [ "$?" != "$2" ]; then
44                 return 1
45         fi
46         sort $tmpfile | grep -v "^INFO:" >$tmpfile.sorted
47         sort $release_dir/expected-dbcheck-link-output${1}.txt >$tmpfile.expected
48         diff -u $tmpfile.sorted $tmpfile.expected
49         if [ "$?" != "0" ]; then
50                 return 1
51         fi
52
53         tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output${1}2.txt.tmp2
54         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --scope=base -b '' | grep highestCommittedUSN >$tmpldif2
55
56         diff -u $tmpldif1 $tmpldif2
57         if [ "$?" != "0" ]; then
58                 return 1
59         fi
60 }
61
62 dbcheck_acl_reset()
63 {
64         $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --cross-ncs --fix --yes --attrs=nTSecurityDescriptor
65 }
66
67 dbcheck_acl_clean()
68 {
69         $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --cross-ncs --attrs=nTSecurityDescriptor
70 }
71
72 dbcheck_dangling()
73 {
74         dbcheck "" "1" "--selftest-check-expired-tombstones"
75         return $?
76 }
77
78 dbcheck_one_way()
79 {
80         dbcheck "_one_way" "0" "CN=Configuration,DC=release-4-5-0-pre1,DC=samba,DC=corp --selftest-check-expired-tombstones"
81         return $?
82 }
83
84 dbcheck_clean()
85 {
86         tmpldif1=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp1
87
88         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --scope=base -b '' | grep highestCommittedUSN >$tmpldif1
89
90         $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb
91         if [ "$?" != "0" ]; then
92                 return 1
93         fi
94         tmpldif2=$PREFIX_ABS/$RELEASE/expected-dbcheck-output2.txt.tmp2
95         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --scope=base -b '' | grep highestCommittedUSN >$tmpldif2
96
97         diff -u $tmpldif1 $tmpldif2
98         if [ "$?" != "0" ]; then
99                 return 1
100         fi
101 }
102
103 check_expected_after_links()
104 {
105         tmpldif=$PREFIX_ABS/$RELEASE/expected-links-after-link-dbcheck.ldif.tmp
106         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=swimmers)(cn=leaders)(cn=helpers))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted member >$tmpldif
107         diff -u $tmpldif $release_dir/expected-links-after-link-dbcheck.ldif
108         if [ "$?" != "0" ]; then
109                 return 1
110         fi
111 }
112
113 check_expected_after_deleted_links()
114 {
115         tmpldif=$PREFIX_ABS/$RELEASE/expected-deleted-links-after-link-dbcheck.ldif.tmp
116         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=swimmers)(cn=leaders)(cn=helpers))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted member >$tmpldif
117         diff -u $tmpldif $release_dir/expected-deleted-links-after-link-dbcheck.ldif
118         if [ "$?" != "0" ]; then
119                 return 1
120         fi
121 }
122
123 check_expected_after_objects()
124 {
125         tmpldif=$PREFIX_ABS/$RELEASE/expected-objects-after-link-dbcheck.ldif.tmp
126         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(samaccountname=fred)(samaccountname=ddg)(samaccountname=usg)(samaccountname=user1)(samaccountname=user1x)(samaccountname=user2))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted samAccountName | grep sAMAccountName >$tmpldif
127         diff -u $tmpldif $release_dir/expected-objects-after-link-dbcheck.ldif
128         if [ "$?" != "0" ]; then
129                 return 1
130         fi
131 }
132
133 duplicate_member()
134 {
135         # We use an existing group so we have a stable GUID in the
136         # dbcheck output
137         LDIF1=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -b 'CN=Enterprise Admins,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' --scope=base --reveal --extended-dn member)
138         DN=$(echo "${LDIF1}" | grep '^dn: ')
139         MSG=$(echo "${LDIF1}" | grep -v '^dn: ' | grep -v '^#' | grep -v '^$')
140         ldif=$PREFIX_ABS/${RELEASE}/duplicate-member-multi.ldif
141         {
142                 echo "${DN}"
143                 echo "changetype: modify"
144                 echo "replace: member"
145                 echo "${MSG}"
146                 echo "${MSG}" | sed -e 's!RMD_LOCAL_USN=[1-9][0-9]*!RMD_LOCAL_USN=0!'
147         } >$ldif
148
149         TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif
150         if [ "$?" != "0" ]; then
151                 return 1
152         fi
153 }
154
155 dbcheck_duplicate_member()
156 {
157         dbcheck "_duplicate_member" "1" "--selftest-check-expired-tombstones"
158         return $?
159 }
160
161 check_expected_after_duplicate_links()
162 {
163         tmpldif=$PREFIX_ABS/$RELEASE/expected-duplicates-after-link-dbcheck.ldif.tmp
164         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=administrator)(cn=enterprise admins))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted memberOf member >$tmpldif
165         diff -u $tmpldif $release_dir/expected-duplicates-after-link-dbcheck.ldif
166         if [ "$?" != "0" ]; then
167                 return 1
168         fi
169 }
170
171 missing_link_sid_corruption()
172 {
173         # Step1: add user "missingsidu1"
174         #
175         ldif=$PREFIX_ABS/${RELEASE}/missing_link_sid_corruption1.ldif
176         cat >$ldif <<EOF
177 dn: CN=missingsidu1,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
178 changetype: add
179 objectclass: user
180 samaccountname: missingsidu1
181 objectGUID: 0da8f25e-d110-11e8-80b7-3c970ec68461
182 objectSid: S-1-5-21-4177067393-1453636373-93818738-771
183 EOF
184
185         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
186         if [ "$?" != "0" ]; then
187                 echo "ldbmodify returned:\n$out"
188                 return 1
189         fi
190
191         # Step2: add user "missingsidu2"
192         #
193         ldif=$PREFIX_ABS/${RELEASE}/missing_link_sid_corruption2.ldif
194         cat >$ldif <<EOF
195 dn: CN=missingsidu2,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
196 changetype: add
197 objectclass: user
198 samaccountname: missingsidu2
199 objectGUID: 66eb8f52-d110-11e8-ab9b-3c970ec68461
200 objectSid: S-1-5-21-4177067393-1453636373-93818738-772
201 EOF
202
203         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
204         if [ "$?" != "0" ]; then
205                 echo "ldbmodify returned:\n$out"
206                 return 1
207         fi
208
209         # Step3: add group "missingsidg3" and add users as members
210         #
211         ldif=$PREFIX_ABS/${RELEASE}/missing_link_sid_corruption3.ldif
212         cat >$ldif <<EOF
213 dn: CN=missingsidg3,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
214 changetype: add
215 objectclass: group
216 samaccountname: missingsidg3
217 objectGUID: fd992424-d114-11e8-bb36-3c970ec68461
218 objectSid: S-1-5-21-4177067393-1453636373-93818738-773
219 member: CN=missingsidu1,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
220 member: CN=missingsidu2,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
221 EOF
222
223         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
224         if [ "$?" != "0" ]; then
225                 echo "ldbmodify returned:\n$out"
226                 return 1
227         fi
228
229         # Step4: remove one user again, so that we have one deleted link
230         #
231         ldif=$PREFIX_ABS/${RELEASE}/missing_link_sid_corruption4.ldif
232         cat >$ldif <<EOF
233 dn: CN=missingsidg3,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
234 changetype: modify
235 delete: member
236 member: CN=missingsidu1,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
237 EOF
238
239         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
240         if [ "$?" != "0" ]; then
241                 echo "ldbmodify returned:\n$out"
242                 return 1
243         fi
244
245         #
246         # Step5: remove the SIDS from the links
247         #
248         LDIF1=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -b 'CN=missingsidg3,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' --scope=base --reveal --extended-dn --show-binary member)
249         DN=$(echo "${LDIF1}" | grep '^dn: ')
250         MSG=$(echo "${LDIF1}" | grep -v '^dn: ' | grep -v '^#' | grep -v '^$')
251         ldif=$PREFIX_ABS/${RELEASE}/missing_link_sid_corruption5.ldif
252         {
253                 echo "${DN}"
254                 echo "changetype: modify"
255                 echo "replace: member"
256                 #echo "${MSG}"
257                 echo "${MSG}" | sed \
258                         -e 's!<SID=S-1-5-21-4177067393-1453636373-93818738-771>;!!g' \
259                         -e 's!<SID=S-1-5-21-4177067393-1453636373-93818738-772>;!!g' \
260                         -e 's!RMD_ADDTIME=[1-9][0-9]*!RMD_ADDTIME=123456789000000000!g' \
261                         -e 's!RMD_CHANGETIME=[1-9][0-9]*!RMD_CHANGETIME=123456789000000000!g' |
262                         cat
263         } >$ldif
264
265         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
266         if [ "$?" != "0" ]; then
267                 echo "ldbmodify returned:\n$out"
268                 return 1
269         fi
270
271         return 0
272 }
273
274 dbcheck_missing_link_sid_corruption()
275 {
276         dbcheck "-missing-link-sid-corruption" "1" "--selftest-check-expired-tombstones"
277         return $?
278 }
279
280 add_lost_deleted_user1()
281 {
282         ldif=$PREFIX_ABS/${RELEASE}/add_lost_deleted_user1.ldif
283         cat >$ldif <<EOF
284 dn: CN=fred\0ADEL:2301a64c-1234-5678-851e-12d4a711cfb4,OU=removed,DC=release-4-5-0-pre1,DC=samba,DC=corp
285 objectClass: top
286 objectClass: person
287 objectClass: organizationalPerson
288 objectClass: user
289 instanceType: 4
290 whenCreated: 20160629043638.0Z
291 uSNCreated: 3740
292 objectGUID: 2301a64c-1234-5678-851e-12d4a711cfb4
293 objectSid: S-1-5-21-4177067393-1453636373-93818738-1011
294 sAMAccountName: fred
295 userAccountControl: 512
296 isDeleted: TRUE
297 lastKnownParent: <GUID=f28216e9-1234-5678-8b2d-6bb229563b62>;OU=removed,DC=rel
298  ease-4-5-0-pre1,DC=samba,DC=corp
299 isRecycled: TRUE
300 cn:: ZnJlZApERUw6MjMwMWE2NGMtMTIzNC01Njc4LTg1MWUtMTJkNGE3MTFjZmI0
301 name:: ZnJlZApERUw6MjMwMWE2NGMtMTIzNC01Njc4LTg1MWUtMTJkNGE3MTFjZmI0
302 replPropertyMetaData:: AQAAAAAAAAAXAAAAAAAAAAAAAAABAAAAVuGDDQMAAACjlkROuH+XT4o
303  z0jjbi14tnA4AAAAAAACcDgAAAAAAAAMAAAACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4A
304  AAAAAACiDgAAAAAAAAEAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAA
305  AAAAAIAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAADAAAgABAA
306  AAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAABkBAgABAAAAVuGDDQMAAAC
307  jlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAAEACQACAAAAV+GDDQMAAACjlkROuH+XT4oz
308  0jjbi14tog4AAAAAAACiDgAAAAAAAAgACQADAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tng4AA
309  AAAAACeDgAAAAAAABAACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAA
310  AAABkACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAFoACQABAAA
311  AVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAF4ACQABAAAAVuGDDQMAAACj
312  lkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAGAACQADAAAAV+GDDQMAAACjlkROuH+XT4oz0
313  jjbi14tog4AAAAAAACiDgAAAAAAAGIACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAA
314  AAAACiDgAAAAAAAH0ACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAA
315  AAJIACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAJ8ACQACAAAA
316  V+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAN0ACQABAAAAVuGDDQMAAACjl
317  kROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAC4BCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0j
318  jbi14tog4AAAAAAACiDgAAAAAAAJACCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAA
319  AAACiDgAAAAAAAA0DCQABAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAA
320  AA4DCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAAoICQABAAAAV
321  +GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAA==
322 whenChanged: 20160629043639.0Z
323 uSNChanged: 3746
324 nTSecurityDescriptor:: AQAXjBQAAAAwAAAATAAAAMQAAAABBQAAAAAABRUAAACB/fj4FbukVnK
325  PlwUAAgAAAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFAAIAAAQAeAACAAAAB1o4ACAAAAADAAAAvjsO
326  8/Cf0RG2AwAA+ANnwaV6lr/mDdARooUAqgAwSeIBAQAAAAAAAQAAAAAHWjgAIAAAAAMAAAC/Ow7z8
327  J/REbYDAAD4A2fBpXqWv+YN0BGihQCqADBJ4gEBAAAAAAABAAAAAAQA1AcsAAAAAAAkAP8BDwABBQ
328  AAAAAABRUAAACB/fj4FbukVnKPlwUAAgAAAAAUAP8BDwABAQAAAAAABRIAAAAAABgA/wEPAAECAAA
329  AAAAFIAAAACQCAAAAABQAlAACAAEBAAAAAAAFCgAAAAUAKAAAAQAAAQAAAFMacqsvHtARmBkAqgBA
330  UpsBAQAAAAAABQoAAAAFACgAAAEAAAEAAABUGnKrLx7QEZgZAKoAQFKbAQEAAAAAAAUKAAAABQAoA
331  AABAAABAAAAVhpyqy8e0BGYGQCqAEBSmwEBAAAAAAAFCgAAAAUAKAAwAAAAAQAAAIa4tXdKlNERrr
332  0AAPgDZ8EBAQAAAAAABQoAAAAFACgAMAAAAAEAAACylVfkVZTREa69AAD4A2fBAQEAAAAAAAUKAAA
333  ABQAoADAAAAABAAAAs5VX5FWU0RGuvQAA+ANnwQEBAAAAAAAFCgAAAAUAOAAQAAAAAQAAAPiIcAPh
334  CtIRtCIAoMlo+TkBBQAAAAAABRUAAACB/fj4FbukVnKPlwUpAgAABQA4ABAAAAABAAAAAEIWTMAg0
335  BGnaACqAG4FKQEFAAAAAAAFFQAAAIH9+PgVu6RWco+XBSkCAAAFADgAEAAAAAEAAABAwgq8qXnQEZ
336  AgAMBPwtTPAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFKQIAAAAAFAAAAAIAAQEAAAAAAAULAAAABQA
337  oABAAAAABAAAAQi+6WaJ50BGQIADAT8LTzwEBAAAAAAAFCwAAAAUAKAAQAAAAAQAAAIa4tXdKlNER
338  rr0AAPgDZ8EBAQAAAAAABQsAAAAFACgAEAAAAAEAAACzlVfkVZTREa69AAD4A2fBAQEAAAAAAAULA
339  AAABQAoABAAAAABAAAAVAGN5Pi80RGHAgDAT7lgUAEBAAAAAAAFCwAAAAUAKAAAAQAAAQAAAFMacq
340  svHtARmBkAqgBAUpsBAQAAAAAAAQAAAAAFADgAEAAAAAEAAAAQICBfpXnQEZAgAMBPwtTPAQUAAAA
341  AAAUVAAAAgf34+BW7pFZyj5cFKQIAAAUAOAAwAAAAAQAAAH96lr/mDdARooUAqgAwSeIBBQAAAAAA
342  BRUAAACB/fj4FbukVnKPlwUFAgAABQAsABAAAAABAAAAHbGpRq5gWkC36P+KWNRW0gECAAAAAAAFI
343  AAAADACAAAFACwAMAAAAAEAAAAcmrZtIpTREa69AAD4A2fBAQIAAAAAAAUgAAAAMQIAAAUALAAwAA
344  AAAQAAAGK8BVjJvShEpeKFag9MGF4BAgAAAAAABSAAAAAxAgAABRo8ABAAAAADAAAAAEIWTMAg0BG
345  naACqAG4FKRTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAAEIWTMAg
346  0BGnaACqAG4FKbp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAAAECAgX
347  6V50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAEC
348  AgX6V50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAA
349  AQMIKvKl50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAAD
350  AAAAQMIKvKl50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAA
351  AADAAAAQi+6WaJ50BGQIADAT8LTzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8AB
352  AAAAADAAAAQi+6WaJ50BGQIADAT8LTz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo
353  8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5ORTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAA
354  BRI8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5Obp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqA
355  gAABRo4ABAAAAADAAAAbZ7Gt8cs0hGFTgCgyYP2CIZ6lr/mDdARooUAqgAwSeIBAQAAAAAABQkAAA
356  AFGjgAEAAAAAMAAABtnsa3xyzSEYVOAKDJg/YInHqWv+YN0BGihQCqADBJ4gEBAAAAAAAFCQAAAAU
357  SOAAQAAAAAwAAAG2exrfHLNIRhU4AoMmD9gi6epa/5g3QEaKFAKoAMEniAQEAAAAAAAUJAAAABRos
358  AJQAAgACAAAAFMwoSDcUvEWbB61vAV5fKAECAAAAAAAFIAAAACoCAAAFGiwAlAACAAIAAACcepa/5
359  g3QEaKFAKoAMEniAQIAAAAAAAUgAAAAKgIAAAUSLACUAAIAAgAAALp6lr/mDdARooUAqgAwSeIBAg
360  AAAAAABSAAAAAqAgAABRIoADABAAABAAAA3kfmkW/ZcEuVV9Y/9PPM2AEBAAAAAAAFCgAAAAASJAD
361  /AQ8AAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFBwIAAAASGAAEAAAAAQIAAAAAAAUgAAAAKgIAAAAS
362  GAC9AQ8AAQIAAAAAAAUgAAAAIAIAAA==
363 EOF
364
365         out=$(TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
366         if [ "$?" != "0" ]; then
367                 echo "ldbadd returned:\n$out"
368                 return 1
369         fi
370
371         return 0
372 }
373
374 dbcheck_lost_deleted_user1()
375 {
376         dbcheck "-lost-deleted-user1" "1" "--selftest-check-expired-tombstones"
377         return $?
378 }
379
380 remove_lost_deleted_user1()
381 {
382         out=$(TZ=UTC $ldbdel -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb "<GUID=2301a64c-1234-5678-851e-12d4a711cfb4>" --show-recycled --relax)
383         if [ "$?" != "0" ]; then
384                 echo "ldbdel returned:\n$out"
385                 return 1
386         fi
387
388         return 0
389 }
390
391 add_lost_deleted_user2()
392 {
393         ldif=$PREFIX_ABS/${RELEASE}/add_lost_deleted_user2.ldif
394         cat >$ldif <<EOF
395 dn: CN=fred\0ADEL:2301a64c-8765-4321-851e-12d4a711cfb4,CN=LostAndFound,DC=release-4-5-0-pre1,DC=samba,DC=corp
396 objectClass: top
397 objectClass: person
398 objectClass: organizationalPerson
399 objectClass: user
400 instanceType: 4
401 whenCreated: 20160629043638.0Z
402 uSNCreated: 3740
403 objectGUID: 2301a64c-8765-4321-851e-12d4a711cfb4
404 objectSid: S-1-5-21-4177067393-1453636373-93818738-1001
405 sAMAccountName: fred
406 userAccountControl: 512
407 isDeleted: TRUE
408 lastKnownParent: OU=removed,DC=release-4-5-0-pre1,DC=samba,DC=corp
409 isRecycled: TRUE
410 cn:: ZnJlZApERUw6MjMwMWE2NGMtODc2NS00MzIxLTg1MWUtMTJkNGE3MTFjZmI0
411 name:: ZnJlZApERUw6MjMwMWE2NGMtODc2NS00MzIxLTg1MWUtMTJkNGE3MTFjZmI0
412 replPropertyMetaData:: AQAAAAAAAAAXAAAAAAAAAAAAAAABAAAAVuGDDQMAAACjlkROuH+XT4o
413  z0jjbi14tnA4AAAAAAACcDgAAAAAAAAMAAAACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4A
414  AAAAAACiDgAAAAAAAAEAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAA
415  AAAAAIAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAADAAAgABAA
416  AAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAABkBAgABAAAAVuGDDQMAAAC
417  jlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAAEACQAEAAAAePOWEgMAAACjlkROuH+XT4oz
418  0jjbi14tvA4AAAAAAAC8DgAAAAAAAAgACQADAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tng4AA
419  AAAAACeDgAAAAAAABAACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAA
420  AAABkACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAFoACQABAAA
421  AVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAF4ACQABAAAAVuGDDQMAAACj
422  lkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAGAACQADAAAAV+GDDQMAAACjlkROuH+XT4oz0
423  jjbi14tog4AAAAAAACiDgAAAAAAAGIACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAA
424  AAAACiDgAAAAAAAH0ACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAA
425  AAJIACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAJ8ACQACAAAA
426  V+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAN0ACQABAAAAVuGDDQMAAACjl
427  kROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAC4BCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0j
428  jbi14tog4AAAAAAACiDgAAAAAAAJACCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAA
429  AAACiDgAAAAAAAA0DCQADAAAAePOWEgMAAACjlkROuH+XT4oz0jjbi14tvQ4AAAAAAAC9DgAAAAAA
430  AA4DCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAAoICQABAAAAV
431  +GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAA==
432 whenChanged: 20160629043639.0Z
433 uSNChanged: 3746
434 nTSecurityDescriptor:: AQAXjBQAAAAwAAAATAAAAMQAAAABBQAAAAAABRUAAACB/fj4FbukVnK
435  PlwUAAgAAAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFAAIAAAQAeAACAAAAB1o4ACAAAAADAAAAvjsO
436  8/Cf0RG2AwAA+ANnwaV6lr/mDdARooUAqgAwSeIBAQAAAAAAAQAAAAAHWjgAIAAAAAMAAAC/Ow7z8
437  J/REbYDAAD4A2fBpXqWv+YN0BGihQCqADBJ4gEBAAAAAAABAAAAAAQA1AcsAAAAAAAkAP8BDwABBQ
438  AAAAAABRUAAACB/fj4FbukVnKPlwUAAgAAAAAUAP8BDwABAQAAAAAABRIAAAAAABgA/wEPAAECAAA
439  AAAAFIAAAACQCAAAAABQAlAACAAEBAAAAAAAFCgAAAAUAKAAAAQAAAQAAAFMacqsvHtARmBkAqgBA
440  UpsBAQAAAAAABQoAAAAFACgAAAEAAAEAAABUGnKrLx7QEZgZAKoAQFKbAQEAAAAAAAUKAAAABQAoA
441  AABAAABAAAAVhpyqy8e0BGYGQCqAEBSmwEBAAAAAAAFCgAAAAUAKAAwAAAAAQAAAIa4tXdKlNERrr
442  0AAPgDZ8EBAQAAAAAABQoAAAAFACgAMAAAAAEAAACylVfkVZTREa69AAD4A2fBAQEAAAAAAAUKAAA
443  ABQAoADAAAAABAAAAs5VX5FWU0RGuvQAA+ANnwQEBAAAAAAAFCgAAAAUAOAAQAAAAAQAAAPiIcAPh
444  CtIRtCIAoMlo+TkBBQAAAAAABRUAAACB/fj4FbukVnKPlwUpAgAABQA4ABAAAAABAAAAAEIWTMAg0
445  BGnaACqAG4FKQEFAAAAAAAFFQAAAIH9+PgVu6RWco+XBSkCAAAFADgAEAAAAAEAAABAwgq8qXnQEZ
446  AgAMBPwtTPAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFKQIAAAAAFAAAAAIAAQEAAAAAAAULAAAABQA
447  oABAAAAABAAAAQi+6WaJ50BGQIADAT8LTzwEBAAAAAAAFCwAAAAUAKAAQAAAAAQAAAIa4tXdKlNER
448  rr0AAPgDZ8EBAQAAAAAABQsAAAAFACgAEAAAAAEAAACzlVfkVZTREa69AAD4A2fBAQEAAAAAAAULA
449  AAABQAoABAAAAABAAAAVAGN5Pi80RGHAgDAT7lgUAEBAAAAAAAFCwAAAAUAKAAAAQAAAQAAAFMacq
450  svHtARmBkAqgBAUpsBAQAAAAAAAQAAAAAFADgAEAAAAAEAAAAQICBfpXnQEZAgAMBPwtTPAQUAAAA
451  AAAUVAAAAgf34+BW7pFZyj5cFKQIAAAUAOAAwAAAAAQAAAH96lr/mDdARooUAqgAwSeIBBQAAAAAA
452  BRUAAACB/fj4FbukVnKPlwUFAgAABQAsABAAAAABAAAAHbGpRq5gWkC36P+KWNRW0gECAAAAAAAFI
453  AAAADACAAAFACwAMAAAAAEAAAAcmrZtIpTREa69AAD4A2fBAQIAAAAAAAUgAAAAMQIAAAUALAAwAA
454  AAAQAAAGK8BVjJvShEpeKFag9MGF4BAgAAAAAABSAAAAAxAgAABRo8ABAAAAADAAAAAEIWTMAg0BG
455  naACqAG4FKRTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAAEIWTMAg
456  0BGnaACqAG4FKbp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAAAECAgX
457  6V50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAEC
458  AgX6V50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAA
459  AQMIKvKl50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAAD
460  AAAAQMIKvKl50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAA
461  AADAAAAQi+6WaJ50BGQIADAT8LTzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8AB
462  AAAAADAAAAQi+6WaJ50BGQIADAT8LTz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo
463  8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5ORTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAA
464  BRI8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5Obp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqA
465  gAABRo4ABAAAAADAAAAbZ7Gt8cs0hGFTgCgyYP2CIZ6lr/mDdARooUAqgAwSeIBAQAAAAAABQkAAA
466  AFGjgAEAAAAAMAAABtnsa3xyzSEYVOAKDJg/YInHqWv+YN0BGihQCqADBJ4gEBAAAAAAAFCQAAAAU
467  SOAAQAAAAAwAAAG2exrfHLNIRhU4AoMmD9gi6epa/5g3QEaKFAKoAMEniAQEAAAAAAAUJAAAABRos
468  AJQAAgACAAAAFMwoSDcUvEWbB61vAV5fKAECAAAAAAAFIAAAACoCAAAFGiwAlAACAAIAAACcepa/5
469  g3QEaKFAKoAMEniAQIAAAAAAAUgAAAAKgIAAAUSLACUAAIAAgAAALp6lr/mDdARooUAqgAwSeIBAg
470  AAAAAABSAAAAAqAgAABRIoADABAAABAAAA3kfmkW/ZcEuVV9Y/9PPM2AEBAAAAAAAFCgAAAAASJAD
471  /AQ8AAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFBwIAAAASGAAEAAAAAQIAAAAAAAUgAAAAKgIAAAAS
472  GAC9AQ8AAQIAAAAAAAUgAAAAIAIAAA==
473 EOF
474
475         out=$(TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
476         if [ "$?" != "0" ]; then
477                 echo "ldbadd returned:\n$out"
478                 return 1
479         fi
480
481         return 0
482 }
483
484 dbcheck_lost_deleted_user2()
485 {
486         dbcheck "-lost-deleted-user2" "1" "--selftest-check-expired-tombstones"
487         return $?
488 }
489
490 add_lost_deleted_user3()
491 {
492         ldif=$PREFIX_ABS/${RELEASE}/add_lost_deleted_user3.ldif
493         cat >$ldif <<EOF
494 dn: CN=fred\0ADEL:2301a64c-1122-5566-851e-12d4a711cfb4,OU=removed,DC=release-4-5-0-pre1,DC=samba,DC=corp
495 objectClass: top
496 objectClass: person
497 objectClass: organizationalPerson
498 objectClass: user
499 instanceType: 4
500 whenCreated: 20160629043638.0Z
501 uSNCreated: 3740
502 objectGUID: 2301a64c-1122-5566-851e-12d4a711cfb4
503 objectSid: S-1-5-21-4177067393-1453636373-93818738-1010
504 sAMAccountName: fred
505 userAccountControl: 512
506 isDeleted: TRUE
507 lastKnownParent: <GUID=f28216e9-1234-5678-8b2d-6bb229563b62>;OU=removed,DC=rel
508  ease-4-5-0-pre1,DC=samba,DC=corp
509 isRecycled: TRUE
510 cn:: ZnJlZApERUw6MjMwMWE2NGMtMTEyMi01NTY2LTg1MWUtMTJkNGE3MTFjZmI0
511 name:: ZnJlZApERUw6MjMwMWE2NGMtMTEyMi01NTY2LTg1MWUtMTJkNGE3MTFjZmI0
512 replPropertyMetaData:: AQAAAAAAAAAXAAAAAAAAAAAAAAABAAAAVuGDDQMAAACjlkROuH+XT4o
513  z0jjbi14tnA4AAAAAAACcDgAAAAAAAAMAAAACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4A
514  AAAAAACiDgAAAAAAAAEAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAA
515  AAAAAIAAgABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAADAAAgABAA
516  AAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAABkBAgABAAAAVuGDDQMAAAC
517  jlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAAEACQACAAAAV+GDDQMAAACjlkROuH+XT4oz
518  0jjbi14tog4AAAAAAACiDgAAAAAAAAgACQADAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tng4AA
519  AAAAACeDgAAAAAAABAACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAA
520  AAABkACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAFoACQABAAA
521  AVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAF4ACQABAAAAVuGDDQMAAACj
522  lkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAAAAGAACQADAAAAV+GDDQMAAACjlkROuH+XT4oz0
523  jjbi14tog4AAAAAAACiDgAAAAAAAGIACQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAA
524  AAAACiDgAAAAAAAH0ACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnQ4AAAAAAACdDgAAAAA
525  AAJIACQABAAAAVuGDDQMAAACjlkROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAJ8ACQACAAAA
526  V+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAN0ACQABAAAAVuGDDQMAAACjl
527  kROuH+XT4oz0jjbi14tnA4AAAAAAACcDgAAAAAAAC4BCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0j
528  jbi14tog4AAAAAAACiDgAAAAAAAJACCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAA
529  AAACiDgAAAAAAAA0DCQABAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAA
530  AA4DCQACAAAAV+GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAAoICQABAAAAV
531  +GDDQMAAACjlkROuH+XT4oz0jjbi14tog4AAAAAAACiDgAAAAAAAA==
532 whenChanged: 20160629043639.0Z
533 uSNChanged: 3746
534 nTSecurityDescriptor:: AQAXjBQAAAAwAAAATAAAAMQAAAABBQAAAAAABRUAAACB/fj4FbukVnK
535  PlwUAAgAAAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFAAIAAAQAeAACAAAAB1o4ACAAAAADAAAAvjsO
536  8/Cf0RG2AwAA+ANnwaV6lr/mDdARooUAqgAwSeIBAQAAAAAAAQAAAAAHWjgAIAAAAAMAAAC/Ow7z8
537  J/REbYDAAD4A2fBpXqWv+YN0BGihQCqADBJ4gEBAAAAAAABAAAAAAQA1AcsAAAAAAAkAP8BDwABBQ
538  AAAAAABRUAAACB/fj4FbukVnKPlwUAAgAAAAAUAP8BDwABAQAAAAAABRIAAAAAABgA/wEPAAECAAA
539  AAAAFIAAAACQCAAAAABQAlAACAAEBAAAAAAAFCgAAAAUAKAAAAQAAAQAAAFMacqsvHtARmBkAqgBA
540  UpsBAQAAAAAABQoAAAAFACgAAAEAAAEAAABUGnKrLx7QEZgZAKoAQFKbAQEAAAAAAAUKAAAABQAoA
541  AABAAABAAAAVhpyqy8e0BGYGQCqAEBSmwEBAAAAAAAFCgAAAAUAKAAwAAAAAQAAAIa4tXdKlNERrr
542  0AAPgDZ8EBAQAAAAAABQoAAAAFACgAMAAAAAEAAACylVfkVZTREa69AAD4A2fBAQEAAAAAAAUKAAA
543  ABQAoADAAAAABAAAAs5VX5FWU0RGuvQAA+ANnwQEBAAAAAAAFCgAAAAUAOAAQAAAAAQAAAPiIcAPh
544  CtIRtCIAoMlo+TkBBQAAAAAABRUAAACB/fj4FbukVnKPlwUpAgAABQA4ABAAAAABAAAAAEIWTMAg0
545  BGnaACqAG4FKQEFAAAAAAAFFQAAAIH9+PgVu6RWco+XBSkCAAAFADgAEAAAAAEAAABAwgq8qXnQEZ
546  AgAMBPwtTPAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFKQIAAAAAFAAAAAIAAQEAAAAAAAULAAAABQA
547  oABAAAAABAAAAQi+6WaJ50BGQIADAT8LTzwEBAAAAAAAFCwAAAAUAKAAQAAAAAQAAAIa4tXdKlNER
548  rr0AAPgDZ8EBAQAAAAAABQsAAAAFACgAEAAAAAEAAACzlVfkVZTREa69AAD4A2fBAQEAAAAAAAULA
549  AAABQAoABAAAAABAAAAVAGN5Pi80RGHAgDAT7lgUAEBAAAAAAAFCwAAAAUAKAAAAQAAAQAAAFMacq
550  svHtARmBkAqgBAUpsBAQAAAAAAAQAAAAAFADgAEAAAAAEAAAAQICBfpXnQEZAgAMBPwtTPAQUAAAA
551  AAAUVAAAAgf34+BW7pFZyj5cFKQIAAAUAOAAwAAAAAQAAAH96lr/mDdARooUAqgAwSeIBBQAAAAAA
552  BRUAAACB/fj4FbukVnKPlwUFAgAABQAsABAAAAABAAAAHbGpRq5gWkC36P+KWNRW0gECAAAAAAAFI
553  AAAADACAAAFACwAMAAAAAEAAAAcmrZtIpTREa69AAD4A2fBAQIAAAAAAAUgAAAAMQIAAAUALAAwAA
554  AAAQAAAGK8BVjJvShEpeKFag9MGF4BAgAAAAAABSAAAAAxAgAABRo8ABAAAAADAAAAAEIWTMAg0BG
555  naACqAG4FKRTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAAEIWTMAg
556  0BGnaACqAG4FKbp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAAAECAgX
557  6V50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAADAAAAEC
558  AgX6V50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAAAADAAA
559  AQMIKvKl50BGQIADAT8LUzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8ABAAAAAD
560  AAAAQMIKvKl50BGQIADAT8LUz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo8ABAAA
561  AADAAAAQi+6WaJ50BGQIADAT8LTzxTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAABRI8AB
562  AAAAADAAAAQi+6WaJ50BGQIADAT8LTz7p6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqAgAABRo
563  8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5ORTMKEg3FLxFmwetbwFeXygBAgAAAAAABSAAAAAqAgAA
564  BRI8ABAAAAADAAAA+IhwA+EK0hG0IgCgyWj5Obp6lr/mDdARooUAqgAwSeIBAgAAAAAABSAAAAAqA
565  gAABRo4ABAAAAADAAAAbZ7Gt8cs0hGFTgCgyYP2CIZ6lr/mDdARooUAqgAwSeIBAQAAAAAABQkAAA
566  AFGjgAEAAAAAMAAABtnsa3xyzSEYVOAKDJg/YInHqWv+YN0BGihQCqADBJ4gEBAAAAAAAFCQAAAAU
567  SOAAQAAAAAwAAAG2exrfHLNIRhU4AoMmD9gi6epa/5g3QEaKFAKoAMEniAQEAAAAAAAUJAAAABRos
568  AJQAAgACAAAAFMwoSDcUvEWbB61vAV5fKAECAAAAAAAFIAAAACoCAAAFGiwAlAACAAIAAACcepa/5
569  g3QEaKFAKoAMEniAQIAAAAAAAUgAAAAKgIAAAUSLACUAAIAAgAAALp6lr/mDdARooUAqgAwSeIBAg
570  AAAAAABSAAAAAqAgAABRIoADABAAABAAAA3kfmkW/ZcEuVV9Y/9PPM2AEBAAAAAAAFCgAAAAASJAD
571  /AQ8AAQUAAAAAAAUVAAAAgf34+BW7pFZyj5cFBwIAAAASGAAEAAAAAQIAAAAAAAUgAAAAKgIAAAAS
572  GAC9AQ8AAQIAAAAAAAUgAAAAIAIAAA==
573 EOF
574
575         out=$(TZ=UTC $ldbadd -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
576         if [ "$?" != "0" ]; then
577                 echo "ldbadd returned:\n$out"
578                 return 1
579         fi
580
581         return 0
582 }
583
584 dbcheck_lost_deleted_user3()
585 {
586         # here we don't pass --selftest-check-expired-tombstones
587         # as we want to test the default
588         dbcheck "-lost-deleted-user3" "0" ""
589         return $?
590 }
591
592 remove_lost_deleted_user3()
593 {
594         out=$(TZ=UTC $ldbdel -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb "<GUID=2301a64c-1122-5566-851e-12d4a711cfb4>" --show-recycled --relax)
595         if [ "$?" != "0" ]; then
596                 echo "ldbdel returned:\n$out"
597                 return 1
598         fi
599
600         return 0
601 }
602
603 forward_link_corruption()
604 {
605         #
606         # Step1: add a duplicate forward link from
607         # "CN=Enterprise Admins" to "CN=Administrator"
608         #
609         LDIF1=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb -b 'CN=Enterprise Admins,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp' --scope=base --reveal --extended-dn member)
610         DN=$(echo "${LDIF1}" | grep '^dn: ')
611         MSG=$(echo "${LDIF1}" | grep -v '^dn: ' | grep -v '^#' | grep -v '^$')
612         ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption1.ldif
613         {
614                 echo "${DN}"
615                 echo "changetype: modify"
616                 echo "replace: member"
617                 echo "${MSG}"
618                 echo "${MSG}" | sed -e 's!RMD_LOCAL_USN=[1-9][0-9]*!RMD_LOCAL_USN=0!'
619         } >$ldif
620
621         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
622         if [ "$?" != "0" ]; then
623                 echo "ldbmodify returned:\n$out"
624                 return 1
625         fi
626
627         #
628         # Step2: add user "dangling"
629         #
630         ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption2.ldif
631         cat >$ldif <<EOF
632 dn: CN=dangling,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp
633 changetype: add
634 objectclass: user
635 samaccountname: dangling
636 objectGUID: fd8a04ac-cea0-4921-b1a6-c173e1155c22
637 EOF
638
639         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
640         if [ "$?" != "0" ]; then
641                 echo "ldbmodify returned:\n$out"
642                 return 1
643         fi
644
645         #
646         # Step3: add a dangling backlink from
647         # "CN=dangling" to "CN=Enterprise Admins"
648         #
649         ldif=$PREFIX_ABS/${RELEASE}/forward_link_corruption3.ldif
650         {
651                 echo "dn: CN=dangling,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
652                 echo "changetype: modify"
653                 echo "add: memberOf"
654                 echo "memberOf: <GUID=304ad703-468b-465e-9787-470b3dfd7d75>;<SID=S-1-5-21-4177067393-1453636373-93818738-519>;CN=Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
655         } >$ldif
656
657         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
658         if [ "$?" != "0" ]; then
659                 echo "ldbmodify returned:\n$out"
660                 return 1
661         fi
662 }
663
664 dbcheck_forward_link_corruption()
665 {
666         dbcheck "-forward-link-corruption" "1" "--selftest-check-expired-tombstones"
667         return $?
668 }
669
670 check_expected_after_dbcheck_forward_link_corruption()
671 {
672         tmpldif=$PREFIX_ABS/$RELEASE/expected-after-dbcheck-forward-link-corruption.ldif.tmp
673         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(cn=dangling)(cn=enterprise admins))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted memberOf member >$tmpldif
674         diff -u $tmpldif $release_dir/expected-after-dbcheck-forward-link-corruption.ldif
675         if [ "$?" != "0" ]; then
676                 return 1
677         fi
678 }
679
680 oneway_link_corruption()
681 {
682         #
683         # Step1: add  OU "dangling-ou"
684         #
685         ldif=$PREFIX_ABS/${RELEASE}/oneway_link_corruption.ldif
686         cat >$ldif <<EOF
687 dn: OU=dangling-ou,DC=release-4-5-0-pre1,DC=samba,DC=corp
688 changetype: add
689 objectclass: organizationalUnit
690 objectGUID: 20600e7c-92bb-492e-9552-f3ed7f8a2cad
691 EOF
692
693         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
694         if [ "$?" != "0" ]; then
695                 echo "ldbmodify returned:\n$out"
696                 return 1
697         fi
698
699         #
700         # Step2: add  msExchConfigurationContainer "dangling-msexch"
701         #
702         ldif=$PREFIX_ABS/${RELEASE}/oneway_link_corruption2.ldif
703         cat >$ldif <<EOF
704 dn: OU=dangling-from,DC=release-4-5-0-pre1,DC=samba,DC=corp
705 changetype: add
706 objectclass: organizationalUnit
707 seeAlso: OU=dangling-ou,DC=release-4-5-0-pre1,DC=samba,DC=corp
708 EOF
709
710         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $ldif)
711         if [ "$?" != "0" ]; then
712                 echo "ldbmodify returned:\n$out"
713                 return 1
714         fi
715
716         #
717         # Step3: rename dangling-ou to dangling-ou2
718         #
719         # Because this is a one-way link we don't fix it at runtime
720         #
721         out=$(TZ=UTC $ldbrename -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb OU=dangling-ou,DC=release-4-5-0-pre1,DC=samba,DC=corp OU=dangling-ou2,DC=release-4-5-0-pre1,DC=samba,DC=corp)
722         if [ "$?" != "0" ]; then
723                 echo "ldbmodify returned:\n$out"
724                 return 1
725         fi
726 }
727
728 dbcheck_oneway_link_corruption()
729 {
730         dbcheck "-oneway-link-corruption" "0" "--selftest-check-expired-tombstones"
731         return $?
732 }
733
734 check_expected_after_dbcheck_oneway_link_corruption()
735 {
736         tmpldif=$PREFIX_ABS/$RELEASE/expected-after-dbcheck-oneway-link-corruption.ldif.tmp
737         TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(|(ou=dangling-ou)(ou=dangling-ou2)(ou=dangling-from))' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --sorted seeAlso >$tmpldif
738         diff -u $tmpldif $release_dir/expected-after-dbcheck-oneway-link-corruption.ldif
739         if [ "$?" != "0" ]; then
740                 return 1
741         fi
742 }
743
744 dbcheck_dangling_multi_valued()
745 {
746
747         $PYTHON $BINDIR/samba-tool dbcheck -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --selftest-check-expired-tombstones --fix --yes
748         if [ "$?" != "1" ]; then
749                 return 1
750         fi
751 }
752
753 dangling_multi_valued_check_missing()
754 {
755         WORDS=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi2)' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l)
756         if [ $WORDS -ne 4 ]; then
757                 echo Got only $WORDS links for dangling-multi2
758                 return 1
759         fi
760         WORDS=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi3)' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l)
761         if [ $WORDS -ne 4 ]; then
762                 echo Got only $WORDS links for dangling-multi3
763                 return 1
764         fi
765 }
766
767 dangling_multi_valued_check_equal_or_too_many()
768 {
769         WORDS=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi1)' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l)
770         if [ $WORDS -ne 4 ]; then
771                 echo Got $WORDS links for dangling-multi1
772                 return 1
773         fi
774
775         WORDS=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=dangling-multi5)' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l)
776
777         if [ $WORDS -ne 0 ]; then
778                 echo Got $WORDS links for dangling-multi5
779                 return 1
780         fi
781
782         WORDS=$(TZ=UTC $ldbsearch -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb '(samaccountname=Administrator)' --scope=sub -b DC=release-4-5-0-pre1,DC=samba,DC=corp --show-deleted --reveal --sorted msDS-RevealedDSAs | grep msDS-RevealedDSAs | wc -l)
783
784         if [ $WORDS -ne 2 ]; then
785                 echo Got $WORDS links for Administrator
786                 return 1
787         fi
788 }
789
790 dangling_link_does_not_prevent_delete()
791 {
792
793         #
794         # Step1: add user "dangling"
795         #
796         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished1.ldif
797         dn='CN=dangling-for-vanish,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp'
798         cat >$ldif <<EOF
799 dn: $dn
800 changetype: add
801 objectclass: user
802 samaccountname: dangling-v
803 objectGUID: fd8a04ac-cea0-4921-b1a6-c173e1155c23
804 EOF
805
806         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
807         if [ "$?" != "0" ]; then
808                 echo "ldbmodify returned:\n$out"
809                 return 1
810         fi
811
812         #
813         # Step2: add a dangling backlink from
814         # "CN=dangling-for-vanish" to "CN=Enterprise Admins"
815         #
816         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished2.ldif
817         {
818                 echo "dn: $dn"
819                 echo "changetype: modify"
820                 echo "add: memberOf"
821                 echo "memberOf: <GUID=304ad703-468b-465e-9787-470b3dfd7d75>;<SID=S-1-5-21-4177067393-1453636373-93818738-519>;CN=Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
822         } >$ldif
823
824         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
825         if [ "$?" != "0" ]; then
826                 echo "ldbmodify returned:\n$out"
827                 return 1
828         fi
829
830         out=$(TZ=UTC $ldbdel -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb "$dn")
831         if [ "$?" != "0" ]; then
832                 echo "ldbdel returned:\n$out"
833                 return 1
834         fi
835 }
836
837 dangling_link_to_unknown_does_not_prevent_delete()
838 {
839
840         #
841         # Step1: add user "dangling"
842         #
843         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished1.ldif
844         dn='CN=dangling-for-vanish,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp'
845         cat >$ldif <<EOF
846 dn: $dn
847 changetype: add
848 objectclass: user
849 samaccountname: dangling-v
850 objectGUID: a4090081-ac2a-410c-8924-b255375160e8
851 EOF
852
853         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
854         if [ "$?" != "0" ]; then
855                 echo "ldbmodify returned:\n$out"
856                 return 1
857         fi
858
859         #
860         # Step2: add a dangling backlink from
861         # "CN=dangling-for-vanish" to "CN=NOT Enterprise Admins"
862         #
863         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished2.ldif
864         {
865                 echo "dn: $dn"
866                 echo "changetype: modify"
867                 echo "add: memberOf"
868                 echo "memberOf: <GUID=09a47bff-0227-44e1-a8e4-63f9e726515d>;<SID=S-1-5-21-4177067393-1453636373-93818738-588>;CN=NOT Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
869         } >$ldif
870
871         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
872         if [ "$?" != "0" ]; then
873                 echo "ldbmodify returned:\n$out"
874                 return 1
875         fi
876
877         out=$(TZ=UTC $ldbdel -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb "$dn")
878         if [ "$?" != "0" ]; then
879                 echo "ldbdel returned:\n$out"
880                 return 1
881         fi
882 }
883
884 dangling_link_to_known_and_unknown_does_not_prevent_delete()
885 {
886
887         #
888         # Step1: add user "dangling"
889         #
890         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished1.ldif
891         dn='CN=dangling-for-vanish,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp'
892         cat >$ldif <<EOF
893 dn: $dn
894 changetype: add
895 objectclass: user
896 samaccountname: dangling-v
897 objectGUID: 2882ffb1-31c3-485e-a7fc-184dfafc32d4
898 EOF
899
900         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --relax $ldif)
901         if [ "$?" != "0" ]; then
902                 echo "ldbmodify returned:\n$out"
903                 return 1
904         fi
905
906         #
907         # Step2: add a dangling backlink from
908         # "CN=dangling-for-vanish" to "CN=Enterprise Admins",
909         # "CN=dangling-for-vanish" to "CN=NOT Enterprise Admins" and
910         # back to ourselves
911         #
912         ldif=$PREFIX_ABS/${RELEASE}/backlink_can_be_vanished2.ldif
913         {
914                 echo "dn: $dn"
915                 echo "changetype: modify"
916                 echo "add: memberOf"
917                 echo "memberOf: <GUID=304ad703-468b-465e-9787-470b3dfd7d75>;<SID=S-1-5-21-4177067393-1453636373-93818738-519>;CN=Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
918                 echo "memberOf: <GUID=09a47bff-0227-44e1-a8e4-63f9e726515d>;<SID=S-1-5-21-4177067393-1453636373-93818738-588>;CN=NOT Enterprise Admins,CN=Users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
919                 echo "memberOf: <GUID=2882ffb1-31c3-485e-a7fc-184dfafc32d4>;CN=dangling-for-vanish,CN=users,DC=release-4-5-0-pre1,DC=samba,DC=corp"
920         } >$ldif
921
922         out=$(TZ=UTC $ldbmodify -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb.d/DC%3DRELEASE-4-5-0-PRE1,DC%3DSAMBA,DC%3DCORP.ldb $ldif)
923         if [ "$?" != "0" ]; then
924                 echo "ldbmodify returned:\n$out"
925                 return 1
926         fi
927
928         out=$(TZ=UTC $ldbdel -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb "$dn")
929         if [ "$?" != "0" ]; then
930                 echo "ldbdel returned:\n$out"
931                 return 1
932         fi
933 }
934
935 remove_directory $PREFIX_ABS/${RELEASE}
936
937 testit $RELEASE undump || failed=$(expr $failed + 1)
938 testit_expect_failure "dbcheck_acl_reset" dbcheck_acl_reset || failed=$(expr $failed + 1)
939 testit "dbcheck_acl_clean" dbcheck_acl_clean || failed=$(expr $failed + 1)
940 testit "add_two_more_users" add_two_more_users || failed=$(expr $failed + 1)
941 testit "add_four_more_links" add_four_more_links || failed=$(expr $failed + 1)
942 testit "remove_one_link" remove_one_link || failed=$(expr $failed + 1)
943 testit "remove_one_user" remove_one_user || failed=$(expr $failed + 1)
944 testit "move_one_user" move_one_user || failed=$(expr $failed + 1)
945 testit "add_dangling_link" add_dangling_link || failed=$(expr $failed + 1)
946 testit "add_dangling_backlink" add_dangling_backlink || failed=$(expr $failed + 1)
947 testit "add_deleted_dangling_backlink" add_deleted_dangling_backlink || failed=$(expr $failed + 1)
948 testit "revive_links_on_deleted_group" revive_links_on_deleted_group || failed=$(expr $failed + 1)
949 testit "revive_backlink_on_deleted_group" revive_backlink_on_deleted_group || failed=$(expr $failed + 1)
950 testit "add_deleted_target_link" add_deleted_target_link || failed=$(expr $failed + 1)
951 testit "add_deleted_target_backlink" add_deleted_target_backlink || failed=$(expr $failed + 1)
952 testit "dbcheck_dangling" dbcheck_dangling || failed=$(expr $failed + 1)
953 testit "dbcheck_clean" dbcheck_clean || failed=$(expr $failed + 1)
954 testit "check_expected_after_deleted_links" check_expected_after_deleted_links || failed=$(expr $failed + 1)
955 testit "check_expected_after_links" check_expected_after_links || failed=$(expr $failed + 1)
956 testit "check_expected_after_objects" check_expected_after_objects || failed=$(expr $failed + 1)
957 testit "duplicate_member" duplicate_member || failed=$(expr $failed + 1)
958 testit "dbcheck_duplicate_member" dbcheck_duplicate_member || failed=$(expr $failed + 1)
959 testit "check_expected_after_duplicate_links" check_expected_after_duplicate_links || failed=$(expr $failed + 1)
960 testit "duplicate_clean" dbcheck_clean || failed=$(expr $failed + 1)
961 testit "forward_link_corruption" forward_link_corruption || failed=$(expr $failed + 1)
962 testit "dbcheck_forward_link_corruption" dbcheck_forward_link_corruption || failed=$(expr $failed + 1)
963 testit "check_expected_after_dbcheck_forward_link_corruption" check_expected_after_dbcheck_forward_link_corruption || failed=$(expr $failed + 1)
964 testit "forward_link_corruption_clean" dbcheck_clean || failed=$(expr $failed + 1)
965 testit "oneway_link_corruption" oneway_link_corruption || failed=$(expr $failed + 1)
966 testit "dbcheck_oneway_link_corruption" dbcheck_oneway_link_corruption || failed=$(expr $failed + 1)
967 testit "check_expected_after_dbcheck_oneway_link_corruption" check_expected_after_dbcheck_oneway_link_corruption || failed=$(expr $failed + 1)
968 testit "oneway_link_corruption_clean" dbcheck_clean || failed=$(expr $failed + 1)
969 testit "dangling_one_way_link" dangling_one_way_link || failed=$(expr $failed + 1)
970 testit "dbcheck_one_way" dbcheck_one_way || failed=$(expr $failed + 1)
971 testit "dbcheck_clean2" dbcheck_clean || failed=$(expr $failed + 1)
972 testit "missing_link_sid_corruption" missing_link_sid_corruption || failed=$(expr $failed + 1)
973 testit "dbcheck_missing_link_sid_corruption" dbcheck_missing_link_sid_corruption || failed=$(expr $failed + 1)
974 testit "missing_link_sid_clean" dbcheck_clean || failed=$(expr $failed + 1)
975 testit "add_lost_deleted_user1" add_lost_deleted_user1 || failed=$(expr $failed + 1)
976 testit "dbcheck_lost_deleted_user1" dbcheck_lost_deleted_user1 || failed=$(expr $failed + 1)
977 testit "lost_deleted_user1_clean_A" dbcheck_clean || failed=$(expr $failed + 1)
978 testit "remove_lost_deleted_user1" remove_lost_deleted_user1 || failed=$(expr $failed + 1)
979 testit "lost_deleted_user1_clean_B" dbcheck_clean || failed=$(expr $failed + 1)
980 testit "add_lost_deleted_user2" add_lost_deleted_user2 || failed=$(expr $failed + 1)
981 testit "dbcheck_lost_deleted_user2" dbcheck_lost_deleted_user2 || failed=$(expr $failed + 1)
982 testit "lost_deleted_user2_clean" dbcheck_clean || failed=$(expr $failed + 1)
983 testit "add_lost_deleted_user3" add_lost_deleted_user3 || failed=$(expr $failed + 1)
984 testit "dbcheck_lost_deleted_user3" dbcheck_lost_deleted_user3 || failed=$(expr $failed + 1)
985 testit "lost_deleted_user3_clean_A" dbcheck_clean || failed=$(expr $failed + 1)
986 testit "remove_lost_deleted_user3" remove_lost_deleted_user3 || failed=$(expr $failed + 1)
987 testit "lost_deleted_user3_clean_B" dbcheck_clean || failed=$(expr $failed + 1)
988 testit "dangling_one_way_dn" dangling_one_way_dn || failed=$(expr $failed + 1)
989 testit "deleted_one_way_dn" deleted_one_way_dn || failed=$(expr $failed + 1)
990 testit "dbcheck_clean3" dbcheck_clean || failed=$(expr $failed + 1)
991 testit "add_dangling_multi_valued" add_dangling_multi_valued || failed=$(expr $failed + 1)
992 testit "dbcheck_dangling_multi_valued" dbcheck_dangling_multi_valued || failed=$(expr $failed + 1)
993 testit "dangling_multi_valued_check_missing" dangling_multi_valued_check_missing || failed=$(expr $failed + 1)
994 testit "dangling_multi_valued_check_equal_or_too_many" dangling_multi_valued_check_equal_or_too_many || failed=$(expr $failed + 1)
995 # Currently this cannot pass
996 testit "dbcheck_dangling_multi_valued_clean" dbcheck_clean || failed=$(expr $failed + 1)
997 testit "dangling_link_does_not_prevent_delete" dangling_link_does_not_prevent_delete || failed=$(expr $failed + 1)
998 testit "dangling_link_to_unknown_does_not_prevent_delete" dangling_link_to_unknown_does_not_prevent_delete || failed=$(expr $failed + 1)
999 testit "dangling_link_to_known_and_unknown_does_not_prevent_delete" dangling_link_to_known_and_unknown_does_not_prevent_delete || failed=$(expr $failed + 1)
1000
1001 remove_directory $PREFIX_ABS/${RELEASE}
1002
1003 exit $failed