Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
schiessle committed Nov 14, 2016
1 parent 26e0061 commit f8b6bc8
Show file tree
Hide file tree
Showing 8 changed files with 291 additions and 88 deletions.
10 changes: 10 additions & 0 deletions apps/dav/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ public function registerHooks() {
}
});

$dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) {
$user = $event->getSubject();
$syncService = $this->getContainer()->query(SyncService::class);
$syncService->updateUser($user);
});

$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendar', function(GenericEvent $event) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
Expand Down Expand Up @@ -126,6 +132,10 @@ public function registerHooks() {
);
});

$dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) {
error_log("hello");
});

$listener = function(GenericEvent $event, $eventName) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
Expand Down
148 changes: 112 additions & 36 deletions apps/dav/lib/CardDAV/Converter.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,80 +22,152 @@

namespace OCA\DAV\CardDAV;

use OC\Accounts\AccountManager;
use OCP\IImage;
use OCP\IUser;
use OpenCloud\ObjectStore\Resource\Account;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property\Text;

class Converter {

/** @var AccountManager */
private $accountManager;

/**
* Converter constructor.
*
* @param AccountManager $accountManager
*/
public function __construct(AccountManager $accountManager) {

$this->accountManager = $accountManager;

}

/**
* @param IUser $user
* @return VCard
* @return VCard|null
*/
public function createCardFromUser(IUser $user) {

$userData = $this->accountManager->getUser($user);

$uid = $user->getUID();
$displayName = $user->getDisplayName();
$displayName = empty($displayName ) ? $uid : $displayName;
$emailAddress = $user->getEMailAddress();
$cloudId = $user->getCloudId();
$image = $this->getAvatarImage($user);

$vCard = new VCard();
$vCard->add(new Text($vCard, 'UID', $uid));
if (!empty($displayName)) {
$vCard->add(new Text($vCard, 'FN', $displayName));
$vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName)));
}
if (!empty($emailAddress)) {
$vCard->add(new Text($vCard, 'EMAIL', $emailAddress, ['TYPE' => 'OTHER']));

$publish = false;

foreach ($userData as $property => $value) {
if ($value['scope'] === AccountManager::VISIBILITY_CONTACTS_ONLY ||
$value['scope'] === AccountManager::VISIBILITY_PUBLIC
) {
$publish = true;
switch ($property) {
case AccountManager::PROPERTY_DISPLAYNAME:
$vCard->add(new Text($vCard, 'FN', $value['value']));
$vCard->add(new Text($vCard, 'N', $this->splitFullName($value['value'])));
break;
case AccountManager::PROPERTY_AVATAR:
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
break;
case AccountManager::PROPERTY_EMAIL:
$vCard->add(new Text($vCard, 'EMAIL', $value['value'], ['TYPE' => 'OTHER']));
break;
case AccountManager::PROPERTY_WEBSITE:
$vCard->add(new Text($vCard, 'URL', $value['value']));
break;
case AccountManager::PROPERTY_PHONE:
$vCard->add(new Text($vCard, 'TEL', $value['value'], ['TYPE' => 'OTHER']));
break;
case AccountManager::PROPERTY_ADDRESS:
$vCard->add(new Text($vCard, 'ADR', $value['value'], ['TYPE' => 'OTHER']));
break;
}
}
}
if (!empty($cloudId)) {

if ($publish && !empty($cloudId)) {
$vCard->add(new Text($vCard, 'CLOUD', $cloudId));
$vCard->validate();
return $vCard;
}
if ($image) {
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
}
$vCard->validate();

return $vCard;
return null;
}

/**
* @param VCard $vCard
* @param IUser $user
* @return bool
* @return array
*/
public function updateCard(VCard $vCard, IUser $user) {
$uid = $user->getUID();
$displayName = $user->getDisplayName();
$displayName = empty($displayName ) ? $uid : $displayName;
$emailAddress = $user->getEMailAddress();

$userData =$this->accountManager->getUser($user);
$cloudId = $user->getCloudId();
$image = $this->getAvatarImage($user);

$publish = false;
$updated = false;
if($this->propertyNeedsUpdate($vCard, 'FN', $displayName)) {
$vCard->FN = new Text($vCard, 'FN', $displayName);
unset($vCard->N);
$vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName)));
$updated = true;
}
if($this->propertyNeedsUpdate($vCard, 'EMAIL', $emailAddress)) {
$vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress);
$updated = true;

