@salesforce/core 3.31.7 → 3.31.9

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.
Files changed (153) hide show
  1. package/LICENSE.txt +11 -11
  2. package/README.md +222 -222
  3. package/lib/config/aliasesConfig.d.ts +12 -12
  4. package/lib/config/aliasesConfig.js +27 -27
  5. package/lib/config/authInfoConfig.d.ts +19 -19
  6. package/lib/config/authInfoConfig.js +34 -34
  7. package/lib/config/config.d.ts +311 -311
  8. package/lib/config/config.js +574 -574
  9. package/lib/config/configAggregator.d.ts +232 -232
  10. package/lib/config/configAggregator.js +379 -379
  11. package/lib/config/configFile.d.ts +199 -199
  12. package/lib/config/configFile.js +340 -340
  13. package/lib/config/configGroup.d.ts +141 -141
  14. package/lib/config/configGroup.js +224 -224
  15. package/lib/config/configStore.d.ts +241 -241
  16. package/lib/config/configStore.js +352 -352
  17. package/lib/config/envVars.d.ts +101 -101
  18. package/lib/config/envVars.js +456 -456
  19. package/lib/config/orgUsersConfig.d.ts +31 -31
  20. package/lib/config/orgUsersConfig.js +41 -41
  21. package/lib/config/sandboxOrgConfig.d.ts +37 -37
  22. package/lib/config/sandboxOrgConfig.js +50 -50
  23. package/lib/config/sandboxProcessCache.d.ts +16 -16
  24. package/lib/config/sandboxProcessCache.js +37 -37
  25. package/lib/config/tokensConfig.d.ts +10 -10
  26. package/lib/config/tokensConfig.js +28 -28
  27. package/lib/config/ttlConfig.d.ts +34 -34
  28. package/lib/config/ttlConfig.js +54 -54
  29. package/lib/crypto/crypto.d.ts +54 -54
  30. package/lib/crypto/crypto.js +220 -220
  31. package/lib/crypto/keyChain.d.ts +8 -8
  32. package/lib/crypto/keyChain.js +61 -61
  33. package/lib/crypto/keyChainImpl.d.ts +116 -116
  34. package/lib/crypto/keyChainImpl.js +486 -486
  35. package/lib/crypto/secureBuffer.d.ts +46 -46
  36. package/lib/crypto/secureBuffer.js +82 -82
  37. package/lib/deviceOauthService.d.ts +71 -71
  38. package/lib/deviceOauthService.js +191 -191
  39. package/lib/exported.d.ts +38 -38
  40. package/lib/exported.js +118 -118
  41. package/lib/global.d.ts +70 -70
  42. package/lib/global.js +109 -109
  43. package/lib/lifecycleEvents.d.ts +93 -93
  44. package/lib/lifecycleEvents.js +188 -188
  45. package/lib/logger.d.ts +381 -381
  46. package/lib/logger.js +734 -734
  47. package/lib/messages.d.ts +291 -291
  48. package/lib/messages.js +543 -543
  49. package/lib/org/authInfo.d.ts +344 -344
  50. package/lib/org/authInfo.js +892 -892
  51. package/lib/org/authRemover.d.ts +88 -88
  52. package/lib/org/authRemover.js +182 -182
  53. package/lib/org/connection.d.ts +197 -197
  54. package/lib/org/connection.js +395 -395
  55. package/lib/org/index.d.ts +6 -6
  56. package/lib/org/index.js +28 -28
  57. package/lib/org/org.d.ts +558 -558
  58. package/lib/org/org.js +1267 -1267
  59. package/lib/org/orgConfigProperties.d.ts +69 -69
  60. package/lib/org/orgConfigProperties.js +136 -136
  61. package/lib/org/permissionSetAssignment.d.ts +35 -35
  62. package/lib/org/permissionSetAssignment.js +125 -125
  63. package/lib/org/scratchOrgCache.d.ts +20 -20
  64. package/lib/org/scratchOrgCache.js +32 -32
  65. package/lib/org/scratchOrgCreate.d.ts +54 -54
  66. package/lib/org/scratchOrgCreate.js +216 -216
  67. package/lib/org/scratchOrgErrorCodes.d.ts +10 -10
  68. package/lib/org/scratchOrgErrorCodes.js +88 -88
  69. package/lib/org/scratchOrgFeatureDeprecation.d.ts +26 -26
  70. package/lib/org/scratchOrgFeatureDeprecation.js +109 -109
  71. package/lib/org/scratchOrgInfoApi.d.ts +68 -68
  72. package/lib/org/scratchOrgInfoApi.js +416 -413
  73. package/lib/org/scratchOrgInfoGenerator.d.ts +64 -64
  74. package/lib/org/scratchOrgInfoGenerator.js +241 -241
  75. package/lib/org/scratchOrgLifecycleEvents.d.ts +10 -10
  76. package/lib/org/scratchOrgLifecycleEvents.js +40 -40
  77. package/lib/org/scratchOrgSettingsGenerator.d.ts +78 -78
  78. package/lib/org/scratchOrgSettingsGenerator.js +276 -276
  79. package/lib/org/scratchOrgTypes.d.ts +43 -43
  80. package/lib/org/scratchOrgTypes.js +8 -8
  81. package/lib/org/user.d.ts +187 -187
  82. package/lib/org/user.js +448 -448
  83. package/lib/schema/printer.d.ts +79 -79
  84. package/lib/schema/printer.js +260 -260
  85. package/lib/schema/validator.d.ts +70 -70
  86. package/lib/schema/validator.js +169 -169
  87. package/lib/sfError.d.ts +73 -73
  88. package/lib/sfError.js +136 -136
  89. package/lib/sfProject.d.ts +357 -357
  90. package/lib/sfProject.js +671 -671
  91. package/lib/stateAggregator/accessors/aliasAccessor.d.ts +98 -98
  92. package/lib/stateAggregator/accessors/aliasAccessor.js +145 -145
  93. package/lib/stateAggregator/accessors/orgAccessor.d.ts +101 -101
  94. package/lib/stateAggregator/accessors/orgAccessor.js +240 -240
  95. package/lib/stateAggregator/accessors/sandboxAccessor.d.ts +8 -8
  96. package/lib/stateAggregator/accessors/sandboxAccessor.js +27 -27
  97. package/lib/stateAggregator/accessors/tokenAccessor.d.ts +63 -63
  98. package/lib/stateAggregator/accessors/tokenAccessor.js +79 -79
  99. package/lib/stateAggregator/index.d.ts +4 -4
  100. package/lib/stateAggregator/index.js +26 -26
  101. package/lib/stateAggregator/stateAggregator.d.ts +25 -25
  102. package/lib/stateAggregator/stateAggregator.js +45 -45
  103. package/lib/status/myDomainResolver.d.ts +66 -66
  104. package/lib/status/myDomainResolver.js +124 -124
  105. package/lib/status/pollingClient.d.ts +85 -85
  106. package/lib/status/pollingClient.js +115 -115
  107. package/lib/status/streamingClient.d.ts +244 -244
  108. package/lib/status/streamingClient.js +436 -436
  109. package/lib/status/types.d.ts +89 -89
  110. package/lib/status/types.js +17 -17
  111. package/lib/testSetup.d.ts +553 -553
  112. package/lib/testSetup.js +871 -871
  113. package/lib/util/cache.d.ts +11 -11
  114. package/lib/util/cache.js +69 -69
  115. package/lib/util/checkLightningDomain.d.ts +1 -1
  116. package/lib/util/checkLightningDomain.js +28 -28
  117. package/lib/util/directoryWriter.d.ts +12 -12
  118. package/lib/util/directoryWriter.js +53 -53
  119. package/lib/util/getJwtAudienceUrl.d.ts +4 -4
  120. package/lib/util/getJwtAudienceUrl.js +18 -18
  121. package/lib/util/internal.d.ts +58 -58
  122. package/lib/util/internal.js +118 -118
  123. package/lib/util/jsonXmlTools.d.ts +14 -14
  124. package/lib/util/jsonXmlTools.js +38 -38
  125. package/lib/util/mapKeys.d.ts +14 -14
  126. package/lib/util/mapKeys.js +51 -51
  127. package/lib/util/sfdc.d.ts +52 -52
  128. package/lib/util/sfdc.js +85 -85
  129. package/lib/util/sfdcUrl.d.ts +72 -72
  130. package/lib/util/sfdcUrl.js +215 -215
  131. package/lib/util/structuredWriter.d.ts +9 -9
  132. package/lib/util/structuredWriter.js +2 -2
  133. package/lib/util/zipWriter.d.ts +16 -16
  134. package/lib/util/zipWriter.js +67 -67
  135. package/lib/webOAuthServer.d.ts +156 -156
  136. package/lib/webOAuthServer.js +388 -388
  137. package/messages/auth.md +37 -37
  138. package/messages/config.md +156 -156
  139. package/messages/connection.md +30 -30
  140. package/messages/core.json +20 -20
  141. package/messages/core.md +67 -67
  142. package/messages/encryption.md +85 -85
  143. package/messages/envVars.md +303 -303
  144. package/messages/org.md +63 -63
  145. package/messages/permissionSetAssignment.md +31 -31
  146. package/messages/scratchOrgCreate.md +23 -23
  147. package/messages/scratchOrgErrorCodes.md +115 -115
  148. package/messages/scratchOrgFeatureDeprecation.md +11 -11
  149. package/messages/scratchOrgInfoApi.md +19 -15
  150. package/messages/scratchOrgInfoGenerator.md +23 -23
  151. package/messages/streaming.md +23 -23
  152. package/messages/user.md +35 -35
  153. package/package.json +97 -97
