properly lock the target file on dav upload when not using part files
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
ea89600ca0
commit
547177b482
|
@ -148,12 +148,21 @@ class File extends Node implements IFile {
|
|||
$this->emitPreHooks($exists);
|
||||
}
|
||||
|
||||
$view = \OC\Files\Filesystem::getView();
|
||||
|
||||
// the part file and target file might be on a different storage in case of a single file storage (e.g. single file share)
|
||||
/** @var \OC\Files\Storage\Storage $partStorage */
|
||||
list($partStorage, $internalPartPath) = $this->fileView->resolvePath($partFilePath);
|
||||
/** @var \OC\Files\Storage\Storage $storage */
|
||||
list($storage, $internalPath) = $this->fileView->resolvePath($this->path);
|
||||
try {
|
||||
if (!$needsPartFile) {
|
||||
if ($view && !$this->emitPreHooks($exists)) {
|
||||
throw new Exception('Could not write to final file, canceled by hook');
|
||||
}
|
||||
$this->changeLock(ILockingProvider::LOCK_EXCLUSIVE);
|
||||
}
|
||||
|
||||
$target = $partStorage->fopen($internalPartPath, 'wb');
|
||||
if ($target === false) {
|
||||
\OCP\Util::writeLog('webdav', '\OC\Files\Filesystem::fopen() failed', \OCP\Util::ERROR);
|
||||
|
@ -189,9 +198,11 @@ class File extends Node implements IFile {
|
|||
}
|
||||
|
||||
try {
|
||||
$view = \OC\Files\Filesystem::getView();
|
||||
$run = ($view && $needsPartFile) ? $this->emitPreHooks($exists) : true;
|
||||
|
||||
if ($needsPartFile) {
|
||||
if ($view && !$this->emitPreHooks($exists)) {
|
||||
$partStorage->unlink($internalPartPath);
|
||||
throw new Exception('Could not rename part file to final file, canceled by hook');
|
||||
}
|
||||
try {
|
||||
$this->changeLock(ILockingProvider::LOCK_EXCLUSIVE);
|
||||
} catch (LockedException $e) {
|
||||
|
@ -201,15 +212,12 @@ class File extends Node implements IFile {
|
|||
throw new FileLocked($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
|
||||
if ($needsPartFile) {
|
||||
// rename to correct path
|
||||
try {
|
||||
if ($run) {
|
||||
$renameOkay = $storage->moveFromStorage($partStorage, $internalPartPath, $internalPath);
|
||||
$fileExists = $storage->file_exists($internalPath);
|
||||
}
|
||||
if (!$run || $renameOkay === false || $fileExists === false) {
|
||||
\OCP\Util::writeLog('webdav', 'renaming part file to final file failed ($run: ' . ( $run ? 'true' : 'false' ) . ', $renameOkay: ' . ( $renameOkay ? 'true' : 'false' ) . ', $fileExists: ' . ( $fileExists ? 'true' : 'false' ) . ')', \OCP\Util::ERROR);
|
||||
if ($renameOkay === false || $fileExists === false) {
|
||||
\OC::$server->getLogger()->error('renaming part file to final file failed ($run: ' . ( $run ? 'true' : 'false' ) . ', $renameOkay: ' . ( $renameOkay ? 'true' : 'false' ) . ', $fileExists: ' . ( $fileExists ? 'true' : 'false' ) . ')', ['app' => 'webdav']);
|
||||
throw new Exception('Could not rename part file to final file');
|
||||
}
|
||||
} catch (ForbiddenException $ex) {
|
||||
|
|
Loading…
Reference in New Issue