From dad6470baa817a796de7e1b6d27daf6d24519096 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 25 Nov 2015 21:44:36 +0100 Subject: Add IUser::getAvatarImage() for easy access --- lib/private/avatar.php | 4 +++- lib/private/user/user.php | 28 +++++++++++++++++++++++++++- lib/public/iuser.php | 9 +++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/private/avatar.php b/lib/private/avatar.php index 872da35f947..37a813f3ff8 100644 --- a/lib/private/avatar.php +++ b/lib/private/avatar.php @@ -79,7 +79,9 @@ class Avatar implements \OCP\IAvatar { /** @var File $node */ $node = $this->folder->get('avatar.' . $ext); $avatar->loadFromData($node->getContent()); - $avatar->resize($size); + if ($size > 0) { + $avatar->resize($size); + } $this->folder->newFile('avatar.' . $size . '.' . $ext)->putContent($avatar->data()); } return $avatar; diff --git a/lib/private/user/user.php b/lib/private/user/user.php index 2740b25d5d3..023fc5f5a32 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -30,6 +30,8 @@ namespace OC\User; use OC\Hooks\Emitter; +use OCP\IAvatarManager; +use OCP\IImage; use OCP\IUser; use OCP\IConfig; @@ -74,17 +76,21 @@ class User implements IUser { */ private $config; + /** @var IAvatarManager */ + private $avatarManager; + /** * @param string $uid * @param \OC_User_Interface $backend * @param \OC\Hooks\Emitter $emitter * @param \OCP\IConfig $config */ - public function __construct($uid, $backend, $emitter = null, IConfig $config = null) { + public function __construct($uid, $backend, $emitter = null, IConfig $config = null, $avatarManager = null) { $this->uid = $uid; $this->backend = $backend; $this->emitter = $emitter; $this->config = $config; + $this->avatarManager = $avatarManager; if ($this->config) { $enabled = $this->config->getUserValue($uid, 'core', 'enabled', 'true'); $this->enabled = ($enabled === 'true'); @@ -93,6 +99,9 @@ class User implements IUser { $this->enabled = true; $this->lastLogin = \OC::$server->getConfig()->getUserValue($uid, 'login', 'lastLogin', 0); } + if (is_null($this->avatarManager)) { + $this->avatarManager = \OC::$server->getAvatarManager(); + } } /** @@ -316,4 +325,21 @@ class User implements IUser { public function getEMailAddress() { return $this->config->getUserValue($this->uid, 'settings', 'email'); } + + /** + * get the avatar image if it exists + * + * @param int $size + * @return IImage|null + * @since 9.0.0 + */ + public function getAvatarImage($size) { + $avatar = $this->avatarManager->getAvatar($this->uid); + $image = $avatar->get(-1); + if ($image) { + return $image; + } + + return null; + } } diff --git a/lib/public/iuser.php b/lib/public/iuser.php index 1e52cd59036..f6caef2ba1b 100644 --- a/lib/public/iuser.php +++ b/lib/public/iuser.php @@ -152,4 +152,13 @@ interface IUser { * @since 9.0.0 */ public function getEMailAddress(); + + /** + * get the avatar image if it exists + * + * @param int $size + * @return IImage|null + * @since 9.0.0 + */ + public function getAvatarImage($size); } -- cgit v1.2.3 From df6fc6cc70ceb06e0b9d8a7ff9ce4cbf2f74e710 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Mon, 30 Nov 2015 13:57:54 +0100 Subject: Add the user's cloud id to the vCard --- apps/dav/command/syncsystemaddressbook.php | 6 +++ apps/files_sharing/lib/helper.php | 16 ------- apps/files_sharing/settings-personal.php | 4 +- lib/private/user/user.php | 67 +++++++++++++++++++----------- lib/public/iuser.php | 8 ++++ tests/lib/contacts/localadressbook.php | 3 ++ 6 files changed, 60 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/apps/dav/command/syncsystemaddressbook.php b/apps/dav/command/syncsystemaddressbook.php index acf9e869d09..74d8295e77b 100644 --- a/apps/dav/command/syncsystemaddressbook.php +++ b/apps/dav/command/syncsystemaddressbook.php @@ -49,6 +49,10 @@ class SyncSystemAddressBook extends Command { ->setDescription('Synchronizes users to the system addressbook'); } + /** + * @param InputInterface $input + * @param OutputInterface $output + */ protected function execute(InputInterface $input, OutputInterface $output) { $principalBackend = new Principal( $this->config, @@ -72,6 +76,7 @@ class SyncSystemAddressBook extends Command { $userId = $user->getUID(); $displayName = $user->getDisplayName(); $emailAddress = $user->getEMailAddress(); + $cloudId = $user->getCloudId(); $image = $user->getAvatarImage(-1); $cardId = "$name:$userId.vcf"; @@ -81,6 +86,7 @@ class SyncSystemAddressBook extends Command { $vCard->add(new Text($vCard, 'UID', $userId)); $vCard->add(new Text($vCard, 'FN', $displayName)); $vCard->add(new Text($vCard, 'EMAIL', $emailAddress)); + $vCard->add(new Text($vCard, 'CLOUD', $cloudId)); if ($image) { $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]); } diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php index a804737c490..391b491e1ff 100644 --- a/apps/files_sharing/lib/helper.php +++ b/apps/files_sharing/lib/helper.php @@ -310,20 +310,4 @@ class Helper { \OC::$server->getConfig()->setSystemValue('share_folder', $shareFolder); } - /** - * remove protocol from URL - * - * @param string $url - * @return string - */ - public static function removeProtocolFromUrl($url) { - if (strpos($url, 'https://') === 0) { - return substr($url, strlen('https://')); - } else if (strpos($url, 'http://') === 0) { - return substr($url, strlen('http://')); - } - - return $url; - } - } diff --git a/apps/files_sharing/settings-personal.php b/apps/files_sharing/settings-personal.php index deaa7b92ac7..85fad9c3eaf 100644 --- a/apps/files_sharing/settings-personal.php +++ b/apps/files_sharing/settings-personal.php @@ -32,9 +32,7 @@ if (count($matches) > 0 && $matches[1] <= 9) { $isIE8 = true; } -$uid = \OC::$server->getUserSession()->getUser()->getUID(); -$server = \OC::$server->getURLGenerator()->getAbsoluteURL('/'); -$cloudID = $uid . '@' . rtrim(\OCA\Files_Sharing\Helper::removeProtocolFromUrl($server), '/'); +$cloudID = \OC::$server->getUserSession()->getUser()->getCloudId(); $url = 'https://owncloud.org/federation#' . $cloudID; $ownCloudLogoPath = \OC::$server->getURLGenerator()->imagePath('core', 'logo-icon.svg'); diff --git a/lib/private/user/user.php b/lib/private/user/user.php index 023fc5f5a32..ca79f12469c 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -32,60 +32,48 @@ namespace OC\User; use OC\Hooks\Emitter; use OCP\IAvatarManager; use OCP\IImage; +use OCP\IURLGenerator; use OCP\IUser; use OCP\IConfig; class User implements IUser { - /** - * @var string $uid - */ + /** @var string $uid */ private $uid; - /** - * @var string $displayName - */ + /** @var string $displayName */ private $displayName; - /** - * @var \OC_User_Interface $backend - */ + /** @var \OC_User_Interface $backend */ private $backend; - /** - * @var bool $enabled - */ + /** @var bool $enabled */ private $enabled; - /** - * @var Emitter|Manager $emitter - */ + /** @var Emitter|Manager $emitter */ private $emitter; - /** - * @var string $home - */ + /** @var string $home */ private $home; - /** - * @var int $lastLogin - */ + /** @var int $lastLogin */ private $lastLogin; - /** - * @var \OCP\IConfig $config - */ + /** @var \OCP\IConfig $config */ private $config; /** @var IAvatarManager */ private $avatarManager; + /** @var IURLGenerator */ + private $urlGenerator; + /** * @param string $uid * @param \OC_User_Interface $backend * @param \OC\Hooks\Emitter $emitter * @param \OCP\IConfig $config */ - public function __construct($uid, $backend, $emitter = null, IConfig $config = null, $avatarManager = null) { + public function __construct($uid, $backend, $emitter = null, IConfig $config = null, $avatarManager = null, $urlGenerator = null) { $this->uid = $uid; $this->backend = $backend; $this->emitter = $emitter; @@ -102,6 +90,9 @@ class User implements IUser { if (is_null($this->avatarManager)) { $this->avatarManager = \OC::$server->getAvatarManager(); } + if (is_null($this->urlGenerator)) { + $this->urlGenerator = \OC::$server->getURLGenerator(); + } } /** @@ -342,4 +333,30 @@ class User implements IUser { return null; } + + /** + * get the federation cloud id + * + * @return string + * @since 9.0.0 + */ + public function getCloudId() { + $uid = $this->getUID(); + $server = $this->urlGenerator->getAbsoluteURL('/'); + return $uid . '@' . rtrim( $this->removeProtocolFromUrl($server), '/'); + } + + /** + * @param string $url + * @return string + */ + private function removeProtocolFromUrl($url) { + if (strpos($url, 'https://') === 0) { + return substr($url, strlen('https://')); + } else if (strpos($url, 'http://') === 0) { + return substr($url, strlen('http://')); + } + + return $url; + } } diff --git a/lib/public/iuser.php b/lib/public/iuser.php index f6caef2ba1b..67e2b107e0b 100644 --- a/lib/public/iuser.php +++ b/lib/public/iuser.php @@ -161,4 +161,12 @@ interface IUser { * @since 9.0.0 */ public function getAvatarImage($size); + + /** + * get the federation cloud id + * + * @return string + * @since 9.0.0 + */ + public function getCloudId(); } diff --git a/tests/lib/contacts/localadressbook.php b/tests/lib/contacts/localadressbook.php index 54168324538..e5c43460835 100644 --- a/tests/lib/contacts/localadressbook.php +++ b/tests/lib/contacts/localadressbook.php @@ -102,4 +102,7 @@ class SimpleUserForTesting implements IUser { public function getAvatarImage($size) { } + + public function getCloudId() { + } } -- cgit v1.2.3 From 6abc02cb884d4384f6892082373eab50c805486d Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 1 Dec 2015 12:48:23 +0100 Subject: Proposal: add enumeration function to IUserManager which simply calls a callbask for each user in all backends --- apps/dav/command/syncsystemaddressbook.php | 37 ++++++++++++++---------------- lib/private/user/manager.php | 34 +++++++++++++++++++++++---- lib/public/iusermanager.php | 7 ++++++ 3 files changed, 54 insertions(+), 24 deletions(-) (limited to 'lib') diff --git a/apps/dav/command/syncsystemaddressbook.php b/apps/dav/command/syncsystemaddressbook.php index 288616d065b..bb2896abc60 100644 --- a/apps/dav/command/syncsystemaddressbook.php +++ b/apps/dav/command/syncsystemaddressbook.php @@ -7,6 +7,7 @@ use OCA\DAV\CardDAV\Converter; use OCA\DAV\Connector\Sabre\Principal; use OCP\IConfig; use OCP\IDBConnection; +use OCP\IUser; use OCP\IUserManager; use Sabre\CardDAV\Plugin; use Sabre\VObject\Component\VCard; @@ -69,28 +70,24 @@ class SyncSystemAddressBook extends Command { $output->writeln('Syncing users ...'); $progress = new ProgressBar($output); $progress->start(); - $page = 0; - foreach( $this->userManager->getBackends() as $backend) { - $users = $backend->getUsers('', 50, $page++); - foreach($users as $user) { - $user = $this->userManager->get($user); - $name = $user->getBackendClassName(); - $userId = $user->getUID(); - - $cardId = "$name:$userId.vcf"; - $card = $this->backend->getCard($systemAddressBook['id'], $cardId); - if ($card === false) { - $vCard = $converter->createCardFromUser($user); - $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize()); - } else { - $vCard = Reader::read($card['carddata']); - if ($converter->updateCard($vCard, $user)) { - $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize()); - } + $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) { + /** @var IUser $user */ + $name = $user->getBackendClassName(); + $userId = $user->getUID(); + + $cardId = "$name:$userId.vcf"; + $card = $this->backend->getCard($systemAddressBook['id'], $cardId); + if ($card === false) { + $vCard = $converter->createCardFromUser($user); + $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize()); + } else { + $vCard = Reader::read($card['carddata']); + if ($converter->updateCard($vCard, $user)) { + $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize()); } - $progress->advance(); } - } + $progress->advance(); + }); $progress->finish(); $output->writeln(''); } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 109f08f47a0..8d93b998d99 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -294,21 +294,47 @@ class Manager extends PublicEmitter implements IUserManager { $userCountStatistics = array(); foreach ($this->backends as $backend) { if ($backend->implementsActions(\OC_User_Backend::COUNT_USERS)) { - $backendusers = $backend->countUsers(); - if($backendusers !== false) { + $backendUsers = $backend->countUsers(); + if($backendUsers !== false) { if($backend instanceof \OCP\IUserBackend) { $name = $backend->getBackendName(); } else { $name = get_class($backend); } if(isset($userCountStatistics[$name])) { - $userCountStatistics[$name] += $backendusers; + $userCountStatistics[$name] += $backendUsers; } else { - $userCountStatistics[$name] = $backendusers; + $userCountStatistics[$name] = $backendUsers; } } } } return $userCountStatistics; } + + /** + * The callback is executed for each user on each backend. + * If the callback returns false no further users will be retrieved. + * + * @param \Closure $callback + * @return void + * @since 9.0.0 + */ + public function callForAllUsers(\Closure $callback, $search = '') { + foreach($this->getBackends() as $backend) { + $limit = 50; + $offset = 0; + do { + $users = $backend->getUsers($search, $limit, $offset); + foreach ($users as $user) { + $user = $this->get($user); + $return = $callback($user); + if ($return === false) { + break; + } + } + $offset += $limit; + } while (count($users) >= $limit); + } + } } diff --git a/lib/public/iusermanager.php b/lib/public/iusermanager.php index e3857d6231a..3a0abaca7b7 100644 --- a/lib/public/iusermanager.php +++ b/lib/public/iusermanager.php @@ -134,4 +134,11 @@ interface IUserManager { * @since 8.0.0 */ public function countUsers(); + + /** + * @param \Closure $callback + * @return void + * @since 9.0.0 + */ + public function callForAllUsers (\Closure $callback, $search = ''); } -- cgit v1.2.3 From 0391cc045109cc0dcc5f60753144593ab019626c Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 1 Dec 2015 14:50:13 +0100 Subject: Fix getCloudId --- lib/private/user/user.php | 1 + tests/lib/user/user.php | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/private/user/user.php b/lib/private/user/user.php index ca79f12469c..d60ffe95fc3 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -79,6 +79,7 @@ class User implements IUser { $this->emitter = $emitter; $this->config = $config; $this->avatarManager = $avatarManager; + $this->urlGenerator = $urlGenerator; if ($this->config) { $enabled = $this->config->getUserValue($uid, 'core', 'enabled', 'true'); $this->enabled = ($enabled === 'true'); diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index 52f0a125303..134b79383ea 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -468,8 +468,14 @@ class User extends \Test\TestCase { */ $backend = $this->getMock('\Test\Util\User\Dummy'); $urlGenerator = $this->getMockBuilder('\OC\URLGenerator') + ->setMethods(['getAbsoluteURL']) ->disableOriginalConstructor()->getMock(); + $urlGenerator + ->expects($this->any()) + ->method('getAbsoluteURL') + ->withAnyParameters() + ->willReturn('http://localhost:8888/owncloud'); $user = new \OC\User\User('foo', $backend, null, null, null, $urlGenerator); - $this->assertEquals("foo@localhost", $user->getCloudId()); + $this->assertEquals("foo@localhost:8888/owncloud", $user->getCloudId()); } } -- cgit v1.2.3 From 4c695e63c0d3361fc4a758af66e54e3871754c4b Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 2 Dec 2015 09:20:58 +0100 Subject: Fix comments --- apps/dav/lib/carddav/carddavbackend.php | 2 +- apps/dav/lib/carddav/converter.php | 6 +++--- lib/private/user/manager.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php index 752669aae2a..29b056672b4 100644 --- a/apps/dav/lib/carddav/carddavbackend.php +++ b/apps/dav/lib/carddav/carddavbackend.php @@ -117,10 +117,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { ->execute(); $row = $result->fetch(); + $result->closeCursor(); if ($row === false) { return null; } - $result->closeCursor(); return [ 'id' => $row['id'], diff --git a/apps/dav/lib/carddav/converter.php b/apps/dav/lib/carddav/converter.php index eb2ee1f0604..b113f1894dd 100644 --- a/apps/dav/lib/carddav/converter.php +++ b/apps/dav/lib/carddav/converter.php @@ -68,17 +68,17 @@ class Converter { $image = $user->getAvatarImage(-1); $updated = false; - if((is_null($vCard->FN) && !empty($image)) || (!is_null($vCard->FN) && $vCard->FN->getValue() !== $displayName)) { + if((is_null($vCard->FN) && !empty($displayName)) || (!is_null($vCard->FN) && $vCard->FN->getValue() !== $displayName)) { $vCard->FN = new Text($vCard, 'FN', $displayName); unset($vCard->N); $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName))); $updated = true; } - if((is_null($vCard->EMail) && !empty($image)) || (!is_null($vCard->EMail) && $vCard->EMail->getValue() !== $emailAddress)) { + if((is_null($vCard->EMail) && !empty($emailAddress)) || (!is_null($vCard->EMail) && $vCard->EMail->getValue() !== $emailAddress)) { $vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress); $updated = true; } - if((is_null($vCard->CLOUD) && !empty($image)) || (!is_null($vCard->CLOUD) && $vCard->CLOUD->getValue() !== $cloudId)) { + if((is_null($vCard->CLOUD) && !empty($cloudId)) || (!is_null($vCard->CLOUD) && $vCard->CLOUD->getValue() !== $cloudId)) { $vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId); $updated = true; } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 8d93b998d99..2cb866d0056 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -322,7 +322,7 @@ class Manager extends PublicEmitter implements IUserManager { */ public function callForAllUsers(\Closure $callback, $search = '') { foreach($this->getBackends() as $backend) { - $limit = 50; + $limit = 500; $offset = 0; do { $users = $backend->getUsers($search, $limit, $offset); -- cgit v1.2.3 From 28ceab2f616d45a53dcc00c2cff53d5524bf0e9e Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 2 Dec 2015 14:25:07 +0100 Subject: Fix endless recursion --- apps/dav/lib/carddav/converter.php | 18 +++++++++++++++--- lib/private/user/user.php | 16 +++++++++------- tests/lib/user/user.php | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/apps/dav/lib/carddav/converter.php b/apps/dav/lib/carddav/converter.php index 67492378ade..56b73eba4c0 100644 --- a/apps/dav/lib/carddav/converter.php +++ b/apps/dav/lib/carddav/converter.php @@ -28,9 +28,10 @@ use Sabre\VObject\Property\Text; class Converter { - public function __construct() { - } - + /** + * @param IUser $user + * @return VCard + */ public function createCardFromUser(IUser $user) { $uid = $user->getUID(); @@ -60,6 +61,11 @@ class Converter { return $vCard; } + /** + * @param VCard $vCard + * @param IUser $user + * @return bool + */ public function updateCard(VCard $vCard, IUser $user) { $uid = $user->getUID(); $displayName = $user->getDisplayName(); @@ -105,6 +111,12 @@ class Converter { return $updated; } + /** + * @param VCard $vCard + * @param string $name + * @param string|IImage $newValue + * @return bool + */ private function propertyNeedsUpdate(VCard $vCard, $name, $newValue) { if (is_null($newValue)) { return false; diff --git a/lib/private/user/user.php b/lib/private/user/user.php index d60ffe95fc3..d1fa641504c 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -71,14 +71,14 @@ class User implements IUser { * @param string $uid * @param \OC_User_Interface $backend * @param \OC\Hooks\Emitter $emitter - * @param \OCP\IConfig $config + * @param IConfig|null $config + * @param IURLGenerator $urlGenerator */ - public function __construct($uid, $backend, $emitter = null, IConfig $config = null, $avatarManager = null, $urlGenerator = null) { + public function __construct($uid, $backend, $emitter = null, IConfig $config = null, $urlGenerator = null) { $this->uid = $uid; $this->backend = $backend; $this->emitter = $emitter; $this->config = $config; - $this->avatarManager = $avatarManager; $this->urlGenerator = $urlGenerator; if ($this->config) { $enabled = $this->config->getUserValue($uid, 'core', 'enabled', 'true'); @@ -88,9 +88,6 @@ class User implements IUser { $this->enabled = true; $this->lastLogin = \OC::$server->getConfig()->getUserValue($uid, 'login', 'lastLogin', 0); } - if (is_null($this->avatarManager)) { - $this->avatarManager = \OC::$server->getAvatarManager(); - } if (is_null($this->urlGenerator)) { $this->urlGenerator = \OC::$server->getURLGenerator(); } @@ -106,7 +103,7 @@ class User implements IUser { } /** - * get the displayname for the user, if no specific displayname is set it will fallback to the user id + * get the display name for the user, if no specific display name is set it will fallback to the user id * * @return string */ @@ -326,6 +323,11 @@ class User implements IUser { * @since 9.0.0 */ public function getAvatarImage($size) { + // delay the initialization + if (is_null($this->avatarManager)) { + $this->avatarManager = \OC::$server->getAvatarManager(); + } + $avatar = $this->avatarManager->getAvatar($this->uid); $image = $avatar->get(-1); if ($image) { diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index 134b79383ea..1f613edc4e6 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -475,7 +475,7 @@ class User extends \Test\TestCase { ->method('getAbsoluteURL') ->withAnyParameters() ->willReturn('http://localhost:8888/owncloud'); - $user = new \OC\User\User('foo', $backend, null, null, null, $urlGenerator); + $user = new \OC\User\User('foo', $backend, null, null, $urlGenerator); $this->assertEquals("foo@localhost:8888/owncloud", $user->getCloudId()); } } -- cgit v1.2.3