@@ -1,55 +1,55 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2022, salesforce.com, inc.
4
- * All rights reserved.
5
- * Licensed under the BSD 3-Clause license.
6
- * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.TTLConfig = void 0;
10
- const configFile_1 = require("./configFile");
11
- /**
12
- * A Time To Live configuration file where each entry is timestamped and removed once the TTL has expired.
13
- *
14
- * @example
15
- * ```
16
- * import { Duration } from '@salesforce/kit';
17
- * const config = await TTLConfig.create({
18
- * isGlobal: false,
19
- * ttl: Duration.days(1)
20
- * });
21
- * ```
22
- */
23
- class TTLConfig extends configFile_1.ConfigFile {
24
- set(key, value) {
25
- super.set(key, this.timestamp(value));
26
- }
27
- getLatestEntry() {
28
- const entries = this.entries();
29
- const sorted = entries.sort(([, valueA], [, valueB]) => new Date(valueB.timestamp).getTime() - new Date(valueA.timestamp).getTime());
30
- return sorted.length > 0 ? sorted[0] : null;
31
- }
32
- getLatestKey() {
33
- const [key] = this.getLatestEntry() ?? [null];
34
- return key;
35
- }
36
- isExpired(dateTime, value) {
37
- return dateTime - new Date(value.timestamp).getTime() > this.options.ttl.milliseconds;
38
- }
39
- async init() {
40
- const contents = await this.read(this.options.throwOnNotFound);
41
- const purged = {};
42
- const date = new Date().getTime();
43
- for (const [key, opts] of Object.entries(contents)) {
44
- if (!this.isExpired(date, opts))
45
- purged[key] = opts;
46
- }
47
- this.setContents(purged);
48
- }
49
- // eslint-disable-next-line class-methods-use-this
50
- timestamp(value) {
51
- return { ...value, timestamp: new Date().toISOString() };
52
- }
53
- }
54
- exports.TTLConfig = TTLConfig;
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022, salesforce.com, inc.
4
+ * All rights reserved.
5
+ * Licensed under the BSD 3-Clause license.
6
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TTLConfig = void 0;
10
+ const configFile_1 = require("./configFile");
11
+ /**
12
+ * A Time To Live configuration file where each entry is timestamped and removed once the TTL has expired.
13
+ *
14
+ * @example
15
+ * ```
16
+ * import { Duration } from '@salesforce/kit';
17
+ * const config = await TTLConfig.create({
18
+ * isGlobal: false,
19
+ * ttl: Duration.days(1)
20
+ * });
21
+ * ```
22
+ */
23
+ class TTLConfig extends configFile_1.ConfigFile {
24
+ set(key, value) {
25
+ super.set(key, this.timestamp(value));
26
+ }
27
+ getLatestEntry() {
28
+ const entries = this.entries();
29
+ const sorted = entries.sort(([, valueA], [, valueB]) => new Date(valueB.timestamp).getTime() - new Date(valueA.timestamp).getTime());
30
+ return sorted.length > 0 ? sorted[0] : null;
31
+ }
32
+ getLatestKey() {
33
+ const [key] = this.getLatestEntry() ?? [null];
34
+ return key;
35
+ }
36
+ isExpired(dateTime, value) {
37
+ return dateTime - new Date(value.timestamp).getTime() > this.options.ttl.milliseconds;
38
+ }
39
+ async init() {
40
+ const contents = await this.read(this.options.throwOnNotFound);
41
+ const purged = {};
42
+ const date = new Date().getTime();
43
+ for (const [key, opts] of Object.entries(contents)) {
44
+ if (!this.isExpired(date, opts))
45
+ purged[key] = opts;
46
+ }
47
+ this.setContents(purged);
48
+ }
49
+ // eslint-disable-next-line class-methods-use-this
50
+ timestamp(value) {
51
+ return { ...value, timestamp: new Date().toISOString() };
52
+ }
53
+ }
54
+ exports.TTLConfig = TTLConfig;
55
55
  //# sourceMappingURL=ttlConfig.js.map
