Add a configuration switch for enabled preview mimetypes

This commit is contained in:
Lukas Reschke 2014-09-19 13:35:21 +02:00
parent 831d34f084
commit ca3447fcde
4 changed files with 63 additions and 61 deletions

View File

@ -284,6 +284,29 @@ $CONFIG = array(
/* cl parameters for libreoffice / openoffice */ /* cl parameters for libreoffice / openoffice */
'preview_office_cl_parameters' => '', 'preview_office_cl_parameters' => '',
/**
* Only register providers that have been explicitly enabled
*
* The following providers are enabled by default:
* - OC\Preview\Image
* - OC\Preview\MP3
* - OC\Preview\TXT
* - OC\Preview\MarkDown
*
* The following providers are disabled by default due to performance or privacy concerns:
* - OC\Preview\Office
* - OC\Preview\SVG
* - OC\Preview\Movies
* - OC\Preview\PDF
* - OC\Preview\Tiff
*/
'enabledPreviewProviders' => array(
'OC\Preview\Image',
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown'
),
/* whether avatars should be enabled */ /* whether avatars should be enabled */
'enable_avatars' => true, 'enable_avatars' => true,

View File

@ -13,7 +13,6 @@
*/ */
namespace OC; namespace OC;
use OC\Files\Filesystem;
use OC\Preview\Provider; use OC\Preview\Provider;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
@ -23,7 +22,6 @@ require_once 'preview/mp3.php';
require_once 'preview/pdf.php'; require_once 'preview/pdf.php';
require_once 'preview/svg.php'; require_once 'preview/svg.php';
require_once 'preview/txt.php'; require_once 'preview/txt.php';
require_once 'preview/unknown.php';
require_once 'preview/office.php'; require_once 'preview/office.php';
require_once 'preview/tiff.php'; require_once 'preview/tiff.php';
@ -62,6 +60,7 @@ class Preview {
//preview providers //preview providers
static private $providers = array(); static private $providers = array();
static private $registeredProviders = array(); static private $registeredProviders = array();
static private $enabledProviders = array();
/** /**
* @var \OCP\Files\FileInfo * @var \OCP\Files\FileInfo
@ -669,12 +668,39 @@ class Preview {
} }
/** /**
* register a new preview provider to be used * Register a new preview provider to be used
* @param $class
* @param array $options * @param array $options
* @return void
*/ */
public static function registerProvider($class, $options = array()) { public static function registerProvider($class, $options = array()) {
self::$registeredProviders[] = array('class' => $class, 'options' => $options); /**
* Only register providers that have been explicitly enabled
*
* The following providers are enabled by default:
* - OC\Preview\Image
* - OC\Preview\MP3
* - OC\Preview\TXT
* - OC\Preview\MarkDown
*
* The following providers are disabled by default due to performance or privacy concerns:
* - OC\Preview\Office
* - OC\Preview\SVG
* - OC\Preview\Movies
* - OC\Preview\PDF
* - OC\Preview\Tiff
*/
if(empty(self::$enabledProviders)) {
self::$enabledProviders = \OC::$server->getConfig()->getSystemValue('enabledPreviewProviders', array(
'OC\Preview\Image',
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown',
));
}
if(in_array($class, self::$enabledProviders)) {
self::$registeredProviders[] = array('class' => $class, 'options' => $options);
}
} }
/** /**
@ -682,9 +708,8 @@ class Preview {
* @return void * @return void
*/ */
private static function initProviders() { private static function initProviders() {
if (!\OC_Config::getValue('enable_previews', true)) { if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) {
$provider = new Preview\Unknown(array()); self::$providers = array();
self::$providers = array($provider->getMimeType() => $provider);
return; return;
} }
@ -698,12 +723,12 @@ class Preview {
/** @var $object Provider */ /** @var $object Provider */
$object = new $class($options); $object = new $class($options);
self::$providers[$object->getMimeType()] = $object; self::$providers[$object->getMimeType()] = $object;
} }
$keys = array_map('strlen', array_keys(self::$providers)); $keys = array_map('strlen', array_keys(self::$providers));
array_multisort($keys, SORT_DESC, self::$providers); array_multisort($keys, SORT_DESC, self::$providers);
} }
public static function post_write($args) { public static function post_write($args) {
@ -758,9 +783,7 @@ class Preview {
self::initProviders(); self::initProviders();
} }
//remove last element because it has the mimetype * foreach (self::$providers as $supportedMimeType => $provider) {
$providers = array_slice(self::$providers, 0, -1);
foreach ($providers as $supportedMimeType => $provider) {
/** /**
* @var \OC\Preview\Provider $provider * @var \OC\Preview\Provider $provider
*/ */

View File

@ -31,6 +31,11 @@ if (extension_loaded('imagick')) {
$content = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . $content; $content = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . $content;
} }
// Do not parse SVG files with references
if(stripos($content, 'xlink:href') !== false) {
return false;
}
$svg->readImageBlob($content); $svg->readImageBlob($content);
$svg->setImageFormat('png32'); $svg->setImageFormat('png32');
} catch (\Exception $e) { } catch (\Exception $e) {

View File

@ -1,49 +0,0 @@
<?php
/**
* Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Preview;
class Unknown extends Provider {
public function getMimeType() {
return '/.*/';
}
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
$mimetype = $fileview->getMimeType($path);
$path = \OC_Helper::mimetypeIcon($mimetype);
$path = \OC::$SERVERROOT . substr($path, strlen(\OC::$WEBROOT));
$svgPath = substr_replace($path, 'svg', -3);
if (extension_loaded('imagick') && file_exists($svgPath) && count(@\Imagick::queryFormats("SVG")) === 1) {
// http://www.php.net/manual/de/imagick.setresolution.php#85284
$svg = new \Imagick();
$svg->readImage($svgPath);
$res = $svg->getImageResolution();
$x_ratio = $res['x'] / $svg->getImageWidth();
$y_ratio = $res['y'] / $svg->getImageHeight();
$svg->removeImage();
$svg->setResolution($maxX * $x_ratio, $maxY * $y_ratio);
$svg->setBackgroundColor(new \ImagickPixel('transparent'));
$svg->readImage($svgPath);
$svg->setImageFormat('png32');
$image = new \OC_Image();
$image->loadFromData($svg);
} else {
$image = new \OC_Image($path);
}
return $image;
}
}
\OC\Preview::registerProvider('OC\Preview\Unknown');