-import { PluginSettingsManager } from '@shared/models/plugins/plugin-settings-manager.model'
-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 { 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'
-import { buildPluginHelpers } from './plugin-helpers'
+import * as express from 'express'
import { logger } from '@server/helpers/logger'
-import { RegisterServerHookOptions } from '@shared/models/plugins/register-server-hook.model'
+import {
+ VIDEO_CATEGORIES,
+ VIDEO_LANGUAGES,
+ VIDEO_LICENCES,
+ VIDEO_PLAYLIST_PRIVACIES,
+ VIDEO_PRIVACIES
+} from '@server/initializers/constants'
+import { onExternalUserAuthenticated } from '@server/lib/auth'
+import { PluginModel } from '@server/models/server/plugin'
+import {
+ RegisterServerAuthExternalOptions,
+ RegisterServerAuthExternalResult,
+ RegisterServerAuthPassOptions,
+ RegisterServerExternalAuthenticatedResult,
+ RegisterServerOptions
+} from '@server/types/plugins'
+import {
+ PluginPlaylistPrivacyManager,
+ PluginSettingsManager,
+ PluginStorageManager,
+ PluginVideoCategoryManager,
+ PluginVideoLanguageManager,
+ PluginVideoLicenceManager,
+ PluginVideoPrivacyManager,
+ RegisterServerHookOptions,
+ RegisterServerSettingOptions
+} from '@shared/models'
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 { buildPluginHelpers } from './plugin-helpers'
-type AlterableVideoConstant = 'language' | 'licence' | 'category'
+type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy'
type VideoConstant = { [key in number | string]: string }
type UpdatedVideoConstant = {
export class RegisterHelpersStore {
private readonly updatedVideoConstants: UpdatedVideoConstant = {
+ playlistPrivacy: { added: [], deleted: [] },
+ privacy: { added: [], deleted: [] },
language: { added: [], deleted: [] },
licence: { added: [], deleted: [] },
category: { added: [], deleted: [] }
private readonly settings: RegisterServerSettingOptions[] = []
+ private idAndPassAuths: RegisterServerAuthPassOptions[] = []
+ private externalAuths: RegisterServerAuthExternalOptions[] = []
+
+ private readonly onSettingsChangeCallbacks: ((settings: any) => void)[] = []
+
private readonly router: express.Router
constructor (
const videoLicenceManager = this.buildVideoLicenceManager()
const videoCategoryManager = this.buildVideoCategoryManager()
+ const videoPrivacyManager = this.buildVideoPrivacyManager()
+ const playlistPrivacyManager = this.buildPlaylistPrivacyManager()
+
+ const registerIdAndPassAuth = this.buildRegisterIdAndPassAuth()
+ const registerExternalAuth = this.buildRegisterExternalAuth()
+ const unregisterIdAndPassAuth = this.buildUnregisterIdAndPassAuth()
+ const unregisterExternalAuth = this.buildUnregisterExternalAuth()
+
const peertubeHelpers = buildPluginHelpers(this.npmName)
return {
videoCategoryManager,
videoLicenceManager,
+ videoPrivacyManager,
+ playlistPrivacyManager,
+
+ registerIdAndPassAuth,
+ registerExternalAuth,
+ unregisterIdAndPassAuth,
+ unregisterExternalAuth,
+
peertubeHelpers
}
}
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]
return this.router
}
+ getIdAndPassAuths () {
+ return this.idAndPassAuths
+ }
+
+ getExternalAuths () {
+ return this.externalAuths
+ }
+
+ getOnSettingsChangedCallbacks () {
+ return this.onSettingsChangeCallbacks
+ }
+
private buildGetRouter () {
return () => this.router
}
}
}
+ private buildRegisterIdAndPassAuth () {
+ return (options: RegisterServerAuthPassOptions) => {
+ if (!options.authName || typeof options.getWeight !== 'function' || typeof options.login !== 'function') {
+ logger.error('Cannot register auth plugin %s: authName, getWeight or login are not valid.', this.npmName, { options })
+ return
+ }
+
+ this.idAndPassAuths.push(options)
+ }
+ }
+
+ private buildRegisterExternalAuth () {
+ const self = this
+
+ return (options: RegisterServerAuthExternalOptions) => {
+ if (!options.authName || typeof options.authDisplayName !== 'function' || typeof options.onAuthRequest !== 'function') {
+ logger.error('Cannot register auth plugin %s: authName, authDisplayName or onAuthRequest are not valid.', this.npmName, { options })
+ return
+ }
+
+ this.externalAuths.push(options)
+
+ return {
+ userAuthenticated (result: RegisterServerExternalAuthenticatedResult): void {
+ onExternalUserAuthenticated({
+ npmName: self.npmName,
+ authName: options.authName,
+ authResult: result
+ }).catch(err => {
+ logger.error('Cannot execute onExternalUserAuthenticated.', { npmName: self.npmName, authName: options.authName, err })
+ })
+ }
+ } as RegisterServerAuthExternalResult
+ }
+ }
+
+ private buildUnregisterExternalAuth () {
+ return (authName: string) => {
+ this.externalAuths = this.externalAuths.filter(a => a.authName !== authName)
+ }
+ }
+
+ private buildUnregisterIdAndPassAuth () {
+ return (authName: string) => {
+ this.idAndPassAuths = this.idAndPassAuths.filter(a => a.authName !== authName)
+ }
+ }
+
private buildSettingsManager (): PluginSettingsManager {
return {
- getSetting: (name: string) => PluginModel.getSetting(this.plugin.name, this.plugin.type, name),
+ getSetting: (name: string) => PluginModel.getSetting(this.plugin.name, this.plugin.type, name, this.settings),
- setSetting: (name: string, value: string) => PluginModel.setSetting(this.plugin.name, this.plugin.type, name, value)
+ getSettings: (names: string[]) => PluginModel.getSettings(this.plugin.name, this.plugin.type, names, this.settings),
+
+ setSetting: (name: string, value: string) => PluginModel.setSetting(this.plugin.name, this.plugin.type, name, value),
+
+ onSettingsChange: (cb: (settings: any) => void) => this.onSettingsChangeCallbacks.push(cb)
}
}
}
}
+ 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) => {