diff options
Diffstat (limited to 'phpBB/phpbb')
| -rw-r--r-- | phpBB/phpbb/db/migration/data/v310/avatar_types.php | 60 | ||||
| -rw-r--r-- | phpBB/phpbb/mimetype/content_guesser.php | 33 | ||||
| -rw-r--r-- | phpBB/phpbb/mimetype/extension_guesser.php | 509 | ||||
| -rw-r--r-- | phpBB/phpbb/mimetype/guesser.php | 130 | ||||
| -rw-r--r-- | phpBB/phpbb/mimetype/guesser_base.php | 38 | ||||
| -rw-r--r-- | phpBB/phpbb/mimetype/guesser_interface.php | 49 | ||||
| -rw-r--r-- | phpBB/phpbb/plupload/plupload.php | 13 | 
7 files changed, 828 insertions, 4 deletions
| diff --git a/phpBB/phpbb/db/migration/data/v310/avatar_types.php b/phpBB/phpbb/db/migration/data/v310/avatar_types.php new file mode 100644 index 0000000000..bdbdccf0c5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/avatar_types.php @@ -0,0 +1,60 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class avatar_types extends \phpbb\db\migration\migration +{ +	/** +	* @var avatar type map +	*/ +	protected $avatar_type_map = array( +		AVATAR_UPLOAD	=> 'avatar.driver.upload', +		AVATAR_REMOTE	=> 'avatar.driver.remote', +		AVATAR_GALLERY	=> 'avatar.driver.local', +	); + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +			'\phpbb\db\migration\data\v310\avatars', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_user_avatar_type'))), +			array('custom', array(array($this, 'update_group_avatar_type'))), +		); +	} + +	public function update_user_avatar_type() +	{ +		foreach ($this->avatar_type_map as $old => $new) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "users +				SET user_avatar_type = '$new' +				WHERE user_avatar_type = '$old'"; +			$this->db->sql_query($sql); +		} +	} + +	public function update_group_avatar_type() +	{ +		foreach ($this->avatar_type_map as $old => $new) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "groups +				SET group_avatar_type = '$new' +				WHERE group_avatar_type = '$old'"; +			$this->db->sql_query($sql); +		} +	} +} diff --git a/phpBB/phpbb/mimetype/content_guesser.php b/phpBB/phpbb/mimetype/content_guesser.php new file mode 100644 index 0000000000..2d74582a21 --- /dev/null +++ b/phpBB/phpbb/mimetype/content_guesser.php @@ -0,0 +1,33 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\mimetype; + +/** +* @package mimetype +*/ + +class content_guesser extends guesser_base +{ +	/** +	* @inheritdoc +	*/ +	public function is_supported() +	{ +		return function_exists('mime_content_type'); +	} + +	/** +	* @inheritdoc +	*/ +	public function guess($file, $file_name = '') +	{ +		return mime_content_type($file); +	} +} diff --git a/phpBB/phpbb/mimetype/extension_guesser.php b/phpBB/phpbb/mimetype/extension_guesser.php new file mode 100644 index 0000000000..f6f4ae0138 --- /dev/null +++ b/phpBB/phpbb/mimetype/extension_guesser.php @@ -0,0 +1,509 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\mimetype; + +/** +* @package mimetype +*/ + +class extension_guesser extends guesser_base +{ +	/** +	* @var file extension map +	*/ +	protected $extension_map = array( +		'3dm'		=> 'x-world/x-3dmf', +		'3dmf'		=> 'x-world/x-3dmf', +		'a'		=> 'application/octet-stream', +		'aab'		=> 'application/x-authorware-bin', +		'aam'		=> 'application/x-authorware-map', +		'aas'		=> 'application/x-authorware-seg', +		'abc'		=> 'text/vnd.abc', +		'acgi'		=> 'text/html', +		'afl'		=> 'video/animaflex', +		'ai'		=> 'application/postscript', +		'aif'		=> 'audio/aiff', +		'aifc'		=> 'audio/aiff', +		'aiff'		=> 'audio/aiff', +		'aim'		=> 'application/x-aim', +		'aip'		=> 'text/x-audiosoft-intra', +		'ani'		=> 'application/x-navi-animation', +		'aos'		=> 'application/x-nokia-9000-communicator-add-on-software', +		'aps'		=> 'application/mime', +		'arc'		=> 'application/octet-stream', +		'arj'		=> 'application/arj', +		'art'		=> 'image/x-jg', +		'asf'		=> 'video/x-ms-asf', +		'asm'		=> 'text/x-asm', +		'asp'		=> 'text/asp', +		'asx'		=> 'video/x-ms-asf', +		'au'		=> 'audio/x-au', +		'avi'		=> 'video/avi', +		'avs'		=> 'video/avs-video', +		'bcpio'		=> 'application/x-bcpio', +		'bin'		=> 'application/x-binary', +		'bm'		=> 'image/bmp', +		'bmp'		=> 'image/bmp', +		'boo'		=> 'application/book', +		'book'		=> 'application/book', +		'boz'		=> 'application/x-bzip2', +		'bsh'		=> 'application/x-bsh', +		'bz'		=> 'application/x-bzip', +		'bz2'		=> 'application/x-bzip2', +		'c'		=> 'text/x-c', +		'c++'		=> 'text/x-c', +		'cat'		=> 'application/vnd.ms-pki.seccat', +		'cc'		=> 'text/plain', +		'ccad'		=> 'application/clariscad', +		'cco'		=> 'application/x-cocoa', +		'cdf'		=> 'application/cdf', +		'cer'		=> 'application/x-x509-ca-cert', +		'cha'		=> 'application/x-chat', +		'chat'		=> 'application/x-chat', +		'class'		=> 'application/java', +		'com'		=> 'application/octet-stream', +		'conf'		=> 'text/plain', +		'cpio'		=> 'application/x-cpio', +		'cpp'		=> 'text/x-c', +		'cpt'		=> 'application/x-cpt', +		'crl'		=> 'application/pkix-crl', +		'crt'		=> 'application/x-x509-ca-cert', +		'csh'		=> 'application/x-csh', +		'css'		=> 'text/css', +		'cxx'		=> 'text/plain', +		'dcr'		=> 'application/x-director', +		'deepv'		=> 'application/x-deepv', +		'def'		=> 'text/plain', +		'der'		=> 'application/x-x509-ca-cert', +		'dif'		=> 'video/x-dv', +		'dir'		=> 'application/x-director', +		'dl'		=> 'video/dl', +		'doc'		=> 'application/msword', +		'dot'		=> 'application/msword', +		'dp'		=> 'application/commonground', +		'drw'		=> 'application/drafting', +		'dump'		=> 'application/octet-stream', +		'dv'		=> 'video/x-dv', +		'dvi'		=> 'application/x-dvi', +		'dwf'		=> 'model/vnd.dwf', +		'dwg'		=> 'image/x-dwg', +		'dxf'		=> 'image/x-dwg', +		'dxr'		=> 'application/x-director', +		'el'		=> 'text/x-script.elisp', +		'elc'		=> 'application/x-elc', +		'env'		=> 'application/x-envoy', +		'eps'		=> 'application/postscript', +		'es'		=> 'application/x-esrehber', +		'etx'		=> 'text/x-setext', +		'evy'		=> 'application/x-envoy', +		'exe'		=> 'application/octet-stream', +		'f'		=> 'text/x-fortran', +		'f77'		=> 'text/x-fortran', +		'f90'		=> 'text/x-fortran', +		'fdf'		=> 'application/vnd.fdf', +		'fif'		=> 'image/fif', +		'fli'		=> 'video/x-fli', +		'flo'		=> 'image/florian', +		'flx'		=> 'text/vnd.fmi.flexstor', +		'fmf'		=> 'video/x-atomic3d-feature', +		'for'		=> 'text/x-fortran', +		'fpx'		=> 'image/vnd.fpx', +		'frl'		=> 'application/freeloader', +		'funk'		=> 'audio/make', +		'g'		=> 'text/plain', +		'g3'		=> 'image/g3fax', +		'gif'		=> 'image/gif', +		'gl'		=> 'video/x-gl', +		'gsd'		=> 'audio/x-gsm', +		'gsm'		=> 'audio/x-gsm', +		'gsp'		=> 'application/x-gsp', +		'gss'		=> 'application/x-gss', +		'gtar'		=> 'application/x-gtar', +		'gz'		=> 'application/x-gzip', +		'gzip'		=> 'application/x-gzip', +		'h'		=> 'text/x-h', +		'hdf'		=> 'application/x-hdf', +		'help'		=> 'application/x-helpfile', +		'hgl'		=> 'application/vnd.hp-hpgl', +		'hh'		=> 'text/x-h', +		'hlb'		=> 'text/x-script', +		'hlp'		=> 'application/hlp', +		'hpg'		=> 'application/vnd.hp-hpgl', +		'hpgl'		=> 'application/vnd.hp-hpgl', +		'hqx'		=> 'application/x-binhex40', +		'hta'		=> 'application/hta', +		'htc'		=> 'text/x-component', +		'htm'		=> 'text/html', +		'html'		=> 'text/html', +		'htmls'		=> 'text/html', +		'htt'		=> 'text/webviewhtml', +		'htx'		=> 'text/html', +		'ice'		=> 'x-conference/x-cooltalk', +		'ico'		=> 'image/x-icon', +		'idc'		=> 'text/plain', +		'ief'		=> 'image/ief', +		'iefs'		=> 'image/ief', +		'iges'		=> 'application/iges', +		'igs'		=> 'application/iges', +		'ima'		=> 'application/x-ima', +		'imap'		=> 'application/x-httpd-imap', +		'inf'		=> 'application/inf', +		'ins'		=> 'application/x-internett-signup', +		'ip'		=> 'application/x-ip2', +		'isu'		=> 'video/x-isvideo', +		'it'		=> 'audio/it', +		'iv'		=> 'application/x-inventor', +		'ivr'		=> 'i-world/i-vrml', +		'ivy'		=> 'application/x-livescreen', +		'jam'		=> 'audio/x-jam', +		'jav'		=> 'text/plain', +		'jav'		=> 'text/x-java-source', +		'java'		=> 'text/x-java-source', +		'jcm'		=> 'application/x-java-commerce', +		'jfif'		=> 'image/jpeg', +		'jfif-tbnl'	=> 'image/jpeg', +		'jpe'		=> 'image/jpeg', +		'jpeg'		=> 'image/jpeg', +		'jpg'		=> 'image/jpeg', +		'jps'		=> 'image/x-jps', +		'js'		=> 'application/x-javascript', +		'jut'		=> 'image/jutvision', +		'kar'		=> 'audio/midi', +		'ksh'		=> 'text/x-script.ksh', +		'la'		=> 'audio/x-nspaudio', +		'lam'		=> 'audio/x-liveaudio', +		'latex'		=> 'application/x-latex', +		'lha'		=> 'application/x-lha', +		'lhx'		=> 'application/octet-stream', +		'list'		=> 'text/plain', +		'lma'		=> 'audio/x-nspaudio', +		'log'		=> 'text/plain', +		'lsp'		=> 'text/x-script.lisp', +		'lst'		=> 'text/plain', +		'lsx'		=> 'text/x-la-asf', +		'ltx'		=> 'application/x-latex', +		'lzh'		=> 'application/x-lzh', +		'lzx'		=> 'application/x-lzx', +		'm'		=> 'text/x-m', +		'm1v'		=> 'video/mpeg', +		'm2a'		=> 'audio/mpeg', +		'm2v'		=> 'video/mpeg', +		'm3u'		=> 'audio/x-mpequrl', +		'man'		=> 'application/x-troff-man', +		'map'		=> 'application/x-navimap', +		'mar'		=> 'text/plain', +		'mbd'		=> 'application/mbedlet', +		'mc$'		=> 'application/x-magic-cap-package-1.0', +		'mcd'		=> 'application/x-mathcad', +		'mcf'		=> 'text/mcf', +		'mcp'		=> 'application/netmc', +		'me'		=> 'application/x-troff-me', +		'mht'		=> 'message/rfc822', +		'mhtml'		=> 'message/rfc822', +		'mid'		=> 'audio/x-midi', +		'midi'		=> 'audio/x-midi', +		'mif'		=> 'application/x-mif', +		'mime'		=> 'www/mime', +		'mjf'		=> 'audio/x-vnd.audioexplosion.mjuicemediafile', +		'mjpg'		=> 'video/x-motion-jpeg', +		'mm'		=> 'application/x-meme', +		'mme'		=> 'application/base64', +		'mod'		=> 'audio/x-mod', +		'moov'		=> 'video/quicktime', +		'mov'		=> 'video/quicktime', +		'movie'		=> 'video/x-sgi-movie', +		'mp2'		=> 'audio/x-mpeg', +		'mp3'		=> 'audio/x-mpeg-3', +		'mpa'		=> 'audio/mpeg', +		'mpc'		=> 'application/x-project', +		'mpe'		=> 'video/mpeg', +		'mpeg'		=> 'video/mpeg', +		'mpg'		=> 'video/mpeg', +		'mpga'		=> 'audio/mpeg', +		'mpp'		=> 'application/vnd.ms-project', +		'mpt'		=> 'application/x-project', +		'mpv'		=> 'application/x-project', +		'mpx'		=> 'application/x-project', +		'mrc'		=> 'application/marc', +		'ms'		=> 'application/x-troff-ms', +		'mv'		=> 'video/x-sgi-movie', +		'my'		=> 'audio/make', +		'mzz'		=> 'application/x-vnd.audioexplosion.mzz', +		'nap'		=> 'image/naplps', +		'naplps'	=> 'image/naplps', +		'nc'		=> 'application/x-netcdf', +		'ncm'		=> 'application/vnd.nokia.configuration-message', +		'nif'		=> 'image/x-niff', +		'niff'		=> 'image/x-niff', +		'nix'		=> 'application/x-mix-transfer', +		'nsc'		=> 'application/x-conference', +		'nvd'		=> 'application/x-navidoc', +		'o'		=> 'application/octet-stream', +		'oda'		=> 'application/oda', +		'omc'		=> 'application/x-omc', +		'omcd'		=> 'application/x-omcdatamaker', +		'omcr'		=> 'application/x-omcregerator', +		'p'		=> 'text/x-pascal', +		'p10'		=> 'application/x-pkcs10', +		'p12'		=> 'application/x-pkcs12', +		'p7a'		=> 'application/x-pkcs7-signature', +		'p7c'		=> 'application/x-pkcs7-mime', +		'p7m'		=> 'application/x-pkcs7-mime', +		'p7r'		=> 'application/x-pkcs7-certreqresp', +		'p7s'		=> 'application/pkcs7-signature', +		'part'		=> 'application/pro_eng', +		'pas'		=> 'text/pascal', +		'pbm'		=> 'image/x-portable-bitmap', +		'pcl'		=> 'application/x-pcl', +		'pct'		=> 'image/x-pict', +		'pcx'		=> 'image/x-pcx', +		'pdb'		=> 'chemical/x-pdb', +		'pdf'		=> 'application/pdf', +		'pfunk'		=> 'audio/make.my.funk', +		'pgm'		=> 'image/x-portable-greymap', +		'pic'		=> 'image/pict', +		'pict'		=> 'image/pict', +		'pkg'		=> 'application/x-newton-compatible-pkg', +		'pko'		=> 'application/vnd.ms-pki.pko', +		'pl'		=> 'text/x-script.perl', +		'plx'		=> 'application/x-pixclscript', +		'pm'		=> 'text/x-script.perl-module', +		'pm4'		=> 'application/x-pagemaker', +		'pm5'		=> 'application/x-pagemaker', +		'png'		=> 'image/png', +		'pnm'		=> 'image/x-portable-anymap', +		'pot'		=> 'application/mspowerpoint', +		'pov'		=> 'model/x-pov', +		'ppa'		=> 'application/vnd.ms-powerpoint', +		'ppm'		=> 'image/x-portable-pixmap', +		'pps'		=> 'application/mspowerpoint', +		'ppt'		=> 'application/mspowerpoint', +		'ppz'		=> 'application/mspowerpoint', +		'pre'		=> 'application/x-freelance', +		'prt'		=> 'application/pro_eng', +		'ps'		=> 'application/postscript', +		'psd'		=> 'application/octet-stream', +		'pvu'		=> 'paleovu/x-pv', +		'pwz'		=> 'application/vnd.ms-powerpoint', +		'py'		=> 'text/x-script.phyton', +		'pyc'		=> 'applicaiton/x-bytecode.python', +		'qcp'		=> 'audio/vnd.qcelp', +		'qd3'		=> 'x-world/x-3dmf', +		'qd3d'		=> 'x-world/x-3dmf', +		'qif'		=> 'image/x-quicktime', +		'qt'		=> 'video/quicktime', +		'qtc'		=> 'video/x-qtc', +		'qti'		=> 'image/x-quicktime', +		'qtif'		=> 'image/x-quicktime', +		'ra'		=> 'audio/x-realaudio', +		'ram'		=> 'audio/x-pn-realaudio', +		'ras'		=> 'image/x-cmu-raster', +		'rast'		=> 'image/cmu-raster', +		'rexx'		=> 'text/x-script.rexx', +		'rf'		=> 'image/vnd.rn-realflash', +		'rgb'		=> 'image/x-rgb', +		'rm'		=> 'audio/x-pn-realaudio', +		'rmi'		=> 'audio/mid', +		'rmm'		=> 'audio/x-pn-realaudio', +		'rmp'		=> 'audio/x-pn-realaudio', +		'rng'		=> 'application/vnd.nokia.ringing-tone', +		'rnx'		=> 'application/vnd.rn-realplayer', +		'roff'		=> 'application/x-troff', +		'rp'		=> 'image/vnd.rn-realpix', +		'rpm'		=> 'audio/x-pn-realaudio-plugin', +		'rt'		=> 'text/richtext', +		'rtf'		=> 'text/richtext', +		'rtx'		=> 'text/richtext', +		'rv'		=> 'video/vnd.rn-realvideo', +		's'		=> 'text/x-asm', +		's3m'		=> 'audio/s3m', +		'saveme'	=> 'application/octet-stream', +		'sbk'		=> 'application/x-tbook', +		'scm'		=> 'video/x-scm', +		'sdml'		=> 'text/plain', +		'sdp'		=> 'application/x-sdp', +		'sdr'		=> 'application/sounder', +		'sea'		=> 'application/x-sea', +		'set'		=> 'application/set', +		'sgm'		=> 'text/x-sgml', +		'sgml'		=> 'text/x-sgml', +		'sh'		=> 'text/x-script.sh', +		'shar'		=> 'application/x-shar', +		'shtml'		=> 'text/x-server-parsed-html', +		'sid'		=> 'audio/x-psid', +		'sit'		=> 'application/x-stuffit', +		'skd'		=> 'application/x-koan', +		'skm'		=> 'application/x-koan', +		'skp'		=> 'application/x-koan', +		'skt'		=> 'application/x-koan', +		'sl'		=> 'application/x-seelogo', +		'smi'		=> 'application/smil', +		'smil'		=> 'application/smil', +		'snd'		=> 'audio/x-adpcm', +		'sol'		=> 'application/solids', +		'spc'		=> 'text/x-speech', +		'spl'		=> 'application/futuresplash', +		'spr'		=> 'application/x-sprite', +		'sprite'	=> 'application/x-sprite', +		'src'		=> 'application/x-wais-source', +		'ssi'		=> 'text/x-server-parsed-html', +		'ssm'		=> 'application/streamingmedia', +		'sst'		=> 'application/vnd.ms-pki.certstore', +		'step'		=> 'application/step', +		'stl'		=> 'application/vnd.ms-pki.stl', +		'stp'		=> 'application/step', +		'sv4cpio'	=> 'application/x-sv4cpio', +		'sv4crc'	=> 'application/x-sv4crc', +		'svf'		=> 'image/x-dwg', +		'svr'		=> 'application/x-world', +		'swf'		=> 'application/x-shockwave-flash', +		't'		=> 'application/x-troff', +		'talk'		=> 'text/x-speech', +		'tar'		=> 'application/x-tar', +		'tbk'		=> 'application/x-tbook', +		'tcl'		=> 'text/x-script.tcl', +		'tcsh'		=> 'text/x-script.tcsh', +		'tex'		=> 'application/x-tex', +		'texi'		=> 'application/x-texinfo', +		'texinfo'	=> 'application/x-texinfo', +		'text'		=> 'text/plain', +		'tgz'		=> 'application/x-compressed', +		'tif'		=> 'image/tiff', +		'tiff'		=> 'image/tiff', +		'tr'		=> 'application/x-troff', +		'tsi'		=> 'audio/tsp-audio', +		'tsp'		=> 'audio/tsplayer', +		'tsv'		=> 'text/tab-separated-values', +		'turbot'	=> 'image/florian', +		'txt'		=> 'text/plain', +		'uil'		=> 'text/x-uil', +		'uni'		=> 'text/uri-list', +		'unis'		=> 'text/uri-list', +		'unv'		=> 'application/i-deas', +		'uri'		=> 'text/uri-list', +		'uris'		=> 'text/uri-list', +		'ustar'		=> 'multipart/x-ustar', +		'uu'		=> 'text/x-uuencode', +		'uue'		=> 'text/x-uuencode', +		'vcd'		=> 'application/x-cdlink', +		'vcs'		=> 'text/x-vcalendar', +		'vda'		=> 'application/vda', +		'vdo'		=> 'video/vdo', +		'vew'		=> 'application/groupwise', +		'viv'		=> 'video/vivo', +		'vivo'		=> 'video/vivo', +		'vmd'		=> 'application/vocaltec-media-desc', +		'vmf'		=> 'application/vocaltec-media-file', +		'voc'		=> 'audio/voc', +		'vos'		=> 'video/vosaic', +		'vox'		=> 'audio/voxware', +		'vqe'		=> 'audio/x-twinvq-plugin', +		'vqf'		=> 'audio/x-twinvq', +		'vql'		=> 'audio/x-twinvq-plugin', +		'vrml'		=> 'application/x-vrml', +		'vrt'		=> 'x-world/x-vrt', +		'vsd'		=> 'application/x-visio', +		'vst'		=> 'application/x-visio', +		'vsw'		=> 'application/x-visio', +		'w60'		=> 'application/wordperfect6.0', +		'w61'		=> 'application/wordperfect6.1', +		'w6w'		=> 'application/msword', +		'wav'		=> 'audio/wav', +		'wb1'		=> 'application/x-qpro', +		'wbmp'		=> 'image/vnd.wap.wbmp', +		'web'		=> 'application/vnd.xara', +		'wiz'		=> 'application/msword', +		'wk1'		=> 'application/x-123', +		'wmf'		=> 'windows/metafile', +		'wml'		=> 'text/vnd.wap.wml', +		'wmlc'		=> 'application/vnd.wap.wmlc', +		'wmls'		=> 'text/vnd.wap.wmlscript', +		'wmlsc'		=> 'application/vnd.wap.wmlscriptc', +		'word'		=> 'application/msword', +		'wp'		=> 'application/wordperfect', +		'wp5'		=> 'application/wordperfect', +		'wp6'		=> 'application/wordperfect', +		'wpd'		=> 'application/wordperfect', +		'wq1'		=> 'application/x-lotus', +		'wri'		=> 'application/mswrite', +		'wrl'		=> 'model/vrml', +		'wrz'		=> 'model/vrml', +		'wsc'		=> 'text/scriplet', +		'wsrc'		=> 'application/x-wais-source', +		'wtk'		=> 'application/x-wintalk', +		'xbm'		=> 'image/xbm', +		'xdr'		=> 'video/x-amt-demorun', +		'xgz'		=> 'xgl/drawing', +		'xif'		=> 'image/vnd.xiff', +		'xl'		=> 'application/excel', +		'xla'		=> 'application/excel', +		'xlb'		=> 'application/excel', +		'xlc'		=> 'application/excel', +		'xld'		=> 'application/excel', +		'xlk'		=> 'application/excel', +		'xll'		=> 'application/excel', +		'xlm'		=> 'application/excel', +		'xls'		=> 'application/excel', +		'xlt'		=> 'application/excel', +		'xlv'		=> 'application/excel', +		'xlw'		=> 'application/excel', +		'xm'		=> 'audio/xm', +		'xml'		=> 'text/xml', +		'xmz'		=> 'xgl/movie', +		'xpix'		=> 'application/x-vnd.ls-xpix', +		'xpm'		=> 'image/xpm', +		'x-png'		=> 'image/png', +		'xsr'		=> 'video/x-amt-showrun', +		'xwd'		=> 'image/x-xwindowdump', +		'xyz'		=> 'chemical/x-pdb', +		'z'		=> 'application/x-compressed', +		'zip'		=> 'application/x-zip-compressed', +		'zoo'		=> 'application/octet-stream', +		'zsh'		=> 'text/x-script.zsh', +	); + +	/** +	* @inheritdoc +	*/ +	public function is_supported() +	{ +		return true; +	} + +	/** +	* @inheritdoc +	*/ +	public function guess($file, $file_name = '') +	{ +		$file_name = (empty($file_name)) ? $file : $file_name; +		return $this->map_extension_to_type($file_name); +	} + +	/** +	* Map extension of supplied file_name to mime type +	* +	* @param string $file_name Path to file or filename +	* +	* @return string|null Mimetype if known or null if not +	*/ +	protected function map_extension_to_type($file_name) +	{ +		$extension = pathinfo($file_name, PATHINFO_EXTENSION); + +		if (isset($this->extension_map[$extension])) +		{ +			return $this->extension_map[$extension]; +		} +		else +		{ +			return null; +		} +	} +} diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php new file mode 100644 index 0000000000..3499b3b0f7 --- /dev/null +++ b/phpBB/phpbb/mimetype/guesser.php @@ -0,0 +1,130 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\mimetype; + +/** +* @package mimetype +*/ + +class guesser +{ +	/** +	* @const Default priority for mimetype guessers +	*/ +	const PRIORITY_DEFAULT = 0; + +	/** +	* @var mimetype guessers +	*/ +	protected $guessers; + +	/** +	* Construct a mimetype guesser object +	* +	* @param array $mimetype_guessers Mimetype guesser service collection +	*/ +	public function __construct($mimetype_guessers) +	{ +		$this->register_guessers($mimetype_guessers); +	} + +	/** +	* Register MimeTypeGuessers and sort them by priority +	* +	* @param array $mimetype_guessers Mimetype guesser service collection +	* +	* @throws \LogicException If incorrect or not mimetype guessers have +	*			been supplied to class +	*/ +	protected function register_guessers($mimetype_guessers) +	{ +		foreach ($mimetype_guessers as $guesser) +		{ +			$is_supported = (method_exists($guesser, 'is_supported')) ? 'is_supported' : ''; +			$is_supported = (method_exists($guesser, 'isSupported')) ? 'isSupported' : $is_supported; + +			if (empty($is_supported)) +			{ +				throw new \LogicException('Incorrect mimetype guesser supplied.'); +			} + +			if ($guesser->$is_supported()) +			{ +				$this->guessers[] = $guesser; +			} +		} + +		if (empty($this->guessers)) +		{ +			throw new \LogicException('No mimetype guesser supplied.'); +		} + +		// Sort guessers by priority +		usort($this->guessers, array($this, 'sort_priority')); +	} + +	/** +	* Sort the priority of supplied guessers +	* This is a compare function for usort. A guesser with higher priority +	* should be used first and vice versa. usort() orders the array values +	* from low to high depending on what the comparison function returns +	* to it. Return value should be smaller than 0 if value a is smaller +	* than value b. This has been reversed in the comparision function in +	* order to sort the guessers from high to low. +	* Method has been set to public in order to allow proper testing. +	* +	* @param object $guesser_a Mimetype guesser a +	* @param object $guesser_b Mimetype guesser b +	* +	* @return int 	If both guessers have the same priority 0, bigger +	*		than 0 if first guesser has lower priority, and lower +	*		than 0 if first guesser has higher priority +	*/ +	public function sort_priority($guesser_a, $guesser_b) +	{ +		$priority_a = (int) (method_exists($guesser_a, 'get_priority')) ? $guesser_a->get_priority() : self::PRIORITY_DEFAULT; +		$priority_b = (int) (method_exists($guesser_b, 'get_priority')) ? $guesser_b->get_priority() : self::PRIORITY_DEFAULT; + +		return $priority_b - $priority_a; +	} + +	/** +	* Guess mimetype of supplied file +	* +	* @param string $file Path to file +	* +	* @return string Guess for mimetype of file +	*/ +	public function guess($file, $file_name = '') +	{ +		if (!is_file($file)) +		{ +			return false; +		} + +		if (!is_readable($file)) +		{ +			return false; +		} + +		foreach ($this->guessers as $guesser) +		{ +			$mimetype = $guesser->guess($file, $file_name); + +			// Try to guess something that is not the fallback application/octet-stream +			if ($mimetype !== null && $mimetype !== 'application/octet-stream') +			{ +				return $mimetype; +			} +		} +		// Return any mimetype if we got a result or the fallback value +		return (!empty($mimetype)) ? $mimetype : 'application/octet-stream'; +	} +} diff --git a/phpBB/phpbb/mimetype/guesser_base.php b/phpBB/phpbb/mimetype/guesser_base.php new file mode 100644 index 0000000000..082b098028 --- /dev/null +++ b/phpBB/phpbb/mimetype/guesser_base.php @@ -0,0 +1,38 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\mimetype; + +/** +* @package mimetype +*/ + +abstract class guesser_base implements guesser_interface +{ +	/** +	* @var int Guesser Priority +	*/ +	protected $priority; + +	/** +	* @inheritdoc +	*/ +	public function get_priority() +	{ +		return $this->priority; +	} + +	/** +	* @inheritdoc +	*/ +	public function set_priority($priority) +	{ +		$this->priority = $priority; +	} +} diff --git a/phpBB/phpbb/mimetype/guesser_interface.php b/phpBB/phpbb/mimetype/guesser_interface.php new file mode 100644 index 0000000000..103689765e --- /dev/null +++ b/phpBB/phpbb/mimetype/guesser_interface.php @@ -0,0 +1,49 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\mimetype; + +/** +* @package mimetype +*/ + +interface guesser_interface +{ +	/** +	* Returns whether this guesser is supported on the current OS +	* +	* @return bool True if guesser is supported, false if not +	*/ +	public function is_supported(); + +	/** +	* Guess mimetype of supplied file +	* +	* @param string $file Path to file +	* +	* @return string Guess for mimetype of file +	*/ +	public function guess($file, $file_name = ''); + +	/** +	* Get the guesser priority +	* +	* @return int Guesser priority +	*/ +	public function get_priority(); + +	/** +	* Set the guesser priority +	* +	* @param int Guesser priority +	* +	* @return void +	*/ +	public function set_priority($priority); +} diff --git a/phpBB/phpbb/plupload/plupload.php b/phpBB/phpbb/plupload/plupload.php index f21ec40450..6bff2b8a7e 100644 --- a/phpBB/phpbb/plupload/plupload.php +++ b/phpBB/phpbb/plupload/plupload.php @@ -42,6 +42,11 @@ class plupload  	protected $php_ini;  	/** +	* @var \phpbb\mimetype\guesser +	*/ +	protected $mimetype_guesser; + +	/**  	* Final destination for uploaded files, i.e. the "files" directory.  	* @var string  	*/ @@ -61,16 +66,18 @@ class plupload  	* @param \phpbb\request\request_interface $request  	* @param \phpbb\user $user  	* @param \phpbb\php\ini $php_ini +	* @param \phpbb\mimetype\guesser $mimetype_guesser  	*  	* @return null  	*/ -	public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \phpbb\php\ini $php_ini) +	public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \phpbb\php\ini $php_ini, \phpbb\mimetype\guesser $mimetype_guesser)  	{  		$this->phpbb_root_path = $phpbb_root_path;  		$this->config = $config;  		$this->request = $request;  		$this->user = $user;  		$this->php_ini = $php_ini; +		$this->mimetype_guesser = $mimetype_guesser;  		$this->upload_directory = $this->phpbb_root_path . $this->config['upload_path'];  		$this->temporary_directory = $this->upload_directory . '/plupload'; @@ -113,14 +120,12 @@ class plupload  		{  			rename("{$file_path}.part", $file_path); -			$file_info = new \Symfony\Component\HttpFoundation\File\File($file_path); -  			// Need to modify some of the $_FILES values to reflect the new file  			return array(  				'tmp_name' => $file_path,  				'name' => $this->request->variable('real_filename', ''),  				'size' => filesize($file_path), -				'type' => $file_info->getMimeType($file_path), +				'type' => $this->mimetype_guesser->guess($file_path, $file_name),  			);  		}  		else | 
