net-ldap 0.16.2 → 0.19.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.
- checksums.yaml +4 -4
- data/History.rdoc +59 -0
- data/README.rdoc +10 -3
- data/lib/net/ber/core_ext.rb +6 -6
- data/lib/net/ber.rb +2 -2
- data/lib/net/ldap/auth_adapter/gss_spnego.rb +2 -2
- data/lib/net/ldap/auth_adapter/sasl.rb +1 -1
- data/lib/net/ldap/auth_adapter/simple.rb +1 -1
- data/lib/net/ldap/connection.rb +22 -14
- data/lib/net/ldap/dataset.rb +1 -3
- data/lib/net/ldap/dn.rb +19 -27
- data/lib/net/ldap/entry.rb +11 -2
- data/lib/net/ldap/error.rb +2 -26
- data/lib/net/ldap/filter.rb +3 -3
- data/lib/net/ldap/instrumentation.rb +2 -2
- data/lib/net/ldap/password.rb +7 -5
- data/lib/net/ldap/pdu.rb +1 -1
- data/lib/net/ldap/version.rb +1 -1
- data/lib/net/ldap.rb +41 -16
- data/lib/net/snmp.rb +1 -1
- data/lib/net-ldap.rb +1 -1
- metadata +16 -92
- data/.gitignore +0 -10
- data/.rubocop.yml +0 -20
- data/.rubocop_todo.yml +0 -753
- data/.travis.yml +0 -55
- data/CONTRIBUTING.md +0 -54
- data/Gemfile +0 -2
- data/Rakefile +0 -23
- data/net-ldap.gemspec +0 -37
- data/script/changelog +0 -47
- data/script/ldap-docker +0 -12
- data/script/package +0 -7
- data/script/release +0 -16
- data/test/ber/core_ext/test_array.rb +0 -22
- data/test/ber/core_ext/test_string.rb +0 -25
- data/test/ber/test_ber.rb +0 -153
- data/test/fixtures/ca/docker-ca.pem +0 -18
- data/test/fixtures/ldif/06-retcode.ldif +0 -75
- data/test/fixtures/ldif/50-seed.ldif +0 -374
- data/test/integration/test_add.rb +0 -26
- data/test/integration/test_ber.rb +0 -30
- data/test/integration/test_bind.rb +0 -222
- data/test/integration/test_delete.rb +0 -29
- data/test/integration/test_open.rb +0 -87
- data/test/integration/test_password_modify.rb +0 -93
- data/test/integration/test_return_codes.rb +0 -46
- data/test/integration/test_search.rb +0 -77
- data/test/support/vm/openldap/.gitignore +0 -1
- data/test/test_auth_adapter.rb +0 -15
- data/test/test_dn.rb +0 -44
- data/test/test_entry.rb +0 -65
- data/test/test_filter.rb +0 -223
- data/test/test_filter_parser.rb +0 -24
- data/test/test_helper.rb +0 -73
- data/test/test_ldap.rb +0 -114
- data/test/test_ldap_connection.rb +0 -491
- data/test/test_ldif.rb +0 -104
- data/test/test_password.rb +0 -10
- data/test/test_rename.rb +0 -77
- data/test/test_search.rb +0 -39
- data/test/test_snmp.rb +0 -119
- data/test/test_ssl_ber.rb +0 -40
- data/test/testdata.ldif +0 -101
- data/testserver/ldapserver.rb +0 -209
- data/testserver/testdata.ldif +0 -101
@@ -1,87 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
class TestBindIntegration < LDAPIntegrationTestCase
|
4
|
-
def test_binds_without_open
|
5
|
-
events = @service.subscribe "bind.net_ldap_connection"
|
6
|
-
|
7
|
-
@ldap.search(filter: "uid=user1", base: "ou=People,dc=example,dc=org", ignore_server_caps: true)
|
8
|
-
@ldap.search(filter: "uid=user1", base: "ou=People,dc=example,dc=org", ignore_server_caps: true)
|
9
|
-
|
10
|
-
assert_equal 2, events.size
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_binds_with_open
|
14
|
-
events = @service.subscribe "bind.net_ldap_connection"
|
15
|
-
|
16
|
-
@ldap.open do
|
17
|
-
@ldap.search(filter: "uid=user1", base: "ou=People,dc=example,dc=org", ignore_server_caps: true)
|
18
|
-
@ldap.search(filter: "uid=user1", base: "ou=People,dc=example,dc=org", ignore_server_caps: true)
|
19
|
-
end
|
20
|
-
|
21
|
-
assert_equal 1, events.size
|
22
|
-
end
|
23
|
-
|
24
|
-
# NOTE: query for two or more entries so that the socket must be read
|
25
|
-
# multiple times.
|
26
|
-
# See The Problem: https://github.com/ruby-ldap/ruby-net-ldap/issues/136
|
27
|
-
|
28
|
-
def test_nested_search_without_open
|
29
|
-
entries = []
|
30
|
-
nested_entry = nil
|
31
|
-
|
32
|
-
@ldap.search(filter: "(|(uid=user1)(uid=user2))", base: "ou=People,dc=example,dc=org") do |entry|
|
33
|
-
entries << entry.uid.first
|
34
|
-
nested_entry ||= @ldap.search(filter: "uid=user3", base: "ou=People,dc=example,dc=org").first
|
35
|
-
end
|
36
|
-
|
37
|
-
assert_equal "user3", nested_entry.uid.first
|
38
|
-
assert_equal %w(user1 user2), entries
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_nested_search_with_open
|
42
|
-
entries = []
|
43
|
-
nested_entry = nil
|
44
|
-
|
45
|
-
@ldap.open do
|
46
|
-
@ldap.search(filter: "(|(uid=user1)(uid=user2))", base: "ou=People,dc=example,dc=org") do |entry|
|
47
|
-
entries << entry.uid.first
|
48
|
-
nested_entry ||= @ldap.search(filter: "uid=user3", base: "ou=People,dc=example,dc=org").first
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
assert_equal "user3", nested_entry.uid.first
|
53
|
-
assert_equal %w(user1 user2), entries
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_nested_add_with_open
|
57
|
-
entries = []
|
58
|
-
nested_entry = nil
|
59
|
-
|
60
|
-
dn = "uid=nested-open-added-user1,ou=People,dc=example,dc=org"
|
61
|
-
attrs = {
|
62
|
-
objectclass: %w(top inetOrgPerson organizationalPerson person),
|
63
|
-
uid: "nested-open-added-user1",
|
64
|
-
cn: "nested-open-added-user1",
|
65
|
-
sn: "nested-open-added-user1",
|
66
|
-
mail: "nested-open-added-user1@rubyldap.com",
|
67
|
-
}
|
68
|
-
|
69
|
-
@ldap.delete dn: dn
|
70
|
-
|
71
|
-
@ldap.open do
|
72
|
-
@ldap.search(filter: "(|(uid=user1)(uid=user2))", base: "ou=People,dc=example,dc=org") do |entry|
|
73
|
-
entries << entry.uid.first
|
74
|
-
|
75
|
-
nested_entry ||= begin
|
76
|
-
assert @ldap.add(dn: dn, attributes: attrs), @ldap.get_operation_result.inspect
|
77
|
-
@ldap.search(base: dn, scope: Net::LDAP::SearchScope_BaseObject).first
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
assert_equal %w(user1 user2), entries
|
83
|
-
assert_equal "nested-open-added-user1", nested_entry.uid.first
|
84
|
-
ensure
|
85
|
-
@ldap.delete dn: dn
|
86
|
-
end
|
87
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
class TestPasswordModifyIntegration < LDAPIntegrationTestCase
|
4
|
-
def setup
|
5
|
-
super
|
6
|
-
@admin_account = {dn: 'cn=admin,dc=example,dc=org', password: 'admin', method: :simple}
|
7
|
-
@ldap.authenticate @admin_account[:dn], @admin_account[:password]
|
8
|
-
|
9
|
-
@dn = 'uid=modify-password-user1,ou=People,dc=example,dc=org'
|
10
|
-
|
11
|
-
attrs = {
|
12
|
-
objectclass: %w(top inetOrgPerson organizationalPerson person),
|
13
|
-
uid: 'modify-password-user1',
|
14
|
-
cn: 'modify-password-user1',
|
15
|
-
sn: 'modify-password-user1',
|
16
|
-
mail: 'modify-password-user1@rubyldap.com',
|
17
|
-
userPassword: 'admin',
|
18
|
-
}
|
19
|
-
unless @ldap.search(base: @dn, scope: Net::LDAP::SearchScope_BaseObject)
|
20
|
-
assert @ldap.add(dn: @dn, attributes: attrs), @ldap.get_operation_result.inspect
|
21
|
-
end
|
22
|
-
assert @ldap.search(base: @dn, scope: Net::LDAP::SearchScope_BaseObject)
|
23
|
-
|
24
|
-
@auth = {
|
25
|
-
method: :simple,
|
26
|
-
username: @dn,
|
27
|
-
password: 'admin',
|
28
|
-
}
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_password_modify
|
32
|
-
assert @ldap.password_modify(dn: @dn,
|
33
|
-
auth: @auth,
|
34
|
-
old_password: 'admin',
|
35
|
-
new_password: 'passworD2')
|
36
|
-
|
37
|
-
assert @ldap.get_operation_result.extended_response.nil?,
|
38
|
-
'Should not have generated a new password'
|
39
|
-
|
40
|
-
refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
|
41
|
-
'Old password should no longer be valid'
|
42
|
-
|
43
|
-
assert @ldap.bind(username: @dn, password: 'passworD2', method: :simple),
|
44
|
-
'New password should be valid'
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_password_modify_generate
|
48
|
-
assert @ldap.password_modify(dn: @dn,
|
49
|
-
auth: @auth,
|
50
|
-
old_password: 'admin')
|
51
|
-
|
52
|
-
generated_password = @ldap.get_operation_result.extended_response[0][0]
|
53
|
-
|
54
|
-
assert generated_password, 'Should have generated a password'
|
55
|
-
|
56
|
-
refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
|
57
|
-
'Old password should no longer be valid'
|
58
|
-
|
59
|
-
assert @ldap.bind(username: @dn, password: generated_password, method: :simple),
|
60
|
-
'New password should be valid'
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_password_modify_generate_no_old_password
|
64
|
-
assert @ldap.password_modify(dn: @dn,
|
65
|
-
auth: @auth)
|
66
|
-
|
67
|
-
generated_password = @ldap.get_operation_result.extended_response[0][0]
|
68
|
-
|
69
|
-
assert generated_password, 'Should have generated a password'
|
70
|
-
|
71
|
-
refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
|
72
|
-
'Old password should no longer be valid'
|
73
|
-
|
74
|
-
assert @ldap.bind(username: @dn, password: generated_password, method: :simple),
|
75
|
-
'New password should be valid'
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_password_modify_overwrite_old_password
|
79
|
-
assert @ldap.password_modify(dn: @dn,
|
80
|
-
auth: @admin_account,
|
81
|
-
new_password: 'passworD3')
|
82
|
-
|
83
|
-
refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
|
84
|
-
'Old password should no longer be valid'
|
85
|
-
|
86
|
-
assert @ldap.bind(username: @dn, password: 'passworD3', method: :simple),
|
87
|
-
'New password should be valid'
|
88
|
-
end
|
89
|
-
|
90
|
-
def teardown
|
91
|
-
@ldap.delete dn: @dn
|
92
|
-
end
|
93
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
# NOTE: These tests depend on the OpenLDAP retcode overlay.
|
4
|
-
# See: section 12.12 http://www.openldap.org/doc/admin24/overlays.html
|
5
|
-
|
6
|
-
class TestReturnCodeIntegration < LDAPIntegrationTestCase
|
7
|
-
def test_open_error
|
8
|
-
@ldap.authenticate "cn=fake", "creds"
|
9
|
-
@ldap.open do
|
10
|
-
result = @ldap.get_operation_result
|
11
|
-
assert_equal Net::LDAP::ResultCodeInvalidCredentials, result.code
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_operations_error
|
16
|
-
refute @ldap.search(filter: "cn=operationsError", base: "ou=Retcodes,dc=example,dc=org")
|
17
|
-
assert result = @ldap.get_operation_result
|
18
|
-
|
19
|
-
assert_equal Net::LDAP::ResultCodeOperationsError, result.code
|
20
|
-
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeOperationsError], result.message
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_protocol_error
|
24
|
-
refute @ldap.search(filter: "cn=protocolError", base: "ou=Retcodes,dc=example,dc=org")
|
25
|
-
assert result = @ldap.get_operation_result
|
26
|
-
|
27
|
-
assert_equal Net::LDAP::ResultCodeProtocolError, result.code
|
28
|
-
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeProtocolError], result.message
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_time_limit_exceeded
|
32
|
-
assert @ldap.search(filter: "cn=timeLimitExceeded", base: "ou=Retcodes,dc=example,dc=org")
|
33
|
-
assert result = @ldap.get_operation_result
|
34
|
-
|
35
|
-
assert_equal Net::LDAP::ResultCodeTimeLimitExceeded, result.code
|
36
|
-
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeTimeLimitExceeded], result.message
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_size_limit_exceeded
|
40
|
-
assert @ldap.search(filter: "cn=sizeLimitExceeded", base: "ou=Retcodes,dc=example,dc=org")
|
41
|
-
assert result = @ldap.get_operation_result
|
42
|
-
|
43
|
-
assert_equal Net::LDAP::ResultCodeSizeLimitExceeded, result.code
|
44
|
-
assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeSizeLimitExceeded], result.message
|
45
|
-
end
|
46
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
class TestSearchIntegration < LDAPIntegrationTestCase
|
4
|
-
def test_search
|
5
|
-
entries = []
|
6
|
-
|
7
|
-
result = @ldap.search(base: "dc=example,dc=org") do |entry|
|
8
|
-
assert_kind_of Net::LDAP::Entry, entry
|
9
|
-
entries << entry
|
10
|
-
end
|
11
|
-
|
12
|
-
refute entries.empty?
|
13
|
-
assert_equal entries, result
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_search_without_result
|
17
|
-
entries = []
|
18
|
-
|
19
|
-
result = @ldap.search(base: "dc=example,dc=org", return_result: false) do |entry|
|
20
|
-
assert_kind_of Net::LDAP::Entry, entry
|
21
|
-
entries << entry
|
22
|
-
end
|
23
|
-
|
24
|
-
assert result
|
25
|
-
refute_equal entries, result
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_search_filter_string
|
29
|
-
entries = @ldap.search(base: "dc=example,dc=org", filter: "(uid=user1)")
|
30
|
-
assert_equal 1, entries.size
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_search_filter_object
|
34
|
-
filter = Net::LDAP::Filter.eq("uid", "user1") | Net::LDAP::Filter.eq("uid", "user2")
|
35
|
-
entries = @ldap.search(base: "dc=example,dc=org", filter: filter)
|
36
|
-
assert_equal 2, entries.size
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_search_constrained_attributes
|
40
|
-
entry = @ldap.search(base: "uid=user1,ou=People,dc=example,dc=org", attributes: ["cn", "sn"]).first
|
41
|
-
assert_equal [:cn, :dn, :sn], entry.attribute_names.sort # :dn is always included
|
42
|
-
assert_empty entry[:mail]
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_search_attributes_only
|
46
|
-
entry = @ldap.search(base: "uid=user1,ou=People,dc=example,dc=org", attributes_only: true).first
|
47
|
-
|
48
|
-
assert_empty entry[:cn], "unexpected attribute value: #{entry[:cn]}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_search_timeout
|
52
|
-
entries = []
|
53
|
-
events = @service.subscribe "search.net_ldap_connection"
|
54
|
-
|
55
|
-
result = @ldap.search(base: "dc=example,dc=org", time: 5) do |entry|
|
56
|
-
assert_kind_of Net::LDAP::Entry, entry
|
57
|
-
entries << entry
|
58
|
-
end
|
59
|
-
|
60
|
-
payload, = events.pop
|
61
|
-
assert_equal 5, payload[:time]
|
62
|
-
assert_equal entries, result
|
63
|
-
end
|
64
|
-
|
65
|
-
# http://tools.ietf.org/html/rfc4511#section-4.5.1.4
|
66
|
-
def test_search_with_size
|
67
|
-
entries = []
|
68
|
-
|
69
|
-
result = @ldap.search(base: "dc=example,dc=org", size: 1) do |entry|
|
70
|
-
assert_kind_of Net::LDAP::Entry, entry
|
71
|
-
entries << entry
|
72
|
-
end
|
73
|
-
|
74
|
-
assert_equal 1, result.size
|
75
|
-
assert_equal entries, result
|
76
|
-
end
|
77
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
/.vagrant
|
data/test/test_auth_adapter.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TestAuthAdapter < Test::Unit::TestCase
|
4
|
-
class FakeSocket
|
5
|
-
def initialize(*args)
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_undefined_auth_adapter
|
10
|
-
conn = Net::LDAP::Connection.new(host: 'ldap.example.com', port: 379, :socket_class => FakeSocket)
|
11
|
-
assert_raise Net::LDAP::AuthMethodUnsupportedError, "Unsupported auth method (foo)" do
|
12
|
-
conn.bind(method: :foo)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/test/test_dn.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
require 'net/ldap/dn'
|
3
|
-
|
4
|
-
class TestDN < Test::Unit::TestCase
|
5
|
-
def test_escape
|
6
|
-
assert_equal '\\,\\+\\"\\\\\\<\\>\\;', Net::LDAP::DN.escape(',+"\\<>;')
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_escape_on_initialize
|
10
|
-
dn = Net::LDAP::DN.new('cn', ',+"\\<>;', 'ou=company')
|
11
|
-
assert_equal 'cn=\\,\\+\\"\\\\\\<\\>\\;,ou=company', dn.to_s
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_to_a
|
15
|
-
dn = Net::LDAP::DN.new('cn=James, ou=Company\\,\\20LLC')
|
16
|
-
assert_equal ['cn', 'James', 'ou', 'Company, LLC'], dn.to_a
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_to_a_parenthesis
|
20
|
-
dn = Net::LDAP::DN.new('cn = \ James , ou = "Comp\28ny" ')
|
21
|
-
assert_equal ['cn', ' James', 'ou', 'Comp(ny'], dn.to_a
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_to_a_hash_symbol
|
25
|
-
dn = Net::LDAP::DN.new('1.23.4= #A3B4D5 ,ou=Company')
|
26
|
-
assert_equal ['1.23.4', '#A3B4D5', 'ou', 'Company'], dn.to_a
|
27
|
-
end
|
28
|
-
|
29
|
-
# TODO: raise a more specific exception than RuntimeError
|
30
|
-
def test_bad_input_raises_error
|
31
|
-
[
|
32
|
-
'cn=James,',
|
33
|
-
'cn=#aa aa',
|
34
|
-
'cn="James',
|
35
|
-
'cn=J\ames',
|
36
|
-
'cn=\\',
|
37
|
-
'1.2.d=Value',
|
38
|
-
'd1.2=Value',
|
39
|
-
].each do |input|
|
40
|
-
dn = Net::LDAP::DN.new(input)
|
41
|
-
assert_raises(RuntimeError) { dn.to_a }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/test/test_entry.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
require_relative 'test_helper'
|
2
|
-
|
3
|
-
class TestEntry < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@entry = Net::LDAP::Entry.new 'cn=Barbara,o=corp'
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_dn
|
9
|
-
assert_equal 'cn=Barbara,o=corp', @entry.dn
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_empty_array_when_accessing_nonexistent_attribute
|
13
|
-
assert_equal [], @entry['sn']
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_attribute_assignment
|
17
|
-
@entry['sn'] = 'Jensen'
|
18
|
-
assert_equal ['Jensen'], @entry['sn']
|
19
|
-
assert_equal ['Jensen'], @entry.sn
|
20
|
-
assert_equal ['Jensen'], @entry[:sn]
|
21
|
-
|
22
|
-
@entry[:sn] = 'Jensen'
|
23
|
-
assert_equal ['Jensen'], @entry['sn']
|
24
|
-
assert_equal ['Jensen'], @entry.sn
|
25
|
-
assert_equal ['Jensen'], @entry[:sn]
|
26
|
-
|
27
|
-
@entry.sn = 'Jensen'
|
28
|
-
assert_equal ['Jensen'], @entry['sn']
|
29
|
-
assert_equal ['Jensen'], @entry.sn
|
30
|
-
assert_equal ['Jensen'], @entry[:sn]
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_case_insensitive_attribute_names
|
34
|
-
@entry['sn'] = 'Jensen'
|
35
|
-
assert_equal ['Jensen'], @entry.sn
|
36
|
-
assert_equal ['Jensen'], @entry.Sn
|
37
|
-
assert_equal ['Jensen'], @entry.SN
|
38
|
-
assert_equal ['Jensen'], @entry['sn']
|
39
|
-
assert_equal ['Jensen'], @entry['Sn']
|
40
|
-
assert_equal ['Jensen'], @entry['SN']
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class TestEntryLDIF < Test::Unit::TestCase
|
45
|
-
def setup
|
46
|
-
@entry = Net::LDAP::Entry.from_single_ldif_string(
|
47
|
-
%Q{dn: something
|
48
|
-
foo: foo
|
49
|
-
barAttribute: bar
|
50
|
-
})
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_attribute
|
54
|
-
assert_equal ['foo'], @entry.foo
|
55
|
-
assert_equal ['foo'], @entry.Foo
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_modify_attribute
|
59
|
-
@entry.foo = 'bar'
|
60
|
-
assert_equal ['bar'], @entry.foo
|
61
|
-
|
62
|
-
@entry.fOo= 'baz'
|
63
|
-
assert_equal ['baz'], @entry.foo
|
64
|
-
end
|
65
|
-
end
|
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
|
data/test/test_filter_parser.rb
DELETED
@@ -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
|