forked from GNUsocial/gnu-social
Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 1.0.x
This commit is contained in:
commit
fdd9aa58e3
@ -180,7 +180,8 @@ class MediaFile
|
||||
return;
|
||||
}
|
||||
|
||||
$mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name']);
|
||||
$mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name'],
|
||||
$_FILES[$param]['name']);
|
||||
|
||||
$filename = null;
|
||||
|
||||
@ -241,19 +242,41 @@ class MediaFile
|
||||
return new MediaFile($user, $filename, $mimetype);
|
||||
}
|
||||
|
||||
static function getUploadedFileType($f) {
|
||||
/**
|
||||
* Attempt to identify the content type of a given file.
|
||||
*
|
||||
* @param mixed $f file handle resource, or filesystem path as string
|
||||
* @param string $originalFilename (optional) for extension-based detection
|
||||
* @return string
|
||||
*
|
||||
* @fixme is this an internal or public method? It's called from GetFileAction
|
||||
* @fixme this seems to tie a front-end error message in, kinda confusing
|
||||
* @fixme this looks like it could return a PEAR_Error in some cases, if
|
||||
* type can't be identified and $config['attachments']['supported'] is true
|
||||
*
|
||||
* @throws ClientException if type is known, but not supported for local uploads
|
||||
*/
|
||||
static function getUploadedFileType($f, $originalFilename=false) {
|
||||
require_once 'MIME/Type.php';
|
||||
require_once 'MIME/Type/Extension.php';
|
||||
$mte = new MIME_Type_Extension();
|
||||
|
||||
$cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd');
|
||||
$cmd = common_config('attachments', 'filecommand');
|
||||
|
||||
$filetype = null;
|
||||
|
||||
// If we couldn't get a clear type from the file extension,
|
||||
// we'll go ahead and try checking the content. Content checks
|
||||
// are unambiguous for most image files, but nearly useless
|
||||
// for office document formats.
|
||||
|
||||
if (is_string($f)) {
|
||||
|
||||
// assuming a filename
|
||||
|
||||
$filetype = MIME_Type::autoDetect($f);
|
||||
|
||||
} else {
|
||||
|
||||
// assuming a filehandle
|
||||
@ -262,7 +285,32 @@ class MediaFile
|
||||
$filetype = MIME_Type::autoDetect($stream['uri']);
|
||||
}
|
||||
|
||||
if (common_config('attachments', 'supported') === true || in_array($filetype, common_config('attachments', 'supported'))) {
|
||||
// The content-based sources for MIME_Type::autoDetect()
|
||||
// are wildly unreliable for office-type documents. If we've
|
||||
// gotten an unclear reponse back or just couldn't identify it,
|
||||
// we'll try detecting a type from its extension...
|
||||
$unclearTypes = array('application/octet-stream',
|
||||
'application/vnd.ms-office',
|
||||
'application/zip');
|
||||
|
||||
if ($originalFilename && (!$filetype || in_array($filetype, $unclearTypes))) {
|
||||
$type = $mte->getMIMEType($originalFilename);
|
||||
if (is_string($type)) {
|
||||
$filetype = $type;
|
||||
}
|
||||
}
|
||||
|
||||
$supported = common_config('attachments', 'supported');
|
||||
if (is_array($supported)) {
|
||||
// Normalize extensions to mime types
|
||||
foreach ($supported as $i => $entry) {
|
||||
if (strpos($entry, '/') === false) {
|
||||
common_log(LOG_INFO, "sample.$entry");
|
||||
$supported[$i] = $mte->getMIMEType("sample.$entry");
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($supported === true || in_array($filetype, $supported)) {
|
||||
return $filetype;
|
||||
}
|
||||
$media = MIME_Type::getMedia($filetype);
|
||||
|
96
tests/MediaFileTest.php
Normal file
96
tests/MediaFileTest.php
Normal file
@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
|
||||
print "This script must be run from the command line\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||
define('STATUSNET', true);
|
||||
define('LACONICA', true);
|
||||
|
||||
require_once INSTALLDIR . '/lib/common.php';
|
||||
|
||||
class MediaFileTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
|
||||
public function setup()
|
||||
{
|
||||
$this->old_attachments_supported = common_config('attachments', 'supported');
|
||||
$GLOBALS['config']['attachments']['supported'] = true;
|
||||
}
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
$GLOBALS['config']['attachments']['supported'] = $this->old_attachments_supported;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider fileTypeCases
|
||||
*
|
||||
*/
|
||||
public function testFileType($filename, $expectedType)
|
||||
{
|
||||
if (!file_exists($filename)) {
|
||||
throw new Exception("WTF? $filename test file missing");
|
||||
}
|
||||
|
||||
$type = MediaFile::getUploadedFileType($filename, basename($filename));
|
||||
$this->assertEquals($expectedType, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider fileTypeCases
|
||||
*
|
||||
*/
|
||||
public function testUploadedFileType($filename, $expectedType)
|
||||
{
|
||||
if (!file_exists($filename)) {
|
||||
throw new Exception("WTF? $filename test file missing");
|
||||
}
|
||||
$tmp = tmpfile();
|
||||
fwrite($tmp, file_get_contents($filename));
|
||||
|
||||
$type = MediaFile::getUploadedFileType($tmp, basename($filename));
|
||||
$this->assertEquals($expectedType, $type);
|
||||
}
|
||||
|
||||
static public function fileTypeCases()
|
||||
{
|
||||
$base = dirname(__FILE__);
|
||||
$dir = "$base/sample-uploads";
|
||||
$files = array(
|
||||
"image.png" => "image/png",
|
||||
"image.gif" => "image/gif",
|
||||
"image.jpg" => "image/jpeg",
|
||||
"image.jpeg" => "image/jpeg",
|
||||
|
||||
"office.pdf" => "application/pdf",
|
||||
|
||||
"wordproc.odt" => "application/vnd.oasis.opendocument.text",
|
||||
"wordproc.ott" => "application/vnd.oasis.opendocument.text-template",
|
||||
"wordproc.doc" => "application/msword",
|
||||
"wordproc.docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
"wordproc.rtf" => "text/rtf",
|
||||
|
||||
"spreadsheet.ods" => "application/vnd.oasis.opendocument.spreadsheet",
|
||||
"spreadsheet.ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
|
||||
"spreadsheet.xls" => "application/vnd.ms-excel",
|
||||
"spreadsheet.xlt" => "application/vnd.ms-excel",
|
||||
"spreadsheet.xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
|
||||
"presentation.odp" => "application/vnd.oasis.opendocument.presentation",
|
||||
"presentation.otp" => "application/vnd.oasis.opendocument.presentation-template",
|
||||
"presentation.ppt" => "application/vnd.ms-powerpoint",
|
||||
"presentation.pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
);
|
||||
|
||||
$dataset = array();
|
||||
foreach ($files as $file => $type) {
|
||||
$dataset[] = array("$dir/$file", $type);
|
||||
}
|
||||
return $dataset;
|
||||
}
|
||||
|
||||
}
|
||||
|
BIN
tests/sample-uploads/image.gif
Normal file
BIN
tests/sample-uploads/image.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 B |
BIN
tests/sample-uploads/image.jpeg
Normal file
BIN
tests/sample-uploads/image.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 306 B |
BIN
tests/sample-uploads/image.jpg
Normal file
BIN
tests/sample-uploads/image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 306 B |
BIN
tests/sample-uploads/image.png
Normal file
BIN
tests/sample-uploads/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 159 B |
BIN
tests/sample-uploads/office.pdf
Normal file
BIN
tests/sample-uploads/office.pdf
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.odp
Normal file
BIN
tests/sample-uploads/presentation.odp
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.otp
Normal file
BIN
tests/sample-uploads/presentation.otp
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.pot
Normal file
BIN
tests/sample-uploads/presentation.pot
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.potm
Normal file
BIN
tests/sample-uploads/presentation.potm
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.ppt
Normal file
BIN
tests/sample-uploads/presentation.ppt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.pptx
Normal file
BIN
tests/sample-uploads/presentation.pptx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.ods
Normal file
BIN
tests/sample-uploads/spreadsheet.ods
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.ots
Normal file
BIN
tests/sample-uploads/spreadsheet.ots
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xls
Normal file
BIN
tests/sample-uploads/spreadsheet.xls
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xlsx
Normal file
BIN
tests/sample-uploads/spreadsheet.xlsx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xlt
Normal file
BIN
tests/sample-uploads/spreadsheet.xlt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.doc
Normal file
BIN
tests/sample-uploads/wordproc.doc
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.docx
Normal file
BIN
tests/sample-uploads/wordproc.docx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.odt
Normal file
BIN
tests/sample-uploads/wordproc.odt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.ott
Normal file
BIN
tests/sample-uploads/wordproc.ott
Normal file
Binary file not shown.
16
tests/sample-uploads/wordproc.rtf
Normal file
16
tests/sample-uploads/wordproc.rtf
Normal file
@ -0,0 +1,16 @@
|
||||
{\rtf1\ansi\deff0\adeflang1025
|
||||
{\fonttbl{\f0\froman\fprq2\fcharset128 Times New Roman;}{\f1\froman\fprq2\fcharset128 Times New Roman;}{\f2\fswiss\fprq2\fcharset128 Arial;}{\f3\fnil\fprq2\fcharset128 DejaVu Sans;}}
|
||||
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
|
||||
{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;}
|
||||
{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang1081\ltrch\dbch\langfe2052\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;}
|
||||
{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;}
|
||||
{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;}
|
||||
{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ai\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;}
|
||||
{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;}
|
||||
}
|
||||
{\info{\author Brion }{\creatim\yr2010\mo5\dy10\hr15\min2}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3200}}\deftab709
|
||||
{\*\pgdsctbl
|
||||
{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
|
||||
\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
|
||||
\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033
|
||||
\par }
|
Loading…
Reference in New Issue
Block a user