net-ldap 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of net-ldap might be problematic. Click here for more details.

@@ -1,3 +1,13 @@
1
+ === Net::LDAP 0.3.0 / 2012-02-14
2
+ * Major changes:
3
+ * Now uses UTF-8 strings instead of ASCII-8 per the LDAP RFC
4
+ Major Enhancements:
5
+ * Adding continuation reference processing
6
+ * Bug Fixes:
7
+ * Fixes usupported object type #139
8
+ * Fixes Net::LDAP namespace errors
9
+ * Return nil instead of an empty array if the search fails
10
+
1
11
  === Net::LDAP 0.2.2 / 2011-03-26
2
12
  * Bug Fixes:
3
13
  * Fixed the call to Net::LDAP.modify_ops from Net::LDAP#modify.
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ Hoe.spec 'net-ldap' do |spec|
20
20
  spec.remote_rdoc_dir = ''
21
21
  spec.rsync_args << ' --exclude=statsvn/'
22
22
 
23
- spec.url = %W(http://net-ldap.rubyforge.org/ https://github.com/ruby-ldap/ruby-net-ldap)
23
+ spec.url = %W(http://rubyldap.com/ https://github.com/ruby-ldap/ruby-net-ldap)
24
24
 
25
25
  spec.history_file = 'History.rdoc'
26
26
  spec.readme_file = 'README.rdoc'
@@ -106,7 +106,7 @@ module Net # :nodoc:
106
106
  # <tr><th>BMPString</th><th>C</th><td>30: 62 (0x3e, 0b00111110)</td></tr>
107
107
  # </table>
108
108
  module BER
109
- VERSION = '0.2.2'
109
+ VERSION = '0.3.0'
110
110
 
111
111
  ##
112
112
  # Used for BER-encoding the length and content bytes of a Fixnum integer
@@ -295,6 +295,8 @@ class Net::BER::BerIdentifiedString < String
295
295
  attr_accessor :ber_identifier
296
296
  def initialize args
297
297
  super args
298
+ # LDAP uses UTF-8 encoded strings
299
+ force_encoding('UTF-8') if respond_to?(:encoding)
298
300
  end
299
301
  end
300
302
 
@@ -12,9 +12,21 @@ module Net::BER::Extensions::String
12
12
  # User code should call either #to_ber_application_string or
13
13
  # #to_ber_contextspecific.
14
14
  def to_ber(code = 0x04)
15
- [code].pack('C') + length.to_ber_length_encoding + self
15
+ raw_string = raw_utf8_encoded
16
+ [code].pack('C') + raw_string.length.to_ber_length_encoding + raw_string
16
17
  end
17
18
 
19
+ def raw_utf8_encoded
20
+ if self.respond_to?(:encode)
21
+ # Strings should be UTF-8 encoded according to LDAP.
22
+ # However, the BER code is not necessarily valid UTF-8
23
+ self.encode('UTF-8').force_encoding('ASCII-8BIT')
24
+ else
25
+ self
26
+ end
27
+ end
28
+ private :raw_utf8_encoded
29
+
18
30
  ##
19
31
  # Creates an application-specific BER string encoded value with the
20
32
  # provided syntax code value.
@@ -241,7 +241,7 @@ require 'net/ldap/entry'
241
241
  # and then keeps it open while it executes a user-supplied block.
242
242
  # Net::LDAP#open closes the connection on completion of the block.
243
243
  class Net::LDAP
244
- VERSION = "0.2.2"
244
+ VERSION = "0.3.0"
245
245
 
246
246
  class LdapError < StandardError; end
247
247
 
@@ -317,6 +317,7 @@ class Net::LDAP
317
317
  2 => "Protocol Error",
318
318
  3 => "Time Limit Exceeded",
319
319
  4 => "Size Limit Exceeded",
320
+ 10 => "Referral",
320
321
  12 => "Unavailable crtical extension",
321
322
  14 => "saslBindInProgress",
322
323
  16 => "No Such Attribute",
@@ -619,7 +620,8 @@ class Net::LDAP
619
620
  end
620
621
 
621
622
  args[:base] ||= @base
622
- result_set = (args and args[:return_result] == false) ? nil : []
623
+ return_result_set = args[:return_result] != false
624
+ result_set = return_result_set ? [] : nil
623
625
 
624
626
  if @open_connection
625
627
  @result = @open_connection.search(args) { |entry|
@@ -642,7 +644,11 @@ class Net::LDAP
642
644
  end
643
645
  end
644
646
 
645
- @result == 0 and result_set
647
+ if return_result_set
648
+ @result == 0 ? result_set : nil
649
+ else
650
+ @result == 0
651
+ end
646
652
  end
647
653
 
648
654
  # #bind connects to an LDAP server and requests authentication based on
@@ -1320,7 +1326,7 @@ class Net::LDAP::Connection #:nodoc:
1320
1326
  # in the protocol.
1321
1327
  #++
1322
1328
  def search(args = {})
1323
- search_filter = (args && args[:filter]) ||
1329
+ search_filter = (args && args[:filter]) ||
1324
1330
  Net::LDAP::Filter.eq("objectclass", "*")
1325
1331
  search_filter = Net::LDAP::Filter.construct(search_filter) if search_filter.is_a?(String)
1326
1332
  search_base = (args && args[:base]) || "dc=example, dc=com"
@@ -1389,9 +1395,9 @@ class Net::LDAP::Connection #:nodoc:
1389
1395
  false.to_ber,
1390
1396
  rfc2696_cookie.map{ |v| v.to_ber}.to_ber_sequence.to_s.to_ber
1391
1397
  ].to_ber_sequence if paged_searches_supported
1392
- controls = controls.to_ber_contextspecific(0)
1398
+ controls = controls.empty? ? nil : controls.to_ber_contextspecific(0)
1393
1399
 
1394
- pkt = [next_msgid.to_ber, request, controls].to_ber_sequence
1400
+ pkt = [next_msgid.to_ber, request, controls].compact.to_ber_sequence
1395
1401
  @conn.write pkt
1396
1402
 
1397
1403
  result_code = 0
@@ -1413,6 +1419,13 @@ class Net::LDAP::Connection #:nodoc:
1413
1419
  when 5 # search-result
1414
1420
  result_code = pdu.result_code
1415
1421
  controls = pdu.result_controls
1422
+ if return_referrals && result_code == 10
1423
+ if block_given?
1424
+ se = Net::LDAP::Entry.new
1425
+ se[:search_referrals] = (pdu.search_referrals || [])
1426
+ yield se
1427
+ end
1428
+ end
1416
1429
  break
1417
1430
  else
1418
1431
  raise Net::LDAP::LdapError, "invalid response-type in search: #{pdu.app_tag}"
@@ -1521,15 +1534,17 @@ class Net::LDAP::Connection #:nodoc:
1521
1534
  old_dn = args[:olddn] or raise "Unable to rename empty DN"
1522
1535
  new_rdn = args[:newrdn] or raise "Unable to rename to empty RDN"
1523
1536
  delete_attrs = args[:delete_attributes] ? true : false
1524
- new_superior = args[:new_superior]
1537
+ new_superior = args[:new_superior]
1538
+
1539
+ request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber]
1540
+ request << new_superior.to_ber unless new_superior == nil
1525
1541
 
1526
- request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber]
1527
- request << new_superior.to_ber unless new_superior == nil
1528
-
1529
1542
  pkt = [next_msgid.to_ber, request.to_ber_appsequence(12)].to_ber_sequence
