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.

Files changed (58) hide show
  1. data/.autotest +11 -0
  2. data/.gemtest +0 -0
  3. data/.rspec +2 -0
  4. data/Contributors.rdoc +21 -0
  5. data/Hacking.rdoc +68 -0
  6. data/{History.txt → History.rdoc} +65 -1
  7. data/License.rdoc +29 -0
  8. data/Manifest.txt +25 -14
  9. data/README.rdoc +52 -0
  10. data/Rakefile +52 -96
  11. data/autotest/discover.rb +1 -0
  12. data/lib/net-ldap.rb +1 -0
  13. data/lib/net/ber.rb +302 -81
  14. data/lib/net/ber/ber_parser.rb +153 -97
  15. data/lib/net/ber/core_ext.rb +62 -0
  16. data/lib/net/ber/core_ext/array.rb +82 -0
  17. data/lib/net/ber/core_ext/bignum.rb +22 -0
  18. data/lib/net/ber/core_ext/false_class.rb +10 -0
  19. data/lib/net/ber/core_ext/fixnum.rb +66 -0
  20. data/lib/net/ber/core_ext/string.rb +48 -0
  21. data/lib/net/ber/core_ext/true_class.rb +12 -0
  22. data/lib/net/ldap.rb +1455 -1475
  23. data/lib/net/ldap/dataset.rb +134 -79
  24. data/lib/net/ldap/dn.rb +225 -0
  25. data/lib/net/ldap/entry.rb +168 -249
  26. data/lib/net/ldap/filter.rb +654 -387
  27. data/lib/net/ldap/password.rb +31 -0
  28. data/lib/net/ldap/pdu.rb +232 -233
  29. data/lib/net/snmp.rb +4 -31
  30. data/net-ldap.gemspec +59 -0
  31. data/spec/integration/ssl_ber_spec.rb +3 -0
  32. data/spec/spec_helper.rb +2 -2
  33. data/spec/unit/ber/ber_spec.rb +82 -6
  34. data/spec/unit/ber/core_ext/string_spec.rb +51 -0
  35. data/spec/unit/ldap/dn_spec.rb +80 -0
  36. data/spec/unit/ldap/entry_spec.rb +51 -0
  37. data/spec/unit/ldap/filter_spec.rb +84 -0
  38. data/spec/unit/ldap_spec.rb +48 -0
  39. data/test/test_entry.rb +54 -2
  40. data/test/test_filter.rb +93 -54
  41. data/test/test_ldap_connection.rb +24 -0
  42. data/test/test_ldif.rb +31 -23
  43. data/test/test_rename.rb +77 -0
  44. data/test/test_snmp.rb +34 -33
  45. metadata +88 -52
  46. data/COPYING +0 -272
  47. data/LICENSE +0 -56
  48. data/README.txt +0 -68
  49. data/lib/net/ldap/core_ext/all.rb +0 -43
  50. data/lib/net/ldap/core_ext/array.rb +0 -42
  51. data/lib/net/ldap/core_ext/bignum.rb +0 -25
  52. data/lib/net/ldap/core_ext/false_class.rb +0 -11
  53. data/lib/net/ldap/core_ext/fixnum.rb +0 -74
  54. data/lib/net/ldap/core_ext/string.rb +0 -40
  55. data/lib/net/ldap/core_ext/true_class.rb +0 -11
  56. data/lib/net/ldap/psw.rb +0 -57
  57. data/lib/net/ldif.rb +0 -34
  58. 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
@@ -1,7 +1,59 @@
1
1
  require 'common'
2
2
 
3
+ =begin
3
4
  class TestEntry < Test::Unit::TestCase
4
- def test_entry
5
- # FIX
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
@@ -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
- # Note that the RFC doesn't define either less-than or greater-than.
8
- def test_rfc_2254
9
- Net::LDAP::Filter.from_rfc2254( " ( uid=george* ) " )
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
- Net::LDAP::Filter.from_rfc2254( "(& (uid!=george* ) (mail=*))" )
16
- Net::LDAP::Filter.from_rfc2254( "(| (uid!=george* ) (mail=*))" )
17
- Net::LDAP::Filter.from_rfc2254( "(! (mail=*))" )
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( "objectclass", "*" ),
23
- Net::LDAP::Filter.pres( "objectclass" ),
24
- Net::LDAP::Filter.eq( "objectclass", "ou" ),
25
- Net::LDAP::Filter.ge( "uid", "500" ),
26
- Net::LDAP::Filter.le( "uid", "500" ),
27
- (~ Net::LDAP::Filter.pres( "objectclass" )),
28
- (Net::LDAP::Filter.pres( "objectclass" ) & Net::LDAP::Filter.pres( "ou" )),
29
- (Net::LDAP::Filter.pres( "objectclass" ) & Net::LDAP::Filter.pres( "ou" ) & Net::LDAP::Filter.pres("sn")),
30
- (Net::LDAP::Filter.pres( "objectclass" ) | Net::LDAP::Filter.pres( "ou" ) | Net::LDAP::Filter.pres("sn")),
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( "objectclass=*" ),
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 {|ber|
77
- f = Net::LDAP::Filter.parse_ber( ber.to_ber.read_ber( Net::LDAP::AsnSyntax) )
78
- assert( f == ber )
79
- assert_equal( f.to_ber, ber.to_ber )
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
@@ -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( StringIO.new )
15
- assert_equal( true, ds.empty? )
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( str[0] + "\r\n" + str[1] )
21
- ds = Net::LDAP::Dataset::read_ldif( io )
22
- assert_equal( str, ds.comments )
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( hashed_psw ).chomp
30
- ds = Net::LDAP::Dataset::read_ldif( StringIO.new( "dn: Goldbrick\r\nuserPassword:: #{ldif_encoded}\r\n\r\n" ))
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( hashed_psw, recovered_psw )
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( StringIO.new( "dn: abcdefg\r\n hijklmn\r\n\r\n" ))
37
- assert_equal( true, ds.has_key?( "abcdefg hijklmn" ))
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( TestLdifFilename, "r" ) {|f|
44
- ds = Net::LDAP::Dataset::read_ldif( f )
45
- assert_equal( 13, ds.length )
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
- #def test_to_ldif
52
- # File.open( TestLdifFilename, "r" ) {|f|
53
- # ds = Net::LDAP::Dataset::read_ldif( f )
54
- # ds.to_ldif
55
- # assert_equal( true, false ) # REMOVE WHEN WE HAVE SOME TESTS HERE.
56
- # }
57
- #end
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
@@ -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