From 3e721b6f366f763fdf4f8955e68843d33874b5a7 Mon Sep 17 00:00:00 2001 From: Greg Poole Date: Mon, 28 Nov 2022 16:37:37 +1100 Subject: [PATCH 1/2] Add failing test and fix for invalid URLs for publicIds including multiple dots (#22) --- packages/url/__tests__/url.test.ts | 4 ++++ packages/url/lib/url.ts | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/url/__tests__/url.test.ts b/packages/url/__tests__/url.test.ts index 7f51e4a..abaf37d 100644 --- a/packages/url/__tests__/url.test.ts +++ b/packages/url/__tests__/url.test.ts @@ -209,6 +209,10 @@ describe('Url', () => { it('should return as is', () => { expect(extractPublicId('example')).toEqual('example') }) + + it('should allow multiple dots in the filename before the extension', () => { + expect(extractPublicId('https://res.cloudinary.com/xyz/image/upload/v111111111/Folder/Name.With.Multiple.Dots.png')).toBe('Folder/Name.With.Multiple.Dots') + }) }) describe('getSubDomain', () => { diff --git a/packages/url/lib/url.ts b/packages/url/lib/url.ts index 6dbd0f3..cb56cad 100644 --- a/packages/url/lib/url.ts +++ b/packages/url/lib/url.ts @@ -6,14 +6,19 @@ import { toTransformationStr, transform } from './transformers' const SHARED_CDNS:string[] = ["cloudinary-a.akamaihd.net", "res.cloudinary.com"] //eslint-disable-next-line -const CLOUDINARY_REGEX = /^.+\.cloudinary\.com\/(?:[^\/]+\/)(?:(image|video|raw)\/)?(?:(upload|fetch|private|authenticated|sprite|facebook|twitter|youtube|vimeo)\/)?(?:(?:[^_/]+_[^,/]+,?)*\/)?(?:v(\d+|\w{1,2})\/)?([^\.^\s]+)(?:\.(.+))?$/ +const CLOUDINARY_REGEX = /^.+\.cloudinary\.com\/(?:[^\/]+\/)(?:(image|video|raw)\/)?(?:(upload|fetch|private|authenticated|sprite|facebook|twitter|youtube|vimeo)\/)?(?:(?:[^_/]+_[^,/]+,?)*\/)?(?:v(\d+|\w{1,2})\/)?(.+)$/ export const extractPublicId = (link: string):string => { if (!link) return '' const parts = CLOUDINARY_REGEX.exec(link) - return parts && parts.length > 2 ? parts[parts.length - 2] : link + if (!parts) { + return link + } + + // Strip extension if present + return parts[parts.length - 1].replace(/\.[^/.]+$/, "") } export const getSignature = (signature?: string) => { From 084f85d9c59efd5e8dae9df3ac8623f92d5c7cc1 Mon Sep 17 00:00:00 2001 From: Greg Poole Date: Wed, 22 Feb 2023 08:28:02 +1100 Subject: [PATCH 2/2] Add test to validate filenames with no extension are handled --- packages/url/__tests__/url.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/url/__tests__/url.test.ts b/packages/url/__tests__/url.test.ts index abaf37d..eac14de 100644 --- a/packages/url/__tests__/url.test.ts +++ b/packages/url/__tests__/url.test.ts @@ -210,6 +210,10 @@ describe('Url', () => { expect(extractPublicId('example')).toEqual('example') }) + it('should correctly handle filenames with no extension', () => { + expect(extractPublicId('https://res.cloudinary.com/xyz/image/upload/v111111111/Folder/noextension')).toBe('Folder/noextension') + }) + it('should allow multiple dots in the filename before the extension', () => { expect(extractPublicId('https://res.cloudinary.com/xyz/image/upload/v111111111/Folder/Name.With.Multiple.Dots.png')).toBe('Folder/Name.With.Multiple.Dots') })