diff --git a/containers/libreportal/frontend/components/apps/core/js/apps-manager.js b/containers/libreportal/frontend/components/apps/core/js/apps-manager.js index e381e23..b5a0ca1 100755 --- a/containers/libreportal/frontend/components/apps/core/js/apps-manager.js +++ b/containers/libreportal/frontend/components/apps/core/js/apps-manager.js @@ -967,7 +967,11 @@ class AppsManager { // app's CFG prefix. Without the anchor, loose suffix matches pull in // notification-channel / upstream creds that aren't logins at all // (e.g. CFG_GLUETUN_OPENVPN_PASSWORD). - const loginKey = (kind) => new RegExp(`^CFG_${upper}_(ADMIN_)?(${kind})$`); + // The optional _ tail matches slot-numbered keys. Generated credentials + // carry a slot (CFG_MATRIX_ADMIN_PASSWORD_1) while hand-set ones usually do + // not, and an anchor that allowed neither made every app with a generated + // admin password report "(not generated)" on its own card. + const loginKey = (kind) => new RegExp(`^CFG_${upper}_(ADMIN_)?(${kind})(_\\d+)?$`); const emailKeys = Object.keys(cfg).filter(k => loginKey('EMAIL').test(k)); const userKeys = Object.keys(cfg).filter(k => loginKey('USER(NAME)?').test(k)); const passKeys = Object.keys(cfg).filter(k => loginKey('PASSWORD').test(k));