From e6d6a5261a6ee1ac1a3f84902398b74874ab4a59 Mon Sep 17 00:00:00 2001 From: blackhedd Date: Tue, 18 Apr 2006 15:42:10 +0000 Subject: [PATCH] Started a Dataset implementation that will be used to hold search-results and LDIFs. --- lib/net/ldap/dataset.rb | 47 ++++++++++++++++++++++++++++++++- tests/testem.rb | 1 + tests/testldif.rb | 57 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tests/testldif.rb diff --git a/lib/net/ldap/dataset.rb b/lib/net/ldap/dataset.rb index 51b1659..dd5048a 100644 --- a/lib/net/ldap/dataset.rb +++ b/lib/net/ldap/dataset.rb @@ -26,11 +26,56 @@ # +require 'base64' + + module Net class LDAP -class Dataset +class Dataset < Hash + attr_reader :comments + + + def Dataset::read_ldif io + ds = Dataset.new + + line = io.gets && chomp + dn = nil + + while line + io.gets and chomp + if $_ =~ /^[\s]+/ + line << " " << $' + else + nextline = $_ + + if line =~ /^\#/ + ds.comments << line + elsif line =~ /^dn:[\s]*/i + dn = $' + ds[dn] = Hash.new {|k,v| k[v] = []} + elsif line.length == 0 + dn = nil + elsif line =~ /^([^:]+):([\:]?)[\s]*/ + # $1 is the attribute name + # $2 is a colon iff the attr-value is base-64 encoded + # $' is the attr-value + attrvalue = ($2 == ":") ? Base64.decode64($') : $' + ds[dn][$1.downcase.intern] << attrvalue + end + + line = nextline + end + end + + ds + end + + + def initialize + @comments = [] + end end # Dataset diff --git a/tests/testem.rb b/tests/testem.rb index ca38ff7..a78f24a 100644 --- a/tests/testem.rb +++ b/tests/testem.rb @@ -4,6 +4,7 @@ require 'test/unit' require 'tests/testber' +require 'tests/testldif' require 'tests/testldap' diff --git a/tests/testldif.rb b/tests/testldif.rb new file mode 100644 index 0000000..d42c44f --- /dev/null +++ b/tests/testldif.rb @@ -0,0 +1,57 @@ +# $Id$ +# +# + + +$:.unshift "lib" + +require 'net/ldap' +require 'net/ldif' + +require 'sha1' +require 'base64' + +class TestLdif < Test::Unit::TestCase + + TestLdifFilename = "tests/testdata.ldif" + + def test_empty_ldif + ds = Net::LDAP::Dataset::read_ldif( StringIO.new ) + assert_equal( true, ds.empty? ) + end + + def test_ldif_with_comments + str = ["# Hello from LDIF-land", "# This is an unterminated comment"] + io = StringIO.new( str[0] + "\r\n" + str[1] ) + ds = Net::LDAP::Dataset::read_ldif( io ) + assert_equal( str, ds.comments ) + end + + def test_ldif_with_password + psw = "goldbricks" + hashed_psw = "{SHA}" + Base64::encode64( SHA1.new(psw).digest ).chomp + + ldif_encoded = Base64::encode64( hashed_psw ).chomp + ds = Net::LDAP::Dataset::read_ldif( StringIO.new( "dn: Goldbrick\r\nuserPassword:: #{ldif_encoded}\r\n\r\n" )) + recovered_psw = ds["Goldbrick"][:userpassword].shift + assert_equal( hashed_psw, recovered_psw ) + end + + def test_ldif_with_continuation_lines + ds = Net::LDAP::Dataset::read_ldif( StringIO.new( "dn: abcdefg\r\n hijklmn\r\n\r\n" )) + assert_equal( true, ds.has_key?( "abcdefg hijklmn" )) + end + + # TODO, INADEQUATE. We need some more tests + # to verify the content. + def test_ldif + File.open( TestLdifFilename, "r" ) {|f| + ds = Net::LDAP::Dataset::read_ldif( f ) + assert_equal( 13, ds.length ) + } + end + + +end + +