57 lines
2.6 KiB
TypeScript
57 lines
2.6 KiB
TypeScript
|
import type { RegisterServerOptions } from '@peertube/peertube-types'
|
||
|
import { ProsodyFilePaths } from './config/paths'
|
||
|
import * as path from 'path'
|
||
|
import * as fs from 'fs'
|
||
|
|
||
|
/**
|
||
|
* Until plugin verstion 6.2.3, there where a bug in mod_muc_http_defaults
|
||
|
* that messed up room metadata. This bug is blocking for external XMPP account
|
||
|
* connections.
|
||
|
* This functions corrects room metadata if needed.
|
||
|
* @param options
|
||
|
* @param filePaths
|
||
|
*/
|
||
|
export async function fixRoomSubject (options: RegisterServerOptions, filePaths: ProsodyFilePaths): Promise<void> {
|
||
|
const logger = options.peertubeHelpers.logger
|
||
|
// When this scripts run the first time, it create a file, so that we can know if we need to run it again:
|
||
|
const doneFilePath = path.resolve(filePaths.dir, 'fix-room-done')
|
||
|
if (fs.existsSync(doneFilePath)) {
|
||
|
logger.debug('fixRoomSubject already runned.')
|
||
|
return
|
||
|
}
|
||
|
|
||
|
logger.info('Fixing Prosody room subjects...')
|
||
|
|
||
|
// Room data are in a folder named something like "room%2evideos%2edomain%2etld".
|
||
|
// There should only be one. But if you renamed your instance, it could be more than one.
|
||
|
// Just in case, we will loop on each folder with name beginning with "room%2e".
|
||
|
const folders = fs.readdirSync(filePaths.data, { withFileTypes: true }).filter(file => {
|
||
|
return file.isDirectory() && file.name.startsWith('room%2e')
|
||
|
})
|
||
|
folders.forEach(folder => {
|
||
|
// the folder must contain a «config» directory
|
||
|
const configDir = path.resolve(filePaths.data, folder.name, 'config')
|
||
|
if (!fs.existsSync(configDir)) { return }
|
||
|
const roomDataFiles = fs.readdirSync(configDir, { withFileTypes: true }).filter(file => {
|
||
|
return file.isFile() && file.name.endsWith('.dat')
|
||
|
})
|
||
|
roomDataFiles.forEach(file => {
|
||
|
logger.debug('Checking room ' + file.name + ' subject')
|
||
|
const filepath = path.resolve(configDir, file.name)
|
||
|
let content = fs.readFileSync(filepath).toString()
|
||
|
// To detect wrongly configured files, we just check if there is a "subject_from" and no "subject" key.
|
||
|
// Indeed, the bug was that mod_muc_http_defaults set subject_from (which should be a jid) to the subject, and
|
||
|
// did not set any subject.
|
||
|
// See https://hg.prosody.im/prosody-modules/rev/6d99ddd99694
|
||
|
if (content.includes('["subject_from"]') && !content.includes('["subject"]')) {
|
||
|
logger.info('We must fix room ' + file.name + ' by removing subject_from')
|
||
|
content = content.replace(/^\s*\["subject_from"\]\s*=.*;\s*$/gm, '')
|
||
|
content = content.replace(/^\s*\["subject_time"\]\s*=.*;\s*$/gm, '')
|
||
|
fs.writeFileSync(filepath, content)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
fs.writeFileSync(doneFilePath, '')
|
||
|
}
|