diff --git a/package-lock.json b/package-lock.json index 0b120bce..42d7dbd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@oclif/plugin-version": "^2.2.36", "@oclif/table": "^0.5.8", "@octokit/rest": "^22.0.0", + "@zowe/secrets-for-zowe-sdk": "^8.32.0", "archiver": "^8.0.0", "box-node-sdk": "^4.10.0", "chalk": "^2.4.1", @@ -30,7 +31,6 @@ "inquirer": "^8.2.7", "js-yaml": "^4.1.1", "keychain": "^1.5.0", - "keytar": "^7.9.0", "lodash": "^4.17.13", "mkdirp": "^3.0.1", "nanoid": "^3.3.8", @@ -3897,6 +3897,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@zowe/secrets-for-zowe-sdk": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-8.32.0.tgz", + "integrity": "sha512-nOKlBqvKs0eMJlBVDF2cbb/vlRlXjsu8TUQjf741S4I2XeiovJUh1iuisiI5a5SMnDXmtiGYoei80KrYw/jPZw==", + "hasInstallScript": true, + "license": "EPL-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", @@ -6409,6 +6419,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -6424,6 +6435,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -6445,15 +6457,6 @@ "node": ">=6" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6594,15 +6597,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", @@ -7634,15 +7628,6 @@ "bare-events": "^2.7.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -8694,12 +8679,6 @@ "dev": true, "license": "ISC" }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -10368,17 +10347,6 @@ "integrity": "sha512-liyp4r+93RI7EB2jhwaRd4MWfdgHH6shuldkaPMkELCJjMFvOOVXuTvw1pGqFfhsrgA6OqfykWWPQgBjQakVag==", "license": "MIT" }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11100,6 +11068,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11463,12 +11432,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11567,24 +11530,6 @@ "node": ">= 10.13" } }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "license": "MIT" - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -13232,33 +13177,6 @@ "node": ">=4" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13548,36 +13466,6 @@ "node": ">=0.10.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -14388,51 +14276,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", diff --git a/package.json b/package.json index 1eba52ee..afcd19df 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@oclif/plugin-version": "^2.2.36", "@oclif/table": "^0.5.8", "@octokit/rest": "^22.0.0", + "@zowe/secrets-for-zowe-sdk": "^8.32.0", "archiver": "^8.0.0", "box-node-sdk": "^4.10.0", "chalk": "^2.4.1", @@ -43,7 +44,6 @@ "inquirer": "^8.2.7", "js-yaml": "^4.1.1", "keychain": "^1.5.0", - "keytar": "^7.9.0", "lodash": "^4.17.13", "mkdirp": "^3.0.1", "nanoid": "^3.3.8", diff --git a/src/secure-storage.js b/src/secure-storage.js index 46bdb6a5..0f939b6f 100644 --- a/src/secure-storage.js +++ b/src/secure-storage.js @@ -3,7 +3,8 @@ const { promisify } = require('node:util'); const DEBUG = require('./debug'); const PLATFORM_DARWIN = 'darwin'; -const KEYTAR = 'keytar'; +const ZOWE_KEYRING = '@zowe/secrets-for-zowe-sdk'; +const KEYRING = 'keyring'; const KEYCHAIN = 'keychain'; /** @@ -24,8 +25,9 @@ function loadOptionalModule(packageName, shouldLoad = true) { } } -const { loadedModule: keytarModule, loadError: keytarLoadError } = - loadOptionalModule(KEYTAR, process.platform !== PLATFORM_DARWIN); +const { loadedModule: zoweModule, loadError: keyringLoadError } = + loadOptionalModule(ZOWE_KEYRING, process.platform !== PLATFORM_DARWIN); +const keyringModule = zoweModule ? zoweModule.keyring : null; const { loadedModule: keychainModule, loadError: keychainLoadError } = loadOptionalModule(KEYCHAIN, process.platform === PLATFORM_DARWIN); @@ -60,20 +62,22 @@ function isSecretNotFoundError(error) { * that can access the item without prompting. Using `keychain` avoids ACL * prompts because the accessing process is always the stable system * `security` binary, regardless of CLI binary identity/signature changes. - * If we used `keytar` on macOS, access would come from the current - * `node`/CLI executable identity; after signed-binary upgrades, macOS can - * treat it as a different app and show ACL prompts for existing items. - * That is why this module intentionally does not use `keytar` on macOS. + * If we used a native NAPI library on macOS, access would come from the + * current `node`/CLI executable identity; after signed-binary upgrades, + * macOS can treat it as a different app and show ACL prompts for existing + * items. That is why this module intentionally avoids the native library + * on macOS. * - * On Windows/Linux uses `keytar` (native Keychain/Credential Vault/libsecret). + * On Windows/Linux uses `@zowe/secrets-for-zowe-sdk` (a maintained fork of + * keytar) which uses Windows Credential Manager and Linux libsecret. */ class SecureStorage { constructor() { if (isDarwin && keychainModule) { this.backend = KEYCHAIN; this.available = true; - } else if (!isDarwin && isSecurePlatform && keytarModule) { - this.backend = KEYTAR; + } else if (!isDarwin && isSecurePlatform && keyringModule) { + this.backend = KEYRING; this.available = true; } else { this.backend = null; @@ -85,7 +89,7 @@ class SecureStorage { arch: process.arch, backend: this.backend, available: this.available, - keytarLoaded: Boolean(keytarModule), + keyringLoaded: Boolean(keyringModule), darwinKeychainLoaded: Boolean(keychainModule), }); @@ -96,10 +100,10 @@ class SecureStorage { keychainLoadError?.message || 'unknown' ); } - if (!isDarwin && !keytarModule) { + if (!isDarwin && !keyringModule) { DEBUG.init( - 'keytar module not available: %s', - keytarLoadError?.message || 'unknown' + '@zowe/secrets-for-zowe-sdk module not available: %s', + keyringLoadError?.message || 'unknown' ); } } @@ -135,7 +139,7 @@ class SecureStorage { } } - return keytarModule.getPassword(service, account); + return keyringModule.getPassword(service, account); } /** @@ -159,7 +163,7 @@ class SecureStorage { return; } - await keytarModule.setPassword(service, account, password); + await keyringModule.setPassword(service, account, password); } /** @@ -189,7 +193,7 @@ class SecureStorage { } } - return keytarModule.deletePassword(service, account); + return keyringModule.deletePassword(service, account); } }