summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files/appinfo/update.php57
-rw-r--r--lib/private/repair.php7
-rw-r--r--lib/repair/repairmimetypes.php125
-rw-r--r--tests/lib/repair/repairmimetypes.php207
4 files changed, 337 insertions, 59 deletions
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
index a9b8ccbf824..de635e5ce6b 100644
--- a/apps/files/appinfo/update.php
+++ b/apps/files/appinfo/update.php
@@ -6,60 +6,3 @@ if (version_compare(\OCP\Config::getSystemValue('version', '0.0.0'), '7.0.0', '<
\OCP\Config::deleteSystemValue('allowZipDownload');
\OCP\Config::deleteSystemValue('maxZipInputSize');
}
-
-if (version_compare(\OCP\Config::getAppValue('files', 'installed_version'), '1.1.9', '<')) {
-
- // update wrong mimetypes
- $wrongMimetypes = array(
- 'application/mspowerpoint' => 'application/vnd.ms-powerpoint',
- 'application/msexcel' => 'application/vnd.ms-excel',
- );
-
- $stmt = OC_DB::prepare('
- UPDATE `*PREFIX*mimetypes`
- SET `mimetype` = ?
- WHERE `mimetype` = ?
- ');
-
- foreach ($wrongMimetypes as $wrong => $correct) {
- OC_DB::executeAudited($stmt, array($wrong, $correct));
- }
-
- $updatedMimetypes = array(
- 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'xlsx' => 'application/vnd.ms-excel',
- 'pptx' => 'application/vnd.ms-powerpoint',
- );
-
- // separate doc from docx etc
- foreach ($updatedMimetypes as $extension => $mimetype ) {
- $result = OC_DB::executeAudited('
- SELECT count(`mimetype`)
- FROM `*PREFIX*mimetypes`
- WHERE `mimetype` = ?
- ', array($mimetype)
- );
-
- $exists = $result->fetchOne();
-
- if ( ! $exists ) {
- // insert mimetype
- OC_DB::executeAudited('
- INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
- VALUES ( ? )
- ', array($mimetype)
- );
- }
-
- // change mimetype for files with x extension
- OC_DB::executeAudited('
- UPDATE `*PREFIX*filecache`
- SET `mimetype` = (
- SELECT `id`
- FROM `*PREFIX*mimetypes`
- WHERE `mimetype` = ?
- ) WHERE `name` LIKE ?
- ', array($mimetype, '%.'.$extension)
- );
- }
-} \ No newline at end of file
diff --git a/lib/private/repair.php b/lib/private/repair.php
index db2a04433b0..14a917be32c 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -68,7 +68,9 @@ class Repair extends BasicEmitter {
* @return array of RepairStep instances
*/
public static function getRepairSteps() {
- return array();
+ return array(
+ new \OC\Repair\RepairMimeTypes()
+ );
}
/**
@@ -78,7 +80,8 @@ class Repair extends BasicEmitter {
* @return array of RepairStep instances
*/
public static function getBeforeUpgradeRepairSteps() {
- return array();
+ return array(
+ );
}
/**
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
new file mode 100644
index 00000000000..f7618c6e060
--- /dev/null
+++ b/lib/repair/repairmimetypes.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * Copyright (c) 2014 Jörn Dreyer jfd@owncloud.com
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Repair;
+
+use OC\Hooks\BasicEmitter;
+
+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('
+ SELECT count(`mimetype`)
+ FROM `*PREFIX*mimetypes`
+ WHERE `mimetype` = ?
+ ');
+
+ $getIdStmt = \OC_DB::prepare('
+ SELECT `id`
+ FROM `*PREFIX*mimetypes`
+ WHERE `mimetype` = ?
+ ');
+
+ $insertStmt = \OC_DB::prepare('
+ INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
+ VALUES ( ? )
+ ');
+
+ $updateWrongStmt = \OC_DB::prepare('
+ UPDATE `*PREFIX*filecache`
+ SET `mimetype` = (
+ SELECT `id`
+ FROM `*PREFIX*mimetypes`
+ WHERE `mimetype` = ?
+ ) WHERE `mimetype` = ?
+ ');
+
+ $deleteStmt = \OC_DB::prepare('
+ DELETE FROM `*PREFIX*mimetypes`
+ WHERE `id` = ?
+ ');
+
+ foreach ($wrongMimetypes as $wrong => $correct) {
+
+
+ // do we need to remove a wrong mimetype?
+ $result = \OC_DB::executeAudited($getIdStmt, array($wrong));
+ $wrongId = $result->fetchOne();
+
+ if ($wrongId !== false) {
+
+ // do we need to insert the correct mimetype?
+ $result = \OC_DB::executeAudited($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));
+
+ // delete wrong mimetype
+ \OC_DB::executeAudited($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
+ foreach ($updatedMimetypes as $extension => $mimetype ) {
+ $result = \OC_DB::executeAudited($existsStmt, array($mimetype));
+ $exists = $result->fetchOne();
+
+ if ( ! $exists ) {
+ // insert mimetype
+ \OC_DB::executeAudited($insertStmt, array($mimetype));
+ }
+
+ // change mimetype for files with x extension
+ \OC_DB::executeAudited($updateByNameStmt, array($mimetype, '%.'.$extension));
+ }
+ }
+
+ /**
+ * Fix mime types
+ */
+ public function run() {
+ if ($this->fixOfficeMimeTypes()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
+ }
+ }
+}
+
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
new file mode 100644
index 00000000000..3ed19bd55bb
--- /dev/null
+++ b/tests/lib/repair/repairmimetypes.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Tests for the converting of legacy storages to home storages.
+ *
+ * @see \OC\Repair\RepairMimeTypes
+ */
+class TestRepairMimeTypes extends PHPUnit_Framework_TestCase {
+
+ /** @var \OC\RepairStep */
+ private $repair;
+
+ private $storage;
+
+ public function setUp() {
+ $this->storage = new \OC\Files\Storage\Temporary(array());
+
+ $this->repair = new \OC\Repair\RepairMimeTypes();
+ }
+
+ public function tearDown() {
+ $this->storage->getCache()->clear();
+ $sql = 'DELETE FROM `*PREFIX*storages` WHERE `id` = ?';
+ \OC_DB::executeAudited($sql, array($this->storage->getId()));
+ $this->clearMimeTypes();
+
+ DummyFileCache::clearCachedMimeTypes();
+ }
+
+ private function clearMimeTypes() {
+ $sql = 'DELETE FROM `*PREFIX*mimetypes`';
+ \OC_DB::executeAudited($sql);
+ }
+
+ private function addEntries($entries) {
+ // create files for the different extensions, this
+ // will also automatically create the corresponding mime types
+ foreach ($entries as $entry) {
+ $this->storage->getCache()->put(
+ $entry[0],
+ array(
+ 'size' => 0,
+ 'mtime' => 0,
+ 'mimetype' => $entry[1]
+ )
+ );
+ }
+
+ }
+
+ private function checkEntries($entries) {
+ foreach ($entries as $entry) {
+ $data = $this->storage->getCache()->get($entry[0]);
+ $this->assertEquals($entry[1], $data['mimetype']);
+ }
+ }
+
+ /**
+ * Returns the id of a given mime type or null
+ * if it does not exist.
+ */
+ private function getMimeTypeIdFromDB($mimeType) {
+ $sql = 'SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = ?';
+ $results = \OC_DB::executeAudited($sql, array($mimeType));
+ $result = $results->fetchOne();
+ if ($result) {
+ return $result['id'];
+ }
+ return null;
+ }
+
+ /**
+ * Test renaming and splitting old office mime types
+ */
+ public function testRenameOfficeMimeTypes() {
+ $this->addEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/msword'),
+ array('test.xls', 'application/msexcel'),
+ array('test.xlsx', 'application/msexcel'),
+ array('test.ppt', 'application/mspowerpoint'),
+ array('test.pptx', 'application/mspowerpoint'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('test.xls', 'application/vnd.ms-excel'),
+ 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'),
+ )
+ );
+ }
+
+ /**
+ * Test renaming and splitting old office mime types when
+ * new ones already exist
+ */
+ public function testRenameOfficeMimeTypesWhenExist() {
+ $this->addEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/msword'),
+ array('test.xls', 'application/msexcel'),
+ array('test.xlsx', 'application/msexcel'),
+ array('test.ppt', 'application/mspowerpoint'),
+ array('test.pptx', 'application/mspowerpoint'),
+ // make it so that the new mimetypes already exist
+ array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('bogus.xlsx', 'application/vnd.ms-excel'),
+ array('bogus.pptx', 'application/vnd.ms-powerpoint'),
+ array('bogus2.docx', 'application/wrong'),
+ array('bogus2.xlsx', 'application/wrong'),
+ array('bogus2.pptx', 'application/wrong'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('test.xls', 'application/vnd.ms-excel'),
+ 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('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('bogus.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+ array('bogus.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+ array('bogus2.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('bogus2.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+ array('bogus2.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+ )
+ );
+
+ // wrong mimetypes are gone
+ $this->assertNull($this->getMimeTypeIdFromDB('application/msexcel'));
+ $this->assertNull($this->getMimeTypeIdFromDB('application/mspowerpoint'));
+ }
+
+ /**
+ * Test that nothing happens and no error happens when all mimetypes are
+ * already correct and no old ones exist..
+ */
+ public function testDoNothingWhenOnlyNewFiles() {
+ $this->addEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('test.xls', 'application/vnd.ms-excel'),
+ 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'),
+ )
+ );
+
+ $this->repair->run();
+
+ // force mimetype reload
+ DummyFileCache::clearCachedMimeTypes();
+ $this->storage->getCache()->loadMimeTypes();
+
+ $this->checkEntries(
+ array(
+ array('test.doc', 'application/msword'),
+ array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+ array('test.xls', 'application/vnd.ms-excel'),
+ 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'),
+ )
+ );
+ }
+}
+
+/**
+ * Dummy class to access protected members
+ */
+class DummyFileCache extends \OC\Files\Cache\Cache {
+
+ public static function clearCachedMimeTypes() {
+ self::$mimetypeIds = array();
+ self::$mimetypes = array();
+ }
+}
+