diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.test.ts index 74db1b5a71..5c3cfe2ff2 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.test.ts @@ -651,5 +651,13 @@ describe('AwsCodeCommitUrlReader', () => { 'site_name: Test\n', ); }); + + it('throws if given URL with wildcard', async () => { + await expect( + reader.search( + 'https://eu-west-1.console.aws.amazon.com/codesuite/codecommit/repositories/my-repo/browse/--/catalog-*.yaml', + ), + ).rejects.toThrow('Unsupported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts index 0759140894..7cffe6a28b 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts @@ -389,6 +389,12 @@ export class AwsCodeCommitUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { path } = parseUrl(url, true); + + if (path.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.test.ts index ec8ff1694e..b4b1803cc1 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.test.ts @@ -572,5 +572,13 @@ describe('AwsS3UrlReader', () => { 'site_name: Test\n', ); }); + + it('throws if given URL with wildcard', async () => { + await expect( + reader.search( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-*.yaml', + ), + ).rejects.toThrow('Unsupported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts index 26861b5273..5060f6c632 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts @@ -366,6 +366,12 @@ export class AwsS3UrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { path } = parseUrl(url, this.integration.config); + + if (path.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.test.ts index 4aa1429769..b1d7018308 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.test.ts @@ -287,5 +287,13 @@ describe('FetchUrlReader', () => { expect(data.etag).toBe(''); expect(data.files.length).toBe(0); }); + + it('throws if given URL with wildcard', async () => { + await expect( + fetchUrlReader.search(`https://backstage.io/some-resource*`, { + etag: 'etag', + }), + ).rejects.toThrow('Unsupported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts index 5fb7f68809..a1a61e4cdc 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts @@ -171,6 +171,12 @@ export class FetchUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { pathname } = new URL(url); + + if (pathname.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts index face959b24..4f805779c7 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts @@ -466,5 +466,13 @@ describe.skip('GerritUrlReader', () => { expect(data.etag).toBe(''); expect(data.files.length).toBe(0); }); + + it('throws if given URL with wildcard', async () => { + await expect( + gerritProcessor.search( + 'https://gerrit.com/web/project/+/refs/heads/master/*.yaml', + ), + ).rejects.toThrow('Unsuppported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts index 928ee41b73..0688c8c42e 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts @@ -150,6 +150,12 @@ export class GerritUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { pathname } = new URL(url); + + if (pathname.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts index d0432a6162..0c545b898c 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts @@ -387,5 +387,13 @@ describe('GiteaUrlReader', () => { expect(data.etag).toBe(''); expect(data.files.length).toBe(0); }); + + it('throws if given URL with wildcard', async () => { + await expect( + giteaProcessor.search( + 'https://gitea.com/owner/project/src/branch/branch2/*.yaml', + ), + ).rejects.toThrow('Unsupported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts index 920faa386c..bce033c2ae 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts @@ -42,6 +42,7 @@ import { } from '@backstage/errors'; import { Readable } from 'stream'; import { parseLastModified } from './util'; +import parseGitUrl from 'git-url-parse'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Gitea v1 api. @@ -161,6 +162,12 @@ export class GiteaUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { filepath } = parseGitUrl(url); + + if (filepath.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts index b3f851a894..c5cdaa9928 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts @@ -280,5 +280,13 @@ describe('HarnessUrlReader', () => { expect(data.etag).toBe(''); expect(data.files.length).toBe(0); }); + + it('throws if given URL with wildcard', async () => { + await expect( + harnessProcessor.search( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/*.yaml', + ), + ).rejects.toThrow('Unsupported search pattern URL'); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts index 6c53b25c0d..bc2e0dab11 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts @@ -160,6 +160,12 @@ export class HarnessUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceSearchOptions, ): Promise { + const { path } = parseHarnessUrl(this.integration.config, url); + + if (path.match(/[*?]/)) { + throw new Error('Unsupported search pattern URL'); + } + try { const data = await this.readUrl(url, options);