fix: only render admin panel link for admins
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s

This commit is contained in:
Kroonk
2026-05-22 00:04:56 +02:00
parent df0a5d5035
commit 1cdd944aca
3 changed files with 32 additions and 9 deletions

34
app.js
View File

@@ -33,10 +33,10 @@ const favoritesSections = document.querySelector('#favoritesSections');
const loginButton = document.querySelector('#dashboardLoginButton'); const loginButton = document.querySelector('#dashboardLoginButton');
const logoutButton = document.querySelector('#dashboardLogoutButton'); const logoutButton = document.querySelector('#dashboardLogoutButton');
const favoritesLink = document.querySelector('#favoritesLink'); const favoritesLink = document.querySelector('#favoritesLink');
const adminPanelLink = document.querySelector('#adminPanelLink');
const userBadge = document.querySelector('#dashboardUserBadge'); const userBadge = document.querySelector('#dashboardUserBadge');
const dashboardMenuButton = document.querySelector('#dashboardMenuButton'); const dashboardMenuButton = document.querySelector('#dashboardMenuButton');
const dashboardMenuPanel = document.querySelector('#dashboardMenuPanel'); const dashboardMenuPanel = document.querySelector('#dashboardMenuPanel');
let adminPanelLink = null;
function normalize(value) { function normalize(value) {
return String(value || '').toLowerCase().trim(); return String(value || '').toLowerCase().trim();
@@ -510,16 +510,40 @@ function toggleDashboardMenu() {
dashboardMenuPanel.hidden = isOpen; dashboardMenuPanel.hidden = isOpen;
} }
function hasAdminAccess(claims) {
const username = String(claims?.preferred_username || '').toLowerCase();
const email = String(claims?.email || '').toLowerCase();
return username === 'mrdiderot' || email === 'mail.misch@pm.me';
}
function ensureAdminPanelLink() {
if (adminPanelLink || !dashboardMenuPanel) return adminPanelLink;
adminPanelLink = document.createElement('a');
adminPanelLink.className = 'dashboard-menu-item';
adminPanelLink.id = 'adminPanelLink';
adminPanelLink.href = '/admin.html';
adminPanelLink.textContent = 'Admin Panel';
adminPanelLink.hidden = true;
dashboardMenuPanel.insertBefore(adminPanelLink, favoritesLink || loginButton || null);
return adminPanelLink;
}
function updateAuthNav() { function updateAuthNav() {
const authenticated = MischLabsAuth.isAuthenticated(); const authenticated = MischLabsAuth.isAuthenticated();
const claims = MischLabsAuth.claims(); const claims = MischLabsAuth.claims();
const username = String(claims?.preferred_username || '').toLowerCase(); const isAdmin = authenticated && hasAdminAccess(claims);
const email = String(claims?.email || '').toLowerCase();
const isAdmin = authenticated && (username === 'mrdiderot' || email === 'mail.misch@pm.me');
if (loginButton) loginButton.hidden = authenticated; if (loginButton) loginButton.hidden = authenticated;
if (logoutButton) logoutButton.hidden = !authenticated; if (logoutButton) logoutButton.hidden = !authenticated;
if (favoritesLink) favoritesLink.hidden = !authenticated; if (favoritesLink) favoritesLink.hidden = !authenticated;
if (adminPanelLink) adminPanelLink.hidden = !isAdmin; if (isAdmin) {
const link = ensureAdminPanelLink();
if (link) link.hidden = false;
} else if (adminPanelLink) {
adminPanelLink.remove();
adminPanelLink = null;
}
if (userBadge) { if (userBadge) {
userBadge.hidden = !authenticated; userBadge.hidden = !authenticated;
userBadge.textContent = authenticated ? MischLabsAuth.displayName() : ''; userBadge.textContent = authenticated ? MischLabsAuth.displayName() : '';

View File

@@ -51,7 +51,6 @@
</button> </button>
<nav class="dashboard-menu-panel" id="dashboardMenuPanel" aria-label="Dashboard Aktionen" hidden> <nav class="dashboard-menu-panel" id="dashboardMenuPanel" aria-label="Dashboard Aktionen" hidden>
<span class="dashboard-menu-user" id="dashboardUserBadge" hidden></span> <span class="dashboard-menu-user" id="dashboardUserBadge" hidden></span>
<a class="dashboard-menu-item" id="adminPanelLink" href="/admin.html" hidden>Admin Panel</a>
<a class="dashboard-menu-item" id="favoritesLink" href="/favorites.html" hidden>Favoriten verwalten</a> <a class="dashboard-menu-item" id="favoritesLink" href="/favorites.html" hidden>Favoriten verwalten</a>
<button class="dashboard-menu-item" id="dashboardLoginButton" type="button">SSO Login</button> <button class="dashboard-menu-item" id="dashboardLoginButton" type="button">SSO Login</button>
<button class="dashboard-menu-item is-danger" id="dashboardLogoutButton" type="button" hidden>Abmelden</button> <button class="dashboard-menu-item is-danger" id="dashboardLogoutButton" type="button" hidden>Abmelden</button>
@@ -142,6 +141,6 @@
</div> </div>
<script src="/auth.js?v=2" defer></script> <script src="/auth.js?v=2" defer></script>
<script src="/app.js?v=36" defer></script> <script src="/app.js?v=37" defer></script>
</body> </body>
</html> </html>

4
sw.js
View File

@@ -1,4 +1,4 @@
const CACHE_NAME = 'mischlabs-pwa-v20'; const CACHE_NAME = 'mischlabs-pwa-v21';
const APP_SHELL = [ const APP_SHELL = [
'/', '/',
'/index.html', '/index.html',
@@ -6,7 +6,7 @@ const APP_SHELL = [
'/offline.html', '/offline.html',
'/style.css?v=30', '/style.css?v=30',
'/auth.js?v=2', '/auth.js?v=2',
'/app.js?v=36', '/app.js?v=37',
'/favorites.js?v=1', '/favorites.js?v=1',
'/services.json?v=1', '/services.json?v=1',
'/manifest.webmanifest?v=4', '/manifest.webmanifest?v=4',