[Date Prev][Date Next] [Chronological] [Thread] [Top]

libldap-ruby and \000



Hi,
please let's have a look at my little ruby program!  It adds
an entry to an ldap server and the binary fields are ended at
the first \000 char.  Is it the libldap-ruby library's error?
Or maybe the underlaying OpenLDAP library does something?
(Strings in C are terminated exactly this way. Is there
any connection?)  Or am I doing something wrong?

How can I add binary data containing the \0 character?

The programs output is this:

|
|written: "after the \000 character THIS IS ALWAYS LOST  Why!??"
|read:    "after the "
|

The first string is added, the second has read back after the
add method.

-- 
bSanyI
#!/usr/bin/ruby -w
require 'ldap'

$HOST     = 'localhost'
$PORT     = 389
$PROTO    = 3 ## LDAPv3
$SUFFIX   = "dc=mydomain, dc=com"
$USER     = "cn=manager, #{$SUFFIX}"
$CRED     = 'secret'

binaryData = "after the \000 character THIS IS ALWAYS LOST  Why!??"

dn = "cn=test, #{$SUFFIX}"
entry = {
  'objectClass' => [ 'top', 'strongAuthenticationUser', 'person' ],
  'cn' => [ "test" ],
  'sn' => [ "test" ],
  'userCertificate;binary' => [ binaryData ],
}

## bind
ldap = LDAP::Conn.new($HOST, $PORT)
ldap.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, $PROTO)
begin
	ldap.bind($USER, $CRED)
rescue LDAP::ResultError => msg
	$stderr.puts "\t ERROR: BIND: \"#{msg.to_s}\""
	exit 1
end

## add
begin
	entry.delete('dn')
	ldap.add(dn, entry)
rescue LDAP::ResultError => msg
	$stderr.puts "\t ERROR: ADDING [#{dn}]: \"#{msg.to_s}\""
	$stderr.puts "DN: #{dn}"
	entry.each_key { |attr|
		entry[attr].each { |value|
			$stderr.puts "#{attr}: #{value}"
		}
	}
	exit 2
ensure
	ldap.unbind
end

## verify
print "written: "
p binaryData

ldap = LDAP::Conn.new($HOST, $PORT)
ldap.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, $PROTO)
begin
	ldap.bind($USER, $CRED)
	ldap.search(dn, LDAP::LDAP_SCOPE_BASE, '(objectClass=*)') { |e|
		print "read:    "
		p e.vals('userCertificate;binary').first
	}
rescue LDAP::ResultError => msg
	$stderr.puts "\t ERROR: READING [#{dn}]: \"#{msg.to_s}\""
	exit 3
ensure
	ldap.unbind
end

## end.