The only accepted schema for now is the
inetOrgPerson and only that is visible in stock LDAP clients like e.g. the mozilla addressbook. inetOrgPerson is basicly the data of a Person including
one address, phone, fax, mobile, private phone, email, url and a companyname.
I propose to use in LDAP:
- a schema based on the inetOrgPerson (that means all that fields plus some own)
- two inetOrgPerson record/node for each person in an organisation:
- with its private data linked to the other one by its cn (common name), uid (user-id) or an other id outside the inetOrgPerson schema.
- with its org-data linked to it's organisation by the organisations name. That record dublicates/mirrors the company address, and the persons names (readonly from stock LDAP clients). It's only genuine data is phone, fax, mobile, email, url.
- the cn of the privat address should include a '(privat)', so u see the difference between the two in a stock LDAP client
- we use an other inetOrgPerson (or other schema) record/node for the organisation itself, includeing its address, central phone, fax.
- the linking of this 3 is done by unique org- and person-id's. These id's are either readonly or outside the inetOrgPerson schema (in an own schema, which includes / is based on the inetOrgPerson schema). I would prefer the last, as this would allow read/write access for other clients.
Why would we need up to 2 inetOrgPerson for one person?
Else your are not able to select private AND buisness mail, phone, fax, address in a stock client.
The eGW GUI / addressbook (and the (new) api-contacts-class) will mix these speparate nodes and display them in a way addbook does it today:
- org's containing several persons
- persons contained in zero or one org
- the contacts-id (which is needed from the api contacts class, is either the org-id or the person-id, which both together have to be unique.
What can we do to have a better match with inetOrpPerson
/* ldap schema (required;allowed attributes):
top (objectClass)
+-person (sn,cn; userPassword,telephoneNumber,description,...)
| +-organisationalPerson (; title,ou,st,l,telephoneNumber,facsimileTelephoneNumber,street,
| | internationalISDNNumber,postalOfficeBox,postalCode,postalAddress, ...)
| +-inetOrgPerson (; uid,o,givenName,homePhone,homePostalAddress*,initials*,jpegPhoto*,
| labeledURI*,mail,mobile*,secretary*,manager*,userCertificate*, ...)
+-country (c; searchGuide,description)
/* The left side are the array elements used throughout phpgw, right side are the ldap attributes */
var $stock_contact_fields = array(
'fn' => 'cn',
'n_given' => 'givenname',
'n_family' => 'sn',
'n_middle' => 'phpgwmiddlename',
'n_prefix' => 'phpgwprefix', // inetOrgPerson::initials
'n_suffix' => 'phpgwsuffix',
'sound' => 'phpgwaudio',
'bday' => 'phpgwbirthday',
'note' => 'description',
'tz' => 'phpgwtz',
'geo' => 'phpgwgeo',
'url' => 'phpgwurl', // inetOrgPerson::labeledURI
'pubkey' => 'phpgwpublickey', // inetOrgPerson::userCertificate/userSMIMECertificate/userPKCS12
'org_name' => 'o',
'org_unit' => 'ou',
'title' => 'title',
'adr_one_street' => 'street',
'adr_one_locality' => 'l',
'adr_one_region' => 'st',
'adr_one_postalcode' => 'postalcode',
'adr_one_countryname' => 'co', // country::c
'adr_one_type' => 'phpgwadronetype',
'label' => 'phpgwaddresslabel', // organizationalPerson::postalAddress
'adr_two_street' => 'phpgwadrtwostreet',
'adr_two_locality' => 'phpgwadrtwolocality',
'adr_two_region' => 'phpgwadrtworegion',
'adr_two_postalcode' => 'phpgwadrtwopostalcode',
'adr_two_countryname' => 'phpgwadrtwocountryname',
'adr_two_type' => 'phpgwadrtwotype',
'tel_work' => 'telephonenumber',
'tel_home' => 'homephone',
'tel_voice' => 'phpgwvoicetelephonenumber',
'tel_fax' => 'facsimiletelephonenumber',
'tel_msg' => 'phpgwmsgtelephonenumber',
'tel_cell' => 'phpgwcelltelephonenumber',// inetOrgPerson::mobile
'tel_pager' => 'phpgwpagertelephonenumber',
'tel_bbs' => 'phpgwbbstelephonenumber',
'tel_modem' => 'phpgwmodemtelephonenumber',
'tel_car' => 'phpgwmobiletelephonenumber',
'tel_isdn' => 'phpgwisdnphonenumber', // organizationalPerson::internationalISDNNumber
'tel_video' => 'phpgwvideophonenumber',
'tel_prefer' => 'phpgwpreferphone',
'email' => 'mail',
'email_type' => 'phpgwmailtype',
'email_home' => 'phpgwmailhome',
'email_home_type' => 'phpgwmailhometype'
);
var $non_contact_fields = array(
'id' => 'uidnumber',
'lid' => 'uid',
'tid' => 'phpgwcontacttypeid',
'cat_id' => 'phpgwcontactcatid',
'access' => 'phpgwcontactaccess',
'owner' => 'phpgwcontactowner'
);