Browse Source

@uppy/remote-sources: do not rely on `.name` property (#3941)

Minifiers may be tempted to overwrite the `.name` property of the
plugin classes to save some bytes.
Antoine du Hamel 2 years ago
parent
commit
ed86eef0eb
1 changed files with 7 additions and 14 deletions
  1. 7 14
      packages/@uppy/remote-sources/src/index.js

+ 7 - 14
packages/@uppy/remote-sources/src/index.js

@@ -12,7 +12,9 @@ import Zoom from '@uppy/zoom'
 
 import packageJson from '../package.json'
 
-const availablePlugins = [
+const availablePlugins = {
+  // Using a null-prototype object to avoid prototype pollution.
+  __proto__: null,
   Box,
   Dropbox,
   Facebook,
@@ -22,7 +24,7 @@ const availablePlugins = [
   Unsplash,
   Url,
   Zoom,
-]
+}
 
 export default class RemoteSources extends BasePlugin {
   static VERSION = packageJson.version
@@ -35,16 +37,7 @@ export default class RemoteSources extends BasePlugin {
     this.type = 'acquirer'
 
     const defaultOptions = {
-      sources: [
-        'Box',
-        'Dropbox',
-        'Facebook',
-        'GoogleDrive',
-        'Instagram',
-        'OneDrive',
-        'Unsplash',
-        'Url',
-      ],
+      sources: Object.keys(availablePlugins),
       target: Dashboard,
     }
     this.opts = { ...defaultOptions, ...opts }
@@ -63,9 +56,9 @@ export default class RemoteSources extends BasePlugin {
   install () {
     this.opts.sources.forEach((pluginId) => {
       const optsForRemoteSourcePlugin = { ...this.opts, sources: undefined }
-      const plugin = availablePlugins.find(p => p.name === pluginId)
+      const plugin = availablePlugins[pluginId]
       if (plugin == null) {
-        const pluginNames = availablePlugins.map(p => p.name)
+        const pluginNames = Object.keys(availablePlugins)
         const formatter = new Intl.ListFormat('en', { style: 'long', type: 'disjunction' })
         throw new Error(`Invalid plugin: "${pluginId}" is not one of: ${formatter.format(pluginNames)}.`)
       }