diff --git a/CHANGES b/CHANGES
index 25cfbb283..b5b08b176 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2121,4 +2121,5 @@
* Focal support
* Reduce duration of self-signed certs to 800 days
* Better backup config filename when downloading
+* branding: footer can have template variables like %YEAR% and %VERSION%
diff --git a/src/branding.js b/src/branding.js
new file mode 100644
index 000000000..02e630e77
--- /dev/null
+++ b/src/branding.js
@@ -0,0 +1,18 @@
+'use strict';
+
+exports = module.exports = {
+ renderFooter
+};
+
+const assert = require('assert'),
+ constants = require('./constants.js');
+
+function renderFooter(footer) {
+ assert.strictEqual(typeof footer, 'string');
+
+ const year = new Date().getFullYear();
+
+ return footer.replace(/%YEAR%/g, year)
+ .replace(/%VERSION%/g, constants.VERSION);
+}
+
diff --git a/src/cloudron.js b/src/cloudron.js
index 3836329e5..9513b5f69 100644
--- a/src/cloudron.js
+++ b/src/cloudron.js
@@ -29,6 +29,7 @@ var addons = require('./addons.js'),
auditSource = require('./auditsource.js'),
backups = require('./backups.js'),
BoxError = require('./boxerror.js'),
+ branding = require('./branding.js'),
constants = require('./constants.js'),
cron = require('./cron.js'),
debug = require('debug')('box:cloudron'),
@@ -175,7 +176,7 @@ function getConfig(callback) {
version: constants.VERSION,
isDemo: settings.isDemo(),
cloudronName: allSettings[settings.CLOUDRON_NAME_KEY],
- footer: allSettings[settings.FOOTER_KEY] || constants.FOOTER,
+ footer: branding.renderFooter(allSettings[settings.FOOTER_KEY] || constants.FOOTER),
features: appstore.getFeatures(),
profileLocked: allSettings[settings.DIRECTORY_CONFIG_KEY].lockUserProfiles,
mandatory2FA: allSettings[settings.DIRECTORY_CONFIG_KEY].mandatory2FA
diff --git a/src/constants.js b/src/constants.js
index 0758dcaaa..66bd6deeb 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -48,7 +48,7 @@ exports = module.exports = {
SUPPORT_EMAIL: 'support@cloudron.io',
- FOOTER: '© 2020 [Cloudron](https://cloudron.io) [Forum ](https://forum.cloudron.io)',
+ FOOTER: '© %YEAR% [Cloudron](https://cloudron.io) [Forum ](https://forum.cloudron.io)',
VERSION: process.env.BOX_ENV === 'cloudron' ? fs.readFileSync(path.join(__dirname, '../VERSION'), 'utf8').trim() : '5.1.1-test'
};
diff --git a/src/provision.js b/src/provision.js
index b4f6e449e..bb7f08693 100644
--- a/src/provision.js
+++ b/src/provision.js
@@ -11,6 +11,7 @@ var assert = require('assert'),
async = require('async'),
backups = require('./backups.js'),
BoxError = require('./boxerror.js'),
+ branding = require('./branding.js'),
constants = require('./constants.js'),
cloudron = require('./cloudron.js'),
debug = require('debug')('box:provision'),
@@ -233,7 +234,7 @@ function getStatus(callback) {
apiServerOrigin: settings.apiServerOrigin(), // used by CaaS tool
webServerOrigin: settings.webServerOrigin(), // used by CaaS tool
cloudronName: allSettings[settings.CLOUDRON_NAME_KEY],
- footer: allSettings[settings.FOOTER_KEY] || constants.FOOTER,
+ footer: branding.renderFooter(allSettings[settings.FOOTER_KEY] || constants.FOOTER),
adminFqdn: settings.adminDomain() ? settings.adminFqdn() : null,
activated: activated,
provider: settings.provider() // used by setup wizard of marketplace images