--- /dev/null
+<?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.");
+ }
+ }
+}
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
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
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);
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]+'));