net-ldap 0.1.1 → 0.2
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.
Potentially problematic release.
This version of net-ldap might be problematic. Click here for more details.
- data/.autotest +11 -0
- data/.gemtest +0 -0
- data/.rspec +2 -0
- data/Contributors.rdoc +21 -0
- data/Hacking.rdoc +68 -0
- data/{History.txt → History.rdoc} +65 -1
- data/License.rdoc +29 -0
- data/Manifest.txt +25 -14
- data/README.rdoc +52 -0
- data/Rakefile +52 -96
- data/autotest/discover.rb +1 -0
- data/lib/net-ldap.rb +1 -0
- data/lib/net/ber.rb +302 -81
- data/lib/net/ber/ber_parser.rb +153 -97
- data/lib/net/ber/core_ext.rb +62 -0
- data/lib/net/ber/core_ext/array.rb +82 -0
- data/lib/net/ber/core_ext/bignum.rb +22 -0
- data/lib/net/ber/core_ext/false_class.rb +10 -0
- data/lib/net/ber/core_ext/fixnum.rb +66 -0
- data/lib/net/ber/core_ext/string.rb +48 -0
- data/lib/net/ber/core_ext/true_class.rb +12 -0
- data/lib/net/ldap.rb +1455 -1475
- data/lib/net/ldap/dataset.rb +134 -79
- data/lib/net/ldap/dn.rb +225 -0
- data/lib/net/ldap/entry.rb +168 -249
- data/lib/net/ldap/filter.rb +654 -387
- data/lib/net/ldap/password.rb +31 -0
- data/lib/net/ldap/pdu.rb +232 -233
- data/lib/net/snmp.rb +4 -31
- data/net-ldap.gemspec +59 -0
- data/spec/integration/ssl_ber_spec.rb +3 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/unit/ber/ber_spec.rb +82 -6
- data/spec/unit/ber/core_ext/string_spec.rb +51 -0
- data/spec/unit/ldap/dn_spec.rb +80 -0
- data/spec/unit/ldap/entry_spec.rb +51 -0
- data/spec/unit/ldap/filter_spec.rb +84 -0
- data/spec/unit/ldap_spec.rb +48 -0
- data/test/test_entry.rb +54 -2
- data/test/test_filter.rb +93 -54
- data/test/test_ldap_connection.rb +24 -0
- data/test/test_ldif.rb +31 -23
- data/test/test_rename.rb +77 -0
- data/test/test_snmp.rb +34 -33
- metadata +88 -52
- data/COPYING +0 -272
- data/LICENSE +0 -56
- data/README.txt +0 -68
- data/lib/net/ldap/core_ext/all.rb +0 -43
- data/lib/net/ldap/core_ext/array.rb +0 -42
- data/lib/net/ldap/core_ext/bignum.rb +0 -25
- data/lib/net/ldap/core_ext/false_class.rb +0 -11
- data/lib/net/ldap/core_ext/fixnum.rb +0 -74
- data/lib/net/ldap/core_ext/string.rb +0 -40
- data/lib/net/ldap/core_ext/true_class.rb +0 -11
- data/lib/net/ldap/psw.rb +0 -57
- data/lib/net/ldif.rb +0 -34
- data/test/test_ber.rb +0 -78
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Net::LDAP::Connection do
|
4
|
+
describe "initialize" do
|
5
|
+
context "when host is not responding" do
|
6
|
+
before(:each) do
|
7
|
+
flexmock(TCPSocket).
|
8
|
+
should_receive(:new).and_raise(Errno::ECONNREFUSED)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should raise LdapError" do
|
12
|
+
lambda {
|
13
|
+
Net::LDAP::Connection.new(
|
14
|
+
:server => 'test.mocked.com',
|
15
|
+
:port => 636)
|
16
|
+
}.should raise_error(Net::LDAP::LdapError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
context "when host is blocking the port" do
|
20
|
+
before(:each) do
|
21
|
+
flexmock(TCPSocket).
|
22
|
+
should_receive(:new).and_raise(SocketError)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should raise LdapError" do
|
26
|
+
lambda {
|
27
|
+
Net::LDAP::Connection.new(
|
28
|
+
:server => 'test.mocked.com',
|
29
|
+
:port => 636)
|
30
|
+
}.should raise_error(Net::LDAP::LdapError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
context "on other exceptions" do
|
34
|
+
before(:each) do
|
35
|
+
flexmock(TCPSocket).
|
36
|
+
should_receive(:new).and_raise(NameError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should rethrow the exception" do
|
40
|
+
lambda {
|
41
|
+
Net::LDAP::Connection.new(
|
42
|
+
:server => 'test.mocked.com',
|
43
|
+
:port => 636)
|
44
|
+
}.should raise_error(NameError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/test/test_entry.rb
CHANGED
@@ -1,7 +1,59 @@
|
|
1
1
|
require 'common'
|
2
2
|
|
3
|
+
=begin
|
3
4
|
class TestEntry < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
5
|
+
Commented out until I can make it a spec.
|
6
|
+
context "An instance of Entry" do
|
7
|
+
setup do
|
8
|
+
@entry = Net::LDAP::Entry.new 'cn=Barbara,o=corp'
|
9
|
+
end
|
10
|
+
|
11
|
+
should "be initialized with the DN" do
|
12
|
+
assert_equal 'cn=Barbara,o=corp', @entry.dn
|
13
|
+
end
|
14
|
+
|
15
|
+
should 'return an empty array when accessing a nonexistent attribute (index lookup)' do
|
16
|
+
assert_equal [], @entry['sn']
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'return an empty array when accessing a nonexistent attribute (method call)' do
|
20
|
+
assert_equal [], @entry.sn
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'create an attribute on assignment (index lookup)' do
|
24
|
+
@entry['sn'] = 'Jensen'
|
25
|
+
assert_equal ['Jensen'], @entry['sn']
|
26
|
+
end
|
27
|
+
|
28
|
+
should 'create an attribute on assignment (method call)' do
|
29
|
+
@entry.sn = 'Jensen'
|
30
|
+
assert_equal ['Jensen'], @entry.sn
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'have attributes accessible by index lookup' do
|
34
|
+
@entry['sn'] = 'Jensen'
|
35
|
+
assert_equal ['Jensen'], @entry['sn']
|
36
|
+
end
|
37
|
+
|
38
|
+
should 'have attributes accessible using a Symbol as the index' do
|
39
|
+
@entry[:sn] = 'Jensen'
|
40
|
+
assert_equal ['Jensen'], @entry[:sn]
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'have attributes accessible by method call' do
|
44
|
+
@entry['sn'] = 'Jensen'
|
45
|
+
assert_equal ['Jensen'], @entry.sn
|
46
|
+
end
|
47
|
+
|
48
|
+
should 'ignore case of attribute names' do
|
49
|
+
@entry['sn'] = 'Jensen'
|
50
|
+
assert_equal ['Jensen'], @entry.sn
|
51
|
+
assert_equal ['Jensen'], @entry.Sn
|
52
|
+
assert_equal ['Jensen'], @entry.SN
|
53
|
+
assert_equal ['Jensen'], @entry['sn']
|
54
|
+
assert_equal ['Jensen'], @entry['Sn']
|
55
|
+
assert_equal ['Jensen'], @entry['SN']
|
56
|
+
end
|
6
57
|
end
|
7
58
|
end
|
59
|
+
=end
|
data/test/test_filter.rb
CHANGED
@@ -1,68 +1,108 @@
|
|
1
|
-
# $Id: testfilter.rb 245 2007-05-05 02:44:32Z blackhedd $
|
2
|
-
|
3
1
|
require 'common'
|
4
2
|
|
5
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::LdapError) { Filter.from_rfc2254("") }
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_invalid_filter
|
16
|
+
assert_raises(Net::LDAP::LdapError) {
|
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
|
+
}
|
21
|
+
end
|
6
22
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
Net::LDAP::Filter.from_rfc2254( "uid!=george*" )
|
11
|
-
Net::LDAP::Filter.from_rfc2254( "uid <= george*" )
|
12
|
-
Net::LDAP::Filter.from_rfc2254( "uid>=george*" )
|
13
|
-
Net::LDAP::Filter.from_rfc2254( "uid!=george*" )
|
23
|
+
def test_to_s
|
24
|
+
assert_equal("(uid=george *)", Filter.eq("uid", "george *").to_s)
|
25
|
+
end
|
14
26
|
|
15
|
-
|
16
|
-
|
17
|
-
|
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)
|
18
53
|
end
|
19
54
|
|
55
|
+
def test_filter_with_single_clause
|
56
|
+
assert_equal("(cn=name)", Net::LDAP::Filter.construct("(&(cn=name))").to_s)
|
57
|
+
end
|
58
|
+
|
20
59
|
def test_filters_from_ber
|
21
60
|
[
|
22
|
-
Net::LDAP::Filter.eq(
|
23
|
-
Net::LDAP::Filter.pres(
|
24
|
-
Net::LDAP::Filter.eq(
|
25
|
-
Net::LDAP::Filter.ge(
|
26
|
-
Net::LDAP::Filter.le(
|
27
|
-
(~ Net::LDAP::Filter.pres(
|
28
|
-
(Net::LDAP::Filter.pres(
|
29
|
-
(Net::LDAP::Filter.pres(
|
30
|
-
(Net::LDAP::Filter.pres(
|
31
|
-
|
32
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa" ),
|
33
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa*bbb" ),
|
34
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa*bbb*ccc" ),
|
35
|
-
Net::LDAP::Filter.eq( "objectclass", "aaa*bbb" ),
|
36
|
-
Net::LDAP::Filter.eq( "objectclass", "aaa*bbb*ccc" ),
|
37
|
-
Net::LDAP::Filter.eq( "objectclass", "abc*def*1111*22*g" ),
|
38
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa*" ),
|
39
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa*bbb*" ),
|
40
|
-
Net::LDAP::Filter.eq( "objectclass", "*aaa*bbb*ccc*" ),
|
41
|
-
Net::LDAP::Filter.eq( "objectclass", "aaa*" ),
|
42
|
-
Net::LDAP::Filter.eq( "objectclass", "aaa*bbb*" ),
|
43
|
-
Net::LDAP::Filter.eq( "objectclass", "aaa*bbb*ccc*" ),
|
44
|
-
].each {|ber|
|
45
|
-
f = Net::LDAP::Filter.parse_ber( ber.to_ber.read_ber( Net::LDAP::AsnSyntax) )
|
46
|
-
assert( f == ber )
|
47
|
-
assert_equal( f.to_ber, ber.to_ber )
|
48
|
-
}
|
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")),
|
49
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
|
50
88
|
end
|
51
89
|
|
52
90
|
def test_ber_from_rfc2254_filter
|
53
91
|
[
|
54
|
-
Net::LDAP::Filter.construct(
|
55
|
-
Net::LDAP::Filter.construct("objectclass=ou"
|
56
|
-
Net::LDAP::Filter.construct("uid >= 500"
|
57
|
-
Net::LDAP::Filter.construct("uid <= 500"
|
58
|
-
Net::LDAP::Filter.construct("(!(uid=*))"
|
59
|
-
Net::LDAP::Filter.construct("(&(uid=*)(objectclass=*))"
|
60
|
-
Net::LDAP::Filter.construct("(&(uid=*)(objectclass=*)(sn=*))"
|
61
|
-
Net::LDAP::Filter.construct("(|(uid=*)(objectclass=*))"
|
62
|
-
Net::LDAP::Filter.construct("(|(uid=*)(objectclass=*)(sn=*))"
|
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=*))"),
|
63
101
|
|
64
102
|
Net::LDAP::Filter.construct("objectclass=*aaa"),
|
65
103
|
Net::LDAP::Filter.construct("objectclass=*aaa*bbb"),
|
104
|
+
Net::LDAP::Filter.construct("objectclass=*aaa bbb"),
|
105
|
+
Net::LDAP::Filter.construct("objectclass=*aaa bbb"),
|
66
106
|
Net::LDAP::Filter.construct("objectclass=*aaa*bbb*ccc"),
|
67
107
|
Net::LDAP::Filter.construct("objectclass=aaa*bbb"),
|
68
108
|
Net::LDAP::Filter.construct("objectclass=aaa*bbb*ccc"),
|
@@ -73,11 +113,10 @@ class TestFilter < Test::Unit::TestCase
|
|
73
113
|
Net::LDAP::Filter.construct("objectclass=aaa*"),
|
74
114
|
Net::LDAP::Filter.construct("objectclass=aaa*bbb*"),
|
75
115
|
Net::LDAP::Filter.construct("objectclass=aaa*bbb*ccc*"),
|
76
|
-
].each
|
77
|
-
|
78
|
-
assert(
|
79
|
-
assert_equal(
|
80
|
-
|
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
|
81
121
|
end
|
82
|
-
|
83
122
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'common'
|
2
|
+
|
3
|
+
class TestLDAP < Test::Unit::TestCase
|
4
|
+
def test_modify_ops_delete
|
5
|
+
args = {:operations=>[[:delete, "mail"]]}
|
6
|
+
result = Net::LDAP::Connection.modify_ops(args)
|
7
|
+
expected = ["0\r\n\x01\x010\b\x04\x04mail1\x00"]
|
8
|
+
assert_equal(expected, result)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_modify_ops_add
|
12
|
+
args = {:operations=>[[:add, "mail", "testuser@example.com"]]}
|
13
|
+
result = Net::LDAP::Connection.modify_ops(args)
|
14
|
+
expected = ["0#\n\x01\x000\x1E\x04\x04mail1\x16\x04\x14testuser@example.com"]
|
15
|
+
assert_equal(expected, result)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_modify_ops_replace
|
19
|
+
args = {:operations=>[[:replace, "mail", "testuser@example.com"]]}
|
20
|
+
result = Net::LDAP::Connection.modify_ops(args)
|
21
|
+
expected = ["0#\n\x01\x020\x1E\x04\x04mail1\x16\x04\x14testuser@example.com"]
|
22
|
+
assert_equal(expected, result)
|
23
|
+
end
|
24
|
+
end
|
data/test/test_ldif.rb
CHANGED
@@ -2,58 +2,66 @@
|
|
2
2
|
|
3
3
|
require 'common'
|
4
4
|
|
5
|
-
require 'net/ldif'
|
6
5
|
require 'digest/sha1'
|
7
6
|
require 'base64'
|
8
7
|
|
9
8
|
class TestLdif < Test::Unit::TestCase
|
10
|
-
|
11
9
|
TestLdifFilename = "#{File.dirname(__FILE__)}/testdata.ldif"
|
12
10
|
|
13
11
|
def test_empty_ldif
|
14
|
-
ds = Net::LDAP::Dataset.read_ldif(
|
15
|
-
assert_equal(
|
12
|
+
ds = Net::LDAP::Dataset.read_ldif(StringIO.new)
|
13
|
+
assert_equal(true, ds.empty?)
|
16
14
|
end
|
17
15
|
|
18
16
|
def test_ldif_with_comments
|
19
17
|
str = ["# Hello from LDIF-land", "# This is an unterminated comment"]
|
20
|
-
io = StringIO.new(
|
21
|
-
ds = Net::LDAP::Dataset::read_ldif(
|
22
|
-
assert_equal(
|
18
|
+
io = StringIO.new(str[0] + "\r\n" + str[1])
|
19
|
+
ds = Net::LDAP::Dataset::read_ldif(io)
|
20
|
+
assert_equal(str, ds.comments)
|
23
21
|
end
|
24
22
|
|
25
23
|
def test_ldif_with_password
|
26
24
|
psw = "goldbricks"
|
27
25
|
hashed_psw = "{SHA}" + Base64::encode64(Digest::SHA1.digest(psw)).chomp
|
28
26
|
|
29
|
-
ldif_encoded = Base64::encode64(
|
30
|
-
ds = Net::LDAP::Dataset::read_ldif(
|
27
|
+
ldif_encoded = Base64::encode64(hashed_psw).chomp
|
28
|
+
ds = Net::LDAP::Dataset::read_ldif(StringIO.new("dn: Goldbrick\r\nuserPassword:: #{ldif_encoded}\r\n\r\n"))
|
31
29
|
recovered_psw = ds["Goldbrick"][:userpassword].shift
|
32
|
-
assert_equal(
|
30
|
+
assert_equal(hashed_psw, recovered_psw)
|
33
31
|
end
|
34
32
|
|
35
33
|
def test_ldif_with_continuation_lines
|
36
|
-
ds = Net::LDAP::Dataset::read_ldif(
|
37
|
-
assert_equal(
|
34
|
+
ds = Net::LDAP::Dataset::read_ldif(StringIO.new("dn: abcdefg\r\n hijklmn\r\n\r\n"))
|
35
|
+
assert_equal(true, ds.has_key?("abcdefg hijklmn"))
|
38
36
|
end
|
39
37
|
|
40
38
|
# TODO, INADEQUATE. We need some more tests
|
41
39
|
# to verify the content.
|
42
40
|
def test_ldif
|
43
|
-
File.open(
|
44
|
-
ds = Net::LDAP::Dataset::read_ldif(
|
45
|
-
assert_equal(
|
41
|
+
File.open(TestLdifFilename, "r") {|f|
|
42
|
+
ds = Net::LDAP::Dataset::read_ldif(f)
|
43
|
+
assert_equal(13, ds.length)
|
46
44
|
}
|
47
45
|
end
|
48
46
|
|
49
|
-
# TODO, need some tests.
|
50
47
|
# Must test folded lines and base64-encoded lines as well as normal ones.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
48
|
+
def test_to_ldif
|
49
|
+
data = File.open(TestLdifFilename, "rb") { |f| f.read }
|
50
|
+
io = StringIO.new(data)
|
51
|
+
|
52
|
+
# added .lines to turn to array because 1.9 doesn't have
|
53
|
+
# .grep on basic strings
|
54
|
+
entries = data.lines.grep(/^dn:\s*/) { $'.chomp }
|
55
|
+
dn_entries = entries.dup
|
58
56
|
|
57
|
+
ds = Net::LDAP::Dataset::read_ldif(io) { |type, value|
|
58
|
+
case type
|
59
|
+
when :dn
|
60
|
+
assert_equal(dn_entries.first, value)
|
61
|
+
dn_entries.shift
|
62
|
+
end
|
63
|
+
}
|
64
|
+
assert_equal(entries.size, ds.size)
|
65
|
+
assert_equal(entries.sort, ds.to_ldif.grep(/^dn:\s*/) { $'.chomp })
|
66
|
+
end
|
59
67
|
end
|
data/test/test_rename.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'common'
|
2
|
+
|
3
|
+
# Commented out since it assumes you have a live LDAP server somewhere. This
|
4
|
+
# will be migrated to the integration specs, as soon as they are ready.
|
5
|
+
=begin
|
6
|
+
class TestRename < Test::Unit::TestCase
|
7
|
+
HOST= '10.10.10.71'
|
8
|
+
PORT = 389
|
9
|
+
BASE = "o=test"
|
10
|
+
AUTH = { :method => :simple, :username => "cn=testadmin,#{BASE}", :password => 'password' }
|
11
|
+
BASIC_USER = "cn=jsmith,ou=sales,#{BASE}"
|
12
|
+
RENAMED_USER = "cn=jbrown,ou=sales,#{BASE}"
|
13
|
+
MOVED_USER = "cn=jsmith,ou=marketing,#{BASE}"
|
14
|
+
RENAMED_MOVED_USER = "cn=jjones,ou=marketing,#{BASE}"
|
15
|
+
|
16
|
+
def setup
|
17
|
+
# create the entries we're going to manipulate
|
18
|
+
Net::LDAP::open(:host => HOST, :port => PORT, :auth => AUTH) do |ldap|
|
19
|
+
if ldap.add(:dn => "ou=sales,#{BASE}", :attributes => { :ou => "sales", :objectclass => "organizationalUnit" })
|
20
|
+
puts "Add failed: #{ldap.get_operation_result.message} - code: #{ldap.get_operation_result.code}"
|
21
|
+
end
|
22
|
+
ldap.add(:dn => "ou=marketing,#{BASE}", :attributes => { :ou => "marketing", :objectclass => "organizationalUnit" })
|
23
|
+
ldap.add(:dn => BASIC_USER, :attributes => { :cn => "jsmith", :objectclass => "inetOrgPerson", :sn => "Smith" })
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_rename_entry
|
28
|
+
dn = nil
|
29
|
+
Net::LDAP::open(:host => HOST, :port => PORT, :auth => AUTH) do |ldap|
|
30
|
+
ldap.rename(:olddn => BASIC_USER, :newrdn => "cn=jbrown")
|
31
|
+
|
32
|
+
ldap.search(:base => RENAMED_USER) do |entry|
|
33
|
+
dn = entry.dn
|
34
|
+
end
|
35
|
+
end
|
36
|
+
assert_equal(RENAMED_USER, dn)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_move_entry
|
40
|
+
dn = nil
|
41
|
+
Net::LDAP::open(:host => HOST, :port => PORT, :auth => AUTH) do |ldap|
|
42
|
+
ldap.rename(:olddn => BASIC_USER, :newrdn => "cn=jsmith", :new_superior => "ou=marketing,#{BASE}")
|
43
|
+
|
44
|
+
ldap.search(:base => MOVED_USER) do |entry|
|
45
|
+
dn = entry.dn
|
46
|
+
end
|
47
|
+
end
|
48
|
+
assert_equal(MOVED_USER, dn)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_move_and_rename_entry
|
52
|
+
dn = nil
|
53
|
+
Net::LDAP::open(:host => HOST, :port => PORT, :auth => AUTH) do |ldap|
|
54
|
+
ldap.rename(:olddn => BASIC_USER, :newrdn => "cn=jjones", :new_superior => "ou=marketing,#{BASE}")
|
55
|
+
|
56
|
+
ldap.search(:base => RENAMED_MOVED_USER) do |entry|
|
57
|
+
dn = entry.dn
|
58
|
+
end
|
59
|
+
end
|
60
|
+
assert_equal(RENAMED_MOVED_USER, dn)
|
61
|
+
end
|
62
|
+
|
63
|
+
def teardown
|
64
|
+
# delete the entries
|
65
|
+
# note: this doesn't always completely clear up on eDirectory as objects get locked while
|
66
|
+
# the rename/move is being completed on the server and this prevents the delete from happening
|
67
|
+
Net::LDAP::open(:host => HOST, :port => PORT, :auth => AUTH) do |ldap|
|
68
|
+
ldap.delete(:dn => BASIC_USER)
|
69
|
+
ldap.delete(:dn => RENAMED_USER)
|
70
|
+
ldap.delete(:dn => MOVED_USER)
|
71
|
+
ldap.delete(:dn => RENAMED_MOVED_USER)
|
72
|
+
ldap.delete(:dn => "ou=sales,#{BASE}")
|
73
|
+
ldap.delete(:dn => "ou=marketing,#{BASE}")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
=end
|