net-ldap 0.6.1 → 0.7.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.

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e841cb17541b78bfa5524c4358aa1dc9c7172b62
4
- data.tar.gz: 6d32f7ba11d6812d194a93f970e7a4057ecc967c
3
+ metadata.gz: 1e84cd86cc0974d9380b18caa917cfa8d8f3e8f2
4
+ data.tar.gz: 6e6783c3b458b1c5b3abd72745a0e56b4e749d35
5
5
  SHA512:
6
- metadata.gz: a85f9b44249fb246942b13f4cd6885da6217009db03a67f607fb5f4c6b5d6592993a07689ad893a2d78317e3628b8f75fdca774ab0f01e12d904b42a4b992d6c
7
- data.tar.gz: 6181f8297c98641b97e03f96a2edca4a8a03bcbde1d47fcbf11b9b9f530b15d19ebf7d50fbe3f4a3c5d834b7bd1173faeaea99150d102bec71218dfa667b4dd9
6
+ metadata.gz: 5c3b405a5086b6f33522fe611cff02ca6e325498db1b54b9d4415222c870eedae5466a3e9c65ba9d16cfc6db89392eafbbcee4537a0b70a79a6651a92695e9d6
7
+ data.tar.gz: 81ce6fa1369f1a5bcbacd35efc939a8f9aa97ada21ef122314c029b9c0b3a32d6dddb8c9b43a3d2cf25d9fffad7d2fe97b992cd92c5597f8b26b72ceeacf1dc1
@@ -16,13 +16,8 @@ the most recent LDAP RFCs (4510–4519, plus portions of 4520–4532).
16
16
 
17
17
  == Where
18
18
 
