Workaround für Kontakte-Sync Egroupware<->Synthesis SyncML-Client

Update: Mit Version 2.3.2 des SyncML-Clients (erschienen am 10.05.2012) hat Synthesis den Hersteller-String wieder zurück geändert auf “Synthesis AG”. Damit ist untenstehende Anpassung im EGroupware-Quellcode nicht mehr notwendig. Siehe auch Hinweis in den Synthesis-Release-Notes.

Wie sich gerade rausgestellt hat, funktioniert die Synchronisation der Adressen zwischen Egroupware (hier in der Version 1.8004) und dem Synthesis SyncML-Client unter Android (hier 2.2.21) nicht mehr zuverlässig.

Als Symptome waren zunächst eine Menge Dubletten (teilweise über 50) für ein und denselben Kontakt zu finden, sowohl auf dem Mobilgerät als auch auf dem Server. Wobei jeweils nur ein Kontakteintrag die vollständige Anschrift auswies. Das Problem ließ sich durch manuelles Löschen der doppelten Einträge auf Server-Seite und Neu-Aufsetzen des Clients (Option “Gerät neu Laden im Synthesis-Client) lösen.

Anschließend stellte sich aber heraus, daß auch bei den neu synchronisierten Einträgen die Adressangeben fehlen.

In der Synthesis-FAQ wird der Tipp gegeben, die Option für die Client-Identifizierungsstring ausgeschaltet zu lassen (nennt sich “App identifiziert sich als ‘SySync Client Android ‘ “). Allerdings war diese Option bei mir bereits ausgeschaltet.

Hintergrund des Ganzen ist die Tatsache, daß EGroupware auf den Hersteller- und Modell-String des SyncML-Clients matcht, um gerätespezische Eigenheiten zu umschiffen. Der Quellcode dazu findet sich unter syncml/contacs/lib/api.php, Funktion setSupportedFields.

Wie sich bei einer weiteren Analyse auf dem Server gezeigt hat, klappt zwar das Matching auf den Client-Namen, aber EGroupware erwartet beim Hersteller “Synthesis AG”. Stattdessen gibt der neueste Client aber lediglich “Synthesis” aus. Auf dem Server findet sich im PHP-Fehlerlog auch jede Menge Einträge der folgenden Art:

Client not found:'Synthesis' 'SySync Client PocketPC PRO'

Die Programmlogik sorgt nun dafür, daß als Fallback ein Sets von Feldern genommen wird, was gerade nicht die (Privat-)Adresse umfasst.

Ein schneller Workaround ist in setSupportedFields den ‘synthesis ag’ case einfach auf ‘synthesis’ zu verkürzen. Zumindest in meinem Fall hat das nach einem weiteren “Gerät neu laden” dazu geführt, daß auch die Anschriften wieder verfügbar waren. Langfristig mag es sinnvoll sein, von dem fehleranfälligen Matchen von Client-Strings wegzukommen. Synthesis scheint auch gut mit allen Feldern ($defaultFields[1]) auszukommen.