Possibility to configure an OpenID Connect provider on the instance level WIP (#128)

Pruning external users periodically.
This commit is contained in:
John Livingston
2024-04-18 20:16:44 +02:00
parent a9a0925ac0
commit ce2d8ed123
4 changed files with 113 additions and 3 deletions

View File

@ -5,7 +5,9 @@ import { ExternalAuthenticationError } from './error'
import { getBaseRouterRoute } from '../helpers'
import { canonicalizePluginUri } from '../uri/canonicalize'
import { getProsodyDomain } from '../prosody/config/domain'
import { pruneUsers } from '../prosody/api/manage-users'
import { getProsodyFilePaths } from '../prosody/config'
import { debugNumericParameter } from '../debug'
import { createCipheriv, createDecipheriv, randomBytes, Encoding } from 'node:crypto'
import { Issuer, BaseClient, generators, UnknownObject } from 'openid-client'
import { JID } from '@xmpp/jid'
@ -80,6 +82,7 @@ class ExternalAuthOIDC {
private readonly externalVirtualhost: string
private readonly avatarsDir: string
private readonly avatarsFiles: string[]
private pruneTimer?: NodeJS.Timer
private readonly encryptionOptions = {
algorithm: 'aes256' as string,
@ -619,11 +622,45 @@ class ExternalAuthOIDC {
}
}
/**
* Starts an interval timer to prune external users from Prosody.
* @param options Peertube server options.
*/
public startPruneTimer (options: RegisterServerOptions): void {
this.stopPruneTimer() // just in case...
// every 4 hour (every minutes in debug mode)
const pruneInterval = debugNumericParameter(options, 'externalAccountPruneInterval', 60 * 1000, 4 * 60 * 60 * 1000)
this.logger.info(`Creating a timer for external account pruning, every ${Math.round(pruneInterval / 1000)}s.`)
// eslint-disable-next-line @typescript-eslint/no-misused-promises
this.pruneTimer = setInterval(async () => {
try {
if (!await this.isOk()) { return }
this.logger.info('Pruning external users...')
await pruneUsers(options)
} catch (err) {
this.logger.error('Error while pruning external users: ' + (err as string))
}
}, pruneInterval)
}
/**
* Stops the prune timer.
*/
public stopPruneTimer (): void {
if (!this.pruneTimer) { return }
clearInterval(this.pruneTimer)
this.pruneTimer = undefined
}
/**
* frees the singleton
*/
public static async destroySingleton (): Promise<void> {
if (!singleton) { return }
singleton.stopPruneTimer()
singleton = undefined
}
@ -663,6 +700,8 @@ class ExternalAuthOIDC {
avatarsFiles: prosodyFilePaths.avatarsFiles
})
singleton.startPruneTimer(options)
return singleton
}