1530
1543
  @conn.write pkt
1531
1544
 
1532
- (be = @conn.read_ber(AsnSyntax)) && (pdu = LdapPdu.new( be )) && (pdu.app_tag == 13) or raise LdapError.new( "response missing or invalid" )
1545
+ (be = @conn.read_ber(Net::LDAP::AsnSyntax)) &&
1546
+ (pdu = Net::LDAP::PDU.new( be )) && (pdu.app_tag == 13) or
1547
+ raise Net::LDAP::LdapError.new( "response missing or invalid" )
1533
1548
  pdu.result_code
1534
1549
  end
1535
1550
 
@@ -117,8 +117,8 @@ class Net::LDAP::Dataset < Hash
117
117
  while line
118
118
  new_line = io.gets
119
119
 
120
- if new_line =~ /^[\s]+/
121
- line << " " << $'
120
+ if new_line =~ /^ /
121
+ line << $'
122
122
  else
123
123
  nextline = new_line
124
124
 
@@ -136,6 +136,7 @@ class Net::LDAP::PDU
136
136
  :matchedDN => sequence[1],
137
137
  :errorMessage => sequence[2]
138
138
  }
139
+ parse_search_referral(sequence[3]) if @ldap_result[:resultCode] == 10
139
140
  end
140
141
  private :parse_ldap_result
