summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-06-17 17:40:46 +0200
committerVincent Petry <pvince81@owncloud.com>2015-06-18 12:05:26 +0200
commita9bca9e3aa58feb1d8c6a1f8fdd15e3a7c436650 (patch)
tree31b1f02527dc776213a918b6a39286a427472743 /lib
parenta89bb1d3839b80f8846b0ed9e462a42065d4ad9f (diff)
downloadnextcloud-server-a9bca9e3aa58feb1d8c6a1f8fdd15e3a7c436650.tar.gz
nextcloud-server-a9bca9e3aa58feb1d8c6a1f8fdd15e3a7c436650.zip
Lock file before download
This will throw a LockedException if a concurrent request is currently touching that file.
Diffstat (limited to 'lib')
-rw-r--r--lib/private/files.php15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/private/files.php b/lib/private/files.php
index 5a3e1029199..90d83a170bd 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -43,6 +43,8 @@
// TODO: get rid of this using proper composer packages
require_once 'mcnetic/phpzipstreamer/ZipStreamer.php';
+use OCP\Lock\ILockingProvider;
+
/**
* Class for file server access
*
@@ -82,6 +84,7 @@ class OC_Files {
* @param boolean $only_header ; boolean to only send header of the request
*/
public static function get($dir, $files, $only_header = false) {
+ $view = \OC\Files\Filesystem::getView();
$xsendfile = false;
if (isset($_SERVER['MOD_X_SENDFILE_ENABLED']) ||
isset($_SERVER['MOD_X_SENDFILE2_ENABLED']) ||
@@ -131,7 +134,9 @@ class OC_Files {
OC_Util::obEnd();
try {
-
+ if ($get_type === self::FILE) {
+ $view->lockFile($filename, ILockingProvider::LOCK_SHARED);
+ }
if ($zip or \OC\Files\Filesystem::isReadable($filename)) {
self::sendHeaders($filename, $name, $zip);
} elseif (!\OC\Files\Filesystem::file_exists($filename)) {
@@ -168,7 +173,6 @@ class OC_Files {
set_time_limit($executionTime);
} else {
if ($xsendfile) {
- $view = \OC\Files\Filesystem::getView();
/** @var $storage \OC\Files\Storage\Storage */
list($storage) = $view->resolvePath($filename);
if ($storage->isLocal()) {
@@ -180,6 +184,13 @@ class OC_Files {
\OC\Files\Filesystem::readfile($filename);
}
}
+ if ($get_type === self::FILE) {
+ $view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
+ }
+ } catch (\OCP\Lock\LockedException $ex) {
+ $l = \OC::$server->getL10N('core');
+ $hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
+ \OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint);
} catch (\Exception $ex) {
$l = \OC::$server->getL10N('core');
$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';