use OC\Accounts\AccountManager;
+use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IUser;
+use OCP\Security\ISecureRandom;
/**
* 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;
}
$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);
}
}
/**
* 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,
+ ]
+ );
+
}
}