mirror of
https://gitdab.com/cadence/out-of-your-element.git
synced 2025-09-10 12:22:50 +02:00
85 lines
2.7 KiB
JavaScript
85 lines
2.7 KiB
JavaScript
// @ts-check
|
|
|
|
const fs = require("fs")
|
|
const crypto = require("crypto")
|
|
const assert = require("assert").strict
|
|
const path = require("path")
|
|
|
|
const registrationFilePath = path.join(process.cwd(), "registration.yaml")
|
|
|
|
/** @param {import("../types").AppServiceRegistrationConfig} reg */
|
|
function checkRegistration(reg) {
|
|
reg["ooye"].invite = reg.ooye.invite.filter(mxid => mxid.endsWith(`:${reg.ooye.server_name}`)) // one day I will understand why typescript disagrees with dot notation on this line
|
|
assert(reg.ooye?.max_file_size)
|
|
assert(reg.ooye?.namespace_prefix)
|
|
assert(reg.ooye?.server_name)
|
|
assert(reg.sender_localpart?.startsWith(reg.ooye.namespace_prefix), "appservice's localpart must be in the namespace it controls")
|
|
assert(reg.ooye?.server_origin.match(/^https?:\/\//), "server origin must start with http or https")
|
|
assert.notEqual(reg.ooye?.server_origin.slice(-1), "/", "server origin must not end in slash")
|
|
assert.match(reg.url, /^https?:/, "url must start with http:// or https://")
|
|
}
|
|
|
|
/* c8 ignore next 4 */
|
|
/** @param {import("../types").AppServiceRegistrationConfig} reg */
|
|
function writeRegistration(reg) {
|
|
fs.writeFileSync(registrationFilePath, JSON.stringify(reg, null, 2))
|
|
}
|
|
|
|
/**
|
|
* @param {string} serverName
|
|
* @returns {import("../types").InitialAppServiceRegistrationConfig} reg
|
|
*/
|
|
function getTemplateRegistration(serverName) {
|
|
const namespace_prefix = "_ooye_"
|
|
return {
|
|
id: "ooye",
|
|
as_token: crypto.randomBytes(32).toString("hex"),
|
|
hs_token: crypto.randomBytes(32).toString("hex"),
|
|
namespaces: {
|
|
users: [{
|
|
exclusive: true,
|
|
regex: `@${namespace_prefix}.*:${serverName}`
|
|
}],
|
|
aliases: [{
|
|
exclusive: true,
|
|
regex: `#${namespace_prefix}.*:${serverName}`
|
|
}]
|
|
},
|
|
protocols: [
|
|
"discord"
|
|
],
|
|
sender_localpart: `${namespace_prefix}bot`,
|
|
rate_limited: false,
|
|
socket: 6693,
|
|
ooye: {
|
|
namespace_prefix,
|
|
server_name: serverName,
|
|
max_file_size: 5000000,
|
|
content_length_workaround: false,
|
|
include_user_id_in_mxid: false,
|
|
invite: []
|
|
}
|
|
}
|
|
}
|
|
|
|
function readRegistration() {
|
|
/** @type {import("../types").AppServiceRegistrationConfig} */ // @ts-ignore
|
|
let result = null
|
|
try {
|
|
const content = fs.readFileSync(registrationFilePath, "utf8")
|
|
result = JSON.parse(content)
|
|
result.ooye.invite ||= []
|
|
/* c8 ignore next */
|
|
} catch (e) {}
|
|
return result
|
|
}
|
|
|
|
/** @type {import("../types").AppServiceRegistrationConfig} */ // @ts-ignore
|
|
let reg = readRegistration()
|
|
|
|
module.exports.registrationFilePath = registrationFilePath
|
|
module.exports.readRegistration = readRegistration
|
|
module.exports.getTemplateRegistration = getTemplateRegistration
|
|
module.exports.writeRegistration = writeRegistration
|
|
module.exports.checkRegistration = checkRegistration
|
|
module.exports.reg = reg
|