ladle 0.1.0-java → 0.1.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ 0.1.1
2
+ =====
3
+
4
+ - Allowed disabling anonymous access to the server. See the
5
+ `:allow_anonymous` option on {Ladle::Server#initialize}.
6
+ - Added passwords to default people.
7
+ - Internal: ensured that specs properly close sockets so that the
8
+ suite will pass on Linux.
9
+
1
10
  0.1.0
2
11
  =====
3
12
 
data/README.md CHANGED
@@ -14,7 +14,7 @@ It is a wrapper around [ApacheDS][] (a pure-java embeddable LDAP
14
14
  server), so it needs Java 1.5 or later available whether you are using
15
15
  JRuby or not.
16
16
 
17
- [ApacheDS]: http://directory.apache.org/apacheds/1.5/index.html
17
+ [ApacheDS]: http://directory.apache.org/apacheds/1.0/index.html
18
18
 
19
19
  Ladle in 30 seconds
20
20
  -------------------
@@ -106,11 +106,20 @@ default data. You can peruse it in `lib/ladle/default.ldif`.
106
106
 
107
107
  Note also that you will usually need to provide both the `:ldif` and
108
108
  `:domain` configuration parameters. The latter must be the domain
109
- matching the data in the former. (N.b. the implicit restriction of
110
- the data to a single domain.)
109
+ component (dc) matching the data in the former. (N.b. the implicit
110
+ restriction of the data to a single domain.)
111
111
 
112
112
  [rfc2849]: http://tools.ietf.org/rfc/rfc2849.txt
113
113
 
114
+ Project links
115
+ -------------
116
+
117
+ * [API documentation](http://rubydoc.info/github/rsutphin/ladle/master/frames)
118
+ * [Continuous integration](https://ctms-ci.nubic.northwestern.edu/hudson/job/ladle/)
119
+ * [Issue tracking](http://github.com/rsutphin/ladle/issues)
120
+
121
+ Non-issue questions can be sent to rhett@detailedbalance.net.
122
+
114
123
  About
115
124
  -----
116
125
 
@@ -15,6 +15,8 @@ sn: Adams
15
15
  givenName: Alexandra
16
16
  mail: alexandra@example.org
17
17
  uid: aa729
18
+ # Password is "smada"
19
+ userpassword: {SHA}pGlmZX1VOEdHHb30HZezeVNFxGM=
18
20
 
19
21
  dn: uid=bb459,ou=people,dc=example,dc=org
20
22
  objectClass: top
@@ -26,6 +28,8 @@ sn: Baldwin
26
28
  givenName: Belle
27
29
  mail: belle@example.org
28
30
  uid: bb459
31
+ # Password is "niwdlab"
32
+ userpassword: {SHA}LRif2N+5TDSaO/rdkH2HHF8fF74=
29
33
 
30
34
  dn: uid=cc414,ou=people,dc=example,dc=org
31
35
  objectClass: top
@@ -37,6 +41,8 @@ sn: Carpenter
37
41
  givenName: Claire
38
42
  mail: claire@example.org
39
43
  uid: cc414
44
+ # Password is "retneprac"
45
+ userpassword: {SHA}UL/iS+2R7GhwbhXOWoTHd4/qoMA=
40
46
 
41
47
  dn: uid=dd945,ou=people,dc=example,dc=org
42
48
  objectClass: top
@@ -48,6 +54,8 @@ sn: Dawson
48
54
  givenName: Dorothy
49
55
  mail: dorothy@example.org
50
56
  uid: dd945
57
+ # Password is "noswad"
58
+ userpassword: {SHA}D0UlcTfbCddFLwih04ig4DEilAc=
51
59
 
52
60
  dn: uid=ee855,ou=people,dc=example,dc=org
53
61
  objectClass: top
@@ -59,6 +67,8 @@ sn: Emerson
59
67
  givenName: Elizabeth
60
68
  mail: elizabeth@example.org
61
69
  uid: ee855
70
+ # Password is "nosreme"
71
+ userpassword: {SHA}pheE9wd/iTps6f8bJjM6AePjwrU=
62
72
 
63
73
  dn: uid=ff531,ou=people,dc=example,dc=org
64
74
  objectClass: top
@@ -70,6 +80,8 @@ sn: Fuller
70
80
  givenName: Freya
71
81
  mail: freya@example.org
72
82
  uid: ff531
83
+ # Password is "relluf"
84
+ userpassword: {SHA}HLU2WZjFf/PF0Pp4qSDzoB3x+bs=
73
85
 
74
86
  dn: uid=gg855,ou=people,dc=example,dc=org
75
87
  objectClass: top
@@ -81,6 +93,8 @@ sn: Gonzales
81
93
  givenName: Grace
82
94
  mail: grace@example.org
83
95
  uid: gg855
96
+ # Password is "selaznog"
97
+ userpassword: {SHA}zT4oO9pFXIj+ISIc60bvM8A5+UQ=
84
98
 
85
99
  dn: uid=hh153,ou=people,dc=example,dc=org
86
100
  objectClass: top
@@ -92,6 +106,8 @@ sn: Hatfield
92
106
  givenName: Hilda
93
107
  mail: hilda@example.org
94
108
  uid: hh153
109
+ # Password is "dleiftah"
110
+ userpassword: {SHA}PTDJLPy4kwa7VZ/sGLyCPzZ7d3o=
95
111
 
96
112
  dn: uid=ii711,ou=people,dc=example,dc=org
97
113
  objectClass: top
@@ -103,6 +119,8 @@ sn: Ingram
103
119
  givenName: Iona
104
120
  mail: iona@example.org
105
121
  uid: ii711
122
+ # Password is "margni"
123
+ userpassword: {SHA}L7qElLblWuLNFPrFku60uCuCr7Q=
106
124
 
107
125
  dn: uid=jj243,ou=people,dc=example,dc=org
108
126
  objectClass: top
@@ -114,6 +132,8 @@ sn: Jackson
114
132
  givenName: Josephine
115
133
  mail: josephine@example.org
116
134
  uid: jj243
135
+ # Password is "noskcaj"
136
+ userpassword: {SHA}ElqdCxdbvRNqXBgdUdkCmGZlQmk=
117
137
 
118
138
  dn: uid=kk891,ou=people,dc=example,dc=org
119
139
  objectClass: top
@@ -125,6 +145,8 @@ sn: Kline
125
145
  givenName: Kelly
126
146
  mail: kelly@example.org
127
147
  uid: kk891
148
+ # Password is "enilk"
149
+ userpassword: {SHA}WlNzQqBB/QoEKh3LRcLZHgnCGNw=
128
150
 
129
151
  dn: uid=ll819,ou=people,dc=example,dc=org
130
152
  objectClass: top
@@ -136,6 +158,8 @@ sn: Lawrence
136
158
  givenName: Leah
137
159
  mail: leah@example.org
138
160
  uid: ll819
161
+ # Password is "ecnerwal"
162
+ userpassword: {SHA}CzyyPOSrIxgFCm24nSv2FA8wihQ=
139
163
 
140
164
  dn: uid=mm405,ou=people,dc=example,dc=org
141
165
  objectClass: top
@@ -147,6 +171,8 @@ sn: Maddox
147
171
  givenName: Mona
148
172
  mail: mona@example.org
149
173
  uid: mm405
174
+ # Password is "xoddam"
175
+ userpassword: {SHA}WiCnxkOb4kpy16ON7ZC6mD/iqII=
150
176
 
151
177
  dn: uid=nn297,ou=people,dc=example,dc=org
152
178
  objectClass: top
@@ -158,6 +184,8 @@ sn: Nash
158
184
  givenName: Noel
159
185
  mail: noel@example.org
160
186
  uid: nn297
187
+ # Password is "hsan"
188
+ userpassword: {SHA}1zOsG076wDkikQbnK5vAMM1BM/o=
161
189
 
162
190
  dn: uid=oo981,ou=people,dc=example,dc=org
163
191
  objectClass: top
@@ -169,6 +197,8 @@ sn: Osborn
169
197
  givenName: Ophelia
170
198
  mail: ophelia@example.org
171
199
  uid: oo981
200
+ # Password is "nrobso"
201
+ userpassword: {SHA}w8mQw0kEa1UiWzMsNclD/LWzlgs=
172
202
 
173
203
  dn: uid=pp468,ou=people,dc=example,dc=org
174
204
  objectClass: top
@@ -180,6 +210,8 @@ sn: Patel
180
210
  givenName: Penelope
181
211
  mail: penelope@example.org
182
212
  uid: pp468
213
+ # Password is "letap"
214
+ userpassword: {SHA}p7jaVoRIV9o8gDPbN10sEhXaYHk=
183
215
 
184
216
  dn: uid=qq612,ou=people,dc=example,dc=org
185
217
  objectClass: top
@@ -191,6 +223,8 @@ sn: Queen
191
223
  givenName: Quin
192
224
  mail: quin@example.org
193
225
  uid: qq612
226
+ # Password is "neeuq"
227
+ userpassword: {SHA}v9ibNIx42giCH4tQnwUHJy6LeJg=
194
228
 
195
229
  dn: uid=rr477,ou=people,dc=example,dc=org
196
230
  objectClass: top
@@ -202,6 +236,8 @@ sn: Rowland
202
236
  givenName: Ruth
203
237
  mail: ruth@example.org
204
238
  uid: rr477
239
+ # Password is "dnalwor"
240
+ userpassword: {SHA}S3eMb2C/ctXzbFnlgcH7ZQ/fozU=
205
241
 
206
242
  dn: uid=ss198,ou=people,dc=example,dc=org
207
243
  objectClass: top
@@ -213,6 +249,8 @@ sn: Solomon
213
249
  givenName: Serena
214
250
  mail: serena@example.org
215
251
  uid: ss198
252
+ # Password is "nomolos"
253
+ userpassword: {SHA}EizIKlU79Kz1Y2WIV4deIh0MSA8=
216
254
 
217
255
  dn: uid=tt882,ou=people,dc=example,dc=org
218
256
  objectClass: top
@@ -224,6 +262,8 @@ sn: Torres
224
262
  givenName: Talia
225
263
  mail: talia@example.org
226
264
  uid: tt882
265
+ # Password is "serrot"
266
+ userpassword: {SHA}yO0DcSZ4fTMcx3sTHnAPQGvMkwg=
227
267
 
228
268
  dn: uid=uu972,ou=people,dc=example,dc=org
229
269
  objectClass: top
@@ -235,6 +275,8 @@ sn: Underwood
235
275
  givenName: Ursula
236
276
  mail: ursula@example.org
237
277
  uid: uu972
278
+ # Password is "doowrednu"
279
+ userpassword: {SHA}GQWGu8IvIEFU1PP34qGi5DyDF/c=
238
280
 
239
281
  dn: uid=vv180,ou=people,dc=example,dc=org
240
282
  objectClass: top
@@ -246,6 +288,8 @@ sn: Vickers
246
288
  givenName: Vera
247
289
  mail: vera@example.org
248
290
  uid: vv180
291
+ # Password is "srekciv"
292
+ userpassword: {SHA}3UrzY38O4R1GLK6ccSSfL4D0efQ=
249
293
 
250
294
  dn: uid=ww369,ou=people,dc=example,dc=org
251
295
  objectClass: top
@@ -257,6 +301,8 @@ sn: Wise
257
301
  givenName: Wendy
258
302
  mail: wendy@example.org
259
303
  uid: ww369
304
+ # Password is "esiw"
305
+ userpassword: {SHA}8gU4KSqUeeLRPov2tmXZXgOZw78=
260
306
 
261
307
  dn: uid=xx396,ou=people,dc=example,dc=org
262
308
  objectClass: top
@@ -268,6 +314,8 @@ sn: Xiong
268
314
  givenName: Xara
269
315
  mail: xara@example.org
270
316
  uid: xx396
317
+ # Password is "gnoix"
318
+ userpassword: {SHA}Yc2En2R/sbdjlEOitkLlkwY4jAY=
271
319
 
272
320
  dn: uid=yy423,ou=people,dc=example,dc=org
273
321
  objectClass: top
@@ -279,6 +327,8 @@ sn: Yates
279
327
  givenName: Yvette
280
328
  mail: yvette@example.org
281
329
  uid: yy423
330
+ # Password is "setay"
331
+ userpassword: {SHA}iKBhwF+Mbbct6mlmy6AvodIek3E=
282
332
 
283
333
  dn: uid=zz882,ou=people,dc=example,dc=org
284
334
  objectClass: top
@@ -290,3 +340,6 @@ sn: Zimmerman
290
340
  givenName: Zana
291
341
  mail: zana@example.org
292
342
  uid: zz882
343
+ # Password is "namremmiz"
344
+ userpassword: {SHA}KlsWojnknRWCHXGoBOTlEZxxrG8=
345
+
@@ -40,7 +40,8 @@ public class Main {
40
40
  new Integer(commandLine.getOptionValue("p")),
41
41
  commandLine.getOptionValue("d"),
42
42
  new File(commandLine.getOptionValue("l")),
43
- new File(commandLine.getOptionValue("t")));
43
+ new File(commandLine.getOptionValue('t')),
44
+ !commandLine.hasOption('A'));
44
45
 
45
46
  Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
46
47
  public void run() {
@@ -110,6 +111,10 @@ public class Main {
110
111
  withLongOpt("tmpdir").hasArg().isRequired().
111
112
  withDescription("Specify the temporary directory to use").
112
113
  create('t'))
114
+ .addOption(OptionBuilder.
115
+ withLongOpt("no-anonymous").
116
+ withDescription("Disable anonymous access").
117
+ create('A'))
113
118
  ;
114
119
  CommandLineParser parser = new GnuParser();
115
120
 
@@ -35,13 +35,17 @@ public class Server {
35
35
 
36
36
  private final int port;
37
37
  private final String domainComponent;
38
+ private final boolean allowAnonymous;
38
39
  private final File tempDir;
39
40
  private final File ldifDir;
40
41
  private boolean running = false;
41
42
 
42
- public Server(int port, String domainComponent, File ldifFile, File tempDirBase) {
43
+ public Server(
44
+ int port, String domainComponent, File ldifFile, File tempDirBase, boolean allowAnonymous
45
+ ) {
43
46
  this.port = port;
44
47
  this.domainComponent = domainComponent;
48
+ this.allowAnonymous = allowAnonymous;
45
49
  this.tempDir = createTempDir(tempDirBase);
46
50
  this.ldifDir = prepareLdif(ldifFile);
47
51
  }
@@ -98,7 +102,7 @@ public class Server {
98
102
  cfg.setLdifDirectory(ldifDir);
99
103
  cfg.setEnableNetworking(true);
100
104
  cfg.setLdapPort(port);
101
- cfg.setAllowAnonymousAccess(true);
105
+ cfg.setAllowAnonymousAccess(allowAnonymous);
102
106
  cfg.setAccessControlEnabled(false);
103
107
  cfg.setShutdownHookEnabled(false);
104
108
  cfg.setContextPartitionConfigurations(
data/lib/ladle/server.rb CHANGED
@@ -47,6 +47,8 @@ module Ladle
47
47
  # :domain option to match.
48
48
  # @option opts [String] :domain ("dc=example,dc=org") the domain
49
49
  # for the data provided in the :ldif option.
50
+ # @option opts [Boolean] :allow_anonymous (true) whether anonymous
51
+ # users will be able to query the server.
50
52
  # @option opts [Boolean] :verbose (false) if true, detailed
51
53
  # information about the execution of the server will be printed
52
54
  # to standard error.
@@ -66,6 +68,7 @@ module Ladle
66
68
  @port = opts[:port] || 3897
67
69
  @domain = opts[:domain] || "dc=example,dc=org"
68
70
  @ldif = opts[:ldif] || File.expand_path("../default.ldif", __FILE__)
71
+ @allow_anonymous = opts[:allow_anonymous].nil? ? true : opts[:allow_anonymous]
69
72
  @quiet = opts[:quiet]
70
73
  @verbose = opts[:verbose]
71
74
  @timeout = opts[:timeout] || 15
@@ -193,6 +196,15 @@ module Ladle
193
196
  @verbose
194
197
  end
195
198
 
199
+ ##
200
+ # Whether anonymous users will be allowed access to the server
201
+ # once it is running.
202
+ #
203
+ # @return [Boolean]
204
+ def allow_anonymous?
205
+ @allow_anonymous
206
+ end
207
+
196
208
  private
197
209
 
198
210
  def create_process(*cmd)
@@ -216,8 +228,9 @@ module Ladle
216
228
  "--port", port,
217
229
  "--domain", domain,
218
230
  "--ldif", ldif,
219
- "--tmpdir", tmpdir
220
- ] + @additional_args
231
+ "--tmpdir", tmpdir,
232
+ ("--no-anonymous" unless allow_anonymous?)
233
+ ].compact + @additional_args
221
234
  end
222
235
 
223
236
  def classpath
data/lib/ladle/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Ladle
2
2
  ##
3
3
  # The current version number for Ladle.
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
@@ -4,11 +4,28 @@ require 'net/ldap'
4
4
 
5
5
  describe Ladle, "::Server" do
6
6
  def create_server(opts = {})
7
- Ladle::Server.new({ :quiet => true, :tmpdir => tmpdir }.merge(opts))
7
+ default_opts = { :tmpdir => tmpdir }.merge(
8
+ ENV['LADLE_TRACE'] ? { :verbose => true } : { :quiet => true })
9
+ Ladle::Server.new(default_opts.merge(opts))
10
+ end
11
+
12
+ def should_be_running
13
+ s = nil
14
+ lambda { s = TCPSocket.new('localhost', @server.port) }.
15
+ should_not raise_error
16
+ s.close if s
17
+ end
18
+
19
+ def should_not_be_running
20
+ s = nil
21
+ lambda { s = TCPSocket.new('localhost', @server.port) }.
22
+ should raise_error(/Connection refused/)
23
+ s.close if s
8
24
  end
9
25
 
10
26
  before do
11
27
  @server = create_server
28
+ should_not_be_running # fail early
12
29
  end
13
30
 
14
31
  after do
@@ -166,14 +183,19 @@ describe Ladle, "::Server" do
166
183
  should == "#{tmpdir}/openjdk/jre"
167
184
  end
168
185
  end
169
- end
170
186
 
171
- describe "running" do
172
- def should_be_running
173
- lambda { TCPSocket.new('localhost', @server.port) }.
174
- should_not raise_error
187
+ describe ":allow_anonymous" do
188
+ it "defaults to true" do
189
+ Ladle::Server.new.allow_anonymous?.should be_true
190
+ end
191
+
192
+ it "can be overridden" do
193
+ Ladle::Server.new(:allow_anonymous => false).allow_anonymous?.should be_false
194
+ end
175
195
  end
196
+ end
176
197
 
198
+ describe "running" do
177
199
  it "blocks until the server is up" do
178
200
  @server.start
179
201
  should_be_running
@@ -192,8 +214,7 @@ describe Ladle, "::Server" do
192
214
  @server.start
193
215
  @server.stop
194
216
  @server.start
195
- lambda { TCPSocket.new('localhost', @server.port) }.
196
- should_not raise_error
217
+ should_be_running
197
218
  end
198
219
 
199
220
  it "throws an exception when the server doesn't start up" do
@@ -231,16 +252,20 @@ describe Ladle, "::Server" do
231
252
  end
232
253
  end
233
254
 
234
- describe "data" do
255
+ describe "LDAP implementation" do
235
256
  before do
236
257
  pending "Net::LDAP doesn't work on 1.9" if RUBY_VERSION =~ /1.9/
237
258
  end
238
259
 
239
- def with_ldap
260
+ def with_ldap(params={})
240
261
  @server.start
241
- Net::LDAP.open(ldap_parameters) do |ldap|
242
- return yield ldap
243
- end
262
+ # We don't use Net::LDAP.open because it seems to leak sockets,
263
+ # at least on Linux and with version 0.0.4 of the library.
264
+ ldap = Net::LDAP.new({
265
+ :host => 'localhost', :port => @server.port,
266
+ :auth => { :method => :anonymous }
267
+ }.merge(params))
268
+ yield ldap
244
269
  end
245
270
 
246
271
  def ldap_search(filter, base=nil)
@@ -248,58 +273,108 @@ describe Ladle, "::Server" do
248
273
  ldap.search(
249
274
  :base => base || 'dc=example,dc=org',
250
275
  :filter => filter
251
- )
252
- }
253
- end
254
-
255
- def ldap_parameters
256
- @ldap_parameters ||= {
257
- :host => 'localhost', :port => @server.port,
258
- :auth => { :method => :anonymous }
276
+ ).tap {
277
+ ldap.get_operation_result.code.should == 0 # success
278
+ }
259
279
  }
260
280
  end
261
281
 
262
- describe "the default set" do
263
- it "has 26 people" do
264
- ldap_search(Net::LDAP::Filter.pres('uid')).should have(26).people
265
- end
266
-
267
- it "has 1 group" do
268
- ldap_search(Net::LDAP::Filter.pres('ou')).should have(1).group
269
- end
270
-
271
- it "has given names" do
272
- ldap_search(Net::LDAP::Filter.pres('uid')).
273
- select { |res| !res[:givenname] || res[:givenname].empty? }.should == []
274
- end
275
-
276
- it "has e-mail addresses" do
277
- ldap_search(Net::LDAP::Filter.pres('uid')).
278
- select { |res| !res[:mail] || res[:mail].empty? }.should == []
279
- end
280
-
281
- it "can be searched by value" do
282
- ldap_search(Net::LDAP::Filter.eq(:givenname, 'Josephine')).
283
- collect { |res| res[:uid].first }.should == %w(jj243)
282
+ describe "data" do
283
+ describe "the default set" do
284
+ it "has 26 people" do
285
+ ldap_search(Net::LDAP::Filter.pres('uid')).should have(26).people
286
+ end
287
+
288
+ it "has 1 group" do
289
+ ldap_search(Net::LDAP::Filter.pres('ou')).should have(1).group
290
+ end
291
+
292
+ it "has given names" do
293
+ ldap_search(Net::LDAP::Filter.pres('uid')).
294
+ select { |res| !res[:givenname] || res[:givenname].empty? }.should == []
295
+ end
296
+
297
+ it "has e-mail addresses" do
298
+ ldap_search(Net::LDAP::Filter.pres('uid')).
299
+ select { |res| !res[:mail] || res[:mail].empty? }.should == []
300
+ end
301
+
302
+ it "can be searched by value" do
303
+ ldap_search(Net::LDAP::Filter.eq(:givenname, 'Josephine')).
304
+ collect { |res| res[:uid].first }.should == %w(jj243)
305
+ end
306
+ end
307
+
308
+ describe "with a provided set" do
309
+ before do
310
+ @server = create_server(
311
+ :domain => "dc=example,dc=net",
312
+ :ldif => File.expand_path("../animals.ldif", __FILE__)
313
+ )
314
+ end
315
+
316
+ it "has the groups provided by the other LDIF" do
317
+ ldap_search(Net::LDAP::Filter.pres('ou'), 'dc=example,dc=net').
318
+ collect { |result| result[:ou].first }.should == ["animals"]
319
+ end
320
+
321
+ it "has the individuals provided by the other LDIF" do
322
+ ldap_search(Net::LDAP::Filter.pres('uid'), 'dc=example,dc=net').
323
+ collect { |result| result[:givenname].first }.sort.should == %w(Ada Bob)
324
+ end
284
325
  end
285
326
  end
286
327
 
287
- describe "with a provided set" do
288
- before do
289
- @server = create_server(
290
- :domain => "dc=example,dc=net",
291
- :ldif => File.expand_path("../animals.ldif", __FILE__)
292
- )
293
- end
294
-
295
- it "has the groups provided by the other LDIF" do
296
- ldap_search(Net::LDAP::Filter.pres('ou'), 'dc=example,dc=net').
297
- collect { |result| result[:ou].first }.should == ["animals"]
298
- end
299
-
300
- it "has the individuals provided by the other LDIF" do
301
- ldap_search(Net::LDAP::Filter.pres('uid'), 'dc=example,dc=net').
302
- collect { |result| result[:givenname].first }.sort.should == %w(Ada Bob)
328
+ describe "binding" do
329
+ it "works with a valid password" do
330
+ with_ldap do |ldap|
331
+ ldap.authenticate("uid=hh153,ou=people,dc=example,dc=org", "hatfield".reverse)
332
+ ldap.bind.should be_true
333
+ end
334
+ end
335
+
336
+ it "does not work with an invalid password" do
337
+ with_ldap do |ldap|
338
+ ldap.authenticate("uid=hh153,ou=people,dc=example,dc=org", "mccoy".reverse)
339
+ ldap.bind.should be_false
340
+ end
341
+ end
342
+
343
+ describe "with anonymous binding disabled" do
344
+ before do
345
+ @server = create_server(:allow_anonymous => false)
346
+ end
347
+
348
+ it "will not bind anonymously" do
349
+ with_ldap do |ldap|
350
+ # anonymous bind is successful even with anonymous access
351
+ # off, but searches fail appropriately
352
+ ldap.search(:filter => Net::LDAP::Filter.pres('uid'), :base => 'dc=example,dc=org')
353
+ ldap.get_operation_result.code.should == 50 # insufficient access
354
+ end
355
+ end
356
+
357
+ it "will bind with a username and valid password" do
358
+ with_ldap do |ldap|
359
+ ldap.authenticate("uid=kk891,ou=people,dc=example,dc=org", "enilk")
360
+ ldap.bind.should be_true
361
+ end
362
+ end
363
+
364
+ it "will not bind with a username and invalid password" do
365
+ with_ldap do |ldap|
366
+ ldap.authenticate("uid=kk891,ou=people,dc=example,dc=org", "kevin")
367
+ ldap.bind.should be_false
368
+ end
369
+ end
370
+
371
+ it "permits searches for authenticated users" do
372
+ with_ldap do |ldap|
373
+ ldap.authenticate("uid=kk891,ou=people,dc=example,dc=org", "enilk")
374
+ ldap.search(:filter => Net::LDAP::Filter.pres('uid'), :base => 'dc=example,dc=org').
375
+ should have(26).results
376
+ end
377
+ end
303
378
  end
304
379
  end
305
380
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 0
9
- version: 0.1.0
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: java
11
11
  authors:
12
12
  - Rhett Sutphin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-21 00:00:00 -05:00
17
+ date: 2010-10-27 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -71,6 +71,19 @@ dependencies:
71
71
  version: 0.0.4
72
72
  type: :development
73
73
  version_requirements: *id004
74
+ - !ruby/object:Gem::Dependency
75
+ name: ci_reporter
76
+ prerelease: false
77
+ requirement: &id005 !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 1
83
+ - 6
84
+ version: "1.6"
85
+ type: :development
86
+ version_requirements: *id005
74
87
  description: Provides an embedded LDAP server for BDD. The embedded server is built with ApacheDS.
75
88
  email:
76
89
  - rhett@detailedbalance.net