From c7c8d3b355fb56a7d878ab921385a8f6724869a8 Mon Sep 17 00:00:00 2001 From: kontrollanten <6680299+kontrollanten@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:16:54 +0200 Subject: [PATCH] fix(server/plugins): avoid duplicate settings Filter settings so that the name property is unique. closes #6356 --- .../fixtures/peertube-plugin-test/main.js | 19 ++++++++ packages/tests/src/plugins/index.ts | 1 + packages/tests/src/plugins/plugin-settings.ts | 48 +++++++++++++++++++ server/core/lib/plugins/register-helpers.ts | 7 ++- 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 packages/tests/src/plugins/plugin-settings.ts diff --git a/packages/tests/fixtures/peertube-plugin-test/main.js b/packages/tests/fixtures/peertube-plugin-test/main.js index d8eaa3d71..c2570e6fc 100644 --- a/packages/tests/fixtures/peertube-plugin-test/main.js +++ b/packages/tests/fixtures/peertube-plugin-test/main.js @@ -1,5 +1,24 @@ async function register ({ registerHook, registerSetting, settingsManager, storageManager, peertubeHelpers }) { { + registerSetting({ + name: 'unique-setting', + label: 'Unique setting', + type: 'select', + options: [] + }) + + registerSetting({ + name: 'unique-setting', + label: 'Unique setting', + type: 'select', + options: [ + { + value: 1, + label: 'One' + } + ] + }) + const actionHooks = [ 'action:application.listening', 'action:notifier.notification.created', diff --git a/packages/tests/src/plugins/index.ts b/packages/tests/src/plugins/index.ts index 210af7236..fdcae82d5 100644 --- a/packages/tests/src/plugins/index.ts +++ b/packages/tests/src/plugins/index.ts @@ -5,6 +5,7 @@ import './html-injection' import './id-and-pass-auth' import './plugin-helpers' import './plugin-router' +import './plugin-settings' import './plugin-storage' import './plugin-transcoding' import './plugin-unloading' diff --git a/packages/tests/src/plugins/plugin-settings.ts b/packages/tests/src/plugins/plugin-settings.ts new file mode 100644 index 000000000..cd41c425d --- /dev/null +++ b/packages/tests/src/plugins/plugin-settings.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import { expect } from 'chai' +import { + cleanupTests, + createSingleServer, + PeerTubeServer, + PluginsCommand, + setAccessTokensToServers +} from '@peertube/peertube-server-commands' + +describe('Test plugin settings', function () { + let server: PeerTubeServer + let command: PluginsCommand + + before(async function () { + this.timeout(30000) + + server = await createSingleServer(1) + await setAccessTokensToServers([ server ]) + + command = server.plugins + + await command.install({ + path: PluginsCommand.getPluginTestPath() + }) + }) + + it('Should not have duplicate settings', async function () { + const { registeredSettings } = await command.getRegisteredSettings({ + npmName: 'peertube-plugin-test' + }) + + expect(registeredSettings.length).to.equal(1) + }) + + it('Should return the latest registered settings', async function () { + const { registeredSettings } = await command.getRegisteredSettings({ + npmName: 'peertube-plugin-test' + }) + + expect(registeredSettings[0].options.length).length.to.equal(1) + }) + + after(async function () { + await cleanupTests([ server ]) + }) +}) diff --git a/server/core/lib/plugins/register-helpers.ts b/server/core/lib/plugins/register-helpers.ts index 7c44bff88..dc46612a5 100644 --- a/server/core/lib/plugins/register-helpers.ts +++ b/server/core/lib/plugins/register-helpers.ts @@ -44,7 +44,7 @@ export class RegisterHelpers { }[] } = {} - private readonly settings: RegisterServerSettingOptions[] = [] + private settings: RegisterServerSettingOptions[] = [] private idAndPassAuths: RegisterServerAuthPassOptions[] = [] private externalAuths: RegisterServerAuthExternalOptions[] = [] @@ -203,7 +203,10 @@ export class RegisterHelpers { private buildRegisterSetting () { return (options: RegisterServerSettingOptions) => { - this.settings.push(options) + this.settings = [ + ...this.settings.filter((s) => s.name !== options.name), + options + ] } }