From 212c03ceff15250dfee975fbbf205a056a9da539 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Tue, 27 Jan 2026 09:29:51 -0600 Subject: [PATCH] fix(web): properly encode shared link slug (#25564) --- .../lib/services/shared-link.service.spec.ts | 21 +++++++++++++++++++ web/src/lib/services/shared-link.service.ts | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 web/src/lib/services/shared-link.service.spec.ts diff --git a/web/src/lib/services/shared-link.service.spec.ts b/web/src/lib/services/shared-link.service.spec.ts new file mode 100644 index 0000000000..891bdd7672 --- /dev/null +++ b/web/src/lib/services/shared-link.service.spec.ts @@ -0,0 +1,21 @@ +import { asUrl } from '$lib/services/shared-link.service'; +import type { ServerConfigDto } from '@immich/sdk'; +import { sharedLinkFactory } from '@test-data/factories/shared-link-factory'; + +describe('SharedLinkService', () => { + beforeAll(() => { + vi.mock(import('$lib/managers/server-config-manager.svelte'), () => ({ + serverConfigManager: { + value: { externalDomain: 'http://localhost:2283' } as ServerConfigDto, + init: vi.fn(), + loadServerConfig: vi.fn(), + }, + })); + }); + + describe('asUrl', () => { + it('should properly encode characters in slug', () => { + expect(asUrl(sharedLinkFactory.build({ slug: 'foo/bar' }))).toBe('http://localhost:2283/s/foo%2Fbar'); + }); + }); +}); diff --git a/web/src/lib/services/shared-link.service.ts b/web/src/lib/services/shared-link.service.ts index 9afaf5ce1b..fc4bbe11c0 100644 --- a/web/src/lib/services/shared-link.service.ts +++ b/web/src/lib/services/shared-link.service.ts @@ -60,8 +60,10 @@ export const getSharedLinkActions = ($t: MessageFormatter, sharedLink: SharedLin return { Edit, Delete, Copy, ViewQrCode }; }; -const asUrl = (sharedLink: SharedLinkResponseDto) => { - const path = sharedLink.slug ? `s/${sharedLink.slug}` : `share/${sharedLink.key}`; +export const asUrl = (sharedLink: SharedLinkResponseDto) => { + const path = sharedLink.slug + ? `s/${encodeURIComponent(sharedLink.slug)}` + : `share/${encodeURIComponent(sharedLink.key)}`; return new URL(path, serverConfigManager.value.externalDomain || globalThis.location.origin).href; };