peertube-plugin-livechat/server/lib/prosody/fix-room-subject.ts
John Livingston d359d3ad99 Fix Prosody room topic:
Due to a bug in mod_muc_http_defaults (https://hg.prosody.im/prosody-modules/rev/6d99ddd99694),
room topics were badly configured. The plugin will fix them at startup, and stops trying to set the subject.
2023-04-14 11:33:41 +02:00

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, '')
}