summaryrefslogtreecommitdiffstats
path: root/apps/lookup_server_connector
diff options
context:
space:
mode:
Diffstat (limited to 'apps/lookup_server_connector')
-rw-r--r--apps/lookup_server_connector/appinfo/app.php46
-rw-r--r--apps/lookup_server_connector/appinfo/info.xml18
-rw-r--r--apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php81
-rw-r--r--apps/lookup_server_connector/lib/UpdateLookupServer.php136
4 files changed, 281 insertions, 0 deletions
diff --git a/apps/lookup_server_connector/appinfo/app.php b/apps/lookup_server_connector/appinfo/app.php
new file mode 100644
index 00000000000..6c63e9a0400
--- /dev/null
+++ b/apps/lookup_server_connector/appinfo/app.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+$dispatcher = \OC::$server->getEventDispatcher();
+
+$dispatcher->addListener('OC\AccountManager::userUpdated', function(\Symfony\Component\EventDispatcher\GenericEvent $event) {
+ $user = $event->getSubject();
+
+ $keyManager = new \OC\Security\IdentityProof\Manager(
+ \OC::$server->getAppDataDir('identityproof'),
+ \OC::$server->getCrypto()
+ );
+ $updateLookupServer = new \OCA\LookupServerConnector\UpdateLookupServer(
+ new \OC\Accounts\AccountManager(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()),
+ \OC::$server->getConfig(),
+ \OC::$server->getSecureRandom(),
+ \OC::$server->getHTTPClientService(),
+ $keyManager,
+ new \OC\Security\IdentityProof\Signer(
+ $keyManager,
+ new \OC\AppFramework\Utility\TimeFactory(),
+ \OC::$server->getURLGenerator(),
+ \OC::$server->getUserManager()
+ ),
+ \OC::$server->getJobList()
+ );
+ $updateLookupServer->userUpdated($user);
+});
diff --git a/apps/lookup_server_connector/appinfo/info.xml b/apps/lookup_server_connector/appinfo/info.xml
new file mode 100644
index 00000000000..88898c0b71b
--- /dev/null
+++ b/apps/lookup_server_connector/appinfo/info.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<info>
+ <id>lookup_server_connector</id>
+ <name>Lookup Server Connector</name>
+ <description>Sync public user information with the lookup server</description>
+ <licence>AGPL</licence>
+ <author>Bjoern Schiessle</author>
+ <namespace>LookupServerConnector</namespace>
+ <version>1.0.0</version>
+ <category>other</category>
+ <dependencies>
+ <owncloud min-version="11.0" max-version="11.0" />
+ </dependencies>
+ <default_enable/>
+ <types>
+ <authentication/>
+ </types>
+</info>
diff --git a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php
new file mode 100644
index 00000000000..f33323b2d4f
--- /dev/null
+++ b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\LookupServerConnector\BackgroundJobs;
+
+
+use OC\BackgroundJob\Job;
+use OCP\BackgroundJob\IJobList;
+use OCP\Http\Client\IClientService;
+
+class RetryJob extends Job {
+ /** @var IClientService */
+ private $clientService;
+ /** @var IJobList */
+ private $jobList;
+ /** @var string */
+ private $lookupServer = 'https://lookup.nextcloud.com/users';
+
+ /**
+ * @param IClientService|null $clientService
+ * @param IJobList|null $jobList
+ */
+ public function __construct(IClientService $clientService = null,
+ IJobList $jobList = null) {
+ if($clientService !== null) {
+ $this->clientService = $clientService;
+ } else {
+ $this->clientService = \OC::$server->getHTTPClientService();
+ }
+ if($jobList !== null) {
+ $this->jobList = $jobList;
+ } else {
+ $this->jobList = \OC::$server->getJobList();
+ }
+ }
+
+ protected function run($argument) {
+ if($argument['retryNo'] === 5) {
+ return;
+ }
+
+ $client = $this->clientService->newClient();
+
+ try {
+ $client->post($this->lookupServer,
+ [
+ 'body' => json_encode($argument['dataArray']),
+ 'timeout' => 10,
+ 'connect_timeout' => 3,
+ ]
+ );
+ } catch (\Exception $e) {
+ $this->jobList->add(RetryJob::class,
+ [
+ 'dataArray' => $argument['dataArray'],
+ 'retryNo' => $argument['retryNo'] + 1,
+ ]
+ );
+
+ }
+ }
+}
diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php
new file mode 100644
index 00000000000..7ba63c85567
--- /dev/null
+++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\LookupServerConnector;
+
+use OC\Accounts\AccountManager;
+use OC\Security\IdentityProof\Manager;
+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;
+use OCP\Security\ISecureRandom;
+
+/**
+ * Class UpdateLookupServer
+ *
+ * @package OCA\LookupServerConnector
+ */
+class UpdateLookupServer {
+ /** @var AccountManager */
+ private $accountManager;
+ /** @var IConfig */
+ private $config;
+ /** @var ISecureRandom */
+ private $secureRandom;
+ /** @var IClientService */
+ private $clientService;
+ /** @var Manager */
+ private $keyManager;
+ /** @var Signer */
+ private $signer;
+ /** @var IJobList */
+ private $jobList;
+ /** @var string URL point to lookup server */
+ private $lookupServer = 'https://lookup.nextcloud.com/users';
+
+ /**
+ * @param AccountManager $accountManager
+ * @param IConfig $config
+ * @param ISecureRandom $secureRandom
+ * @param IClientService $clientService
+ * @param Manager $manager
+ * @param Signer $signer
+ * @param IJobList $jobList
+ */
+ public function __construct(AccountManager $accountManager,
+ IConfig $config,
+ ISecureRandom $secureRandom,
+ IClientService $clientService,
+ Manager $manager,
+ Signer $signer,
+ IJobList $jobList) {
+ $this->accountManager = $accountManager;
+ $this->config = $config;
+ $this->secureRandom = $secureRandom;
+ $this->clientService = $clientService;
+ $this->keyManager = $manager;
+ $this->signer = $signer;
+ $this->jobList = $jobList;
+ }
+
+ /**
+ * @param IUser $user
+ */
+ public function userUpdated(IUser $user) {
+ $userData = $this->accountManager->getUser($user);
+ $publicData = [];
+
+ foreach ($userData as $key => $data) {
+ if ($data['scope'] === AccountManager::VISIBILITY_PUBLIC) {
+ $publicData[$key] = $data;
+ }
+ }
+
+ if (!empty($publicData)) {
+ $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) {
+ $dataArray = [
+ 'federationId' => $user->getCloudId(),
+ 'name' => isset($publicData[AccountManager::PROPERTY_DISPLAYNAME]) ? $publicData[AccountManager::PROPERTY_DISPLAYNAME]['value'] : '',
+ 'email' => isset($publicData[AccountManager::PROPERTY_EMAIL]) ? $publicData[AccountManager::PROPERTY_EMAIL]['value'] : '',
+ 'address' => isset($publicData[AccountManager::PROPERTY_ADDRESS]) ? $publicData[AccountManager::PROPERTY_ADDRESS]['value'] : '',
+ 'website' => isset($publicData[AccountManager::PROPERTY_WEBSITE]) ? $publicData[AccountManager::PROPERTY_WEBSITE]['value'] : '',
+ 'twitter' => isset($publicData[AccountManager::PROPERTY_TWITTER]) ? $publicData[AccountManager::PROPERTY_TWITTER]['value'] : '',
+ 'phone' => isset($publicData[AccountManager::PROPERTY_PHONE]) ? $publicData[AccountManager::PROPERTY_PHONE]['value'] : '',
+ ];
+ $dataArray = $this->signer->sign('lookupserver', $dataArray, $user);
+ $httpClient = $this->clientService->newClient();
+ try {
+ $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,
+ ]
+ );
+ }
+ }
+}