]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/mediafile.php
Handle reuploads via filehandle better if original is missing
[quix0rs-gnu-social.git] / lib / mediafile.php
index 546239ed7d3bf6de2bbf4b7421139a1d9c694690..dc7000f3848a4f7c01a025d3242cb769abca9c11 100644 (file)
@@ -61,7 +61,7 @@ class MediaFile
 
     public function attachToNotice(Notice $notice)
     {
-        File_to_post::processNew($this->fileRecord->id, $notice->id);
+        File_to_post::processNew($this->fileRecord, $notice);
     }
 
     public function getPath()
@@ -74,6 +74,11 @@ class MediaFile
         return $this->short_fileurl;
     }
 
+    function getEnclosure()
+    {
+        return $this->getFile()->getEnclosure();
+    }
+
     function delete()
     {
         $filepath = File::path($this->filename);
@@ -248,15 +253,15 @@ class MediaFile
             File::respectsQuota($scoped, $_FILES[$param]['size']);
 
             $mimetype = self::getUploadedMimeType($_FILES[$param]['tmp_name'], $_FILES[$param]['name']);
+            $basename = basename($_FILES[$param]['name']);
 
             switch (common_config('attachments', 'filename_base')) {
             case 'upload':
-                $basename = basename($_FILES[$param]['name']);
                 $filename = File::filename($scoped, $basename, $mimetype);
                 break;
             case 'hash':
             default:
-                $filename = strtolower($filehash) . '.' . File::guessMimeExtension($mimetype); 
+                $filename = strtolower($filehash) . '.' . File::guessMimeExtension($mimetype, $basename);
             }
             $filepath = File::path($filename);
 
@@ -281,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']));
 
@@ -301,10 +329,10 @@ class MediaFile
             $result = copy($stream['uri'], $filepath) && chmod($filepath, 0664);
 
             if (!$result) {
+                common_log(LOG_ERR, 'File could not be moved (or chmodded) from '._ve($stream['uri']) . ' to ' . _ve($filepath));
                 // 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.' .
-                    $stream['uri'] . ' ' . $filepath));
+                throw new ClientException(_('File could not be moved to destination directory.' ));
             }
         }