ABxLDAP gets better and better

September 11th, 2009 | Categories: LDAP, MacOSX | Tags: , ,

When I wrote about Accessing Mac OS X AddressBook via LDAP on your network, Alex Hartner of addressbookserver.com took my gripes about the missing additional fields I wanted copied to my LDAP directory seriously, and he has updated Address Book X LDAP (ABxLDAP) accordingly.

Some of the fields I was interested in where the spouse and child values of Mac OS X' AddressBook.

I can now map these fields in ABxLDAP and have them copied over to my LDAP server (I use OpenLDAP, of course.)

What I did was to think up some names of attribute types, which I then added to the ABxLDAP LDAP schema file. The file is supplied by ABxLDAP, and it is appropriately named abxldap.schema. The attributes I added are:

attributeType ( 1.3.6.1.4.1.23214.1.18
  NAME 'abBirthday'
  DESC 'Birthday'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

attributeType ( 1.3.6.1.4.1.23214.1.19
  NAME 'relatedSpouse'
  DESC 'Spouse'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

attributeType ( 1.3.6.1.4.1.23214.1.20
  NAME 'relatedChild'
  DESC 'Spouse'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

(Note: In the example above, you see the OID Arc number 23214 which is provided by and belongs to ABxLDAP. Don't hijack somebody else's OIDs — they may be in use. I'm using that here just as an example — I actually use my own OID arc.)

I then added these additional attributes to the object class definition for the abxldapPerson a little bit further down in the same file:

objectclass (
  1.3.6.1.4.1.23214.2.1
  NAME 'abxldapPerson'
  DESC 'AddressBook4LDAP Person'
  SUP inetOrgPerson
  STRUCTURAL
  MAY ( middleName $ nickName $ homeMail $ workimaim $ homeimaim $
        workStreet $ workCity $ workState $ workPostalCode $ workCountry $
        homeStreet $ homeCity $ homeState $ homePostalCode $ homeCountry $
        c $ otherMail $ personalTitle $ abCardType $ labeledURI $ abBirthday $
        relatedSpouse $ relatedChild )
  )

Next I located the file where ABxLDAP maps Address Book values to LDAP attribute types (this is well described in ABxLDAP's documentation). I modified the file /Library/Application Support/ABxLDAP/com.j2anywhere.ABxLDAP.LDAPMAP.plist with a text editor and added the following lines to the end of the file (just before the closing </dict> tag). Here is the XML snippet I added:

 <!-- begin JPM -->
 <key>displayAs</key>
 <string>abCardType</string>
 <key>Url:home page</key>
 <string>labeledURI</string>
 <key>Url:work</key>
 <string>labeledURI</string>
 <key>birthday</key>
 <string>abBirthday</string>
 <key>relatedName:spouse</key>
 <string>relatedSpouse</string>
 <key>relatedName:child</key>
 <string>relatedChild</string>
</dict>

After disabling ABxLDAP in preferences and re-enabling it, the synchronization starts up, and a few seconds later I see the values in my LDAP directory. If I do an ldapsearch for Jane, I see:

dn: cn=Jane Jolie,o=mens.de
labeledURI: jj.example.org
abCardType: person
description: Actress
telephoneNumber: +49 555 6302547
mail: jane.jolie@example.org
relatedChild: Maczia
c: US
givenName: Jane
abBirthday: 1969-07-10 12:00:00 +0000
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: abxldapPerson
sn: Jolie
displayName: Jane Jolie
cn: Jane Jolie

Very nice indeed; just what I wanted. ABxLDAP is getting better and better.

Alex has pointed out once again, that he considers their Address Book and Calendar Server to be a far better product, and it probably is, due to the synchronization features it carries. Unfortunately, I haven't as yet had time to experiment with it, but I will as soon as possible.