[gnome-shell/gnome-41] extensionSystem: Check metadata types



commit 6d6d199fefec7f1b941db99b0c990f287d959a20
Author: Florian Müllner <fmuellner gnome org>
Date:   Wed Apr 20 19:29:19 2022 +0200

    extensionSystem: Check metadata types
    
    We currently check that an extension provides required metadata
    properties, but then assume that all properties have the expected
    type.
    
    It turns out that this is putting too much trust in extensions,
    so add an appropriate check.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5347
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2272>
    (cherry picked from commit 56d0b6d8317cbb824e997ce6a926028788b11dc8)

 js/ui/extensionSystem.js | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index b8a0867cde..445ee4dd9f 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -296,11 +296,29 @@ var ExtensionManager = class {
             throw new Error('Failed to parse metadata.json: %s'.format(e.toString()));
         }
 
-        let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
+        const requiredProperties = [{
+            prop: 'uuid',
+            typeName: 'string',
+        }, {
+            prop: 'name',
+            typeName: 'string',
+        }, {
+            prop: 'description',
+            typeName: 'string',
+        }, {
+            prop: 'shell-version',
+            typeName: 'string array',
+            typeCheck: v => Array.isArray(v) && v.length > 0 && v.every(e => typeof e === 'string'),
+        }];
         for (let i = 0; i < requiredProperties.length; i++) {
-            let prop = requiredProperties[i];
+            const {
+                prop, typeName, typeCheck = v => typeof v === typeName,
+            } = requiredProperties[i];
+
             if (!meta[prop])
                 throw new Error('missing "%s" property in metadata.json'.format(prop));
+            if (!typeCheck(meta[prop]))
+                throw new Error('property "%s" is not of type "%s"'.format(prop, typeName));
         }
 
         if (uuid != meta.uuid)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]