net-ldap 0.10.0 → 0.10.1

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: 570b21d340b31538c59bb0082891227b4b048398
4
- data.tar.gz: 3101e8927d74913355235198f91b2907b308b712
3
+ metadata.gz: fe93b5d4adc9f8aad092d00b1e3b6f9049ebf40d
4
+ data.tar.gz: 3483c7b26e26a6f87385e60f2c58b32fa508df89
5
5
  SHA512:
6
- metadata.gz: c9f13490870b0aba267a7de18150eaf40aabf0fb1ace4f0476456b78305873ceb6417448685f3727e737759ae8c4e3db05743cf3b38ba5a64ddf4f6559b11302
7
- data.tar.gz: ba4770abb3b87844dc138d21f94cc4c783d0addae63f525b119d99656b9b1ac32d36a6dc28ea017b74504828737b90b757d878337db1ada66edf9ccfe3d3d451
6
+ metadata.gz: 4790e354827d3886500a788a154247c8b8ef582273e74d876d88d1a52edcfe5fb44c8f5efcbc54a7f246bca20413ace95491508f69d379c89b57b52c12b2f3f7
7
+ data.tar.gz: cab9f575616ca54675015d42ac15f4add481a24fd4ae5c30867980ddf306363dbb28262b134e04cbb975557a6821f777c2a62ee0aa4d1c0173991f8f62a28bea
@@ -1,3 +1,7 @@
1
+ === Net::LDAP 0.10.1
2
+ * Bug fixes:
3
+ * Fix Integer BER encoding of signed values
4
+
1
5
  === Net::LDAP 0.10.0
2
6
  * Major enhancements:
3
7
  * Accept SimpleTLS/StartTLS encryption options (compatible with `OpenSSL::SSL::SSLContext#set_params`)
@@ -41,9 +41,18 @@ module Net::BER::BERParser
41
41
  s.ber_identifier = id
42
42
  s
43
43
  elsif object_type == :integer
44
- j = 0
45
- data.each_byte { |b| j = (j << 8) + b }
46
- j
44
+ neg = !(data.unpack("C").first & 0x80).zero?
45
+ int = 0
46
+
47
+ data.each_byte do |b|
48
+ int = (int << 8) + (neg ? 255 - b : b)
49
+ end
50
+
51
+ if neg
52
+ (int + 1) * -1
53
+ else
54
+ int
55
+ end
47
56
  elsif object_type == :oid
48
57
  # See X.690 pgh 8.19 for an explanation of this algorithm.
49
58
  # This is potentially not good enough. We may need a
@@ -33,17 +33,10 @@ class Array
33
33
  end
34
34
  # :startdoc:
35
35
 
36
- require 'net/ber/core_ext/bignum'
36
+ require 'net/ber/core_ext/integer'
37
37
  # :stopdoc:
38
- class Bignum
39
- include Net::BER::Extensions::Bignum
40
- end
41
- # :startdoc:
42
-
43
- require 'net/ber/core_ext/fixnum'
44
- # :stopdoc:
45
- class Fixnum
46
- include Net::BER::Extensions::Fixnum
38
+ class Integer
39
+ include Net::BER::Extensions::Integer
47
40
  end
48
41
  # :startdoc:
49
42
 
