diff --git a/lib/app.php b/lib/app.php index 86587c68..30339f53 100644 --- a/lib/app.php +++ b/lib/app.php @@ -56,7 +56,7 @@ class App { 'ldap' => 'OCA\Contacts\Backend\Ldap', 'local' => 'OCA\Contacts\Backend\Database', 'shared' => 'OCA\Contacts\Backend\Shared', - 'owncloudusers' => 'OCA\Contacts\Backend\OwnCloudUsers', + 'owncloudusers' => 'OCA\Contacts\Backend\OwnCloudUsers', ); public function __construct( diff --git a/lib/backend/owncloudusers.php b/lib/backend/owncloudusers.php index e923ca0a..4918251f 100644 --- a/lib/backend/owncloudusers.php +++ b/lib/backend/owncloudusers.php @@ -6,7 +6,7 @@ use OCA\Contacts\Contact, OCA\Contacts\VObject\VCard, OCA\Contacts\Utils\Properties, Sabre\VObject\Reader, - OCA\Contacts\Addressbook; + OCA\Contacts\Addressbook; /** @@ -17,127 +17,127 @@ use OCA\Contacts\Contact, class OwnCloudUsers extends AbstractBackend { public $name = 'OwnCloudUsers'; - + /** * The table that holds the address books. * For every user there is *1* addressbook. * @var string */ private $addressBooksTableName = '*PREFIX*contacts_ocu_addressbooks'; - + /** * The table that holds the contacts. * @var string */ private $cardsTableName = '*PREFIX*contacts_ocu_cards'; - + public function __construct($userid){ - $this->userid = $userid ? $userid : \OCP\User::getUser(); + $this->userid = $userid ? $userid : \OCP\User::getUser(); } - + /** * {@inheritdoc} */ public function getAddressBooksForUser(array $options = array()) { - // Only 1 addressbook for every user - $sql = 'SELECT * FROM ' . $this->addressBooksTableName . ' WHERE id = ?'; - $args = array($this->userid); - $query = \OCP\DB::prepare($sql); - $result = $query->execute($args); - $row = $result->fetchRow(); + // Only 1 addressbook for every user + $sql = 'SELECT * FROM ' . $this->addressBooksTableName . ' WHERE id = ?'; + $args = array($this->userid); + $query = \OCP\DB::prepare($sql); + $result = $query->execute($args); + $row = $result->fetchRow(); - if(!$row){ // TODO -> better way? - // Create new addressbook - $sql = 'INSERT INTO ' . $this->addressBooksTableName - . ' ( ' - . 'id, ' - . 'displayname, ' - //. 'uri, ' TODO - . 'description, ' - //. 'ctag, ' - . 'active ' - . ') VALUES ( ' - . '?, ' - . '?, ' - . '?, ' - . '? ' - . ')'; - $args = array( - $this->userid, - 'ownCloud Users', - 'ownCloud Users', - 1 - ); - $query = \OCP\DB::prepare($sql); - $query->execute($args); - - return $this->getAddressBooksForUser(); - } else { - $row['permissions'] = \OCP\PERMISSION_ALL; - return array($row); - } + if(!$row){ // TODO -> better way? + // Create new addressbook + $sql = 'INSERT INTO ' . $this->addressBooksTableName + . ' ( ' + . 'id, ' + . 'displayname, ' + //. 'uri, ' TODO + . 'description, ' + //. 'ctag, ' + . 'active ' + . ') VALUES ( ' + . '?, ' + . '?, ' + . '?, ' + . '? ' + . ')'; + $args = array( + $this->userid, + 'ownCloud Users', + 'ownCloud Users', + 1 + ); + $query = \OCP\DB::prepare($sql); + $query->execute($args); + + return $this->getAddressBooksForUser(); + } else { + $row['permissions'] = \OCP\PERMISSION_ALL; + return array($row); + } } - + /** * {@inheritdoc} * Only 1 addressbook for every user */ public function getAddressBook($addressBookId, array $options = array()) { - - $sql = 'SELECT * FROM ' . $this->addressBooksTableName . ' WHERE id = ?'; - $args = array($addressBookId); - $query = \OCP\DB::prepare($sql); - $result = $query->execute($args); - $row = $result->fetchRow(); - $row['permissions'] = \OCP\PERMISSION_ALL; - $row['backend'] = $this->name; - return array($row); + $sql = 'SELECT * FROM ' . $this->addressBooksTableName . ' WHERE id = ?'; + $args = array($addressBookId); + $query = \OCP\DB::prepare($sql); + $result = $query->execute($args); + $row = $result->fetchRow(); + $row['permissions'] = \OCP\PERMISSION_ALL; + $row['backend'] = $this->name; + + return array($row); } - + /** * {@inheritdoc} * There are as many contacts in this addressbook as in this ownCloud installation */ public function getContacts($addressbookid, array $options = array()){ - $contacts = array(); - - $sql = 'SELECT * FROM ' . $this->cardsTableName . ' WHERE owner = ?'; - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($this->userid)); - while($row = $result->fetchRow()){ - $row['permissions'] = \OCP\PERMISSION_ALL; - $contacts[] = $row; - } - - $contactsId = array(); - - foreach($contacts as $contact){ - $contactsId[] = $contact['id']; - } - - $users = \OCP\User::getUsers(); - $recall = false; - - $add = array_diff($users, $contactsId); - $remove = array_diff($contactsId, $users); - if(count($add) > 0){ - $this->addContacts($add, $addressbookid); - $recall = true; - } - - if(count($remove) > 0){ - $this->removeContacts($remove, $addressbookid); - $recall = true; - } - - if($recall === true){ - return $this->getContacts($addressbookid); - } else { - return $contacts; - } + $contacts = array(); + + $sql = 'SELECT * FROM ' . $this->cardsTableName . ' WHERE owner = ?'; + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($this->userid)); + while($row = $result->fetchRow()){ + $row['permissions'] = \OCP\PERMISSION_ALL; + $contacts[] = $row; + } + + $contactsId = array(); + + foreach($contacts as $contact){ + $contactsId[] = $contact['id']; + } + + $users = \OCP\User::getUsers(); + $recall = false; + + $add = array_diff($users, $contactsId); + $remove = array_diff($contactsId, $users); + if(count($add) > 0){ + $this->addContacts($add, $addressbookid); + $recall = true; + } + + if(count($remove) > 0){ + $this->removeContacts($remove, $addressbookid); + $recall = true; + } + + if($recall === true){ + return $this->getContacts($addressbookid); + } else { + return $contacts; + } } - + /** * {@inheritdoc} * If your username is "admin" and you want to retrieve your own contact @@ -146,20 +146,20 @@ class OwnCloudUsers extends AbstractBackend { * ownCloud username 'bar' the params would be: $addressbookid = 'foo'; $id = 'bar'; */ public function getContact($addressbookid, $id, array $options = array()){ - $sql = 'SELECT * FROM ' . $this->cardsTableName . ' WHERE owner = ?'; - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($this->userid)); - $row = $result->fetchRow(); - $row['permissions'] = \OCP\PERMISSION_ALL; - - return $row; + $sql = 'SELECT * FROM ' . $this->cardsTableName . ' WHERE owner = ?'; + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($this->userid)); + $row = $result->fetchRow(); + $row['permissions'] = \OCP\PERMISSION_ALL; + + return $row; } - + // Not needed since there is only one addressbook for every user public function createAddressBook(array $properties) { - + } - + /** * Help function to add contacts to an addressbook. * This only happens when an admin creates new users @@ -168,43 +168,43 @@ class OwnCloudUsers extends AbstractBackend { * @return bool */ private function addContacts($contacts, $addressbookid){ - foreach($contacts as $user){ - $sql = 'INSERT INTO ' . $this->cardsTableName . ' (' - . 'id, ' - . 'owner,' - . 'addressbookid, ' - . 'fullname, ' - . 'carddata, ' - . 'uri, ' - . 'lastmodified' - . ') VALUES (' - . '?,' - . '?,' - . '?,' - . '?,' - . '?,' - . '?,' - . '?' - . ')'; - - $query = \OCP\DB::prepare($sql); + foreach($contacts as $user){ + $sql = 'INSERT INTO ' . $this->cardsTableName . ' (' + . 'id, ' + . 'owner,' + . 'addressbookid, ' + . 'fullname, ' + . 'carddata, ' + . 'uri, ' + . 'lastmodified' + . ') VALUES (' + . '?,' + . '?,' + . '?,' + . '?,' + . '?,' + . '?,' + . '?' + . ')'; - $contact = new Contact( - $addressBook = new AddressBook($this , $this->getAddressBooksForUser()), // since there is only one addressbook with OC users for each OC user we can use this function - $this, - array( - "id" => $user, - "lastmodified" => time(), - "displayname" => \OCP\User::getDisplayName($user), - "fullname" => \OCP\User::getDisplayName($user) - ) - ); - $carddata = $this->generateCardData($contact); - $result = $query->execute(array($user, $this->userid, $addressbookid, \OCP\User::getDisplayName($user), $carddata->serialize(), 'test', time())); - // TODO Check if $result succeeded - } + $query = \OCP\DB::prepare($sql); + + $contact = new Contact( + $addressBook = new AddressBook($this , $this->getAddressBooksForUser()), // since there is only one addressbook with OC users for each OC user we can use this function + $this, + array( + "id" => $user, + "lastmodified" => time(), + "displayname" => \OCP\User::getDisplayName($user), + "fullname" => \OCP\User::getDisplayName($user) + ) + ); + $carddata = $this->generateCardData($contact); + $result = $query->execute(array($user, $this->userid, $addressbookid, \OCP\User::getDisplayName($user), $carddata->serialize(), 'test', time())); + // TODO Check if $result succeeded + } } - + /** * Help function to remove contacts from an addressbook. * This only happens when an admin remove an ownCloud user @@ -213,104 +213,104 @@ class OwnCloudUsers extends AbstractBackend { * @return bool */ private function removeContacts($contacts, $addressbookid){ - foreach($contacts as $user){ - $sql = 'DELETE FROM ' . $this->cardsTableName . ' WHERE owner = ? AND id = ?'; - - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($this->userid, $user)); - // TODO Check if $result succeeded - } + foreach($contacts as $user){ + $sql = 'DELETE FROM ' . $this->cardsTableName . ' WHERE owner = ? AND id = ?'; + + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($this->userid, $user)); + // TODO Check if $result succeeded + } } - + /** * Help function to generate the carddate which than can be stored in the db * @param string|VCard $data * @return Vcard */ private function generateCardData($data){ - if (!$data instanceof VCard) { - try { - $data = Reader::read($data); - } catch(\Exception $e) { - \OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), \OCP\Util::ERROR); - return false; - } - } + if (!$data instanceof VCard) { + try { + $data = Reader::read($data); + } catch(\Exception $e) { + \OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), \OCP\Util::ERROR); + return false; + } + } - try { - $data->validate(VCard::REPAIR|VCard::UPGRADE); - } catch (\Exception $e) { - \OCP\Util::writeLog('contacts', __METHOD__ . ' ' . - 'Error validating vcard: ' . $e->getMessage(), \OCP\Util::ERROR); - return false; - } + try { + $data->validate(VCard::REPAIR|VCard::UPGRADE); + } catch (\Exception $e) { + \OCP\Util::writeLog('contacts', __METHOD__ . ' ' . + 'Error validating vcard: ' . $e->getMessage(), \OCP\Util::ERROR); + return false; + } - $now = new \DateTime; - $data->REV = $now->format(\DateTime::W3C); + $now = new \DateTime; + $data->REV = $now->format(\DateTime::W3C); - $appinfo = \OCP\App::getAppInfo('contacts'); - $appversion = \OCP\App::getAppVersion('contacts'); - $prodid = '-//ownCloud//NONSGML ' . $appinfo['name'] . ' ' . $appversion.'//EN'; - $data->PRODID = $prodid; - - return $data; + $appinfo = \OCP\App::getAppInfo('contacts'); + $appversion = \OCP\App::getAppVersion('contacts'); + $prodid = '-//ownCloud//NONSGML ' . $appinfo['name'] . ' ' . $appversion.'//EN'; + $data->PRODID = $prodid; + + return $data; } - + /** * @inheritdoc */ public function updateContact($addressBookId, $id, $contact, array $options = array()) { - $updateRevision = true; - $isCardDAV = false; + $updateRevision = true; + $isCardDAV = false; - if (!$contact instanceof VCard) { - try { - $contact = Reader::read($contact); - } catch(\Exception $e) { - \OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), \OCP\Util::ERROR); - return false; - } - } + if (!$contact instanceof VCard) { + try { + $contact = Reader::read($contact); + } catch(\Exception $e) { + \OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), \OCP\Util::ERROR); + return false; + } + } - if (is_array($id)) { - if (isset($id['id'])) { - $id = $id['id']; - } elseif (isset($id['uri'])) { - $updateRevision = false; - $isCardDAV = true; - $id = $this->getIdFromUri($id['uri']); + if (is_array($id)) { + if (isset($id['id'])) { + $id = $id['id']; + } elseif (isset($id['uri'])) { + $updateRevision = false; + $isCardDAV = true; + $id = $this->getIdFromUri($id['uri']); - if (is_null($id)) { - \OCP\Util::writeLog('contacts', __METHOD__ . ' Couldn\'t find contact', \OCP\Util::ERROR); - return false; - } + if (is_null($id)) { + \OCP\Util::writeLog('contacts', __METHOD__ . ' Couldn\'t find contact', \OCP\Util::ERROR); + return false; + } - } else { - throw new \Exception( - __METHOD__ . ' If second argument is an array, either \'id\' or \'uri\' has to be set.' - ); - } - } + } else { + throw new \Exception( + __METHOD__ . ' If second argument is an array, either \'id\' or \'uri\' has to be set.' + ); + } + } - if ($updateRevision || !isset($contact->REV)) { - $now = new \DateTime; - $contact->REV = $now->format(\DateTime::W3C); - } + if ($updateRevision || !isset($contact->REV)) { + $now = new \DateTime; + $contact->REV = $now->format(\DateTime::W3C); + } - $data = $contact->serialize(); - - $sql = 'UPDATE ' . $this->cardsTableName - . ' SET ' - . '`addressbookid` = ?, ' - . '`fullname` = ?, ' - . '`carddata` = ?, ' - . '`lastmodified` = ? ' - . ' WHERE ' - . '`id` = ? ' - . 'AND `owner` = ? '; - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array($addressBookId, $contact->FN, $data, time(), $id, $this->userid)); - return true; + $data = $contact->serialize(); + + $sql = 'UPDATE ' . $this->cardsTableName + . ' SET ' + . '`addressbookid` = ?, ' + . '`fullname` = ?, ' + . '`carddata` = ?, ' + . '`lastmodified` = ? ' + . ' WHERE ' + . '`id` = ? ' + . 'AND `owner` = ? '; + $query = \OCP\DB::prepare($sql); + $result = $query->execute(array($addressBookId, $contact->FN, $data, time(), $id, $this->userid)); + return true; } }