Korrekturen und neue Funktionen
Hi!
Erst ein mal danke für das Script und die zahlreichen Anpassungen!
Habe mich damit einige Tage beschäftigt und das Script angepasst, so dass es mit OpenXchange (Appsuite 7.6.0) auf einem virtuellen Server von HostEurope (Debian 6.0.5 sowie 7.6.) funktioniert.
Problem 1
Beim Ausführen des Scripts erscheint folgende Meldung:
HTML:
Get all entries from CardDAV server(s)... PHP Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed'
Die Lösung war ein austauschen folgender Zeile (268) in der
carddav.php
PHP:
$result = $this->query($this->url, 'PROPFIND');
gegen folgenden Code:
PHP:
$content = '<?xml version="1.0" ?><D:sync-collection xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav"><D:sync-token></D:sync-token><D:prop><D:getcontenttype/><D:getetag/><D:allprop/><C:address-data><C:allprop/></C:address-data></D:prop><C:filter/></D:sync-collection>';
$content_type = 'application/xml';
$result = $this->query($this->url, 'REPORT', $content, $content_type);
Dieses Problem wurde in folgendem Forum-Beitrag behandelt:
[SOLVED] Davical no CardDAV XML-Element found!
Problem 2
HTML:
Upload to fritzbox at https://xxx.no-ip.biz:443...Response of initialization call /login_sid.lua in initSID was not xml-formatted.
Done.
FritzBox:
Das Problem betrifft die FritzBox-API (
fritzbox_api.class.php). Die FritzBox-API benutzt in ihrer Config eine Unterscheidung, ob sie sich aus dem
lokalen Netzwerk auf die FritzBox einloggt (fritz.box)
oder remote über einen Dyn-DNS-Namen (xxx.no-ip.biz zum Beispiel). Diese Unterscheidung hat das carddav2fb-Script aber nicht an die API weitergegeben sondern ist immer von dem Login aus dem lokalen Netzwerk ausgegangen. So hat das Script in meinem Netzwerk von einer virtuellen Linux-Maschine funktioniert, während sie "von aussen" auf dem virtuellen Server (HostEurope) nicht funktioniert hat.
Es kam immer wieder die gleiche Meldung, egal wo ich die Benutzerdaten eingegeben habe.
Die Lösung brachte eine scheinbar aktuellere bzw. aktualisierte Variante der API aus diesem Forum-Beitrag:
Neue fritzbox_api.class.php
Ich habe nur recht begrenzte Programmier-Kenntnisse, konnte aber durch einige Recherche und Zusammenführen der oben verlinkten API und der original-API aus diesem Thread einen funktionierenden Login von einem remote-Server erreichen. Dazu habe ich eigentlich nur einige fehlende Funktionen in das oben verlinkte Script eingefügt. Nun werden die Benutzerdaten allerdings auch aus der
fritzbox_user.conf.php der API gelesen und darüber auch konfiguriert (Login Lokal oder Remote), d.h. die Benutzerdaten in der
config.php vom carddav2fb-Script werden nicht verwendet bzw. mit der API überschrieben. Wer hier eine elegantere Lösung findet, kann es gerne noch anpassen.
Neue Funktion: Kontakt-Fotos:
Einige der Verbesserungen, die andere schon in diesen Thread gepostet haben, habe ich in das carddav2b-Script (
carddav2fb.php) eingebaut. Unter anderem den Pfad zu den Kontakt-Bildern mit entsprechend formatierten Dateinamen.
Zudem habe ich mit Hilfe einiger anderer Quellen eine neue Funktion in das Script eingebaut, die die Bilder automatisch aus den Vcards der Kontakte ausliest, zwischenspeichert, als JPG umwandelt und automatisch auf die FritzBox per FTP hochlädt. Diese werden dann im Telefonbuch angezeigt.
Die Zeilen habe ich in der carddav2fb.php-Datei entsprechend markiert. Im Script wird auch geprüft, ob die Datei auf der FritzBox schon vorhanden ist und lädt diese nicht erneut hoch. Das hat bisher aber den Nachteil, dass ausgetauschte Bilder in den Vcards ebenfalls nicht hochgeladen werden. Dazu fehlt noch ein Vergleich des Dateiinhalts bzw. der Größe.
Die FTP-Verbindung wird einmal und immer beim ausführen des Scripts aufgebaut und bezieht die FTP-Server-Adresse und die Benutzerdaten aus der
carddav2fb.php. Den FTP-Host habe ich dazu in eine extra Variable verlagert, da sich bei mir der Port für FTP und Web-Login auf der FritzBox unterscheiden. Das geht bestimmt noch eleganter, allerdings war mir hier erstmal wichtig, dass es überhaupt funktioniert.
Neue Funktion: E-Mail-Adressen:
Die E-Mail-Adressen der Kontakte wurden im Script noch nicht berücksichtigt. In meiner Version werden diese ausgelesen und in das Telefonbuch geschrieben.
Diverses und SSL-Zertifikat der FritzBox:
Wie schon gesagt, habe ich einige der in diesem Thread schon benannten Verbesserungen eingebaut wie z.B. die Anzeige der Kontakte mit
Nachname, Vorname. Zudem gab es noch ein Problem, nachdem der Login auf die FritzBox von einem remote-Server, wie unter
Problem 2 beschrieben, funktioniert hat: Der remote-Server hat das SSL-Zertifikat der FritzBox nicht akzeptiert und es gab eine entsprechende Fehler-Meldung bei der Verbindung. Den Login in die FritzBox übernimmt die API (
fritzbox_api.class.php). Mittels einigen Curl-Optionen, kann man theoretisch die Verifizierung des SSL-Zertifikates ignorieren, allerdings sind diese beiden Optionen bereits im Script enthalten und dennoch hat er einen SSL-Fehler ausgegeben:
PHP:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
Dieses Problem wird auch in diesem Thread behandelt:
PHP CURL CURLOPT_SSL_VERIFYPEER ignored
Die Lösung besteht in dem manuellen herunterladen und hinzufügen des Zertifikates von der FritzBox auf den Server. Im Firefox öffnet man dazu die Weboberfläche der FritzBox über die Remote-Adresse (xxx.no-ip.biz:xxx) und klickt auf das Schloss neben der Adresse und anschließend auf "Weitere Informationen".
Desweiteren auf "Zertifikat anzeigen" -> Reiter "Details" -> "Exportieren..." und speichert es als *.crt-Datei. Diese Datei wird nun auf dem remote-Server installiert. Wie das geht kann man hier nachlesen:
How do I install a root certificate?
Danach sollte der Login ohne Probleme funktíonieren. Hierbei ist zu beachten, dass man das Zertifikat bei einem Umzug auf einen anderen Server nicht einfach in den Ordner kopieren kann sondern erneut importieren muss.
Im Script selbt habe ich bei meinen Ergänzungen (deutsche) Kommentare gesetzt um die Funktion etwas zu beschreiben. Zudem gibt es ein paar kommentierte und unkommentierte Debug-Ausgaben, die bei Bedarf kommentiert bzw. entfernt werden können.
----------------------------------------------------
Das von mir angepasste Script habe ich an diesen Beitrag angehängt.
Es ist bereits seit ein paar Tagen im Einsatz und das es nun bereits eine Fork bei Github gibt habe ich erst nach meinen Anpassungen gesehen. Diese Version bei Github habe ich nicht eingesetzt, meine ursprüngliche Quelle war das Script was vom Thread-Ersteller
SnoopyDog im
Post #1 bereit gestellt wurde. Mit Github habe ich bisher noch nicht gearbeitet (ausser zum herunterladen von aktuellem Code).
Sofern Interesse besteht, kann ich meine Ergänzugen gerne dort einbauen und entsprechend markieren.
Freue mich auf Feedback!
Anhang anzeigen carddav2fb_2014-08-18_MFR2000.zip