@@ -0,0 +1,74 @@
1
+ # -*- ruby encoding: utf-8 -*-
2
+ ##
3
+ # BER extensions to the Integer class, affecting Fixnum and Bignum objects.
4
+ module Net::BER::Extensions::Integer
5
+ ##
6
+ # Converts the Integer to BER format.
7
+ def to_ber
8
+ "\002#{to_ber_internal}"
9
+ end
10
+
11
+ ##
12
+ # Converts the Integer to BER enumerated format.
13
+ def to_ber_enumerated
14
+ "\012#{to_ber_internal}"
15
+ end
16
+
17
+ ##
18
+ # Converts the Integer to BER length encoding format.
19
+ def to_ber_length_encoding
20
+ if self <= 127
21
+ [self].pack('C')
22
+ else
23
+ i = [self].pack('N').sub(/^[\0]+/,"")
24
+ [0x80 + i.length].pack('C') + i
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Generate a BER-encoding for an application-defined INTEGER. Examples of
30
+ # such integers are SNMP's Counter, Gauge, and TimeTick types.
31
+ def to_ber_application(tag)
32
+ [0x40 + tag].pack("C") + to_ber_internal
33
+ end
34
+
35
+ ##
36
+ # Used to BER-encode the length and content bytes of an Integer. Callers
37
+ # must prepend the tag byte for the contained value.
38
+ def to_ber_internal
39
+ # Compute the byte length, accounting for negative values requiring two's
40
+ # complement.
41
+ size = 1
42
+ size += 1 until (((self < 0) ? ~self : self) >> (size * 8)).zero?
43
+
44
+ # Padding for positive, negative values. See section 8.5 of ITU-T X.690:
45
+ # http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
46
+
47
+ # For positive integers, if most significant bit in an octet is set to one,
48
+ # pad the result (otherwise it's decoded as a negative value).
49
+ if self > 0 && (self & (0x80 << (size - 1) * 8)) > 0
50
+ size += 1
51
+ end
52
+
53
+ # And for negative integers, pad if the most significant bit in the octet
54
+ # is not set to one (othwerise, it's decoded as positive value).
55
+ if self < 0 && (self & (0x80 << (size - 1) * 8)) == 0
56
+ size += 1
57
+ end
58
+
59
+ # Store the size of the Integer in the result
60
+ result = [size]
61
+
62
+ # Appends bytes to result, starting with higher orders first. Extraction
63
+ # of bytes is done by right shifting the original Integer by an amount
64
+ # and then masking that with 0xff.
65
+ while size > 0
66
+ # right shift size - 1 bytes, mask with 0xff
67
+ result << ((self >> ((size - 1) * 8)) & 0xff)
68
+ size -= 1
69
+ end
70
+
71
+ result.pack('C*')
72
+ end
73
+ private :to_ber_internal
74
+ end
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class LDAP
3
- VERSION = "0.10.0"
3
+ VERSION = "0.10.1"
4
4
  end
5
5
  end
@@ -26,25 +26,44 @@ class TestBEREncoding < Test::Unit::TestCase
26
26
  0 => "\x02\x01\x00",
27
27
  1 => "\x02\x01\x01",
28
28
  127 => "\x02\x01\x7F",
29
- 128 => "\x02\x01\x80",
30
- 255 => "\x02\x01\xFF",
29
+ 128 => "\x02\x02\x00\x80",
30
+ 255 => "\x02\x02\x00\xFF",
31
31
  256 => "\x02\x02\x01\x00",
32
- 65535 => "\x02\x02\xFF\xFF",
32
+ 65535 => "\x02\x03\x00\xFF\xFF",
33
33
  65536 => "\x02\x03\x01\x00\x00",
34
- 16_777_215 => "\x02\x03\xFF\xFF\xFF",
34
+ 8388607 => "\x02\x03\x7F\xFF\xFF",
35
+ 8388608 => "\x02\x04\x00\x80\x00\x00",
36
+ 16_777_215 => "\x02\x04\x00\xFF\xFF\xFF",
35
37
  0x01000000 => "\x02\x04\x01\x00\x00\x00",
36
38
  0x3FFFFFFF => "\x02\x04\x3F\xFF\xFF\xFF",
37
39
  0x4FFFFFFF => "\x02\x04\x4F\xFF\xFF\xFF",
38
40
 
39
41
  # Some odd samples...
40
- 5 => "\002\001\005",
41
- 500 => "\002\002\001\364",
42
- 50_000 => "\x02\x02\xC3P",
43
- 5_000_000_000 => "\002\005\001*\005\362\000"
42
+ 5 => "\x02\x01\x05",
43
+ 500 => "\x02\x02\x01\xf4",
44
+ 50_000 => "\x02\x03\x00\xC3\x50",
45
+ 5_000_000_000 => "\x02\x05\x01\x2a\x05\xF2\x00",
46
+
47
+ # negatives
48
+ -1 => "\x02\x01\xFF",
49
+ -127 => "\x02\x01\x81",
50
+ -128 => "\x02\x01\x80",
51
+ -255 => "\x02\x02\xFF\x01",
52
+ -256 => "\x02\x02\xFF\x00",
53
+ -65535 => "\x02\x03\xFF\x00\x01",
54
+ -65536 => "\x02\x03\xFF\x00\x00",
55
+ -65537 => "\x02\x03\xFE\xFF\xFF",
56
+ -8388607 => "\x02\x03\x80\x00\x01",
57
+ -8388608 => "\x02\x03\x80\x00\x00",
58
+ -16_777_215 => "\x02\x04\xFF\x00\x00\x01",
44
59
  }.each do |number, expected_encoding|
