]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
[CORE][UI][ROUTER] Added view action, which inlines images and videos but downloads...
authorMiguel Dantas <biodantasgs@gmail.com>
Wed, 26 Jun 2019 00:54:55 +0000 (01:54 +0100)
committerDiogo Cordeiro <diogo@fc.up.pt>
Sat, 3 Aug 2019 16:31:40 +0000 (17:31 +0100)
README.md
actions/attachment_view.php [new file with mode: 0644]
classes/File.php
lib/framework.php
lib/router.php

index e14c7d6b927c1978e09923ffe66baedfbf9e75b6..f0bd960008c164b0f9acf4bd723e924e9ee5f8f1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# GNU social 1.23.x
+# GNU social 1.24.x
 (c) 2010-2019 Free Software Foundation, Inc
 
 This is the README file for GNU social, the free
diff --git a/actions/attachment_view.php b/actions/attachment_view.php
new file mode 100644 (file)
index 0000000..6a3b7df
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+/**
+ * Download notice attachment
+ *
+ * @category Personal
+ * @package  GNUsocial
+ * @author   Mikael Nordfeldth <mmn@hethane.se>
+ * @license  https://www.gnu.org/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     https:/gnu.io/social
+ */
+class Attachment_viewAction extends AttachmentAction
+{
+    public function showPage()
+    {
+        // Checks file exists or throws FileNotStoredLocallyException
+        $filepath = $this->attachment->getPath();
+
+        $filename = MediaFile::getDisplayName($this->attachment);
+
+        // Disable errors, to not mess with the file contents (suppress errors in case access to this
+        // function is blocked, like in some shared hosts). Automatically reset at the end of the
+        // script execution, and we don't want to have any more errors until then, so don't reset it
+        @ini_set('display_errors', 0);
+
+        header("Content-Description: File Transfer");
+        header("Content-Type: {$this->attachment->mimetype}");
+        if (in_array(common_get_mime_media($this->attachment->mimetype), ['image', 'video'])) {
+            header("Content-Disposition: inline; filename=\"{$filename}\"");
+        } else {
+            header("Content-Disposition: attachment; filename=\"{$filename}\"");
+        }
+        header('Expires: 0');
+        header('Content-Transfer-Encoding: binary'); // FIXME? Can this be different?
+        $filesize = $this->attachment->size;
+        // 'if available', it says, so ensure we have it
+        if (empty($filesize)) {
+            $filesize = filesize($this->attachment->filename);
+        }
+        header("Content-Length: {$filesize}");
+        // header('Cache-Control: private, no-transform, no-store, must-revalidate');
+
+        $ret = @readfile($filepath);
+
+        if ($ret === false || $ret !== $filesize) {
+            common_log(LOG_ERR, "The lengths of the file as recorded on the DB (or on disk) for the file " .
+                       "{$filepath}, with id={$this->attachment->id} differ from what was sent to the user.");
+        }
+    }
+}
index 902cafeabc931dfee5b6d321eea578d54b29f9f0..8df0c25e4ec1960f8f16c28e632d4aef2477c5cf 100644 (file)
@@ -599,6 +599,11 @@ class File extends Managed_DataObject
         return common_local_url('attachment_download', array('attachment'=>$this->getID()));
     }
 
+    public function getAttachmentViewUrl()
+    {
+        return common_local_url('attachment_view', array('attachment'=>$this->getID()));
+    }
+
     /**
      * @param mixed $use_local true means require local, null means prefer local, false means use whatever is stored
      * @return string
@@ -609,7 +614,7 @@ class File extends Managed_DataObject
         if ($use_local !== false) {
             if (is_string($this->filename) || !empty($this->filename)) {
                 // A locally stored file, so let's generate a URL for our instance.
-                return self::url($this->getFilename());
+                return getAttachmentViewUrl();
             }
             if ($use_local) {
                 // if the file wasn't stored locally (has filename) and we require a local URL
index 664e8707b3cd89f98cc7e33e8b41f33b10110615..1bbdaca3f1bb315f8dfd7cb252ad4e4b47475fe5 100644 (file)
@@ -32,7 +32,7 @@ defined('GNUSOCIAL') || die();
 define('GNUSOCIAL_ENGINE', 'GNU social');
 define('GNUSOCIAL_ENGINE_URL', 'https://www.gnu.org/software/social/');
 
-define('GNUSOCIAL_BASE_VERSION', '1.23.0');
+define('GNUSOCIAL_BASE_VERSION', '1.24.0');
 define('GNUSOCIAL_LIFECYCLE', 'dev'); // 'dev', 'alpha[0-9]+', 'beta[0-9]+', 'rc[0-9]+', 'release'
 
 define('GNUSOCIAL_VERSION', GNUSOCIAL_BASE_VERSION . '-' . GNUSOCIAL_LIFECYCLE);
index be87afd88d647ab8187b4a53c26f8a2b941a326b..2bffd84a3b1a3501eb9363dcebec784b5bc260a3 100644 (file)
@@ -223,6 +223,10 @@ class Router
                         array('action' => 'attachment'),
                         array('attachment' => '[0-9]+'));
 
+            $m->connect('attachment/:attachment/view',
+                        array('action' => 'attachment_view'),
+                        array('attachment' => '[0-9]+'));
+
             $m->connect('attachment/:attachment/download',
                         array('action' => 'attachment_download'),
                         array('attachment' => '[0-9]+'));