[turba] ActiveSync -> LDAP - addressbook cannot be created because CN is missing

Jan Schneider jan at horde.org
Tue Oct 17 09:00:49 UTC 2017


Zitat von Michael J Rubinsky <mrubinsk at horde.org>:

> Quoting Jan Schneider <jan at horde.org>:
>
>> Zitat von Oliver <oliverafg at gmx.de>:
>>
>>> Hello,
>>>
>>> I am using a few LDAP addressbooks, a few global read only books and
>>> one personal addressbook.  
>>>
>>> The synchronisation from LDAP to ActiveSync devices works fine.
>>> A new entry from the webfrontend to LDAP and the clients works fine.
>>>
>>> If I try to add a new entry on my cell phone, it isn't created in the
>>> LDAP backend, because of a missing cn field. 
>>>
>>> I use the evolution schema 
>>>
>>> My relevant part of backends.local.php: 
>>>
>>> $_ldap_uid = $GLOBALS['registry']->getAuth('bare');
>>> $_ldap_basedn = 'dc=kobosix,dc=lan';
>>> $cfgSources['personal_ldap'] = array(
>>>   'disabled' => false,
>>>   'title' => _($_ldap_uid . " addressbook rw"),
>>>   'type' => 'ldap',
>>>   'params' => array(
>>>   'server' => 'MYLDAPSERVER',
>>>   'tls' => false,
>>>   'root' => 'ou=' . $_ldap_uid . ',ou=Personal,ou=addressbook,' .
>>> $_ldap_basedn,
>>>   'bind_dn' => 'uid=' . $_ldap_uid . ',ou=User,ou=People,' . 			$_
>>> ldap_basedn,
>>>   'bind_password' => $GLOBALS['registry']-> 					getAuthCredential('
>>> password'),
>>>   'dn' => array('uid'),
>>>   'objectclass' => array('top',
>>>                          'person',
>>>                          // 'turbaContact',
>>>                          'inetOrgPerson',
>>>                          // 'calEntry',
>>> 		        'organizationalPerson',
>>> 		 	'evolutionPerson'),
>>>         'scope' => 'one',
>>>         'charset' => 'utf-8',
>>>         'version' => 3
>>>     ),
>>>     'map' => array(
>>>         '__key' => 'dn',
>>>         '__uid' => 'uid',
>>>         // From horde.schema:
>>>         // '__type' => 'turbaType',
>>>         // '__members' => 'turbaMembers',
>>> 	'name' => 'cn',https://bugs.horde.org/ticket/14678
>>> 	'lastname' => 'sn',
>>> 	'firstname' => 'givenname',
>>> 	'namePrefix' => 'title',
>>> 	'title' => 'businessRole',
>>>
>>> 	'photo' => 'jpegphoto',
>>> 	'birthday' => 'birthdate',
>>> 	'anniversary' => 'anniversary',
>>> 	'spouse' => 'spouseName',
>>> 	// 'children' => 'children', // still missing
>>>         'company' => 'o',
>>>         'department' => 'ou',
>>>         'businessCategory' => 'businesscategory',
>>>         'emails' => 'mail',
>>>         'workPhone' => 'telephonenumber',
>>> 	'fax' => 'facsimiletelephonenumber',
>>> 	'companyPhone' => 'companyPhone',
>>> 	'homePhone' => 'homephone',
>>> 	'cellPhone' => 'mobile',
>>> 	'carPhone' => 'carphone',
>>> 	'pager' => 'pager',
>>> 	'radioPhone' => 'radio',
>>> 	'assistant' => 'assistantName',
>>> 	'assistPhone' => 'assistantPhone',
>>> 	'manager' => 'managerName',
>>> 	'__tags' => 'categories',
>>>         'workAddress' => 'postaladdress',
>>> 	'workStreet' => 'street',
>>> 	'workPostalCode' => 'postalcode',
>>> 	'workCity' => 'l',
>>> 	'workProvince' => 'st',
>>> 	// 'workCountryFree' => 'c', // no LDAP backend yet
>>> 	'homeAddress' => 'homepostaladdress',
>>> 	'otherAddress' => 'otherPostalAddress',
>>>         'notes' => 'note',
>>>         'office' => 'roomNumber',
>>>         'nickname' => 'displayName',
>>>         'website' => 'labeledURI',
>>>         'pgpPublicKey' => 'userCertificate',
>>>         'smimePublicKey' => 'userSMIMECertificate',
>>> 	'freebusyUrl' => 'freebusyuri',
>>> 	// no LDAP backend field yet
>>> 	// 'imaddress1' => 'imAddress', //no LDAP backend yet
>>> 	// 'yomifirstname' => 'yomiFirstname' // no LDAP backend yet
>>> 	// 'yomilastname' => 'yomiLastname' // no LDAP backend yet
>>> 	// NO LDAP and horde backend yet but ActiveSync field
>>> 	// 'yomicompanyname' => 'yomiCompanyName' 
>>>     ),
>>>     'search' => array(
>>>         'name',
>>>         'emails',
>>>         'businessCategory',
>>>         'title',
>>>         'homePhone',
>>>         'workPhone',
>>> 	'cellPhone',
>>> 	'carPhone',
>>>         'homeAddress'
>>>     ),
>>>     'strict' => array(
>>>         'dn', 'uid'
>>>     ),
>>>     'approximate' => array(
>>>         'cn', 
>>>     ),
>>>     'export' => true,
>>>     'browse' => true,
>>> );
>>>
>>>
>>> In my Driver.php "name" maps to "fileas" 
>>>
>>> The error in the activesync log is the following:
>>>
>>> [55906][2017-10-15T13:45:47+02:00] I:         Motojj
>>> [55906][2017-10-15T13:45:47+02:00] ERR: Failed to add an object: 
>>> [65] "Object class violation" 
>>> DN: uid=20171015134547.zapb17bqWwoWnbh_kwmbHEZ at ...,
>>>     ou=oliver,ou=Personal,ou=addressbook,dc=kobosix,dc=lan 
>>>     (attributes: [a:7:s:2:"sn";s:6:"Tester";s:9:"givenname";			s:6
>>> :"Motojj";s:6:"mobile";s:13:"+491222266644";
>>> 	s:4:"note";s:1:"";s:4:"mail";s:2:",,";s:3:"uid";
>>> 	s:53:"20171015134547.zapb17bqWwoWnbh_kwmbHEZ at ...";
>>> 	s:11:"objectclass";a:5:{i:0;s:3:"top";i:1;s:6:"person";i:2;s:13
>>> :"inetOrgPerson";i:3;s:20:"organizationalPerson";i:4;s:15:"evolutionPer
>>> son";}}])
>>>
>>>
>>> LDAP-Server complains about the missing CN field and indeed, there is
>>> no CN field.
>>>
>>> At the moment I have no idea...
>>>
>>> Thanks and regards
>>> Oliver
>>
>> From Turba's perspective, the 'name' attribute is required and  
>> should always be set. I'd say it's Turba_Driver::fromASContact()'s  
>> responsibility to set this attribute, if it hasn't been provided by  
>> the AS message.
>> Please file a bug report.
>
> Yes, it looks like currently the turba 'name' attribute is obtained  
> from the ActiveSync 'fileas' property. I guess this will have to be  
> built dynamically, but I'm wondering what the best format for  
> building it is. None of the *name properties from ActiveSync are  
> guaranteed to be populated...

We do support contacts without names, but limited.

Thus a best guess should be sufficient. Use fileas, if available, and  
fall back to what the backend provides as a composite name field  
format, if any, and eventually use [firstname ]lastname.

-- 
Jan Schneider
The Horde Project
https://www.horde.org/



More information about the turba mailing list