From 57d57b8d8f270d586f15d7bd45557362905c1ae3 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 5 Mar 2016 01:26:34 +0100 Subject: [PATCH] Handle reuploads via filehandle better if original is missing --- lib/mediafile.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/mediafile.php b/lib/mediafile.php index 7534dc53cb..dc7000f384 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -286,8 +286,31 @@ class MediaFile try { $file = File::getByHash($filehash); // Already have it, so let's reuse the locally stored File - $filename = $file->filename; + // by using getPath we also check whether the file exists + // and throw a FileNotFoundException with the path if it doesn't. + $filename = basename($file->getPath()); $mimetype = $file->mimetype; + } catch (FileNotFoundException $e) { + // This happens if the file we have uploaded has disappeared + // from the local filesystem for some reason. Since we got the + // File object from a sha256 check in fromFilehandle, it's safe + // to just copy the uploaded data to disk! + + fseek($fh, 0); // just to be sure, go to the beginning + // dump the contents of our filehandle to the path from our exception + // and report error if it failed. + if (false === file_put_contents($e->path, fread($fh, filesize($stream['uri'])))) { + // TRANS: Client exception thrown when a file upload operation fails because the file could + // TRANS: not be moved from the temporary folder to the permanent file location. + throw new ClientException(_('File could not be moved to destination directory.')); + } + if (!chmod($e->path, 0664)) { + common_log(LOG_ERR, 'Could not chmod uploaded file: '._ve($e->path)); + } + + $filename = basename($file->getPath()); + $mimetype = $file->mimetype; + } catch (NoResultException $e) { File::respectsQuota($scoped, filesize($stream['uri']));