Skip to content

Commit e7a4162

Browse files
rarkinsviceice
andauthored
refactor(config): set and delete keys early (#35679)
Co-authored-by: Michael Kriese <[email protected]>
1 parent 0eca377 commit e7a4162

File tree

8 files changed

+51
-34
lines changed

8 files changed

+51
-34
lines changed

lib/config/decrypt.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,41 @@ import { GlobalConfig } from './global';
1414
import { DecryptedObject } from './schema';
1515
import type { RenovateConfig } from './types';
1616

17+
let privateKey: string | undefined;
18+
let privateKeyOld: string | undefined;
19+
20+
export function setPrivateKeys(
21+
pKey: string | undefined,
22+
pKeyOld: string | undefined,
23+
): void {
24+
privateKey = pKey;
25+
privateKeyOld = pKeyOld;
26+
}
27+
1728
export async function tryDecrypt(
18-
privateKey: string,
29+
key: string,
1930
encryptedStr: string,
2031
repository: string,
2132
keyName: string,
2233
): Promise<string | null> {
2334
let decryptedStr: string | null = null;
24-
if (privateKey?.startsWith('-----BEGIN PGP PRIVATE KEY BLOCK-----')) {
35+
if (key?.startsWith('-----BEGIN PGP PRIVATE KEY BLOCK-----')) {
2536
const decryptedObjStr =
2637
process.env.RENOVATE_X_USE_OPENPGP === 'true'
27-
? await tryDecryptOpenPgp(privateKey, encryptedStr)
28-
: await tryDecryptKbPgp(privateKey, encryptedStr);
38+
? await tryDecryptOpenPgp(key, encryptedStr)
39+
: await tryDecryptKbPgp(key, encryptedStr);
2940
if (decryptedObjStr) {
3041
decryptedStr = validateDecryptedValue(decryptedObjStr, repository);
3142
}
3243
} else {
33-
decryptedStr = tryDecryptPublicKeyDefault(privateKey, encryptedStr);
44+
decryptedStr = tryDecryptPublicKeyDefault(key, encryptedStr);
3445
if (is.string(decryptedStr)) {
3546
logger.warn(
3647
{ keyName },
3748
'Encrypted value is using deprecated default padding, please change to using PGP encryption.',
3849
);
3950
} else {
40-
decryptedStr = tryDecryptPublicKeyPKCS1(privateKey, encryptedStr);
51+
decryptedStr = tryDecryptPublicKeyPKCS1(key, encryptedStr);
4152
/* v8 ignore start -- not testable */
4253
if (is.string(decryptedStr)) {
4354
logger.warn(
@@ -145,8 +156,6 @@ export async function decryptConfig(
145156
): Promise<RenovateConfig> {
146157
logger.trace({ config }, 'decryptConfig()');
147158
const decryptedConfig = { ...config };
148-
const privateKey = GlobalConfig.get('privateKey');
149-
const privateKeyOld = GlobalConfig.get('privateKeyOld');
150159
for (const [key, val] of Object.entries(config)) {
151160
if (key === 'encrypted' && is.object(val)) {
152161
const path = `${existingPath}.${key}`;

lib/config/decrypt/kbpgp.spec.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CONFIG_VALIDATION } from '../../constants/error-messages';
2-
import { decryptConfig } from '../decrypt';
2+
import { decryptConfig, setPrivateKeys } from '../decrypt';
33
import { GlobalConfig } from '../global';
44
import type { RenovateConfig } from '../types';
55
import { tryDecryptKbPgp } from './kbpgp';
@@ -15,6 +15,7 @@ describe('config/decrypt/kbpgp', () => {
1515
beforeEach(() => {
1616
config = {};
1717
GlobalConfig.reset();
18+
setPrivateKeys(undefined, undefined);
1819
});
1920

2021
it('returns null for invalid key', async () => {
@@ -27,7 +28,7 @@ describe('config/decrypt/kbpgp', () => {
2728
});
2829

2930
it('rejects invalid PGP message', async () => {
30-
GlobalConfig.set({ privateKey });
31+
setPrivateKeys(privateKey, undefined);
3132
config.encrypted = {
3233
token:
3334
'long-but-wrong-wcFMAw+4H7SgaqGOAQ//ZNPgHJ4RQBdfFoDX8Ywe9UxqMlc8k6VasCszQ2JULh/BpEdKdgRUGNaKaeZ+oBKYDBmDwAD5V5FEMlsg+KO2gykp/p2BAwvKGtYK0MtxLh4h9yJbN7TrVnGO3/cC+Inp8exQt0gD6f1Qo/9yQ9NE4/BIbaSs2b2DgeIK7Ed8N675AuSo73UOa6o7t+9pKeAAK5TQwgSvolihbUs8zjnScrLZD+nhvL3y5gpAqK9y//a+bTu6xPA1jdLjsswoCUq/lfVeVsB2GWV2h6eex/0fRKgN7xxNgdMn0a7msrvumhTawP8mPisPY2AAsHRIgQ9vdU5HbOPdGoIwI9n9rMdIRn9Dy7/gcX9Ic+RP2WwS/KnPHLu/CveY4W5bYqYoikWtJs9HsBCyWFiHIRrJF+FnXwtKdoptRfxTfJIkBoLrV6fDIyKo79iL+xxzgrzWs77KEJUJfexZBEGBCnrV2o7mo3SU197S0qx7HNvqrmeCj8CLxq8opXC71TNa+XE6BQUVyhMFxtW9LNxZUHRiNzrTSikArT4hzjyr3f9cb0kZVcs6XJQsm1EskU3WXo7ETD7nsukS9GfbwMn7tfYidB/yHSHl09ih871BcgByDmEKKdmamcNilW2bmTAqB5JmtaYT5/H8jRQWo/VGrEqlmiA4KmwSv7SZPlDnaDFrmzmMZZDSRgHe5KWl283XLmSeE8J0NPqwFH3PeOv4fIbOjJrnbnFBwSAsgsMe2K4OyFDh2COfrho7s8EP1Kl5lBkYJ+VRreGRerdSu24',
@@ -68,7 +69,7 @@ describe('config/decrypt/kbpgp', () => {
6869
});
6970

7071
it('handles PGP org constraint', async () => {
71-
GlobalConfig.set({ privateKey });
72+
setPrivateKeys(privateKey, undefined);
7273
config.encrypted = {
7374
token:
7475
'wcFMAw+4H7SgaqGOAQ/+Lz6RlbEymbnmMhrktuaGiDPWRNPEQFuMRwwYM6/B/r0JMZa9tskAA5RpyYKxGmJJeuRtlA8GkTw02GoZomlJf/KXJZ95FwSbkXMSRJRD8LJ2402Hw2TaOTaSvfamESnm8zhNo8cok627nkKQkyrpk64heVlU5LIbO2+UgYgbiSQjuXZiW+QuJ1hVRjx011FQgEYc59+22yuKYqd8rrni7TrVqhGRlHCAqvNAGjBI4H7uTFh0sP4auunT/JjxTeTkJoNu8KgS/LdrvISpO67TkQziZo9XD5FOzSN7N3e4f8vO4N4fpjgkIDH/9wyEYe0zYz34xMAFlnhZzqrHycRqzBJuMxGqlFQcKWp9IisLMoVJhLrnvbDLuwwcjeqYkhvODjSs7UDKwTE4X4WmvZr0x4kOclOeAAz/pM6oNVnjgWJd9SnYtoa67bZVkne0k6mYjVhosie8v8icijmJ4OyLZUGWnjZCRd/TPkzQUw+B0yvsop9FYGidhCI+4MVx6W5w7SRtCctxVfCjLpmU4kWaBUUJ5YIQ5xm55yxEYuAsQkxOAYDCMFlV8ntWStYwIG1FsBgJX6VPevXuPPMjWiPNedIpJwBH2PLB4blxMfzDYuCeaIqU4daDaEWxxpuFTTK9fLdJKuipwFG6rwE3OuijeSN+2SLszi834DXtUjQdikHSTQG392+oTmZCFPeffLk/OiV2VpdXF3gGL7sr5M9hOWIZ783q0vW1l6nAElZ7UA//kW+L6QRxbnBVTJK5eCmMY6RJmL76zjqC1jQ0FC10',
@@ -82,7 +83,7 @@ describe('config/decrypt/kbpgp', () => {
8283
});
8384

8485
it('handles PGP multi-org constraint', async () => {
85-
GlobalConfig.set({ privateKey });
86+
setPrivateKeys(privateKey, undefined);
8687
config.encrypted = {
8788
token:
8889
'wcFMAw+4H7SgaqGOAQ//Yk4RTQoLEhO0TKxN2IUBrCi88ts+CG1SXKeL06sJ2qikN/3n2JYAGGKgkHRICfu5dOnsjyFdLJ1XWUrbsM3XgVWikMbrmzD1Xe7N5DsoZXlt4Wa9pZ+IkZuE6XcKKu9whIJ22ciEwCzFwDmk/CBshdCCVVQ3IYuM6uibEHn/AHQ8K15XhraiSzF6DbJpevs5Cy7b5YHFyE936H25CVnouUQnMPsirpQq3pYeMq/oOtV/m4mfRUUQ7MUxvtrwE4lq4hLjFu5n9rwlcqaFPl7I7BEM++1c9LFpYsP5mTS7hHCZ9wXBqER8fa3fKYx0bK1ihCpjP4zUkR7P/uhWDArXamv7gHX2Kj/Qsbegn7KjTdZlggAmaJl/CuSgCbhySy+E55g3Z1QFajiLRpQ5+RsWFDbbI08YEgzyQ0yNCaRvrkgo7kZ1D95rEGRfY96duOQbjzOEqtvYmFChdemZ2+f9Kh/JH1+X9ynxY/zYe/0p/U7WD3QNTYN18loc4aXiB1adXD5Ka2QfNroLudQBmLaJpJB6wASFfuxddsD5yRnO32NSdRaqIWC1x6ti3ZYJZ2RsNwJExPDzjpQTuMOH2jtpu3q7NHmW3snRKy2YAL2UjI0YdeKIlhc/qLCJt9MRcOxWYvujTMD/yGprhG44qf0jjMkJBu7NjuVIMONujabl9b7SUQGfO/t+3rMuC68bQdCGLlO8gf3hvtD99utzXphi6idjC0HKSW/9KzuMkm+syGmIAYq/0L3EFvpZ38uq7z8KzwFFQHI3sBA34bNEr5zpU5OMWg',
@@ -99,7 +100,7 @@ describe('config/decrypt/kbpgp', () => {
99100
});
100101

101102
it('handles PGP org/repo constraint', async () => {
102-
GlobalConfig.set({ privateKey });
103+
setPrivateKeys(privateKey, undefined);
103104
config.encrypted = {
104105
token:
105106
'wcFMAw+4H7SgaqGOAQ//Wp7N0PaDZp0uOdwsc1CuqAq0UPcq+IQdHyKpJs3tHiCecXBHogy4P+rY9nGaUrVneCr4HexuKGuyJf1yl0ZqFffAUac5PjF8eDvjukQGOUq4aBlOogJCEefnuuVxVJx+NRR5iF1P6v57bmI1c+zoqZI/EQB30KU6O1BsdGPLUA/+R3dwCZd5Mbd36s34eYBasqcY9/QbqFcpElXMEPMse3kMCsVXPbZ+UMjtPJiBPUmtJq+ifnu1LzDrfshusSQMwgd/QNk7nEsijiYKllkWhHTP6g7zigvJ46x0h6AYS108YiuK3B9XUhXN9m05Ac6KTEEUdRI3E/dK2dQuRkLjXC8wceQm4A19Gm0uHoMIJYOCbiVoBCH6ayvKbZWZV5lZ4D1JbDNGmKeIj6OX9XWEMKiwTx0Xe89V7BdJzwIGrL0TCLtXuYWZ/R2k+UuBqtgzr44BsBqMpKUA0pcGBoqsEou1M05Ae9fJMF6ADezF5UQZPxT1hrMldiTp3p9iHGfWN2tKHeoW/8CqlIqg9JEkTc+Pl/L9E6ndy5Zjf097PvcmSGhxUQBE7XlrZoIlGhiEU/1HPMen0UUIs0LUu1ywpjCex2yTWnU2YmEwy0MQI1sekSr96QFxDDz9JcynYOYbqR/X9pdxEWyzQ+NJ3n6K97nE1Dj9Sgwu7mFGiUdNkf/SUAF0eZi/eXg71qumpMGBd4eWPtgkeMPLHjvMSYw9vBUfcoKFz6RJ4woG0dw5HOFkPnIjXKWllnl/o01EoBp/o8uswsIS9Nb8i+bp27U6tAHE',
@@ -113,7 +114,7 @@ describe('config/decrypt/kbpgp', () => {
113114
});
114115

115116
it('handles PGP multi-org/repo constraint', async () => {
116-
GlobalConfig.set({ privateKey });
117+
setPrivateKeys(privateKey, undefined);
117118
config.encrypted = {
118119
token:
119120
'wcFMAw+4H7SgaqGOARAAibXL3zr0KZawiND868UGdPpGRo1aVZfn0NUBHpm8mXfgB1rBHaLsP7qa8vxDHpwH9DRD1IyB4vvPUwtu7wmuv1Vtr596tD40CCcCZYB5JjZLWRF0O0xaZFCOi7Z9SqqdaOQoMScyvPO+3/lJkS7zmLllJFH0mQoX5Cr+owUAMSWqbeCQ9r/KAXpnhmpraDjTav48WulcdTMc8iQ/DHimcdzHErLOAjtiQi4OUe1GnDCcN76KQ+c+ZHySnkXrYi/DhOOu9qB4glJ5n68NueFja+8iR39z/wqCI6V6TIUiOyjFN86iVyNPQ4Otem3KuNwrnwSABLDqP491eUNjT8DUDffsyhNC9lnjQLmtViK0EN2yLVpMdHq9cq8lszBChB7gobD9rm8nUHnTuLf6yJvZOj6toD5Yqj8Ibj58wN90Q8CUsBp9/qp0J+hBVUPOx4sT6kM2p6YarlgX3mrIW5c1U+q1eDbCddLjHiU5cW7ja7o+cqlA6mbDRu3HthjBweiXTicXZcRu1o/wy/+laQQ95x5FzAXDnOwQUHBmpTDI3tUJvQ+oy8XyBBbyC0LsBye2c2SLkPJ4Ai3IMR+Mh8puSzVywTbneiAQNBzJHlj5l85nCF2tUjvNo3dWC+9mU5sfXg11iEC6LRbg+icjpqRtTjmQURtciKDUbibWacwU5T/SVAGPXnW7adBOS0PZPIZQcSwjchOdOl0IjzBy6ofu7ODdn2CXZXi8zbevTICXsHvjnW4MAj5oXrStxK3LkWyM3YBOLe7sOfWvWz7n9TM3dHg032navQ',

lib/config/decrypt/legacy.spec.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CONFIG_VALIDATION } from '../../constants/error-messages';
2-
import { decryptConfig } from '../decrypt';
2+
import { decryptConfig, setPrivateKeys } from '../decrypt';
33
import { GlobalConfig } from '../global';
44
import type { RenovateConfig } from '../types';
55
import { Fixtures } from '~test/fixtures';
@@ -14,28 +14,26 @@ describe('config/decrypt/legacy', () => {
1414
beforeEach(() => {
1515
config = {};
1616
GlobalConfig.reset();
17+
setPrivateKeys(undefined, undefined);
1718
});
1819

1920
it('handles invalid encrypted type', async () => {
2021
config.encrypted = 1;
21-
GlobalConfig.set({ privateKey });
22+
setPrivateKeys(privateKey, undefined);
2223
const res = await decryptConfig(config, repository);
2324
expect(res.encrypted).toBeUndefined();
2425
});
2526

2627
it('handles invalid encrypted value', async () => {
2728
config.encrypted = { a: 1 };
28-
GlobalConfig.set({ privateKey, privateKeyOld: 'invalid-key' });
29+
setPrivateKeys(privateKey, 'invalid-key');
2930
await expect(decryptConfig(config, repository)).rejects.toThrow(
3031
CONFIG_VALIDATION,
3132
);
3233
});
3334

3435
it('replaces npm token placeholder in npmrc', async () => {
35-
GlobalConfig.set({
36-
privateKey: 'invalid-key',
37-
privateKeyOld: privateKey,
38-
}); // test old key failover
36+
setPrivateKeys('invalid-key', privateKey); // test old key failover
3937
config.npmrc =
4038
'//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n';
4139
config.encrypted = {
@@ -48,7 +46,7 @@ describe('config/decrypt/legacy', () => {
4846
});
4947

5048
it('appends npm token in npmrc', async () => {
51-
GlobalConfig.set({ privateKey });
49+
setPrivateKeys(privateKey, undefined);
5250
config.npmrc = 'foo=bar\n';
5351
config.encrypted = {
5452
npmToken:
@@ -60,7 +58,7 @@ describe('config/decrypt/legacy', () => {
6058
});
6159

6260
it('decrypts nested', async () => {
63-
GlobalConfig.set({ privateKey });
61+
setPrivateKeys(privateKey, undefined);
6462
config.packageFiles = [
6563
{
6664
packageFile: 'package.json',

lib/config/decrypt/openpgp.spec.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CONFIG_VALIDATION } from '../../constants/error-messages';
2-
import { decryptConfig } from '../decrypt';
2+
import { decryptConfig, setPrivateKeys } from '../decrypt';
33
import { GlobalConfig } from '../global';
44
import type { RenovateConfig } from '../types';
55
import { Fixtures } from '~test/fixtures';
@@ -19,10 +19,11 @@ describe('config/decrypt/openpgp', () => {
1919
vi.resetModules();
2020
config = {};
2121
GlobalConfig.reset();
22+
setPrivateKeys(undefined, undefined);
2223
});
2324

2425
it('rejects invalid PGP message', async () => {
25-
GlobalConfig.set({ privateKey });
26+
setPrivateKeys(privateKey, undefined);
2627
config.encrypted = {
2728
token:
2829
'long-but-wrong-wcFMAw+4H7SgaqGOAQ//ZNPgHJ4RQBdfFoDX8Ywe9UxqMlc8k6VasCszQ2JULh/BpEdKdgRUGNaKaeZ+oBKYDBmDwAD5V5FEMlsg+KO2gykp/p2BAwvKGtYK0MtxLh4h9yJbN7TrVnGO3/cC+Inp8exQt0gD6f1Qo/9yQ9NE4/BIbaSs2b2DgeIK7Ed8N675AuSo73UOa6o7t+9pKeAAK5TQwgSvolihbUs8zjnScrLZD+nhvL3y5gpAqK9y//a+bTu6xPA1jdLjsswoCUq/lfVeVsB2GWV2h6eex/0fRKgN7xxNgdMn0a7msrvumhTawP8mPisPY2AAsHRIgQ9vdU5HbOPdGoIwI9n9rMdIRn9Dy7/gcX9Ic+RP2WwS/KnPHLu/CveY4W5bYqYoikWtJs9HsBCyWFiHIRrJF+FnXwtKdoptRfxTfJIkBoLrV6fDIyKo79iL+xxzgrzWs77KEJUJfexZBEGBCnrV2o7mo3SU197S0qx7HNvqrmeCj8CLxq8opXC71TNa+XE6BQUVyhMFxtW9LNxZUHRiNzrTSikArT4hzjyr3f9cb0kZVcs6XJQsm1EskU3WXo7ETD7nsukS9GfbwMn7tfYidB/yHSHl09ih871BcgByDmEKKdmamcNilW2bmTAqB5JmtaYT5/H8jRQWo/VGrEqlmiA4KmwSv7SZPlDnaDFrmzmMZZDSRgHe5KWl283XLmSeE8J0NPqwFH3PeOv4fIbOjJrnbnFBwSAsgsMe2K4OyFDh2COfrho7s8EP1Kl5lBkYJ+VRreGRerdSu24',
@@ -63,7 +64,7 @@ describe('config/decrypt/openpgp', () => {
6364
});
6465

6566
it('handles PGP org constraint', async () => {
66-
GlobalConfig.set({ privateKey });
67+
setPrivateKeys(privateKey, undefined);
6768
config.encrypted = {
6869
token:
6970
'wcFMAw+4H7SgaqGOAQ/+Lz6RlbEymbnmMhrktuaGiDPWRNPEQFuMRwwYM6/B/r0JMZa9tskAA5RpyYKxGmJJeuRtlA8GkTw02GoZomlJf/KXJZ95FwSbkXMSRJRD8LJ2402Hw2TaOTaSvfamESnm8zhNo8cok627nkKQkyrpk64heVlU5LIbO2+UgYgbiSQjuXZiW+QuJ1hVRjx011FQgEYc59+22yuKYqd8rrni7TrVqhGRlHCAqvNAGjBI4H7uTFh0sP4auunT/JjxTeTkJoNu8KgS/LdrvISpO67TkQziZo9XD5FOzSN7N3e4f8vO4N4fpjgkIDH/9wyEYe0zYz34xMAFlnhZzqrHycRqzBJuMxGqlFQcKWp9IisLMoVJhLrnvbDLuwwcjeqYkhvODjSs7UDKwTE4X4WmvZr0x4kOclOeAAz/pM6oNVnjgWJd9SnYtoa67bZVkne0k6mYjVhosie8v8icijmJ4OyLZUGWnjZCRd/TPkzQUw+B0yvsop9FYGidhCI+4MVx6W5w7SRtCctxVfCjLpmU4kWaBUUJ5YIQ5xm55yxEYuAsQkxOAYDCMFlV8ntWStYwIG1FsBgJX6VPevXuPPMjWiPNedIpJwBH2PLB4blxMfzDYuCeaIqU4daDaEWxxpuFTTK9fLdJKuipwFG6rwE3OuijeSN+2SLszi834DXtUjQdikHSTQG392+oTmZCFPeffLk/OiV2VpdXF3gGL7sr5M9hOWIZ783q0vW1l6nAElZ7UA//kW+L6QRxbnBVTJK5eCmMY6RJmL76zjqC1jQ0FC10',
@@ -77,7 +78,7 @@ describe('config/decrypt/openpgp', () => {
7778
});
7879

7980
it('handles PGP multi-org constraint', async () => {
80-
GlobalConfig.set({ privateKey });
81+
setPrivateKeys(privateKey, undefined);
8182
config.encrypted = {
8283
token:
8384
'wcFMAw+4H7SgaqGOAQ//Yk4RTQoLEhO0TKxN2IUBrCi88ts+CG1SXKeL06sJ2qikN/3n2JYAGGKgkHRICfu5dOnsjyFdLJ1XWUrbsM3XgVWikMbrmzD1Xe7N5DsoZXlt4Wa9pZ+IkZuE6XcKKu9whIJ22ciEwCzFwDmk/CBshdCCVVQ3IYuM6uibEHn/AHQ8K15XhraiSzF6DbJpevs5Cy7b5YHFyE936H25CVnouUQnMPsirpQq3pYeMq/oOtV/m4mfRUUQ7MUxvtrwE4lq4hLjFu5n9rwlcqaFPl7I7BEM++1c9LFpYsP5mTS7hHCZ9wXBqER8fa3fKYx0bK1ihCpjP4zUkR7P/uhWDArXamv7gHX2Kj/Qsbegn7KjTdZlggAmaJl/CuSgCbhySy+E55g3Z1QFajiLRpQ5+RsWFDbbI08YEgzyQ0yNCaRvrkgo7kZ1D95rEGRfY96duOQbjzOEqtvYmFChdemZ2+f9Kh/JH1+X9ynxY/zYe/0p/U7WD3QNTYN18loc4aXiB1adXD5Ka2QfNroLudQBmLaJpJB6wASFfuxddsD5yRnO32NSdRaqIWC1x6ti3ZYJZ2RsNwJExPDzjpQTuMOH2jtpu3q7NHmW3snRKy2YAL2UjI0YdeKIlhc/qLCJt9MRcOxWYvujTMD/yGprhG44qf0jjMkJBu7NjuVIMONujabl9b7SUQGfO/t+3rMuC68bQdCGLlO8gf3hvtD99utzXphi6idjC0HKSW/9KzuMkm+syGmIAYq/0L3EFvpZ38uq7z8KzwFFQHI3sBA34bNEr5zpU5OMWg',
@@ -94,7 +95,7 @@ describe('config/decrypt/openpgp', () => {
9495
});
9596

9697
it('handles PGP org/repo constraint', async () => {
97-
GlobalConfig.set({ privateKey });
98+
setPrivateKeys(privateKey, undefined);
9899
config.encrypted = {
99100
token:
100101
'wcFMAw+4H7SgaqGOAQ//Wp7N0PaDZp0uOdwsc1CuqAq0UPcq+IQdHyKpJs3tHiCecXBHogy4P+rY9nGaUrVneCr4HexuKGuyJf1yl0ZqFffAUac5PjF8eDvjukQGOUq4aBlOogJCEefnuuVxVJx+NRR5iF1P6v57bmI1c+zoqZI/EQB30KU6O1BsdGPLUA/+R3dwCZd5Mbd36s34eYBasqcY9/QbqFcpElXMEPMse3kMCsVXPbZ+UMjtPJiBPUmtJq+ifnu1LzDrfshusSQMwgd/QNk7nEsijiYKllkWhHTP6g7zigvJ46x0h6AYS108YiuK3B9XUhXN9m05Ac6KTEEUdRI3E/dK2dQuRkLjXC8wceQm4A19Gm0uHoMIJYOCbiVoBCH6ayvKbZWZV5lZ4D1JbDNGmKeIj6OX9XWEMKiwTx0Xe89V7BdJzwIGrL0TCLtXuYWZ/R2k+UuBqtgzr44BsBqMpKUA0pcGBoqsEou1M05Ae9fJMF6ADezF5UQZPxT1hrMldiTp3p9iHGfWN2tKHeoW/8CqlIqg9JEkTc+Pl/L9E6ndy5Zjf097PvcmSGhxUQBE7XlrZoIlGhiEU/1HPMen0UUIs0LUu1ywpjCex2yTWnU2YmEwy0MQI1sekSr96QFxDDz9JcynYOYbqR/X9pdxEWyzQ+NJ3n6K97nE1Dj9Sgwu7mFGiUdNkf/SUAF0eZi/eXg71qumpMGBd4eWPtgkeMPLHjvMSYw9vBUfcoKFz6RJ4woG0dw5HOFkPnIjXKWllnl/o01EoBp/o8uswsIS9Nb8i+bp27U6tAHE',
@@ -108,7 +109,7 @@ describe('config/decrypt/openpgp', () => {
108109
});
109110

110111
it('handles PGP multi-org/repo constraint', async () => {
111-
GlobalConfig.set({ privateKey });
112+
setPrivateKeys(privateKey, undefined);
112113
config.encrypted = {
113114
token:
114115
'wcFMAw+4H7SgaqGOARAAibXL3zr0KZawiND868UGdPpGRo1aVZfn0NUBHpm8mXfgB1rBHaLsP7qa8vxDHpwH9DRD1IyB4vvPUwtu7wmuv1Vtr596tD40CCcCZYB5JjZLWRF0O0xaZFCOi7Z9SqqdaOQoMScyvPO+3/lJkS7zmLllJFH0mQoX5Cr+owUAMSWqbeCQ9r/KAXpnhmpraDjTav48WulcdTMc8iQ/DHimcdzHErLOAjtiQi4OUe1GnDCcN76KQ+c+ZHySnkXrYi/DhOOu9qB4glJ5n68NueFja+8iR39z/wqCI6V6TIUiOyjFN86iVyNPQ4Otem3KuNwrnwSABLDqP491eUNjT8DUDffsyhNC9lnjQLmtViK0EN2yLVpMdHq9cq8lszBChB7gobD9rm8nUHnTuLf6yJvZOj6toD5Yqj8Ibj58wN90Q8CUsBp9/qp0J+hBVUPOx4sT6kM2p6YarlgX3mrIW5c1U+q1eDbCddLjHiU5cW7ja7o+cqlA6mbDRu3HthjBweiXTicXZcRu1o/wy/+laQQ95x5FzAXDnOwQUHBmpTDI3tUJvQ+oy8XyBBbyC0LsBye2c2SLkPJ4Ai3IMR+Mh8puSzVywTbneiAQNBzJHlj5l85nCF2tUjvNo3dWC+9mU5sfXg11iEC6LRbg+icjpqRtTjmQURtciKDUbibWacwU5T/SVAGPXnW7adBOS0PZPIZQcSwjchOdOl0IjzBy6ofu7ODdn2CXZXi8zbevTICXsHvjnW4MAj5oXrStxK3LkWyM3YBOLe7sOfWvWz7n9TM3dHg032navQ',

lib/config/global.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ export class GlobalConfig {
2727
'localDir',
2828
'migratePresets',
2929
'presetCachePersistence',
30-
'privateKey',
31-
'privateKeyOld',
3230
'gitTimeout',
3331
'platform',
3432
'endpoint',

lib/config/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ export interface GlobalOnlyConfig {
120120
mergeConfidenceEndpoint?: string;
121121
platform?: PlatformId;
122122
prCommitsPerRunLimit?: number;
123+
privateKey?: string;
124+
privateKeyOld?: string;
123125
privateKeyPath?: string;
124126
privateKeyPathOld?: string;
125127
redisPrefix?: string;
@@ -160,8 +162,6 @@ export interface RepoGlobalConfig {
160162
migratePresets?: Record<string, string>;
161163
platform?: PlatformId;
162164
presetCachePersistence?: boolean;
163-
privateKey?: string;
164-
privateKeyOld?: string;
165165
httpCacheTtlDays?: number;
166166
autodiscoverRepoSort?: RepoSortMethod;
167167
autodiscoverRepoOrder?: SortMethod;

lib/workers/global/config/parse/index.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import upath from 'upath';
2+
import * as _decrypt from '../../../../config/decrypt';
23
import { getCustomEnv } from '../../../../util/env';
34
import { getParentDir, readSystemFile } from '../../../../util/fs';
45
import getArgv from './__fixtures__/argv';
56
import * as _hostRulesFromEnv from './host-rules-from-env';
67

78
vi.mock('../../../../modules/datasource/npm');
89
vi.mock('../../../../util/fs');
10+
vi.mock('../../../../config/decrypt');
911
vi.mock('./host-rules-from-env');
1012

13+
const decrypt = vi.mocked(_decrypt);
14+
1115
const { hostRulesFromEnv } = vi.mocked(_hostRulesFromEnv);
1216

1317
describe('workers/global/config/parse/index', () => {
@@ -109,7 +113,8 @@ describe('workers/global/config/parse/index', () => {
109113
const expected = await readSystemFile(privateKeyPath, 'utf8');
110114
const parsedConfig = await configParser.parseConfigs(env, defaultArgv);
111115

112-
expect(parsedConfig).toContainEntries([['privateKey', expected]]);
116+
expect(parsedConfig.privateKey).toBeUndefined();
117+
expect(decrypt.setPrivateKeys).toHaveBeenCalledWith(expected, undefined);
113118
});
114119

115120
it('supports Bitbucket username/password', async () => {

lib/workers/global/config/parse/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import is from '@sindresorhus/is';
2+
import { setPrivateKeys } from '../../../../config/decrypt';
23
import * as defaultsParser from '../../../../config/defaults';
34
import { applySecretsToConfig } from '../../../../config/secrets';
45
import type { AllConfig } from '../../../../config/types';
@@ -61,8 +62,12 @@ export async function parseConfigs(
6162
delete config.privateKeyPathOld;
6263
}
6364

65+
// Add private keys for sanitizing then set and delete them
6466
addSecretForSanitizing(config.privateKey, 'global');
6567
addSecretForSanitizing(config.privateKeyOld, 'global');
68+
setPrivateKeys(config.privateKey, config.privateKeyOld);
69+
delete config.privateKey;
70+
delete config.privateKeyOld;
6671

6772
if (config.logContext) {
6873
// This only has an effect if logContext was defined via file or CLI, otherwise it would already have been detected in env

0 commit comments

Comments
 (0)