From 7407d6efa33485cc28030d27293a44839adf0357 Mon Sep 17 00:00:00 2001 From: Alex Grant Date: Fri, 8 Sep 2023 10:57:03 -0400 Subject: [PATCH 1/2] fix: digest test check predicated on truthy constituents --- lib/helpers.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/helpers.js b/lib/helpers.js index c755e89..f8b79e5 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -31,8 +31,9 @@ export function encryptAndDigest (input, options) { export function decryptAndTest (originalDigest, encryptedInput, options) { const decrypted = symmetricDecrypt(encryptedInput, options); const digest = generateHmac(decrypted, options); + const ok = originalDigest && digest && digest === originalDigest; return { - ok: digest === originalDigest, + ok, decrypted }; } \ No newline at end of file From 45746e3d498597805e9eb87c4aa54fb4e6c95908 Mon Sep 17 00:00:00 2001 From: Alex Grant Date: Fri, 8 Sep 2023 10:57:53 -0400 Subject: [PATCH 2/2] @0.3.1 - update devdeps, test_package on prod only, rename test_package --- .npmignore | 2 +- {test-package => __test_package__}/functions.js | 4 +++- {test-package => __test_package__}/index.js | 4 ++-- {test-package => __test_package__}/package.json | 0 .../test-import.cjs | 0 .../test-import.mjs | 0 .../test-require.cjs | 0 package-lock.json | 12 ++++++------ package.json | 12 ++++++------ test-package/public/images/1997805.png | Bin 17965 -> 0 bytes 10 files changed, 18 insertions(+), 16 deletions(-) rename {test-package => __test_package__}/functions.js (66%) rename {test-package => __test_package__}/index.js (97%) rename {test-package => __test_package__}/package.json (100%) rename {test-package => __test_package__}/test-import.cjs (100%) rename {test-package => __test_package__}/test-import.mjs (100%) rename {test-package => __test_package__}/test-require.cjs (100%) delete mode 100644 test-package/public/images/1997805.png diff --git a/.npmignore b/.npmignore index bd2bb48..42d1c3a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,5 @@ __tests__ -test-package +__test_package__ .github coverage tmp diff --git a/test-package/functions.js b/__test_package__/functions.js similarity index 66% rename from test-package/functions.js rename to __test_package__/functions.js index 1a42ca6..7871449 100644 --- a/test-package/functions.js +++ b/__test_package__/functions.js @@ -11,7 +11,9 @@ function testEncryptAndDigest(encryptAndDigest) { hmacSecret, encryptionKey }); - assert.ok(result); + assert.ok(result, "nothing returned from package"); + assert.ok(result.digest.length > 0, 'no digest returned from package'); + assert.ok(result.payload.length > 0, 'no payload returned from package'); } module.exports = { diff --git a/test-package/index.js b/__test_package__/index.js similarity index 97% rename from test-package/index.js rename to __test_package__/index.js index 9dc5f7f..e2d3c65 100644 --- a/test-package/index.js +++ b/__test_package__/index.js @@ -84,13 +84,13 @@ function pack () { } /** - * Run `npm i` + * Run `npm i --production=true` * @returns Promise that resolves on success, rejects with msg on error */ function install () { console.log('--- install ---'); return new Promise((resolve, reject) => { - const install = spawn('npm', ['i'], { + const install = spawn('npm', ['i', '--production=true'], { cwd: `${localNodeModulesPath}/package` }); install.on('close', installCode => { diff --git a/test-package/package.json b/__test_package__/package.json similarity index 100% rename from test-package/package.json rename to __test_package__/package.json diff --git a/test-package/test-import.cjs b/__test_package__/test-import.cjs similarity index 100% rename from test-package/test-import.cjs rename to __test_package__/test-import.cjs diff --git a/test-package/test-import.mjs b/__test_package__/test-import.mjs similarity index 100% rename from test-package/test-import.mjs rename to __test_package__/test-import.mjs diff --git a/test-package/test-require.cjs b/__test_package__/test-require.cjs similarity index 100% rename from test-package/test-require.cjs rename to __test_package__/test-require.cjs diff --git a/package-lock.json b/package-lock.json index bed1ba3..5b36092 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "@localnerve/hmac-symmetric", - "version": "0.1.0", + "version": "0.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@localnerve/hmac-symmetric", - "version": "0.1.0", + "version": "0.3.1", "license": "BSD-3-Clause", "devDependencies": { - "@babel/cli": "^7.22.10", - "@babel/preset-env": "^7.22.14", + "@babel/cli": "^7.22.15", + "@babel/preset-env": "^7.22.15", "cross-env": "^7.0.3", "eslint": "^8.48.0", - "glob": "^10.3.3", + "glob": "^10.3.4", "jest": "^29.6.4", "rimraf": "^5.0.1", - "tar": "^6.1.15" + "tar": "^6.2.0" }, "engines": { "node": ">= 16" diff --git a/package.json b/package.json index 6ed8d02..420a750 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@localnerve/hmac-symmetric", - "version": "0.3.0", + "version": "0.3.1", "description": "A library to generate hmac and symmetrically encrypted payloads", "main": "index.js", "type": "module", @@ -18,7 +18,7 @@ "transpile": "babel lib -d cjs --out-file-extension .cjs", "posttranspile": "node posttranspile.js", "test": "cross-env HS_HMAC_SECRET=deadbeef HS_ENCRYPTION_KEY=56c6a9c6fb56a39e05fb993918ab01dda24439e2658dd7b06aa0f8fcc7fe0627 jest && npm run test-package", - "test-package": "node ./test-package/index.js" + "test-package": "node ./__test_package__/index.js" }, "repository": { "type": "git", @@ -44,14 +44,14 @@ }, "homepage": "https://github.com/localnerve/hmac-symmetric#readme", "devDependencies": { - "@babel/cli": "^7.22.10", - "@babel/preset-env": "^7.22.14", + "@babel/cli": "^7.22.15", + "@babel/preset-env": "^7.22.15", "cross-env": "^7.0.3", "rimraf": "^5.0.1", "jest": "^29.6.4", "eslint": "^8.48.0", - "tar": "^6.1.15", - "glob": "^10.3.3" + "tar": "^6.2.0", + "glob": "^10.3.4" }, "engines": { "node": ">= 16" diff --git a/test-package/public/images/1997805.png b/test-package/public/images/1997805.png deleted file mode 100644 index c8318b31d8ca394982f74a11901200d450e747ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17965 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 Sw8t3y=6HJle(Se22mT)*F5(mb