Index: includes/file.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/file.inc,v retrieving revision 1.162 diff -u -9 -p -r1.162 file.inc --- includes/file.inc 26 Feb 2009 07:30:26 -0000 1.162 +++ includes/file.inc 1 Mar 2009 17:50:22 -0000 @@ -1527,369 +1527,381 @@ function file_upload_max_size() { * @param $mapping * An optional array of extension to media type mappings in the form * 'extension1|extension2|...' => 'type'. * * @return * The internet media type registered for the extension or application/octet-stream for unknown extensions. */ function file_get_mimetype($filename, $mapping = NULL) { if (!is_array($mapping)) { - $mapping = variable_get('mime_extension_mapping', array( - 'ez' => 'application/andrew-inset', - 'atom' => 'application/atom', - 'atomcat' => 'application/atomcat+xml', - 'atomsrv' => 'application/atomserv+xml', - 'cap|pcap' => 'application/cap', - 'cu' => 'application/cu-seeme', - 'tsp' => 'application/dsptype', - 'spl' => 'application/x-futuresplash', - 'hta' => 'application/hta', - 'jar' => 'application/java-archive', - 'ser' => 'application/java-serialized-object', - 'class' => 'application/java-vm', - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'image/x-corelphotopaint', - 'nb' => 'application/mathematica', - 'mdb' => 'application/msaccess', - 'doc|dot' => 'application/msword', - 'bin' => 'application/octet-stream', - 'oda' => 'application/oda', - 'ogg|ogx' => 'application/ogg', - 'pdf' => 'application/pdf', - 'key' => 'application/pgp-keys', - 'pgp' => 'application/pgp-signature', - 'prf' => 'application/pics-rules', - 'ps|ai|eps' => 'application/postscript', - 'rar' => 'application/rar', - 'rdf' => 'application/rdf+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'smi|smil' => 'application/smil', - 'wpd' => 'application/wordperfect', - 'wp5' => 'application/wordperfect5.1', - 'xhtml|xht' => 'application/xhtml+xml', - 'xml|xsl' => 'application/xml', - 'zip' => 'application/zip', - 'cdy' => 'application/vnd.cinderella', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xls|xlb|xlt' => 'application/vnd.ms-excel', - 'cat' => 'application/vnd.ms-pki.seccat', - 'stl' => 'application/vnd.ms-pki.stl', - 'ppt|pps' => 'application/vnd.ms-powerpoint', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'cod' => 'application/vnd.rim.cod', - 'mmf' => 'application/vnd.smaf', - 'sdc' => 'application/vnd.stardivision.calc', - 'sds' => 'application/vnd.stardivision.chart', - 'sda' => 'application/vnd.stardivision.draw', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdf' => 'application/vnd.stardivision.math', - 'sdw' => 'application/vnd.stardivision.writer', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sxc' => 'application/vnd.sun.xml.calc', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'sxd' => 'application/vnd.sun.xml.draw', - 'std' => 'application/vnd.sun.xml.draw.template', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sis' => 'application/vnd.symbian.install', - 'vsd' => 'application/vnd.visio', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wk' => 'application/x-123', - '7z' => 'application/x-7z-compressed', - 'abw' => 'application/x-abiword', - 'dmg' => 'application/x-apple-diskimage', - 'bcpio' => 'application/x-bcpio', - 'torrent' => 'application/x-bittorrent', - 'cab' => 'application/x-cab', - 'cbr' => 'application/x-cbr', - 'cbz' => 'application/x-cbz', - 'cdf' => 'application/x-cdf', - 'vcd' => 'application/x-cdlink', - 'pgn' => 'application/x-chess-pgn', - 'cpio' => 'application/x-cpio', - 'csh' => 'text/x-csh', - 'deb|udeb' => 'application/x-debian-package', - 'dcr|dir|dxr' => 'application/x-director', - 'dms' => 'application/x-dms', - 'wad' => 'application/x-doom', - 'dvi' => 'application/x-dvi', - 'rhtml' => 'application/x-httpd-eruby', - 'flac' => 'application/x-flac', - 'pfa|pfb|gsf|pcf|pcf.Z' => 'application/x-font', - 'mm' => 'application/x-freemind', - 'gnumeric' => 'application/x-gnumeric', - 'sgf' => 'application/x-go-sgf', - 'gcf' => 'application/x-graphing-calculator', - 'gtar|tgz|taz' => 'application/x-gtar', - 'hdf' => 'application/x-hdf', - 'phtml|pht|php' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'php3' => 'application/x-httpd-php3', - 'php3p' => 'application/x-httpd-php3-preprocessed', - 'php4' => 'application/x-httpd-php4', - 'ica' => 'application/x-ica', - 'ins|isp' => 'application/x-internet-signup', - 'iii' => 'application/x-iphone', - 'iso' => 'application/x-iso9660-image', - 'jnlp' => 'application/x-java-jnlp-file', - 'js' => 'application/x-javascript', - 'jmz' => 'application/x-jmol', - 'chrt' => 'application/x-kchart', - 'kil' => 'application/x-killustrator', - 'skp|skd|skt|skm' => 'application/x-koan', - 'kpr|kpt' => 'application/x-kpresenter', - 'ksp' => 'application/x-kspread', - 'kwd|kwt' => 'application/x-kword', - 'latex' => 'application/x-latex', - 'lha' => 'application/x-lha', - 'lyx' => 'application/x-lyx', - 'lzh' => 'application/x-lzh', - 'lzx' => 'application/x-lzx', - 'frm|maker|frame|fm|fb|book|fbdoc' => 'application/x-maker', - 'mif' => 'application/x-mif', - 'wmd' => 'application/x-ms-wmd', - 'wmz' => 'application/x-ms-wmz', - 'com|exe|bat|dll' => 'application/x-msdos-program', - 'msi' => 'application/x-msi', - 'nc' => 'application/x-netcdf', - 'pac' => 'application/x-ns-proxy-autoconfig', - 'nwc' => 'application/x-nwc', - 'o' => 'application/x-object', - 'oza' => 'application/x-oz-application', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'crl' => 'application/x-pkcs7-crl', - 'pyc|pyo' => 'application/x-python-code', - 'qtl' => 'application/x-quicktimeplayer', - 'rpm' => 'application/x-redhat-package-manager', - 'sh' => 'text/x-sh', - 'shar' => 'application/x-shar', - 'swf|swfl' => 'application/x-shockwave-flash', - 'sit|sitx' => 'application/x-stuffit', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'tar' => 'application/x-tar', - 'tcl' => 'application/x-tcl', - 'gf' => 'application/x-tex-gf', - 'pk' => 'application/x-tex-pk', - 'texinfo|texi' => 'application/x-texinfo', - '~|%|bak|old|sik' => 'application/x-trash', - 't|tr|roff' => 'application/x-troff', - 'man' => 'application/x-troff-man', - 'me' => 'application/x-troff-me', - 'ms' => 'application/x-troff-ms', - 'ustar' => 'application/x-ustar', - 'src' => 'application/x-wais-source', - 'wz' => 'application/x-wingz', - 'crt' => 'application/x-x509-ca-cert', - 'xcf' => 'application/x-xcf', - 'fig' => 'application/x-xfig', - 'xpi' => 'application/x-xpinstall', - 'au|snd' => 'audio/basic', - 'mid|midi|kar' => 'audio/midi', - 'mpga|mpega|mp2|mp3|m4a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'oga|spx' => 'audio/ogg', - 'sid' => 'audio/prs.sid', - 'aif|aiff|aifc' => 'audio/x-aiff', - 'gsm' => 'audio/x-gsm', - 'wma' => 'audio/x-ms-wma', - 'wax' => 'audio/x-ms-wax', - 'ra|rm|ram' => 'audio/x-pn-realaudio', - 'ra' => 'audio/x-realaudio', - 'pls' => 'audio/x-scpls', - 'sd2' => 'audio/x-sd2', - 'wav' => 'audio/x-wav', - 'alc' => 'chemical/x-alchemy', - 'cac|cache' => 'chemical/x-cache', - 'csf' => 'chemical/x-cache-csf', - 'cbin|cascii|ctab' => 'chemical/x-cactvs-binary', - 'cdx' => 'chemical/x-cdx', - 'cer' => 'chemical/x-cerius', - 'c3d' => 'chemical/x-chem3d', - 'chm' => 'chemical/x-chemdraw', - 'cif' => 'chemical/x-cif', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cpa' => 'chemical/x-compass', - 'bsd' => 'chemical/x-crossfire', - 'csml|csm' => 'chemical/x-csml', - 'ctx' => 'chemical/x-ctx', - 'cxf|cef' => 'chemical/x-cxf', - 'emb|embl' => 'chemical/x-embl-dl-nucleotide', - 'spc' => 'chemical/x-galactic-spc', - 'inp|gam|gamin' => 'chemical/x-gamess-input', - 'fch|fchk' => 'chemical/x-gaussian-checkpoint', - 'cub' => 'chemical/x-gaussian-cube', - 'gau|gjc|gjf' => 'chemical/x-gaussian-input', - 'gal' => 'chemical/x-gaussian-log', - 'gcg' => 'chemical/x-gcg8-sequence', - 'gen' => 'chemical/x-genbank', - 'hin' => 'chemical/x-hin', - 'istr|ist' => 'chemical/x-isostar', - 'jdx|dx' => 'chemical/x-jcamp-dx', - 'kin' => 'chemical/x-kinemage', - 'mcm' => 'chemical/x-macmolecule', - 'mmd|mmod' => 'chemical/x-macromodel-input', - 'mol' => 'chemical/x-mdl-molfile', - 'rd' => 'chemical/x-mdl-rdfile', - 'rxn' => 'chemical/x-mdl-rxnfile', - 'sd|sdf' => 'chemical/x-mdl-sdfile', - 'tgf' => 'chemical/x-mdl-tgf', - 'mcif' => 'chemical/x-mmcif', - 'mol2' => 'chemical/x-mol2', - 'b' => 'chemical/x-molconn-Z', - 'gpt' => 'chemical/x-mopac-graph', - 'mop|mopcrt|mpc|dat|zmt' => 'chemical/x-mopac-input', - 'moo' => 'chemical/x-mopac-out', - 'mvb' => 'chemical/x-mopac-vib', - 'asn' => 'chemical/x-ncbi-asn1-spec', - 'prt|ent' => 'chemical/x-ncbi-asn1-ascii', - 'val|aso' => 'chemical/x-ncbi-asn1-binary', - 'pdb|ent' => 'chemical/x-pdb', - 'ros' => 'chemical/x-rosdal', - 'sw' => 'chemical/x-swissprot', - 'vms' => 'chemical/x-vamas-iso14976', - 'vmd' => 'chemical/x-vmd', - 'xtel' => 'chemical/x-xtel', - 'xyz' => 'chemical/x-xyz', - 'gif' => 'image/gif', - 'ief' => 'image/ief', - 'jpeg|jpg|jpe' => 'image/jpeg', - 'pcx' => 'image/pcx', - 'png' => 'image/png', - 'svg|svgz' => 'image/svg+xml', - 'tiff|tif' => 'image/tiff', - 'djvu|djv' => 'image/vnd.djvu', - 'wbmp' => 'image/vnd.wap.wbmp', - 'ras' => 'image/x-cmu-raster', - 'cdr' => 'image/x-coreldraw', - 'pat' => 'image/x-coreldrawpattern', - 'cdt' => 'image/x-coreldrawtemplate', - 'ico' => 'image/x-icon', - 'art' => 'image/x-jg', - 'jng' => 'image/x-jng', - 'bmp' => 'image/x-ms-bmp', - 'psd' => 'image/x-photoshop', - 'pnm' => 'image/x-portable-anymap', - 'pbm' => 'image/x-portable-bitmap', - 'pgm' => 'image/x-portable-graymap', - 'ppm' => 'image/x-portable-pixmap', - 'rgb' => 'image/x-rgb', - 'xbm' => 'image/x-xbitmap', - 'xpm' => 'image/x-xpixmap', - 'xwd' => 'image/x-xwindowdump', - 'eml' => 'message/rfc822', - 'igs|iges' => 'model/iges', - 'msh|mesh|silo' => 'model/mesh', - 'wrl|vrml' => 'model/vrml', - 'ics|icz' => 'text/calendar', - 'css' => 'text/css', - 'csv' => 'text/csv', - '323' => 'text/h323', - 'html|htm|shtml' => 'text/html', - 'uls' => 'text/iuls', - 'mml' => 'text/mathml', - 'asc|txt|text|pot' => 'text/plain', - 'rtx' => 'text/richtext', - 'sct|wsc' => 'text/scriptlet', - 'tm|ts' => 'text/texmacs', - 'tsv' => 'text/tab-separated-values', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'wml' => 'text/vnd.wap.wml', - 'wmls' => 'text/vnd.wap.wmlscript', - 'bib' => 'text/x-bibtex', - 'boo' => 'text/x-boo', - 'h++|hpp|hxx|hh' => 'text/x-c++hdr', - 'c++|cpp|cxx|cc' => 'text/x-c++src', - 'h' => 'text/x-chdr', - 'htc' => 'text/x-component', - 'c' => 'text/x-csrc', - 'd' => 'text/x-dsrc', - 'diff|patch' => 'text/x-diff', - 'hs' => 'text/x-haskell', - 'java' => 'text/x-java', - 'lhs' => 'text/x-literate-haskell', - 'moc' => 'text/x-moc', - 'p|pas' => 'text/x-pascal', - 'gcd' => 'text/x-pcs-gcd', - 'pl|pm' => 'text/x-perl', - 'py' => 'text/x-python', - 'etx' => 'text/x-setext', - 'tcl|tk' => 'text/x-tcl', - 'tex|ltx|sty|cls' => 'text/x-tex', - 'vcs' => 'text/x-vcalendar', - 'vcf' => 'text/x-vcard', - '3gp' => 'video/3gpp', - 'dl' => 'video/dl', - 'dif|dv' => 'video/dv', - 'fli' => 'video/fli', - 'gl' => 'video/gl', - 'mpeg|mpg|mpe' => 'video/mpeg', - 'mp4' => 'video/mp4', - 'ogv' => 'video/ogg', - 'qt|mov' => 'video/quicktime', - 'mxu' => 'video/vnd.mpegurl', - 'lsf|lsx' => 'video/x-la-asf', - 'mng' => 'video/x-mng', - 'asf|asx' => 'video/x-ms-asf', - 'wm' => 'video/x-ms-wm', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wvx' => 'video/x-ms-wvx', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'ice' => 'x-conference/x-cooltalk', - 'sisx' => 'x-epoc/x-sisx-app', - 'vrm|vrml|wrl' => 'x-world/x-vrml', - 'xps' => 'application/vnd.ms-xpsdocument', - )); + $mapping = file_mime_extension_mapping(); + // Allow modules to alter the default mapping. + drupal_alter('file_mime_extension_mapping', $mapping); } - foreach ($mapping as $ext_preg => $mime_match) { + // Reverse array so the default mapping can be overriden by appending to the + // array. + foreach (array_reverse($mapping) as $ext_preg => $mime_match) { if (preg_match('!\.('. $ext_preg .')$!i', $filename)) { return $mime_match; } } return 'application/octet-stream'; } + +/** + * Provide a default array of extension to media type mappings. + */ +function file_mime_extension_mapping() { + return array( + 'ez' => 'application/andrew-inset', + 'atom' => 'application/atom', + 'atomcat' => 'application/atomcat+xml', + 'atomsrv' => 'application/atomserv+xml', + 'cap|pcap' => 'application/cap', + 'cu' => 'application/cu-seeme', + 'tsp' => 'application/dsptype', + 'spl' => 'application/x-futuresplash', + 'hta' => 'application/hta', + 'jar' => 'application/java-archive', + 'ser' => 'application/java-serialized-object', + 'class' => 'application/java-vm', + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'image/x-corelphotopaint', + 'nb' => 'application/mathematica', + 'mdb' => 'application/msaccess', + 'doc|dot' => 'application/msword', + 'bin' => 'application/octet-stream', + 'oda' => 'application/oda', + 'ogg|ogx' => 'application/ogg', + 'pdf' => 'application/pdf', + 'key' => 'application/pgp-keys', + 'pgp' => 'application/pgp-signature', + 'prf' => 'application/pics-rules', + 'ps|ai|eps' => 'application/postscript', + 'rar' => 'application/rar', + 'rdf' => 'application/rdf+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'smi|smil' => 'application/smil', + 'wpd' => 'application/wordperfect', + 'wp5' => 'application/wordperfect5.1', + 'xhtml|xht' => 'application/xhtml+xml', + 'xml|xsl' => 'application/xml', + 'zip' => 'application/zip', + 'cdy' => 'application/vnd.cinderella', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xls|xlb|xlt' => 'application/vnd.ms-excel', + 'cat' => 'application/vnd.ms-pki.seccat', + 'stl' => 'application/vnd.ms-pki.stl', + 'ppt|pps' => 'application/vnd.ms-powerpoint', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'cod' => 'application/vnd.rim.cod', + 'mmf' => 'application/vnd.smaf', + 'sdc' => 'application/vnd.stardivision.calc', + 'sds' => 'application/vnd.stardivision.chart', + 'sda' => 'application/vnd.stardivision.draw', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdf' => 'application/vnd.stardivision.math', + 'sdw' => 'application/vnd.stardivision.writer', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sxc' => 'application/vnd.sun.xml.calc', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'sxd' => 'application/vnd.sun.xml.draw', + 'std' => 'application/vnd.sun.xml.draw.template', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sis' => 'application/vnd.symbian.install', + 'vsd' => 'application/vnd.visio', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wk' => 'application/x-123', + '7z' => 'application/x-7z-compressed', + 'abw' => 'application/x-abiword', + 'dmg' => 'application/x-apple-diskimage', + 'bcpio' => 'application/x-bcpio', + 'torrent' => 'application/x-bittorrent', + 'cab' => 'application/x-cab', + 'cbr' => 'application/x-cbr', + 'cbz' => 'application/x-cbz', + 'cdf' => 'application/x-cdf', + 'vcd' => 'application/x-cdlink', + 'pgn' => 'application/x-chess-pgn', + 'cpio' => 'application/x-cpio', + 'csh' => 'text/x-csh', + 'deb|udeb' => 'application/x-debian-package', + 'dcr|dir|dxr' => 'application/x-director', + 'dms' => 'application/x-dms', + 'wad' => 'application/x-doom', + 'dvi' => 'application/x-dvi', + 'rhtml' => 'application/x-httpd-eruby', + 'flac' => 'application/x-flac', + 'pfa|pfb|gsf|pcf|pcf.Z' => 'application/x-font', + 'mm' => 'application/x-freemind', + 'gnumeric' => 'application/x-gnumeric', + 'sgf' => 'application/x-go-sgf', + 'gcf' => 'application/x-graphing-calculator', + 'gtar|tgz|taz' => 'application/x-gtar', + 'hdf' => 'application/x-hdf', + 'phtml|pht|php' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'php3' => 'application/x-httpd-php3', + 'php3p' => 'application/x-httpd-php3-preprocessed', + 'php4' => 'application/x-httpd-php4', + 'ica' => 'application/x-ica', + 'ins|isp' => 'application/x-internet-signup', + 'iii' => 'application/x-iphone', + 'iso' => 'application/x-iso9660-image', + 'jnlp' => 'application/x-java-jnlp-file', + 'js' => 'application/x-javascript', + 'jmz' => 'application/x-jmol', + 'chrt' => 'application/x-kchart', + 'kil' => 'application/x-killustrator', + 'skp|skd|skt|skm' => 'application/x-koan', + 'kpr|kpt' => 'application/x-kpresenter', + 'ksp' => 'application/x-kspread', + 'kwd|kwt' => 'application/x-kword', + 'latex' => 'application/x-latex', + 'lha' => 'application/x-lha', + 'lyx' => 'application/x-lyx', + 'lzh' => 'application/x-lzh', + 'lzx' => 'application/x-lzx', + 'frm|maker|frame|fm|fb|book|fbdoc' => 'application/x-maker', + 'mif' => 'application/x-mif', + 'wmd' => 'application/x-ms-wmd', + 'wmz' => 'application/x-ms-wmz', + 'com|exe|bat|dll' => 'application/x-msdos-program', + 'msi' => 'application/x-msi', + 'nc' => 'application/x-netcdf', + 'pac' => 'application/x-ns-proxy-autoconfig', + 'nwc' => 'application/x-nwc', + 'o' => 'application/x-object', + 'oza' => 'application/x-oz-application', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'crl' => 'application/x-pkcs7-crl', + 'pyc|pyo' => 'application/x-python-code', + 'qtl' => 'application/x-quicktimeplayer', + 'rpm' => 'application/x-redhat-package-manager', + 'sh' => 'text/x-sh', + 'shar' => 'application/x-shar', + 'swf|swfl' => 'application/x-shockwave-flash', + 'sit|sitx' => 'application/x-stuffit', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'tar' => 'application/x-tar', + 'tcl' => 'application/x-tcl', + 'gf' => 'application/x-tex-gf', + 'pk' => 'application/x-tex-pk', + 'texinfo|texi' => 'application/x-texinfo', + '~|%|bak|old|sik' => 'application/x-trash', + 't|tr|roff' => 'application/x-troff', + 'man' => 'application/x-troff-man', + 'me' => 'application/x-troff-me', + 'ms' => 'application/x-troff-ms', + 'ustar' => 'application/x-ustar', + 'src' => 'application/x-wais-source', + 'wz' => 'application/x-wingz', + 'crt' => 'application/x-x509-ca-cert', + 'xcf' => 'application/x-xcf', + 'fig' => 'application/x-xfig', + 'xpi' => 'application/x-xpinstall', + 'au|snd' => 'audio/basic', + 'mid|midi|kar' => 'audio/midi', + 'mpga|mpega|mp2|mp3|m4a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'oga|spx' => 'audio/ogg', + 'sid' => 'audio/prs.sid', + 'aif|aiff|aifc' => 'audio/x-aiff', + 'gsm' => 'audio/x-gsm', + 'wma' => 'audio/x-ms-wma', + 'wax' => 'audio/x-ms-wax', + 'ra|rm|ram' => 'audio/x-pn-realaudio', + 'ra' => 'audio/x-realaudio', + 'pls' => 'audio/x-scpls', + 'sd2' => 'audio/x-sd2', + 'wav' => 'audio/x-wav', + 'alc' => 'chemical/x-alchemy', + 'cac|cache' => 'chemical/x-cache', + 'csf' => 'chemical/x-cache-csf', + 'cbin|cascii|ctab' => 'chemical/x-cactvs-binary', + 'cdx' => 'chemical/x-cdx', + 'cer' => 'chemical/x-cerius', + 'c3d' => 'chemical/x-chem3d', + 'chm' => 'chemical/x-chemdraw', + 'cif' => 'chemical/x-cif', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cpa' => 'chemical/x-compass', + 'bsd' => 'chemical/x-crossfire', + 'csml|csm' => 'chemical/x-csml', + 'ctx' => 'chemical/x-ctx', + 'cxf|cef' => 'chemical/x-cxf', + 'emb|embl' => 'chemical/x-embl-dl-nucleotide', + 'spc' => 'chemical/x-galactic-spc', + 'inp|gam|gamin' => 'chemical/x-gamess-input', + 'fch|fchk' => 'chemical/x-gaussian-checkpoint', + 'cub' => 'chemical/x-gaussian-cube', + 'gau|gjc|gjf' => 'chemical/x-gaussian-input', + 'gal' => 'chemical/x-gaussian-log', + 'gcg' => 'chemical/x-gcg8-sequence', + 'gen' => 'chemical/x-genbank', + 'hin' => 'chemical/x-hin', + 'istr|ist' => 'chemical/x-isostar', + 'jdx|dx' => 'chemical/x-jcamp-dx', + 'kin' => 'chemical/x-kinemage', + 'mcm' => 'chemical/x-macmolecule', + 'mmd|mmod' => 'chemical/x-macromodel-input', + 'mol' => 'chemical/x-mdl-molfile', + 'rd' => 'chemical/x-mdl-rdfile', + 'rxn' => 'chemical/x-mdl-rxnfile', + 'sd|sdf' => 'chemical/x-mdl-sdfile', + 'tgf' => 'chemical/x-mdl-tgf', + 'mcif' => 'chemical/x-mmcif', + 'mol2' => 'chemical/x-mol2', + 'b' => 'chemical/x-molconn-Z', + 'gpt' => 'chemical/x-mopac-graph', + 'mop|mopcrt|mpc|dat|zmt' => 'chemical/x-mopac-input', + 'moo' => 'chemical/x-mopac-out', + 'mvb' => 'chemical/x-mopac-vib', + 'asn' => 'chemical/x-ncbi-asn1-spec', + 'prt|ent' => 'chemical/x-ncbi-asn1-ascii', + 'val|aso' => 'chemical/x-ncbi-asn1-binary', + 'pdb|ent' => 'chemical/x-pdb', + 'ros' => 'chemical/x-rosdal', + 'sw' => 'chemical/x-swissprot', + 'vms' => 'chemical/x-vamas-iso14976', + 'vmd' => 'chemical/x-vmd', + 'xtel' => 'chemical/x-xtel', + 'xyz' => 'chemical/x-xyz', + 'gif' => 'image/gif', + 'ief' => 'image/ief', + 'jpeg|jpg|jpe' => 'image/jpeg', + 'pcx' => 'image/pcx', + 'png' => 'image/png', + 'svg|svgz' => 'image/svg+xml', + 'tiff|tif' => 'image/tiff', + 'djvu|djv' => 'image/vnd.djvu', + 'wbmp' => 'image/vnd.wap.wbmp', + 'ras' => 'image/x-cmu-raster', + 'cdr' => 'image/x-coreldraw', + 'pat' => 'image/x-coreldrawpattern', + 'cdt' => 'image/x-coreldrawtemplate', + 'ico' => 'image/x-icon', + 'art' => 'image/x-jg', + 'jng' => 'image/x-jng', + 'bmp' => 'image/x-ms-bmp', + 'psd' => 'image/x-photoshop', + 'pnm' => 'image/x-portable-anymap', + 'pbm' => 'image/x-portable-bitmap', + 'pgm' => 'image/x-portable-graymap', + 'ppm' => 'image/x-portable-pixmap', + 'rgb' => 'image/x-rgb', + 'xbm' => 'image/x-xbitmap', + 'xpm' => 'image/x-xpixmap', + 'xwd' => 'image/x-xwindowdump', + 'eml' => 'message/rfc822', + 'igs|iges' => 'model/iges', + 'msh|mesh|silo' => 'model/mesh', + 'wrl|vrml' => 'model/vrml', + 'ics|icz' => 'text/calendar', + 'css' => 'text/css', + 'csv' => 'text/csv', + '323' => 'text/h323', + 'html|htm|shtml' => 'text/html', + 'uls' => 'text/iuls', + 'mml' => 'text/mathml', + 'asc|txt|text|pot' => 'text/plain', + 'rtx' => 'text/richtext', + 'sct|wsc' => 'text/scriptlet', + 'tm|ts' => 'text/texmacs', + 'tsv' => 'text/tab-separated-values', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'wml' => 'text/vnd.wap.wml', + 'wmls' => 'text/vnd.wap.wmlscript', + 'bib' => 'text/x-bibtex', + 'boo' => 'text/x-boo', + 'h++|hpp|hxx|hh' => 'text/x-c++hdr', + 'c++|cpp|cxx|cc' => 'text/x-c++src', + 'h' => 'text/x-chdr', + 'htc' => 'text/x-component', + 'c' => 'text/x-csrc', + 'd' => 'text/x-dsrc', + 'diff|patch' => 'text/x-diff', + 'hs' => 'text/x-haskell', + 'java' => 'text/x-java', + 'lhs' => 'text/x-literate-haskell', + 'moc' => 'text/x-moc', + 'p|pas' => 'text/x-pascal', + 'gcd' => 'text/x-pcs-gcd', + 'pl|pm' => 'text/x-perl', + 'py' => 'text/x-python', + 'etx' => 'text/x-setext', + 'tcl|tk' => 'text/x-tcl', + 'tex|ltx|sty|cls' => 'text/x-tex', + 'vcs' => 'text/x-vcalendar', + 'vcf' => 'text/x-vcard', + '3gp' => 'video/3gpp', + 'dl' => 'video/dl', + 'dif|dv' => 'video/dv', + 'fli' => 'video/fli', + 'gl' => 'video/gl', + 'mpeg|mpg|mpe' => 'video/mpeg', + 'mp4' => 'video/mp4', + 'ogv' => 'video/ogg', + 'qt|mov' => 'video/quicktime', + 'mxu' => 'video/vnd.mpegurl', + 'lsf|lsx' => 'video/x-la-asf', + 'mng' => 'video/x-mng', + 'asf|asx' => 'video/x-ms-asf', + 'wm' => 'video/x-ms-wm', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wvx' => 'video/x-ms-wvx', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'ice' => 'x-conference/x-cooltalk', + 'sisx' => 'x-epoc/x-sisx-app', + 'vrm|vrml|wrl' => 'x-world/x-vrml', + 'xps' => 'application/vnd.ms-xpsdocument', + ); +} + /** * @} End of "defgroup file". */ Index: modules/simpletest/tests/file.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file.test,v retrieving revision 1.25 diff -u -9 -p -r1.25 file.test --- modules/simpletest/tests/file.test 22 Feb 2009 17:55:30 -0000 1.25 +++ modules/simpletest/tests/file.test 1 Mar 2009 17:50:22 -0000 @@ -546,36 +546,38 @@ class FileSaveUploadTest extends FileHoo /** * Test the file_save_upload() function. */ function testNormal() { $max_fid_after = db_result(db_query('SELECT MAX(fid) AS fid FROM {files}')); $this->assertTrue($max_fid_after > $this->maxFidBefore, t('A new file was created.')); $file1 = file_load($max_fid_after); $this->assertTrue($file1, t('Loaded the file.')); + $this->assertEqual($file1->filemime, 'image/png', t('A MIME type was set.')); // Reset the hook counters to get rid of the 'load' we just called. file_test_reset(); // Upload a second file. $max_fid_before = db_query('SELECT MAX(fid) AS fid FROM {files}')->fetchField(); $image2 = current($this->drupalGetTestFiles('image')); $edit = array('files[file_test_upload]' => realpath($image2->filepath)); $this->drupalPost('file-test/upload', $edit, t('Submit')); $this->assertResponse(200, t('Received a 200 response for posted test file.')); $this->assertRaw(t('You WIN!')); $max_fid_after = db_query('SELECT MAX(fid) AS fid FROM {files}')->fetchField(); // Check that the correct hooks were called. $this->assertFileHooksCalled(array('validate', 'insert')); $file2 = file_load($max_fid_after); $this->assertTrue($file2); + $this->assertEqual($file2->filemime, 'image/png', t('A MIME type was set.')); // Load both files using file_load_multiple(). $files = file_load_multiple(array($file1->fid, $file2->fid)); $this->assertTrue(isset($files[$file1->fid]), t('File was loaded successfully')); $this->assertTrue(isset($files[$file2->fid]), t('File was loaded successfully')); } /** @@ -1971,9 +1973,66 @@ class FileNameMungingTest extends FileTe */ function testUnMunge() { $munged_name = file_munge_filename($this->name, '', FALSE); $unmunged_name = file_unmunge_filename($munged_name); // @TODO uncomment when this tests passes reliably, see // http://drupal.org/node/368502 // $this->assertIdentical($unmunged_name, $this->name, t('The unmunged (%unmunged) filename matches the original (%original)', array('%unmunged' => $unmunged_name, '%original' => $this->name))); } } + +/** + * MIME type related tests. + */ +class FileMimeUnitTest extends FileTestCase { + function setUp() { + parent::setUp('file_test'); + } + + function getInfo() { + return array( + 'name' => t('File MIME'), + 'description' => t("Tests functions for determining a file's MIME type."), + 'group' => t('File'), + ); + } + + /** + * Basic sanity test of file_mime_extension_mapping(). + */ + function testFileMimeExtensionMapping() { + $result = file_mime_extension_mapping(); + $this->assertTrue(is_array($result), t('file_mime_extension_mapping() returned an array.')); + $this->assertEqual($result['mp4'], 'video/mp4', t('Found a sample entry.')); + } + + /** + * Call file_get_mimetype() and use the default mapping from + * file_mime_extension_mapping(). + */ + function testFileGetMimetypeDefaultMapping() { + $this->assertEqual(file_get_mimetype('foo.bmp'), 'image/x-ms-bmp', t('Found the mapping for an entry with a single extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.cpp'), 'text/x-c++src', t('Found the mapping for an entry with a multiple extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.somethingThatWontExist'), 'application/octet-stream', t('Default returned for unknown type.')); + } + + /** + * Call file_get_mimetype() and pass the mapping in as a parameter. + */ + function testFileGetMimetypeMappingAsParam() { + $mapping = array('asdf' => 'madeup/asdf', 'pork|sandwiches' => 'madeup/tasty'); + + $this->assertEqual(file_get_mimetype('foo.asdf', $mapping), 'madeup/asdf', t('Found the mapping for an entry with a single extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.pork', $mapping), 'madeup/tasty', t('Found the mapping for an entry with a multiple extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.txt', $mapping), 'application/octet-stream', t('Default returned for unknown type.')); + } + + /** + * Call file_get_mimetype() with the mapping altered by the file_test module. + */ + function testFileGetMimetypeMappingAsVariable() { + $this->assertEqual(file_get_mimetype('foo.file_test_1'), 'madeup/file_test_1', t('Found the mapping for an entry with a single extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.file_test_2'), 'madeup/file_test_2', t('Found the mapping for an entry with a multiple extension to MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.doc'), 'madeup/doc', t('Found the mapping for an entry with an overridden MIME mapping.')); + $this->assertEqual(file_get_mimetype('foo.file_test_foo'), 'application/octet-stream', t('Default returned for unknown type.')); + } +} Index: modules/simpletest/tests/file_test.module =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/file_test.module,v retrieving revision 1.8 diff -u -9 -p -r1.8 file_test.module --- modules/simpletest/tests/file_test.module 20 Jan 2009 02:56:05 -0000 1.8 +++ modules/simpletest/tests/file_test.module 1 Mar 2009 17:50:22 -0000 @@ -233,9 +233,20 @@ function file_test_file_move($file, $sou _file_test_log_call('move', array($file, $source)); } /** * Implementation of hook_file_delete(). */ function file_test_file_delete($file) { _file_test_log_call('delete', array($file)); } + +/** + * Implementation of hook_file_mime_extension_mapping_alter(). + */ +function file_test_file_mime_extension_mapping_alter(&$mapping) { + // Add new mappings. + $mapping['file_test_1'] = 'madeup/file_test_1'; + $mapping['file_test_2|file_test_3'] = 'madeup/file_test_2'; + // Override existing mapping. + $mapping['doc'] = 'madeup/doc'; +} Index: modules/upload/upload.test =================================================================== RCS file: /cvs/drupal/drupal/modules/upload/upload.test,v retrieving revision 1.13 diff -u -9 -p -r1.13 upload.test --- modules/upload/upload.test 22 Feb 2009 17:55:30 -0000 1.13 +++ modules/upload/upload.test 1 Mar 2009 17:50:22 -0000 @@ -191,20 +191,25 @@ class UploadTestCase extends DrupalWebTe /** * Check that uploaded file is accessible and verify the contents against the original. * * @param string $filename Name of file to verify. */ function checkUploadedFile($filename) { global $base_url; $file = realpath(file_directory_path() . '/' . $filename); $this->drupalGet($base_url . '/' . file_directory_path() . '/' . $filename, array('external' => TRUE)); - $this->assertResponse(array(200), 'Uploaded ' . $filename . ' is accessible.'); - $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Uploaded contents of ' . $filename . ' verified.'); + $this->assertResponse(array(200), 'Uploaded file is accessible using public download.'); + $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Contents of the file are correct.'); + + $this->drupalGet('system/files/' . $filename); + $this->assertResponse(array(200), 'Uploaded file is accessible using private download.'); + $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Contents of the file are correct.'); + $this->assertEqual($this->drupalGetHeader('Content-Type'), 'text/plain', t('A MIME type was set.')); } /** * Get the role id of the 'simpletest' role associated with a SimpleTest test user. * * @param object $user User object. * @return integer SimpleTest role id. */ function getSimpletestRoleId($user) {