X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fattachmentlistitem.php;h=de1087d44cb75f360df589ecd4abfe8ed9566207;hb=0a4eeb89dab241779147c8c02a8f5f0f83533309;hp=3764c827cb2f7ea459f4db9ceb99601177274531;hpb=527224266b9d9908dcf44d3f6a838a44d9a6215c;p=quix0rs-gnu-social.git diff --git a/lib/attachmentlistitem.php b/lib/attachmentlistitem.php index 3764c827cb..de1087d44c 100644 --- a/lib/attachmentlistitem.php +++ b/lib/attachmentlistitem.php @@ -63,7 +63,7 @@ class AttachmentListItem extends Widget } function title() { - return $this->attachment->getTitle(); + return $this->attachment->getTitle() ?: _('Untitled attachment'); } function linkTitle() { @@ -81,96 +81,117 @@ class AttachmentListItem extends Widget function show() { $this->showStart(); - $this->showNoticeAttachment(); + try { + $this->showNoticeAttachment(); + } catch (Exception $e) { + $this->element('div', ['class'=>'error'], $e->getMessage()); + common_debug($e->getMessage()); + } $this->showEnd(); } function linkAttr() { - return array('class' => 'attachment', - 'href' => $this->attachment->getUrl(), - 'id' => 'attachment-' . $this->attachment->id, + return array( + 'class' => 'u-url', + 'href' => $this->attachment->getAttachmentUrl(), 'title' => $this->linkTitle()); } - function showLink() { - $this->out->elementStart('a', $this->linkAttr()); - $this->out->element('span', null, $this->linkTitle()); - $this->showRepresentation(); - $this->out->elementEnd('a'); - } - function showNoticeAttachment() { - $this->showLink(); + $this->showRepresentation(); } function showRepresentation() { + $enclosure = $this->attachment->getEnclosure(); + if (Event::handle('StartShowAttachmentRepresentation', array($this->out, $this->attachment))) { - if (!empty($this->attachment->mimetype)) { - switch ($this->attachment->mimetype) { - case 'image/gif': - case 'image/png': - case 'image/jpg': - case 'image/jpeg': - try { - $thumb = $this->attachment->getThumbnail(); - $this->out->element('img', array('class'=>'u-photo', 'src' => $thumb->getUrl(), 'alt' => '')); - } catch (UseFileAsThumbnailException $e) { - $this->out->element('img', array('class'=>'u-photo', 'src' => $e->file->getUrl(), 'alt' => $e->file->title)); - } catch (UnsupportedMediaException $e) { - // FIXME: Show a good representation of unsupported/unshowable images - } - break; - case 'application/ogg': - $arr = array('type' => $this->attachment->mimetype, - 'data' => $this->attachment->url, - 'width' => 320, - 'height' => 240 - ); - $this->out->elementStart('object', $arr); - $this->out->element('param', array('name' => 'src', 'value' => $this->attachment->url)); - $this->out->element('param', array('name' => 'autoStart', 'value' => 1)); - $this->out->elementEnd('object'); + $this->out->elementStart('label'); + $this->out->element('a', $this->linkAttr(), $this->title()); + $this->out->elementEnd('label'); + + if (!empty($enclosure->mimetype)) { + // First, prepare a thumbnail if it exists. + $thumb = null; + try { + // Tell getThumbnail that we can show an animated image if it has one (4th arg, "force_still") + $thumb = $this->attachment->getThumbnail(null, null, false, false); + } catch (UseFileAsThumbnailException $e) { + $thumb = null; + } catch (UnsupportedMediaException $e) { + // FIXME: Show a good representation of unsupported/unshowable images + $thumb = null; + } + + // Then get the kind of mediatype we're dealing with + $mediatype = common_get_mime_media($enclosure->mimetype); + + // FIXME: Get proper mime recognition of Ogg files! If system has 'mediainfo', this should do it: + // $ mediainfo --inform='General;%InternetMediaType%' + if ($this->attachment->mimetype === 'application/ogg') { + $mediatype = 'video'; // because this element can handle Ogg/Vorbis etc. on its own + } + + // Ugly hack to show text/html links which have a thumbnail (such as from oEmbed/OpenGraph image URLs) + if (!in_array($mediatype, ['image','audio','video']) && $thumb instanceof File_thumbnail) { + $mediatype = 'image'; + } + + switch ($mediatype) { + // Anything we understand as an image, if we need special treatment, do it in StartShowAttachmentRepresentation + case 'image': + if ($thumb instanceof File_thumbnail) { + $this->out->element('img', $thumb->getHtmlAttrs(['class'=>'u-photo', 'alt' => ''])); + } else { + try { + // getUrl(true) because we don't want to hotlink, could be made configurable + $this->out->element('img', ['class'=>'u-photo', 'src'=>$this->attachment->getUrl(true), 'alt' => $this->attachment->getTitle()]); + } catch (FileNotStoredLocallyException $e) { + $url = $e->file->getUrl(false); + $this->out->element('a', ['href'=>$url, 'rel'=>'external'], $url); + } + } + unset($thumb); // there's no need carrying this along after this break; - case 'audio/ogg': - case 'audio/x-speex': - case 'video/mpeg': - case 'audio/mpeg': - case 'video/mp4': - case 'video/ogg': - case 'video/quicktime': - case 'video/webm': - $mediatype = common_get_mime_media($this->attachment->mimetype); - try { - $thumb = $this->attachment->getThumbnail(); + // HTML5 media elements + case 'audio': + case 'video': + if ($thumb instanceof File_thumbnail) { $poster = $thumb->getUrl(); - unset ($thumb); - } catch (Exception $e) { + unset($thumb); // there's no need carrying this along after this + } else { $poster = null; } + $this->out->elementStart($mediatype, array('class'=>"attachment_player u-{$mediatype}", 'poster'=>$poster, 'controls'=>'controls')); $this->out->element('source', - array('src'=>$this->attachment->url, + array('src'=>$this->attachment->getUrl(), 'type'=>$this->attachment->mimetype)); $this->out->elementEnd($mediatype); break; - case 'text/html': - if (!empty($this->attachment->filename) - && (StatusNet::isAjax() || common_config('attachments', 'show_html'))) { - // Locally-uploaded HTML. Scrub and display inline. - $this->showHtmlFile($this->attachment); + default: + unset($thumb); // there's no need carrying this along + switch (common_bare_mime($this->attachment->mimetype)) { + case 'text/plain': + $this->element('div', ['class'=>'e-content plaintext'], file_get_contents($this->attachment->getPath())); break; + case 'text/html': + if (!empty($this->attachment->filename) + && (GNUsocial::isAjax() || common_config('attachments', 'show_html'))) { + // Locally-uploaded HTML. Scrub and display inline. + $this->showHtmlFile($this->attachment); + break; + } + // Fall through to default if it wasn't a _local_ text/html File object + default: + Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment)); } - // Fall through to default. - - default: - Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment)); } } else { Event::handle('ShowUnsupportedAttachmentRepresentation', array($this->out, $this->attachment)); @@ -192,11 +213,7 @@ class AttachmentListItem extends Widget */ protected function scrubHtmlFile(File $attachment) { - $path = File::path($attachment->filename); - if (!file_exists($path) || !is_readable($path)) { - common_log(LOG_ERR, "Missing local HTML attachment $path"); - return false; - } + $path = $attachment->getPath(); $raw = file_get_contents($path); // Normalize... @@ -223,13 +240,9 @@ class AttachmentListItem extends Widget $body = preg_replace('/^.*]*>/is', '', $body); $body = preg_replace('/<\/body[^>]*>.*$/is', '', $body); - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*', - 'comment' => 1); // remove comments - $scrubbed = htmLawed($body, $config); - - return $scrubbed; + require_once INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'; + $purifier = new HTMLPurifier(); + return $purifier->purify($body); } /**