]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Ensure to install supported plugins
authorChocobozzz <me@florianbigard.com>
Mon, 12 Apr 2021 08:10:48 +0000 (10:10 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 12 Apr 2021 08:10:48 +0000 (10:10 +0200)
server/controllers/api/plugins.ts
server/lib/plugins/plugin-index.ts
server/lib/plugins/plugin-manager.ts
server/lib/plugins/yarn.ts
server/middlewares/validators/plugins.ts

index bb69f25a1eafbdae809a46f618eb05b0105a88be..a186de0102fd9e9fa7254e601c467d7db8628486 100644 (file)
@@ -151,7 +151,7 @@ async function updatePlugin (req: express.Request, res: express.Response) {
   const fromDisk = !!body.path
   const toUpdate = body.npmName || body.path
   try {
-    const plugin = await PluginManager.Instance.update(toUpdate, undefined, fromDisk)
+    const plugin = await PluginManager.Instance.update(toUpdate, fromDisk)
 
     return res.json(plugin.toFormattedJSON())
   } catch (err) {
index 624f5da1df325fe7a317371b7463d293e3d763cd..165bc91b358bfad9fb497e401a1d6673c99a3992 100644 (file)
@@ -67,7 +67,19 @@ async function getLatestPluginsVersion (npmNames: string[]): Promise<PeertubePlu
   return body
 }
 
+async function getLatestPluginVersion (npmName: string) {
+  const results = await getLatestPluginsVersion([ npmName ])
+
+  if (Array.isArray(results) === false || results.length !== 1) {
+    logger.warn('Cannot get latest supported plugin version of %s.', npmName)
+    return undefined
+  }
+
+  return results[0].latestVersion
+}
+
 export {
   listAvailablePluginsFromIndex,
+  getLatestPluginVersion,
   getLatestPluginsVersion
 }
index e3226a9502dc1761501f5d79ddef3a96ed8521ba..03ea48416b7ab65f8e9d0d60d63f31d59c09eb69 100644 (file)
@@ -328,11 +328,18 @@ export class PluginManager implements ServerHook {
     return plugin
   }
 
-  async update (toUpdate: string, version?: string, fromDisk = false) {
+  async update (toUpdate: string, fromDisk = false) {
     const npmName = fromDisk ? basename(toUpdate) : toUpdate
 
     logger.info('Updating plugin %s.', npmName)
 
+    // Use the latest version from DB, to not upgrade to a version that does not support our PeerTube version
+    let version: string
+    if (!fromDisk) {
+      const plugin = await PluginModel.loadByNpmName(toUpdate)
+      version = plugin.latestVersion
+    }
+
     // Unregister old hooks
     await this.unregister(npmName)
 
index e40351b6e3751cb20c40d086cd798ee1c098111a..3f45681d3f90ca839d575616681a4680b164ca23 100644 (file)
@@ -1,14 +1,17 @@
+import { outputJSON, pathExists } from 'fs-extra'
+import { join } from 'path'
 import { execShell } from '../../helpers/core-utils'
-import { logger } from '../../helpers/logger'
 import { isNpmPluginNameValid, isPluginVersionValid } from '../../helpers/custom-validators/plugins'
+import { logger } from '../../helpers/logger'
 import { CONFIG } from '../../initializers/config'
-import { outputJSON, pathExists } from 'fs-extra'
-import { join } from 'path'
+import { getLatestPluginVersion } from './plugin-index'
 
-async function installNpmPlugin (npmName: string, version?: string) {
+async function installNpmPlugin (npmName: string, versionArg?: string) {
   // Security check
   checkNpmPluginNameOrThrow(npmName)
-  if (version) checkPluginVersionOrThrow(version)
+  if (versionArg) checkPluginVersionOrThrow(versionArg)
+
+  const version = versionArg || await getLatestPluginVersion(npmName)
 
   let toInstall = npmName
   if (version) toInstall += `@${version}`
index 1083e0afae83677c9bbd9122f674d6038e3ac687..ab87fe720c87b428717f05939f5cd49068fe3e62 100644 (file)
@@ -109,7 +109,6 @@ const installOrUpdatePluginValidator = [
     if (!body.path && !body.npmName) {
       return res.status(HttpStatusCode.BAD_REQUEST_400)
                 .json({ error: 'Should have either a npmName or a path' })
-                .end()
     }
 
     return next()
@@ -140,7 +139,6 @@ const existingPluginValidator = [
     if (!plugin) {
       return res.status(HttpStatusCode.NOT_FOUND_404)
                 .json({ error: 'Plugin not found' })
-                .end()
     }
 
     res.locals.plugin = plugin