ladle 0.1.0-java → 0.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
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