4 changed files with 199 additions and 59 deletions
-
57apps/files/appinfo/update.php
-
7lib/private/repair.php
-
87lib/repair/repairmimetypes.php
-
107tests/lib/repair/repairmimetypes.php
@ -0,0 +1,87 @@ |
|||
<?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', |
|||
); |
|||
|
|||
$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) |
|||
); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* Fix mime types |
|||
*/ |
|||
public function run() { |
|||
// TODO: check precondition to avoid running the fix every time
|
|||
if ($this->fixOfficeMimeTypes()) { |
|||
$this->emit('\OC\Repair', 'info', array('Fixed office mime types')); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,107 @@ |
|||
<?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']); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 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
|
|||
$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/msexcel'), |
|||
array('test.xlsx', 'application/vnd.ms-excel'), |
|||
array('test.ppt', 'application/mspowerpoint'), |
|||
array('test.pptx', 'application/vnd.ms-powerpoint'), |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Dummy class to access protected members |
|||
*/ |
|||
class DummyFileCache extends \OC\Files\Cache\Cache { |
|||
|
|||
public static function clearCachedMimeTypes() { |
|||
self::$mimetypeIds = array(); |
|||
self::$mimetypes = array(); |
|||
} |
|||
} |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue