diff --git a/apps/lookup_server_connector/appinfo/app.php b/apps/lookup_server_connector/appinfo/app.php index e74f101853..dc076b7882 100644 --- a/apps/lookup_server_connector/appinfo/app.php +++ b/apps/lookup_server_connector/appinfo/app.php @@ -21,8 +21,13 @@ $dispatcher = \OC::$server->getEventDispatcher(); -$dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) { +$dispatcher->addListener('OC\AccountManager::userUpdated', function(\Symfony\Component\EventDispatcher\GenericEvent $event) { $user = $event->getSubject(); - $updateLookupServer = new \OCA\LookupServerConnector\UpdateLookupServer(); + $updateLookupServer = new \OCA\LookupServerConnector\UpdateLookupServer( + new \OC\Accounts\AccountManager(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()), + \OC::$server->getConfig(), + \OC::$server->getSecureRandom(), + \OC::$server->getHTTPClientService() + ); $updateLookupServer->userUpdated($user); }); diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php index 2ccdf5b5a8..b6d8b9782a 100644 --- a/apps/lookup_server_connector/lib/UpdateLookupServer.php +++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php @@ -24,8 +24,10 @@ namespace OCA\LookupServerConnector; use OC\Accounts\AccountManager; +use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\IUser; +use OCP\Security\ISecureRandom; /** * Class UpdateLookupServer @@ -40,15 +42,31 @@ class UpdateLookupServer { /** @var IConfig */ private $config; + /** @var ISecureRandom */ + private $secureRandom; + + /** @var IClientService */ + private $clientService; + + /** @var string URL point to lookup server */ + private $lookupServer = 'http://192.168.56.102'; + /** * UpdateLookupServer constructor. * * @param AccountManager $accountManager * @param IConfig $config + * @param ISecureRandom $secureRandom + * @param IClientService $clientService */ - public function __construct(AccountManager $accountManager, IConfig $config) { - $this->accountManager; + public function __construct(AccountManager $accountManager, + IConfig $config, + ISecureRandom $secureRandom, + IClientService $clientService) { + $this->accountManager = $accountManager; $this->config = $config; + $this->secureRandom = $secureRandom; + $this->clientService = $clientService; } @@ -58,16 +76,16 @@ class UpdateLookupServer { $publicData = []; - foreach ($userData as $data) { + foreach ($userData as $key => $data) { if ($data['scope'] === AccountManager::VISIBILITY_PUBLIC) { - $publicData[] = $data; + $publicData[$key] = $data; } } - if (empty($publicData)) { - $this->removeFromLookupServer($user); + if (empty($publicData) && !empty($authKey)) { + $this->removeFromLookupServer($user, $authKey); } else { - $this->sendToLookupServer($publicData, $authKey); + $this->sendToLookupServer($user, $publicData, $authKey); } } @@ -83,11 +101,58 @@ class UpdateLookupServer { /** * send public user data to the lookup server * + * @param IUser $user * @param array $publicData * @param string $authKey */ - protected function sendToLookupServer($publicData, $authKey) { - // If we don't update a existing entry, the server will return a authKey and we - // will add it to the database + protected function sendToLookupServer(IUser $user, $publicData, $authKey) { + if (empty($authKey)) { + $authKey = $this->secureRandom->generate(16); + $this->sendNewRecord($user, $publicData, $authKey); + $this->config->setUserValue($user->getUID(), 'lookup_server_connector', 'authKey', $authKey); + } else { + $this->updateExistingRecord($user, $publicData, $authKey); + } + } + + protected function sendNewRecord(IUser $user, $publicData, $authKey) { + $httpClient = $this->clientService->newClient(); + $response = $httpClient->post($this->lookupServer, + [ + 'body' => [ + 'key' => $authKey, + 'federationid' => $publicData[$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'] : '', + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + ); + } + + protected function updateExistingRecord(IUser $user, $publicData, $authKey) { + $httpClient = $this->clientService->newClient(); + $httpClient->put($this->lookupServer, + [ + 'body' => [ + 'key' => $authKey, + 'federationid' => $publicData[$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'] : '', + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + ); + } }