Skip to content

Commit

Permalink
Merge pull request #28604 from owncloud/stable10-large-federated-shares
Browse files Browse the repository at this point in the history
[stable10] Large federated shares
  • Loading branch information
Vincent Petry authored Aug 8, 2017
2 parents d59f7f8 + ceb0c94 commit b28c46d
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 325 deletions.
33 changes: 15 additions & 18 deletions apps/files_sharing/ajax/external.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,31 +122,28 @@
\OCP\JSON::error(['data' => ['message' => $l->t('Storage not valid')]]);
exit();
}
$result = $storage->file_exists('');
if ($result) {
try {
$storage->getScanner()->scanAll();
\OCP\JSON::success();
} catch (\OCP\Files\StorageInvalidException $e) {
\OCP\Util::writeLog(
'files_sharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
\OCP\Util::DEBUG
);
\OCP\JSON::error(['data' => ['message' => $l->t('Storage not valid')]]);
} catch (\Exception $e) {

try {
$result = $storage->file_exists('');
if (!$result) {
$externalManager->removeShare($mount->getMountPoint());
\OCP\Util::writeLog(
'files_sharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
'Couldn\'t add remote share',
\OCP\Util::DEBUG
);
\OCP\JSON::error(['data' => ['message' => $l->t('Couldn\'t add remote share')]]);
}
} else {
$externalManager->removeShare($mount->getMountPoint());
} catch (\OCP\Files\StorageInvalidException $e) {
\OCP\Util::writeLog(
'files_sharing',
'Couldn\'t add remote share',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
\OCP\Util::DEBUG
);
\OCP\JSON::error(['data' => ['message' => $l->t('Storage not valid')]]);
} catch (\Exception $e) {
\OCP\Util::writeLog(
'files_sharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
\OCP\Util::DEBUG
);
\OCP\JSON::error(['data' => ['message' => $l->t('Couldn\'t add remote share')]]);
Expand Down
11 changes: 10 additions & 1 deletion apps/files_sharing/ajax/shareinfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,17 @@
*
*/

/**
* @deprecated fetches all metadata, kept for compatibility with older instances
*/

OCP\JSON::checkAppEnabled('files_sharing');

OC::$server->getLogger()->warning(
'Deprecated api access from '.OC::$server->getRequest()->getRemoteAddress().
'. Ask remote to upgrade.', ['app' => 'files_sharing']
);

if (!isset($_GET['t'])) {
\OC_Response::setStatus(400); //400 Bad Request
exit;
Expand Down Expand Up @@ -101,4 +110,4 @@ function getChildInfo($dir, $view, $sharePermissions) {
$result['children'] = getChildInfo($rootInfo, $rootView, $sharePermissions);
}

OCP\JSON::success(['data' => $result]);
OCP\JSON::success(['data' => $result, 'message' => 'DEPRECATED API']);
127 changes: 0 additions & 127 deletions apps/files_sharing/lib/External/Scanner.php

This file was deleted.

112 changes: 19 additions & 93 deletions apps/files_sharing/lib/External/Storage.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,11 @@
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\ConnectException;
use OC\Files\Storage\DAV;
use OC\ForbiddenException;
use OCA\FederatedFileSharing\DiscoveryManager;
use OCA\Files_Sharing\ISharedStorage;
use OCP\AppFramework\Http;
use OCP\Files\NotFoundException;
use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
use Sabre\DAV\Client;

class Storage extends DAV implements ISharedStorage {
/** @var string */
Expand Down Expand Up @@ -89,7 +87,9 @@ public function __construct($options) {
'host' => $host,
'root' => $root,
'user' => $options['token'],
'password' => (string)$options['password']
'password' => (string)$options['password'],
// Federated sharing always uses BASIC auth
'authType' => Client::AUTH_BASIC
]);
}

Expand Down Expand Up @@ -139,21 +139,6 @@ public function getCache($path = '', $storage = null) {
return $this->cache;
}

/**
* @param string $path
* @param \OC\Files\Storage\Storage $storage
* @return \OCA\Files_Sharing\External\Scanner
*/
public function getScanner($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
}
if (!isset($this->scanner)) {
$this->scanner = new Scanner($storage);
}
return $this->scanner;
}

/**
* check if a file or folder has been updated since $time
*
Expand Down Expand Up @@ -207,29 +192,25 @@ public function test() {
public function checkStorageAvailability() {
// see if we can find out why the share is unavailable
try {
$this->getShareInfo();
} catch (NotFoundException $e) {
// a 404 can either mean that the share no longer exists or there is no ownCloud on the remote
if ($this->testRemote()) {
// valid ownCloud instance means that the public share no longer exists
// since this is permanent (re-sharing the file will create a new token)
// we remove the invalid storage
$this->manager->removeShare($this->mountPoint);
$this->manager->getMountManager()->removeMount($this->mountPoint);
throw new StorageInvalidException();
} else {
// ownCloud instance is gone, likely to be a temporary server configuration error
throw new StorageNotAvailableException();
if ( ! $this->propfind('') ) {
// a 404 can either mean that the share no longer exists or there is no ownCloud on the remote
if ($this->testRemote()) {
// valid ownCloud instance means that the public share no longer exists
// since this is permanent (re-sharing the file will create a new token)
// we remove the invalid storage
$this->manager->removeShare($this->mountPoint);
$this->manager->getMountManager()->removeMount($this->mountPoint);
throw new StorageInvalidException();
} else {
// ownCloud instance is gone, likely to be a temporary server configuration error
throw new StorageNotAvailableException();
}
}
} catch (ForbiddenException $e) {
} catch (StorageInvalidException $e) {
// auth error, remove share for now (provide a dialog in the future)
$this->manager->removeShare($this->mountPoint);
$this->manager->getMountManager()->removeMount($this->mountPoint);
throw new StorageInvalidException();
} catch (\GuzzleHttp\Exception\ConnectException $e) {
throw new StorageNotAvailableException();
} catch (\GuzzleHttp\Exception\RequestException $e) {
throw new StorageNotAvailableException();
throw $e;
} catch (\Exception $e) {
throw $e;
}
Expand Down Expand Up @@ -286,61 +267,6 @@ private function testRemoteUrl($url) {
return $returnValue;
}

/**
* Whether the remote is an ownCloud, used since some sharing features are not
* standardized. Let's use this to detect whether to use it.
*
* @return bool
*/
public function remoteIsOwnCloud() {
if(defined('PHPUNIT_RUN') || !$this->testRemoteUrl($this->getRemote() . '/status.php')) {
return false;
}
return true;
}

/**
* @return mixed
* @throws ForbiddenException
* @throws NotFoundException
* @throws \Exception
*/
public function getShareInfo() {
$remote = $this->getRemote();
$token = $this->getToken();
$password = $this->getPassword();

// If remote is not an ownCloud do not try to get any share info
if(!$this->remoteIsOwnCloud()) {
return ['status' => 'unsupported'];
}

$url = rtrim($remote, '/') . '/index.php/apps/files_sharing/shareinfo?t=' . $token;

// TODO: DI
$client = \OC::$server->getHTTPClientService()->newClient();
try {
$response = $client->post($url, [
'body' => ['password' => $password],
'timeout' => 10,
'connect_timeout' => 10,
]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
if ($e->getCode() === Http::STATUS_UNAUTHORIZED || $e->getCode() === Http::STATUS_FORBIDDEN) {
throw new ForbiddenException();
}
if ($e->getCode() === Http::STATUS_NOT_FOUND) {
throw new NotFoundException();
}
// throw this to be on the safe side: the share will still be visible
// in the UI in case the failure is intermittent, and the user will
// be able to decide whether to remove it if it's really gone
throw new StorageNotAvailableException();
}

return json_decode($response->getBody(), true);
}

public function getOwner($path) {
list(, $remote) = explode('://', $this->remote, 2);
return $this->remoteUser . '@' . $remote;
Expand Down
Loading

0 comments on commit b28c46d

Please sign in to comment.