mostly because code is being autogenerated by all the AI stuff using this prefix. it's also used in the stack trace.
103 lines
3.1 KiB
JavaScript
103 lines
3.1 KiB
JavaScript
'use strict';
|
|
|
|
exports = module.exports = {
|
|
getCloudronName,
|
|
setCloudronName,
|
|
|
|
getCloudronAvatar,
|
|
setCloudronAvatar,
|
|
|
|
getCloudronBackground,
|
|
setCloudronBackground,
|
|
|
|
getFooter,
|
|
setFooter,
|
|
|
|
renderFooter
|
|
};
|
|
|
|
const apps = require('./apps.js'),
|
|
assert = require('node:assert'),
|
|
BoxError = require('./boxerror.js'),
|
|
constants = require('./constants.js'),
|
|
debug = require('debug')('box:branding'),
|
|
eventlog = require('./eventlog.js'),
|
|
paths = require('./paths.js'),
|
|
safe = require('safetydance'),
|
|
settings = require('./settings.js');
|
|
|
|
async function getCloudronName() {
|
|
const name = await settings.get(settings.CLOUDRON_NAME_KEY);
|
|
return name || 'Cloudron';
|
|
}
|
|
|
|
async function setCloudronName(name, auditSource) {
|
|
assert.strictEqual(typeof name, 'string');
|
|
assert(auditSource && typeof auditSource === 'object');
|
|
|
|
if (!name) throw new BoxError(BoxError.BAD_FIELD, 'name is empty');
|
|
|
|
// some arbitrary restrictions (for sake of ui layout)
|
|
// if this is changed, adjust dashboard/branding.html
|
|
if (name.length > 64) throw new BoxError(BoxError.BAD_FIELD, 'name cannot exceed 64 characters');
|
|
|
|
// mark apps using oidc addon to be reconfigured
|
|
const [, installedApps] = await safe(apps.list());
|
|
await safe(apps.configureApps(installedApps.filter((a) => !!a.manifest.addons?.oidc), { scheduleNow: true }, auditSource), { debug });
|
|
|
|
await settings.set(settings.CLOUDRON_NAME_KEY, name);
|
|
await eventlog.add(eventlog.ACTION_BRANDING_NAME, auditSource, { name });
|
|
}
|
|
|
|
async function getCloudronAvatar() {
|
|
let avatar = await settings.getBlob(settings.CLOUDRON_AVATAR_KEY);
|
|
if (avatar) return avatar;
|
|
|
|
avatar = safe.fs.readFileSync(paths.CLOUDRON_DEFAULT_AVATAR_FILE);
|
|
if (avatar) return avatar;
|
|
|
|
throw new BoxError(BoxError.FS_ERROR, `Could not read avatar: ${safe.error.message}`);
|
|
}
|
|
|
|
async function setCloudronAvatar(avatar, auditSource) {
|
|
assert(Buffer.isBuffer(avatar));
|
|
assert(auditSource && typeof auditSource === 'object');
|
|
|
|
await settings.setBlob(settings.CLOUDRON_AVATAR_KEY, avatar);
|
|
await eventlog.add(eventlog.ACTION_BRANDING_AVATAR, auditSource, {});
|
|
}
|
|
|
|
async function getCloudronBackground() {
|
|
const background = await settings.getBlob(settings.CLOUDRON_BACKGROUND_KEY);
|
|
if (!background) return null;
|
|
|
|
return background;
|
|
}
|
|
|
|
async function setCloudronBackground(background) {
|
|
assert(background === null || Buffer.isBuffer(background));
|
|
|
|
await settings.setBlob(settings.CLOUDRON_BACKGROUND_KEY, background);
|
|
}
|
|
|
|
async function renderFooter() {
|
|
const footer = await getFooter();
|
|
const year = new Date().getFullYear();
|
|
|
|
return footer.replace(/%YEAR%/g, year)
|
|
.replace(/%VERSION%/g, constants.VERSION);
|
|
}
|
|
|
|
async function getFooter() {
|
|
const value = await settings.get(settings.FOOTER_KEY);
|
|
return value || constants.FOOTER;
|
|
}
|
|
|
|
async function setFooter(footer, auditSource) {
|
|
assert.strictEqual(typeof footer, 'string');
|
|
assert(auditSource && typeof auditSource === 'object');
|
|
|
|
await settings.set(settings.FOOTER_KEY, footer);
|
|
await eventlog.add(eventlog.ACTION_BRANDING_FOOTER, auditSource, { footer });
|
|
}
|