/**
  * @param \Closure $callback
  */
 public function syncThemAll(\Closure $callback)
 {
     $trustedServers = $this->dbHandler->getAllServer();
     foreach ($trustedServers as $trustedServer) {
         $url = $trustedServer['url'];
         $callback($url, null);
         $sharedSecret = $trustedServer['shared_secret'];
         $syncToken = $trustedServer['sync_token'];
         if (is_null($sharedSecret)) {
             continue;
         }
         $targetBookId = $trustedServer['url_hash'];
         $targetPrincipal = "principals/system/system";
         $targetBookProperties = ['{DAV:}displayname' => $url];
         try {
             $newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetBookProperties);
             if ($newToken !== $syncToken) {
                 $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
             }
         } catch (\Exception $ex) {
             if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) {
                 $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_ACCESS_REVOKED);
             }
             $callback($url, $ex);
         }
     }
 }
 /**
  * @param InputInterface $input
  * @param OutputInterface $output
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $progress = new ProgressBar($output);
     $progress->start();
     $trustedServers = $this->dbHandler->getAllServer();
     foreach ($trustedServers as $trustedServer) {
         $progress->advance();
         $url = $trustedServer['url'];
         $sharedSecret = $trustedServer['shared_secret'];
         $syncToken = $trustedServer['sync_token'];
         if (is_null($sharedSecret)) {
             continue;
         }
         $targetBookId = sha1($url);
         $targetPrincipal = "principals/system/system";
         $targetBookProperties = ['{DAV:}displayname' => $url];
         try {
             $newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetPrincipal, $targetBookId, $targetBookProperties);
             if ($newToken !== $syncToken) {
                 $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
             }
         } catch (\Exception $ex) {
             $output->writeln("Error while syncing {$url} : " . $ex->getMessage());
         }
     }
     $progress->finish();
     $output->writeln('');
 }
 protected function run($argument)
 {
     $target = $argument['url'];
     $source = $this->urlGenerator->getAbsoluteURL('/');
     $source = rtrim($source, '/');
     $token = $argument['token'];
     try {
         $result = $this->httpClient->get($target . $this->endPoint, ['query' => ['url' => $source, 'token' => $token], 'timeout' => 3, 'connect_timeout' => 3]);
         $status = $result->getStatusCode();
     } catch (ClientException $e) {
         $status = $e->getCode();
         $this->logger->logException($e);
     }
     // if we received a unexpected response we try again later
     if ($status !== Http::STATUS_OK && $status !== Http::STATUS_FORBIDDEN) {
         $this->jobList->add('OCA\\Federation\\BackgroundJob\\GetSharedSecret', $argument);
     } else {
         // reset token if we received a valid response
         $this->dbHandler->addToken($target, '');
     }
     if ($status === Http::STATUS_OK) {
         $body = $result->getBody();
         $result = json_decode($body, true);
         if (isset($result['ocs']['data']['sharedSecret'])) {
             $this->trustedServers->addSharedSecret($target, $result['ocs']['data']['sharedSecret']);
         } else {
             $this->logger->error('remote server "' . $target . '"" does not return a valid shared secret', ['app' => 'federation']);
             $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
         }
     }
 }
Example #4
0
 protected function run($argument)
 {
     $target = $argument['url'];
     $source = $this->urlGenerator->getAbsoluteURL('/');
     $source = rtrim($source, '/');
     $token = $argument['token'];
     try {
         $result = $this->httpClient->post($target . $this->endPoint, ['body' => ['url' => $source, 'token' => $token], 'timeout' => 3, 'connect_timeout' => 3]);
         $status = $result->getStatusCode();
     } catch (ClientException $e) {
         $status = $e->getCode();
         $this->logger->logException($e);
     } catch (\Exception $e) {
         $status = HTTP::STATUS_INTERNAL_SERVER_ERROR;
         $this->logger->logException($e);
     }
     // if we received a unexpected response we try again later
     if ($status !== Http::STATUS_OK && $status !== Http::STATUS_FORBIDDEN) {
         $this->jobList->add('OCA\\Federation\\BackgroundJob\\RequestSharedSecret', $argument);
     }
     if ($status === Http::STATUS_FORBIDDEN) {
         // clear token if remote server refuses to ask for shared secret
         $this->dbHandler->addToken($target, '');
     }
 }
Example #5
0
 /**
  * @dataProvider providesAuth
  */
 public function testAuth($expectedResult, $user, $password)
 {
     if ($expectedResult) {
         $this->dbHandler->addServer('url1');
         $this->dbHandler->addSharedSecret('url1', $password);
     }
     $result = $this->dbHandler->auth($user, $password);
     $this->assertEquals($expectedResult, $result);
 }
Example #6
0
 protected function run($argument)
 {
     $target = $argument['url'];
     $source = $this->urlGenerator->getAbsoluteURL('/');
     $source = rtrim($source, '/');
     $token = $argument['token'];
     $result = null;
     try {
         $result = $this->httpClient->get($target . $this->endPoint, ['query' => ['url' => $source, 'token' => $token], 'timeout' => 3, 'connect_timeout' => 3]);
         $status = $result->getStatusCode();
     } catch (ClientException $e) {
         $status = $e->getCode();
         if ($status === Http::STATUS_FORBIDDEN) {
             $this->logger->info($target . ' refused to exchange a shared secret with you.', ['app' => 'federation']);
         } else {
             $this->logger->logException($e, ['app' => 'federation']);
         }
     } catch (\Exception $e) {
         $status = Http::STATUS_INTERNAL_SERVER_ERROR;
         $this->logger->logException($e, ['app' => 'federation']);
     }
     // if we received a unexpected response we try again later
     if ($status !== Http::STATUS_OK && $status !== Http::STATUS_FORBIDDEN) {
         $this->retainJob = true;
     } else {
         // reset token if we received a valid response
         $this->dbHandler->addToken($target, '');
     }
     if ($status === Http::STATUS_OK && $result instanceof IResponse) {
         $body = $result->getBody();
         $result = json_decode($body, true);
         if (isset($result['ocs']['data']['sharedSecret'])) {
             $this->trustedServers->addSharedSecret($target, $result['ocs']['data']['sharedSecret']);
         } else {
             $this->logger->error('remote server "' . $target . '"" does not return a valid shared secret', ['app' => 'federation']);
             $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
         }
     }
 }
Example #7
0
 /**
  * Validates a username and password
  *
  * This method should return true or false depending on if login
  * succeeded.
  *
  * @param string $username
  * @param string $password
  * @return bool
  */
 protected function validateUserPass($username, $password)
 {
     return $this->db->auth($username, $password);
 }
Example #8
0
 protected function isValidToken($url, $token)
 {
     $storedToken = $this->dbHandler->getToken($url);
     return hash_equals($storedToken, $token);
 }
Example #9
0
 public function testGetServerStatus()
 {
     $this->dbHandler->addServer('server1');
     $this->dbHandler->setServerStatus('http://server1', TrustedServers::STATUS_OK);
     $this->assertSame(TrustedServers::STATUS_OK, $this->dbHandler->getServerStatus('https://server1'));
 }