Permalink
Browse files

! Fixes all tests

Some code has been removed. Version control is not synonymous with code storage - if you're not using it now, you probably don't have working tests and the code will be buggy anyway. Write it when you need it.
  • Loading branch information...
1 parent 75f37c5 commit 1509aa8ef61496b50ac5a3545f2061b9d12cbf17 @kschiess kschiess committed Feb 12, 2010
View
@@ -77,7 +77,7 @@ def initialize args
class BerIdentifiedArray < Array
attr_accessor :ber_identifier
- def initialize
+ def initialize(*args)
super
end
end
@@ -88,16 +88,6 @@ def to_ber
"\005\000"
end
end
-
- class BerIdentifiedOid
- attr_accessor :ber_identifier
- def initialize oid
- if oid.is_a?(String)
- oid = oid.split(/\./).map {|s| s.to_i }
- end
- @value = oid
- end
- end
end
end
View
@@ -33,19 +33,10 @@ def read_ber syntax=nil
# packets coming from streams that don't block when
# we ask for more data (like StringIOs). At it is,
# this can throw TypeErrors and other nasties.
-
- # We might have been included in two kinds of things: IO-like
- # (answering to getbyte) and String-like (answering to to_s). Have
- # stream be a stream that is IO-like in both cases.
- if respond_to? :getbyte
- stream = self
- else
- stream = StringIO.new(self.to_s)
- end
-
- id = stream.getbyte or return nil # don't trash this value, we'll use it later
+
+ id = getbyte or return nil # don't trash this value, we'll use it later
- n = stream.getbyte
+ n = getbyte
lengthlength,contentlength = if n <= 127
[1,n]
else
@@ -56,7 +47,7 @@ def read_ber syntax=nil
[1 + (n & 127), j]
end
- newobj = stream.read contentlength
+ newobj = read contentlength
# This exceptionally clever and clear bit of code is verrrry slow.
objtype = (syntax && syntax[id]) || BuiltinSyntax[id]
@@ -10,8 +10,8 @@ class Array
end
class String
- include Net::LDAP::Extensions::String
include Net::BER::BERParser
+ include Net::LDAP::Extensions::String
end
class Bignum
@@ -40,4 +40,4 @@ class StringIO
class OpenSSL::SSL::SSLSocket
include Net::BER::BERParser
-end
+end
@@ -33,7 +33,7 @@ def to_ber_oid
private
def to_ber_seq_internal code
- s = self.to_s
+ s = self.join
[code].pack('C') + s.length.to_ber_length_encoding + s
end
end
@@ -4,32 +4,19 @@ module Extensions
module Bignum
def to_ber
- #i = [self].pack('w')
- #i.length > 126 and raise Net::BER::BerError.new( "range error in bignum" )
- #[2, i.length].pack("CC") + i
+ # NOTE: Array#pack's 'w' is a BER _compressed_ integer. We need uncompressed
+ # BER integers, so we're not using that.
+ # See also: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/228864
+ result = []
- # Ruby represents Bignums as two's-complement numbers so we may actually be
- # good as far as representing negatives goes.
- # I'm sure this implementation can be improved performance-wise if necessary.
- # Ruby's Bignum#size returns the number of bytes in the internal representation
- # of the number, but it can and will include leading zero bytes on at least
- # some implementations. Evidently Ruby stores these as sets of quadbytes.
- # It's not illegal in BER to encode all of the leading zeroes but let's strip
- # them out anyway.
- #
- sz = self.size
- out = "\000" * sz
- (sz*8).times {|bit|
- if self[bit] == 1
- out[bit/8] += (1 << (bit % 8))
- end
- }
-
- while out.length > 1 and out[-1] == 0
- out.slice!(-1,1)
+ n = self
+ while n>0
+ b = n & 0xff
+ result << b
+ n = n >> 8
end
- [2, out.length].pack("CC") + out.reverse
+ "\002" + ([result.size] + result.reverse).pack('C*')
end
end
@@ -2,14 +2,23 @@ module Net
class LDAP
module Extensions
module Fixnum
+ #
+ # to_ber
+ #
def to_ber
"\002" + to_ber_internal
end
+ #
+ # to_ber_enumerated
+ #
def to_ber_enumerated
"\012" + to_ber_internal
end
+ #
+ # to_ber_length_encoding
+ #
def to_ber_length_encoding
if self <= 127
[self].pack('C')
@@ -29,21 +38,24 @@ def to_ber_application tag
#--
# Called internally to BER-encode the length and content bytes of a Fixnum.
# The caller will prepend the tag byte.
+ MAX_SIZE = 0.size
def to_ber_internal
- # PLEASE optimize this code path. It's awfully ugly and probably slow.
- # It also doesn't understand negative numbers yet.
- raise Net::BER::BerError.new( "range error in fixnum" ) unless self >= 0
- z = [self].pack("N")
- zlen = if self < 0x80
- 1
- elsif self < 0x8000
- 2
- elsif self < 0x800000
- 3
- else
- 4
+ size = MAX_SIZE
+ while size>1
+ break if (self & (0xff << (size-1)*8)) > 0
+ size -= 1
+ end
+
+ result = [size]
+
+ while size>0
+ # right shift size-1 bytes, mask with 0xff
+ result << ((self >> ((size-1)*8)) & 0xff)
+
+ size -= 1
end
- [zlen].pack("C") + z[0-zlen,zlen]
+
+ result.pack('C*')
end
private :to_ber_internal
end
@@ -1,3 +1,5 @@
+require 'stringio'
+
module Net
class LDAP
module Extensions
@@ -29,18 +31,9 @@ def to_ber_contextspecific code
end
def read_ber syntax=nil
- StringIO.new(self).read_ber(syntax)
+ StringIO.new(self).
+ read_ber(syntax)
end
-
- # def read_ber! syntax=nil
- # obj,n_consumed = read_ber_from_string(self, syntax)
- # if n_consumed
- # self.slice!(0...n_consumed)
- # obj
- # else
- # nil
- # end
- # end
end
end
end
View
@@ -1,8 +1,3 @@
-# $Id$
-#
-#
-#----------------------------------------------------------------------------
-#
# Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
#
# Gmail: garbagecat10
@@ -25,6 +20,7 @@
#
#
+require 'strscan'
module Net
class LDAP
View
@@ -43,7 +43,7 @@ def generate( type, str )
when :md5
[Digest::MD5.new, 'MD5']
when :sha
- [Digest::SHA1.new, 'sha']
+ [Digest::SHA1.new, 'SHA']
# when ssha
else
raise Net::LDAP::LdapError.new( "unsupported password-hash type (#{type})" )
@@ -0,0 +1,33 @@
+require 'spec_helper'
+
+require 'socket'
+require 'openssl'
+
+require 'net/ldap'
+
+describe "BER serialisation (SSL)" do
+ # Transmits str to #to and reads it back from #from.
+ #
+ def transmit(str)
+ to.write(str)
+ to.close
+
+ from.read
+ end
+
+ attr_reader :to, :from
+ before(:each) do
+ @from, @to = IO.pipe
+
+ @to = Net::LDAP::SSLSocket.wrap(to)
+ @from = Net::LDAP::SSLSocket.wrap(from)
+ end
+
+ it "should transmit strings" do
+ transmit('foo').should == 'foo'
+ end
+ it "should correctly transmit numbers" do
+ to.write 1234.to_ber
+ from.read_ber.should == 1234
+ end
+end
View
@@ -0,0 +1,2 @@
+--format specdoc
+--colour
View
@@ -0,0 +1 @@
+
View
@@ -0,0 +1,18 @@
+require 'spec_helper'
+
+require 'net/ber'
+require 'net/ldap'
+
+describe "Ber encoding of various types" do
+ def properly_encode_and_decode
+ simple_matcher('properly encode and decode') do |given|
+ given.to_ber.read_ber.should == given
+ end
+ end
+
+ context "array" do
+ it "should properly encode []" do
+ [].should properly_encode_and_decode
+ end
+ end
+end
Oops, something went wrong.

0 comments on commit 1509aa8

Please sign in to comment.