net-ldap 0.16.0 → 0.17.0

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.
Files changed (73) hide show
  1. checksums.yaml +5 -5
  2. data/History.rdoc +47 -0
  3. data/README.rdoc +18 -6
  4. data/lib/net/ber/core_ext.rb +6 -6
  5. data/lib/net/ber.rb +2 -2
  6. data/lib/net/ldap/auth_adapter/gss_spnego.rb +2 -2
  7. data/lib/net/ldap/auth_adapter/sasl.rb +1 -1
  8. data/lib/net/ldap/auth_adapter/simple.rb +1 -1
  9. data/lib/net/ldap/connection.rb +14 -10
  10. data/lib/net/ldap/dataset.rb +3 -3
  11. data/lib/net/ldap/dn.rb +10 -10
  12. data/lib/net/ldap/entry.rb +13 -2
  13. data/lib/net/ldap/error.rb +2 -26
  14. data/lib/net/ldap/filter.rb +10 -3
  15. data/lib/net/ldap/instrumentation.rb +2 -2
  16. data/lib/net/ldap/password.rb +7 -5
  17. data/lib/net/ldap/pdu.rb +1 -1
  18. data/lib/net/ldap/version.rb +1 -1
  19. data/lib/net/ldap.rb +39 -16
  20. data/lib/net/snmp.rb +1 -1
  21. data/lib/net-ldap.rb +1 -1
  22. metadata +19 -109
  23. data/.gitignore +0 -9
  24. data/.rubocop.yml +0 -20
  25. data/.rubocop_todo.yml +0 -753
  26. data/.travis.yml +0 -33
  27. data/CONTRIBUTING.md +0 -54
  28. data/Gemfile +0 -2
  29. data/Rakefile +0 -23
  30. data/net-ldap.gemspec +0 -37
  31. data/script/changelog +0 -47
  32. data/script/generate-fixture-ca +0 -48
  33. data/script/install-openldap +0 -134
  34. data/script/package +0 -7
  35. data/script/release +0 -16
  36. data/test/ber/core_ext/test_array.rb +0 -22
  37. data/test/ber/core_ext/test_string.rb +0 -25
  38. data/test/ber/test_ber.rb +0 -153
  39. data/test/fixtures/ca/ca.info +0 -4
  40. data/test/fixtures/ca/cacert.pem +0 -24
  41. data/test/fixtures/ca/cakey.pem +0 -190
  42. data/test/fixtures/openldap/memberof.ldif +0 -33
  43. data/test/fixtures/openldap/retcode.ldif +0 -76
  44. data/test/fixtures/openldap/slapd.conf.ldif +0 -67
  45. data/test/fixtures/seed.ldif +0 -374
  46. data/test/integration/test_add.rb +0 -28
  47. data/test/integration/test_ber.rb +0 -30
  48. data/test/integration/test_bind.rb +0 -244
  49. data/test/integration/test_delete.rb +0 -31
  50. data/test/integration/test_open.rb +0 -88
  51. data/test/integration/test_password_modify.rb +0 -80
  52. data/test/integration/test_return_codes.rb +0 -38
  53. data/test/integration/test_search.rb +0 -77
  54. data/test/support/vm/openldap/.gitignore +0 -1
  55. data/test/support/vm/openldap/README.md +0 -64
  56. data/test/support/vm/openldap/Vagrantfile +0 -34
  57. data/test/test_auth_adapter.rb +0 -15
  58. data/test/test_dn.rb +0 -44
  59. data/test/test_entry.rb +0 -65
  60. data/test/test_filter.rb +0 -223
  61. data/test/test_filter_parser.rb +0 -24
  62. data/test/test_helper.rb +0 -74
  63. data/test/test_ldap.rb +0 -114
  64. data/test/test_ldap_connection.rb +0 -491
  65. data/test/test_ldif.rb +0 -104
  66. data/test/test_password.rb +0 -10
  67. data/test/test_rename.rb +0 -77
  68. data/test/test_search.rb +0 -39
  69. data/test/test_snmp.rb +0 -119
  70. data/test/test_ssl_ber.rb +0 -40
  71. data/test/testdata.ldif +0 -101
  72. data/testserver/ldapserver.rb +0 -209
  73. data/testserver/testdata.ldif +0 -101
