renovate 44.93.8 → 44.94.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/decrypt.js +3 -1
- package/dist/config/decrypt.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/index.js +1 -1
- package/dist/config/presets/index.js.map +1 -1
- package/dist/config/presets/internal/workarounds.preset.js +2 -2
- package/dist/config/presets/internal/workarounds.preset.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/azure-bicep-resource/index.js +4 -2
- package/dist/modules/datasource/azure-bicep-resource/index.js.map +1 -1
- package/dist/modules/datasource/cpan/index.js +1 -0
- package/dist/modules/datasource/cpan/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +3 -1
- package/dist/modules/datasource/docker/common.js.map +1 -1
- package/dist/modules/datasource/elm-package/index.js +2 -1
- package/dist/modules/datasource/elm-package/index.js.map +1 -1
- package/dist/modules/datasource/index.js +1 -1
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/java-version/index.js +1 -0
- package/dist/modules/datasource/java-version/index.js.map +1 -1
- package/dist/modules/datasource/npm/npmrc.js +1 -1
- package/dist/modules/datasource/npm/npmrc.js.map +1 -1
- package/dist/modules/datasource/ruby-version/index.js +1 -0
- package/dist/modules/datasource/ruby-version/index.js.map +1 -1
- package/dist/modules/datasource/typst/index.js +10 -7
- package/dist/modules/datasource/typst/index.js.map +1 -1
- package/dist/modules/manager/apm/artifacts.js +7 -18
- package/dist/modules/manager/apm/artifacts.js.map +1 -1
- package/dist/modules/manager/bun/artifacts.js +3 -10
- package/dist/modules/manager/bun/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +4 -15
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cocoapods/artifacts.js +11 -26
- package/dist/modules/manager/cocoapods/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/artifacts.js +8 -19
- package/dist/modules/manager/composer/artifacts.js.map +1 -1
- package/dist/modules/manager/conan/artifacts.js +3 -10
- package/dist/modules/manager/conan/artifacts.js.map +1 -1
- package/dist/modules/manager/copier/artifacts.js +21 -41
- package/dist/modules/manager/copier/artifacts.js.map +1 -1
- package/dist/modules/manager/deno/artifacts.js +5 -18
- package/dist/modules/manager/deno/artifacts.js.map +1 -1
- package/dist/modules/manager/devbox/artifacts.js +3 -10
- package/dist/modules/manager/devbox/artifacts.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +7 -7
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/github-actions/known-actions/crate-dynamic.js +20 -0
- package/dist/modules/manager/github-actions/known-actions/crate-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/dart-version.js +13 -0
- package/dist/modules/manager/github-actions/known-actions/dart-version.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/docker-dynamic.js +33 -0
- package/dist/modules/manager/github-actions/known-actions/docker-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/docker.js +10 -0
- package/dist/modules/manager/github-actions/known-actions/docker.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/dotnet-version.js +14 -0
- package/dist/modules/manager/github-actions/known-actions/dotnet-version.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/github-release-attachments-dynamic.js +22 -0
- package/dist/modules/manager/github-actions/known-actions/github-release-attachments-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/github-releases-dynamic.js +143 -0
- package/dist/modules/manager/github-actions/known-actions/github-releases-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/github-releases.js +271 -0
- package/dist/modules/manager/github-actions/known-actions/github-releases.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/gradle-version.js +25 -0
- package/dist/modules/manager/github-actions/known-actions/gradle-version.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/java-version-dynamic.js +51 -0
- package/dist/modules/manager/github-actions/known-actions/java-version-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/multiple.js +106 -0
- package/dist/modules/manager/github-actions/known-actions/multiple.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/npm.js +53 -0
- package/dist/modules/manager/github-actions/known-actions/npm.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/pypi.js +27 -0
- package/dist/modules/manager/github-actions/known-actions/pypi.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/ruby-version.js +12 -0
- package/dist/modules/manager/github-actions/known-actions/ruby-version.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/rust-version-dynamic.js +14 -0
- package/dist/modules/manager/github-actions/known-actions/rust-version-dynamic.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/rust-version.js +19 -0
- package/dist/modules/manager/github-actions/known-actions/rust-version.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions/utils.js +93 -0
- package/dist/modules/manager/github-actions/known-actions/utils.js.map +1 -0
- package/dist/modules/manager/github-actions/known-actions.js +33 -728
- package/dist/modules/manager/github-actions/known-actions.js.map +1 -1
- package/dist/modules/manager/github-actions/schema.js +2 -1
- package/dist/modules/manager/github-actions/schema.js.map +1 -1
- package/dist/modules/manager/github-actions/types.js +9 -0
- package/dist/modules/manager/github-actions/types.js.map +1 -0
- package/dist/modules/manager/gleam/artifacts.js +13 -23
- package/dist/modules/manager/gleam/artifacts.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +18 -50
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/helmfile/artifacts.js +16 -22
- package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/artifacts.js +8 -28
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js +4 -22
- package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/artifacts.js +9 -23
- package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/artifacts.js +13 -22
- package/dist/modules/manager/mise/artifacts.js.map +1 -1
- package/dist/modules/manager/mix/artifacts.js +5 -18
- package/dist/modules/manager/mix/artifacts.js.map +1 -1
- package/dist/modules/manager/nuget/artifacts.js +3 -10
- package/dist/modules/manager/nuget/artifacts.js.map +1 -1
- package/dist/modules/manager/pep621/processors/pdm.js +7 -15
- package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +7 -15
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pixi/lockfile.js +25 -28
- package/dist/modules/manager/pixi/lockfile.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +41 -46
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +13 -16
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/renovate-config/extract.js +3 -1
- package/dist/modules/manager/renovate-config/extract.js.map +1 -1
- package/dist/modules/manager/terragrunt/modules.js +2 -0
- package/dist/modules/manager/terragrunt/modules.js.map +1 -1
- package/dist/modules/manager/types.d.ts +19 -1
- package/dist/modules/manager/util.js +60 -1
- package/dist/modules/manager/util.js.map +1 -1
- package/dist/modules/manager/vendir/artifacts.js +7 -31
- package/dist/modules/manager/vendir/artifacts.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +1 -1
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/docker/index.js +1 -1
- package/dist/modules/versioning/docker/index.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +4 -4
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/hermit/index.js +1 -2
- package/dist/modules/versioning/hermit/index.js.map +1 -1
- package/dist/modules/versioning/ivy/index.js +2 -5
- package/dist/modules/versioning/ivy/index.js.map +1 -1
- package/dist/modules/versioning/ivy/parse.js +4 -7
- package/dist/modules/versioning/ivy/parse.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +7 -10
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/nuget/parser.js +2 -3
- package/dist/modules/versioning/nuget/parser.js.map +1 -1
- package/dist/modules/versioning/nuget/range.js +1 -1
- package/dist/modules/versioning/nuget/range.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +6 -21
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +1 -2
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/util/git/file-changes.js +50 -0
- package/dist/util/git/file-changes.js.map +1 -0
- package/dist/util/template/index.js +1 -0
- package/dist/util/template/index.js.map +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
- package/dist/workers/global/limits.js +0 -1
- package/dist/workers/global/limits.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +4 -2
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/rebase.js +2 -1
- package/dist/workers/repository/onboarding/branch/rebase.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js +1 -3
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitea/index.js +1 -3
- package/dist/workers/repository/update/pr/changelog/gitea/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js +1 -3
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js.map +1 -1
- package/package.json +3 -3
- package/renovate-schema.json +2 -2
package/dist/config/decrypt.js
CHANGED
|
@@ -18,7 +18,9 @@ function setPrivateKeys(pKey, pKeyOld) {
|
|
|
18
18
|
}
|
|
19
19
|
async function tryDecrypt(key, encryptedStr, repository) {
|
|
20
20
|
let decryptedStr = null;
|
|
21
|
-
|
|
21
|
+
let decryptedObjStr;
|
|
22
|
+
if (getEnv().RENOVATE_X_USE_OPENPGP === "true") decryptedObjStr = await tryDecryptOpenPgp(key, encryptedStr);
|
|
23
|
+
else decryptedObjStr = await tryDecryptBcPgp(key, encryptedStr);
|
|
22
24
|
if (decryptedObjStr) decryptedStr = validateDecryptedValue(decryptedObjStr, repository);
|
|
23
25
|
return decryptedStr;
|
|
24
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decrypt.js","names":[],"sources":["../../lib/config/decrypt.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport { CONFIG_VALIDATION } from '../constants/error-messages.ts';\nimport { logger } from '../logger/index.ts';\nimport { getEnv } from '../util/env.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport { ensureTrailingSlash, parseUrl, trimSlashes } from '../util/url.ts';\nimport { tryDecryptBcPgp } from './decrypt/bcpgp.ts';\nimport { tryDecryptOpenPgp } from './decrypt/openpgp.ts';\nimport { GlobalConfig } from './global.ts';\nimport { DecryptedObject } from './schema.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nlet privateKey: string | undefined;\nlet privateKeyOld: string | undefined;\n\nexport function setPrivateKeys(\n pKey: string | undefined,\n pKeyOld: string | undefined,\n): void {\n privateKey = pKey;\n privateKeyOld = pKeyOld;\n}\n\nexport async function tryDecrypt(\n key: string,\n encryptedStr: string,\n repository: string,\n): Promise<string | null> {\n let decryptedStr: string | null = null;\n const decryptedObjStr =\n getEnv().RENOVATE_X_USE_OPENPGP === 'true'\n ? await tryDecryptOpenPgp(key, encryptedStr)\n : await tryDecryptBcPgp(key, encryptedStr);\n if (decryptedObjStr) {\n decryptedStr = validateDecryptedValue(decryptedObjStr, repository);\n }\n return decryptedStr;\n}\n\nexport function validateDecryptedValue(\n decryptedObjStr: string,\n repository: string,\n): string | null {\n try {\n const decryptedObj = DecryptedObject.safeParse(decryptedObjStr);\n if (!decryptedObj.success) {\n const error = new Error('config-validation');\n error.validationError = `Could not parse decrypted config.`;\n throw error;\n }\n\n const { o: org, r: repo, v: value } = decryptedObj.data;\n\n if (!isNonEmptyString(value)) {\n const error = new Error('config-validation');\n error.validationError = `Encrypted value in config is missing a value.`;\n throw error;\n }\n\n if (!isNonEmptyString(org)) {\n const error = new Error('config-validation');\n error.validationError = `Encrypted value in config is missing a scope.`;\n throw error;\n }\n\n const repositories = [repository.toUpperCase()];\n\n const azureCollection = getAzureCollection();\n if (isNonEmptyString(azureCollection)) {\n // used for full 'org/project/repo' matching\n repositories.push(`${azureCollection}/${repository}`.toUpperCase());\n // used for org prefix matching without repo\n repositories.push(`${azureCollection}/*/`.toUpperCase());\n }\n\n const orgPrefixes = org\n .split(',')\n .map((o) => o.trim())\n .map((o) => o.toUpperCase())\n .map((o) => ensureTrailingSlash(o));\n\n if (isNonEmptyString(repo)) {\n const scopedRepos = orgPrefixes.map((orgPrefix) =>\n `${orgPrefix}${repo}`.toUpperCase(),\n );\n for (const rp of repositories) {\n if (scopedRepos.some((r) => r === rp)) {\n return value;\n }\n }\n\n logger.debug(\n { scopedRepos },\n 'Secret is scoped to a different repository',\n );\n const error = new Error('config-validation');\n const scopeString = scopedRepos.join(',');\n error.validationError = `Encrypted secret is scoped to a different repository: \"${scopeString}\".`;\n throw error;\n }\n\n // no scoped repos, only org\n const azcol =\n azureCollection === undefined\n ? undefined\n : ensureTrailingSlash(azureCollection).toUpperCase();\n for (const rp of repositories) {\n if (\n orgPrefixes.some(\n (orgPrefix) => rp.startsWith(orgPrefix) && orgPrefix !== azcol,\n )\n ) {\n return value;\n }\n }\n logger.debug({ orgPrefixes }, 'Secret is scoped to a different org');\n const error = new Error('config-validation');\n const scopeString = orgPrefixes.join(',');\n error.validationError = `Encrypted secret is scoped to a different org: \"${scopeString}\".`;\n throw error;\n } catch (err) {\n logger.warn({ err }, 'Could not parse decrypted string');\n }\n return null;\n}\n\nexport async function decryptConfig<T extends RenovateConfig = AllConfig>(\n config: T,\n repository: string,\n existingPath = '$',\n): Promise<T> {\n logger.trace({ config }, 'decryptConfig()');\n const decryptedConfig = { ...config };\n for (const [key, val] of Object.entries(config)) {\n if (key === 'encrypted' && isObject(val)) {\n const path = `${existingPath}.${key}`;\n logger.debug({ config: val }, `Found encrypted config in ${path}`);\n\n const encryptedWarning = GlobalConfig.get('encryptedWarning');\n if (isString(encryptedWarning)) {\n logger.once.warn(encryptedWarning);\n }\n\n if (privateKey) {\n for (const [eKey, eVal] of Object.entries(val)) {\n logger.debug(`Trying to decrypt ${eKey} in ${path}`);\n let decryptedStr = await tryDecrypt(privateKey, eVal, repository);\n if (privateKeyOld && !isNonEmptyString(decryptedStr)) {\n logger.debug(`Trying to decrypt with old private key`);\n decryptedStr = await tryDecrypt(privateKeyOld, eVal, repository);\n }\n if (!isNonEmptyString(decryptedStr)) {\n const error = new Error('config-validation');\n error.validationError = `Failed to decrypt field ${eKey}. Please re-encrypt and try again.`;\n throw error;\n }\n logger.debug(`Decrypted ${eKey} in ${path}`);\n // v8 ignore if -- TODO: add test #40625\n if (eKey === 'npmToken') {\n const token = decryptedStr.replace(regEx(/\\n$/), '');\n decryptedConfig[eKey] = token;\n addSecretForSanitizing(token);\n } else {\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[eKey] = decryptedStr;\n addSecretForSanitizing(decryptedStr);\n }\n }\n } else {\n const env = getEnv();\n if (env.RENOVATE_X_ENCRYPTED_STRICT === 'true') {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = 'Encrypted config unsupported';\n error.validationMessage = `This config contains an encrypted object at location \\`$.${key}\\` but no privateKey is configured. To support encrypted config, the Renovate administrator must configure a \\`privateKey\\` in Global Configuration.`;\n if (env.MEND_HOSTED === 'true') {\n error.validationMessage = `Mend-hosted Renovate Apps no longer support the use of encrypted secrets in Renovate file config (e.g. renovate.json).\nPlease migrate all secrets to the Developer Portal using the web UI available at https://developer.mend.io/\n\nRefer to migration documents here: ${GlobalConfig.get('productLinks').documentation}mend-hosted/migrating-secrets/`;\n }\n throw error;\n } else {\n logger.error('Found encrypted data but no privateKey');\n }\n }\n delete decryptedConfig.encrypted;\n } else if (isArray(val)) {\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[key] = [];\n for (const [index, item] of val.entries()) {\n if (isObject(item) && !isArray(item)) {\n const path = `${existingPath}.${key}[${index}]`;\n // @ts-expect-error -- type can't be narrowed\n (decryptedConfig[key] as RenovateConfig[]).push(\n await decryptConfig(item as RenovateConfig, repository, path),\n );\n } else {\n // @ts-expect-error -- type can't be narrowed\n (decryptedConfig[key] as unknown[]).push(item);\n }\n }\n } else if (isObject(val) && key !== 'content') {\n const path = `${existingPath}.${key}`;\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[key] = await decryptConfig(\n val as RenovateConfig,\n repository,\n path,\n );\n }\n }\n delete decryptedConfig.encrypted;\n logger.trace({ config: decryptedConfig }, 'decryptedConfig');\n return decryptedConfig;\n}\n\nexport function getAzureCollection(): string | undefined {\n const platform = GlobalConfig.get('platform');\n if (platform !== 'azure') {\n return undefined;\n }\n\n const endpoint = GlobalConfig.get('endpoint');\n const endpointUrl = parseUrl(endpoint);\n if (endpointUrl === null) {\n // should not happen\n logger.warn({ endpoint }, 'Unable to parse endpoint for token decryption');\n return undefined;\n }\n\n const azureCollection = trimSlashes(endpointUrl.pathname);\n if (!isNonEmptyString(azureCollection)) {\n logger.debug({ endpoint }, 'Unable to find azure collection name from URL');\n return undefined;\n }\n\n if (azureCollection.startsWith('tfs/')) {\n // Azure DevOps Server\n return azureCollection.substring(4);\n }\n return azureCollection;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decrypt.js","names":[],"sources":["../../lib/config/decrypt.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport { CONFIG_VALIDATION } from '../constants/error-messages.ts';\nimport { logger } from '../logger/index.ts';\nimport { getEnv } from '../util/env.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport { ensureTrailingSlash, parseUrl, trimSlashes } from '../util/url.ts';\nimport { tryDecryptBcPgp } from './decrypt/bcpgp.ts';\nimport { tryDecryptOpenPgp } from './decrypt/openpgp.ts';\nimport { GlobalConfig } from './global.ts';\nimport { DecryptedObject } from './schema.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nlet privateKey: string | undefined;\nlet privateKeyOld: string | undefined;\n\nexport function setPrivateKeys(\n pKey: string | undefined,\n pKeyOld: string | undefined,\n): void {\n privateKey = pKey;\n privateKeyOld = pKeyOld;\n}\n\nexport async function tryDecrypt(\n key: string,\n encryptedStr: string,\n repository: string,\n): Promise<string | null> {\n let decryptedStr: string | null = null;\n // Written as an if/else rather than a ternary on purpose: v8 gives the branch\n // that follows an `await` inside a ternary a negative hit count, which the\n // coverage reporters then read as uncovered.\n let decryptedObjStr: string | null;\n if (getEnv().RENOVATE_X_USE_OPENPGP === 'true') {\n decryptedObjStr = await tryDecryptOpenPgp(key, encryptedStr);\n } else {\n decryptedObjStr = await tryDecryptBcPgp(key, encryptedStr);\n }\n if (decryptedObjStr) {\n decryptedStr = validateDecryptedValue(decryptedObjStr, repository);\n }\n return decryptedStr;\n}\n\nexport function validateDecryptedValue(\n decryptedObjStr: string,\n repository: string,\n): string | null {\n try {\n const decryptedObj = DecryptedObject.safeParse(decryptedObjStr);\n if (!decryptedObj.success) {\n const error = new Error('config-validation');\n error.validationError = `Could not parse decrypted config.`;\n throw error;\n }\n\n const { o: org, r: repo, v: value } = decryptedObj.data;\n\n if (!isNonEmptyString(value)) {\n const error = new Error('config-validation');\n error.validationError = `Encrypted value in config is missing a value.`;\n throw error;\n }\n\n if (!isNonEmptyString(org)) {\n const error = new Error('config-validation');\n error.validationError = `Encrypted value in config is missing a scope.`;\n throw error;\n }\n\n const repositories = [repository.toUpperCase()];\n\n const azureCollection = getAzureCollection();\n if (isNonEmptyString(azureCollection)) {\n // used for full 'org/project/repo' matching\n repositories.push(`${azureCollection}/${repository}`.toUpperCase());\n // used for org prefix matching without repo\n repositories.push(`${azureCollection}/*/`.toUpperCase());\n }\n\n const orgPrefixes = org\n .split(',')\n .map((o) => o.trim())\n .map((o) => o.toUpperCase())\n .map((o) => ensureTrailingSlash(o));\n\n if (isNonEmptyString(repo)) {\n const scopedRepos = orgPrefixes.map((orgPrefix) =>\n `${orgPrefix}${repo}`.toUpperCase(),\n );\n for (const rp of repositories) {\n if (scopedRepos.some((r) => r === rp)) {\n return value;\n }\n }\n\n logger.debug(\n { scopedRepos },\n 'Secret is scoped to a different repository',\n );\n const error = new Error('config-validation');\n const scopeString = scopedRepos.join(',');\n error.validationError = `Encrypted secret is scoped to a different repository: \"${scopeString}\".`;\n throw error;\n }\n\n // no scoped repos, only org\n const azcol =\n azureCollection === undefined\n ? undefined\n : ensureTrailingSlash(azureCollection).toUpperCase();\n for (const rp of repositories) {\n if (\n orgPrefixes.some(\n (orgPrefix) => rp.startsWith(orgPrefix) && orgPrefix !== azcol,\n )\n ) {\n return value;\n }\n }\n logger.debug({ orgPrefixes }, 'Secret is scoped to a different org');\n const error = new Error('config-validation');\n const scopeString = orgPrefixes.join(',');\n error.validationError = `Encrypted secret is scoped to a different org: \"${scopeString}\".`;\n throw error;\n } catch (err) {\n logger.warn({ err }, 'Could not parse decrypted string');\n }\n return null;\n}\n\nexport async function decryptConfig<T extends RenovateConfig = AllConfig>(\n config: T,\n repository: string,\n existingPath = '$',\n): Promise<T> {\n logger.trace({ config }, 'decryptConfig()');\n const decryptedConfig = { ...config };\n for (const [key, val] of Object.entries(config)) {\n if (key === 'encrypted' && isObject(val)) {\n const path = `${existingPath}.${key}`;\n logger.debug({ config: val }, `Found encrypted config in ${path}`);\n\n const encryptedWarning = GlobalConfig.get('encryptedWarning');\n if (isString(encryptedWarning)) {\n logger.once.warn(encryptedWarning);\n }\n\n if (privateKey) {\n for (const [eKey, eVal] of Object.entries(val)) {\n logger.debug(`Trying to decrypt ${eKey} in ${path}`);\n let decryptedStr = await tryDecrypt(privateKey, eVal, repository);\n if (privateKeyOld && !isNonEmptyString(decryptedStr)) {\n logger.debug(`Trying to decrypt with old private key`);\n decryptedStr = await tryDecrypt(privateKeyOld, eVal, repository);\n }\n if (!isNonEmptyString(decryptedStr)) {\n const error = new Error('config-validation');\n error.validationError = `Failed to decrypt field ${eKey}. Please re-encrypt and try again.`;\n throw error;\n }\n logger.debug(`Decrypted ${eKey} in ${path}`);\n // v8 ignore if -- TODO: add test #40625\n if (eKey === 'npmToken') {\n const token = decryptedStr.replace(regEx(/\\n$/), '');\n decryptedConfig[eKey] = token;\n addSecretForSanitizing(token);\n } else {\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[eKey] = decryptedStr;\n addSecretForSanitizing(decryptedStr);\n }\n }\n } else {\n const env = getEnv();\n if (env.RENOVATE_X_ENCRYPTED_STRICT === 'true') {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = 'Encrypted config unsupported';\n error.validationMessage = `This config contains an encrypted object at location \\`$.${key}\\` but no privateKey is configured. To support encrypted config, the Renovate administrator must configure a \\`privateKey\\` in Global Configuration.`;\n if (env.MEND_HOSTED === 'true') {\n error.validationMessage = `Mend-hosted Renovate Apps no longer support the use of encrypted secrets in Renovate file config (e.g. renovate.json).\nPlease migrate all secrets to the Developer Portal using the web UI available at https://developer.mend.io/\n\nRefer to migration documents here: ${GlobalConfig.get('productLinks').documentation}mend-hosted/migrating-secrets/`;\n }\n throw error;\n } else {\n logger.error('Found encrypted data but no privateKey');\n }\n }\n delete decryptedConfig.encrypted;\n } else if (isArray(val)) {\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[key] = [];\n for (const [index, item] of val.entries()) {\n if (isObject(item) && !isArray(item)) {\n const path = `${existingPath}.${key}[${index}]`;\n // @ts-expect-error -- type can't be narrowed\n (decryptedConfig[key] as RenovateConfig[]).push(\n await decryptConfig(item as RenovateConfig, repository, path),\n );\n } else {\n // @ts-expect-error -- type can't be narrowed\n (decryptedConfig[key] as unknown[]).push(item);\n }\n }\n } else if (isObject(val) && key !== 'content') {\n const path = `${existingPath}.${key}`;\n // @ts-expect-error -- type can't be narrowed\n decryptedConfig[key] = await decryptConfig(\n val as RenovateConfig,\n repository,\n path,\n );\n }\n }\n delete decryptedConfig.encrypted;\n logger.trace({ config: decryptedConfig }, 'decryptedConfig');\n return decryptedConfig;\n}\n\nexport function getAzureCollection(): string | undefined {\n const platform = GlobalConfig.get('platform');\n if (platform !== 'azure') {\n return undefined;\n }\n\n const endpoint = GlobalConfig.get('endpoint');\n const endpointUrl = parseUrl(endpoint);\n if (endpointUrl === null) {\n // should not happen\n logger.warn({ endpoint }, 'Unable to parse endpoint for token decryption');\n return undefined;\n }\n\n const azureCollection = trimSlashes(endpointUrl.pathname);\n if (!isNonEmptyString(azureCollection)) {\n logger.debug({ endpoint }, 'Unable to find azure collection name from URL');\n return undefined;\n }\n\n if (azureCollection.startsWith('tfs/')) {\n // Azure DevOps Server\n return azureCollection.substring(4);\n }\n return azureCollection;\n}\n"],"mappings":"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"}
|
|
@@ -681,7 +681,7 @@ const options = [
|
|
|
681
681
|
name: "dockerSidecarImage",
|
|
682
682
|
description: "Change this value to override the default Renovate sidecar image.",
|
|
683
683
|
type: "string",
|
|
684
|
-
default: "ghcr.io/renovatebot/base-image:13.98.
|
|
684
|
+
default: "ghcr.io/renovatebot/base-image:13.98.10",
|
|
685
685
|
globalOnly: true,
|
|
686
686
|
deprecationMsg: "The usage of `binarySource=docker` is deprecated, and will be removed in the future"
|
|
687
687
|
},
|