From 286ace6f05856eb0b94fe4be492f36649dccdfab Mon Sep 17 00:00:00 2001 From: Mattias Ohlsson Date: Tue, 1 Jul 2014 09:58:55 +0200 Subject: [PATCH 1/2] handle base64 encoded dn attr --- lib/net/ldap/dataset.rb | 6 ++++-- test/test_ldif.rb | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/net/ldap/dataset.rb b/lib/net/ldap/dataset.rb index 9f3c46fe..79431e8d 100644 --- a/lib/net/ldap/dataset.rb +++ b/lib/net/ldap/dataset.rb @@ -136,8 +136,10 @@ def read_ldif(io) elsif line =~ /^version:[\s]*([0-9]+)$/i ds.version = $1 yield :version, line if block_given? - elsif line =~ /^dn:[\s]*/i - dn = $' + elsif line =~ /^dn:([\:]?)[\s]*/i + # $1 is a colon if the dn-value is base-64 encoded + # $' is the dn-value + dn = ($1 == ":") ? $'.unpack('m').shift : $' ds[dn] = Hash.new { |k,v| k[v] = [] } yield :dn, dn if block_given? elsif line.empty? diff --git a/test/test_ldif.rb b/test/test_ldif.rb index 70436826..eb9dfd32 100644 --- a/test/test_ldif.rb +++ b/test/test_ldif.rb @@ -53,6 +53,18 @@ def test_ldif_tab_is_not_continuation assert_equal(true, ds.has_key?("key")) end + def test_ldif_with_base64_dn + str = "dn:: Q049QmFzZTY0IGRuIHRlc3QsT1U9VGVzdCxPVT1Vbml0cyxEQz1leGFtcGxlLERDPWNvbQ==\r\n\r\n" + ds = Net::LDAP::Dataset::read_ldif(StringIO.new(str)) + assert_equal(true, ds.has_key?("CN=Base64 dn test,OU=Test,OU=Units,DC=example,DC=com")) + end + + def test_ldif_with_base64_dn_and_continuation_lines + str = "dn:: Q049QmFzZTY0IGRuIHRlc3Qgd2l0aCBjb250aW51YXRpb24gbGluZSxPVT1UZXN0LE9VPVVua\r\n XRzLERDPWV4YW1wbGUsREM9Y29t\r\n\r\n" + ds = Net::LDAP::Dataset::read_ldif(StringIO.new(str)) + assert_equal(true, ds.has_key?("CN=Base64 dn test with continuation line,OU=Test,OU=Units,DC=example,DC=com")) + end + # TODO, INADEQUATE. We need some more tests # to verify the content. def test_ldif From 223797095c519d18248526af2a184d223c79d8b7 Mon Sep 17 00:00:00 2001 From: Mattias Ohlsson Date: Sun, 12 Oct 2014 13:52:29 +0200 Subject: [PATCH 2/2] Explain why we are using unpack --- lib/net/ldap/dataset.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/net/ldap/dataset.rb b/lib/net/ldap/dataset.rb index 79431e8d..54fc1a07 100644 --- a/lib/net/ldap/dataset.rb +++ b/lib/net/ldap/dataset.rb @@ -139,6 +139,7 @@ def read_ldif(io) elsif line =~ /^dn:([\:]?)[\s]*/i # $1 is a colon if the dn-value is base-64 encoded # $' is the dn-value + # Avoid the Base64 class because not all Ruby versions have it. dn = ($1 == ":") ? $'.unpack('m').shift : $' ds[dn] = Hash.new { |k,v| k[v] = [] } yield :dn, dn if block_given?