Es klappt!
Ich habe mir heute mal die Mühe gemacht, sowas zu realisieren. Und siehe da: es klappt!
Notwendige Schritte:
- Mit Wireshark den Netzwerkverkehr mitsniffen, um zu erfahren, welche URL das Gigaset mittels GET aufruft und welche Parameter es dabei mitgibt. Dabei festgestellt, dass das Gigaset seine MAC-Adresse mitschickt und eine Digest Authentication durchführt. Letzteres ist aber nicht notwendig zu konfigurieren, wenn man einen eigenen Webserver aufsetzt.
- Im lokalen DNS-Server (in meinem Fall BIND9) den Hostnamen "api.klicktel.de" auf die IP-Adresse des eigenen Webservers auflösen. Ich habe dazu eine eigene DNS-Zone erstellt.
- Im eigenen Webserver (in meinem Fall Apache 2.2) einen VirtualHost einrichten mit ServerName api.klicktel.de. Außerdem eine RewriteRule von ^/gigasetpb/1.0/search.php$ auf /cgi-bin/klicktel.cgi.
- Eine klicktel.cgi im CGI-Verzeichnis erstellen, die die Daten wie von Littlewhoo beschrieben zurückgibt. Die "Reqid" kann dabei beliebig gewählt werden. Aus der Umgebungsvariable QUERY_STRING kann der Typ der Anfrage entnommen werden, bei Telefonbuch ist das "type=pb" und "ln=Nachname", wobei "Nachname" als Platzhalter für den gesuchten Nachnamen steht. Beim Branchenbuch ist das "type=yp" und "wh=Branche", wobei "Branche" wieder der Platzhalter für die Branche ist. Die Strings sind mit %2a terminiert, Umlaute sind ebenfalls mit %irgendwas kodiert, aber das kriegt man mit "recode" zurückgewandelt.
Das war’s auch schon. Analog dazu kann für pbs.gigaset.net eine DNS-Zone erstellt werden, ein weiterer entsprechender Apache-VirtualHost und eine RewriteRule von ^/snipweb/phonebookservlet.do$ auf /cgi-bin/gigasetnet.cgi. Im QUERY_STRING wird nun "nn=Nickname" übertragen, wobei "Nickname" der Platzhalter für den gesuchten Gigaset.net-Namen ist. Der XML-Aufbau ist geringfügig anders, als Typ muß type="shcpb" angegeben werden, die einzelnen Treffer in der Form <entry id="0000"><usr>Nickname</usr><nn>Max Mustermann</nn></entry>, wobei "Nickname" und "Max Mustermann" wieder Platzhalter sind. Die "enty id" ist beliebig, darf auch bei allen Einträgen gleich sein.
Allerdings lassen sich die von der Gigaset.net zurückgegebenen Suchergebnisse nicht nutzen/speichern, wenn der Nickname nicht mit "#9" endet. Ein "#9" am Ende des Nicknames sorgt aber dafür, dass diese Nummer immer über das Gigaset.net gewählt wird. Damit ist es zwecklos, die Gigaset-Suchfunktion für eigene Einträge umbiegen zu wollen. Macht aber nix, mit der Klicktel-Suche klappt es ja.
Resultat: ich gehe auf Klicktel-Telefonbuchsuche oder Klicktel-Branchensuche, gebe die Anfangsbuchstaben des gewünschten Nachnamens ein und einen beliebigen Buchstaben bei "Ort", klicke "Suchen", das S450IP ruft mit der Abfrage meinem Apache auf, dort wird ein CGI gestartet, das fragt den LDAP-Server und generiert aus den Resultaten des LDAP-Servers eine XML-Antwort, die über den Apache beim S450IP ankommt. Und das Handset am S450IP zeigt ganz brav die Treffer an.
Zwei Tipps noch:
- Bei Umlauten in den Attributen spuckt ein ldapsearch base64 aus, das muß man im CGI also prüfen und bei Bedarf mit "recode" in UTF8 umwandeln.
- Da die LDAP-Attribute "telephoneNumber" und "homePhone" multivalue sind, das S450IP aber exakt eine Nummer pro XML-Eintrag erwartet, muß man pro Nummer einen vollständigen XML-Eintrag generieren.