X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fplugins.ts;h=1caee9a29fcbb10d2fdd5fbb0f09121f154b72fe;hb=eb11373f9373bdeca5a1e7868f868d9ec3b2c7b6;hp=05f03324d80f69f8e2b4095925a4b85678784c42;hpb=2c0539420d77339e6afe8d7920b44af4c0dcb1e6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/plugins.ts b/server/controllers/plugins.ts index 05f03324d..1caee9a29 100644 --- a/server/controllers/plugins.ts +++ b/server/controllers/plugins.ts @@ -1,25 +1,53 @@ import * as express from 'express' import { PLUGIN_GLOBAL_CSS_PATH } from '../initializers/constants' -import { basename, join } from 'path' -import { RegisteredPlugin } from '../lib/plugins/plugin-manager' +import { join } from 'path' +import { PluginManager, RegisteredPlugin } from '../lib/plugins/plugin-manager' import { servePluginStaticDirectoryValidator } 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' + +const sendFileOptions = { + maxAge: '30 days', + immutable: !isTestInstance() +} const pluginsRouter = express.Router() -pluginsRouter.get('/global.css', +pluginsRouter.get('/plugins/global.css', servePluginGlobalCSS ) -pluginsRouter.get('/:pluginName/:pluginVersion/static/:staticEndpoint(*)', - servePluginStaticDirectoryValidator, +pluginsRouter.get('/plugins/translations/:locale.json', + getPluginTranslations +) + +pluginsRouter.get('/plugins/:pluginName/:pluginVersion/static/:staticEndpoint(*)', + servePluginStaticDirectoryValidator(PluginType.PLUGIN), + servePluginStaticDirectory +) + +pluginsRouter.get('/plugins/:pluginName/:pluginVersion/client-scripts/:staticEndpoint(*)', + servePluginStaticDirectoryValidator(PluginType.PLUGIN), + servePluginClientScripts +) + +pluginsRouter.get('/themes/:pluginName/:pluginVersion/static/:staticEndpoint(*)', + servePluginStaticDirectoryValidator(PluginType.THEME), servePluginStaticDirectory ) -pluginsRouter.get('/:pluginName/:pluginVersion/client-scripts/:staticEndpoint(*)', - servePluginStaticDirectoryValidator, +pluginsRouter.get('/themes/:pluginName/:pluginVersion/client-scripts/:staticEndpoint(*)', + servePluginStaticDirectoryValidator(PluginType.THEME), servePluginClientScripts ) +pluginsRouter.get('/themes/:themeName/:themeVersion/css/:staticEndpoint(*)', + serveThemeCSSValidator, + serveThemeCSSDirectory +) + // --------------------------------------------------------------------------- export { @@ -29,7 +57,25 @@ export { // --------------------------------------------------------------------------- function servePluginGlobalCSS (req: express.Request, res: express.Response) { - return res.sendFile(PLUGIN_GLOBAL_CSS_PATH) + // Only cache requests that have a ?hash=... query param + const globalCSSOptions = req.query.hash + ? sendFileOptions + : {} + + return res.sendFile(PLUGIN_GLOBAL_CSS_PATH, globalCSSOptions) +} + +function getPluginTranslations (req: express.Request, res: express.Response) { + const locale = req.params.locale + + if (is18nLocale(locale)) { + const completeLocale = getCompleteLocale(locale) + const json = PluginManager.Instance.getTranslations(completeLocale) + + return res.json(json) + } + + return res.sendStatus(404) } function servePluginStaticDirectory (req: express.Request, res: express.Response) { @@ -44,7 +90,7 @@ function servePluginStaticDirectory (req: express.Request, res: express.Response } const filepath = file.join('/') - return res.sendFile(join(plugin.path, staticPath, filepath)) + return res.sendFile(join(plugin.path, staticPath, filepath), sendFileOptions) } function servePluginClientScripts (req: express.Request, res: express.Response) { @@ -56,5 +102,16 @@ function servePluginClientScripts (req: express.Request, res: express.Response) return res.sendStatus(404) } - return res.sendFile(join(plugin.path, staticEndpoint)) + return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions) +} + +function serveThemeCSSDirectory (req: express.Request, res: express.Response) { + const plugin: RegisteredPlugin = res.locals.registeredPlugin + const staticEndpoint = req.params.staticEndpoint + + if (plugin.css.includes(staticEndpoint) === false) { + return res.sendStatus(404) + } + + return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions) }