fix: disallow cross origin/non http protocols for continueUrl on login (#28706)

* fix: disallow cross origin/non http protocols for continueUrl on login

* chore: use Route helper

* fix: also use Route.continue in pin code prompt

* fix: typecheck
pull/28751/head
Brandon Wees 2026-06-01 12:38:26 -05:00 committed by GitHub
parent 69b1946484
commit 4eb100327e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 12 additions and 2 deletions

View File

@ -152,4 +152,13 @@ export const Route = {
// queues // queues
queues: () => '/admin/queues', queues: () => '/admin/queues',
viewQueue: ({ name }: { name: QueueName }) => `/admin/queues/${asQueueSlug(name)}`, viewQueue: ({ name }: { name: QueueName }) => `/admin/queues/${asQueueSlug(name)}`,
// continue helper for ensuring same-origin URLs
continue: (url: string | null, fallback: string) => {
if (!url || !url.startsWith('/') || url.startsWith('//')) {
return fallback;
}
return url;
},
}; };

View File

@ -8,7 +8,8 @@ import type { PageLoad } from './$types';
export const load = (async ({ parent, url }) => { export const load = (async ({ parent, url }) => {
await parent(); await parent();
const continueUrl = url.searchParams.get('continue') || Route.photos(); const continueUrl = Route.continue(url.searchParams.get('continue'), Route.photos());
if (authManager.authenticated) { if (authManager.authenticated) {
redirect(307, continueUrl); redirect(307, continueUrl);
} }

View File

@ -30,7 +30,7 @@
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000));
await goto(data.continueUrl); await goto(Route.continue(data.continueUrl, Route.photos()));
} catch (error) { } catch (error) {
handleError(error, $t('wrong_pin_code')); handleError(error, $t('wrong_pin_code'));
isBadPinCode = true; isBadPinCode = true;