From ae775c4dcf27dcd23901b395c6821d5b8de7e4cb Mon Sep 17 00:00:00 2001 From: Kroonk Date: Thu, 21 May 2026 23:55:18 +0200 Subject: [PATCH] feat: share SSO session with admin panel --- admin.html | 2 +- admin.js | 8 +++++++- app.js | 6 ++++++ auth.js | 3 ++- favorites.html | 2 +- index.html | 5 +++-- sw.js | 6 +++--- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/admin.html b/admin.html index 215191b..ab22480 100644 --- a/admin.html +++ b/admin.html @@ -241,6 +241,6 @@ - + diff --git a/admin.js b/admin.js index 9cb63ba..a12ce6a 100644 --- a/admin.js +++ b/admin.js @@ -5,6 +5,7 @@ const SCOPES = 'openid profile email'; const CONFIG_URL = '/services.json?v=1'; const LOCAL_CONFIG_KEY = 'mischlabs.dashboard.config'; const TOKEN_KEY = 'mischlabs.admin.tokens'; +const DASHBOARD_TOKEN_KEY = 'mischlabs.dashboard.tokens'; const PKCE_KEY = 'mischlabs.admin.pkce'; const loginButton = document.querySelector('#loginButton'); @@ -69,7 +70,7 @@ function decodeJwt(token) { function getStoredTokens() { try { - const raw = sessionStorage.getItem(TOKEN_KEY); + const raw = sessionStorage.getItem(TOKEN_KEY) || sessionStorage.getItem(DASHBOARD_TOKEN_KEY); return raw ? JSON.parse(raw) : null; } catch { return null; @@ -78,10 +79,12 @@ function getStoredTokens() { function storeTokens(tokens) { sessionStorage.setItem(TOKEN_KEY, JSON.stringify(tokens)); + sessionStorage.setItem(DASHBOARD_TOKEN_KEY, JSON.stringify(tokens)); } function clearTokens() { sessionStorage.removeItem(TOKEN_KEY); + sessionStorage.removeItem(DASHBOARD_TOKEN_KEY); sessionStorage.removeItem(PKCE_KEY); } @@ -1185,6 +1188,9 @@ function closeNavDrawer() { async function boot() { await handleCallback(); tokenSet = getStoredTokens(); + if (isTokenValid(tokenSet)) { + storeTokens(tokenSet); + } if (!isTokenValid(tokenSet)) { loginPanel.hidden = false; diff --git a/app.js b/app.js index 4057002..4027a29 100644 --- a/app.js +++ b/app.js @@ -33,6 +33,7 @@ const favoritesSections = document.querySelector('#favoritesSections'); const loginButton = document.querySelector('#dashboardLoginButton'); const logoutButton = document.querySelector('#dashboardLogoutButton'); const favoritesLink = document.querySelector('#favoritesLink'); +const adminPanelLink = document.querySelector('#adminPanelLink'); const userBadge = document.querySelector('#dashboardUserBadge'); function normalize(value) { @@ -492,9 +493,14 @@ searchInput.addEventListener('input', updateVisibility); function updateAuthNav() { const authenticated = MischLabsAuth.isAuthenticated(); + const claims = MischLabsAuth.claims(); + const username = String(claims?.preferred_username || '').toLowerCase(); + const email = String(claims?.email || '').toLowerCase(); + const isAdmin = authenticated && (username === 'mrdiderot' || email === 'mail.misch@pm.me'); if (loginButton) loginButton.hidden = authenticated; if (logoutButton) logoutButton.hidden = !authenticated; if (favoritesLink) favoritesLink.hidden = !authenticated; + if (adminPanelLink) adminPanelLink.hidden = !isAdmin; if (userBadge) { userBadge.hidden = !authenticated; userBadge.textContent = authenticated ? MischLabsAuth.displayName() : ''; diff --git a/auth.js b/auth.js index 6e1a349..3e949cc 100644 --- a/auth.js +++ b/auth.js @@ -195,6 +195,7 @@ const MischLabsAuth = (() => { handleCallback, isAuthenticated, login, - logout + logout, + tokens }; })(); diff --git a/favorites.html b/favorites.html index 9e23388..ba61185 100644 --- a/favorites.html +++ b/favorites.html @@ -67,7 +67,7 @@ - + diff --git a/index.html b/index.html index aa09eeb..f10c740 100644 --- a/index.html +++ b/index.html @@ -45,6 +45,7 @@