carddav2fb - angepaßte Version

Habe es eigentlich auch schon mal runter geworfen und neu installiert...oder wie meinst du?
Stehe mitlerweile so dermaßen auf dem Schlauch! Bin schon ganz wirr!
 
Bist Du Dir sicher, dass das Kommandozeilen-binary von php curl mit drinnen hat?

Du schreibst, der Server ist mit curl. Es ist aber ein Unterschied ob php curl kann oder Du das Programm drauf hast. Bei Linux, etc. muss php mit curl kompiliert werden, sonst geht das nicht. Es gibt auch Pakete, z.B. php5-curl
 
Nein, da bin ich mir nicht sicher, bin mir grade bei gar nichts mehr sicher... :/
Also php5-curl ist installiert, da bin ich mir sicher ;)
 
Was für ein php Paket hast Du installiert?
 
Hmmm... meine Worte mögen vielleicht wie Fachchinesisch für Dich sein ;)

Versuch mal das Paket mit sudo apt-get install php5-curl zu installieren.
 
Ne nicht wirklich Fachchinesisch...ist schon installiert, sagt mir die shell daher auch ;)
 
Und php5 ist nicht installiert?
 
Natürlich ist das installiert :D Sonst würde doch gar nichts laufen :D
 
Dann dürfte php doppelt sein und die ohne curl ist verlinkt
 
Also das erste Problem ist beseitigt...php.ini war nicht da wo sie hätte sein müssen...dumm!
Jetzt läuft der Script, macht aber andere Fehler...
Code:
Get all entries from CardDAV server(s)... 
Warning: in_array() expects parameter 2 to be array, string given in /pfadzumordner/carddav2fb/carddav2fb.php on line 152

Warning: in_array() expects parameter 2 to be array, string given in /pfadzumordner/carddav2fb/carddav2fb.php on line 155

Warning: in_array() expects parameter 2 to be array, string given in /pfadzumordner/carddav2fb/carddav2fb.php on line 158
Das wiederholt sich ein paar Mal...

Zum Schluss dann folgende Meldung:
Code:
Done.
Transform to FritzBox XML File... Done.
Upload to fritzbox at https://xxx.myfritz.net:455...Response of initialization call /login_sid.lua in initSID was not xml-formatted.
Done.
FritzBox:
 
Zuletzt bearbeitet:
Hallo Zusammen,

da ich selbst vor kurzem auf das 'carddav2fb' script gestoßen bin hab ich mir gedacht ich nutze es um meine owncloud Kontakte automatisch mit meiner FritzBox (7390) zu synchronisieren. Prinzipiell klappte das ganze sehr gut und ich bin recht zufrieden damit, aber mit ein paar vCards gab es Probleme die es notwendig machten, dass ich ein paar Sachen selbst daran modifizieren.

Damit ich dies nicht wie der Ursprungsautor dieses Threads hier komplett separat von dem ursprünglichen github repository mache dachte ich mir ich forke kurzerhand das github repository und für darauf meine Änderungen durch damit diese auch für jeden besser ersichtlich werden.

Zu finden ist das ganze nun hier:

https://github.com/jens-maus/carddav2fb

Im Grunde basiert es auf der Version die hier gepostet wurde, jedoch mit zwei Bugfixes.
 
@xblubb: Das erste ist "nur" eine Warnung, die sollte kommen, wenn im Kontakt nur eine Telefonnummer gespeichert ist und der Rufnummerntyp (WORK, CELL, HOME) nur einmal vorhanden ist. Die zweite Fehlermeldung - und die ist ein Problem - deutet darauf hin, dass das Login bei der Box nicht geklappt hat (falsche Adresse, Benutzername oder Passwort können z.B. dafür verantwortlich sein).
 
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
 
Zuletzt bearbeitet:
Hallo,

danke erst einmal für dein Posting. Wirklich interessant das ich nicht der Einzige zu sein scheine der diese kleine 'carddav2fb' Skript mehr als nützlich finde. Danke auch für die Version die du angehängt hast. In der Tat kannte ich all diese zusätzlichen Änderungen nicht als ich in den letzten Tagen den Fork auf github startet habe.

