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.