Neue Features & Improvements!

In den letzten Wochen hat sich durch konstruktive Zuarbeit einiger engagierter User einiges an der Software getan.
Ich empfehle daher ein Update:
Code:
cd /your/path/to/carddav2fb
git pull https://github.com/andig/carddav2fb
composer update --no-dev
Anschließend solltet Ihr die config.example.php gegen eure config.php (oder wie immer die bei Euch heißt*) abgleichen und ggf. anpassen/ergänzen. Dazu ist es ratsam die READ.ME zu lesen und ein Blick in das Wiki zu werfen.

* Weil das hier auch gerade gefragt wurde: wenn Ihr für die Konfigurationsdatei einen Namen abweichend config.php nutzen wollt, dann muss das mit dem Kommando -c definiert werden:
Code:
php carddav2fb.php run -c yourconf.php
oder aber
Code:
php carddav2fb.php run -i -c yourconf.php
wenn auch Profilbilder als Anruferbild auf dem FRITZ!Fon erscheinen sollen

Grüße

Black Senator
 
Zuletzt bearbeitet:
Hi zusammen,
hab das Script auf meinem Raspberry Pi problemlos ans laufen bekommen. Nur leider funktioniert der Image Upload nicht.
Als CardDAV nutze ich meinen iCloud Account. Anbei mal die Scriptausgabe:
Code:
pi@RaspberryPi3B:/git/carddav2fb $ php carddav2fb.php run -i -vvv
Downloading vCard(s) from account [email protected]
  244 [============================]  1 min 4.0 MiB
Downloaded 244 vCard(s)
Dissolving groups (e.g. iCloud)
Dissolved 5 group(s)
Filtering 239 vCard(s)
Filtered out 0 vCard(s)
Detaching and uploading image(s)
 239/239 [============================] 100%  1 sec/1 sec  4.0 MiBUploaded/refreshed 0 of 0 image file(s)

Converted 239 vCard(s)
Uploading
Successful uploaded new Fritz!Box phonebook
Habt Ihr evtl. eine Idee?
Wenn ich einen reinen "download" durchführe, sehe ich die Bilder im Photo-Attribut:
Code:
"photo": "https:\/\/p03-contacts.icloud.com:443\/xxxxxxxx\/wbs\/013f46f9b100b11c9423a547f0037d54476021c365",
Schon mal Danke
Grüße Toby
 
Hi,

es ist eine 7490, USB Stick ist angesteckt. (Habe es aber auch schon mit dem internen Speicher getestet - hat auch nicht geklappt!)

Hier mal meine Config:
Code:
<?php