foreach ($userData as $property => $value) {
if ($value['scope'] === AccountManager::VISIBILITY_CONTACTS_ONLY ||
$value['scope'] === AccountManager::VISIBILITY_PUBLIC
) {
$publish = true;
switch ($property) {
case AccountManager::PROPERTY_DISPLAYNAME:
if($this->propertyNeedsUpdate($vCard, 'FN', $value['value'])) {
$vCard->FN = new Text($vCard, 'FN', $value['value']);
unset($vCard->N);
$vCard->add(new Text($vCard, 'N', $this->splitFullName($value['value'])));
$updated = true;
}
break;
case AccountManager::PROPERTY_AVATAR:
if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) {
unset($vCard->PHOTO);
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
$updated = true;
}
break;
case AccountManager::PROPERTY_EMAIL:
if($this->propertyNeedsUpdate($vCard, 'EMAIL', $value['value'])) {
$vCard->EMAIL = new Text($vCard, 'EMAIL', $value['value']);
$updated = true;
}
break;
case AccountManager::PROPERTY_WEBSITE:
if($this->propertyNeedsUpdate($vCard, 'URL', $value['value'])) {
$vCard->URL = new Text($vCard, 'URL', $value['value']);
$updated = true;
}
break;
case AccountManager::PROPERTY_PHONE:
if($this->propertyNeedsUpdate($vCard, 'URL', $value['value'])) {
$vCard->TEL = new Text($vCard, 'TEL', $value['value'], ['TYPE' => 'OTHER']);
$updated = true;
}
break;
case AccountManager::PROPERTY_ADDRESS:
if($this->propertyNeedsUpdate($vCard, 'URL', $value['value'])) {
$vCard->ADR = new Text($vCard, 'ADR', $value['value'], ['TYPE' => 'OTHER']);
$updated = true;
}
break;
}
}
}

if($this->propertyNeedsUpdate($vCard, 'CLOUD', $cloudId)) {
$vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId);
$updated = true;
}

if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) {
unset($vCard->PHOTO);
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
$updated = true;
}

if (empty($emailAddress) && !is_null($vCard->EMAIL)) {
unset($vCard->EMAIL);
Expand All @@ -110,7 +182,11 @@ public function updateCard(VCard $vCard, IUser $user) {
$updated = true;
}

return $updated;
if ($publish === false) {
$updated = false;
}

return [$updated, $publish];
}

/**
Expand Down
26 changes: 22 additions & 4 deletions apps/dav/lib/CardDAV/SyncService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

namespace OCA\DAV\CardDAV;

use OC\Accounts\AccountManager;
use OCP\AppFramework\Http;
use OCP\ILogger;
use OCP\IUser;
Expand All @@ -48,10 +49,22 @@ class SyncService {
/** @var array */
private $localSystemAddressBook;

public function __construct(CardDavBackend $backend, IUserManager $userManager, ILogger $logger) {
/** @var AccountManager */
private $accountManager;

/**
* SyncService constructor.
*
* @param CardDavBackend $backend
* @param IUserManager $userManager
* @param ILogger $logger
* @param AccountManager $accountManager
*/
public function __construct(CardDavBackend $backend, IUserManager $userManager, ILogger $logger, AccountManager $accountManager) {
$this->backend = $backend;
$this->userManager = $userManager;
$this->logger = $logger;
$this->accountManager = $accountManager;
}

/**
Expand Down Expand Up @@ -215,19 +228,24 @@ private function parseMultiStatus($body) {
public function updateUser($user) {
$systemAddressBook = $this->getLocalSystemAddressBook();
$addressBookId = $systemAddressBook['id'];
$converter = new Converter();
$converter = new Converter($this->accountManager);
$name = $user->getBackendClassName();
$userId = $user->getUID();

$cardId = "$name:$userId.vcf";
$card = $this->backend->getCard($addressBookId, $cardId);
if ($card === false) {
$vCard = $converter->createCardFromUser($user);
$this->backend->createCard($addressBookId, $cardId, $vCard->serialize());
if ($vCard !== null) {
$this->backend->createCard($addressBookId, $cardId, $vCard->serialize());
}
} else {
$vCard = Reader::read($card['carddata']);
if ($converter->updateCard($vCard, $user)) {
list($updated, $publish) = $converter->updateCard($vCard, $user);
if ($updated === true) {
$this->backend->updateCard($addressBookId, $cardId, $vCard->serialize());
} elseif ($publish === false) {
$this->backend->deleteCard($addressBookId, $cardId);
}
}
}
Expand Down
9 changes: 8 additions & 1 deletion apps/dav/lib/HookManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
use OCP\IUser;
use OCP\IUserManager;
use OCP\Util;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;

class HookManager {

Expand All @@ -51,14 +53,19 @@ class HookManager {
/** @var array */
private $addressBooksToDelete;

/** @var EventDispatcher */
private $eventDispatcher;

public function __construct(IUserManager $userManager,
SyncService $syncService,
CalDavBackend $calDav,
CardDavBackend $cardDav) {
CardDavBackend $cardDav,
EventDispatcher $eventDispatcher) {
$this->userManager = $userManager;
$this->syncService = $syncService;
$this->calDav = $calDav;
$this->cardDav = $cardDav;
$this->eventDispatcher = $eventDispatcher;
}

public function setup() {
Expand Down
Loading

0 comments on commit f8b6bc8

Please sign in to comment.