[Pkg-owncloud-commits] [owncloud] 167/273: Detect removed public shares
David Prévot
taffit at moszumanska.debian.org
Fri Jul 4 03:13:12 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository owncloud.
commit 1c43081d3819ab360fad3f44b6cf2cd8d2cf25a9
Author: Robin Appelman <icewind at owncloud.com>
Date: Tue Jul 1 14:35:44 2014 +0200
Detect removed public shares
---
apps/files_sharing/lib/external/scanner.php | 18 +----
apps/files_sharing/lib/external/storage.php | 77 +++++++++++++++++++++-
...leexception.php => storageinvalidexception.php} | 5 +-
lib/public/files/storagenotavailableexception.php | 3 +
4 files changed, 84 insertions(+), 19 deletions(-)
diff --git a/apps/files_sharing/lib/external/scanner.php b/apps/files_sharing/lib/external/scanner.php
index 8921dd1..4dc5d4b 100644
--- a/apps/files_sharing/lib/external/scanner.php
+++ b/apps/files_sharing/lib/external/scanner.php
@@ -19,23 +19,7 @@ class Scanner extends \OC\Files\Cache\Scanner {
}
public function scanAll() {
- $remote = $this->storage->getRemote();
- $token = $this->storage->getToken();
- $password = $this->storage->getPassword();
- $url = $remote . '/index.php/apps/files_sharing/shareinfo?t=' . $token;
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- http_build_query(array('password' => $password)));
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
- $result = curl_exec($ch);
- curl_close($ch);
-
- $data = json_decode($result, true);
+ $data = $this->storage->getShareInfo();
if ($data['status'] === 'success') {
$this->addResult($data['data'], '');
} else {
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 454196f..be3f367 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -10,7 +10,11 @@ namespace OCA\Files_Sharing\External;
use OC\Files\Filesystem;
use OC\Files\Storage\DAV;
+use OC\ForbiddenException;
use OCA\Files_Sharing\ISharedStorage;
+use OCP\Files\NotFoundException;
+use OCP\Files\StorageInvalidException;
+use OCP\Files\StorageNotAvailableException;
class Storage extends DAV implements ISharedStorage {
/**
@@ -108,6 +112,8 @@ class Storage extends DAV implements ISharedStorage {
*
* @param string $path
* @param int $time
+ * @throws \OCP\Files\StorageNotAvailableException
+ * @throws \OCP\Files\StorageInvalidException
* @return bool
*/
public function hasUpdated($path, $time) {
@@ -117,6 +123,75 @@ class Storage extends DAV implements ISharedStorage {
return false;
}
$this->updateChecked = true;
- return parent::hasUpdated('', $time);
+ try {
+ return parent::hasUpdated('', $time);
+ } catch (StorageNotAvailableException $e) {
+ // see if we can find out why the share is unavailable\
+ try {
+ $this->getShareInfo();
+ } catch (NotFoundException $shareException) {
+ // 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 mark the storage as invalid
+ throw new StorageInvalidException();
+ } else {
+ // ownCloud instance is gone, likely to be a temporary server configuration error
+ throw $e;
+ }
+ } catch(\Exception $shareException) {
+ // todo, maybe handle 403 better and ask the user for a new password
+ throw $e;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * check if the configured remote is a valid ownCloud instance
+ *
+ * @return bool
+ */
+ protected function testRemote() {
+ try {
+ $result = file_get_contents($this->remote . '/status.php');
+ $data = json_decode($result);
+ return is_object($data) and !empty($data->version);
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ public function getShareInfo() {
+ $remote = $this->getRemote();
+ $token = $this->getToken();
+ $password = $this->getPassword();
+ $url = $remote . '/index.php/apps/files_sharing/shareinfo?t=' . $token;
+
+ $ch = curl_init();
+
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS,
+ http_build_query(array('password' => $password)));
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+ $result = curl_exec($ch);
+
+ $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ curl_close($ch);
+
+ switch ($status) {
+ case 401:
+ case 403:
+ throw new ForbiddenException();
+ case 404:
+ throw new NotFoundException();
+ case 500:
+ throw new \Exception();
+ }
+
+ return json_decode($result, true);
}
}
diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storageinvalidexception.php
similarity index 82%
copy from lib/public/files/storagenotavailableexception.php
copy to lib/public/files/storageinvalidexception.php
index fcc0c9c..7419ccc 100644
--- a/lib/public/files/storagenotavailableexception.php
+++ b/lib/public/files/storageinvalidexception.php
@@ -15,5 +15,8 @@
// This means that they should be used by apps instead of the internal ownCloud classes
namespace OCP\Files;
-class StorageNotAvailableException extends \Exception {
+/**
+ * Storage has invalid configuration
+ */
+class StorageInvalidException extends \Exception {
}
diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storagenotavailableexception.php
index fcc0c9c..b526cb4 100644
--- a/lib/public/files/storagenotavailableexception.php
+++ b/lib/public/files/storagenotavailableexception.php
@@ -15,5 +15,8 @@
// This means that they should be used by apps instead of the internal ownCloud classes
namespace OCP\Files;
+/**
+ * Storage is temporarily not available
+ */
class StorageNotAvailableException extends \Exception {
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git
More information about the Pkg-owncloud-commits
mailing list