$config = [
    // phonebook
    'phonebook' => [
        'id'        => 5,                                              // only "0" can store quickdial and vanity numbers
        'name'      => 'Tobi',
        'imagepath' => 'file:///var/InternerSpeicher/FRITZ-1/FRITZ/fonpix/', // mandatory if you use the -i option
    ],

    // or server
    'server' => [
        [
            'url' => 'https://p44-contacts.icloud.com/xxxxxxxxx/carddavhome/card/',
            'user' => '[email protected]',
            'password' => 'xxxx-xxxx-xxxx-xxxx',
            'http' => [           // http client options are directly passed to Guzzle http client
                // 'verify' => false, // uncomment to disable certificate check
                // 'auth' => 'digest', // uncomment for digest auth
            ]
        ],
/* add as many as you need
        [
            'url' => 'https://...',
            'user' => '',
            'password' => '',
        ],
*/
    ],

    // or fritzbox
    'fritzbox' => [
        'url' => 'http://10.0.1.251',
        'user' => 'xxxx',
        'password' => 'xxxx!',
        'fonpix'   => '/FRITZ-1/FRITZ/fonpix',   // the storage on your usb stick for uploading images
        'http' => [           // http client options are directly passed to Guzzle http client
            // 'verify' => false, // uncomment to disable certificate check
        ],
        'plainFTP' => true, // set true to use FTP instead of FTPS e.g. on Windows
    ],

    'filters' => [

Das Telefonbuch kommt erfolgreich an, kein Problem. Nur die Bilder werden weder hoch geladen noch in die Kontakte verknüpft.
Der FTP Login ist aber im Log der Fritzbox zu sehen. Also grundsätzlich meldet sich das Script mal per FTP an.

Und der Ordner existiert genau so auch wenn ich den FTP Ordner manuell öffne:
Bildschirmfoto 2019-02-06 um 17.56.16.png

Grüße Tobias
 
Hmmm,

die config liest sich erstmal richtig.

Was meinst Du mit?:
...noch in die Kontakte verknüpft.
Wenn Du das Telefonbuch Tobi herunterlädst - sind dann Einträge im tag?:
Code:
<imageURL>file:///var/InternerSpeicher/FRITZ-1/FRITZ/fonpix/[filename].jpg</imageURL>
Jeder deiner 239 Kontakte ist mit einem Profilbild versehen?
Last but not least: phonebook '5'? Du hast sechs Telefonbücher auf der Box? Wie verhält es sich, wenn Du manuell ein Bild zu einem Kontakt im Tobi hinzufügst?

Black Senator

P.S. https://www.tutonaut.de/anleitung-speicherkarten-und-usb-sticks-von-os-x-muell-befreien/#
 
Zuletzt bearbeitet:
Was meinst Du mit?:
Damit meine ich, dass die Einträge beim Download des Telefonbuches auch nicht im Tag sind! ;-)

Und nein, nicht alle 239 Kontakte hat ein Profilbild, aber sicher 30 - 40...
Und 5 habe ich gewählt, um die bestehenden 3 Telefonbücher nicht zu überschreiben.
Habe es eben aber mal im Standard "Telefonbuch" mit der id 0 ausprobiert, mit gleichem Verhalten... :-(

Interessant ist auch, dass das Script eine FTP Anmeldung an der Box durchführt, das sehe ich im Log der Fritzbox...
 
Hmmmmm,

da kann ich mir keinen Reim drauf machen.

Lass bitte einmal
Code:
php carddav2fb.php download >download.json
laufen.
Bei den Kontakten mit Profilbildern müssten folgende Einträge dabei sein:
Code:
    "rawphoto":
    "photoData":
    "photo":
Vielleicht kannst Du mir den Output von zwei, drei dieser Kontakte anonymisiert per PM senden?

Vielleicht fällt mir dann etwas auf

Black Senator


P.S.:
Und 5 habe ich gewählt, um die bestehenden 3 Telefonbücher nicht zu überschreiben.
Wenn Du drei Telefonbücher hast und "Tobi" das vierte sein soll, dann muss die ID aber "3" sein - nicht "5"! Die Zählweise (Index) beginnt mit "0" - schreibst Du ja auch. Du kannst aber auch "0" nicht "Tobi" nennen - das im speziellen muss schon "Telefonbuch" heißen (m.M.n).
 
Zuletzt bearbeitet:
"rawphoto": "photoData": "photo":
Ich glaube jetzt kommen wir der Sache näher...
In meinem Download sind nur die "photo" Attribute drin. "rawphoto" und "photoData" fehlen gänzlich...
Code:
{
        "version": "3.0",
        "lastname": "",
        "firstname": "",
        "additional": "",
        "prefix": "",
        "suffix": "",
        "fullname": "American Diner Durlach",
        "organization": "American Diner Durlach",
        "phone": {
            "WORK;VOICE;pref": [
                "+49 721\/406171"
            ]
        },
        "address": {
            "WORK;pref": [
                {
                    "name": "",
                    "extended": "",
                    "street": "Fiduciastr. 2",
                    "city": "Karlsruhe",
                    "region": "",
                    "zip": "76227",
                    "country": "Deutschland"
                }
            ]
        },
        "url": {
            "pref": [
                "http:\/\/www.diner-durlach.de"
            ]
        },
        "photo": "https:\/\/p03-contacts.icloud.com:443\/1344255662\/wcs\/01ae2327361d4b985ea23e915fdee9a521d985cb11",
        "revision": "2015-05-16T07:38:05Z",
        "uid": "29F2409D-5BCE-44D4-BF2D-C5BAC487579F"
    }
Sollten die beim Download dabei sein oder generiert die das Script selbst?
 
Sollten die beim Download dabei sein oder generiert die das Script selbst?
Die Logik ist wie folgt:
Im vCard-Attribut "PHOTO" können entweder Rawdaten enthalten sein oder ein Link zu einem anderen Speicherplatz (vermutlich inzwischen Standard für die meisten CardDAV-Server). Beim Download wird überprüft, ob ein Link enthalten ist. Wenn ja, dann werden die Rawdaten vom verlinkten Ort heruntergeladen und in das nur interne Feld rawphoto übertragen und die dazugehörigen Imagedaten (MIME) in das interne Feld photoData.

Dieser Schritt ist deshalb schon im Download erforderlich, weil nur zu dem Zeitpunkt die credentials für die jeweiligen Server verfügbar sind.
Da ja mehrere Server abgefragt werden können, kann im weiteren Programmverlauf bei der Verarbeitung der Daten nicht mehr nachverfolgt werden von welchem Server diese heruntergeladen wurden*. Damit ist auch der Zugriff auf die übertragene Links nicht mehr möglich.

So und nun kommen wir der Sache schon näher: Ich benutze auch iCloud als CardDAV-Server. Bei mir liegen die Images aber auf dem gleichen Server.
Zumindest in dem o.g. Fall trifft das aber nicht zu:
Code:
'url' => 'https://p44-contacts.icloud.com/xxxxxxxxx/carddavhome/card/',

"photo": "https:\/\/p03-contacts.icloud.com:443\/1344255662\/wcs\/01ae2327361d4b985ea23e915fdee9a521d985cb11",

Meiner Erfahrung nach müsste das eigentlich zu einem Error mit GuzzleHttp führen - dann hättest Du es gemerkt. Warum das nicht zu einem Error geführt hat wundert mich.

Spannender ist die Frage, warum die Bilder auf einem anderen Server liegen. Hast Du mal Kontakte zwischen iCloud-Accounts hin- und herkopiert? Z.B. wenn man das mit externen Tools macht, kann dass passieren. Apple intern ist das egal - dass merkt man bei shared Accounts z.B. nicht, wenn man sich gegenseitig iCloud-Zugriff frei gibt.

Teste doch einmal folgendes: Ordne einem Testkontakt im iDevice ein Bild zu und check dann die Daten im Output. Wenn dann die Serveradressen gleich sind, dann muss das Bild auch da sein.

Grüße

Black Senator


* könnte man realisieren - aber bisher gibt es keine zwingende Notwendigkeit
 
Zuletzt bearbeitet:
Ich wollte gerade mal auf meinem Raspi eine Installation vornehmen, es kommt aber ein Fehler:
Code:
composer install   
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 10 installs, 0 updates, 0 removals
  - Installing psr/log (1.1.0): The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952
                                                    
  [ErrorException]                                   
  proc_open(): fork failed - Cannot allocate memory 
                                                    

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--] [<packages>]...
 
Ich teste es mal auf einer anderen Machine
 
Spannender ist die Frage, warum die Bilder auf einem anderen Server liegen. Hast Du mal Kontakte zwischen iCloud-Accounts hin- und herkopiert? Z.B. wenn man das mit externen Tools macht, kann dass passieren. Apple intern ist das egal - dass merkt man bei shared Accounts z.B. nicht, wenn man sich gegenseitig iCloud-Zugriff frei gibt.
Das ist echt interessant! Ich habe jetzt mal meine Kontakte durchgeschaut:
Ich habe 239 Kontakte, davon haben 97 Stück Photos.
92 Stück haben die URL mit p03
5 Stück haben die URL mit p44​
Neu hinzugefügte haben immer p44, gerade getestet. Wobei ich ganz sicher nicht 92 Kontakte über iCloud Freigaben bekommen habe.
Der iCloud Account ist aber schon verdammt alt, das war damals noch ein bezahlter Mobile Me Account... (also weit vor iCloud)
Jetzt habe ich mal noch mti der CardDAV Url herumgespielt.
Es ist völlig egal, ob ich eine der folgenden 3 URLs eingebe -> er ruft immer alle Kontakte ordentlich ab!
Code:
https://p03-contacts.icloud.com/...
https://contacts.icloud.com/...
https://p44-contacts.icloud.com/...
Aber nie überhaupt nur ein Bild... :-(
Ich schau jetzt mal in den Quellcode, vielleicht hilft mir das weiter...

### Zusammenführung Doppelpost by stoney ###

So, der Fehler ist gefunden... :)

Übeltäter ist in der function embedBase64:
Code:
// check if mime is linked onto the same server
        $serv = explode('/', $this->url, 4);                   // get the beginning of the current server adress
        $link = explode('/', $vcard->{$substituteID}, 4);      // get the beginning of the linked adress
        if (strcasecmp($serv[2], $link[2]) !== 0) {            // if they aren´t equal authorisation will fail!
            return $vcard;
        }
In der if condition wird geprüft, ob beide URLs gleich beginnen, damit die Authorisierung klappt!
Damit das funktioniert, muss in der CalDAV URL ein ":443" angehängt werden! :-(
Denn dieses ":443" hängt auch in den photo-Attributen dran!
Das ist mir aufgefallen, als ich zur Laufzeit mal in die Attribute geschaut habe...

Bei iCloud Accounts ist diese Prüfung aber noch unschöner. Wenn ich diese auskommentiere lädt er einfach alle Bilder von beiden unterschiedlichen URLs von mir runter. :)
 
Zuletzt bearbeitet von einem Moderator:
In der if condition wird geprüft, ob beide URLs gleich beginnen, damit die Authorisierung klappt!
Damit das funktioniert, muss in der CalDAV URL ein ":443" angehängt werden! :-(
Denn dieses ":443" hängt auch in den photo-Attributen dran!
Das ist mir aufgefallen, als ich zur Laufzeit mal in die Attribute geschaut habe...

Bei iCloud Accounts ist diese Prüfung aber noch unschöner. Wenn ich diese auskommentiere lädt er einfach alle Bilder von beiden unterschiedlichen URLs von mir runter.

Erstelle doch bitte dazu ein Issue auf GitHub
 
Hallo,

kann ich eigentlich beeinflussen, in welcher Reihenfolge die Rufnummern im Telefonbuch landen?
Ich würde gerne die Nummern so übernehmen, wie sie im Nextcloud-Telbuch stehen / angezeigt werden, jedoch scheint carddav2 diese in dieser Reihenfolge umzusortieren:

Code:
Nextcloud                 ->           Fritzbox
privat, mobil, arbeit     ->           arbeit, privat, mobil

Gruß, Christoph
 
Hallo,

das ist ein Feature, dass wir vor ein paar Wochen implementiert haben. (siehe hier) Du musst einfach in der config die Reihenfolge für die Umschlüsselung der 'phoneTypes' entsprechend in die gewünschte Reihenfolge bringen:

Code:
'phoneTypes' => [ // you mustn´t define 'fax' - this conversion is set fix in code
    'HOME' => 'home',
    'CELL' => 'mobile',
    'WORK' => 'work',
    'MAIN' => 'work',
    'FAX' => 'fax_work',
    '...' => 'home',
    '...' => 'work',
],

Dabei ist es dann unerheblich ob gleiche Zielwerte später noch einmal auftauchen. Das erste "Auftauchen" determiniert die Reihenfolge.

Grüße

Black Senator
 
Moin,

kann man mal sehen, ich habe das Thema länger nicht mehr verfolgt ... es hat ja soweit gut funktioniert, und dieses Thema ist mir erst heute "auf den Tisch" gekommen ...
Danke.

Ich habe jetzt einmal ein Update gemacht - leider bekomme ich jetzt bei einer meiner beiden FBs und Kontaktkonfigs einen Fehler:
Code:
sudo -u carddav2fb php /home/carddav2fb/carddav2fb/carddav2fb.php -c/home/carddav2fb/carddav2fb/config.php -i run
Downloading vCard(s) from account christoph
  136 [============================]
Downloaded 136 vCard(s)
Dissolving groups (e.g. iCloud)
Dissolved 0 group(s)
Filtering 136 vCard(s)
Filtered out 42 vCard(s)
Detaching and uploading image(s)
 94/94 [============================] 100%PHP Warning:  ftp_close(): SSL_read on shutdown: Connection reset by peer (104) in /home/carddav2fb/carddav2fb/src/functions.php on line 139
 94/94 [============================] 100%Uploaded/refreshed 0 of 32 image file(s)

Converted 94 vCard(s)
Uploading
Successful uploaded new Fritz!Box phonebook

Es scheint aber trotzdem übertragen zu werden ...

Gruß, Christoph
 
Zuletzt bearbeitet:
Hi zusammen,

ich habe folgendes Problem... Beim Aufruf von dem Programm wird folgende Fehlermeldung geworfen:

upload_2019-3-28_16-51-3.png

Jemand ne Idee woran das liegen könnte? Ich versuche die Kontakte aus meinem iCloud abzurufen. URL, Passwort habe ich richtig eingegeben.

Danke für Eure Unterstützung.
 
Hallo,

du solltest dazu schreiben, welchen Fork du benutzt und wann Du den Klon auf deinen pi gebracht hast (Releasestand)
ich nehme einmal an, dass Du den von andig meinst.
Welche URL hast Du wie eingegeben? Schau einmal hier ff.

Genau zu dem Thema "out of bounds exception" ist gerade in den letzten Tagen ein Update zum Issue #50 erfolgt. Lies bitte dort einmal nach und eröffne dort ein Issue, wenn dir das nicht weiter hilft.

Grüße

Black Senator
 
Zuletzt bearbeitet:
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.