From b3af2601da92a6c0835cb2473b4c7a41a0d86e98 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 20 Apr 2020 15:32:11 +0200 Subject: [PATCH] Add ability to remove privacies using plugins --- server/lib/plugins/register-helpers-store.ts | 42 ++++++++++++-- .../peertube-plugin-test-three/main.js | 7 ++- server/tests/plugins/video-constants.ts | 55 ++++++++++++++++++- .../plugins/register-server-option.model.ts | 5 ++ .../plugin-playlist-privacy-manager.model.ts | 8 +++ .../plugin-video-privacy-manager.model.ts | 9 +++ support/doc/plugins/guide.md | 8 ++- 7 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 shared/models/plugins/plugin-playlist-privacy-manager.model.ts create mode 100644 shared/models/plugins/plugin-video-privacy-manager.model.ts diff --git a/server/lib/plugins/register-helpers-store.ts b/server/lib/plugins/register-helpers-store.ts index c76c0161a..5ca52b151 100644 --- a/server/lib/plugins/register-helpers-store.ts +++ b/server/lib/plugins/register-helpers-store.ts @@ -2,7 +2,13 @@ import { PluginSettingsManager } from '@shared/models/plugins/plugin-settings-ma import { PluginModel } from '@server/models/server/plugin' import { PluginStorageManager } from '@shared/models/plugins/plugin-storage-manager.model' import { PluginVideoLanguageManager } from '@shared/models/plugins/plugin-video-language-manager.model' -import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES } from '@server/initializers/constants' +import { + VIDEO_CATEGORIES, + VIDEO_LANGUAGES, + VIDEO_LICENCES, + VIDEO_PLAYLIST_PRIVACIES, + VIDEO_PRIVACIES +} from '@server/initializers/constants' import { PluginVideoLicenceManager } from '@shared/models/plugins/plugin-video-licence-manager.model' import { PluginVideoCategoryManager } from '@shared/models/plugins/plugin-video-category-manager.model' import { RegisterServerOptions } from '@server/typings/plugins' @@ -12,8 +18,10 @@ import { RegisterServerHookOptions } from '@shared/models/plugins/register-serve import { serverHookObject } from '@shared/models/plugins/server-hook.model' import { RegisterServerSettingOptions } from '@shared/models/plugins/register-server-setting.model' import * as express from 'express' +import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model' +import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model' -type AlterableVideoConstant = 'language' | 'licence' | 'category' +type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy' type VideoConstant = { [key in number | string]: string } type UpdatedVideoConstant = { @@ -25,6 +33,8 @@ type UpdatedVideoConstant = { export class RegisterHelpersStore { private readonly updatedVideoConstants: UpdatedVideoConstant = { + playlistPrivacy: { added: [], deleted: [] }, + privacy: { added: [], deleted: [] }, language: { added: [], deleted: [] }, licence: { added: [], deleted: [] }, category: { added: [], deleted: [] } @@ -56,6 +66,9 @@ export class RegisterHelpersStore { const videoLicenceManager = this.buildVideoLicenceManager() const videoCategoryManager = this.buildVideoCategoryManager() + const videoPrivacyManager = this.buildVideoPrivacyManager() + const playlistPrivacyManager = this.buildPlaylistPrivacyManager() + const peertubeHelpers = buildPluginHelpers(this.npmName) return { @@ -71,6 +84,9 @@ export class RegisterHelpersStore { videoCategoryManager, videoLicenceManager, + videoPrivacyManager, + playlistPrivacyManager, + peertubeHelpers } } @@ -79,9 +95,11 @@ export class RegisterHelpersStore { const hash = { language: VIDEO_LANGUAGES, licence: VIDEO_LICENCES, - category: VIDEO_CATEGORIES + category: VIDEO_CATEGORIES, + privacy: VIDEO_PRIVACIES, + playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES } - const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category' ] + const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ] for (const type of types) { const updatedConstants = this.updatedVideoConstants[type][npmName] @@ -168,6 +186,22 @@ export class RegisterHelpersStore { } } + private buildVideoPrivacyManager (): PluginVideoPrivacyManager { + return { + deletePrivacy: (key: number) => { + return this.deleteConstant({ npmName: this.npmName, type: 'privacy', obj: VIDEO_PRIVACIES, key }) + } + } + } + + private buildPlaylistPrivacyManager (): PluginPlaylistPrivacyManager { + return { + deletePlaylistPrivacy: (key: number) => { + return this.deleteConstant({ npmName: this.npmName, type: 'playlistPrivacy', obj: VIDEO_PLAYLIST_PRIVACIES, key }) + } + } + } + private buildVideoLicenceManager (): PluginVideoLicenceManager { return { addLicence: (key: number, label: string) => { diff --git a/server/tests/fixtures/peertube-plugin-test-three/main.js b/server/tests/fixtures/peertube-plugin-test-three/main.js index 4945feb55..f2b89bcf0 100644 --- a/server/tests/fixtures/peertube-plugin-test-three/main.js +++ b/server/tests/fixtures/peertube-plugin-test-three/main.js @@ -5,7 +5,9 @@ async function register ({ storageManager, videoCategoryManager, videoLicenceManager, - videoLanguageManager + videoLanguageManager, + videoPrivacyManager, + playlistPrivacyManager }) { videoLanguageManager.addLanguage('al_bhed', 'Al Bhed') videoLanguageManager.addLanguage('al_bhed2', 'Al Bhed 2') @@ -21,6 +23,9 @@ async function register ({ videoLicenceManager.addLicence(43, 'High best licence') videoLicenceManager.deleteLicence(1) // Attribution videoLicenceManager.deleteLicence(7) // Public domain + + videoPrivacyManager.deletePrivacy(2) + playlistPrivacyManager.deletePlaylistPrivacy(3) } async function unregister () { diff --git a/server/tests/plugins/video-constants.ts b/server/tests/plugins/video-constants.ts index 5374b5ecc..fec9196e2 100644 --- a/server/tests/plugins/video-constants.ts +++ b/server/tests/plugins/video-constants.ts @@ -4,17 +4,18 @@ import * as chai from 'chai' import 'mocha' import { cleanupTests, flushAndRunServer, ServerInfo } from '../../../shared/extra-utils/server/servers' import { + createVideoPlaylist, getPluginTestPath, getVideo, getVideoCategories, getVideoLanguages, - getVideoLicences, + getVideoLicences, getVideoPlaylistPrivacies, getVideoPrivacies, installPlugin, setAccessTokensToServers, uninstallPlugin, uploadVideo } from '../../../shared/extra-utils' -import { VideoDetails } from '../../../shared/models/videos' +import { VideoDetails, VideoPlaylistPrivacy } from '../../../shared/models/videos' const expect = chai.expect @@ -67,6 +68,35 @@ describe('Test plugin altering video constants', function () { expect(licences[43]).to.equal('High best licence') }) + it('Should have updated video privacies', async function () { + const res = await getVideoPrivacies(server.url) + const privacies = res.body + + expect(privacies[1]).to.exist + expect(privacies[2]).to.not.exist + expect(privacies[3]).to.exist + expect(privacies[4]).to.exist + }) + + it('Should have updated playlist privacies', async function () { + const res = await getVideoPlaylistPrivacies(server.url) + const playlistPrivacies = res.body + + expect(playlistPrivacies[1]).to.exist + expect(playlistPrivacies[2]).to.exist + expect(playlistPrivacies[3]).to.not.exist + }) + + it('Should not be able to create a video with this privacy', async function () { + const attrs = { name: 'video', privacy: 2 } + await uploadVideo(server.url, server.accessToken, attrs, 400) + }) + + it('Should not be able to create a video with this privacy', async function () { + const attrs = { displayName: 'video playlist', privacy: VideoPlaylistPrivacy.PRIVATE } + await createVideoPlaylist({ url: server.url, token: server.accessToken, playlistAttrs: attrs, expectedStatus: 400 }) + }) + it('Should be able to upload a video with these values', async function () { const attrs = { name: 'video', category: 42, licence: 42, language: 'al_bhed2' } const resUpload = await uploadVideo(server.url, server.accessToken, attrs) @@ -79,7 +109,7 @@ describe('Test plugin altering video constants', function () { expect(video.category.label).to.equal('Best category') }) - it('Should uninstall the plugin and reset languages, categories and licences', async function () { + it('Should uninstall the plugin and reset languages, categories, licences and privacies', async function () { await uninstallPlugin({ url: server.url, accessToken: server.accessToken, npmName: 'peertube-plugin-test-three' }) { @@ -114,6 +144,25 @@ describe('Test plugin altering video constants', function () { expect(licences[42]).to.not.exist expect(licences[43]).to.not.exist } + + { + const res = await getVideoPrivacies(server.url) + const privacies = res.body + + expect(privacies[1]).to.exist + expect(privacies[2]).to.exist + expect(privacies[3]).to.exist + expect(privacies[4]).to.exist + } + + { + const res = await getVideoPlaylistPrivacies(server.url) + const playlistPrivacies = res.body + + expect(playlistPrivacies[1]).to.exist + expect(playlistPrivacies[2]).to.exist + expect(playlistPrivacies[3]).to.exist + } }) after(async function () { diff --git a/server/typings/plugins/register-server-option.model.ts b/server/typings/plugins/register-server-option.model.ts index 3d6217d1b..813e93003 100644 --- a/server/typings/plugins/register-server-option.model.ts +++ b/server/typings/plugins/register-server-option.model.ts @@ -7,6 +7,8 @@ import { PluginVideoLanguageManager } from '../../../shared/models/plugins/plugi import { PluginVideoLicenceManager } from '../../../shared/models/plugins/plugin-video-licence-manager.model' import { Logger } from 'winston' import { Router } from 'express' +import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model' +import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model' export type PeerTubeHelpers = { logger: Logger @@ -33,6 +35,9 @@ export type RegisterServerOptions = { videoLanguageManager: PluginVideoLanguageManager videoLicenceManager: PluginVideoLicenceManager + videoPrivacyManager: PluginVideoPrivacyManager + playlistPrivacyManager: PluginPlaylistPrivacyManager + // Get plugin router to create custom routes // Base routes of this router are // * /plugins/:pluginName/:pluginVersion/router/... diff --git a/shared/models/plugins/plugin-playlist-privacy-manager.model.ts b/shared/models/plugins/plugin-playlist-privacy-manager.model.ts new file mode 100644 index 000000000..f9630c77f --- /dev/null +++ b/shared/models/plugins/plugin-playlist-privacy-manager.model.ts @@ -0,0 +1,8 @@ +import { VideoPlaylistPrivacy } from '@shared/models' + +export interface PluginPlaylistPrivacyManager { + // PUBLIC = 1, + // UNLISTED = 2, + // PRIVATE = 3 + deletePlaylistPrivacy: (privacyKey: VideoPlaylistPrivacy) => boolean +} diff --git a/shared/models/plugins/plugin-video-privacy-manager.model.ts b/shared/models/plugins/plugin-video-privacy-manager.model.ts new file mode 100644 index 000000000..d602ba297 --- /dev/null +++ b/shared/models/plugins/plugin-video-privacy-manager.model.ts @@ -0,0 +1,9 @@ +import { VideoPrivacy } from '@shared/models' + +export interface PluginVideoPrivacyManager { + // PUBLIC = 1 + // UNLISTED = 2 + // PRIVATE = 3 + // INTERNAL = 4 + deletePrivacy: (privacyKey: VideoPrivacy) => boolean +} diff --git a/support/doc/plugins/guide.md b/support/doc/plugins/guide.md index 1bee1f611..fdad63087 100644 --- a/support/doc/plugins/guide.md +++ b/support/doc/plugins/guide.md @@ -14,7 +14,10 @@ - [Update video constants](#update-video-constants) - [Add custom routes](#add-custom-routes) - [Client helpers (themes & plugins)](#client-helpers-themes--plugins) - - [Plugin static route](#plugin-static-route) + - [Plugin static route](#plugin-static-route) + - [Notifier](#notifier) + - [Markdown Renderer](#markdown-renderer) + - [Custom Modal](#custom-modal) - [Translate](#translate) - [Get public settings](#get-public-settings) - [Publishing](#publishing) @@ -180,6 +183,9 @@ videoCategoryManager.deleteCategory(1) // Music videoLicenceManager.addLicence(42, 'Best licence') videoLicenceManager.deleteLicence(7) // Public domain + +videoPrivacyManager.deletePrivacy(2) // Remove Unlisted video privacy +playlistPrivacyManager.deletePlaylistPrivacy(3) // Remove Private video playlist privacy ``` #### Add custom routes -- 2.25.1