19
- * {RubyForge}[http://rubyforge.org/projects/net-ldap]
20
19
  * {GitHub}[https://github.com/ruby-ldap/ruby-net-ldap]
21
20
  * {ruby-ldap@googlegroups.com}[http://groups.google.com/group/ruby-ldap]
22
- * {Documentation}[http://net-ldap.rubyforge.org/]
23
-
24
- The Net::LDAP for Ruby documentation, project description, and main downloads
25
- can currently be found on {RubyForge}[http://rubyforge.org/projects/net-ldap].
26
21
 
27
22
  == Synopsis
28
23
 
@@ -33,7 +33,9 @@ module Net::BER::Extensions::String
33
33
  rescue Encoding::UndefinedConversionError
34
34
  self
35
35
  rescue Encoding::ConverterNotFoundError
36
- return self
36
+ self
37
+ rescue Encoding::InvalidByteSequenceError
38
+ self
37
39
  end
38
40
  else
39
41
  self
@@ -1160,14 +1160,24 @@ class Net::LDAP::Connection #:nodoc:
1160
1160
  end
1161
1161
  end
1162
1162
 
1163
+ module FixSSLSocketSyncClose
1164
+ def close
1165
+ super
1166
+ io.close
1167
+ end
1168
+ end
1169
+
1163
1170
  def self.wrap_with_ssl(io)
1164
1171
  raise Net::LDAP::LdapError, "OpenSSL is unavailable" unless Net::LDAP::HasOpenSSL
1165
1172
  ctx = OpenSSL::SSL::SSLContext.new
1166
1173
  conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
1167
1174
  conn.connect
1168
- conn.sync_close = true
1175
+
1176
+ # Doesn't work:
1177
+ # conn.sync_close = true
1169
1178
 
1170
1179
  conn.extend(GetbyteForSSLSocket) unless conn.respond_to?(:getbyte)
1180
+ conn.extend(FixSSLSocketSyncClose)
1171
1181
 
1172
1182
  conn
1173
1183
  end
@@ -1206,7 +1216,7 @@ class Net::LDAP::Connection #:nodoc:
1206
1216
  # go here.
1207
1217
  when :start_tls
1208
1218
  msgid = next_msgid.to_ber
1209
- request = [Net::LDAP::StartTlsOid.to_ber].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
1219
+ request = [Net::LDAP::StartTlsOid.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest)
1210
1220
  request_pkt = [msgid, request].to_ber_sequence
1211
1221
  @conn.write request_pkt
1212
1222
  be = @conn.read_ber(Net::LDAP::AsnSyntax)
@@ -113,6 +113,14 @@ class Net::LDAP::Entry
113
113
  @myhash[name] || []
114
114
  end
115
115
 
116
+ ##
117
+ # Read the first value for the provided attribute. The attribute name
118
+ # is canonicalized prior to reading. Returns nil if the attribute does
119
+ # not exist.
120
+ def first(name)
121
+ self[name].first
122
+ end
123
+
116
124
  ##
117
125
  # Returns the first distinguished name (dn) of the Entry as a \String.
118
126
  def dn
@@ -147,7 +155,7 @@ class Net::LDAP::Entry
147
155
  Net::LDAP::Dataset.from_entry(self).to_ldif_string
148
156
  end
149
157
 
150
- def respond_to?(sym) #:nodoc:
158
+ def respond_to?(sym, include_all = false) #:nodoc:
151
159
  return true if valid_attribute?(self.class.attribute_name(sym))
152
160
  return super
153
161
  end
@@ -65,22 +65,22 @@ class Net::LDAP::Filter
65
65
  new(:eq, attribute, value)
66
66
  end
67
67
 
68
- ##
69
- # Creates a Filter object indicating a binary comparison.
70
- # this prevents the search data from being forced into a UTF-8 string.
71
- #
72
- # This is primarily used for Microsoft Active Directory to compare
73
- # GUID values.
74
- #
75
- # # for guid represented as hex charecters
76
- # guid = "6a31b4a12aa27a41aca9603f27dd5116"
77
- # guid_bin = [guid].pack("H*")
78
- # f = Net::LDAP::Filter.bineq("objectGUID", guid_bin)
79
- #
80
- # This filter does not perform any escaping.
81
- def bineq(attribute, value)
82
- new(:bineq, attribute, value)
83
- end
68
+ ##
69
+ # Creates a Filter object indicating a binary comparison.
70
+ # this prevents the search data from being forced into a UTF-8 string.
71
+ #
72
+ # This is primarily used for Microsoft Active Directory to compare
73
+ # GUID values.
74
+ #
75
+ # # for guid represented as hex charecters
76
+ # guid = "6a31b4a12aa27a41aca9603f27dd5116"
77
+ # guid_bin = [guid].pack("H*")
78
+ # f = Net::LDAP::Filter.bineq("objectGUID", guid_bin)
79
+ #
80
+ # This filter does not perform any escaping.
81
+ def bineq(attribute, value)
82
+ new(:bineq, attribute, value)
83
+ end
84
84
 
85
85
  ##
86
86
  # Creates a Filter object indicating extensible comparison. This Filter
@@ -414,10 +414,8 @@ class Net::LDAP::Filter
414
414
  case @op
415
415
  when :ne
416
416
  "!(#{@left}=#{@right})"
417
- when :eq
417
+ when :eq, :bineq
418
418
  "#{@left}=#{@right}"
419
- when :bineq
420
- "#{@left}=#{@right}"
421
419
  when :ex
422
420
  "#{@left}:=#{@right}"
423
421
  when :ge
@@ -527,9 +525,9 @@ class Net::LDAP::Filter
527
525
  else # equality
528
526
  [@left.to_s.to_ber, unescape(@right).to_ber].to_ber_contextspecific(3)
529
527
  end
530
- when :bineq
531
- # make sure data is not forced to UTF-8
532
- [@left.to_s.to_ber, unescape(@right).to_ber_bin].to_ber_contextspecific(3)
528
+ when :bineq
529
+ # make sure data is not forced to UTF-8
530
+ [@left.to_s.to_ber, unescape(@right).to_ber_bin].to_ber_contextspecific(3)
533
531
  when :ex
534
532
  seq = []
535
533
 
@@ -755,7 +753,7 @@ class Net::LDAP::Filter
755
753
  scanner.scan(/\s*/)
756
754
  if op = scanner.scan(/<=|>=|!=|:=|=/)
757
755
  scanner.scan(/\s*/)
758
- if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\xC3\x80-\xCA\xAF]|[^\x00-\x7F]|\\[a-fA-F\d]{2})+/u)
756
+ if value = scanner.scan(/(?:[-\w*.+:@=,#\$%&!'\s\xC3\x80-\xCA\xAF]|[^\x00-\x7F]|\\[a-fA-F\d]{2})+/u)
759
757
  # 20100313 AZ: Assumes that "(uid=george*)" is the same as
760
758
  # "(uid=george* )". The standard doesn't specify, but I can find
761
759
  # no examples that suggest otherwise.
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class LDAP
3
- VERSION = "0.6.1"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
@@ -1,15 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  require 'net/ldap'
4
+ require 'timeout'
4
5
 
5
6
  describe "BER serialisation (SSL)" do
6
7
  # Transmits str to #to and reads it back from #from.
7
8
  #
8
9
  def transmit(str)
9
- to.write(str)
10
- to.close
11
-
12
- from.read
10
+ Timeout::timeout(1) do
11
+ to.write(str)
12
+ to.close
13
+
14
+ from.read
15
+ end
13
16
  end
14
17
 
15
18
  attr_reader :to, :from
@@ -2,4 +2,9 @@ require 'net/ldap'
2
2
 
3
3
  RSpec.configure do |config|
4
4
  config.mock_with :flexmock
5
+
6
+ def raw_string(s)
7
+ # Conveniently, String#b only needs to be called when it exists
8
+ s.respond_to?(:b) ? s.b : s
9
+ end
5
10
  end
@@ -33,28 +33,28 @@ describe "BER encoding of" do
33
33
  context "numbers" do
34
34
  # Sample based
35
35
  {
36
- 0 => "\x02\x01\x00",
37
- 1 => "\x02\x01\x01",
38
- 127 => "\x02\x01\x7F",
39
- 128 => "\x02\x01\x80",
40
- 255 => "\x02\x01\xFF",
41
- 256 => "\x02\x02\x01\x00",
42
- 65535 => "\x02\x02\xFF\xFF",
43
- 65536 => "\x02\x03\x01\x00\x00",
44
- 16_777_215 => "\x02\x03\xFF\xFF\xFF",
45
- 0x01000000 => "\x02\x04\x01\x00\x00\x00",
46
- 0x3FFFFFFF => "\x02\x04\x3F\xFF\xFF\xFF",
47
- 0x4FFFFFFF => "\x02\x04\x4F\xFF\xFF\xFF",
48
-
36
+ 0 => raw_string("\x02\x01\x00"),
37
+ 1 => raw_string("\x02\x01\x01"),
38
+ 127 => raw_string("\x02\x01\x7F"),
39
+ 128 => raw_string("\x02\x01\x80"),
40
+ 255 => raw_string("\x02\x01\xFF"),
41
+ 256 => raw_string("\x02\x02\x01\x00"),
42
+ 65535 => raw_string("\x02\x02\xFF\xFF"),
43
+ 65536 => raw_string("\x02\x03\x01\x00\x00"),
44
+ 16_777_215 => raw_string("\x02\x03\xFF\xFF\xFF"),
45
+ 0x01000000 => raw_string("\x02\x04\x01\x00\x00\x00"),
46
+ 0x3FFFFFFF => raw_string("\x02\x04\x3F\xFF\xFF\xFF"),
47
+ 0x4FFFFFFF => raw_string("\x02\x04\x4F\xFF\xFF\xFF"),
48
+
49
49
  # Some odd samples...
50
- 5 => "\002\001\005",
51
- 500 => "\002\002\001\364",
52
- 50_000 => "\x02\x02\xC3P",
53
- 5_000_000_000 => "\002\005\001*\005\362\000"
54
- }.each do |number, expected_encoding|
50
+ 5 => raw_string("\002\001\005"),
51
+ 500 => raw_string("\002\002\001\364"),
52
+ 50_000 => raw_string("\x02\x02\xC3P"),
53
+ 5_000_000_000 => raw_string("\002\005\001*\005\362\000")
54
+ }.each do |number, expected_encoding|
55
55
  it "should encode #{number} as #{expected_encoding.inspect}" do
56
56
  number.to_ber.should == expected_encoding
57
- end
57
+ end
58
58
  end
59
59
 
60
60
  # Round-trip encoding: This is mostly to be sure to cover Bignums well.
@@ -79,7 +79,7 @@ describe "BER encoding of" do
79
79
  context "strings" do
80
80
  it "should properly encode UTF-8 strings" do
81
81
  "\u00e5".force_encoding("UTF-8").to_ber.should ==
82
- "\x04\x02\xC3\xA5"
82
+ raw_string("\x04\x02\xC3\xA5")
83
83
  end
84
84
  it "should properly encode strings encodable as UTF-8" do
85
85
  "teststring".encode("US-ASCII").to_ber.should == "\x04\nteststring"
@@ -87,7 +87,7 @@ describe "BER encoding of" do
87
87
  it "should properly encode binary data strings using to_ber_bin" do
88
88
  # This is used for searching for GUIDs in Active Directory
89
89
  ["6a31b4a12aa27a41aca9603f27dd5116"].pack("H*").to_ber_bin.should ==
90
- "\x04\x10" + "j1\xB4\xA1*\xA2zA\xAC\xA9`?'\xDDQ\x16"
90
+ raw_string("\x04\x10" + "j1\xB4\xA1*\xA2zA\xAC\xA9`?'\xDDQ\x16")
91
91
  end
92
92
  it "should not fail on strings that can not be converted to UTF-8" do
93
93
  error = Encoding::UndefinedConversionError
@@ -6,7 +6,7 @@ describe String, "when extended with BER core extensions" do
6
6
  context "when passed an ldap bind request and some extra data" do
7
7
  attr_reader :str, :result
8
8
  before(:each) do
9
- @str = "0$\002\001\001`\037\002\001\003\004\rAdministrator\200\vad_is_bogus UNCONSUMED"
9
+ @str = raw_string("0$\002\001\001`\037\002\001\003\004\rAdministrator\200\vad_is_bogus UNCONSUMED")
10
10
  @result = str.read_ber!(Net::LDAP::AsnSyntax)
11
11
  end
12
12
 
@@ -22,7 +22,7 @@ describe String, "when extended with BER core extensions" do
22
22
  before(:each) do
23
23
  stub_exception_class = Class.new(StandardError)
24
24
 
25
- @initial_value = "0$\002\001\001`\037\002\001\003\004\rAdministrator\200\vad_is_bogus"
25
+ @initial_value = raw_string("0$\002\001\001`\037\002\001\003\004\rAdministrator\200\vad_is_bogus")
26
26
  @str = initial_value.dup
27
27
 
28
28
  # Defines a string
@@ -16,5 +16,11 @@ describe Net::LDAP::Filter::FilterParser do
16
16
  expect(Net::LDAP::Filter::FilterParser.parse(filter_string)).to be_a Net::LDAP::Filter
17
17
  end
18
18
  end
19
+ context "Given string including colons ':'" do
20
+ let(:filter_string) { "(ismemberof=cn=edu:berkeley:app:calmessages:deans,ou=campus groups,dc=berkeley,dc=edu)" }
21
+ specify "should generate filter object" do
22
+ expect(Net::LDAP::Filter::FilterParser.parse(filter_string)).to be_a Net::LDAP::Filter
23
+ end
24
+ end
19
25
  end
20
26
  end
@@ -83,12 +83,12 @@ describe Net::LDAP::Filter do
83
83
  end
84
84
 
85
85
  context 'with a well-known BER string' do
86
- ber = "\xa4\x2d" \
86
+ ber = raw_string("\xa4\x2d" \
87
87
  "\x04\x0b" "objectclass" \
88
88
  "\x30\x1e" \
89
89
  "\x80\x08" "foo" "*\\" "bar" \
90
90
  "\x81\x08" "foo" "*\\" "bar" \
91
- "\x82\x08" "foo" "*\\" "bar"
91
+ "\x82\x08" "foo" "*\\" "bar")
92
92
 
93
93
  describe "<- .to_ber" do
94
94
  [
@@ -4,10 +4,15 @@ require 'common'
4
4
  require 'net/snmp'
5
5
 
6
6
  class TestSnmp < Test::Unit::TestCase
7
- SnmpGetRequest = "0'\002\001\000\004\006public\240\032\002\002?*\002\001\000\002\001\0000\0160\f\006\b+\006\001\002\001\001\001\000\005\000"
8
- SnmpGetResponse = "0+\002\001\000\004\006public\242\036\002\002'\017\002\001\000\002\001\0000\0220\020\006\b+\006\001\002\001\001\001\000\004\004test"
7
+ def self.raw_string(s)
8
+ # Conveniently, String#b only needs to be called when it exists
9
+ s.respond_to?(:b) ? s.b : s
10
+ end
11
+
12
+ SnmpGetRequest = raw_string("0'\002\001\000\004\006public\240\032\002\002?*\002\001\000\002\001\0000\0160\f\006\b+\006\001\002\001\001\001\000\005\000")
13
+ SnmpGetResponse = raw_string("0+\002\001\000\004\006public\242\036\002\002'\017\002\001\000\002\001\0000\0220\020\006\b+\006\001\002\001\001\001\000\004\004test")
9
14
 
10
- SnmpGetRequestXXX = "0'\002\001\000\004\006xxxxxx\240\032\002\002?*\002\001\000\002\001\0000\0160\f\006\b+\006\001\002\001\001\001\000\005\000"
15
+ SnmpGetRequestXXX = raw_string("0'\002\001\000\004\006xxxxxx\240\032\002\002?*\002\001\000\002\001\0000\0160\f\006\b+\006\001\002\001\001\001\000\005\000")
11
16
 
12
17
  def test_invalid_packet
13
18
  data = "xxxx"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francis Cianfrocca
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2014-04-14 00:00:00.000000000 Z
16
+ date: 2014-08-04 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: rdoc