1 import * as express from 'express'
2 import { param, query, body } from 'express-validator/check'
3 import { logger } from '../../helpers/logger'
4 import { areValidationErrors } from './utils'
5 import { isPluginNameValid, isPluginTypeValid, isPluginVersionValid, isNpmPluginNameValid } from '../../helpers/custom-validators/plugins'
6 import { PluginManager } from '../../lib/plugins/plugin-manager'
7 import { isBooleanValid, isSafePath } from '../../helpers/custom-validators/misc'
8 import { PluginModel } from '../../models/server/plugin'
10 const servePluginStaticDirectoryValidator = [
11 param('pluginName').custom(isPluginNameValid).withMessage('Should have a valid plugin name'),
12 param('pluginVersion').custom(isPluginVersionValid).withMessage('Should have a valid plugin version'),
13 param('staticEndpoint').custom(isSafePath).withMessage('Should have a valid static endpoint'),
15 (req: express.Request, res: express.Response, next: express.NextFunction) => {
16 logger.debug('Checking servePluginStaticDirectory parameters', { parameters: req.params })
18 if (areValidationErrors(req, res)) return
20 const plugin = PluginManager.Instance.getRegisteredPluginOrTheme(req.params.pluginName)
22 if (!plugin || plugin.version !== req.params.pluginVersion) {
23 return res.sendStatus(404)
26 res.locals.registeredPlugin = plugin
32 const listPluginsValidator = [
35 .custom(isPluginTypeValid).withMessage('Should have a valid plugin type'),
39 .custom(isBooleanValid).withMessage('Should have a valid uninstalled attribute'),
41 (req: express.Request, res: express.Response, next: express.NextFunction) => {
42 logger.debug('Checking listPluginsValidator parameters', { parameters: req.query })
44 if (areValidationErrors(req, res)) return
50 const installPluginValidator = [
51 body('npmName').custom(isNpmPluginNameValid).withMessage('Should have a valid npm name'),
53 (req: express.Request, res: express.Response, next: express.NextFunction) => {
54 logger.debug('Checking installPluginValidator parameters', { parameters: req.body })
56 if (areValidationErrors(req, res)) return
62 const uninstallPluginValidator = [
63 body('npmName').custom(isNpmPluginNameValid).withMessage('Should have a valid npm name'),
65 (req: express.Request, res: express.Response, next: express.NextFunction) => {
66 logger.debug('Checking uninstallPluginValidator parameters', { parameters: req.body })
68 if (areValidationErrors(req, res)) return
74 const existingPluginValidator = [
75 param('npmName').custom(isPluginNameValid).withMessage('Should have a valid plugin name'),
77 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
78 logger.debug('Checking enabledPluginValidator parameters', { parameters: req.params })
80 if (areValidationErrors(req, res)) return
82 const plugin = await PluginModel.loadByNpmName(req.params.npmName)
84 return res.status(404)
85 .json({ error: 'Plugin not found' })
89 res.locals.plugin = plugin
95 const updatePluginSettingsValidator = [
96 body('settings').exists().withMessage('Should have settings'),
98 (req: express.Request, res: express.Response, next: express.NextFunction) => {
99 logger.debug('Checking enabledPluginValidator parameters', { parameters: req.body })
101 if (areValidationErrors(req, res)) return
107 // ---------------------------------------------------------------------------
110 servePluginStaticDirectoryValidator,
111 updatePluginSettingsValidator,
112 uninstallPluginValidator,
113 existingPluginValidator,
114 installPluginValidator,