X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fplugins.ts;h=7b947bb6e76bc16319852cfdda1d59d87b175d5f;hb=af4ae64f6faf38f8179f2e07d3cd4ad60006be92;hp=1caee9a29fcbb10d2fdd5fbb0f09121f154b72fe;hpb=d75db01f14138ea660c4c519e37ab05228b39d13;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/plugins.ts b/server/controllers/plugins.ts index 1caee9a29..7b947bb6e 100644 --- a/server/controllers/plugins.ts +++ b/server/controllers/plugins.ts @@ -2,11 +2,12 @@ import * as express from 'express' import { PLUGIN_GLOBAL_CSS_PATH } from '../initializers/constants' import { join } from 'path' import { PluginManager, RegisteredPlugin } from '../lib/plugins/plugin-manager' -import { servePluginStaticDirectoryValidator } from '../middlewares/validators/plugins' +import { getPluginValidator, pluginStaticDirectoryValidator, getExternalAuthValidator } from '../middlewares/validators/plugins' import { serveThemeCSSValidator } from '../middlewares/validators/themes' import { PluginType } from '../../shared/models/plugins/plugin.type' import { isTestInstance } from '../helpers/core-utils' -import { getCompleteLocale, is18nLocale } from '../../shared/models/i18n' +import { getCompleteLocale, is18nLocale } from '../../shared/core-utils/i18n' +import { logger } from '@server/helpers/logger' const sendFileOptions = { maxAge: '30 days', @@ -23,23 +24,43 @@ pluginsRouter.get('/plugins/translations/:locale.json', getPluginTranslations ) +pluginsRouter.get('/plugins/:pluginName/:pluginVersion/auth/:authName', + getPluginValidator(PluginType.PLUGIN), + getExternalAuthValidator, + handleAuthInPlugin +) + pluginsRouter.get('/plugins/:pluginName/:pluginVersion/static/:staticEndpoint(*)', - servePluginStaticDirectoryValidator(PluginType.PLUGIN), + getPluginValidator(PluginType.PLUGIN), + pluginStaticDirectoryValidator, servePluginStaticDirectory ) pluginsRouter.get('/plugins/:pluginName/:pluginVersion/client-scripts/:staticEndpoint(*)', - servePluginStaticDirectoryValidator(PluginType.PLUGIN), + getPluginValidator(PluginType.PLUGIN), + pluginStaticDirectoryValidator, servePluginClientScripts ) +pluginsRouter.use('/plugins/:pluginName/router', + getPluginValidator(PluginType.PLUGIN, false), + servePluginCustomRoutes +) + +pluginsRouter.use('/plugins/:pluginName/:pluginVersion/router', + getPluginValidator(PluginType.PLUGIN), + servePluginCustomRoutes +) + pluginsRouter.get('/themes/:pluginName/:pluginVersion/static/:staticEndpoint(*)', - servePluginStaticDirectoryValidator(PluginType.THEME), + getPluginValidator(PluginType.THEME), + pluginStaticDirectoryValidator, servePluginStaticDirectory ) pluginsRouter.get('/themes/:pluginName/:pluginVersion/client-scripts/:staticEndpoint(*)', - servePluginStaticDirectoryValidator(PluginType.THEME), + getPluginValidator(PluginType.THEME), + pluginStaticDirectoryValidator, servePluginClientScripts ) @@ -85,22 +106,27 @@ function servePluginStaticDirectory (req: express.Request, res: express.Response const [ directory, ...file ] = staticEndpoint.split('/') const staticPath = plugin.staticDirs[directory] - if (!staticPath) { - return res.sendStatus(404) - } + if (!staticPath) return res.sendStatus(404) const filepath = file.join('/') return res.sendFile(join(plugin.path, staticPath, filepath), sendFileOptions) } +function servePluginCustomRoutes (req: express.Request, res: express.Response, next: express.NextFunction) { + const plugin: RegisteredPlugin = res.locals.registeredPlugin + const router = PluginManager.Instance.getRouter(plugin.npmName) + + if (!router) return res.sendStatus(404) + + return router(req, res, next) +} + function servePluginClientScripts (req: express.Request, res: express.Response) { const plugin: RegisteredPlugin = res.locals.registeredPlugin const staticEndpoint = req.params.staticEndpoint const file = plugin.clientScripts[staticEndpoint] - if (!file) { - return res.sendStatus(404) - } + if (!file) return res.sendStatus(404) return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions) } @@ -115,3 +141,14 @@ function serveThemeCSSDirectory (req: express.Request, res: express.Response) { return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions) } + +function handleAuthInPlugin (req: express.Request, res: express.Response) { + const authOptions = res.locals.externalAuth + + try { + logger.debug('Forwarding auth plugin request in %s of plugin %s.', authOptions.authName, res.locals.registeredPlugin.npmName) + authOptions.onAuthRequest(req, res) + } catch (err) { + logger.error('Forward request error in auth %s of plugin %s.', authOptions.authName, res.locals.registeredPlugin.npmName, { err }) + } +}