net-ldap 0.16.1 → 0.16.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cd6f9335c52e3019675ba1733ce49135ffe54da7
4
- data.tar.gz: 6fbe8f791d39bf5934125393bf9eb9ae66351e06
2
+ SHA256:
3
+ metadata.gz: bb65f1bdb6d23c483e83e52762a8873b1a872a798e229320243262a1328cc8d8
4
+ data.tar.gz: 18ab54a1cea6eae374327f6933be93d7b4db83081c65db1f38a0c2600e044b34
5
5
  SHA512:
6
- metadata.gz: ecd3d8ce429ece15a44b9034e7626ddae80112539311b3992c424ac2c26d440d38d829b3d61eb6cc5d425ab5457231863895f32781cd30cb5f346e3c5bedb87d
7
- data.tar.gz: 19300497d3d524dbe8a7658f2e21c92c92380143bc06cf4d5a0928724828b55bbc9515333c9f291459d9a62b95e6049e8e8ca8412538023340c8c3f98e9e8ffe
6
+ metadata.gz: 0d6a96984d362d97954e112a4ebea4b594429a9e26781be7b34f7247f134401a99733d84d84b71aee193d169f1f8ea7fe0ce7b3264c8891d7bfe610198dfae01
7
+ data.tar.gz: 36feb9633daaf4c19a347c039d5abad063fb19f1a3dbb52320f2d8cc2ec56b86137f5f79e5700ba8dc364f1450be56bbcc5aca552e4f642a31f9c149451dfa88
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ publish/
7
7
  Gemfile.lock
8
8
  .bundle
9
9
  bin/
10
+ .idea
@@ -3,12 +3,23 @@ rvm:
3
3
  - 2.0.0
4
4
  - 2.1
5
5
  - 2.2
6
+ - 2.3
7
+ - 2.4
8
+ - 2.5
9
+ - 2.6
6
10
  # optional
7
11
  - ruby-head
8
12
  - jruby-19mode
9
13
  - jruby-head
10
14
  - rbx-2
11
15
 
16
+ addons:
17
+ hosts:
18
+ - ldap.example.org # needed for TLS verification
19
+
20
+ services:
21
+ - docker
22
+
12
23
  env:
13
24
  - INTEGRATION=openldap
14
25
 
@@ -16,7 +27,18 @@ before_install:
16
27
  - gem update bundler
17
28
 
18
29
  install:
19
- - if [ "$INTEGRATION" = "openldap" ]; then sudo script/install-openldap; fi
30
+ - >
31
+ docker run \
32
+ --hostname ldap.example.org \
33
+ --env LDAP_TLS_VERIFY_CLIENT=try \
34
+ -p 389:389 \
35
+ -p 636:636 \
36
+ -v "$(pwd)"/test/fixtures/ldif:/container/service/slapd/assets/config/bootstrap/ldif/custom \
37
+ --name openldap \
38
+ --detach \
39
+ osixia/openldap:1.3.0 \
40
+ --copy-service \
41
+ --loglevel debug \
20
42
  - bundle install
21
43
 
22
44
  script: bundle exec rake ci