data/test/test_filter.rb DELETED
@@ -1,223 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- class TestFilter < Test::Unit::TestCase
4
- Filter = Net::LDAP::Filter
5
-
6
- def test_bug_7534_rfc2254
7
- assert_equal("(cn=Tim Wizard)",
8
- Filter.from_rfc2254("(cn=Tim Wizard)").to_rfc2254)
9
- end
10
-
11
- def test_invalid_filter_string
12
- assert_raises(Net::LDAP::FilterSyntaxInvalidError) { Filter.from_rfc2254("") }
13
- end
14
-
15
- def test_invalid_filter
16
- assert_raises(Net::LDAP::OperatorError) do
17
- # This test exists to prove that our constructor blocks unknown filter
18
- # types. All filters must be constructed using helpers.
19
- Filter.__send__(:new, :xx, nil, nil)
20
- end
21
- end
22
-
23
- def test_to_s
24
- assert_equal("(uid=george *)", Filter.eq("uid", "george *").to_s)
25
- end
26
-
27
- def test_convenience_filters
28
- assert_equal("(uid=\\2A)", Filter.equals("uid", "*").to_s)
29
- assert_equal("(uid=\\28*)", Filter.begins("uid", "(").to_s)
30
- assert_equal("(uid=*\\29)", Filter.ends("uid", ")").to_s)
31
- assert_equal("(uid=*\\5C*)", Filter.contains("uid", "\\").to_s)
32
- end
33
-
34
- def test_c2
35
- assert_equal("(uid=george *)",
36
- Filter.from_rfc2254("uid=george *").to_rfc2254)
37
- assert_equal("(uid:=george *)",
38
- Filter.from_rfc2254("uid:=george *").to_rfc2254)
39
- assert_equal("(uid=george*)",
40
- Filter.from_rfc2254(" ( uid = george* ) ").to_rfc2254)
41
- assert_equal("(!(uid=george*))",
42
- Filter.from_rfc2254("uid!=george*").to_rfc2254)
43
- assert_equal("(uid<=george*)",
44
- Filter.from_rfc2254("uid <= george*").to_rfc2254)
45
- assert_equal("(uid>=george*)",
46
- Filter.from_rfc2254("uid>=george*").to_rfc2254)
47
- assert_equal("(&(uid=george*)(mail=*))",
48
- Filter.from_rfc2254("(& (uid=george* ) (mail=*))").to_rfc2254)
49
- assert_equal("(|(uid=george*)(mail=*))",
50
- Filter.from_rfc2254("(| (uid=george* ) (mail=*))").to_rfc2254)
51
- assert_equal("(!(mail=*))",
52
- Filter.from_rfc2254("(! (mail=*))").to_rfc2254)
53
- end
54
-
55
- def test_filter_with_single_clause
56
- assert_equal("(cn=name)", Net::LDAP::Filter.construct("(&(cn=name))").to_s)
57
- end
58
-
59
- def test_filters_from_ber
60
- [
61
- Net::LDAP::Filter.eq("objectclass", "*"),
62
- Net::LDAP::Filter.pres("objectclass"),
63
- Net::LDAP::Filter.eq("objectclass", "ou"),
64
- Net::LDAP::Filter.ge("uid", "500"),
65
- Net::LDAP::Filter.le("uid", "500"),
66
- (~ Net::LDAP::Filter.pres("objectclass")),
67
- (Net::LDAP::Filter.pres("objectclass") & Net::LDAP::Filter.pres("ou")),
68
- (Net::LDAP::Filter.pres("objectclass") & Net::LDAP::Filter.pres("ou") & Net::LDAP::Filter.pres("sn")),
69
- (Net::LDAP::Filter.pres("objectclass") | Net::LDAP::Filter.pres("ou") | Net::LDAP::Filter.pres("sn")),
70
-
71
- Net::LDAP::Filter.eq("objectclass", "*aaa"),
72
- Net::LDAP::Filter.eq("objectclass", "*aaa*bbb"),
73
- Net::LDAP::Filter.eq("objectclass", "*aaa*bbb*ccc"),
74
- Net::LDAP::Filter.eq("objectclass", "aaa*bbb"),
75
- Net::LDAP::Filter.eq("objectclass", "aaa*bbb*ccc"),
76
- Net::LDAP::Filter.eq("objectclass", "abc*def*1111*22*g"),
77
- Net::LDAP::Filter.eq("objectclass", "*aaa*"),
78
- Net::LDAP::Filter.eq("objectclass", "*aaa*bbb*"),
79
- Net::LDAP::Filter.eq("objectclass", "*aaa*bbb*ccc*"),
80
- Net::LDAP::Filter.eq("objectclass", "aaa*"),
81
- Net::LDAP::Filter.eq("objectclass", "aaa*bbb*"),
82
- Net::LDAP::Filter.eq("objectclass", "aaa*bbb*ccc*"),
83
- ].each do |ber|
84
- f = Net::LDAP::Filter.parse_ber(ber.to_ber.read_ber(Net::LDAP::AsnSyntax))
85
- assert(f == ber)
86
- assert_equal(f.to_ber, ber.to_ber)
87
- end
88
- end
89
-
90
- def test_ber_from_rfc2254_filter
91
- [
92
- Net::LDAP::Filter.construct("objectclass=*"),
93
- Net::LDAP::Filter.construct("objectclass=ou"),
94
- Net::LDAP::Filter.construct("uid >= 500"),
95
- Net::LDAP::Filter.construct("uid <= 500"),
96
- Net::LDAP::Filter.construct("(!(uid=*))"),
97
- Net::LDAP::Filter.construct("(&(uid=*)(objectclass=*))"),
98
- Net::LDAP::Filter.construct("(&(uid=*)(objectclass=*)(sn=*))"),
99
- Net::LDAP::Filter.construct("(|(uid=*)(objectclass=*))"),
100
- Net::LDAP::Filter.construct("(|(uid=*)(objectclass=*)(sn=*))"),
101
-
102
- Net::LDAP::Filter.construct("objectclass=*aaa"),
103
- Net::LDAP::Filter.construct("objectclass=*aaa*bbb"),
104
- Net::LDAP::Filter.construct("objectclass=*aaa bbb"),
105
- Net::LDAP::Filter.construct("objectclass=*aaa bbb"),
106
- Net::LDAP::Filter.construct("objectclass=*aaa*bbb*ccc"),
107
- Net::LDAP::Filter.construct("objectclass=aaa*bbb"),
108
- Net::LDAP::Filter.construct("objectclass=aaa*bbb*ccc"),
109
- Net::LDAP::Filter.construct("objectclass=abc*def*1111*22*g"),
110
- Net::LDAP::Filter.construct("objectclass=*aaa*"),
111
- Net::LDAP::Filter.construct("objectclass=*aaa*bbb*"),
112
- Net::LDAP::Filter.construct("objectclass=*aaa*bbb*ccc*"),
113
- Net::LDAP::Filter.construct("objectclass=aaa*"),
114
- Net::LDAP::Filter.construct("objectclass=aaa*bbb*"),
115
- Net::LDAP::Filter.construct("objectclass=aaa*bbb*ccc*"),
116
- ].each do |ber|
117
- f = Net::LDAP::Filter.parse_ber(ber.to_ber.read_ber(Net::LDAP::AsnSyntax))
118
- assert(f == ber)
119
- assert_equal(f.to_ber, ber.to_ber)
120
- end
121
- end
122
- end
123
-
124
- # tests ported over from rspec. Not sure if these overlap with the above
125
- # https://github.com/ruby-ldap/ruby-net-ldap/pull/121
126
- class TestFilterRSpec < Test::Unit::TestCase
127
- def test_ex_convert
128
- assert_equal '(foo:=bar)', Net::LDAP::Filter.ex('foo', 'bar').to_s
129
- end
130
-
131
- def test_ex_rfc2254_roundtrip
132
- filter = Net::LDAP::Filter.ex('foo', 'bar')
133
- assert_equal filter, Net::LDAP::Filter.from_rfc2254(filter.to_s)
134
- end
135
-
136
- def test_ber_conversion
137
- filter = Net::LDAP::Filter.ex('foo', 'bar')
138
- ber = filter.to_ber
139
- assert_equal filter, Net::LDAP::Filter.parse_ber(ber.read_ber(Net::LDAP::AsnSyntax))
140
- end
141
-
142
- [
143
- '(o:dn:=Ace Industry)',
144
- '(:dn:2.4.8.10:=Dino)',
145
- '(cn:dn:1.2.3.4.5:=John Smith)',
146
- '(sn:dn:2.4.6.8.10:=Barbara Jones)',
147
- '(&(sn:dn:2.4.6.8.10:=Barbara Jones))',
148
- ].each_with_index do |filter_str, index|
149
- define_method "test_decode_filter_#{index}" do
150
- filter = Net::LDAP::Filter.from_rfc2254(filter_str)
151
- assert_kind_of Net::LDAP::Filter, filter
152
- end
153
-
154
- define_method "test_ber_conversion_#{index}" do
155
- filter = Net::LDAP::Filter.from_rfc2254(filter_str)
156
- ber = Net::LDAP::Filter.from_rfc2254(filter_str).to_ber
157
- assert_equal filter, Net::LDAP::Filter.parse_ber(ber.read_ber(Net::LDAP::AsnSyntax))
158
- end
159
- end
160
-
161
- def test_apostrophes
162
- assert_equal "(uid=O'Keefe)", Net::LDAP::Filter.construct("uid=O'Keefe").to_rfc2254
163
- end
164
-
165
- def test_equals
166
- assert_equal Net::LDAP::Filter.eq('dn', 'f\2Aoo'), Net::LDAP::Filter.equals('dn', 'f*oo')
167
- end
168
-
169
- def test_begins
170
- assert_equal Net::LDAP::Filter.eq('dn', 'f\2Aoo*'), Net::LDAP::Filter.begins('dn', 'f*oo')
171
- end
172
-
173
- def test_ends
174
- assert_equal Net::LDAP::Filter.eq('dn', '*f\2Aoo'), Net::LDAP::Filter.ends('dn', 'f*oo')
175
- end
176
-
177
- def test_contains
178
- assert_equal Net::LDAP::Filter.eq('dn', '*f\2Aoo*'), Net::LDAP::Filter.contains('dn', 'f*oo')
179
- end
180
-
181
- def test_escape
182
- # escapes nul, *, (, ) and \\
183
- assert_equal "\\00\\2A\\28\\29\\5C", Net::LDAP::Filter.escape("\0*()\\")
184
- end
185
-
186
- def test_well_known_ber_string
187
- ber = "\xa4\x2d" \
188
- "\x04\x0b" "objectclass" \
189
- "\x30\x1e" \
190
- "\x80\x08" "foo" "*\\" "bar" \
191
- "\x81\x08" "foo" "*\\" "bar" \
192
- "\x82\x08" "foo" "*\\" "bar".b
193
-
194
- [
195
- "foo" "\\2A\\5C" "bar",
196
- "foo" "\\2a\\5c" "bar",
197
- "foo" "\\2A\\5c" "bar",
198
- "foo" "\\2a\\5C" "bar",
199
- ].each do |escaped|
200
- # unescapes escaped characters
201
- filter = Net::LDAP::Filter.eq("objectclass", "#{escaped}*#{escaped}*#{escaped}")
202
- assert_equal ber, filter.to_ber
203
- end
204
- end
205
-
206
- def test_parse_ber_escapes_characters
207
- ber = "\xa4\x2d" \
208
- "\x04\x0b" "objectclass" \
209
- "\x30\x1e" \
210
- "\x80\x08" "foo" "*\\" "bar" \
211
- "\x81\x08" "foo" "*\\" "bar" \
212
- "\x82\x08" "foo" "*\\" "bar".b
213
-
214
- escaped = Net::LDAP::Filter.escape("foo" "*\\" "bar")
215
- filter = Net::LDAP::Filter.parse_ber(ber.read_ber(Net::LDAP::AsnSyntax))
216
- assert_equal "(objectclass=#{escaped}*#{escaped}*#{escaped})", filter.to_s
217
- end
218
-
219
- def test_unescape_fixnums
220
- filter = Net::LDAP::Filter.eq("objectclass", 3)
221
- assert_equal "\xA3\x10\x04\vobjectclass\x04\x013".b, filter.to_ber
222
- end
223
- end
@@ -1,24 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'test_helper'
3
-
4
- class TestFilterParser < Test::Unit::TestCase
5
- def test_ascii
6
- assert_kind_of Net::LDAP::Filter, Net::LDAP::Filter::FilterParser.parse("(cn=name)")
7
- end
8
-
9
- def test_multibyte_characters
10
- assert_kind_of Net::LDAP::Filter, Net::LDAP::Filter::FilterParser.parse("(cn=名前)")
11
- end
12
-
13
- def test_brackets
14
- assert_kind_of Net::LDAP::Filter, Net::LDAP::Filter::FilterParser.parse("(cn=[{something}])")
15
- end
16
-
17
- def test_slash
18
- assert_kind_of Net::LDAP::Filter, Net::LDAP::Filter::FilterParser.parse("(departmentNumber=FOO//BAR/FOO)")
19
- end
20
-
21
- def test_colons
22
- assert_kind_of Net::LDAP::Filter, Net::LDAP::Filter::FilterParser.parse("(ismemberof=cn=edu:berkeley:app:calmessages:deans,ou=campus groups,dc=berkeley,dc=edu)")
23
- end
24
- end
data/test/test_helper.rb DELETED
@@ -1,74 +0,0 @@
1
- # Add 'lib' to load path.
2
- require 'test/unit'
3
- require 'net/ldap'
4
- require 'flexmock/test_unit'
5
-
6
- # Whether integration tests should be run.
7
- INTEGRATION = ENV.fetch("INTEGRATION", "skip") != "skip"
8
-
9
- # The CA file to verify certs against for tests.
10
- # Override with CA_FILE env variable; otherwise checks for the VM-specific path
11
- # and falls back to the test/fixtures/cacert.pem for local testing.
12
- CA_FILE =
13
- ENV.fetch("CA_FILE") do
14
- if File.exist?("/etc/ssl/certs/cacert.pem")
15
- "/etc/ssl/certs/cacert.pem"
16
- else
17
- File.expand_path("fixtures/ca/cacert.pem", File.dirname(__FILE__))
18
- end
19
- end
20
-
21
- BIND_CREDS = {
22
- method: :simple,
23
- username: "uid=user1,ou=People,dc=rubyldap,dc=com",
24
- password: "passworD1",
25
- }.freeze
26
-
27
- TLS_OPTS = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.merge({}).freeze
28
-
29
- if RUBY_VERSION < "2.0"
30
- class String
31
- def b
32
- self
33
- end
34
- end
35
- end
36
-
37
- class MockInstrumentationService
38
- def initialize
39
- @events = {}
40
- end
41
-
42
- def instrument(event, payload)
43
- result = yield(payload)
44
- @events[event] ||= []
45
- @events[event] << [payload, result]
46
- result
47
- end
48
-
49
- def subscribe(event)
50
- @events[event] ||= []
51
- @events[event]
52
- end
53
- end
54
-
55
- class LDAPIntegrationTestCase < Test::Unit::TestCase
56
- # If integration tests aren't enabled, noop these tests.
57
- if !INTEGRATION
58
- def run(*)
59
- self
60
- end
61
- end
62
-
63
- def setup
64
- @service = MockInstrumentationService.new
65
- @ldap = Net::LDAP.new \
66
- host: ENV.fetch('INTEGRATION_HOST', 'localhost'),
67
- port: ENV.fetch('INTEGRATION_PORT', 389),
68
- admin_user: 'uid=admin,dc=rubyldap,dc=com',
69
- admin_password: 'passworD1',
70
- search_domains: %w(dc=rubyldap,dc=com),
71
- uid: 'uid',
72
- instrumentation_service: @service
73
- end
74
- end
data/test/test_ldap.rb DELETED
@@ -1,114 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TestLDAPInstrumentation < Test::Unit::TestCase
4
- # Fake Net::LDAP::Connection for testing
5
- class FakeConnection
6
- # It's difficult to instantiate Net::LDAP::PDU objects. Faking out what we
7
- # need here until that object is brought under test and has it's constructor
8
- # cleaned up.
9
- class Result < Struct.new(:success?, :result_code); end
10
-
11
- def initialize
12
- @bind_success = Result.new(true, Net::LDAP::ResultCodeSuccess)
13
- @search_success = Result.new(true, Net::LDAP::ResultCodeSizeLimitExceeded)
14
- end
15
-
16
- def bind(args = {})
17
- @bind_success
18
- end
19
-
20
- def search(*args)
21
- yield @search_success if block_given?
22
- @search_success
23
- end
24
- end
25
-
26
- def setup
27
- @connection = flexmock(:connection, :close => true)
28
- flexmock(Net::LDAP::Connection).should_receive(:new).and_return(@connection)
29
-
30
- @service = MockInstrumentationService.new
31
- @subject = Net::LDAP.new \
32
- :host => "test.mocked.com", :port => 636,
33
- :force_no_page => true, # so server capabilities are not queried
34
- :instrumentation_service => @service
35
- end
36
-
37
- def test_instrument_bind
38
- events = @service.subscribe "bind.net_ldap"
39
-
40
- fake_connection = FakeConnection.new
41
- @subject.connection = fake_connection
42
- bind_result = fake_connection.bind
43
-
44
- assert @subject.bind
45
-
46
- payload, result = events.pop
47
- assert result
48
- assert_equal bind_result, payload[:bind]
49
- end
50
-
51
- def test_instrument_search
52
- events = @service.subscribe "search.net_ldap"
53
-
54
- fake_connection = FakeConnection.new
55
- @subject.connection = fake_connection
56
- entry = fake_connection.search
57
-
58
- refute_nil @subject.search(:filter => "(uid=user1)")
59
-
60
- payload, result = events.pop
61
- assert_equal [entry], result
62
- assert_equal [entry], payload[:result]
63
- assert_equal "(uid=user1)", payload[:filter]
64
- end
65
-
66
- def test_instrument_search_with_size
67
- events = @service.subscribe "search.net_ldap"
68
-
69
- fake_connection = FakeConnection.new
70
- @subject.connection = fake_connection
71
- entry = fake_connection.search
72
-
73
- refute_nil @subject.search(:filter => "(uid=user1)", :size => 1)
74
-
75
- payload, result = events.pop
76
- assert_equal [entry], result
77
- assert_equal [entry], payload[:result]
78
- assert_equal "(uid=user1)", payload[:filter]
79
- assert_equal result.size, payload[:size]
80
- end
81
-
82
- def test_obscure_auth
83
- password = "opensesame"
84
- assert_include(@subject.inspect, "anonymous")
85
- @subject.auth "joe_user", password
86
- assert_not_include(@subject.inspect, password)
87
- end
88
-
89
- def test_encryption
90
- enc = @subject.encryption('start_tls')
91
-
92
- assert_equal enc[:method], :start_tls
93
- end
94
-
95
- def test_normalize_encryption_symbol
96
- enc = @subject.send(:normalize_encryption, :start_tls)
97
- assert_equal enc, {:method => :start_tls, :tls_options => {}}
98
- end
99
-
100
- def test_normalize_encryption_nil
101
- enc = @subject.send(:normalize_encryption, nil)
102
- assert_equal enc, nil
103
- end
104
-
105
- def test_normalize_encryption_string
106
- enc = @subject.send(:normalize_encryption, 'start_tls')
107
- assert_equal enc, {:method => :start_tls, :tls_options => {}}
108
- end
109
-
110
- def test_normalize_encryption_hash
111
- enc = @subject.send(:normalize_encryption, {:method => :start_tls, :tls_options => {:foo => :bar}})
112
- assert_equal enc, {:method => :start_tls, :tls_options => {:foo => :bar}}
113
- end
114
- end