nextcloud/apps/contacts/import.php

113 lines
3.2 KiB
PHP
Raw Normal View History

2012-01-15 14:40:32 +04:00
<?php
/**
* Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
2012-01-15 14:47:35 +04:00
//check for addressbooks rights or create new one
2012-01-15 14:40:32 +04:00
ob_start();
2012-05-03 14:23:29 +04:00
OCP\JSON::checkLoggedIn();
2012-05-02 21:08:37 +04:00
OCP\App::checkAppEnabled('contacts');
session_write_close();
$cr = "\r";
2012-01-15 14:40:32 +04:00
$nl = "\n";
2012-05-30 01:40:26 +04:00
global $progresskey;
$progresskey = 'contacts.import-' . (isset($_GET['progresskey'])?$_GET['progresskey']:'');
if (isset($_GET['progress']) && $_GET['progress']) {
echo OC_Cache::get($progresskey);
die;
}
function writeProgress($pct) {
global $progresskey;
OC_Cache::set($progresskey, $pct, 300);
2012-01-15 14:40:32 +04:00
}
writeProgress('10');
$view = $file = null;
if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') {
$view = OCP\Files::getStorage('contacts');
$file = $view->file_get_contents('/' . $_POST['file']);
} else {
$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']);
}
if(!$file) {
OCP\JSON::error(array('data' => array('message' => 'Import file was empty.')));
exit();
}
if(isset($_POST['method']) && $_POST['method'] == 'new'){
2012-05-01 20:50:31 +04:00
$id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), $_POST['addressbookname']);
if(!$id) {
OCP\JSON::error(array('data' => array('message' => 'Error creating address book.')));
exit();
}
2012-01-15 14:40:32 +04:00
OC_Contacts_Addressbook::setActive($id, 1);
}else{
$id = $_POST['id'];
if(!$id) {
OCP\JSON::error(array('data' => array('message' => 'Error getting the ID of the address book.')));
exit();
}
OC_Contacts_App::getAddressbook($id); // is owner access check
2012-01-15 14:40:32 +04:00
}
2012-01-15 14:47:35 +04:00
//analyse the contacts file
2012-05-30 01:40:26 +04:00
writeProgress('40');
$lines = explode($nl, $file);
if(count($lines) == 1) { // Mac eol
$lines = explode($cr, $file);
}
2012-01-15 14:40:32 +04:00
$inelement = false;
$parts = array();
2012-05-30 01:40:26 +04:00
$card = array();
foreach($lines as $line){
if(strtoupper(trim($line)) == 'BEGIN:VCARD'){
$inelement = true;
} elseif (strtoupper(trim($line)) == 'END:VCARD') {
$card[] = $line;
2012-05-30 01:40:26 +04:00
$parts[] = implode($nl, $card);
$card = array();
$inelement = false;
2012-01-15 14:40:32 +04:00
}
2012-05-30 01:40:26 +04:00
if ($inelement === true && trim($line) != '') {
$card[] = $line;
2012-01-15 14:40:32 +04:00
}
}
2012-05-30 01:40:26 +04:00
//import the contacts
writeProgress('70');
$imported = 0;
$failed = 0;
2012-05-30 01:40:26 +04:00
if(!count($parts) > 0) {
OCP\JSON::error(array('data' => array('message' => 'No contacts to import in .'.$_POST['file'].' Please check if the file is corrupted.')));
exit();
}
2012-05-30 01:40:26 +04:00
foreach($parts as $part){
$card = OC_VObject::parse($part);
if (!$card) {
$failed += 1;
2012-05-30 01:40:26 +04:00
OCP\Util::writeLog('contacts','Import: skipping card. Error parsing VCard: '.$part, OCP\Util::ERROR);
continue; // Ditch cards that can't be parsed by Sabre.
2012-01-15 14:40:32 +04:00
}
2012-05-30 01:40:26 +04:00
try {
OC_Contacts_VCard::add($id, $card);
$imported += 1;
} catch (Exception $e) {
OCP\Util::writeLog('contacts', 'Error importing vcard: '.$e->getMessage().$nl.$card, OCP\Util::ERROR);
$failed += 1;
}
2012-01-15 14:40:32 +04:00
}
//done the import
writeProgress('100');
2012-01-15 14:40:32 +04:00
sleep(3);
OC_Cache::remove($progresskey);
if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') {
if(!$view->unlink('/' . $_POST['file'])) {
OCP\Util::writeLog('contacts','Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], OCP\Util::ERROR);
}
}
2012-05-03 14:23:29 +04:00
OCP\JSON::success(array('data' => array('imported'=>$imported, 'failed'=>$failed)));