104 lines
3.2 KiB
JavaScript
104 lines
3.2 KiB
JavaScript
'use strict';
|
|
|
|
exports = module.exports = {
|
|
getCloudronName,
|
|
setCloudronName,
|
|
|
|
getCloudronAvatar,
|
|
setCloudronAvatar,
|
|
|
|
getCloudronBackground,
|
|
setCloudronBackground,
|
|
|
|
getFooter,
|
|
setFooter,
|
|
|
|
renderFooter
|
|
};
|
|
|
|
const apps = require('./apps.js'),
|
|
assert = require('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;
|
|
|
|
// try default fallback
|
|
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 });
|
|
}
|