From: Bedo Sandor Date: 2004-01-19T19:17:53+09:00 Subject: Re: libldap-ruby and \000 Hi, the same probleme occures with gq-0.5.0-1 on Debian/woody. If I modify an entry that has got a userCertificate;binary attribute containing an ascii zero character, the binary data losts from the first \0 char to the end of the attribute. Of cource I do not modify the userCertificate attrib, i am changing another (for example the mail) attribute. On Mon, Jan 05, 2004 at 11:15:09AM +0100, Bedo Sandor wrote: > > 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 Attachment: > #!/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. -- bSanyI