summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-07-01 14:35:44 +0200
committerRobin Appelman <icewind@owncloud.com>2014-07-01 14:36:06 +0200
commit1c43081d3819ab360fad3f44b6cf2cd8d2cf25a9 (patch)
tree3407ad51fb8ffd7d911083066ed1796685b5f6f5 /apps
parent99960d774750ae836697f8191504341f3a6418b6 (diff)
downloadnextcloud-server-1c43081d3819ab360fad3f44b6cf2cd8d2cf25a9.tar.gz
nextcloud-server-1c43081d3819ab360fad3f44b6cf2cd8d2cf25a9.zip
Detect removed public shares
Diffstat (limited to 'apps')
-rw-r--r--apps/files_sharing/lib/external/scanner.php18
-rw-r--r--apps/files_sharing/lib/external/storage.php77
2 files changed, 77 insertions, 18 deletions
diff --git a/apps/files_sharing/lib/external/scanner.php b/apps/files_sharing/lib/external/scanner.php
index 8921dd1a4c0..4dc5d4be9d8 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 454196f15ae..be3f367c383 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);
}
}