From f08977da3c67230bb3266102aae908b8551e111e Mon Sep 17 00:00:00 2001 From: Justin Georgi Date: Wed, 20 Nov 2024 09:08:35 -0700 Subject: [PATCH] Add basic gltf format checking Signed-off-by: Justin Georgi --- extension.json | 3 ++- i18n/en.json | 3 ++- includes/GlModelHandler.php | 4 ++-- includes/GlModelHooks.php | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/extension.json b/extension.json index 37ebada..772d125 100644 --- a/extension.json +++ b/extension.json @@ -20,7 +20,8 @@ "BeforePageDisplay": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onBeforePageDisplay", "AlternateEditPreview": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onAlternateEditPreview", "UploadForm:BeforeProcessing": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onUploadFormBeforeProcessing", - "ParserFirstCallInit": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onParserFirstCallInit" + "ParserFirstCallInit": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onParserFirstCallInit", + "UploadVerifyUpload": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onUploadVerifyUpload" }, "ExtensionMessagesFiles": { "GlModelHandlerMagic": "GlModelHandler.i18n.magic.php" diff --git a/i18n/en.json b/i18n/en.json index 13a4e8c..91089b9 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -3,5 +3,6 @@ "exif-glmv-textures": "Number of textures", "exif-glmv-version": "GLTF version", "exif-glmv-generator": "Model generator", - "exif-glmv-metadata": "GLMV metadata version" + "exif-glmv-metadata": "GLMV metadata version", + "glmv-load-error-format": "File $1 is improperly formatted" } \ No newline at end of file diff --git a/includes/GlModelHandler.php b/includes/GlModelHandler.php index cbf9d07..78e19de 100644 --- a/includes/GlModelHandler.php +++ b/includes/GlModelHandler.php @@ -166,8 +166,8 @@ class GlModelHandler extends ImageHandler { $glMeta = json_decode(fread($gltf,$glMetaLength['int']),true); fclose($gltf); $newMeta = array( - 'glmv-meshes' => count($glMeta['meshes']), - 'glmv-textures' => count($glMeta['textures']) + 'glmv-meshes' => count($glMeta['meshes'] ?? []), + 'glmv-textures' => count($glMeta['textures'] ?? []) ); foreach($glMeta['asset'] as $key => $value) { switch ($key) { diff --git a/includes/GlModelHooks.php b/includes/GlModelHooks.php index 280852e..1ab8bbe 100644 --- a/includes/GlModelHooks.php +++ b/includes/GlModelHooks.php @@ -124,6 +124,41 @@ class GlModelHooks { $out->addModules('ext.glmv.upl'); } + /** + * Perform upload verification, based on both file properties like MIME type + * (same as UploadVerifyFile) and the information entered by the user (upload + * comment, file page contents etc.). + * + * @param UploadBase $upload Instance of UploadBase, with all info about the upload + * @param User $user User uploading this file + * @param array | null $props File properties, as returned by MWFileProps::getPropsFromPath() + * @param string $comment Upload log comment (also used as edit summary) + * @param string | false $pageText File description page text (only used for new uploads) + * @param array | MessageSpecifier | null &$error Output: If the file upload should be prevented, set this to the reason + * @return bool|void True or no return value to continue or false to abort + */ + public static function onUploadVerifyUpload ($upload, $user, ?array $props, $comment, $pageText, &$error) { + if ($props['mime'] != 'model/gltf-binary') { + return true; + } else { + $path = $upload->getTempPath(); + $gltf = fopen($path, 'r'); + $glHeader = fread($gltf, 4); + fclose($gltf); + + if ($glHeader == 'glTF') { + return true; + } else { + $error = array( + "glmv-load-error-format", + $upload->getTitle()->getRootText() + ); + return false; + } + } + } + + /** * MWHook: Called just before the upload data, like wpUploadDescription, are processed, so extensions get a chance to manipulate them. *