summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Paroz <github@oparoz.com>2014-11-26 19:58:59 +0100
committerOlivier Paroz <github@oparoz.com>2015-01-24 01:49:13 +0100
commit7fbf1a20d7365da4c7eaea3aff857a5d72ee13fb (patch)
treeacfd8ac17ddc6e5425bf0a7fa011a5312e8528cd
parent4ec9ffdf0c6bed8279c5de4413bd01d07a963f52 (diff)
downloadnextcloud-server-7fbf1a20d7365da4c7eaea3aff857a5d72ee13fb.tar.gz
nextcloud-server-7fbf1a20d7365da4c7eaea3aff857a5d72ee13fb.zip
Updated the media type of some font types
TTF and TTF have now the same media type Official since 2013 and supported by Firefox and Chrome https://www.iana.org/assignments/media-types/application/font-sfnt Introducing support for Type1 fonts
-rw-r--r--lib/private/helper.php3
-rw-r--r--lib/private/mimetypes.list.php5
-rw-r--r--lib/repair/repairmimetypes.php189
-rw-r--r--tests/lib/repair/repairmimetypes.php105
4 files changed, 218 insertions, 84 deletions
diff --git a/lib/private/helper.php b/lib/private/helper.php
index 6268bd3d42e..c87eb63b662 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -40,7 +40,8 @@ class OC_Helper {
'application/x-gimp' => 'image',
'application/x-photoshop' => 'image',
- 'application/x-font-ttf' => 'font',
+ 'application/font-sfnt' => 'font',
+ 'application/x-font' => 'font',
'application/font-woff' => 'font',
'application/vnd.ms-fontobject' => 'font',
diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php
index 4f11829859a..265fffa7db3 100644
--- a/lib/private/mimetypes.list.php
+++ b/lib/private/mimetypes.list.php
@@ -104,9 +104,10 @@ return array(
'oga' => array('audio/ogg', null),
'ogg' => array('audio/ogg', null),
'ogv' => array('video/ogg', null),
- 'otf' => array('font/opentype', null),
+ 'otf' => array('application/font-sfnt', null),
'pages' => array('application/x-iwork-pages-sffpages', null),
'pdf' => array('application/pdf', null),
+ 'pfb' => array('application/x-font', null),
'php' => array('application/x-php', null),
'pl' => array('application/x-perl', null),
'png' => array('image/png', null),
@@ -137,7 +138,7 @@ return array(
'tgz' => array('application/x-compressed', null),
'tiff' => array('image/tiff', null),
'tif' => array('image/tiff', null),
- 'ttf' => array('application/x-font-ttf', null),
+ 'ttf' => array('application/font-sfnt', null),
'txt' => array('text/plain', null),
'vcard' => array('text/vcard', null),
'vcf' => array('text/vcard', null),
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index e3f4402cfd5..06cd144bff4 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -2,6 +2,7 @@
/**
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
* Copyright (c) 2014 Jörn Dreyer jfd@owncloud.com
+ * Copyright (c) 2014 Olivier Paroz owncloud@oparoz.com
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
@@ -16,32 +17,32 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
public function getName() {
return 'Repair mime types';
}
-
- private function fixOfficeMimeTypes() {
- // update wrong mimetypes
- $wrongMimetypes = array(
- 'application/mspowerpoint' => 'application/vnd.ms-powerpoint',
- 'application/msexcel' => 'application/vnd.ms-excel',
- );
-
- $existsStmt = \OC_DB::prepare('
+
+ private static function existsStmt() {
+ return \OC_DB::prepare('
SELECT count(`mimetype`)
FROM `*PREFIX*mimetypes`
WHERE `mimetype` = ?
');
+ }
- $getIdStmt = \OC_DB::prepare('
+ private static function getIdStmt() {
+ return \OC_DB::prepare('
SELECT `id`
FROM `*PREFIX*mimetypes`
WHERE `mimetype` = ?
');
+ }
- $insertStmt = \OC_DB::prepare('
+ private static function insertStmt() {
+ return \OC_DB::prepare('
INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
VALUES ( ? )
');
+ }
- $updateWrongStmt = \OC_DB::prepare('
+ private static function updateWrongStmt() {
+ return \OC_DB::prepare('
UPDATE `*PREFIX*filecache`
SET `mimetype` = (
SELECT `id`
@@ -49,106 +50,125 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
WHERE `mimetype` = ?
) WHERE `mimetype` = ?
');
-
- $deleteStmt = \OC_DB::prepare('
+ }
+
+ private static function deleteStmt() {
+ return \OC_DB::prepare('
DELETE FROM `*PREFIX*mimetypes`
WHERE `id` = ?
');
-
+ }
+
+ private static function updateByNameStmt() {
+ return \OC_DB::prepare('
+ UPDATE `*PREFIX*filecache`
+ SET `mimetype` = (
+ SELECT `id`
+ FROM `*PREFIX*mimetypes`
+ WHERE `mimetype` = ?
+ ) WHERE `name` LIKE ?
+ ');
+ }
+
+ private function repairMimetypes($wrongMimetypes) {
foreach ($wrongMimetypes as $wrong => $correct) {
-
-
// do we need to remove a wrong mimetype?
- $result = \OC_DB::executeAudited($getIdStmt, array($wrong));
+ $result = \OC_DB::executeAudited(self::getIdStmt(), array($wrong));
$wrongId = $result->fetchOne();
if ($wrongId !== false) {
-
// do we need to insert the correct mimetype?
- $result = \OC_DB::executeAudited($existsStmt, array($correct));
+ $result = \OC_DB::executeAudited(self::existsStmt(), array($correct));
$exists = $result->fetchOne();
- if ( ! $exists ) {
- // insert mimetype
- \OC_DB::executeAudited($insertStmt, array($correct));
- }
-
- // change wrong mimetype to correct mimetype in filecache
- \OC_DB::executeAudited($updateWrongStmt, array($correct, $wrongId));
+ if ( ! is_null($correct) ) {
+ if ( ! $exists ) {
+ // insert mimetype
+ \OC_DB::executeAudited(self::insertStmt(), array($correct));
+ }
+ // change wrong mimetype to correct mimetype in filecache
+ \OC_DB::executeAudited(self::updateWrongStmt(), array($correct, $wrongId));
+ }
+
// delete wrong mimetype
- \OC_DB::executeAudited($deleteStmt, array($wrongId));
+ \OC_DB::executeAudited(self::deleteStmt(), array($wrongId));
}
-
}
-
- $updatedMimetypes = array(
- 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
- );
-
- $updateByNameStmt = \OC_DB::prepare('
- UPDATE `*PREFIX*filecache`
- SET `mimetype` = (
- SELECT `id`
- FROM `*PREFIX*mimetypes`
- WHERE `mimetype` = ?
- ) WHERE `name` LIKE ?
- ');
-
- // separate doc from docx etc
+ }
+
+ private function updateMimetypes($updatedMimetypes) {
+
foreach ($updatedMimetypes as $extension => $mimetype ) {
- $result = \OC_DB::executeAudited($existsStmt, array($mimetype));
+ $result = \OC_DB::executeAudited(self::existsStmt(), array($mimetype));
$exists = $result->fetchOne();
if ( ! $exists ) {
// insert mimetype
- \OC_DB::executeAudited($insertStmt, array($mimetype));
+ \OC_DB::executeAudited(self::insertStmt(), array($mimetype));
}
// change mimetype for files with x extension
- \OC_DB::executeAudited($updateByNameStmt, array($mimetype, '%.'.$extension));
+ \OC_DB::executeAudited(self::updateByNameStmt(), array($mimetype, '%.'.$extension));
}
}
- private function fixAPKMimeType() {
- $existsStmt = \OC_DB::prepare('
- SELECT count(`mimetype`)
- FROM `*PREFIX*mimetypes`
- WHERE `mimetype` = ?
- ');
+ private function fixOfficeMimeTypes() {
+ // update wrong mimetypes
+ $wrongMimetypes = array(
+ 'application/mspowerpoint' => 'application/vnd.ms-powerpoint',
+ 'application/msexcel' => 'application/vnd.ms-excel',
+ );
- $insertStmt = \OC_DB::prepare('
- INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
- VALUES ( ? )
- ');
+ self::repairMimetypes($wrongMimetypes);
+ $updatedMimetypes = array(
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ );
- $updateByNameStmt = \OC_DB::prepare('
- UPDATE `*PREFIX*filecache`
- SET `mimetype` = (
- SELECT `id`
- FROM `*PREFIX*mimetypes`
- WHERE `mimetype` = ?
- ) WHERE `name` LIKE ?
- ');
+ // separate doc from docx etc
+ self::updateMimetypes($updatedMimetypes);
+
+ }
+
+ private function fixApkMimeType() {
+ $updatedMimetypes = array(
+ 'apk' => 'application/vnd.android.package-archive',
+ );
- $mimeTypeExtension = 'apk';
- $mimeTypeName = 'application/vnd.android.package-archive';
+ self::updateMimetypes($updatedMimetypes);
+ }
+
+ private function fixFontsMimeTypes() {
+ // update wrong mimetypes
+ $wrongMimetypes = array(
+ 'font' => null,
+ 'font/opentype' => 'application/font-sfnt',
+ 'application/x-font-ttf' => 'application/font-sfnt',
+ );
- $result = \OC_DB::executeAudited($existsStmt, array($mimeTypeName));
- $exists = $result->fetchOne();
+ self::repairMimetypes($wrongMimetypes);
+
+ $updatedMimetypes = array(
+ 'ttf' => 'application/font-sfnt',
+ 'otf' => 'application/font-sfnt',
+ 'pfb' => 'application/x-font',
+ );
- if ( ! $exists ) {
- // insert mimetype
- \OC_DB::executeAudited($insertStmt, array($mimeTypeName));
- }
+ self::updateMimetypes($updatedMimetypes);
+ }
+
+ private function fixPostscriptMimeType() {
+ $updatedMimetypes = array(
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ );
- // change mimetype for files with x extension
- \OC_DB::executeAudited($updateByNameStmt, array($mimeTypeName, '%.'.$mimeTypeExtension));
+ self::updateMimetypes($updatedMimetypes);
}
/**
@@ -158,10 +178,17 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
if ($this->fixOfficeMimeTypes()) {
$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
}
-
- if ($this->fixAPKMimeType()) {
+
+ if ($this->fixApkMimeType()) {
$this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
}
+
+ if ($this->fixFontsMimeTypes()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
+ }
+
+ if ($this->fixPostscriptMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
+ }
}
-}
-
+} \ No newline at end of file
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index 6eaf68d8a44..403474957f1 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -1,6 +1,7 @@
<?php
/**
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * Copyright (c) 2014 Olivier Paroz owncloud@oparoz.com
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
@@ -110,6 +111,33 @@ class TestRepairMimeTypes extends \Test\TestCase {
)
);
}
+
+ /**
+ * Test renaming old fonts mime types
+ */
+ public function testRenameFontsMimeTypes() {
+ $this->addEntries(
+ array(
+ array('test.ttf', 'application/x-font-ttf'),
+ array('test.otf', 'font/opentype'),
+ array('test.pfb', 'application/octet-stream'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.ttf', 'application/font-sfnt'),
+ array('test.otf', 'application/font-sfnt'),
+ array('test.pfb', 'application/x-font'),
+ )
+ );
+ }
/**
* Test renaming the APK mime type
@@ -137,6 +165,31 @@ class TestRepairMimeTypes extends \Test\TestCase {
)
);
}
+
+ /**
+ * Test renaming the postscript mime types
+ */
+ public function testRenamePostscriptMimeType() {
+ $this->addEntries(
+ array(
+ array('test.eps', 'application/octet-stream'),
+ array('test.ps', 'application/octet-stream'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.eps', 'application/postscript'),
+ array('test.ps', 'application/postscript'),
+ )
+ );
+ }
/**
* Test renaming and splitting old office mime types when
@@ -188,6 +241,46 @@ class TestRepairMimeTypes extends \Test\TestCase {
$this->assertNull($this->getMimeTypeIdFromDB('application/msexcel'));
$this->assertNull($this->getMimeTypeIdFromDB('application/mspowerpoint'));
}
+
+ /**
+ * Test renaming old fonts mime types when
+ * new ones already exist
+ */
+ public function testRenameFontsMimeTypesWhenExist() {
+ $this->addEntries(
+ array(
+ array('test.ttf', 'application/x-font-ttf'),
+ array('test.otf', 'font/opentype'),
+ // make it so that the new mimetypes already exist
+ array('bogus.ttf', 'application/font-sfnt'),
+ array('bogus.otf', 'application/font-sfnt'),
+ array('bogus2.ttf', 'application/wrong'),
+ array('bogus2.otf', 'application/wrong'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.ttf', 'application/font-sfnt'),
+ array('test.otf', 'application/font-sfnt'),
+ array('bogus.ttf', 'application/font-sfnt'),
+ array('bogus.otf', 'application/font-sfnt'),
+ array('bogus2.ttf', 'application/font-sfnt'),
+ array('bogus2.otf', 'application/font-sfnt'),
+ )
+ );
+
+ // wrong mimetypes are gone
+ $this->assertNull($this->getMimeTypeIdFromDB('application/x-font-ttf'));
+ $this->assertNull($this->getMimeTypeIdFromDB('font'));
+ $this->assertNull($this->getMimeTypeIdFromDB('font/opentype'));
+ }
/**
* Test that nothing happens and no error happens when all mimetypes are
@@ -202,6 +295,12 @@ class TestRepairMimeTypes extends \Test\TestCase {
array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
array('test.ppt', 'application/vnd.ms-powerpoint'),
array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+ array('test.apk', 'application/vnd.android.package-archive'),
+ array('test.ttf', 'application/font-sfnt'),
+ array('test.otf', 'application/font-sfnt'),
+ array('test.pfb', 'application/x-font'),
+ array('test.eps', 'application/postscript'),
+ array('test.ps', 'application/postscript'),
)
);
@@ -219,6 +318,12 @@ class TestRepairMimeTypes extends \Test\TestCase {
array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
array('test.ppt', 'application/vnd.ms-powerpoint'),
array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+ array('test.apk', 'application/vnd.android.package-archive'),
+ array('test.ttf', 'application/font-sfnt'),
+ array('test.otf', 'application/font-sfnt'),
+ array('test.pfb', 'application/x-font'),
+ array('test.eps', 'application/postscript'),
+ array('test.ps', 'application/postscript'),
)
);
}