@@ -1,54 +1,54 @@
1
- import { AsyncOptionalCreatable } from '@salesforce/kit';
2
- import { KeyChain } from './keyChainImpl';
3
- interface CryptoOptions {
4
- keychain?: KeyChain;
5
- platform?: string;
6
- retryStatus?: string;
7
- noResetOnClose?: boolean;
8
- }
9
- /**
10
- * Class for managing encrypting and decrypting private auth information.
11
- */
12
- export declare class Crypto extends AsyncOptionalCreatable<CryptoOptions> {
13
- private key;
14
- private options;
15
- private noResetOnClose;
16
- /**
17
- * Constructor
18
- * **Do not directly construct instances of this class -- use {@link Crypto.create} instead.**
19
- *
20
- * @param options The options for the class instance.
21
- * @ignore
22
- */
23
- constructor(options?: CryptoOptions);
24
- /**
25
- * Encrypts text. Returns the encrypted string or undefined if no string was passed.
26
- *
27
- * @param text The text to encrypt.
28
- */
29
- encrypt(text: string): string;
30
- /**
31
- * Decrypts text.
32
- *
33
- * @param text The text to decrypt.
34
- */
35
- decrypt(text: string): string;
36
- /**
37
- * Takes a best guess if the value provided was encrypted by {@link Crypto.encrypt} by
38
- * checking the delimiter, tag length, and valid characters.
39
- *
40
- * @param text The text
41
- * @returns true if the text is encrypted, false otherwise.
42
- */
43
- isEncrypted(text?: string): boolean;
44
- /**
45
- * Clears the crypto state. This should be called in a finally block.
46
- */
47
- close(): void;
48
- /**
49
- * Initialize async components.
50
- */
51
- protected init(): Promise<void>;
52
- private getKeyChain;
53
- }
54
- export {};
1
+ import { AsyncOptionalCreatable } from '@salesforce/kit';
2
+ import { KeyChain } from './keyChainImpl';
3
+ interface CryptoOptions {
4
+ keychain?: KeyChain;
5
+ platform?: string;
6
+ retryStatus?: string;
7
+ noResetOnClose?: boolean;
8
+ }
9
+ /**
10
+ * Class for managing encrypting and decrypting private auth information.
11
+ */
12
+ export declare class Crypto extends AsyncOptionalCreatable<CryptoOptions> {
13
+ private key;
14
+ private options;
15
+ private noResetOnClose;
16
+ /**
17
+ * Constructor
18
+ * **Do not directly construct instances of this class -- use {@link Crypto.create} instead.**
19
+ *
20
+ * @param options The options for the class instance.
21
+ * @ignore
22
+ */
23
+ constructor(options?: CryptoOptions);
24
+ /**
25
+ * Encrypts text. Returns the encrypted string or undefined if no string was passed.
26
+ *
27
+ * @param text The text to encrypt.
28
+ */
29
+ encrypt(text: string): string;
30
+ /**
31
+ * Decrypts text.
32
+ *
33
+ * @param text The text to decrypt.
34
+ */
35
+ decrypt(text: string): string;
36
+ /**
37
+ * Takes a best guess if the value provided was encrypted by {@link Crypto.encrypt} by
38
+ * checking the delimiter, tag length, and valid characters.
39
+ *
40
+ * @param text The text
41
+ * @returns true if the text is encrypted, false otherwise.
42
+ */
43
+ isEncrypted(text?: string): boolean;
44
+ /**
45
+ * Clears the crypto state. This should be called in a finally block.
46
+ */
47
+ close(): void;
48
+ /**
49
+ * Initialize async components.
50
+ */
51
+ protected init(): Promise<void>;
52
+ private getKeyChain;
53
+ }
54
+ export {};
@@ -1,221 +1,221 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2020, salesforce.com, inc.
4
- * All rights reserved.
5
- * Licensed under the BSD 3-Clause license.
6
- * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
- */
8
- /* eslint-disable @typescript-eslint/ban-types */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.Crypto = void 0;
11
- const crypto = require("crypto");
12
- const os = require("os");
13
- const path_1 = require("path");
14
- const ts_types_1 = require("@salesforce/ts-types");
15
- const kit_1 = require("@salesforce/kit");
16
- const logger_1 = require("../logger");
17
- const messages_1 = require("../messages");
18
- const cache_1 = require("../util/cache");
19
- const global_1 = require("../global");
20
- const keyChain_1 = require("./keyChain");
21
- const secureBuffer_1 = require("./secureBuffer");
22
- const TAG_DELIMITER = ':';
23
- const BYTE_COUNT_FOR_IV = 6;
24
- const ALGO = 'aes-256-gcm';
25
- const AUTH_TAG_LENGTH = 32;
26
- const ENCRYPTED_CHARS = /[a-f0-9]/;
27
- const KEY_NAME = 'sfdx';
28
- const ACCOUNT = 'local';
29
- messages_1.Messages.importMessagesDirectory((0, path_1.join)(__dirname));
30
- const messages = messages_1.Messages.load('@salesforce/core', 'encryption', [
31
- 'keychainPasswordCreationError',
32
- 'invalidEncryptedFormatError',
33
- 'authDecryptError',
34
- 'macKeychainOutOfSync',
35
- ]);
36
- const makeSecureBuffer = (password) => {
37
- const newSb = new secureBuffer_1.SecureBuffer();
38
- newSb.consume(Buffer.from((0, ts_types_1.ensure)(password), 'utf8'));
39
- return newSb;
40
- };
41
- /**
42
- * osxKeyChain promise wrapper.
43
- */
44
- const keychainPromises = {
45
- /**
46
- * Gets a password item.
47
- *
48
- * @param _keychain
49
- * @param service The keychain service name.
50
- * @param account The keychain account name.
51
- */
52
- getPassword(_keychain, service, account) {
53
- const cacheKey = `${global_1.Global.DIR}:${service}:${account}`;
54
- const sb = cache_1.Cache.get(cacheKey);
55
- if (!sb) {
56
- return new Promise((resolve, reject) => _keychain.getPassword({ service, account }, (err, password) => {
57
- if (err)
58
- return reject(err);
59
- cache_1.Cache.set(cacheKey, makeSecureBuffer(password));
60
- return resolve({ username: account, password: (0, ts_types_1.ensure)(password) });
61
- }));
62
- }
63
- else {
64
- const pw = sb.value((buffer) => buffer.toString('utf8'));
65
- cache_1.Cache.set(cacheKey, makeSecureBuffer(pw));
66
- return new Promise((resolve) => resolve({ username: account, password: (0, ts_types_1.ensure)(pw) }));
67
- }
68
- },
69
- /**
70
- * Sets a generic password item in OSX keychain.
71
- *
72
- * @param _keychain
73
- * @param service The keychain service name.
74
- * @param account The keychain account name.
75
- * @param password The password for the keychain item.
76
- */
77
- setPassword(_keychain, service, account, password) {
78
- return new Promise((resolve, reject) => _keychain.setPassword({ service, account, password }, (err) => {
79
- if (err)
80
- return reject(err);
81
- return resolve({ username: account, password });
82
- }));
83
- },
84
- };
85
- /**
86
- * Class for managing encrypting and decrypting private auth information.
87
- */
88
- class Crypto extends kit_1.AsyncOptionalCreatable {
89
- /**
90
- * Constructor
91
- * **Do not directly construct instances of this class -- use {@link Crypto.create} instead.**
92
- *
93
- * @param options The options for the class instance.
94
- * @ignore
95
- */
96
- constructor(options) {
97
- super(options);
98
- this.key = new secureBuffer_1.SecureBuffer();
99
- this.options = options ?? {};
100
- }
101
- encrypt(text) {
102
- if (text == null) {
103
- return;
104
- }
105
- if (this.key == null) {
106
- throw messages.createError('keychainPasswordCreationError');
107
- }
108
- const iv = crypto.randomBytes(BYTE_COUNT_FOR_IV).toString('hex');
109
- return this.key.value((buffer) => {
110
- const cipher = crypto.createCipheriv(ALGO, buffer.toString('utf8'), iv);
111
- let encrypted = cipher.update(text, 'utf8', 'hex');
112
- encrypted += cipher.final('hex');
113
- const tag = cipher.getAuthTag().toString('hex');
114
- return `${iv}${encrypted}${TAG_DELIMITER}${tag}`;
115
- });
116
- }
117
- decrypt(text) {
118
- if (text == null) {
119
- return;
120
- }
121
- const tokens = text.split(TAG_DELIMITER);
122
- if (tokens.length !== 2) {
123
- throw messages.createError('invalidEncryptedFormatError');
124
- }
125
- const tag = tokens[1];
126
- const iv = tokens[0].substring(0, BYTE_COUNT_FOR_IV * 2);
127
- const secret = tokens[0].substring(BYTE_COUNT_FOR_IV * 2, tokens[0].length);
128
- return this.key.value((buffer) => {
129
- const decipher = crypto.createDecipheriv(ALGO, buffer.toString('utf8'), iv);
130
- let dec;
131
- try {
132
- decipher.setAuthTag(Buffer.from(tag, 'hex'));
133
- dec = decipher.update(secret, 'hex', 'utf8');
134
- dec += decipher.final('utf8');
135
- }
136
- catch (err) {
137
- const error = messages.createError('authDecryptError', [err.message], [], err);
138
- const useGenericUnixKeychain = kit_1.env.getBoolean('SFDX_USE_GENERIC_UNIX_KEYCHAIN') || kit_1.env.getBoolean('USE_GENERIC_UNIX_KEYCHAIN');
139
- if (os.platform() === 'darwin' && !useGenericUnixKeychain) {
140
- error.actions = [messages.getMessage('macKeychainOutOfSync')];
141
- }
142
- throw error;
143
- }
144
- return dec;
145
- });
146
- }
147
- /**
148
- * Takes a best guess if the value provided was encrypted by {@link Crypto.encrypt} by
149
- * checking the delimiter, tag length, and valid characters.
150
- *
151
- * @param text The text
152
- * @returns true if the text is encrypted, false otherwise.
153
- */
154
- // eslint-disable-next-line class-methods-use-this
155
- isEncrypted(text) {
156
- if (text == null) {
157
- return false;
158
- }
159
- const tokens = text.split(TAG_DELIMITER);
160
- if (tokens.length !== 2) {
161
- return false;
162
- }
163
- const tag = tokens[1];
164
- const value = tokens[0];
165
- return (tag.length === AUTH_TAG_LENGTH &&
166
- value.length >= BYTE_COUNT_FOR_IV &&
167
- ENCRYPTED_CHARS.test(tag) &&
168
- ENCRYPTED_CHARS.test(tokens[0]));
169
- }
170
- /**
171
- * Clears the crypto state. This should be called in a finally block.
172
- */
173
- close() {
174
- if (!this.noResetOnClose) {
175
- this.key.clear();
176
- }
177
- }
178
- /**
179
- * Initialize async components.
180
- */
181
- async init() {
182
- const logger = await logger_1.Logger.child('crypto');
183
- if (!this.options.platform) {
184
- this.options.platform = os.platform();
185
- }
186
- logger.debug(`retryStatus: ${this.options.retryStatus}`);
187
- this.noResetOnClose = !!this.options.noResetOnClose;
188
- try {
189
- this.key.consume(Buffer.from((await keychainPromises.getPassword(await this.getKeyChain(this.options.platform), KEY_NAME, ACCOUNT))
190
- .password, 'utf8'));
191
- }
192
- catch (err) {
193
- // No password found
194
- if (err.name === 'PasswordNotFoundError') {
195
- // If we already tried to create a new key then bail.
196
- if (this.options.retryStatus === 'KEY_SET') {
197
- logger.debug('a key was set but the retry to get the password failed.');
198
- throw err;
199
- }
200
- else {
201
- logger.debug('password not found in keychain attempting to created one and re-init.');
202
- }
203
- const key = crypto.randomBytes(Math.ceil(16)).toString('hex');
204
- // Create a new password in the KeyChain.
205
- await keychainPromises.setPassword((0, ts_types_1.ensure)(this.options.keychain), KEY_NAME, ACCOUNT, key);
206
- return this.init();
207
- }
208
- else {
209
- throw err;
210
- }
211
- }
212
- }
213
- async getKeyChain(platform) {
214
- if (!this.options.keychain) {
215
- this.options.keychain = await (0, keyChain_1.retrieveKeychain)(platform);
216
- }
217
- return this.options.keychain;
218
- }
219
- }
220
- exports.Crypto = Crypto;
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2020, salesforce.com, inc.
4
+ * All rights reserved.
5
+ * Licensed under the BSD 3-Clause license.
6
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
+ */
8
+ /* eslint-disable @typescript-eslint/ban-types */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.Crypto = void 0;
11
+ const crypto = require("crypto");
12
+ const os = require("os");
13
+ const path_1 = require("path");
14
+ const ts_types_1 = require("@salesforce/ts-types");
15
+ const kit_1 = require("@salesforce/kit");
16
+ const logger_1 = require("../logger");
17
+ const messages_1 = require("../messages");
18
+ const cache_1 = require("../util/cache");
19
+ const global_1 = require("../global");
20
+ const keyChain_1 = require("./keyChain");
21
+ const secureBuffer_1 = require("./secureBuffer");
22
+ const TAG_DELIMITER = ':';
23
+ const BYTE_COUNT_FOR_IV = 6;
24
+ const ALGO = 'aes-256-gcm';
25
+ const AUTH_TAG_LENGTH = 32;
26
+ const ENCRYPTED_CHARS = /[a-f0-9]/;
27
+ const KEY_NAME = 'sfdx';
28
+ const ACCOUNT = 'local';
29
+ messages_1.Messages.importMessagesDirectory((0, path_1.join)(__dirname));
30
+ const messages = messages_1.Messages.load('@salesforce/core', 'encryption', [
31
+ 'keychainPasswordCreationError',
32
+ 'invalidEncryptedFormatError',
33
+ 'authDecryptError',
34
+ 'macKeychainOutOfSync',
35
+ ]);
36
+ const makeSecureBuffer = (password) => {
37
+ const newSb = new secureBuffer_1.SecureBuffer();
38
+ newSb.consume(Buffer.from((0, ts_types_1.ensure)(password), 'utf8'));
39
+ return newSb;
40
+ };
41
+ /**
42
+ * osxKeyChain promise wrapper.
43
+ */
44
+ const keychainPromises = {
45
+ /**
46
+ * Gets a password item.
47
+ *
48
+ * @param _keychain
49
+ * @param service The keychain service name.
50
+ * @param account The keychain account name.
51
+ */
52
+ getPassword(_keychain, service, account) {
53
+ const cacheKey = `${global_1.Global.DIR}:${service}:${account}`;
54
+ const sb = cache_1.Cache.get(cacheKey);
55
+ if (!sb) {
56
+ return new Promise((resolve, reject) => _keychain.getPassword({ service, account }, (err, password) => {
57
+ if (err)
58
+ return reject(err);
59
+ cache_1.Cache.set(cacheKey, makeSecureBuffer(password));
60
+ return resolve({ username: account, password: (0, ts_types_1.ensure)(password) });
61
+ }));
62
+ }
63
+ else {
64
+ const pw = sb.value((buffer) => buffer.toString('utf8'));
65
+ cache_1.Cache.set(cacheKey, makeSecureBuffer(pw));
66
+ return new Promise((resolve) => resolve({ username: account, password: (0, ts_types_1.ensure)(pw) }));
67
+ }
68
+ },
69
+ /**
70
+ * Sets a generic password item in OSX keychain.
71
+ *
72
+ * @param _keychain
73
+ * @param service The keychain service name.
74
+ * @param account The keychain account name.
75
+ * @param password The password for the keychain item.
76
+ */
77
+ setPassword(_keychain, service, account, password) {
78
+ return new Promise((resolve, reject) => _keychain.setPassword({ service, account, password }, (err) => {
79
+ if (err)
80
+ return reject(err);
81
+ return resolve({ username: account, password });
82
+ }));
83
+ },
84
+ };
85
+ /**
86
+ * Class for managing encrypting and decrypting private auth information.
87
+ */
88
+ class Crypto extends kit_1.AsyncOptionalCreatable {
89
+ /**
90
+ * Constructor
91
+ * **Do not directly construct instances of this class -- use {@link Crypto.create} instead.**
92
+ *
93
+ * @param options The options for the class instance.
94
+ * @ignore
95
+ */
96
+ constructor(options) {
97
+ super(options);
98
+ this.key = new secureBuffer_1.SecureBuffer();
99
+ this.options = options ?? {};
100
+ }
101
+ encrypt(text) {
102
+ if (text == null) {
103
+ return;
104
+ }
105
+ if (this.key == null) {
106
+ throw messages.createError('keychainPasswordCreationError');
107
+ }
108
+ const iv = crypto.randomBytes(BYTE_COUNT_FOR_IV).toString('hex');
109
+ return this.key.value((buffer) => {
110
+ const cipher = crypto.createCipheriv(ALGO, buffer.toString('utf8'), iv);
111
+ let encrypted = cipher.update(text, 'utf8', 'hex');
112
+ encrypted += cipher.final('hex');
113
+ const tag = cipher.getAuthTag().toString('hex');
114
+ return `${iv}${encrypted}${TAG_DELIMITER}${tag}`;
115
+ });
116
+ }
117
+ decrypt(text) {
118
+ if (text == null) {
119
+ return;
120
+ }
121
+ const tokens = text.split(TAG_DELIMITER);
122
+ if (tokens.length !== 2) {
123
+ throw messages.createError('invalidEncryptedFormatError');
124
+ }
125
+ const tag = tokens[1];
126
+ const iv = tokens[0].substring(0, BYTE_COUNT_FOR_IV * 2);
127
+ const secret = tokens[0].substring(BYTE_COUNT_FOR_IV * 2, tokens[0].length);
128
+ return this.key.value((buffer) => {
129
+ const decipher = crypto.createDecipheriv(ALGO, buffer.toString('utf8'), iv);
130
+ let dec;
131
+ try {
132
+ decipher.setAuthTag(Buffer.from(tag, 'hex'));
133
+ dec = decipher.update(secret, 'hex', 'utf8');
134
+ dec += decipher.final('utf8');
135
+ }
136
+ catch (err) {
137
+ const error = messages.createError('authDecryptError', [err.message], [], err);
138
+ const useGenericUnixKeychain = kit_1.env.getBoolean('SFDX_USE_GENERIC_UNIX_KEYCHAIN') || kit_1.env.getBoolean('USE_GENERIC_UNIX_KEYCHAIN');
139
+ if (os.platform() === 'darwin' && !useGenericUnixKeychain) {
140
+ error.actions = [messages.getMessage('macKeychainOutOfSync')];
141
+ }
142
+ throw error;
143
+ }
144
+ return dec;
145
+ });
146
+ }
147
+ /**
148
+ * Takes a best guess if the value provided was encrypted by {@link Crypto.encrypt} by
149
+ * checking the delimiter, tag length, and valid characters.
150
+ *
151
+ * @param text The text
152
+ * @returns true if the text is encrypted, false otherwise.
153
+ */
154
+ // eslint-disable-next-line class-methods-use-this
155
+ isEncrypted(text) {
156
+ if (text == null) {
157
+ return false;
158
+ }
159
+ const tokens = text.split(TAG_DELIMITER);
160
+ if (tokens.length !== 2) {
161
+ return false;
162
+ }
163
+ const tag = tokens[1];
164
+ const value = tokens[0];
165
+ return (tag.length === AUTH_TAG_LENGTH &&
166
+ value.length >= BYTE_COUNT_FOR_IV &&
167
+ ENCRYPTED_CHARS.test(tag) &&
168
+ ENCRYPTED_CHARS.test(tokens[0]));
169
+ }
170
+ /**
171
+ * Clears the crypto state. This should be called in a finally block.
172
+ */
173
+ close() {
174
+ if (!this.noResetOnClose) {
175
+ this.key.clear();
176
+ }
177
+ }
178
+ /**
179
+ * Initialize async components.
180
+ */
181
+ async init() {
182
+ const logger = await logger_1.Logger.child('crypto');
183
+ if (!this.options.platform) {
184
+ this.options.platform = os.platform();
185
+ }
186
+ logger.debug(`retryStatus: ${this.options.retryStatus}`);
187
+ this.noResetOnClose = !!this.options.noResetOnClose;
188
+ try {
189
+ this.key.consume(Buffer.from((await keychainPromises.getPassword(await this.getKeyChain(this.options.platform), KEY_NAME, ACCOUNT))
190
+ .password, 'utf8'));
191
+ }
192
+ catch (err) {
193
+ // No password found
194
+ if (err.name === 'PasswordNotFoundError') {
195
+ // If we already tried to create a new key then bail.
196
+ if (this.options.retryStatus === 'KEY_SET') {
197
+ logger.debug('a key was set but the retry to get the password failed.');
198
+ throw err;
199
+ }
200
+ else {
201
+ logger.debug('password not found in keychain attempting to created one and re-init.');
202
+ }
203
+ const key = crypto.randomBytes(Math.ceil(16)).toString('hex');
204
+ // Create a new password in the KeyChain.
205
+ await keychainPromises.setPassword((0, ts_types_1.ensure)(this.options.keychain), KEY_NAME, ACCOUNT, key);
206
+ return this.init();
207
+ }
208
+ else {
209
+ throw err;
210
+ }
211
+ }
212
+ }
213
+ async getKeyChain(platform) {
214
+ if (!this.options.keychain) {
215
+ this.options.keychain = await (0, keyChain_1.retrieveKeychain)(platform);
216
+ }
217
+ return this.options.keychain;
218
+ }
219
+ }
220
+ exports.Crypto = Crypto;
221
221
  //# sourceMappingURL=crypto.js.map