@@ -1,3 +1,10 @@
1
+ === Net::LDAP 0.16.2
2
+
3
+ * Net::LDAP#open does not cache bind result {#334}[https://github.com/ruby-ldap/ruby-net-ldap/pull/334]
4
+ * Fix CI build {#333}[https://github.com/ruby-ldap/ruby-net-ldap/pull/333]
5
+ * Fix to "undefined method 'result_code'" {#308}[https://github.com/ruby-ldap/ruby-net-ldap/pull/308]
6
+ * Fixed Exception: incompatible character encodings: ASCII-8BIT and UTF-8 in filter.rb {#285}[https://github.com/ruby-ldap/ruby-net-ldap/pull/285]
7
+
1
8
  === Net::LDAP 0.16.1
2
9
 
3
10
  * Send DN and newPassword with password_modify request {#271}[https://github.com/ruby-ldap/ruby-net-ldap/pull/271]
@@ -53,9 +53,14 @@ This task will run the test suite and the
53
53
  rake rubotest
54
54
 
55
55
  CI takes too long? If your local box supports
56
- {Vagrant}[https://www.vagrantup.com/], you can run most of the tests
57
- in a VM on your local box. For more details and setup instructions, see
58
- {test/support/vm/openldap/README.md}[https://github.com/ruby-ldap/ruby-net-ldap/tree/master/test/support/vm/openldap/README.md]
56
+ {Docker}[https://www.docker.com/], you can also run integration tests locally.
57
+ Simply run:
58
+
59
+ script/ldap-docker
60
+ INTEGRATION=openldap rake test
61
+
62
+ CAVEAT: you need to add the following line to /etc/hosts
63
+ 127.0.0.1 ldap.example.org
59
64
 
60
65
  == Release
61
66
 
@@ -712,7 +712,7 @@ class Net::LDAP
712
712
  begin
713
713
  @open_connection = new_connection
714
714
  payload[:connection] = @open_connection
715
- payload[:bind] = @open_connection.bind(@auth)
715
+ payload[:bind] = @result = @open_connection.bind(@auth)
716
716
  yield self
717
717
  ensure
718
718
  @open_connection.close if @open_connection
@@ -467,6 +467,10 @@ class Net::LDAP::Connection #:nodoc:
467
467
  end
468
468
  end
469
469
 
470
+ if result_pdu.nil?
471
+ raise Net::LDAP::ResponseMissingOrInvalidError, "response missing"
472
+ end
473
+
470
474
  # count number of pages of results
471
475
  payload[:page_count] ||= 0
472
476
  payload[:page_count] += 1
@@ -645,8 +645,15 @@ class Net::LDAP::Filter
645
645
 
646
646
  ##
647
647
  # Converts escaped characters (e.g., "\\28") to unescaped characters
648
+ # @note slawson20170317: Don't attempt to unescape 16 byte binary data which we assume are objectGUIDs
649
+ # The binary form of 5936AE79-664F-44EA-BCCB-5C39399514C6 triggers a BINARY -> UTF-8 conversion error
648
650
  def unescape(right)
649
- right.to_s.gsub(/\\([a-fA-F\d]{2})/) { [$1.hex].pack("U") }
651
+ right = right.to_s
652
+ if right.length == 16 && right.encoding == Encoding::BINARY
653
+ right
654
+ else
655
+ right.to_s.gsub(/\\([a-fA-F\d]{2})/) { [$1.hex].pack("U") }
656
+ end
650
657
  end
651
658
  private :unescape
652
659
 
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class LDAP
3
- VERSION = "0.16.1"
3
+ VERSION = "0.16.2"
4
4
  end
5
5
  end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+ # Usage: script/ldap-docker
3
+ #
4
+ # Starts a openldap docker container ready for integration tests
5
+
6
+ docker run --rm -ti \
7
+ --hostname ldap.example.org \
8
+ --env LDAP_TLS_VERIFY_CLIENT=try \
9
+ -p 389:389 -p 636:636 \
10
+ -v "$(pwd)"/test/fixtures/ldif:/container/service/slapd/assets/config/bootstrap/ldif/custom \
11
+ --name my-openldap-container \
12
+ osixia/openldap:1.3.0 --copy-service --loglevel debug
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC0zCCAlmgAwIBAgIUCfQ+m0pgZ/BjYAJvxrn/bdGNZokwCgYIKoZIzj0EAwMw
3
+ gZYxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxBMUEgQ2FyIFdhc2gxJDAiBgNVBAsT
4
+ G0luZm9ybWF0aW9uIFRlY2hub2xvZ3kgRGVwLjEUMBIGA1UEBxMLQWxidXF1ZXJx
5
+ dWUxEzARBgNVBAgTCk5ldyBNZXhpY28xHzAdBgNVBAMTFmRvY2tlci1saWdodC1i
6
+ YXNlaW1hZ2UwHhcNMTUxMjIzMTM1MzAwWhcNMjAxMjIxMTM1MzAwWjCBljELMAkG
7
+ A1UEBhMCVVMxFTATBgNVBAoTDEExQSBDYXIgV2FzaDEkMCIGA1UECxMbSW5mb3Jt
8
+ YXRpb24gVGVjaG5vbG9neSBEZXAuMRQwEgYDVQQHEwtBbGJ1cXVlcnF1ZTETMBEG
9
+ A1UECBMKTmV3IE1leGljbzEfMB0GA1UEAxMWZG9ja2VyLWxpZ2h0LWJhc2VpbWFn
10
+ ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMZf/12pupAgl8Sm+j8GmjNeNbSFAZWW
11
+ oTmIvf2Mu4LWPHy4bTldkQgHUbBpT3xWz8f0lB/ru7596CHsGoL2A28hxuclq5hb
12
+ Ux1yrIt3bJIY3TuiX25HGTe6kGCJPB1aLaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG
13
+ A1UdEwEB/wQIMAYBAf8CAQIwHQYDVR0OBBYEFE+l6XolXDAYnGLTl4W6ULKHrm74
14
+ MB8GA1UdIwQYMBaAFE+l6XolXDAYnGLTl4W6ULKHrm74MAoGCCqGSM49BAMDA2gA
15
+ MGUCMQCXLZj8okyxW6UTL7hribUUbu63PbjuwIXnwi420DdNsvA9A7fcQEXScWFL
16
+ XAGC8rkCMGcqwXZPSRfwuI9r+R11gTrP92hnaVxs9sjRikctpkQpOyNlIXFPopFK
17
+ 8FdfWPypvA==
18
+ -----END CERTIFICATE-----
@@ -1,19 +1,18 @@
1
- dn: cn=module,cn=config
2
- cn: module
3
- objectClass: olcModuleList
4
- objectClass: top
5
- olcModulePath: /usr/lib/ldap
6
- olcModuleLoad: retcode.la
1
+ dn: cn=module{0},cn=config
2
+ changetype: modify
3
+ add: olcModuleLoad
4
+ olcModuleLoad: retcode
7
5
 
8
6
  # source: http://www.opensource.apple.com/source/OpenLDAP/OpenLDAP-186/OpenLDAP/tests/data/retcode.conf?txt
9
7
 
10
- dn: olcOverlay={2}retcode,olcDatabase={1}hdb,cn=config
8
+ dn: olcOverlay={2}retcode,olcDatabase={1}{{ LDAP_BACKEND }},cn=config
9
+ changetype: add
11
10
  objectClass: olcConfig
12
11
  objectClass: olcRetcodeConfig
13
12
  objectClass: olcOverlayConfig
14
13
  objectClass: top
15
14
  olcOverlay: retcode
16
- olcRetcodeParent: ou=Retcodes,dc=rubyldap,dc=com
15
+ olcRetcodeParent: ou=Retcodes,dc=example,dc=org
17
16
  olcRetcodeInDir: TRUE
18
17
  olcRetcodeSleep: 0
19
18
  olcRetcodeItem: "cn=success" 0x00
@@ -0,0 +1,374 @@
1
+ dn: ou=People,dc=example,dc=org
2
+ objectClass: top
3
+ objectClass: organizationalUnit
4
+ ou: People
5
+
6
+ dn: ou=Groups,dc=example,dc=org
7
+ objectClass: top
8
+ objectClass: organizationalUnit
9
+ ou: Groups
10
+
11
+ # Directory Superuser
12
+ dn: uid=admin,dc=example,dc=org
13
+ uid: admin
14
+ cn: system administrator
15
+ sn: administrator
16
+ objectClass: top
17
+ objectClass: person
18
+ objectClass: organizationalPerson
19
+ objectClass: inetOrgPerson
20
+ displayName: Directory Superuser
21
+ userPassword: passworD1
22
+
23
+ # Users 1-10
24
+
25
+ dn: uid=user1,ou=People,dc=example,dc=org
26
+ uid: user1
27
+ cn: user1
28
+ sn: user1
29
+ objectClass: top
30
+ objectClass: person
31
+ objectClass: organizationalPerson
32
+ objectClass: inetOrgPerson
33
+ userPassword: passworD1
34
+ mail: user1@rubyldap.com
35
+
36
+ dn: uid=user2,ou=People,dc=example,dc=org
37
+ uid: user2
38
+ cn: user2
39
+ sn: user2
40
+ objectClass: top
41
+ objectClass: person
42
+ objectClass: organizationalPerson
43
+ objectClass: inetOrgPerson
44
+ userPassword: passworD1
45
+ mail: user2@rubyldap.com
46
+
47
+ dn: uid=user3,ou=People,dc=example,dc=org
48
+ uid: user3
49
+ cn: user3
50
+ sn: user3
51
+ objectClass: top
52
+ objectClass: person
53
+ objectClass: organizationalPerson
54
+ objectClass: inetOrgPerson
55
+ userPassword: passworD1
56
+ mail: user3@rubyldap.com
57
+
58
+ dn: uid=user4,ou=People,dc=example,dc=org
59
+ uid: user4
60
+ cn: user4
61
+ sn: user4
62
+ objectClass: top
63
+ objectClass: person
64
+ objectClass: organizationalPerson
65
+ objectClass: inetOrgPerson
66
+ userPassword: passworD1
67
+ mail: user4@rubyldap.com
68
+
69
+ dn: uid=user5,ou=People,dc=example,dc=org
70
+ uid: user5
71
+ cn: user5
72
+ sn: user5
73
+ objectClass: top
74
+ objectClass: person
75
+ objectClass: organizationalPerson
76
+ objectClass: inetOrgPerson
77
+ userPassword: passworD1
78
+ mail: user5@rubyldap.com
79
+
80
+ dn: uid=user6,ou=People,dc=example,dc=org
81
+ uid: user6
82
+ cn: user6
83
+ sn: user6
84
+ objectClass: top
85
+ objectClass: person
86
+ objectClass: organizationalPerson
87
+ objectClass: inetOrgPerson
88
+ userPassword: passworD1
89
+ mail: user6@rubyldap.com
90
+
91
+ dn: uid=user7,ou=People,dc=example,dc=org
92
+ uid: user7
93
+ cn: user7
94
+ sn: user7
95
+ objectClass: top
96
+ objectClass: person
97
+ objectClass: organizationalPerson
98
+ objectClass: inetOrgPerson
99
+ userPassword: passworD1
100
+ mail: user7@rubyldap.com
101
+
102
+ dn: uid=user8,ou=People,dc=example,dc=org
103
+ uid: user8
104
+ cn: user8
105
+ sn: user8
106
+ objectClass: top
107
+ objectClass: person
108
+ objectClass: organizationalPerson
109
+ objectClass: inetOrgPerson
110
+ userPassword: passworD1
111
+ mail: user8@rubyldap.com
112
+
113
+ dn: uid=user9,ou=People,dc=example,dc=org
114
+ uid: user9
115
+ cn: user9
116
+ sn: user9
117
+ objectClass: top
118
+ objectClass: person
119
+ objectClass: organizationalPerson
120
+ objectClass: inetOrgPerson
121
+ userPassword: passworD1
122
+ mail: user9@rubyldap.com
123
+
124
+ dn: uid=user10,ou=People,dc=example,dc=org
125
+ uid: user10
126
+ cn: user10
127
+ sn: user10
128
+ objectClass: top
129
+ objectClass: person
130
+ objectClass: organizationalPerson
131
+ objectClass: inetOrgPerson
132
+ userPassword: passworD1
133
+ mail: user10@rubyldap.com
134
+
135
+ # Emailless User
136
+
137
+ dn: uid=emailless-user1,ou=People,dc=example,dc=org
138
+ uid: emailless-user1
139
+ cn: emailless-user1
140
+ sn: emailless-user1
141
+ objectClass: top
142
+ objectClass: person
143
+ objectClass: organizationalPerson
144
+ objectClass: inetOrgPerson
145
+ userPassword: passworD1
146
+
147
+ # Groupless User
148
+
149
+ dn: uid=groupless-user1,ou=People,dc=example,dc=org
150
+ uid: groupless-user1
151
+ cn: groupless-user1
152
+ sn: groupless-user1
153
+ objectClass: top
154
+ objectClass: person
155
+ objectClass: organizationalPerson
156
+ objectClass: inetOrgPerson
157
+ userPassword: passworD1
158
+
159
+ # Admin User
160
+
161
+ dn: uid=admin1,ou=People,dc=example,dc=org
162
+ uid: admin1
163
+ cn: admin1
164
+ sn: admin1
165
+ objectClass: top
166
+ objectClass: person
167
+ objectClass: organizationalPerson
168
+ objectClass: inetOrgPerson
169
+ userPassword: passworD1
170
+ mail: admin1@rubyldap.com
171
+
172
+ # Groups
173
+
174
+ dn: cn=ghe-users,ou=Groups,dc=example,dc=org
175
+ cn: ghe-users
176
+ objectClass: groupOfNames
177
+ member: uid=user1,ou=People,dc=example,dc=org
178
+ member: uid=emailless-user1,ou=People,dc=example,dc=org
179
+
180
+ dn: cn=all-users,ou=Groups,dc=example,dc=org
181
+ cn: all-users
182
+ objectClass: groupOfNames
183
+ member: cn=ghe-users,ou=Groups,dc=example,dc=org
184
+ member: uid=user1,ou=People,dc=example,dc=org
185
+ member: uid=user2,ou=People,dc=example,dc=org
186
+ member: uid=user3,ou=People,dc=example,dc=org
187
+ member: uid=user4,ou=People,dc=example,dc=org
188
+ member: uid=user5,ou=People,dc=example,dc=org
189
+ member: uid=user6,ou=People,dc=example,dc=org
190
+ member: uid=user7,ou=People,dc=example,dc=org
191
+ member: uid=user8,ou=People,dc=example,dc=org
192
+ member: uid=user9,ou=People,dc=example,dc=org
193
+ member: uid=user10,ou=People,dc=example,dc=org
194
+ member: uid=emailless-user1,ou=People,dc=example,dc=org
195
+
196
+ dn: cn=ghe-admins,ou=Groups,dc=example,dc=org
197
+ cn: ghe-admins
198
+ objectClass: groupOfNames
199
+ member: uid=admin1,ou=People,dc=example,dc=org
200
+
201
+ dn: cn=all-admins,ou=Groups,dc=example,dc=org
202
+ cn: all-admins
203
+ objectClass: groupOfNames
204
+ member: cn=ghe-admins,ou=Groups,dc=example,dc=org
205
+ member: uid=admin1,ou=People,dc=example,dc=org
206
+
207
+ dn: cn=n-member-group10,ou=Groups,dc=example,dc=org
208
+ cn: n-member-group10
209
+ objectClass: groupOfNames
210
+ member: uid=user1,ou=People,dc=example,dc=org
211
+ member: uid=user2,ou=People,dc=example,dc=org
212
+ member: uid=user3,ou=People,dc=example,dc=org
213
+ member: uid=user4,ou=People,dc=example,dc=org
214
+ member: uid=user5,ou=People,dc=example,dc=org
215
+ member: uid=user6,ou=People,dc=example,dc=org
216
+ member: uid=user7,ou=People,dc=example,dc=org
217
+ member: uid=user8,ou=People,dc=example,dc=org
218
+ member: uid=user9,ou=People,dc=example,dc=org
219
+ member: uid=user10,ou=People,dc=example,dc=org
220
+
221
+ dn: cn=nested-group1,ou=Groups,dc=example,dc=org
222
+ cn: nested-group1
223
+ objectClass: groupOfNames
224
+ member: uid=user1,ou=People,dc=example,dc=org
225
+ member: uid=user2,ou=People,dc=example,dc=org
226
+ member: uid=user3,ou=People,dc=example,dc=org
227
+ member: uid=user4,ou=People,dc=example,dc=org
228
+ member: uid=user5,ou=People,dc=example,dc=org
229
+
230
+ dn: cn=nested-group2,ou=Groups,dc=example,dc=org
231
+ cn: nested-group2
232
+ objectClass: groupOfNames
233
+ member: uid=user6,ou=People,dc=example,dc=org
234
+ member: uid=user7,ou=People,dc=example,dc=org
235
+ member: uid=user8,ou=People,dc=example,dc=org
236
+ member: uid=user9,ou=People,dc=example,dc=org
237
+ member: uid=user10,ou=People,dc=example,dc=org
238
+
239
+ dn: cn=nested-groups,ou=Groups,dc=example,dc=org
240
+ cn: nested-groups
241
+ objectClass: groupOfNames
242
+ member: cn=nested-group1,ou=Groups,dc=example,dc=org
243
+ member: cn=nested-group2,ou=Groups,dc=example,dc=org
244
+
245
+ dn: cn=n-member-nested-group1,ou=Groups,dc=example,dc=org
246
+ cn: n-member-nested-group1
247
+ objectClass: groupOfNames
248
+ member: cn=nested-group1,ou=Groups,dc=example,dc=org
249
+
250
+ dn: cn=deeply-nested-group0.0.0,ou=Groups,dc=example,dc=org
251
+ cn: deeply-nested-group0.0.0
252
+ objectClass: groupOfNames
253
+ member: uid=user1,ou=People,dc=example,dc=org
254
+ member: uid=user2,ou=People,dc=example,dc=org
255
+ member: uid=user3,ou=People,dc=example,dc=org
256
+ member: uid=user4,ou=People,dc=example,dc=org
257
+ member: uid=user5,ou=People,dc=example,dc=org
258
+
259
+ dn: cn=deeply-nested-group0.0.1,ou=Groups,dc=example,dc=org
260
+ cn: deeply-nested-group0.0.1
261
+ objectClass: groupOfNames
262
+ member: uid=user6,ou=People,dc=example,dc=org
263
+ member: uid=user7,ou=People,dc=example,dc=org
264
+ member: uid=user8,ou=People,dc=example,dc=org
265
+ member: uid=user9,ou=People,dc=example,dc=org
266
+ member: uid=user10,ou=People,dc=example,dc=org
267
+
268
+ dn: cn=deeply-nested-group0.0,ou=Groups,dc=example,dc=org
269
+ cn: deeply-nested-group0.0
270
+ objectClass: groupOfNames
271
+ member: cn=deeply-nested-group0.0.0,ou=Groups,dc=example,dc=org
272
+ member: cn=deeply-nested-group0.0.1,ou=Groups,dc=example,dc=org
273
+
274
+ dn: cn=deeply-nested-group0,ou=Groups,dc=example,dc=org
275
+ cn: deeply-nested-group0
276
+ objectClass: groupOfNames
277
+ member: cn=deeply-nested-group0.0,ou=Groups,dc=example,dc=org
278
+
279
+ dn: cn=deeply-nested-groups,ou=Groups,dc=example,dc=org
280
+ cn: deeply-nested-groups
281
+ objectClass: groupOfNames
282
+ member: cn=deeply-nested-group0,ou=Groups,dc=example,dc=org
283
+
284
+ dn: cn=n-depth-nested-group1,ou=Groups,dc=example,dc=org
285
+ cn: n-depth-nested-group1
286
+ objectClass: groupOfNames
287
+ member: cn=nested-group1,ou=Groups,dc=example,dc=org
288
+
289
+ dn: cn=n-depth-nested-group2,ou=Groups,dc=example,dc=org
290
+ cn: n-depth-nested-group2
291
+ objectClass: groupOfNames
292
+ member: cn=n-depth-nested-group1,ou=Groups,dc=example,dc=org
293
+
294
+ dn: cn=n-depth-nested-group3,ou=Groups,dc=example,dc=org
295
+ cn: n-depth-nested-group3
296
+ objectClass: groupOfNames
297
+ member: cn=n-depth-nested-group2,ou=Groups,dc=example,dc=org
298
+
299
+ dn: cn=n-depth-nested-group4,ou=Groups,dc=example,dc=org
300
+ cn: n-depth-nested-group4
301
+ objectClass: groupOfNames
302
+ member: cn=n-depth-nested-group3,ou=Groups,dc=example,dc=org
303
+
304
+ dn: cn=n-depth-nested-group5,ou=Groups,dc=example,dc=org
305
+ cn: n-depth-nested-group5
306
+ objectClass: groupOfNames
307
+ member: cn=n-depth-nested-group4,ou=Groups,dc=example,dc=org
308
+
309
+ dn: cn=n-depth-nested-group6,ou=Groups,dc=example,dc=org
310
+ cn: n-depth-nested-group6
311
+ objectClass: groupOfNames
312
+ member: cn=n-depth-nested-group5,ou=Groups,dc=example,dc=org
313
+
314
+ dn: cn=n-depth-nested-group7,ou=Groups,dc=example,dc=org
315
+ cn: n-depth-nested-group7
316
+ objectClass: groupOfNames
317
+ member: cn=n-depth-nested-group6,ou=Groups,dc=example,dc=org
318
+
319
+ dn: cn=n-depth-nested-group8,ou=Groups,dc=example,dc=org
320
+ cn: n-depth-nested-group8
321
+ objectClass: groupOfNames
322
+ member: cn=n-depth-nested-group7,ou=Groups,dc=example,dc=org
323
+
324
+ dn: cn=n-depth-nested-group9,ou=Groups,dc=example,dc=org
325
+ cn: n-depth-nested-group9
326
+ objectClass: groupOfNames
327
+ member: cn=n-depth-nested-group8,ou=Groups,dc=example,dc=org
328
+
329
+ dn: cn=head-group,ou=Groups,dc=example,dc=org
330
+ cn: head-group
331
+ objectClass: groupOfNames
332
+ member: cn=tail-group,ou=Groups,dc=example,dc=org
333
+ member: uid=user1,ou=People,dc=example,dc=org
334
+ member: uid=user2,ou=People,dc=example,dc=org
335
+ member: uid=user3,ou=People,dc=example,dc=org
336
+ member: uid=user4,ou=People,dc=example,dc=org
337
+ member: uid=user5,ou=People,dc=example,dc=org
338
+
339
+ dn: cn=tail-group,ou=Groups,dc=example,dc=org
340
+ cn: tail-group
341
+ objectClass: groupOfNames
342
+ member: cn=head-group,ou=Groups,dc=example,dc=org
343
+ member: uid=user6,ou=People,dc=example,dc=org
344
+ member: uid=user7,ou=People,dc=example,dc=org
345
+ member: uid=user8,ou=People,dc=example,dc=org
346
+ member: uid=user9,ou=People,dc=example,dc=org
347
+ member: uid=user10,ou=People,dc=example,dc=org
348
+
349
+ dn: cn=recursively-nested-groups,ou=Groups,dc=example,dc=org
350
+ cn: recursively-nested-groups
351
+ objectClass: groupOfNames
352
+ member: cn=head-group,ou=Groups,dc=example,dc=org
353
+ member: cn=tail-group,ou=Groups,dc=example,dc=org
354
+
355
+ # posixGroup
356
+
357
+ dn: cn=posix-group1,ou=Groups,dc=example,dc=org
358
+ cn: posix-group1
359
+ objectClass: posixGroup
360
+ gidNumber: 1001
361
+ memberUid: user1
362
+ memberUid: user2
363
+ memberUid: user3
364
+ memberUid: user4
365
+ memberUid: user5
366
+
367
+ # missing members
368
+
369
+ dn: cn=missing-users,ou=Groups,dc=example,dc=org
370
+ cn: missing-users
371
+ objectClass: groupOfNames
372
+ member: uid=user1,ou=People,dc=example,dc=org
373
+ member: uid=user2,ou=People,dc=example,dc=org
374
+ member: uid=nonexistent-user,ou=People,dc=example,dc=org