X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fplugins%2Fplugin-manager.ts;h=73f7a71ceafee1627ac2c435d59def472555d059;hb=7024e9120b381b5b3201212f5a18f5cdc14e15ff;hp=444162a0328ac1e1aa415a549f9bc571b1e66643;hpb=1198edf4bb06ce5f1668b97cf9ca8fb483fe3f41;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/plugins/plugin-manager.ts b/server/lib/plugins/plugin-manager.ts index 444162a03..73f7a71ce 100644 --- a/server/lib/plugins/plugin-manager.ts +++ b/server/lib/plugins/plugin-manager.ts @@ -55,30 +55,30 @@ export interface HookInformationValue { } type AlterableVideoConstant = 'language' | 'licence' | 'category' -type VideoConstant = { [ key in number | string ]: string } +type VideoConstant = { [key in number | string]: string } type UpdatedVideoConstant = { - [ name in AlterableVideoConstant ]: { - [ npmName: string ]: { - added: { key: number | string, label: string }[], + [name in AlterableVideoConstant]: { + [npmName: string]: { + added: { key: number | string, label: string }[] deleted: { key: number | string, label: string }[] } } } type PluginLocalesTranslations = { - [ locale: string ]: PluginTranslation + [locale: string]: PluginTranslation } export class PluginManager implements ServerHook { private static instance: PluginManager - private registeredPlugins: { [ name: string ]: RegisteredPlugin } = {} - private settings: { [ name: string ]: RegisterServerSettingOptions[] } = {} - private hooks: { [ name: string ]: HookInformationValue[] } = {} + private registeredPlugins: { [name: string]: RegisteredPlugin } = {} + private settings: { [name: string]: RegisterServerSettingOptions[] } = {} + private hooks: { [name: string]: HookInformationValue[] } = {} private translations: PluginLocalesTranslations = {} - private updatedVideoConstants: UpdatedVideoConstant = { + private readonly updatedVideoConstants: UpdatedVideoConstant = { language: {}, licence: {}, category: {} @@ -133,7 +133,7 @@ export class PluginManager implements ServerHook { // ###################### Hooks ###################### - async runHook (hookName: ServerHookName, result?: T, params?: any): Promise { + async runHook (hookName: ServerHookName, result?: T, params?: any): Promise { if (!this.hooks[hookName]) return Promise.resolve(result) const hookType = getHookType(hookName) @@ -194,7 +194,7 @@ export class PluginManager implements ServerHook { // Remove hooks of this plugin for (const key of Object.keys(this.hooks)) { - this.hooks[key] = this.hooks[key].filter(h => h.pluginName !== npmName) + this.hooks[key] = this.hooks[key].filter(h => h.npmName !== npmName) } this.reinitVideoConstants(plugin.npmName) @@ -222,9 +222,8 @@ export class PluginManager implements ServerHook { const pluginName = PluginModel.normalizePluginName(npmName) const packageJSON = await this.getPackageJSON(pluginName, pluginType) - if (!isPackageJSONValid(packageJSON, pluginType)) { - throw new Error('PackageJSON is invalid.') - } + + this.sanitizeAndCheckPackageJSONOrThrow(packageJSON, pluginType); [ plugin ] = await PluginModel.upsert({ name: pluginName, @@ -301,9 +300,7 @@ export class PluginManager implements ServerHook { const packageJSON = await this.getPackageJSON(plugin.name, plugin.type) const pluginPath = this.getPluginPath(plugin.name, plugin.type) - if (!isPackageJSONValid(packageJSON, plugin.type)) { - throw new Error('Package.JSON is invalid.') - } + this.sanitizeAndCheckPackageJSONOrThrow(packageJSON, plugin.type) let library: PluginLibrary if (plugin.type === PluginType.PLUGIN) { @@ -315,7 +312,7 @@ export class PluginManager implements ServerHook { clientScripts[c.script] = c } - this.registeredPlugins[ npmName ] = { + this.registeredPlugins[npmName] = { npmName, name: plugin.name, type: plugin.type, @@ -441,7 +438,7 @@ export class PluginManager implements ServerHook { const plugins: RegisteredPlugin[] = [] for (const npmName of Object.keys(this.registeredPlugins)) { - const plugin = this.registeredPlugins[ npmName ] + const plugin = this.registeredPlugins[npmName] if (plugin.type !== type) continue plugins.push(plugin) @@ -521,11 +518,11 @@ export class PluginManager implements ServerHook { } } - private addConstant (parameters: { - npmName: string, - type: AlterableVideoConstant, - obj: VideoConstant, - key: T, + private addConstant (parameters: { + npmName: string + type: AlterableVideoConstant + obj: VideoConstant + key: T label: string }) { const { npmName, type, obj, key, label } = parameters @@ -548,10 +545,10 @@ export class PluginManager implements ServerHook { return true } - private deleteConstant (parameters: { - npmName: string, - type: AlterableVideoConstant, - obj: VideoConstant, + private deleteConstant (parameters: { + npmName: string + type: AlterableVideoConstant + obj: VideoConstant key: T }) { const { npmName, type, obj, key } = parameters @@ -598,6 +595,21 @@ export class PluginManager implements ServerHook { } } + private sanitizeAndCheckPackageJSONOrThrow (packageJSON: PluginPackageJson, pluginType: PluginType) { + if (!packageJSON.staticDirs) packageJSON.staticDirs = {} + if (!packageJSON.css) packageJSON.css = [] + if (!packageJSON.clientScripts) packageJSON.clientScripts = [] + if (!packageJSON.translations) packageJSON.translations = {} + + const { result: packageJSONValid, badFields } = isPackageJSONValid(packageJSON, pluginType) + if (!packageJSONValid) { + const formattedFields = badFields.map(f => `"${f}"`) + .join(', ') + + throw new Error(`PackageJSON is invalid (invalid fields: ${formattedFields}).`) + } + } + static get Instance () { return this.instance || (this.instance = new this()) }