directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Zoerner <>
Subject Storing binary data in 0.9.1 fails (or data given back from the directory is changed)
Date Thu, 04 Aug 2005 22:39:59 GMT
Hi all!

I have a problem with binary data within directory entries. If I import an 
inetOrgPerson with jpegPhoto into the Apache DS (LDIF format, binary data 
is Base64), the image data is damaged in the entry (at least when it is 
read out). I tried different tools (import with LDAP Administrator from 
Softerra, native ldapadd from Solaris 9, ...) the result was always the 
same. Wenn I import the same file in another Directory Server (e.g. 
OpenLDAP), it works fine. 

I decided to check it with a little TestCase that uses JNDI to write some 
random binary data to the directory, read it back and check whether 
everything is ok.
My test looked like this:

package simple;

import java.util.Random;

import javax.naming.NamingException;

import junit.framework.TestCase;

public class BinaryTest extends TestCase {

    public static String TORI_DN = "cn=Tori Amos";

    DirContext ctx;

    protected void setUp() throws Exception {
        ctx = new InitialDirContext();

    public void testToriWithFunData() throws NamingException {

        // Create attributes for test entry
        Attribute ocls = new BasicAttribute("objectclass");
        Attributes attrs = new BasicAttributes();
        attrs.put("sn", "Amos");
        attrs.put("cn", "Tori Amos");
        // Random data for jpegPhoto, 64k
        byte[] sourceData = new byte[64 * 1024];
        Random r = new Random(0);
        for (int i = 0; i < sourceData.length; i++) {
            sourceData[i] = (byte) r.nextInt();
        attrs.put("jpegPhoto", sourceData);
        // Create entry
        ctx.bind(TORI_DN, null, attrs);

        // Read same entry and compare data bytewise
        Attributes readAttrs = ctx.getAttributes(TORI_DN);
        Attribute image = readAttrs.get("jpegPhoto");
        byte[] imageBytes = (byte[]) image.get(); 
        for (int i = 0; i < imageBytes.length; i++) {
            assertEquals("Byte number " + i, sourceData[i], 

    protected void tearDown() throws Exception {
        // Try to delete Entry


My looked like this:


# Apache@magritte

I'm not sure whether this is comparable to my original LDIF-Problem. But 
at least the test fails with Apache DS 0.9.1:

junit.framework.AssertionFailedError: Byte number 47 expected:<-112> but 
        at junit.framework.Assert.failNotEquals(
        at junit.framework.Assert.assertEquals(
        at junit.framework.Assert.assertEquals(
        at simple.BinaryTest.testToriWithFunData( 

The same test works with Sun Java System Directory Server 5.2, for example 
(I checked other LDAP servers as well). It also works if I only write 
zeros in the array ...
I do not know whether it is stored wrong in the directory, Or if the read 
operation fails. This would be an interesting thing to check out, I guess 

Any suggestions? Configuration error? I used the default server.xml from 
svn and ApacheDS 0.9.1 on a Windows XP workstation (JDK 1.5.0_3), Client 
was Softerra@WindowsXP and ldapadd@Solaris9/SPARC. 

Should I open a bug at JIRA? I volunteer for further investigation on this 
(I'm quit interested in images within my entries ;-). But I need some 
clues where to look (until now I only touched the surface of your 
directory server).

Greetings from Hamburg,
View raw message