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.

Flattr this
LDAP, MacOSX, and address :: 11 Sep 2009 :: e-mail

Comments

blog comments powered by Disqus