141
142
 
@@ -2,7 +2,7 @@
2
2
  # :stopdoc:
3
3
  module Net
4
4
  class SNMP
5
- VERSION = '0.2.2'
5
+ VERSION = '0.3.0'
6
6
 
7
7
  AsnSyntax = Net::BER.compile_syntax({
8
8
  :application => {
@@ -1,8 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ $:.unshift './lib'
2
3
 
3
4
  Gem::Specification.new do |s|
4
5
  s.name = %q{net-ldap}
5
- s.version = "0.2.20110317223538"
6
+ s.version = Net::LDAP::VERSION
6
7
 
7
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
9
  s.authors = ["Francis Cianfrocca", "Emiel van de Laar", "Rory O'Connell", "Kaspar Schiess", "Austin Ziegler"]
@@ -20,8 +21,8 @@ Our roadmap for Net::LDAP 1.0 is to gain full <em>client</em> compliance with
20
21
  the most recent LDAP RFCs (4510–4519, plutions of 4520–4532).}
21
22
  s.email = ["blackhedd@rubyforge.org", "gemiel@gmail.com", "rory.ocon@gmail.com", "kaspar.schiess@absurd.li", "austin@rubyforge.org"]
22
23
  s.extra_rdoc_files = ["Manifest.txt", "Contributors.rdoc", "Hacking.rdoc", "History.rdoc", "License.rdoc", "README.rdoc"]
23
- s.files = [".autotest", ".rspec", "Contributors.rdoc", "Hacking.rdoc", "History.rdoc", "License.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "autotest/discover.rb", "lib/net-ldap.rb", "lib/net/ber.rb", "lib/net/ber/ber_parser.rb", "lib/net/ber/core_ext.rb", "lib/net/ber/core_ext/array.rb", "lib/net/ber/core_ext/bignum.rb", "lib/net/ber/core_ext/false_class.rb", "lib/net/ber/core_ext/fixnum.rb", "lib/net/ber/core_ext/string.rb", "lib/net/ber/core_ext/true_class.rb", "lib/net/ldap.rb", "lib/net/ldap/dataset.rb", "lib/net/ldap/dn.rb", "lib/net/ldap/entry.rb", "lib/net/ldap/filter.rb", "lib/net/ldap/password.rb", "lib/net/ldap/pdu.rb", "lib/net/snmp.rb", "net-ldap.gemspec", "spec/integration/ssl_ber_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/unit/ber/ber_spec.rb", "spec/unit/ber/core_ext/string_spec.rb", "spec/unit/ldap/dn_spec.rb", "spec/unit/ldap/entry_spec.rb", "spec/unit/ldap/filter_spec.rb", "spec/unit/ldap_spec.rb", "test/common.rb", "test/test_entry.rb", "test/test_filter.rb", "test/test_ldap_connection.rb", "test/test_ldif.rb", "test/test_password.rb", "test/test_rename.rb", "test/test_snmp.rb", "test/testdata.ldif", "testserver/ldapserver.rb", "testserver/testdata.ldif", ".gemtest"]
24
- s.homepage = %q{http://net-ldap.rubyforge.org/}
24
+ s.files = [".autotest", ".rspec", "Contributors.rdoc", "Hacking.rdoc", "History.rdoc", "License.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "autotest/discover.rb", "lib/net-ldap.rb", "lib/net/ber.rb", "lib/net/ber/ber_parser.rb", "lib/net/ber/core_ext.rb", "lib/net/ber/core_ext/array.rb", "lib/net/ber/core_ext/bignum.rb", "lib/net/ber/core_ext/false_class.rb", "lib/net/ber/core_ext/fixnum.rb", "lib/net/ber/core_ext/string.rb", "lib/net/ber/core_ext/true_class.rb", "lib/net/ldap.rb", "lib/net/ldap/dataset.rb", "lib/net/ldap/dn.rb", "lib/net/ldap/entry.rb", "lib/net/ldap/filter.rb", "lib/net/ldap/password.rb", "lib/net/ldap/pdu.rb", "lib/net/snmp.rb", "net-ldap.gemspec", "spec/integration/ssl_ber_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/unit/ber/ber_spec.rb", "spec/unit/ber/core_ext/string_spec.rb", "spec/unit/ldap/dn_spec.rb", "spec/unit/ldap/entry_spec.rb", "spec/unit/ldap/filter_spec.rb", "spec/unit/ldap_spec.rb", "test/common.rb", "test/test_entry.rb", "test/test_filter.rb", "test/test_ldap_connection.rb", "test/test_ldif.rb", "test/test_password.rb", "test/test_rename.rb", "test/test_snmp.rb", "test/testdata.ldif", "testserver/ldapserver.rb", "testserver/testdata.ldif"]
25
+ s.homepage = %q{http://github.com.org/ruby-ldap/ruby-net-ldap}
25
26
  s.rdoc_options = ["--main", "README.rdoc"]
26
27
  s.require_paths = ["lib"]
27
28
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
@@ -75,6 +75,21 @@ describe "BER encoding of" do
75
75
  end
76
76
  end
77
77
  end
78
+ if "Ruby 1.9".respond_to?(:encoding)
79
+ context "strings" do
80
+ it "should properly encode UTF-8 strings" do
81
+ "\u00e5".force_encoding("UTF-8").to_ber.should ==
82
+ "\x04\x02\xC3\xA5"
83
+ end
84
+ it "should properly encode strings encodable as UTF-8" do
85
+ "teststring".encode("US-ASCII").to_ber.should == "\x04\nteststring"
86
+ end
87
+ it "should fail on strings that can not be converted to UTF-8" do
88
+ error = Encoding::UndefinedConversionError
89
+ lambda {"\x81".to_ber }.should raise_exception(error)
90
+ end
91
+ end
92
+ end
78
93
  end
79
94
 
80
95
  describe "BER decoding of" do
@@ -91,4 +106,4 @@ describe "BER decoding of" do
91
106
  [1, [3, "Administrator", "ad_is_bogus"]]
92
107
  end
93
108
  end
94
- end
109
+ end
@@ -31,92 +31,92 @@ class TestFilter < Test::Unit::TestCase
31
31
  assert_equal("(uid=*\\5C*)", Filter.contains("uid", "\\").to_s)
32
32
  end
33
33
 
34
- def test_c2
34
+ def test_c2
35
35
  assert_equal("(uid=george *)",
36
36
  Filter.from_rfc2254("uid=george *").to_rfc2254)
37
37
  assert_equal("(uid:=george *)",
38
38
  Filter.from_rfc2254("uid:=george *").to_rfc2254)
39
39
  assert_equal("(uid=george*)",
40
40
  Filter.from_rfc2254(" ( uid = george* ) ").to_rfc2254)
41
- assert_equal("(!(uid=george*))",
41
+ assert_equal("(!(uid=george*))",
42
42
  Filter.from_rfc2254("uid!=george*").to_rfc2254)
43
- assert_equal("(uid<=george*)",
43
+ assert_equal("(uid<=george*)",
44
44
  Filter.from_rfc2254("uid <= george*").to_rfc2254)
45
- assert_equal("(uid>=george*)",
45
+ assert_equal("(uid>=george*)",
46
46
  Filter.from_rfc2254("uid>=george*").to_rfc2254)
47
- assert_equal("(&(uid=george*)(mail=*))",
47
+ assert_equal("(&(uid=george*)(mail=*))",
48
48
  Filter.from_rfc2254("(& (uid=george* ) (mail=*))").to_rfc2254)
49
- assert_equal("(|(uid=george*)(mail=*))",
49
+ assert_equal("(|(uid=george*)(mail=*))",
50
50
  Filter.from_rfc2254("(| (uid=george* ) (mail=*))").to_rfc2254)
51
- assert_equal("(!(mail=*))",
51
+ assert_equal("(!(mail=*))",
52
52
  Filter.from_rfc2254("(! (mail=*))").to_rfc2254)
53
- end
53
+ end
54
54
 
55
- def test_filter_with_single_clause
56
- assert_equal("(cn=name)", Net::LDAP::Filter.construct("(&(cn=name))").to_s)
57
- end
55
+ def test_filter_with_single_clause
56
+ assert_equal("(cn=name)", Net::LDAP::Filter.construct("(&(cn=name))").to_s)
57
+ end
58
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")),
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
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
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
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=*))"),
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
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
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
122
  end
@@ -31,8 +31,20 @@ class TestLdif < Test::Unit::TestCase
31
31
  end
32
32
 
33
33
  def test_ldif_with_continuation_lines
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"))
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?("abcdefghijklmn"))
36
+ end
37
+
38
+ def test_ldif_with_continuation_lines_and_extra_whitespace
39
+ ds1 = Net::LDAP::Dataset::read_ldif(StringIO.new("dn: abcdefg\r\n hijklmn\r\n\r\n"))
40
+ assert_equal(true, ds1.has_key?("abcdefg hijklmn"))
41
+ ds2 = Net::LDAP::Dataset::read_ldif(StringIO.new("dn: abcdefg\r\n hij klmn\r\n\r\n"))
42
+ assert_equal(true, ds2.has_key?("abcdefghij klmn"))
43
+ end
44
+
45
+ def test_ldif_tab_is_not_continuation
46
+ ds = Net::LDAP::Dataset::read_ldif(StringIO.new("dn: key\r\n\tnotcontinued\r\n\r\n"))
47
+ assert_equal(true, ds.has_key?("key"))
36
48
  end
37
49
 
38
50
  # TODO, INADEQUATE. We need some more tests
metadata CHANGED
@@ -1,15 +1,10 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: net-ldap
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Francis Cianfrocca
14
9
  - Emiel van de Laar
15
10
  - Rory O'Connell
@@ -18,143 +13,133 @@ authors:
18
13
  autorequire:
19
14
  bindir: bin
20
15
  cert_chain: []
21
-
22
- date: 2011-03-26 00:00:00 -04:00
23
- default_executable:
24
- dependencies:
25
- - !ruby/object:Gem::Dependency
16
+ date: 2012-02-15 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
26
19
  name: rubyforge
27
- prerelease: false
28
- requirement: &id001 !ruby/object:Gem::Requirement
20
+ requirement: &70157176040280 !ruby/object:Gem::Requirement
29
21
  none: false
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- hash: 7
34
- segments:
35
- - 2
36
- - 0
37
- - 4
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
38
25
  version: 2.0.4
39
26
  type: :development
40
- version_requirements: *id001
41
- - !ruby/object:Gem::Dependency
42
- name: hoe-git
43
27
  prerelease: false
44
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ version_requirements: *70157176040280
29
+ - !ruby/object:Gem::Dependency
30
+ name: hoe-git
31
+ requirement: &70157176059420 !ruby/object:Gem::Requirement
45
32
  none: false
46
- requirements:
33
+ requirements:
47
34
  - - ~>
48
- - !ruby/object:Gem::Version
49
- hash: 1
50
- segments:
51
- - 1
52
- version: "1"
35
+ - !ruby/object:Gem::Version
36
+ version: '1'
53
37
  type: :development
54
- version_requirements: *id002
55
- - !ruby/object:Gem::Dependency
56
- name: hoe-gemspec
57
38
  prerelease: false
58
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ version_requirements: *70157176059420
40
+ - !ruby/object:Gem::Dependency
41
+ name: hoe-gemspec
42
+ requirement: &70157176053340 !ruby/object:Gem::Requirement
59
43
  none: false
60
- requirements:
44
+ requirements:
61
45
  - - ~>
62
- - !ruby/object:Gem::Version
63
- hash: 1
64
- segments:
65
- - 1
66
- version: "1"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
67
48
  type: :development
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: metaid
71
49
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
50
+ version_requirements: *70157176053340
51
+ - !ruby/object:Gem::Dependency
52
+ name: metaid
53
+ requirement: &70157176052240 !ruby/object:Gem::Requirement
73
54
  none: false
74
- requirements:
55
+ requirements:
75
56
  - - ~>
76
- - !ruby/object:Gem::Version
77
- hash: 1
78
- segments:
79
- - 1
80
- version: "1"
57
+ - !ruby/object:Gem::Version
58
+ version: '1'
81
59
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: flexmock
85
60
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
61
+ version_requirements: *70157176052240
62
+ - !ruby/object:Gem::Dependency
63
+ name: flexmock
64
+ requirement: &70157176069980 !ruby/object:Gem::Requirement
87
65
  none: false
88
- requirements:
66
+ requirements:
89
67
  - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 59
92
- segments:
93
- - 0
94
- - 9
95
- - 0
68
+ - !ruby/object:Gem::Version
96
69
  version: 0.9.0
97
70
  type: :development
98
- version_requirements: *id005
99
- - !ruby/object:Gem::Dependency
71
+ prerelease: false
72
+ version_requirements: *70157176069980
73
+ - !ruby/object:Gem::Dependency
100
74
  name: rspec
75
+ requirement: &70157176078680 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
81
+ type: :development
101
82
  prerelease: false
102
- requirement: &id006 !ruby/object:Gem::Requirement
83
+ version_requirements: *70157176078680
84
+ - !ruby/object:Gem::Dependency
85
+ name: rdoc
86
+ requirement: &70157176091860 !ruby/object:Gem::Requirement
103
87
  none: false
104
- requirements:
88
+ requirements:
105
89
  - - ~>
106
- - !ruby/object:Gem::Version
107
- hash: 3
108
- segments:
109
- - 2
110
- - 0
111
- version: "2.0"
90
+ - !ruby/object:Gem::Version
91
+ version: '3.10'
112
92
  type: :development
113
- version_requirements: *id006
114
- - !ruby/object:Gem::Dependency
115
- name: hoe
116
93
  prerelease: false
117
- requirement: &id007 !ruby/object:Gem::Requirement
94
+ version_requirements: *70157176091860
95
+ - !ruby/object:Gem::Dependency
96
+ name: hoe
97
+ requirement: &70157176087000 !ruby/object:Gem::Requirement
118
98
  none: false
119
- requirements:
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- hash: 41
123
- segments:
124
- - 2
125
- - 9
126
- - 1
127
- version: 2.9.1
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: '2.13'
128
103
  type: :development
129
- version_requirements: *id007
130
- description: "Net::LDAP for Ruby (also called net-ldap) implements client access for the\n\
131
- Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for\n\
132
- accessing distributed directory services. Net::LDAP is written completely in\n\
133
- Ruby with no external dependencies. It supports most LDAP client features and a\n\
134
- subset of server features as well.\n\n\
135
- Net::LDAP has been tested against modern popular LDAP servers including\n\
136
- OpenLDAP and Active Directory. The current release is mostly compliant with\n\
137
- earlier versions of the IETF LDAP RFCs (2251\xE2\x80\x932256, 2829\xE2\x80\x932830, 3377, and 3771).\n\
138
- Our roadmap for Net::LDAP 1.0 is to gain full <em>client</em> compliance with\n\
139
- the most recent LDAP RFCs (4510\xE2\x80\x934519, plus portions of 4520\xE2\x80\x934532)."
140
- email:
104
+ prerelease: false
105
+ version_requirements: *70157176087000
106
+ description: ! 'Net::LDAP for Ruby (also called net-ldap) implements client access
107
+ for the
108
+
109
+ Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for
110
+
111
+ accessing distributed directory services. Net::LDAP is written completely in
112
+
113
+ Ruby with no external dependencies. It supports most LDAP client features and a
114
+
115
+ subset of server features as well.
116
+
117
+
118
+ Net::LDAP has been tested against modern popular LDAP servers including
119
+
120
+ OpenLDAP and Active Directory. The current release is mostly compliant with
121
+
122
+ earlier versions of the IETF LDAP RFCs (2251–2256, 2829–2830, 3377, and 3771).
123
+
124
+ Our roadmap for Net::LDAP 1.0 is to gain full <em>client</em> compliance with
125
+
126
+ the most recent LDAP RFCs (4510–4519, plus portions of 4520–4532).'
127
+ email:
141
128
  - blackhedd@rubyforge.org
142
129
  - gemiel@gmail.com
143
130
  - rory.ocon@gmail.com
144
131
  - kaspar.schiess@absurd.li
145
132
  - austin@rubyforge.org
146
133
  executables: []
147
-
148
134
  extensions: []
149
-
150
- extra_rdoc_files:
135
+ extra_rdoc_files:
151
136
  - Manifest.txt
152
137
  - Contributors.rdoc
153
138
  - Hacking.rdoc
154
139
  - History.rdoc
155
140
  - License.rdoc
156
141
  - README.rdoc
157
- files:
142
+ files:
158
143
  - .autotest
159
144
  - .rspec
160
145
  - Contributors.rdoc
@@ -205,44 +190,35 @@ files:
205
190
  - testserver/ldapserver.rb
206
191
  - testserver/testdata.ldif
207
192
  - .gemtest
208
- has_rdoc: true
209
- homepage: http://net-ldap.rubyforge.org/
193
+ homepage: http://rubyldap.com/
210
194
  licenses: []
211
-
212
195
  post_install_message:
213
- rdoc_options:
196
+ rdoc_options:
214
197
  - --main
215
198
  - README.rdoc
216
- require_paths:
199
+ require_paths:
217
200
  - lib
218
- required_ruby_version: !ruby/object:Gem::Requirement
201
+ required_ruby_version: !ruby/object:Gem::Requirement
219
202
  none: false
220
- requirements:
221
- - - ">="
222
- - !ruby/object:Gem::Version
223
- hash: 57
224
- segments:
225
- - 1
226
- - 8
227
- - 7
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
228
206
  version: 1.8.7
229
- required_rubygems_version: !ruby/object:Gem::Requirement
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
230
208
  none: false
231
- requirements:
232
- - - ">="
233
- - !ruby/object:Gem::Version
234
- hash: 3
235
- segments:
236
- - 0
237
- version: "0"
209
+ requirements:
210
+ - - ! '>='
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
238
213
  requirements: []
239
-
240
214
  rubyforge_project: net-ldap
241
- rubygems_version: 1.5.2
215
+ rubygems_version: 1.8.10
242
216
  signing_key:
243
217
  specification_version: 3
244
- summary: Net::LDAP for Ruby (also called net-ldap) implements client access for the Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for accessing distributed directory services
245
- test_files:
218
+ summary: Net::LDAP for Ruby (also called net-ldap) implements client access for the
219
+ Lightweight Directory Access Protocol (LDAP), an IETF standard protocol for accessing
220
+ distributed directory services
221
+ test_files:
246
222
  - test/test_entry.rb
247
223
  - test/test_filter.rb
248
224
  - test/test_ldap_connection.rb