mostly because code is being autogenerated by all the AI stuff using this prefix. it's also used in the stack trace.
54 lines
2.5 KiB
JavaScript
54 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
exports = module.exports = {
|
|
get
|
|
};
|
|
|
|
const assert = require('node:assert'),
|
|
BoxError = require('./boxerror.js'),
|
|
dashboard = require('./dashboard.js'),
|
|
domains = require('./domains.js'),
|
|
ejs = require('ejs'),
|
|
fs = require('node:fs'),
|
|
mail = require('./mail.js'),
|
|
mailServer = require('./mailserver.js'),
|
|
safe = require('safetydance'),
|
|
superagent = require('@cloudron/superagent');
|
|
|
|
const MAIL_AUTOCONFIG_EJS = fs.readFileSync(__dirname + '/autoconfig.xml.ejs', { encoding: 'utf8' });
|
|
|
|
async function get(domain, location) {
|
|
assert.strictEqual(typeof domain, 'string');
|
|
assert.strictEqual(typeof location, 'string');
|
|
|
|
if (location === 'autoconfig/mail/config-v1.1.xml') { // this also gets a ?emailaddress
|
|
const mailDomain = await mail.getDomain(domain);
|
|
if (!mailDomain) throw new BoxError(BoxError.NOT_FOUND, 'Domain not found');
|
|
if (!mailDomain.enabled) throw new BoxError(BoxError.NOT_FOUND, 'Email not enabled');
|
|
const { fqdn } = await mailServer.getLocation();
|
|
|
|
const autoconfig = ejs.render(MAIL_AUTOCONFIG_EJS, { domain, fqdn });
|
|
|
|
return { type: 'text/xml', body: autoconfig };
|
|
} else if (location === 'host-meta' || location === 'matrix/server' || location === 'matrix/client') {
|
|
const type = location === 'host-meta' ? 'text/xml' : 'application/json';
|
|
|
|
const domainObject = await domains.get(domain);
|
|
if (!domainObject) throw new BoxError(BoxError.NOT_FOUND, 'Domain not found');
|
|
if (!domainObject.wellKnown || !(location in domainObject.wellKnown)) throw new BoxError(BoxError.NOT_FOUND, 'No custom well-known config');
|
|
|
|
return { type, body: domainObject.wellKnown[location] };
|
|
} else if (location === 'openid-configuration') {
|
|
const { fqdn:dashboardFqdn } = await dashboard.getLocation();
|
|
if (domain !== dashboardFqdn) throw new BoxError(BoxError.NOT_FOUND, 'No custom well-known config');
|
|
// the oidc-provider module does not expose this in javascript but only via a route handler
|
|
// we have to use the external route even
|
|
const [error, result] = await safe(superagent.get(`https://${dashboardFqdn}/openid/.well-known/openid-configuration`));
|
|
if (error) return new BoxError(BoxError.INTERNAL_ERROR, 'unable to connect to internal OpenID routes');
|
|
|
|
return { type: 'application/json', body: result.body };
|
|
} else {
|
|
throw new BoxError(BoxError.NOT_FOUND, 'No custom well-known config');
|
|
}
|
|
}
|