lookup server connector

Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
This commit is contained in:
Bjoern Schiessle 2016-11-17 17:00:25 +01:00 committed by Roeland Jago Douma
parent b23a4ca96b
commit 069023416c
No known key found for this signature in database
GPG key ID: F941078878347C0C
2 changed files with 82 additions and 12 deletions

View file

@ -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);
});

View file

@ -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,
]
);
}
}