Accessing Mac OS X AddressBook via LDAP on your network
Do you use Mac OS X' Address Book and want to share the contact data with other (non-Mac) machines on your network? Do you have an odd MS-Outlook (Express), Thunderbird, etc. that you'd like to feed with contacts? If so, this is for you.
There are all sorts of workarounds for the above (e.g. use Mac OS X Address Book in Thunderbird 2 (on the same machine!)), but since I have an OpenLDAP directory server anyway, I chose to try ABxLDAP.
ABxLDAP is a program which copies contacts from your Mac OS X' Address Book to an LDAP directory server. It consists of a preferences pane and a small App. The preferences pane is where I configure access to the LDAP server as well as the schema I want to use (inetOrgPerson, mozillaAB, Microsoft contact or, preferred, abxldapPerson).

I chose abxldapPerson as a schema, because it works best for me: the mozilla schema supplied in the ABxLDAP package is syntactically broken, inetOrgPerson doesn't map sufficient fields, and the Microsoft schema is proprietary and hard to get at.
Synchronization with the LDAP server running on my Mac started as soon as I enabled ABxLDAP, but I got an error-popup such as this one:

Unfortunately, the text of the error-message isn't precise enough, but a glance at my OpenLDAP logfile showed me what was going on:
conn=29 op=273 ADD dn="cn=Jane Jolie,o=mens.de"
conn=29 op=273 RESULT tag=105 err=21 text=c: value #0 invalid per syntax
Note how it says that the attribute c (country) has an invalid syntax. The reason is that some of my address book entries contain, say "Germany" or "USA" as a country instead of the two-letter "DE" or "US".

After I'd fixed those, the synchronization completed successfully, and I can query my server for any entry:
$ ldapsearch -LLL -x -b o=mens.de sn=jolie
dn: cn=Jane Jolie,o=mens.de
jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/....AA
.....
AaABNhY3NwQVBQTp/s1uiAd64R/9a31NZw2Nq8feP//Z
givenName: Jane
labeledURI: jj.example.org
telephoneNumber: +49 555 6302547
mail: jane.jolie@example.org
c: US
sn: Jolie
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: abxldapPerson
cn: Jane Jolie
description: Actress
displayName: Jane Jolie
ABxLDAP has an Address book browser that is usable, though nothing to rave about:

Whenever I change an entry in my Mac's address book, ABxLDAP starts synchronizing the whole address book, instead of simply modifying the entry I just touched. In order to do so, it attempts to add all entries once again:
op=333 ADD dn="cn=Jane Jolie,o=mens.de"
op=333 RESULT tag=105 err=68 text=
op=334 MOD dn="cn=Jane Jolie,o=mens.de"
op=334 MOD attr=jpegPhoto givenName labeledURI telephoneNumber mail c sn objectClass cn description displayName
op=334 RESULT tag=103 err=0 text=
Notice how an ADD operation for Jane Jolie is attempted, but that returns error 0×44 (decimal 68), which is defined as LDAP_ALREADY_EXISTS. After that, the program modifies the entry and replaces (LDAP MODify) the entry's attributes. I didn't change Jane's entry, but look what happened:
createTimestamp: 20090822192143Z modifyTimestamp: 20090822194504Z
That's a shame, because these unmodified contacts cause the LDAP server on my Mac to replicate the changes off to my network LDAP server. It doesn't hurt me (I don't have thousands and thousands of contacts), but it could have been implemented in a more cleaner way.
ABxLDAP's documentation is ok: it explains briefly how to change field mappings (which works), but unfortunately doesn't tell me how I can map other Address Book fields (spouse, child, etc.) because the field names don't show up anywhere (not on the console either).
<update 2009-08-22>
I asked about additional fields, and sent proof that the program doesn't say they aren't being mapped, as the documentation says it should. I received two incredibly helpful answers from the support desk at addressbook.com:
-
It might be that these fields are not supported by ABxLDAP. Adding those fields would require a code change.
Whaddaya mean by "it might be"? Don't you know?
-
Please not that ABxLDAP is not freeware.
</update 2009-08-22>
The people who bring us ABxLDAP also have a program called addressbookserver with which
you can synchronise your Address Book with others on the same network as well as over the internet. Contacts are synchronised with your own instance of Address Book Server
However, addressbookserver apparently
should be installed on a centrally accessible Mac. The client goes on every Mac, whose Address Book you would like to synchronise
Since I don't have a "centrally accessible Mac", this program is not for me.
Continue reading on ABxLDAP gets better and better.

Using LDAP to share contacts is severely limited as there are not standard schema and every clients has slight differences. ABxLDAP was my attempt to address the problem of not being able to share contacts. It does a reasonable job at writing to LDAP, however does not address the other problems.
That is the reason I have designed Address Book Server. With Address Book Server you can publish the entire Address Book Schema. Since it support bi-directional sync it can both read and write from the central server. Typically this would take the place having a LDAP directory. It is also much easier to setup and configure compared to ABxLDAP which requires some basic unix command skills.
If you 100% certain you want LDAP, ABxLDAP will do the job. However if you just want to share contacts between macs, try Address Book Server. You can export to LDIF from Address Book Server and populate a LDAP directory form there. This can even be scripted (Example included with ABS).
Currently only major problems will be addressed for ABxLDAP any any enhancements have stopped over a year ago. ABS is still being enhanced though.