]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/File.php
Merge branch 'master' of git.gnu.io:gnu/gnu-social into mmn_fixes
[quix0rs-gnu-social.git] / classes / File.php
index d6dd78cbef0afde8437245af1b11e88d0d0eb2a8..9643b78f189ef6c8ed8f6a7389c6a23c0b4c52d3 100644 (file)
@@ -113,17 +113,30 @@ class File extends Managed_DataObject
         if (isset($u['host']) && $u['host'] === common_config('site', 'server')) {
             $r = Router::get();
             // Skip the / in the beginning or $r->map won't match
-            $args = $r->map(mb_substr($u['path'], 1));
-            if ($args['action'] === 'attachment') {
-                try {
-                    // $args['attachment'] should always be set if action===attachment, given our routing rules
-                    $file = File::getByID($args['attachment']);
-                    return $file;
-                } catch (EmptyIdException $e) {
-                    // ...but $args['attachment'] can also be 0...
-                } catch (NoResultException $e) {
-                    // apparently this link goes to us, but is _not_ an existing attachment (File) ID?
+            try {
+                $args = $r->map(mb_substr($u['path'], 1));
+                if ($args['action'] === 'attachment') {
+                    try {
+                        // $args['attachment'] should always be set if action===attachment, given our routing rules
+                        $file = File::getByID($args['attachment']);
+                        return $file;
+                    } catch (EmptyIdException $e) {
+                        // ...but $args['attachment'] can also be 0...
+                    } catch (NoResultException $e) {
+                        // apparently this link goes to us, but is _not_ an existing attachment (File) ID?
+                    }
                 }
+            } catch (Exception $e) {
+                // Some other exception was thrown from $r->map, likely a
+                // ClientException (404) because of some malformed link to
+                // our own instance. It's still a valid URL however, so we
+                // won't abort anything... I noticed this when linking:
+                // https://social.umeahackerspace.se/mmn/foaf' (notice the
+                // apostrophe in the end, making it unrecognizable for our
+                // URL routing.
+                // That specific issue (the apostrophe being part of a link
+                // is something that may or may not have been fixed since,
+                // in lib/util.php in common_replace_urls_callback().
             }
         }
 
@@ -247,11 +260,7 @@ class File extends Managed_DataObject
 
     public function getFilename()
     {
-        if (!self::validFilename($this->filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
-        return $this->filename;
+        return self::tryFilename($this->filename);
     }
 
     // where should the file go?
@@ -336,19 +345,27 @@ class File extends Managed_DataObject
         return preg_match('/^[A-Za-z0-9._-]+$/', $filename);
     }
 
+    static function tryFilename($filename)
+    {
+        if (!self::validFilename($filename))
+        {
+            throw new InvalidFilenameException($filename);
+        }
+        // if successful, return the filename for easy if-statementing
+        return $filename;
+    }
+
     /**
      * @throws ClientException on invalid filename
      */
     static function path($filename)
     {
-        if (!self::validFilename($filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
+        self::tryFilename($filename);
+
         $dir = common_config('attachments', 'dir');
 
-        if ($dir[strlen($dir)-1] != '/') {
-            $dir .= '/';
+        if (!in_array($dir[mb_strlen($dir)-1], ['/', '\\'])) {
+            $dir .= DIRECTORY_SEPARATOR;
         }
 
         return $dir . $filename;
@@ -356,10 +373,7 @@ class File extends Managed_DataObject
 
     static function url($filename)
     {
-        if (!self::validFilename($filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
+        self::tryFilename($filename);
 
         if (common_config('site','private')) {
 
@@ -479,7 +493,13 @@ class File extends Managed_DataObject
             // null  means "always use file as thumbnail"
             // false means you get choice between frozen frame or original when calling getThumbnail
             if (is_null(common_config('thumbnail', 'animated')) || !$force_still) {
-                throw new UseFileAsThumbnailException($this->id);
+                try {
+                    // remote files with animated GIFs as thumbnails will match this
+                    return File_thumbnail::byFile($this);
+                } catch (NoResultException $e) {
+                    // and if it's not a remote file, it'll be safe to use the locally stored File
+                    throw new UseFileAsThumbnailException($this->id);
+                }
             }
         }
 
@@ -500,7 +520,7 @@ class File extends Managed_DataObject
     {
         if ($prefer_local && !empty($this->filename)) {
             // A locally stored file, so let's generate a URL for our instance.
-            return self::url($this->filename);
+            return self::url($this->getFilename());
         }
 
         // No local filename available, return the URL we have stored