Habe nun kurzerhand deine version genommen und die Änderungen da drin gegen meine version auf github (https://github.com/jens-maus/carddav2fb) gedifft. Vor allem die Fotofunktionalität ist wirklich eine gute Sache und auch die Änderung bzgl. Vor- und Nachname finde ich sehr gut. Somit hab ich kurzerhand nun deine Version mit meiner vereinigt und die meisten deiner Änderungen bzw. der Änderungen die du auch von woanders her hast übernommen.

Das es hier und da noch ein paar Probleme gegeben hat hier meine Anmerkungen dazu:

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!

Diese Änderung funktioniert bei mir leider nicht. im PHP script scheint der mit dem '<?' bzw. '?>' durcheinander zu kommen sodass ich das hier nur bedingt testen und integrieren konnte. Hab die Änderung aber trotzdem als Kommentar mit übernommen (siehe https://github.com/jens-maus/CardDAV-PHP/commit/73b45ecffaa474af88fe23db659d73a953ae7317). Vielleicht schaust du dir später das nochmal an und sagst mir warum das bei mir schiefgeht?!?

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.

Was ich hier kurzerhand gemacht habe ist trotzdem die Funktionalität zu erhalten das man nutzername, Passwort und ip der fritzbox im konstruktor der klasse bestimmen kann (siehe https://github.com/jens-maus/fritzbox_api_php/commit/6fccd7e2ec1bcef7fa8c86ca5919767a43246880). Damit sollte das ganze wie ursprünglich angedacht funktionieren. D.h. einfach in der config.php die richtige settings angeben und er sollte das ganze an die FritzBOX API klasse durchleiten. Schaue dir mal an.

Alle anderen Dinge habe ich weitestgehend mit übernommen. Nur das utf-8 umkodieren musste ich wieder deaktivieren weil das bei mir alle Umlaute in 2 byte Sequenzen umgewandelt hatte die dann unleserliche Zeichen verursacht hatten im Telefonbuch.

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!

Die meisten der Anpassungen in dem Skript von dir habe ich wie oben beschrieben übernommen. Das ganze ist nun auf meinem carddav2fb fork bei github aktualisiert sodass du eigentlich nur dort mal das repository wie im README beschrieben auschecken musst und dann sollte alles wie bei dir gewohnt funktionieren. Schau dir mal an ob das soweit i.O. ist für dich. Was ich zusätzlich mir noch erlaubt habe zu tun war die deutschen Kommentare und Ausgaben gleich ins englische zu übersetzen.

Freu mich schon drauf mehr Änderungen + Anpassungen von dir zu erhalten damit wir das carddav2fb Skript evenlt. noch weiter verbessern können. Das ganze läuft aber bereits echt schon sehr rund und bei mir als cronjob 1x am Tag mit problemlosem Upload alle Kontaktfotos und Darstellungen in einem FritzPhone.
 
Hallo,
ein herzliches Dankeschön für das Skript. Ich habe die Version aus github gezogen. Die funktioniert bei mir prima, sobald ich die Konfiguration in der Fritzbox korrekt hatte:Thread aufmerksam durchlesen hätte Zeit sparen können, den Hinweis von nogenius hate ich überlesen.
Viele Grüße
Michael
 
Hallo,
ein herzliches Dankeschön für das Skript. Ich habe die Version aus github gezogen. Die funktioniert bei mir prima, sobald ich die Konfiguration in der Fritzbox korrekt hatte:Thread aufmerksam durchlesen hätte Zeit sparen können, den Hinweis von nogenius hate ich überlesen.

Danke für den Hinweis. Ich hab das README entsprechend angepasst damit das mit dem Anlegen des Nutzers klarer sein sollte.
 
Weitere Anpassungen

Hallo!

Danke fürs übernehmen meiner Anpassungen in das GIT-Repository! Habe auf meinem Server den Code heruntergeladen und getestet sowie weiter angepasst.

Leider musste ich zwei Dinge wieder auf meine Umgebung anpassen, da das Script sonst mit entsprechenden Fehlern abbricht. Zum einen ist es das weiter oben beschriebene Problem 1 mit der PROPFIND-Methode in Verbindung mit dem OpenXchange-Server (in Datei lib/carddav.php).

Wenn ich mit dieser einen Zeile:

PHP:
$result = $this->query($this->url, 'PROPFIND');

die Variable $result ausgebe, bekomme ich lediglich ein Array ausgegeben:

Code:
Array
(
    [response] => 
    [http_code] => 200
)

Daher habe ich die Zeile für meine Umgebung auskommentiert, aber mit entsprechenden Kommentaren versehen.
Hier könnte man eventuell den Typ/Agent des verwendeten Carddav-Servers herausfinden und abfragen.
Es scheint doch einige Unterschiede bei den Carddav-Servern zu geben, da die Rückmeldungen wohl immer etwas anders sind.

Welche Meldung wird denn bei dir ausgegeben, wenn du die Zeilen ohne das PROPFIND verwendest?

Desweiteren bestand Problem 2 mit dem Fehler beim Login von aussen auf die FritzBox weiterhin. Der in der config.php angegebene Benutzername und das Passwort werden zwar übergeben, nicht jedoch ob es sich um die in der FritzBox-API unterschiedene "remote config mode" (enable_remote_config) handelt oder nicht.

Da diese nie aktiviert wird, versucht er sich immer ohne diese Methode einzuloggen und scheitert mit der Fehlermeldung:

Code:
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:

Daher habe ich noch eine Abfrage in der Datei fritzbox_api.class.php eingebaut, die abfragt, ob es sich bei der FritzBox-Adresse um "fritz.box" handelt und die Variablen für den remote-Login entsprechend setzt und aus den übergebenen Variablen übernimmt.

Nachdem der Verbindungsversuch zur FritzBox geklappt hat, gab es noch einmal das Problem mit dem SSL-Zertifikat, obwohl ich bereits das FritzBox-Zertifikat auf dem Server importiert hatte:

Code:
60: SSL certificate: self signed certificate

Die Lösung war, das Zertifikat der Website des eingesetzten DynDNS-Anbieters (in meinem Fall war es noip.com) ebenfalls zu importieren. Damit ist es auch möglich, die beiden Variablen:

PHP:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

auf true (depricated) bzw. den Wert "2" zu setzen. Diesen Abschnitt habe ich ebenfalls noch um zwei weitere Zeilen ergänzt, die den Pfad zu dem Zertifikat der FritzBox und den allgemeinen SSL-Pfad für CURL noch direkt angeben. An den entsprechenden Stellen habe ich Kommentare im Code gesetzt.

In der carddav2fb.php habe ich ebenfalls noch deine Änderung mit der zusätzlichen Telefonnummer ("other") eingebaut sowie den Typ "dom" noch hinzugefügt, da in meiner vom Server zurückgegebenen XML-Datei die weiteren Telefonnummern mit "dom" beschrieben sind.

Bei der FTP-Verbindung zu FritzBox habe ich FTPS eingestellt (muss auch in der FritzBox aktiviert werden), damit finden auch die FTP-Verbindungen verschlüsselt statt.

Die Abfrage, ob Kontakt-Fotos auf der FritzBox schon vorhanden sind, habe ich vorerst entfernt, d.H. es werden bei jedem Ausführen des Scripts alle Fotos hochgeladen und überschrieben. Man kann die Dateien auch mit einem Hash-Wert vergleichen, damit habe ich mich bisher aber noch nicht lange beschäftigt.

Leider musste ich bei mir auch wieder die Zeile:

PHP:
$xmldata = utf8_encode($xmldata);

hinzufügen, da er sonst beim ersten Auftauchen eines Umlautes einen Fehler ausgibt ([...]no proper UTF-8[...]).
Wahrscheinlich gibt hier owncloud bereits korrekt als UTF-8 formatierte XML-Daten heraus und das erneute Konvertieren führt dann zu unleserlichen Zeichen.

Ansonsten habe ich die Ausgabe beim Speichern und hochladen der Kontakt-Fotos erst mal wieder aktiviert, da man so besser sieht, dass etwas passiert. Diese kann man ja auch als Debug-Zeilen auskommentieren.

Du kannst sie bei dir ja noch mal testen bevor du sie ins Github setzt. Danke auf jeden Fall schon mal fürs einrichten! Damit behält man jedenfalls mehr Überblick :)
Werde mir morgen auch mal ein FritzPhone (C4) kaufen und schauen wie die Kontakte dort angezeigt und aufgerufen werden.

-----------------------
Meine Änderungen habe ich in eine ZIP-Datei gepackt (nur die veränderten Dateien).
Anhang anzeigen carddav2fb_2014-08-24_MFR2000_updated_files.zip
 
Hallo,
Leider musste ich zwei Dinge wieder auf meine Umgebung anpassen, da das Script sonst mit entsprechenden Fehlern abbricht. Zum einen ist es das weiter oben beschriebene Problem 1 mit der PROPFIND-Methode in Verbindung mit dem OpenXchange-Server (in Datei lib/carddav.php).

Wenn ich mit dieser einen Zeile:

PHP:
$result = $this->query($this->url, 'PROPFIND');

die Variable $result ausgebe, bekomme ich lediglich ein Array ausgegeben:

Code:
Array
(
    [response] => 
    [http_code] => 200
)

Daher habe ich die Zeile für meine Umgebung auskommentiert, aber mit entsprechenden Kommentaren versehen.
Hier könnte man eventuell den Typ/Agent des verwendeten Carddav-Servers herausfinden und abfragen.
Es scheint doch einige Unterschiede bei den Carddav-Servern zu geben, da die Rückmeldungen wohl immer etwas anders sind.

Welche Meldung wird denn bei dir ausgegeben, wenn du die Zeilen ohne das PROPFIND verwendest?

Wenn ich deine Variante hier mit owncloud verwende kommt folgender Fehler:

Code:
Get all entries from CardDAV server(s)... PHP Fatal error:  Uncaught exception 'Exception' with message 'Woops, something's gone wrong! The CardDAV server returned the http status code 403.' in lib/CardDAV-PHP/carddav.php:294
Stack trace:
#0 carddav2fb.php(114): carddav_backend->get()
#1 carddav2fb.php(52): CardDAV2FB->get_carddav_entries()
#2 {main}
  thrown in lib/CardDAV-PHP/carddav.php on line 294

Und $result steht dann im debug auf folgendem:

Code:
Array
(
    [response] => <?xml version="1.0" encoding="utf-8"?>
<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
  <s:exception>Sabre\DAV\Exception\ReportNotSupported</s:exception>
  <s:message/>
  <s:sabredav-version>1.8.10</s:sabredav-version>
  <d:supported-report/>
</d:error>

    [http_code] => 403
)
[\CODE]

Offensichtlich ist REPORT nicht supported von SabreDAV das von owncloud verwendet wird. Da müsste also erst einmal ne Unterscheidung zwischen verschiedenen CardDAV implemenationen erfolgen.

[quote="MFR2000, post: 2030304"]
Desweiteren bestand [B]Problem 2[/B] mit dem Fehler beim Login von aussen auf die FritzBox weiterhin. Der in der [B]config.php[/B] angegebene Benutzername und das Passwort werden zwar übergeben, nicht jedoch ob es sich um die in der FritzBox-API unterschiedene "remote config mode" ([B]enable_remote_config[/B]) handelt oder nicht.

Da diese nie aktiviert wird, versucht er sich immer ohne diese Methode einzuloggen und scheitert mit der Fehlermeldung:

[CODE]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:

Daher habe ich noch eine Abfrage in der Datei fritzbox_api.class.php eingebaut, die abfragt, ob es sich bei der FritzBox-Adresse um "fritz.box" handelt und die Variablen für den remote-Login entsprechend setzt und aus den übergebenen Variablen übernimmt.
[/QUOTE]

Wunderbar, das macht das ganze wirklich mehr flexibel. Danke hierfür!

Nachdem der Verbindungsversuch zur FritzBox geklappt hat, gab es noch einmal das Problem mit dem SSL-Zertifikat, obwohl ich bereits das FritzBox-Zertifikat auf dem Server importiert hatte:

Code:
60: SSL certificate: self signed certificate

Die Lösung war, das Zertifikat der Website des eingesetzten DynDNS-Anbieters (in meinem Fall war es noip.com) ebenfalls zu importieren. Damit ist es auch möglich, die beiden Variablen:

PHP:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

auf true (depricated) bzw. den Wert "2" zu setzen. Diesen Abschnitt habe ich ebenfalls noch um zwei weitere Zeilen ergänzt, die den Pfad zu dem Zertifikat der FritzBox und den allgemeinen SSL-Pfad für CURL noch direkt angeben. An den entsprechenden Stellen habe ich Kommentare im Code gesetzt.

Gut, die Änderung hab ich auch kurzerhand übernommen (auch wenn ich sie selber nicht brauche da ich nur von intern die FritzBox ansteuere.

In der carddav2fb.php habe ich ebenfalls noch deine Änderung mit der zusätzlichen Telefonnummer ("other") eingebaut sowie den Typ "dom" noch hinzugefügt, da in meiner vom Server zurückgegebenen XML-Datei die weiteren Telefonnummern mit "dom" beschrieben sind.

Wunderbar, auch das hab ich entsprechend übernommen.

Bei der FTP-Verbindung zu FritzBox habe ich FTPS eingestellt (muss auch in der FritzBox aktiviert werden), damit finden auch die FTP-Verbindungen verschlüsselt statt.

Eine sehr sinnvolle Änderung. Danke dir!

Die Abfrage, ob Kontakt-Fotos auf der FritzBox schon vorhanden sind, habe ich vorerst entfernt, d.H. es werden bei jedem Ausführen des Scripts alle Fotos hochgeladen und überschrieben. Man kann die Dateien auch mit einem Hash-Wert vergleichen, damit habe ich mich bisher aber noch nicht lange beschäftigt.

Nun, um nen Hash-Wert (z.B. MD5) zu berechnen müsste man dann aber jedes Bild erst einmal wieder via FTP runterlasen und vergleichen. Das wird dann natürlich beliebig langsam.

Leider musste ich bei mir auch wieder die Zeile:

PHP:
$xmldata = utf8_encode($xmldata);

hinzufügen, da er sonst beim ersten Auftauchen eines Umlautes einen Fehler ausgibt ([...]no proper UTF-8[...]).
Wahrscheinlich gibt hier owncloud bereits korrekt als UTF-8 formatierte XML-Daten heraus und das erneute Konvertieren führt dann zu unleserlichen Zeichen.

In der Tat müsste man wohl hier eine Erkennung einbauen ob das ganze schon UTF8 kodiert ist oder nicht und nur wenn das nicht der Fall ist die Umkodierung entsprechend ablaufen lassen.

Ansonsten habe ich die Ausgabe beim Speichern und hochladen der Kontakt-Fotos erst mal wieder aktiviert, da man so besser sieht, dass etwas passiert. Diese kann man ja auch als Debug-Zeilen auskommentieren.

Gut, hab das ganze erst mal so drin gelassen. Man könnte natürlich dem Skript auch ne debug option spendieren und nur wenn die an ist dann die Ausgabe entsprechend vornehmen.

Du kannst sie bei dir ja noch mal testen bevor du sie ins Github setzt. Danke auf jeden Fall schon mal fürs einrichten! Damit behält man jedenfalls mehr Überblick :)

Definitiv. Ich wäre dir allerdings verbunden wenn du in Zukunft statt immer die vollen Dateien einfach ein diff gegenüber dem aktuellen master branch in github machen könntest. Im grunde reicht mir wenn du die Ausgabe von "git diff" als Datei anhängst dann kann ich das ganze besser/einfacher einpflegen.

Werde mir morgen auch mal ein FritzPhone (C4) kaufen und schauen wie die Kontakte dort angezeigt und aufgerufen werden.

Oh, mit dem Gedanken spiel ich auch schon. Das C4 hab ich noch nicht :)
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.