|
|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|