[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