From 3930b915116b27816c4c6bee4bab7c6193369e68 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 15:34:38 +0200 Subject: [PATCH 1/6] Use an application class Signed-off-by: Joas Schilling --- apps/lookup_server_connector/appinfo/app.php | 12 +--- .../composer/composer/autoload_classmap.php | 1 + .../composer/composer/autoload_static.php | 1 + .../lib/AppInfo/Application.php | 56 +++++++++++++++++++ 4 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 apps/lookup_server_connector/lib/AppInfo/Application.php diff --git a/apps/lookup_server_connector/appinfo/app.php b/apps/lookup_server_connector/appinfo/app.php index 28e7bea192..e1064b144a 100644 --- a/apps/lookup_server_connector/appinfo/app.php +++ b/apps/lookup_server_connector/appinfo/app.php @@ -19,13 +19,5 @@ * */ -$dispatcher = \OC::$server->getEventDispatcher(); - -$dispatcher->addListener('OC\AccountManager::userUpdated', function(\Symfony\Component\EventDispatcher\GenericEvent $event) { - /** @var \OCP\IUser $user */ - $user = $event->getSubject(); - - /** @var \OCA\LookupServerConnector\UpdateLookupServer $updateLookupServer */ - $updateLookupServer = \OC::$server->query(\OCA\LookupServerConnector\UpdateLookupServer::class); - $updateLookupServer->userUpdated($user); -}); +$app = new \OCA\LookupServerConnector\AppInfo\Application(); +$app->register(); diff --git a/apps/lookup_server_connector/composer/composer/autoload_classmap.php b/apps/lookup_server_connector/composer/composer/autoload_classmap.php index 110eff058f..eb76937431 100644 --- a/apps/lookup_server_connector/composer/composer/autoload_classmap.php +++ b/apps/lookup_server_connector/composer/composer/autoload_classmap.php @@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = $vendorDir; return array( + 'OCA\\LookupServerConnector\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php', 'OCA\\LookupServerConnector\\BackgroundJobs\\RetryJob' => $baseDir . '/../lib/BackgroundJobs/RetryJob.php', 'OCA\\LookupServerConnector\\UpdateLookupServer' => $baseDir . '/../lib/UpdateLookupServer.php', ); diff --git a/apps/lookup_server_connector/composer/composer/autoload_static.php b/apps/lookup_server_connector/composer/composer/autoload_static.php index 07aca539b3..ab216a7544 100644 --- a/apps/lookup_server_connector/composer/composer/autoload_static.php +++ b/apps/lookup_server_connector/composer/composer/autoload_static.php @@ -21,6 +21,7 @@ class ComposerStaticInitLookupServerConnector ); public static $classMap = array ( + 'OCA\\LookupServerConnector\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php', 'OCA\\LookupServerConnector\\BackgroundJobs\\RetryJob' => __DIR__ . '/..' . '/../lib/BackgroundJobs/RetryJob.php', 'OCA\\LookupServerConnector\\UpdateLookupServer' => __DIR__ . '/..' . '/../lib/UpdateLookupServer.php', ); diff --git a/apps/lookup_server_connector/lib/AppInfo/Application.php b/apps/lookup_server_connector/lib/AppInfo/Application.php new file mode 100644 index 0000000000..66bd2dd062 --- /dev/null +++ b/apps/lookup_server_connector/lib/AppInfo/Application.php @@ -0,0 +1,56 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OCA\LookupServerConnector\AppInfo; + +use OCA\LookupServerConnector\UpdateLookupServer; +use OCP\AppFramework\App; +use OCP\IUser; +use Symfony\Component\EventDispatcher\GenericEvent; + +class Application extends App { + public function __construct () { + parent::__construct('lookup_server_connector'); + } + + /** + * Register the different app parts + */ + public function register(): void { + $this->registerHooksAndEvents(); + } + + /** + * Register the hooks and events + */ + public function registerHooksAndEvents(): void { + $dispatcher = $this->getContainer()->getServer()->getEventDispatcher(); + $dispatcher->addListener('OC\AccountManager::userUpdated', static function(GenericEvent $event) { + /** @var IUser $user */ + $user = $event->getSubject(); + + /** @var UpdateLookupServer $updateLookupServer */ + $updateLookupServer = \OC::$server->query(UpdateLookupServer::class); + $updateLookupServer->userUpdated($user); + }); + + } +} From 3a4f6302ca415206e34de355289a211b9afa0e6f Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 15:37:23 +0200 Subject: [PATCH 2/6] Also send a delete like on the syncronous action Signed-off-by: Joas Schilling --- .../lib/BackgroundJobs/RetryJob.php | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php index 242b0c713f..3bad504e45 100644 --- a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php +++ b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php @@ -85,13 +85,23 @@ class RetryJob extends Job { $client = $this->clientService->newClient(); try { - $client->post($this->lookupServer, - [ - 'body' => json_encode($argument['dataArray']), - 'timeout' => 10, - 'connect_timeout' => 3, - ] - ); + if (count($argument['dataArray']) === 1) { + $client->delete($this->lookupServer, + [ + 'body' => json_encode($argument['dataArray']), + 'timeout' => 10, + 'connect_timeout' => 3, + ] + ); + } else { + $client->post($this->lookupServer, + [ + 'body' => json_encode($argument['dataArray']), + 'timeout' => 10, + 'connect_timeout' => 3, + ] + ); + } } catch (\Exception $e) { $this->jobList->add(RetryJob::class, [ From 9927909a0d567c87ec85b52f8c378fa1dc56ed3b Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 15:38:24 +0200 Subject: [PATCH 3/6] Always use a background job for the update Signed-off-by: Joas Schilling --- .../lib/UpdateLookupServer.php | 44 ++++--------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php index 75da45dce2..2e803ffe4b 100644 --- a/apps/lookup_server_connector/lib/UpdateLookupServer.php +++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php @@ -38,8 +38,6 @@ use OCP\IUser; class UpdateLookupServer { /** @var AccountManager */ private $accountManager; - /** @var IClientService */ - private $clientService; /** @var Signer */ private $signer; /** @var IJobList */ @@ -51,18 +49,15 @@ class UpdateLookupServer { /** * @param AccountManager $accountManager - * @param IClientService $clientService * @param Signer $signer * @param IJobList $jobList * @param IConfig $config */ public function __construct(AccountManager $accountManager, - IClientService $clientService, Signer $signer, IJobList $jobList, IConfig $config) { $this->accountManager = $accountManager; - $this->clientService = $clientService; $this->signer = $signer; $this->jobList = $jobList; @@ -82,7 +77,7 @@ class UpdateLookupServer { /** * @param IUser $user */ - public function userUpdated(IUser $user) { + public function userUpdated(IUser $user): void { if (!$this->shouldUpdateLookupServer()) { return; @@ -106,7 +101,7 @@ class UpdateLookupServer { * @param IUser $user * @param array $publicData */ - protected function sendToLookupServer(IUser $user, array $publicData) { + protected function sendToLookupServer(IUser $user, array $publicData): void { $dataArray = ['federationId' => $user->getCloudId()]; @@ -127,33 +122,12 @@ class UpdateLookupServer { } $dataArray = $this->signer->sign('lookupserver', $dataArray, $user); - $httpClient = $this->clientService->newClient(); - try { - if (empty($publicData)) { - $httpClient->delete($this->lookupServer, - [ - 'body' => json_encode($dataArray), - 'timeout' => 10, - 'connect_timeout' => 3, - ] - ); - } else { - $httpClient->post($this->lookupServer, - [ - 'body' => json_encode($dataArray), - 'timeout' => 10, - 'connect_timeout' => 3, - ] - ); - } - } catch (\Exception $e) { - $this->jobList->add(RetryJob::class, - [ - 'dataArray' => $dataArray, - 'retryNo' => 0, - ] - ); - } + $this->jobList->add(RetryJob::class, + [ + 'dataArray' => $dataArray, + 'retryNo' => 0, + ] + ); } /** @@ -164,7 +138,7 @@ class UpdateLookupServer { * * @return bool */ - private function shouldUpdateLookupServer() { + private function shouldUpdateLookupServer(): bool { return $this->lookupServerEnabled && !empty($this->lookupServer); } From 006151604b312c526e02cf14c9dc20d668895db6 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 15:40:17 +0200 Subject: [PATCH 4/6] Use public interfaces Signed-off-by: Joas Schilling --- .../lib/BackgroundJobs/RetryJob.php | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php index 3bad504e45..b3a736cd97 100644 --- a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php +++ b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php @@ -22,8 +22,8 @@ namespace OCA\LookupServerConnector\BackgroundJobs; -use OC\BackgroundJob\Job; -use OC\BackgroundJob\JobList; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\Job; use OCP\BackgroundJob\IJobList; use OCP\Http\Client\IClientService; use OCP\IConfig; @@ -42,13 +42,16 @@ class RetryJob extends Job { private $config; /** + * @param ITimeFactory $time * @param IClientService $clientService * @param IJobList $jobList * @param IConfig $config */ - public function __construct(IClientService $clientService, + public function __construct(ITimeFactory $time, + IClientService $clientService, IJobList $jobList, IConfig $config) { + parent::__construct($time); $this->clientService = $clientService; $this->jobList = $jobList; $this->config = $config; @@ -67,17 +70,17 @@ class RetryJob extends Job { /** * run the job, then remove it from the jobList * - * @param JobList $jobList + * @param IJobList $jobList * @param ILogger|null $logger */ - public function execute($jobList, ILogger $logger = null) { + public function execute($jobList, ILogger $logger = null): void { if ($this->shouldRun($this->argument)) { parent::execute($jobList, $logger); $jobList->remove($this, $this->argument); } } - protected function run($argument) { + protected function run($argument): void { if ($this->killBackgroundJob((int)$argument['retryNo'])) { return; } @@ -103,11 +106,11 @@ class RetryJob extends Job { ); } } catch (\Exception $e) { - $this->jobList->add(RetryJob::class, + $this->jobList->add(self::class, [ 'dataArray' => $argument['dataArray'], 'retryNo' => $argument['retryNo'] + 1, - 'lastRun' => time(), + 'lastRun' => $this->time->getTime(), ] ); @@ -120,10 +123,10 @@ class RetryJob extends Job { * @param array $argument * @return bool */ - protected function shouldRun($argument) { + protected function shouldRun(array $argument): bool { $retryNo = (int)$argument['retryNo']; $delay = $this->interval * 6 ** $retryNo; - return !isset($argument['lastRun']) || ((time() - $argument['lastRun']) > $delay); + return !isset($argument['lastRun']) || (($this->time->getTime() - $argument['lastRun']) > $delay); } /** @@ -138,7 +141,7 @@ class RetryJob extends Job { * @param int $retryCount * @return bool */ - protected function killBackgroundJob($retryCount) { + protected function killBackgroundJob(int $retryCount): bool { $maxTriesReached = $retryCount >= 5; $lookupServerDisabled = $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes') !== 'yes'; From e1e1d4df62d6293a95fd271437643d5ec18c9cea Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 15:50:50 +0200 Subject: [PATCH 5/6] Yay for null coalescing operator Signed-off-by: Joas Schilling --- .../lib/UpdateLookupServer.php | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php index 2e803ffe4b..2bd71e7ed0 100644 --- a/apps/lookup_server_connector/lib/UpdateLookupServer.php +++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php @@ -106,19 +106,18 @@ class UpdateLookupServer { $dataArray = ['federationId' => $user->getCloudId()]; if (!empty($publicData)) { - $dataArray['name'] = isset($publicData[AccountManager::PROPERTY_DISPLAYNAME]) ? $publicData[AccountManager::PROPERTY_DISPLAYNAME]['value'] : ''; - $dataArray['email'] = isset($publicData[AccountManager::PROPERTY_EMAIL]) ? $publicData[AccountManager::PROPERTY_EMAIL]['value'] : ''; - $dataArray['address'] = isset($publicData[AccountManager::PROPERTY_ADDRESS]) ? $publicData[AccountManager::PROPERTY_ADDRESS]['value'] : ''; - $dataArray['website'] = isset($publicData[AccountManager::PROPERTY_WEBSITE]) ? $publicData[AccountManager::PROPERTY_WEBSITE]['value'] : ''; - $dataArray['twitter'] = isset($publicData[AccountManager::PROPERTY_TWITTER]) ? $publicData[AccountManager::PROPERTY_TWITTER]['value'] : ''; - $dataArray['phone'] = isset($publicData[AccountManager::PROPERTY_PHONE]) ? $publicData[AccountManager::PROPERTY_PHONE]['value'] : ''; - $dataArray['twitter_signature'] = isset($publicData[AccountManager::PROPERTY_TWITTER]['signature']) ? $publicData[AccountManager::PROPERTY_TWITTER]['signature'] : ''; - $dataArray['website_signature'] = isset($publicData[AccountManager::PROPERTY_WEBSITE]['signature']) ? $publicData[AccountManager::PROPERTY_WEBSITE]['signature'] : ''; - $dataArray['verificationStatus'] = - [ - AccountManager::PROPERTY_WEBSITE => isset($publicData[AccountManager::PROPERTY_WEBSITE]) ? $publicData[AccountManager::PROPERTY_WEBSITE]['verified'] : '', - AccountManager::PROPERTY_TWITTER => isset($publicData[AccountManager::PROPERTY_TWITTER]) ? $publicData[AccountManager::PROPERTY_TWITTER]['verified'] : '', - ]; + $dataArray['name'] = $publicData[AccountManager::PROPERTY_DISPLAYNAME]['value'] ?? ''; + $dataArray['email'] = $publicData[AccountManager::PROPERTY_EMAIL]['value'] ?? ''; + $dataArray['address'] = $publicData[AccountManager::PROPERTY_ADDRESS]['value'] ?? ''; + $dataArray['website'] = $publicData[AccountManager::PROPERTY_WEBSITE]['value'] ?? ''; + $dataArray['twitter'] = $publicData[AccountManager::PROPERTY_TWITTER]['value'] ?? ''; + $dataArray['phone'] = $publicData[AccountManager::PROPERTY_PHONE]['value'] ?? ''; + $dataArray['twitter_signature'] = $publicData[AccountManager::PROPERTY_TWITTER]['signature'] ?? ''; + $dataArray['website_signature'] = $publicData[AccountManager::PROPERTY_WEBSITE]['signature'] ?? ''; + $dataArray['verificationStatus'] = [ + AccountManager::PROPERTY_WEBSITE => $publicData[AccountManager::PROPERTY_WEBSITE]['verified'] ?? '', + AccountManager::PROPERTY_TWITTER => $publicData[AccountManager::PROPERTY_TWITTER]['verified'] ?? '', + ]; } $dataArray = $this->signer->sign('lookupserver', $dataArray, $user); From 30051e786b7b39b95eef5a878836419125afb6df Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 17 Apr 2019 17:31:22 +0200 Subject: [PATCH 6/6] Make the RetryJob work on the userId only To ensure there is only 1 background job per user Signed-off-by: Joas Schilling --- .../lib/BackgroundJobs/RetryJob.php | 174 ++++++++++++------ .../lib/UpdateLookupServer.php | 94 ++-------- 2 files changed, 135 insertions(+), 133 deletions(-) diff --git a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php index b3a736cd97..0a7e3cd5b9 100644 --- a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php +++ b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php @@ -1,6 +1,8 @@ + * @copyright Copyright (c) 2019 Joas Schilling * * @license GNU AGPL version 3 or any later version * @@ -22,43 +24,55 @@ namespace OCA\LookupServerConnector\BackgroundJobs; +use OC\Security\IdentityProof\Signer; +use OCP\Accounts\IAccountManager; use OCP\AppFramework\Utility\ITimeFactory; use OCP\BackgroundJob\Job; use OCP\BackgroundJob\IJobList; use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\ILogger; +use OCP\IUser; +use OCP\IUserManager; class RetryJob extends Job { /** @var IClientService */ private $clientService; - /** @var IJobList */ - private $jobList; /** @var string */ private $lookupServer; - /** @var int how much time should be between two, will be increased for each retry */ - private $interval = 100; /** @var IConfig */ private $config; + /** @var IUserManager */ + private $userManager; + /** @var IAccountManager */ + private $accountManager; + /** @var Signer */ + private $signer; + /** @var int */ + protected $retries = 0; + /** @var bool */ + protected $retainJob = false; /** * @param ITimeFactory $time * @param IClientService $clientService - * @param IJobList $jobList * @param IConfig $config + * @param IUserManager $userManager + * @param IAccountManager $accountManager + * @param Signer $signer */ public function __construct(ITimeFactory $time, IClientService $clientService, - IJobList $jobList, - IConfig $config) { + IConfig $config, + IUserManager $userManager, + IAccountManager $accountManager, + Signer $signer) { parent::__construct($time); $this->clientService = $clientService; - $this->jobList = $jobList; $this->config = $config; - - if ($config->getSystemValue('has_internet_connection', true) === false) { - return; - } + $this->userManager = $userManager; + $this->accountManager = $accountManager; + $this->signer = $signer; $this->lookupServer = $config->getSystemValue('lookup_server', 'https://lookup.nextcloud.com'); if (!empty($this->lookupServer)) { @@ -74,24 +88,66 @@ class RetryJob extends Job { * @param ILogger|null $logger */ public function execute($jobList, ILogger $logger = null): void { - if ($this->shouldRun($this->argument)) { - parent::execute($jobList, $logger); + if (!isset($this->argument['userId'])) { + // Old background job without user id, just drop it. $jobList->remove($this, $this->argument); - } - } - - protected function run($argument): void { - if ($this->killBackgroundJob((int)$argument['retryNo'])) { return; } + $this->retries = (int) $this->config->getUserValue($this->argument['userId'], 'lookup_server_connector', 'update_retries', 0); + + if ($this->shouldRemoveBackgroundJob()) { + $jobList->remove($this, $this->argument); + return; + } + + if ($this->shouldRun()) { + parent::execute($jobList, $logger); + if (!$this->retainJob) { + $jobList->remove($this, $this->argument); + } + } + } + + /** + * Check if we should kill the background job: + * + * - internet connection is disabled + * - no valid lookup server URL given + * - lookup server was disabled by the admin + * - max retries are reached (set to 5) + * + * @return bool + */ + protected function shouldRemoveBackgroundJob(): bool { + return $this->config->getSystemValueBool('has_internet_connection', true) === false || + $this->config->getSystemValueString('lookup_server', 'https://lookup.nextcloud.com') === '' || + $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes') !== 'yes' || + $this->retries >= 5; + } + + protected function shouldRun(): bool { + $delay = 100 * 6 ** $this->retries; + return ($this->time->getTime() - $this->lastRun) > $delay; + } + + protected function run($argument): void { + $user = $this->userManager->get($this->argument['userId']); + if (!$user instanceof IUser) { + // User does not exist anymore + return; + } + + $data = $this->getUserAccountData($user); + $signedData = $this->signer->sign('lookupserver', $data, $user); $client = $this->clientService->newClient(); try { - if (count($argument['dataArray']) === 1) { + if (count($data) === 1) { + // No public data, just the federation Id $client->delete($this->lookupServer, [ - 'body' => json_encode($argument['dataArray']), + 'body' => json_encode($signedData), 'timeout' => 10, 'connect_timeout' => 3, ] @@ -99,52 +155,58 @@ class RetryJob extends Job { } else { $client->post($this->lookupServer, [ - 'body' => json_encode($argument['dataArray']), + 'body' => json_encode($signedData), 'timeout' => 10, 'connect_timeout' => 3, ] ); } - } catch (\Exception $e) { - $this->jobList->add(self::class, - [ - 'dataArray' => $argument['dataArray'], - 'retryNo' => $argument['retryNo'] + 1, - 'lastRun' => $this->time->getTime(), - ] + + // Reset retry counter + $this->config->deleteUserValue( + $user->getUID(), + 'lookup_server_connector', + 'update_retries' ); + } catch (\Exception $e) { + // An error occurred, retry later + $this->retainJob = true; + $this->config->setUserValue( + $user->getUID(), + 'lookup_server_connector', + 'update_retries', + $this->retries + 1 + ); } } - /** - * test if it is time for the next run - * - * @param array $argument - * @return bool - */ - protected function shouldRun(array $argument): bool { - $retryNo = (int)$argument['retryNo']; - $delay = $this->interval * 6 ** $retryNo; - return !isset($argument['lastRun']) || (($this->time->getTime() - $argument['lastRun']) > $delay); - } + protected function getUserAccountData(IUser $user): array { + $account = $this->accountManager->getAccount($user); - /** - * check if we should kill the background job - * - * The lookup server should no longer be contacted if: - * - * - max retries are reached (set to 5) - * - lookup server was disabled by the admin - * - no valid lookup server URL given - * - * @param int $retryCount - * @return bool - */ - protected function killBackgroundJob(int $retryCount): bool { - $maxTriesReached = $retryCount >= 5; - $lookupServerDisabled = $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes') !== 'yes'; + $publicData = []; + foreach ($account->getProperties() as $property) { + if ($property->getScope() === IAccountManager::VISIBILITY_PUBLIC) { + $publicData[$property->getName()] = $property->getValue(); + } + } - return $maxTriesReached || $lookupServerDisabled || empty($this->lookupServer); + $data = ['federationId' => $user->getCloudId()]; + if (!empty($publicData)) { + $data['name'] = $publicData[IAccountManager::PROPERTY_DISPLAYNAME]['value'] ?? ''; + $data['email'] = $publicData[IAccountManager::PROPERTY_EMAIL]['value'] ?? ''; + $data['address'] = $publicData[IAccountManager::PROPERTY_ADDRESS]['value'] ?? ''; + $data['website'] = $publicData[IAccountManager::PROPERTY_WEBSITE]['value'] ?? ''; + $data['twitter'] = $publicData[IAccountManager::PROPERTY_TWITTER]['value'] ?? ''; + $data['phone'] = $publicData[IAccountManager::PROPERTY_PHONE]['value'] ?? ''; + $data['twitter_signature'] = $publicData[IAccountManager::PROPERTY_TWITTER]['signature'] ?? ''; + $data['website_signature'] = $publicData[IAccountManager::PROPERTY_WEBSITE]['signature'] ?? ''; + $data['verificationStatus'] = [ + IAccountManager::PROPERTY_WEBSITE => $publicData[IAccountManager::PROPERTY_WEBSITE]['verified'] ?? '', + IAccountManager::PROPERTY_TWITTER => $publicData[IAccountManager::PROPERTY_TWITTER]['verified'] ?? '', + ]; + } + + return $data; } } diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php index 2bd71e7ed0..76d934d86f 100644 --- a/apps/lookup_server_connector/lib/UpdateLookupServer.php +++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php @@ -1,4 +1,5 @@ * @copyright Copyright (c) 2016 Lukas Reschke @@ -22,11 +23,8 @@ namespace OCA\LookupServerConnector; -use OC\Accounts\AccountManager; -use OC\Security\IdentityProof\Signer; use OCA\LookupServerConnector\BackgroundJobs\RetryJob; use OCP\BackgroundJob\IJobList; -use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\IUser; @@ -36,109 +34,51 @@ use OCP\IUser; * @package OCA\LookupServerConnector */ class UpdateLookupServer { - /** @var AccountManager */ - private $accountManager; - /** @var Signer */ - private $signer; + /** @var IConfig */ + private $config; /** @var IJobList */ private $jobList; - /** @var string URL point to lookup server */ - private $lookupServer; - /** @var bool */ - private $lookupServerEnabled; /** - * @param AccountManager $accountManager - * @param Signer $signer * @param IJobList $jobList * @param IConfig $config */ - public function __construct(AccountManager $accountManager, - Signer $signer, - IJobList $jobList, + public function __construct(IJobList $jobList, IConfig $config) { - $this->accountManager = $accountManager; - $this->signer = $signer; + $this->config = $config; $this->jobList = $jobList; - - if($config->getSystemValue('has_internet_connection', true) === false) { - return; - } - - $this->lookupServerEnabled = $config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes') === 'yes'; - - $this->lookupServer = $config->getSystemValue('lookup_server', 'https://lookup.nextcloud.com'); - if(!empty($this->lookupServer)) { - $this->lookupServer = rtrim($this->lookupServer, '/'); - $this->lookupServer .= '/users'; - } } /** * @param IUser $user */ public function userUpdated(IUser $user): void { - if (!$this->shouldUpdateLookupServer()) { return; } - $userData = $this->accountManager->getUser($user); - $publicData = []; - - foreach ($userData as $key => $data) { - if ($data['scope'] === AccountManager::VISIBILITY_PUBLIC) { - $publicData[$key] = $data; - } - } - - $this->sendToLookupServer($user, $publicData); - } - - /** - * send public user data to the lookup server - * - * @param IUser $user - * @param array $publicData - */ - protected function sendToLookupServer(IUser $user, array $publicData): void { - - $dataArray = ['federationId' => $user->getCloudId()]; - - if (!empty($publicData)) { - $dataArray['name'] = $publicData[AccountManager::PROPERTY_DISPLAYNAME]['value'] ?? ''; - $dataArray['email'] = $publicData[AccountManager::PROPERTY_EMAIL]['value'] ?? ''; - $dataArray['address'] = $publicData[AccountManager::PROPERTY_ADDRESS]['value'] ?? ''; - $dataArray['website'] = $publicData[AccountManager::PROPERTY_WEBSITE]['value'] ?? ''; - $dataArray['twitter'] = $publicData[AccountManager::PROPERTY_TWITTER]['value'] ?? ''; - $dataArray['phone'] = $publicData[AccountManager::PROPERTY_PHONE]['value'] ?? ''; - $dataArray['twitter_signature'] = $publicData[AccountManager::PROPERTY_TWITTER]['signature'] ?? ''; - $dataArray['website_signature'] = $publicData[AccountManager::PROPERTY_WEBSITE]['signature'] ?? ''; - $dataArray['verificationStatus'] = [ - AccountManager::PROPERTY_WEBSITE => $publicData[AccountManager::PROPERTY_WEBSITE]['verified'] ?? '', - AccountManager::PROPERTY_TWITTER => $publicData[AccountManager::PROPERTY_TWITTER]['verified'] ?? '', - ]; - } - - $dataArray = $this->signer->sign('lookupserver', $dataArray, $user); - $this->jobList->add(RetryJob::class, - [ - 'dataArray' => $dataArray, - 'retryNo' => 0, - ] + // Reset retry counter + $this->config->deleteUserValue( + $user->getUID(), + 'lookup_server_connector', + 'update_retries' ); + $this->jobList->add(RetryJob::class, ['userId' => $user->getUID()]); } /** * check if we should update the lookup server, we only do it if * - * * we have a valid URL - * * the lookup server update was enabled by the admin + * + we have an internet connection + * + the lookup server update was not disabled by the admin + * + we have a valid lookup server URL * * @return bool */ private function shouldUpdateLookupServer(): bool { - return $this->lookupServerEnabled && !empty($this->lookupServer); + return $this->config->getSystemValueBool('has_internet_connection', true) === true && + $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes') === 'yes' && + $this->config->getSystemValueString('lookup_server', 'https://lookup.nextcloud.com') !== ''; } }