diff --git a/ts/test-node/util/signalRoutes_test.ts b/ts/test-node/util/signalRoutes_test.ts index b87d3e25fe..52b028b6b9 100644 --- a/ts/test-node/util/signalRoutes_test.ts +++ b/ts/test-node/util/signalRoutes_test.ts @@ -119,6 +119,17 @@ describe('signalRoutes', () => { check(`signalcaptcha://${captchaId}`, result); }); + it('captcha with a trailing slash', () => { + const captchaId = + 'signal-hcaptcha.Foo-bAr_baz.challenge.fOo-bAR_baZ.fOO-BaR_baz'; + const result: ParsedSignalRoute = { + key: 'captcha', + args: { captchaId }, + }; + const check = createCheck({ hasWebUrl: false }); + check(`signalcaptcha://${captchaId}/`, result); + }); + it('linkCall', () => { const result: ParsedSignalRoute = { key: 'linkCall', diff --git a/ts/util/signalRoutes.ts b/ts/util/signalRoutes.ts index 11d25e49dc..72715b1d21 100644 --- a/ts/util/signalRoutes.ts +++ b/ts/util/signalRoutes.ts @@ -347,7 +347,7 @@ export const linkDeviceRoute = _route('linkDevice', { */ export const captchaRoute = _route('captcha', { // needs `(.+)` to capture `.` in hostname - patterns: [_pattern('signalcaptcha:', ':captchaId(.+)', '', {})], + patterns: [_pattern('signalcaptcha:', ':captchaId(.+)', '{/}?', {})], schema: z.object({ captchaId: paramSchema, // opaque }),