Add ability to unregister plugin auths

This commit is contained in:
Chocobozzz 2020-04-30 10:03:09 +02:00 committed by Chocobozzz
parent e9b0fa5c16
commit a4995eb7ac
7 changed files with 102 additions and 9 deletions

View File

@ -181,7 +181,6 @@ export class AuthService {
err => console.error(err) err => console.error(err)
) )
this.user = null this.user = null
AuthUser.flush() AuthUser.flush()

View File

@ -49,8 +49,8 @@ export class RegisterHelpersStore {
private readonly settings: RegisterServerSettingOptions[] = [] private readonly settings: RegisterServerSettingOptions[] = []
private readonly idAndPassAuths: RegisterServerAuthPassOptions[] = [] private idAndPassAuths: RegisterServerAuthPassOptions[] = []
private readonly externalAuths: RegisterServerAuthExternalOptions[] = [] private externalAuths: RegisterServerAuthExternalOptions[] = []
private readonly onSettingsChangeCallbacks: ((settings: any) => void)[] = [] private readonly onSettingsChangeCallbacks: ((settings: any) => void)[] = []
@ -83,6 +83,8 @@ export class RegisterHelpersStore {
const registerIdAndPassAuth = this.buildRegisterIdAndPassAuth() const registerIdAndPassAuth = this.buildRegisterIdAndPassAuth()
const registerExternalAuth = this.buildRegisterExternalAuth() const registerExternalAuth = this.buildRegisterExternalAuth()
const unregisterIdAndPassAuth = this.buildUnregisterIdAndPassAuth()
const unregisterExternalAuth = this.buildUnregisterExternalAuth()
const peertubeHelpers = buildPluginHelpers(this.npmName) const peertubeHelpers = buildPluginHelpers(this.npmName)
@ -104,6 +106,8 @@ export class RegisterHelpersStore {
registerIdAndPassAuth, registerIdAndPassAuth,
registerExternalAuth, registerExternalAuth,
unregisterIdAndPassAuth,
unregisterExternalAuth,
peertubeHelpers peertubeHelpers
} }
@ -179,7 +183,7 @@ export class RegisterHelpersStore {
private buildRegisterIdAndPassAuth () { private buildRegisterIdAndPassAuth () {
return (options: RegisterServerAuthPassOptions) => { return (options: RegisterServerAuthPassOptions) => {
if (!options.authName || typeof options.getWeight !== 'function' || typeof options.login !== 'function') { if (!options.authName || typeof options.getWeight !== 'function' || typeof options.login !== 'function') {
logger.error('Cannot register auth plugin %s: authName of getWeight or login are not valid.', this.npmName) logger.error('Cannot register auth plugin %s: authName, getWeight or login are not valid.', this.npmName, { options })
return return
} }
@ -192,7 +196,7 @@ export class RegisterHelpersStore {
return (options: RegisterServerAuthExternalOptions) => { return (options: RegisterServerAuthExternalOptions) => {
if (!options.authName || typeof options.authDisplayName !== 'function' || typeof options.onAuthRequest !== 'function') { if (!options.authName || typeof options.authDisplayName !== 'function' || typeof options.onAuthRequest !== 'function') {
logger.error('Cannot register auth plugin %s: authName of getWeight or login are not valid.', this.npmName) logger.error('Cannot register auth plugin %s: authName, authDisplayName or onAuthRequest are not valid.', this.npmName, { options })
return return
} }
@ -212,6 +216,18 @@ export class RegisterHelpersStore {
} }
} }
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 { private buildSettingsManager (): PluginSettingsManager {
return { 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),

View File

@ -1,6 +1,8 @@
async function register ({ async function register ({
registerExternalAuth, registerExternalAuth,
peertubeHelpers peertubeHelpers,
settingsManager,
unregisterExternalAuth
}) { }) {
{ {
const result = registerExternalAuth({ const result = registerExternalAuth({
@ -53,6 +55,12 @@ async function register ({
} }
}) })
} }
settingsManager.onSettingsChange(settings => {
if (settings.disableKefka) {
unregisterExternalAuth('external-auth-2')
}
})
} }
async function unregister () { async function unregister () {

View File

@ -1,6 +1,8 @@
async function register ({ async function register ({
registerIdAndPassAuth, registerIdAndPassAuth,
peertubeHelpers peertubeHelpers,
settingsManager,
unregisterIdAndPassAuth
}) { }) {
registerIdAndPassAuth({ registerIdAndPassAuth({
authName: 'spyro-auth', authName: 'spyro-auth',
@ -47,6 +49,12 @@ async function register ({
return null return null
} }
}) })
settingsManager.onSettingsChange(settings => {
if (settings.disableSpyro) {
unregisterIdAndPassAuth('spyro-auth')
}
})
} }
async function unregister () { async function unregister () {

View File

@ -16,7 +16,9 @@ import {
setAccessTokensToServers, setAccessTokensToServers,
uninstallPlugin, uninstallPlugin,
updateMyUser, updateMyUser,
wait wait,
userLogin,
updatePluginSettings
} from '../../../shared/extra-utils' } from '../../../shared/extra-utils'
import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers' import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers'
@ -258,6 +260,40 @@ describe('Test external auth plugins', function () {
await getMyUserInformation(server.url, kefkaAccessToken, 401) await getMyUserInformation(server.url, kefkaAccessToken, 401)
}) })
it('Should unregister external-auth-2 and do not login existing Kefka', async function () {
await updatePluginSettings({
url: server.url,
accessToken: server.accessToken,
npmName: 'peertube-plugin-test-external-auth-one',
settings: { disableKefka: true }
})
await userLogin(server, { username: 'kefka', password: 'fake' }, 400)
await loginExternal({
server,
npmName: 'test-external-auth-one',
authName: 'external-auth-2',
query: {
username: 'kefka'
},
username: 'kefka',
statusCodeExpected: 404
})
})
it('Should have disabled this auth', async function () {
const res = await getConfig(server.url)
const config: ServerConfig = res.body
const auths = config.plugin.registeredExternalAuths
expect(auths).to.have.lengthOf(2)
const auth1 = auths.find(a => a.authName === 'external-auth-2')
expect(auth1).to.not.exist
})
it('Should uninstall the plugin one and do not login Cyan', async function () { it('Should uninstall the plugin one and do not login Cyan', async function () {
await uninstallPlugin({ await uninstallPlugin({
url: server.url, url: server.url,

View File

@ -12,7 +12,7 @@ import {
updateMyUser, updateMyUser,
userLogin, userLogin,
wait, wait,
login, refreshToken, getConfig login, refreshToken, getConfig, updatePluginSettings
} from '../../../shared/extra-utils' } from '../../../shared/extra-utils'
import { User, UserRole, ServerConfig } from '@shared/models' import { User, UserRole, ServerConfig } from '@shared/models'
import { expect } from 'chai' import { expect } from 'chai'
@ -179,6 +179,30 @@ describe('Test id and pass auth plugins', function () {
await waitUntilLog(server, 'valid email') await waitUntilLog(server, 'valid email')
}) })
it('Should unregister spyro-auth and do not login existing Spyro', async function () {
await updatePluginSettings({
url: server.url,
accessToken: server.accessToken,
npmName: 'peertube-plugin-test-id-pass-auth-one',
settings: { disableSpyro: true }
})
await userLogin(server, { username: 'spyro', password: 'spyro password' }, 400)
await userLogin(server, { username: 'spyro', password: 'fake' }, 400)
})
it('Should have disabled this auth', async function () {
const res = await getConfig(server.url)
const config: ServerConfig = res.body
const auths = config.plugin.registeredIdAndPassAuths
expect(auths).to.have.lengthOf(7)
const spyroAuth = auths.find(a => a.authName === 'spyro-auth')
expect(spyroAuth).to.not.exist
})
it('Should uninstall the plugin one and do not login existing Crash', async function () { it('Should uninstall the plugin one and do not login existing Crash', async function () {
await uninstallPlugin({ await uninstallPlugin({
url: server.url, url: server.url,

View File

@ -49,6 +49,8 @@ export type RegisterServerOptions = {
registerIdAndPassAuth: (options: RegisterServerAuthPassOptions) => void registerIdAndPassAuth: (options: RegisterServerAuthPassOptions) => void
registerExternalAuth: (options: RegisterServerAuthExternalOptions) => RegisterServerAuthExternalResult registerExternalAuth: (options: RegisterServerAuthExternalOptions) => RegisterServerAuthExternalResult
unregisterIdAndPassAuth: (authName: string) => void
unregisterExternalAuth: (authName: string) => void
// Get plugin router to create custom routes // Get plugin router to create custom routes
// Base routes of this router are // Base routes of this router are