allow system variables in footer, loginfooter, welcometext, title2 #6634
Signed-off-by: si458 <simonsmith5521@gmail.com>
si458 committed
May 26, 2025 at 14:03 UTC
89238303cba5d9474eb60a3f6f737d3c79e17d3a
3 files changed
+66
-4
common.js
+16
@@ -419,4 +419,20 @@ module.exports.uniqueArray = function (a) {
419
}
420
}
421
return out;
422
+}
423
+
424
+// Replace placeholders in a string with values from an object or a function
425
+module.exports.replacePlaceholders = function (template, values) {
426
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
427
+ console.log('match', match, 'key', key, 'values', values);
428
+ if (typeof values === 'function') {
429
+ return values(key);
430
+ }
431
+ else if (values && typeof values === 'object') {
432
+ return values[key] !== undefined ? values[key] : match;
433
+ }
434
+ else {
435
+ return values !== undefined ? values : match;
436
+ }
437
+ });
438
}
\ No newline at end of file
meshscanner.js
+13
-1
@@ -162,7 +162,19 @@ module.exports.CreateMeshScanner = function (parent) {
162
try {
163
if ((typeof obj.parent.config.domains[''].title == 'string') && (obj.parent.config.domains[''].title.length > 0)) {
164
name = obj.parent.config.domains[''].title; info = '';
165
- try { if ((typeof obj.parent.config.domains[''].title2 == 'string') && (obj.parent.config.domains[''].title2.length > 0)) { info = obj.parent.config.domains[''].title2; } } catch (ex) { }
165
+ try {
166
+ if ((typeof obj.parent.config.domains[''].title2 == 'string') && (obj.parent.config.domains[''].title2.length > 0)) {
167
+ info = obj.common.replacePlaceholders(obj.parent.config.domains[''].title2, {
168
+ 'serverversion': obj.parent.currentVer,
169
+ 'servername': obj.getWebServerName(domain, req),
170
+ 'agentsessions': Object.keys(parent.webserver.wsagents).length,
171
+ 'connectedusers': Object.keys(parent.webserver.wssessions).length,
172
+ 'userssessions': Object.keys(parent.webserver.wssessions2).length,
173
+ 'relaysessions': parent.webserver.relaySessionCount,
174
+ 'relaycount': Object.keys(parent.webserver.wsrelays).length
175
+ });
176
+ }
177
+ } catch (ex) { }
178
}
179
} catch (ex) { }
180
try {
webserver.js
+37
-3
@@ -3217,7 +3217,15 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
3217
passRequirements: passRequirements,
3218
customui: customui,
3219
webcerthash: Buffer.from(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'),
3220
- footer: (domain.footer == null) ? '' : domain.footer,
3220
+ footer: (domain.footer == null) ? '' : obj.common.replacePlaceholders(domain.footer, {
3221
+ 'serverversion': obj.parent.currentVer,
3222
+ 'servername': obj.getWebServerName(domain, req),
3223
+ 'agentsessions': Object.keys(parent.webserver.wsagents).length,
3224
+ 'connectedusers': Object.keys(parent.webserver.wssessions).length,
3225
+ 'userssessions': Object.keys(parent.webserver.wssessions2).length,
3226
+ 'relaysessions': parent.webserver.relaySessionCount,
3227
+ 'relaycount': Object.keys(parent.webserver.wsrelays).length
3228
+ }),
3229
webstate: encodeURIComponent(webstate).replace(/'/g, '%27'),
3230
amtscanoptions: amtscanoptions,
3231
pluginHandler: (parent.pluginHandler == null) ? 'null' : parent.pluginHandler.prepExports(),
@@ -3462,12 +3470,29 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
3470
sessiontime: (args.sessiontime) ? args.sessiontime : 60, // Session time in minutes, 60 minutes is the default
3471
passRequirements: passRequirements,
3472
customui: customui,
3465
- footer: (domain.loginfooter == null) ? '' : domain.loginfooter,
3473
+ footer: (domain.loginfooter == null) ? '' : obj.common.replacePlaceholders(domain.loginfooter, {
3474
+ 'serverversion': obj.parent.currentVer,
3475
+ 'servername': obj.getWebServerName(domain, req),
3476
+ 'agentsessions': Object.keys(parent.webserver.wsagents).length,
3477
+ 'connectedusers': Object.keys(parent.webserver.wssessions).length,
3478
+ 'userssessions': Object.keys(parent.webserver.wssessions2).length,
3479
+ 'relaysessions': parent.webserver.relaySessionCount,
3480
+ 'relaycount': Object.keys(parent.webserver.wsrelays).length
3481
+ }),
3482
hkey: encodeURIComponent(hardwareKeyChallenge).replace(/'/g, '%27'),
3483
messageid: msgid,
3484
flashErrors: JSON.stringify(flashErrors),
3485
passhint: passhint,
3470
- welcometext: domain.welcometext ? encodeURIComponent(domain.welcometext).split('\'').join('\\\'') : null,
3486
+
3487
+ welcometext: domain.welcometext ? encodeURIComponent(obj.common.replacePlaceholders(domain.welcometext, {
3488
+ 'serverversion': obj.parent.currentVer,
3489
+ 'servername': obj.getWebServerName(domain, req),
3490
+ 'agentsessions': Object.keys(parent.webserver.wsagents).length,
3491
+ 'connectedusers': Object.keys(parent.webserver.wssessions).length,
3492
+ 'userssessions': Object.keys(parent.webserver.wssessions2).length,
3493
+ 'relaysessions': parent.webserver.relaySessionCount,
3494
+ 'relaycount': Object.keys(parent.webserver.wsrelays).length
3495
+ })).split('\'').join('\\\'') : null,
3496
welcomePictureFullScreen: ((typeof domain.welcomepicturefullscreen == 'boolean') ? domain.welcomepicturefullscreen : false),
3497
hwstate: hwstate,
3498
otpemail: otpemail,
@@ -9360,6 +9385,15 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
9385
xargs.title1 = domain.title1 ? domain.title1 : '';
9386
xargs.title2 = (domain.title1 && domain.title2) ? domain.title2 : '';
9387
}
9388
+ xargs.title2 = obj.common.replacePlaceholders(xargs.title2, {
9389
+ 'serverversion': obj.parent.currentVer,
9390
+ 'servername': obj.getWebServerName(domain, req),
9391
+ 'agentsessions': Object.keys(parent.webserver.wsagents).length,
9392
+ 'connectedusers': Object.keys(parent.webserver.wssessions).length,
9393
+ 'userssessions': Object.keys(parent.webserver.wssessions2).length,
9394
+ 'relaysessions': parent.webserver.relaySessionCount,
9395
+ 'relaycount': Object.keys(parent.webserver.wsrelays).length
9396
+ });
9397
xargs.extitle = encodeURIComponent(xargs.title).split('\'').join('\\\'');
9398
xargs.domainurl = domain.url;
9399
xargs.autocomplete = (domain.autocomplete === false) ? 'autocomplete=off x' : 'autocomplete'; // This option allows autocomplete to be turned off on the login page.