45
60
  define_method "test_encode_#{number}" do
46
61
  assert_equal expected_encoding.b, number.to_ber
47
62
  end
63
+
64
+ define_method "test_decode_encoded_#{number}" do
65
+ assert_equal number, expected_encoding.b.read_ber
66
+ end
48
67
  end
49
68
 
50
69
  # Round-trip encoding: This is mostly to be sure to cover Bignums well.
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.10.0
4
+ version: 0.10.1
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-12-10 00:00:00.000000000 Z
16
+ date: 2014-12-16 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: flexmock
@@ -85,9 +85,8 @@ files:
85
85
  - lib/net/ber/ber_parser.rb
86
86
  - lib/net/ber/core_ext.rb
87
87
  - lib/net/ber/core_ext/array.rb
88
- - lib/net/ber/core_ext/bignum.rb
89
88
  - lib/net/ber/core_ext/false_class.rb
90
- - lib/net/ber/core_ext/fixnum.rb
89
+ - lib/net/ber/core_ext/integer.rb
91
90
  - lib/net/ber/core_ext/string.rb
92
91
  - lib/net/ber/core_ext/true_class.rb
93
92
  - lib/net/ldap.rb
@@ -1,22 +0,0 @@
1
- # -*- ruby encoding: utf-8 -*-
2
- ##
3
- # BER extensions to the Bignum class.
4
- module Net::BER::Extensions::Bignum
5
- ##
6
- # Converts a Bignum to an uncompressed BER integer.
7
- def to_ber
8
- result = []
9
-
10
- # NOTE: Array#pack's 'w' is a BER _compressed_ integer. We need
11
- # uncompressed BER integers, so we're not using that. See also:
12
- # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/228864
13
- n = self
14
- while n > 0
15
- b = n & 0xff
16
- result << b
17
- n = n >> 8
18
- end
19
-
20
- "\002" + ([result.size] + result.reverse).pack('C*')
21
- end
22
- end
@@ -1,66 +0,0 @@
1
- # -*- ruby encoding: utf-8 -*-
2
- ##
3
- # Ber extensions to the Fixnum class.
4
- module Net::BER::Extensions::Fixnum
5
- ##
6
- # Converts the fixnum to BER format.
7
- def to_ber
8
- "\002#{to_ber_internal}"
9
- end
10
-
11
- ##
12
- # Converts the fixnum to BER enumerated format.
13
- def to_ber_enumerated
14
- "\012#{to_ber_internal}"
15
- end
16
-
17
- ##
18
- # Converts the fixnum to BER length encodining format.
19
- def to_ber_length_encoding
20
- if self <= 127
21
- [self].pack('C')
22
- else
23
- i = [self].pack('N').sub(/^[\0]+/,"")
24
- [0x80 + i.length].pack('C') + i
25
- end
26
- end
27
-
28
- ##
29
- # Generate a BER-encoding for an application-defined INTEGER. Examples of
30
- # such integers are SNMP's Counter, Gauge, and TimeTick types.
31
- def to_ber_application(tag)
32
- [0x40 + tag].pack("C") + to_ber_internal
33
- end
34
-
35
- ##
36
- # Used to BER-encode the length and content bytes of a Fixnum. Callers
37
- # must prepend the tag byte for the contained value.
38
- def to_ber_internal
39
- # CAUTION: Bit twiddling ahead. You might want to shield your eyes or
40
- # something.
41
-
42
- # Looks for the first byte in the fixnum that is not all zeroes. It does
43
- # this by masking one byte after another, checking the result for bits
44
- # that are left on.
45
- size = Net::BER::MAX_FIXNUM_SIZE
46
- while size > 1
47
- break if (self & (0xff << (size - 1) * 8)) > 0
48
- size -= 1
49
- end
50
-
51
- # Store the size of the fixnum in the result
52
- result = [size]
53
-
54
- # Appends bytes to result, starting with higher orders first. Extraction
55
- # of bytes is done by right shifting the original fixnum by an amount
56
- # and then masking that with 0xff.
57
- while size > 0
58
- # right shift size - 1 bytes, mask with 0xff
59
- result << ((self >> ((size - 1) * 8)) & 0xff)
60
- size -= 1
61
- end
62
-
63
- result.pack('C*')
64
- end
65
- private :to_ber_internal
66
- end