Davical: Unterschied zwischen den Versionen
Aus SchnallIchNet
Cbs (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Setup == since the documentation is quite good, look at project page for installation.<br/> http://davical.org == Hints == Some hints regarding davical... …“) |
Cbs (Diskussion | Beiträge) |
||
Zeile 10: | Zeile 10: | ||
− | == bind == | + | === bind === |
create bindings: | create bindings: | ||
Zeile 17: | Zeile 17: | ||
--url 'https://davical.example.com/caldav.php/user1/' \ | --url 'https://davical.example.com/caldav.php/user1/' \ | ||
-d '<?xml version="1.0" encoding="utf-8"?> <bind xmlns="DAV:"><segment>collection</segment> <href>/caldav.php/sourceprincipal/collection</href> </bind>'; | -d '<?xml version="1.0" encoding="utf-8"?> <bind xmlns="DAV:"><segment>collection</segment> <href>/caldav.php/sourceprincipal/collection</href> </bind>'; | ||
+ | |||
+ | |||
+ | === cardDAV mass import === | ||
+ | |||
+ | because it's bullshit filling every card by the phone or carddavMATE i wrote a simple importer in php...<br/> | ||
+ | tested with a .vcf-File exported from my email-client btw. from my iPhone/iTunes<br/> | ||
+ | |||
+ | {{Achtung|Make sure the .vcf-file has std. unix line-endings}} | ||
+ | |||
+ | |||
+ | you may run the file from command-line: | ||
+ | |||
+ | php /path/to/davicalVcfImporter.php /path/to/your/contacts-file.vcf | ||
+ | |||
+ | |||
+ | or put it to the webroot of any webserver: | ||
+ | |||
+ | http://localhost/davicalVcfImporter.php?vcfFileName=/path/to/your/contacts-file.vcf | ||
+ | |||
+ | if you use the webserver method of calling the script, make sure the file is accessable and readable <br/> | ||
+ | by the user running your httpd! | ||
+ | |||
+ | <pre> | ||
+ | <?php | ||
+ | |||
+ | /** | ||
+ | * CarddavImporter | ||
+ | * for CalDAV Server - daviCal | ||
+ | * | ||
+ | * (may be works with other servers with little modifications) | ||
+ | * | ||
+ | * @package davical-carddav-import | ||
+ | * @copyright Christoph Steidl <chris@rubbish.de> | ||
+ | * @license http://gnu.org/copyleft/gpl.html GNU GPL V2 | ||
+ | */ | ||
+ | |||
+ | /// configuration | ||
+ | $user = 'USERNAME'; | ||
+ | $pass = 'securePASSWORD'; | ||
+ | $cardsCollection = 'contacts'; | ||
+ | $serverURL = 'https://caldav.example.com/caldav.php/' . $user . '/' . $cardsCollection; | ||
+ | |||
+ | if(PHP_SAPI === 'cli') { | ||
+ | $vcfFileName = $argv[1]; | ||
+ | } else { | ||
+ | $vcfFileName = $_REQUEST['vcfFileName']; | ||
+ | } | ||
+ | |||
+ | $vcfFile = file_get_contents($vcfFileName); | ||
+ | $is_multivcard = false; | ||
+ | |||
+ | class uuid { | ||
+ | protected $uuidobject; | ||
+ | |||
+ | protected function create() { | ||
+ | if(!is_resource($this->uuidobject)) | ||
+ | uuid_create(&$this->uuidobject); | ||
+ | } | ||
+ | |||
+ | public function v4() { | ||
+ | $this->create(); | ||
+ | uuid_make($this->uuidobject, UUID_MAKE_V4); | ||
+ | uuid_export($this->uuidobject, UUID_FMT_STR, &$uuidstring); | ||
+ | return trim($uuidstring); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function vcard_split($vcf) { | ||
+ | $result = array(); | ||
+ | $is_started = false; | ||
+ | $is_finished = false; | ||
+ | $cardcnt = 0; | ||
+ | |||
+ | foreach($vcf as $line) { | ||
+ | if($is_started === false) { | ||
+ | if(preg_match('/BEGIN:VCARD/', $line) > 0) { | ||
+ | $is_started = true; | ||
+ | $cardcnt = $cardcnt + 1; | ||
+ | } | ||
+ | } else if($is_started === true && $is_finished === false) { | ||
+ | if(preg_match('/END:VCARD/', $line) > 0) { | ||
+ | $is_finished = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if($is_started === true && $is_finished === false) { | ||
+ | $result[$cardcnt] .= $line; | ||
+ | } else if($is_started === true && $is_finished === true) { | ||
+ | $is_started = false; | ||
+ | $is_finished = false; | ||
+ | $uuid = new uuid; | ||
+ | $UID = $uuid->v4(); | ||
+ | |||
+ | $result[$cardcnt] .= "UID:$UID\n"; | ||
+ | $result[$cardcnt] .= "PRODID:-//SiliconHome IT-Systems//CardDavImporter 0.1.0//EN\n"; | ||
+ | $result[$cardcnt] .= $line; // <-- this should be 'END:VCARD' | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return $result; | ||
+ | } | ||
+ | |||
+ | $begin_cnt = preg_match_all('/BEGIN:VCARD/', $vcfFile, $matches); | ||
+ | $end_cnt = preg_match_all('/END:VCARD/', $vcfFile, $matches); | ||
+ | |||
+ | // verry simple validation of file | ||
+ | // TODO: should be checked against RFC or so... | ||
+ | if($begin_cnt > 0) { | ||
+ | if($begin_cnt == $end_cnt) { | ||
+ | if($begin_cnt > 1) { | ||
+ | $is_multivcard = true; | ||
+ | } else { | ||
+ | $is_multivcard = false; | ||
+ | } | ||
+ | } else { | ||
+ | echo "Counted BEGIN:VCARD are not equal counted END:VCARD"; | ||
+ | exit(2); | ||
+ | } | ||
+ | } else { | ||
+ | echo "No VCARD-File?? BEGIN:VCARD not found in file..."; | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | // create a single string | ||
+ | $vcfFile = file($vcfFileName); | ||
+ | |||
+ | // split cards if multiple cards in file | ||
+ | if($is_multivcard === true) { | ||
+ | $cards = vcard_split($vcfFile); | ||
+ | } else { | ||
+ | $cards[0] = $vcfFile; | ||
+ | } | ||
+ | |||
+ | // now we have one card per array member... | ||
+ | // storing it to davical-carddav... | ||
+ | foreach($cards as $vcard) { | ||
+ | $fileName = hash( 'sha256', $vcard . time(void) ) . ".vcf"; | ||
+ | |||
+ | $url = $serverURL . "/" . $fileName; | ||
+ | $ch = curl_init(); | ||
+ | curl_setopt($ch, CURLOPT_URL, "$url"); | ||
+ | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | ||
+ | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | ||
+ | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | ||
+ | // post vals | ||
+ | curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/vcard; charset="UTF-8"', 'Content-Length: ' . strlen($vcard))); | ||
+ | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); | ||
+ | curl_setopt($ch, CURLOPT_POSTFIELDS, $vcard); | ||
+ | curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass"); | ||
+ | // exec request | ||
+ | $chresponse = curl_exec($ch); | ||
+ | $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); | ||
+ | curl_close($ch); | ||
+ | |||
+ | // TODO: check curl-status | ||
+ | } | ||
+ | |||
+ | // you want to see what was imported? | ||
+ | // comment in next 2 lines | ||
+ | //print_r( $cards ); | ||
+ | //print "\n"; | ||
+ | |||
+ | exit(0); | ||
+ | |||
+ | ?> | ||
+ | </pre> |
Version vom 23. Dezember 2011, 14:58 Uhr
Inhaltsverzeichnis
Setup
since the documentation is quite good, look at project page for installation.
http://davical.org
Hints
Some hints regarding davical...
bind
create bindings:
curl --basic --user 'user1' -X BIND -H 'Content-Type: text/xml; charset="UTF-8"' \ --url 'https://davical.example.com/caldav.php/user1/' \ -d '<?xml version="1.0" encoding="utf-8"?> <bind xmlns="DAV:"><segment>collection</segment> <href>/caldav.php/sourceprincipal/collection</href> </bind>';
cardDAV mass import
because it's bullshit filling every card by the phone or carddavMATE i wrote a simple importer in php...
tested with a .vcf-File exported from my email-client btw. from my iPhone/iTunes
Make sure the .vcf-file has std. unix line-endings |
you may run the file from command-line:
php /path/to/davicalVcfImporter.php /path/to/your/contacts-file.vcf
or put it to the webroot of any webserver:
http://localhost/davicalVcfImporter.php?vcfFileName=/path/to/your/contacts-file.vcf
if you use the webserver method of calling the script, make sure the file is accessable and readable
by the user running your httpd!
<?php /** * CarddavImporter * for CalDAV Server - daviCal * * (may be works with other servers with little modifications) * * @package davical-carddav-import * @copyright Christoph Steidl <chris@rubbish.de> * @license http://gnu.org/copyleft/gpl.html GNU GPL V2 */ /// configuration $user = 'USERNAME'; $pass = 'securePASSWORD'; $cardsCollection = 'contacts'; $serverURL = 'https://caldav.example.com/caldav.php/' . $user . '/' . $cardsCollection; if(PHP_SAPI === 'cli') { $vcfFileName = $argv[1]; } else { $vcfFileName = $_REQUEST['vcfFileName']; } $vcfFile = file_get_contents($vcfFileName); $is_multivcard = false; class uuid { protected $uuidobject; protected function create() { if(!is_resource($this->uuidobject)) uuid_create(&$this->uuidobject); } public function v4() { $this->create(); uuid_make($this->uuidobject, UUID_MAKE_V4); uuid_export($this->uuidobject, UUID_FMT_STR, &$uuidstring); return trim($uuidstring); } } function vcard_split($vcf) { $result = array(); $is_started = false; $is_finished = false; $cardcnt = 0; foreach($vcf as $line) { if($is_started === false) { if(preg_match('/BEGIN:VCARD/', $line) > 0) { $is_started = true; $cardcnt = $cardcnt + 1; } } else if($is_started === true && $is_finished === false) { if(preg_match('/END:VCARD/', $line) > 0) { $is_finished = true; } } if($is_started === true && $is_finished === false) { $result[$cardcnt] .= $line; } else if($is_started === true && $is_finished === true) { $is_started = false; $is_finished = false; $uuid = new uuid; $UID = $uuid->v4(); $result[$cardcnt] .= "UID:$UID\n"; $result[$cardcnt] .= "PRODID:-//SiliconHome IT-Systems//CardDavImporter 0.1.0//EN\n"; $result[$cardcnt] .= $line; // <-- this should be 'END:VCARD' } } return $result; } $begin_cnt = preg_match_all('/BEGIN:VCARD/', $vcfFile, $matches); $end_cnt = preg_match_all('/END:VCARD/', $vcfFile, $matches); // verry simple validation of file // TODO: should be checked against RFC or so... if($begin_cnt > 0) { if($begin_cnt == $end_cnt) { if($begin_cnt > 1) { $is_multivcard = true; } else { $is_multivcard = false; } } else { echo "Counted BEGIN:VCARD are not equal counted END:VCARD"; exit(2); } } else { echo "No VCARD-File?? BEGIN:VCARD not found in file..."; exit(1); } // create a single string $vcfFile = file($vcfFileName); // split cards if multiple cards in file if($is_multivcard === true) { $cards = vcard_split($vcfFile); } else { $cards[0] = $vcfFile; } // now we have one card per array member... // storing it to davical-carddav... foreach($cards as $vcard) { $fileName = hash( 'sha256', $vcard . time(void) ) . ".vcf"; $url = $serverURL . "/" . $fileName; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "$url"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // post vals curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/vcard; charset="UTF-8"', 'Content-Length: ' . strlen($vcard))); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, $vcard); curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass"); // exec request $chresponse = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // TODO: check curl-status } // you want to see what was imported? // comment in next 2 lines //print_r( $cards ); //print "\n"; exit(0); ?>