diff options
fix: no blank next= infinite redirect, redir loop detections for missing scopes
| -rw-r--r-- | src/routes/login/callback/ok/+page.svelte | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/src/routes/login/callback/ok/+page.svelte b/src/routes/login/callback/ok/+page.svelte index a71d962..75fb10c 100644 --- a/src/routes/login/callback/ok/+page.svelte +++ b/src/routes/login/callback/ok/+page.svelte @@ -1,13 +1,66 @@ <script lang="ts"> import { page } from '$app/state'; + import { onDestroy, onMount } from 'svelte'; - let target = page.url.searchParams.get('next') ?? '/'; - if (new URL(target, page.url.href).host !== page.url.host) target = '/'; + let _target = $derived(page.url.searchParams.get('next') || '/'); + let target = $derived( + new URL(_target, page.url.href).host !== page.url.host ? '/' : _target + ); + let loopDetected = $state(false); + let mounted = $state(false); + onMount(() => { + try { + if ( + Number( + sessionStorage.getItem('lastLoginRedirect') ?? Date.now().toString() + ) + + 1000 > + Date.now() - 2500 + ) { + if (sessionStorage.getItem('loopCheck')) { + loopDetected = true; + } + setTimeout(() => sessionStorage.setItem('loopCheck', '1'), 100); + } else { + sessionStorage.removeItem('loopCheck'); + } + sessionStorage.setItem('lastLoginRedirect', Date.now().toString()); + } catch (error) { + console.warn('Loop Detect Error:', error); + } + mounted = true; + }); + onDestroy(() => (mounted = false)); </script> <svelte:head> - <meta http-equiv="refresh" content="0.1; url={target}" /> + {#if !loopDetected} + <noscript> + <meta http-equiv="refresh" content="0.1; url={target}" /> + </noscript> + {/if} + {#if mounted && !loopDetected} + <meta http-equiv="refresh" content="0.1; url={target}" /> + {/if} </svelte:head> -<h2 class="text-xl">Redirecting...</h2> -<p>If nothing happens, click <a href={target}>here</a>.</p> +{#if loopDetected} + <h2 class="text-xl">Loop Detected</h2> + <p> + We detected a possible redirect loop and as such did not automatically + continue. + </p> + <p> + To continue anyway, click <a + href={target} + onclick={() => { + loopDetected = false; + sessionStorage.setItem('lastLoginRedirect', Date.now().toString()); + sessionStorage.removeItem('loopCheck'); + }}>here</a + >. + </p> +{:else} + <h2 class="text-xl">Redirecting...</h2> + <p>If nothing happens, click <a href={target}>here</a>.</p> +{/if} |