diff --git a/.changeset/purple-dodos-glow.md b/.changeset/purple-dodos-glow.md new file mode 100644 index 0000000000..4c21866af6 --- /dev/null +++ b/.changeset/purple-dodos-glow.md @@ -0,0 +1,9 @@ +--- +'@backstage/integration': patch +'@backstage/backend-common': patch +'@backstage/integration': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Replace slash stripping regexp with trimEnd to remove CodeQL warning diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.ts b/packages/backend-common/src/reading/BitbucketUrlReader.ts index 611e94f0db..4ae0ea37a8 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.ts @@ -25,6 +25,7 @@ import { } from '@backstage/integration'; import fetch from 'cross-fetch'; import parseGitUrl from 'git-url-parse'; +import { trimEnd } from 'lodash'; import { Minimatch } from 'minimatch'; import { Readable } from 'stream'; import { @@ -149,7 +150,7 @@ export class BitbucketUrlReader implements UrlReader { // a future improvement, we could be smart and try to deduce that non-glob // prefixes (like for filepaths such as some-prefix/**/a.yaml) can be used // to get just that part of the repo. - const treeUrl = url.replace(filepath, '').replace(/\/+$/, ''); + const treeUrl = trimEnd(url.replace(filepath, ''), '/'); const tree = await this.readTree(treeUrl, { etag: options?.etag, diff --git a/packages/backend-common/src/reading/GitlabUrlReader.ts b/packages/backend-common/src/reading/GitlabUrlReader.ts index b78add6916..3fc9673e8b 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.ts @@ -37,6 +37,7 @@ import { ReadUrlResponse, ReadUrlOptions, } from './types'; +import { trimEnd } from 'lodash'; /** @public */ export class GitlabUrlReader implements UrlReader { @@ -186,7 +187,7 @@ export class GitlabUrlReader implements UrlReader { // a future improvement, we could be smart and try to deduce that non-glob // prefixes (like for filepaths such as some-prefix/**/a.yaml) can be used // to get just that part of the repo. - const treeUrl = url.replace(filepath, '').replace(/\/+$/, ''); + const treeUrl = trimEnd(url.replace(filepath, ''), '/'); const tree = await this.readTree(treeUrl, { etag: options?.etag, diff --git a/packages/integration/package.json b/packages/integration/package.json index f99b905617..dcb2091a2c 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -35,7 +35,8 @@ "git-url-parse": "^11.6.0", "@octokit/rest": "^18.5.3", "@octokit/auth-app": "^3.4.0", - "luxon": "^2.0.2" + "luxon": "^2.0.2", + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/cli": "^0.7.14", diff --git a/packages/integration/src/bitbucket/config.ts b/packages/integration/src/bitbucket/config.ts index b2ddfa3532..3b4a9df162 100644 --- a/packages/integration/src/bitbucket/config.ts +++ b/packages/integration/src/bitbucket/config.ts @@ -83,7 +83,7 @@ export function readBitbucketIntegrationConfig( } if (apiBaseUrl) { - apiBaseUrl = apiBaseUrl.replace(/\/+$/, ''); + apiBaseUrl = trimEnd(apiBaseUrl, '/'); } else if (host === BITBUCKET_HOST) { apiBaseUrl = BITBUCKET_API_BASE_URL; } diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 4ecac99295..49674681f1 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -15,6 +15,7 @@ */ import { Config } from '@backstage/config'; +import { trimEnd } from 'lodash'; import { isValidHost } from '../helpers'; const GITHUB_HOST = 'github.com'; @@ -133,13 +134,13 @@ export function readGitHubIntegrationConfig( } if (apiBaseUrl) { - apiBaseUrl = apiBaseUrl.replace(/\/+$/, ''); + apiBaseUrl = trimEnd(apiBaseUrl, '/'); } else if (host === GITHUB_HOST) { apiBaseUrl = GITHUB_API_BASE_URL; } if (rawBaseUrl) { - rawBaseUrl = rawBaseUrl.replace(/\/+$/, ''); + rawBaseUrl = trimEnd(rawBaseUrl, '/'); } else if (host === GITHUB_HOST) { rawBaseUrl = GITHUB_RAW_BASE_URL; } diff --git a/packages/integration/src/gitlab/config.ts b/packages/integration/src/gitlab/config.ts index 3bc8f76d44..7471ba0078 100644 --- a/packages/integration/src/gitlab/config.ts +++ b/packages/integration/src/gitlab/config.ts @@ -15,6 +15,7 @@ */ import { Config } from '@backstage/config'; +import { trimEnd } from 'lodash'; import { isValidHost, isValidUrl } from '../helpers'; const GITLAB_HOST = 'gitlab.com'; @@ -67,13 +68,13 @@ export function readGitLabIntegrationConfig( let baseUrl = config.getOptionalString('baseUrl'); if (apiBaseUrl) { - apiBaseUrl = apiBaseUrl.replace(/\/+$/, ''); + apiBaseUrl = trimEnd(apiBaseUrl, '/'); } else if (host === GITLAB_HOST) { apiBaseUrl = GITLAB_API_BASE_URL; } if (baseUrl) { - baseUrl = baseUrl.replace(/\/+$/, ''); + baseUrl = trimEnd(baseUrl, '/'); } else { baseUrl = `https://${host}`; } diff --git a/packages/integration/src/helpers.ts b/packages/integration/src/helpers.ts index dc1ce1a502..52d2cf6571 100644 --- a/packages/integration/src/helpers.ts +++ b/packages/integration/src/helpers.ts @@ -15,6 +15,7 @@ */ import parseGitUrl from 'git-url-parse'; +import { trimEnd } from 'lodash'; import { ScmIntegration, ScmIntegrationsGroup } from './types'; /** Checks whether the given argument is a valid URL hostname */ @@ -83,9 +84,10 @@ export function defaultScmResolveUrl(options: { // If it is an absolute path, move relative to the repo root const { filepath } = parseGitUrl(base); updated = new URL(base); - const repoRootPath = updated.pathname - .substring(0, updated.pathname.length - filepath.length) - .replace(/\/+$/, ''); + const repoRootPath = trimEnd( + updated.pathname.substring(0, updated.pathname.length - filepath.length), + '/', + ); updated.pathname = `${repoRootPath}${url}`; } else { // For relative URLs, just let the default URL constructor handle the diff --git a/plugins/catalog-backend-module-ldap/src/ldap/config.ts b/plugins/catalog-backend-module-ldap/src/ldap/config.ts index eefe43f97a..6dad7e087f 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/config.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/config.ts @@ -18,6 +18,7 @@ import { Config, JsonValue } from '@backstage/config'; import { SearchOptions } from 'ldapjs'; import mergeWith from 'lodash/mergeWith'; import { RecursivePartial } from '@backstage/plugin-catalog-backend'; +import { trimEnd } from 'lodash'; /** * The configuration parameters for a single LDAP provider. @@ -286,7 +287,7 @@ export function readLdapConfig(config: Config): LdapProviderConfig[] { const providerConfigs = config.getOptionalConfigArray('providers') ?? []; return providerConfigs.map(c => { const newConfig = { - target: c.getString('target').replace(/\/+$/, ''), + target: trimEnd(c.getString('target'), '/'), bind: readBindConfig(c.getOptionalConfig('bind')), users: readUserConfig(c.getConfig('users')), groups: readGroupConfig(c.getConfig('groups')), diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts index 591df9baf7..fe0678372a 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/config.ts @@ -15,6 +15,7 @@ */ import { Config } from '@backstage/config'; +import { trimEnd } from 'lodash'; /** * The configuration parameters for a single Microsoft Graph provider. @@ -72,10 +73,11 @@ export function readMicrosoftGraphConfig( const providerConfigs = config.getOptionalConfigArray('providers') ?? []; for (const providerConfig of providerConfigs) { - const target = providerConfig.getString('target').replace(/\/+$/, ''); - const authority = - providerConfig.getOptionalString('authority')?.replace(/\/+$/, '') || - 'https://login.microsoftonline.com'; + const target = trimEnd(providerConfig.getString('target'), '/'); + + const authority = providerConfig.getOptionalString('authority') + ? trimEnd(providerConfig.getOptionalString('authority'), '/') + : 'https://login.microsoftonline.com'; const tenantId = providerConfig.getString('tenantId'); const clientId = providerConfig.getString('clientId'); const clientSecret = providerConfig.getString('clientSecret');