From a2f5d05ae842d26847d924ed5f57776108101363 Mon Sep 17 00:00:00 2001 From: Mark Holmquist Date: Tue, 7 Feb 2017 12:19:10 -0600 Subject: [PATCH] Add 3D filetype for STL files Other filetypes use the text/plain MIME type, so we'll have to do something else to support them. Bug: T157348 Change-Id: Id78a504302fa664b353a4c45bdc5d99f95a0180a --- includes/installer/MysqlUpdater.php | 1 + includes/libs/mime/MimeAnalyzer.php | 20 ++++++++++++++++++++ includes/libs/mime/defines.php | 2 ++ includes/libs/mime/mime.info | 2 ++ includes/specials/SpecialMIMEsearch.php | 1 + maintenance/archives/patch-add-3d.sql | 11 +++++++++++ maintenance/tables.sql | 8 ++++---- 7 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 maintenance/archives/patch-add-3d.sql diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index 70e790c1a6..adfe2f6b13 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -301,6 +301,7 @@ class MysqlUpdater extends DatabaseUpdater { [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ], [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ], [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ], + [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], ]; } diff --git a/includes/libs/mime/MimeAnalyzer.php b/includes/libs/mime/MimeAnalyzer.php index 6ea3c215bc..4cd8e4e815 100644 --- a/includes/libs/mime/MimeAnalyzer.php +++ b/includes/libs/mime/MimeAnalyzer.php @@ -533,6 +533,9 @@ EOT; // XML formats we sure hope we recognize reliably 'svg', + + // 3D formats + 'stl', ]; return in_array( strtolower( $extension ), $types ); } @@ -800,6 +803,23 @@ EOT; return $this->detectZipType( $head, $tail, $ext ); } + // Check for STL (3D) files + // @see https://en.wikipedia.org/wiki/STL_(file_format) + if ( $fsize >= 15 && + stripos( $head, 'SOLID ' ) === 0 && + preg_match( '/\RENDSOLID .*$/i', $tail ) ) { + // ASCII STL file + return 'application/sla'; + } elseif ( $fsize > 84 ) { + // binary STL file + $triangles = substr( $head, 80, 4 ); + $triangles = unpack( 'V', $triangles ); + $triangles = reset( $triangles ); + if ( $triangles !== false && $fsize === 84 + ( $triangles * 50 ) ) { + return 'application/sla'; + } + } + MediaWiki\suppressWarnings(); $gis = getimagesize( $file ); MediaWiki\restoreWarnings(); diff --git a/includes/libs/mime/defines.php b/includes/libs/mime/defines.php index ae0b5f8b61..9f753feee9 100644 --- a/includes/libs/mime/defines.php +++ b/includes/libs/mime/defines.php @@ -43,4 +43,6 @@ define( 'MEDIATYPE_TEXT', 'TEXT' ); define( 'MEDIATYPE_EXECUTABLE', 'EXECUTABLE' ); // archive file (zip, tar, etc) define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' ); +// 3D file types (stl) +define( 'MEDIATYPE_3D', '3D' ); /**@}*/ diff --git a/includes/libs/mime/mime.info b/includes/libs/mime/mime.info index 2468f3841d..d8b8be7701 100644 --- a/includes/libs/mime/mime.info +++ b/includes/libs/mime/mime.info @@ -118,3 +118,5 @@ chemical/x-mdl-sdfile [DRAWING] chemical/x-mdl-rxnfile [DRAWING] chemical/x-mdl-rdfile [DRAWING] chemical/x-mdl-rgfile [DRAWING] + +application/sla [3D] diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php index 52cb30a1bc..e8ead7233c 100644 --- a/includes/specials/SpecialMIMEsearch.php +++ b/includes/specials/SpecialMIMEsearch.php @@ -85,6 +85,7 @@ class MIMEsearchPage extends QueryPage { MEDIATYPE_TEXT, MEDIATYPE_EXECUTABLE, MEDIATYPE_ARCHIVE, + MEDIATYPE_3D, ], ] + $minorType, ]; diff --git a/maintenance/archives/patch-add-3d.sql b/maintenance/archives/patch-add-3d.sql new file mode 100644 index 0000000000..13ea4ed203 --- /dev/null +++ b/maintenance/archives/patch-add-3d.sql @@ -0,0 +1,11 @@ +ALTER TABLE /*$wgDBprefix*/image + MODIFY img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL; + +ALTER TABLE /*$wgDBprefix*/oldimage + MODIFY oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL; + +ALTER TABLE /*$wgDBprefix*/filearchive + MODIFY fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL; + +ALTER TABLE /*$wgDBprefix*/uploadstash + MODIFY us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL; diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 8f596904ad..e1fb791b7b 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -871,7 +871,7 @@ CREATE TABLE /*_*/image ( img_bits int NOT NULL default 0, -- Media type as defined by the MEDIATYPE_xxx constants - img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, -- major part of a MIME media type as defined by IANA -- see https://www.iana.org/assignments/media-types/ @@ -936,7 +936,7 @@ CREATE TABLE /*_*/oldimage ( oi_timestamp binary(14) NOT NULL default '', oi_metadata mediumblob NOT NULL, - oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown", oi_minor_mime varbinary(100) NOT NULL default "unknown", oi_deleted tinyint unsigned NOT NULL default 0, @@ -986,7 +986,7 @@ CREATE TABLE /*_*/filearchive ( fa_height int default 0, fa_metadata mediumblob, fa_bits int default 0, - fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown", fa_minor_mime varbinary(100) default "unknown", fa_description varbinary(767), @@ -1053,7 +1053,7 @@ CREATE TABLE /*_*/uploadstash ( us_sha1 varchar(31) NOT NULL, us_mime varchar(255), -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table - us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, -- image-specific properties us_image_width int unsigned, us_image_height int unsigned, -- 2.20.1