X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcustom-validators%2Fplugins.ts;h=2e317574232dae9357c5e8d9febde464a1f10b74;hb=b5206dfc455c119b0dcb897bd7144be6ea4d999d;hp=e0a6f98a7a5717eb599f2f174291acebbbbbfed7;hpb=503c6f440abc8f5924c38c4bd63591cb6cefacec;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/custom-validators/plugins.ts b/server/helpers/custom-validators/plugins.ts index e0a6f98a7..2e3175742 100644 --- a/server/helpers/custom-validators/plugins.ts +++ b/server/helpers/custom-validators/plugins.ts @@ -41,10 +41,14 @@ function isPluginEngineValid (engine: any) { } function isPluginHomepage (value: string) { - return isUrlValid(value) + return exists(value) && (!value || isUrlValid(value)) } -function isStaticDirectoriesValid (staticDirs: any) { +function isPluginBugs (value: string) { + return exists(value) && (!value || isUrlValid(value)) +} + +function areStaticDirectoriesValid (staticDirs: any) { if (!exists(staticDirs) || typeof staticDirs !== 'object') return false for (const key of Object.keys(staticDirs)) { @@ -54,14 +58,24 @@ function isStaticDirectoriesValid (staticDirs: any) { return true } -function isClientScriptsValid (clientScripts: any[]) { +function areClientScriptsValid (clientScripts: any[]) { return isArray(clientScripts) && clientScripts.every(c => { return isSafePath(c.script) && isArray(c.scopes) }) } -function isCSSPathsValid (css: any[]) { +function areTranslationPathsValid (translations: any) { + if (!exists(translations) || typeof translations !== 'object') return false + + for (const key of Object.keys(translations)) { + if (!isSafePath(translations[key])) return false + } + + return true +} + +function areCSSPathsValid (css: any[]) { return isArray(css) && css.every(c => isSafePath(c)) } @@ -70,16 +84,65 @@ function isThemeNameValid (name: string) { } function isPackageJSONValid (packageJSON: PluginPackageJson, pluginType: PluginType) { - return isNpmPluginNameValid(packageJSON.name) && - isPluginDescriptionValid(packageJSON.description) && - isPluginEngineValid(packageJSON.engine) && - isPluginHomepage(packageJSON.homepage) && - exists(packageJSON.author) && - isUrlValid(packageJSON.bugs) && - (pluginType === PluginType.THEME || isSafePath(packageJSON.library)) && - isStaticDirectoriesValid(packageJSON.staticDirs) && - isCSSPathsValid(packageJSON.css) && - isClientScriptsValid(packageJSON.clientScripts) + let result = true + const badFields: string[] = [] + + if (!isNpmPluginNameValid(packageJSON.name)) { + result = false + badFields.push('name') + } + + if (!isPluginDescriptionValid(packageJSON.description)) { + result = false + badFields.push('description') + } + + if (!isPluginEngineValid(packageJSON.engine)) { + result = false + badFields.push('engine') + } + + if (!isPluginHomepage(packageJSON.homepage)) { + result = false + badFields.push('homepage') + } + + if (!exists(packageJSON.author)) { + result = false + badFields.push('author') + } + + if (!isPluginBugs(packageJSON.bugs)) { + result = false + badFields.push('bugs') + } + + if (pluginType === PluginType.PLUGIN && !isSafePath(packageJSON.library)) { + result = false + badFields.push('library') + } + + if (!areStaticDirectoriesValid(packageJSON.staticDirs)) { + result = false + badFields.push('staticDirs') + } + + if (!areCSSPathsValid(packageJSON.css)) { + result = false + badFields.push('css') + } + + if (!areClientScriptsValid(packageJSON.clientScripts)) { + result = false + badFields.push('clientScripts') + } + + if (!areTranslationPathsValid(packageJSON.translations)) { + result = false + badFields.push('translations') + } + + return { result, badFields } } function isLibraryCodeValid (library: any) {